582 lines
17 KiB
C
582 lines
17 KiB
C
/*
|
|
|
|
Copyright (c) 2015 Harm Hanemaaijer <fgenfb@yahoo.com>
|
|
|
|
Permission to use, copy, modify, and/or distribute this software for any
|
|
purpose with or without fee is hereby granted, provided that the above
|
|
copyright notice and this permission notice appear in all copies.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "CoreMinimal.h"
|
|
#include "AndroidETC.h"
|
|
|
|
#define DETEX_RESTRICT __restrict
|
|
#define DETEX_INLINE_ONLY /* __attribute__((always_inline)) inline */
|
|
#define detexSetErrorMessage(error)
|
|
|
|
/* Detex library pixel formats. */
|
|
|
|
enum {
|
|
/* The format has 16-bit components. */
|
|
DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT = 0x1,
|
|
/* The format has 32-bit components. */
|
|
DETEX_PIXEL_FORMAT_32BIT_COMPONENT_BIT = 0x2,
|
|
/* The format has an alpha component. */
|
|
DETEX_PIXEL_FORMAT_ALPHA_COMPONENT_BIT = 0x4,
|
|
/* The sequential component order is RGB. */
|
|
DETEX_PIXEL_FORMAT_RGB_COMPONENT_ORDER_BIT = 0x0,
|
|
/* The sequential component order is BGR. */
|
|
DETEX_PIXEL_FORMAT_BGR_COMPONENT_ORDER_BIT = 0x8,
|
|
/* The format has one component. */
|
|
DETEX_PIXEL_FORMAT_ONE_COMPONENT_BITS = 0x0,
|
|
/* The format has two components. */
|
|
DETEX_PIXEL_FORMAT_TWO_COMPONENTS_BITS = 0x10,
|
|
/* The format has three components. */
|
|
DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS = 0x20,
|
|
/* The format has four components. */
|
|
DETEX_PIXEL_FORMAT_FOUR_COMPONENTS_BITS = 0x30,
|
|
/* The format is stored as 8-bit pixels. */
|
|
DETEX_PIXEL_FORMAT_8BIT_PIXEL_BITS = 0x000,
|
|
/* The format is stored as 16-bit pixels. */
|
|
DETEX_PIXEL_FORMAT_16BIT_PIXEL_BITS = 0x100,
|
|
/* The format is stored as 24-bit pixels. */
|
|
DETEX_PIXEL_FORMAT_24BIT_PIXEL_BITS = 0x200,
|
|
/* The format is stored as 32-bit pixels. */
|
|
DETEX_PIXEL_FORMAT_32BIT_PIXEL_BITS = 0x300,
|
|
/* The format is stored as 48-bit pixels. */
|
|
DETEX_PIXEL_FORMAT_48BIT_PIXEL_BITS = 0x500,
|
|
/* The format is stored as 64-bit pixels. */
|
|
DETEX_PIXEL_FORMAT_64BIT_PIXEL_BITS = 0x700,
|
|
/* The format is stored as 96-bit pixels. */
|
|
DETEX_PIXEL_FORMAT_96BIT_PIXEL_BITS = 0xB00,
|
|
/* The format is stored as 128-bit pixels. */
|
|
DETEX_PIXEL_FORMAT_128BIT_PIXEL_BITS = 0xF00,
|
|
/* The format has signed integer components. */
|
|
DETEX_PIXEL_FORMAT_SIGNED_BIT = 0x1000,
|
|
/* The format has (half-)float components. */
|
|
DETEX_PIXEL_FORMAT_FLOAT_BIT = 0x2000,
|
|
/* The fomat is HDR (high dynamic range). */
|
|
DETEX_PIXEL_FORMAT_HDR_BIT = 0x4000,
|
|
|
|
DETEX_PIXEL_FORMAT_RGBA8 = (
|
|
DETEX_PIXEL_FORMAT_ALPHA_COMPONENT_BIT |
|
|
DETEX_PIXEL_FORMAT_FOUR_COMPONENTS_BITS |
|
|
DETEX_PIXEL_FORMAT_32BIT_PIXEL_BITS
|
|
),
|
|
DETEX_PIXEL_FORMAT_BGRA8 = (
|
|
DETEX_PIXEL_FORMAT_ALPHA_COMPONENT_BIT |
|
|
DETEX_PIXEL_FORMAT_BGR_COMPONENT_ORDER_BIT |
|
|
DETEX_PIXEL_FORMAT_FOUR_COMPONENTS_BITS |
|
|
DETEX_PIXEL_FORMAT_32BIT_PIXEL_BITS
|
|
),
|
|
DETEX_PIXEL_FORMAT_RGBX8 = (
|
|
DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS |
|
|
DETEX_PIXEL_FORMAT_32BIT_PIXEL_BITS
|
|
),
|
|
DETEX_PIXEL_FORMAT_BGRX8 = (
|
|
DETEX_PIXEL_FORMAT_BGR_COMPONENT_ORDER_BIT |
|
|
DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS |
|
|
DETEX_PIXEL_FORMAT_32BIT_PIXEL_BITS
|
|
),
|
|
DETEX_PIXEL_FORMAT_RGB8 = (
|
|
DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS |
|
|
DETEX_PIXEL_FORMAT_24BIT_PIXEL_BITS
|
|
),
|
|
DETEX_PIXEL_FORMAT_BGR8 = (
|
|
DETEX_PIXEL_FORMAT_BGR_COMPONENT_ORDER_BIT |
|
|
DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS |
|
|
DETEX_PIXEL_FORMAT_24BIT_PIXEL_BITS
|
|
),
|
|
DETEX_PIXEL_FORMAT_R8 = (
|
|
DETEX_PIXEL_FORMAT_ONE_COMPONENT_BITS |
|
|
DETEX_PIXEL_FORMAT_8BIT_PIXEL_BITS
|
|
),
|
|
DETEX_PIXEL_FORMAT_SIGNED_R8 = (
|
|
DETEX_PIXEL_FORMAT_ONE_COMPONENT_BITS |
|
|
DETEX_PIXEL_FORMAT_8BIT_PIXEL_BITS |
|
|
DETEX_PIXEL_FORMAT_SIGNED_BIT
|
|
),
|
|
DETEX_PIXEL_FORMAT_RG8 = (
|
|
DETEX_PIXEL_FORMAT_TWO_COMPONENTS_BITS |
|
|
DETEX_PIXEL_FORMAT_16BIT_PIXEL_BITS
|
|
),
|
|
DETEX_PIXEL_FORMAT_SIGNED_RG8 = (
|
|
DETEX_PIXEL_FORMAT_TWO_COMPONENTS_BITS |
|
|
DETEX_PIXEL_FORMAT_16BIT_PIXEL_BITS |
|
|
DETEX_PIXEL_FORMAT_SIGNED_BIT
|
|
),
|
|
DETEX_PIXEL_FORMAT_R16 = (
|
|
DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT |
|
|
DETEX_PIXEL_FORMAT_ONE_COMPONENT_BITS |
|
|
DETEX_PIXEL_FORMAT_16BIT_PIXEL_BITS
|
|
),
|
|
DETEX_PIXEL_FORMAT_SIGNED_R16 = (
|
|
DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT |
|
|
DETEX_PIXEL_FORMAT_ONE_COMPONENT_BITS |
|
|
DETEX_PIXEL_FORMAT_16BIT_PIXEL_BITS |
|
|
DETEX_PIXEL_FORMAT_SIGNED_BIT
|
|
),
|
|
DETEX_PIXEL_FORMAT_RG16 = (
|
|
DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT |
|
|
DETEX_PIXEL_FORMAT_TWO_COMPONENTS_BITS |
|
|
DETEX_PIXEL_FORMAT_32BIT_PIXEL_BITS
|
|
),
|
|
DETEX_PIXEL_FORMAT_SIGNED_RG16 = (
|
|
DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT |
|
|
DETEX_PIXEL_FORMAT_TWO_COMPONENTS_BITS |
|
|
DETEX_PIXEL_FORMAT_32BIT_PIXEL_BITS |
|
|
DETEX_PIXEL_FORMAT_SIGNED_BIT
|
|
),
|
|
DETEX_PIXEL_FORMAT_RGB16 = (
|
|
DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT |
|
|
DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS |
|
|
DETEX_PIXEL_FORMAT_48BIT_PIXEL_BITS
|
|
),
|
|
DETEX_PIXEL_FORMAT_RGBX16 = (
|
|
DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT |
|
|
DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS |
|
|
DETEX_PIXEL_FORMAT_64BIT_PIXEL_BITS
|
|
),
|
|
DETEX_PIXEL_FORMAT_RGBA16 = (
|
|
DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT |
|
|
DETEX_PIXEL_FORMAT_ALPHA_COMPONENT_BIT |
|
|
DETEX_PIXEL_FORMAT_FOUR_COMPONENTS_BITS |
|
|
DETEX_PIXEL_FORMAT_64BIT_PIXEL_BITS
|
|
),
|
|
DETEX_PIXEL_FORMAT_FLOAT_R16 = (
|
|
DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT |
|
|
DETEX_PIXEL_FORMAT_ONE_COMPONENT_BITS |
|
|
DETEX_PIXEL_FORMAT_16BIT_PIXEL_BITS |
|
|
DETEX_PIXEL_FORMAT_FLOAT_BIT
|
|
),
|
|
DETEX_PIXEL_FORMAT_FLOAT_R16_HDR = (
|
|
DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT |
|
|
DETEX_PIXEL_FORMAT_ONE_COMPONENT_BITS |
|
|
DETEX_PIXEL_FORMAT_16BIT_PIXEL_BITS |
|
|
DETEX_PIXEL_FORMAT_FLOAT_BIT |
|
|
DETEX_PIXEL_FORMAT_HDR_BIT
|
|
),
|
|
DETEX_PIXEL_FORMAT_FLOAT_RG16 = (
|
|
DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT |
|
|
DETEX_PIXEL_FORMAT_TWO_COMPONENTS_BITS |
|
|
DETEX_PIXEL_FORMAT_32BIT_PIXEL_BITS |
|
|
DETEX_PIXEL_FORMAT_FLOAT_BIT
|
|
),
|
|
DETEX_PIXEL_FORMAT_FLOAT_RG16_HDR = (
|
|
DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT |
|
|
DETEX_PIXEL_FORMAT_TWO_COMPONENTS_BITS |
|
|
DETEX_PIXEL_FORMAT_32BIT_PIXEL_BITS |
|
|
DETEX_PIXEL_FORMAT_FLOAT_BIT |
|
|
DETEX_PIXEL_FORMAT_HDR_BIT
|
|
),
|
|
DETEX_PIXEL_FORMAT_FLOAT_RGBX16 = (
|
|
DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT |
|
|
DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS |
|
|
DETEX_PIXEL_FORMAT_64BIT_PIXEL_BITS |
|
|
DETEX_PIXEL_FORMAT_FLOAT_BIT
|
|
),
|
|
DETEX_PIXEL_FORMAT_FLOAT_RGBX16_HDR = (
|
|
DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT |
|
|
DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS |
|
|
DETEX_PIXEL_FORMAT_64BIT_PIXEL_BITS |
|
|
DETEX_PIXEL_FORMAT_FLOAT_BIT |
|
|
DETEX_PIXEL_FORMAT_HDR_BIT
|
|
),
|
|
DETEX_PIXEL_FORMAT_FLOAT_RGBA16 = (
|
|
DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT |
|
|
DETEX_PIXEL_FORMAT_ALPHA_COMPONENT_BIT |
|
|
DETEX_PIXEL_FORMAT_FOUR_COMPONENTS_BITS |
|
|
DETEX_PIXEL_FORMAT_64BIT_PIXEL_BITS |
|
|
DETEX_PIXEL_FORMAT_FLOAT_BIT |
|
|
DETEX_PIXEL_FORMAT_HDR_BIT
|
|
),
|
|
DETEX_PIXEL_FORMAT_FLOAT_RGBA16_HDR = (
|
|
DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT |
|
|
DETEX_PIXEL_FORMAT_ALPHA_COMPONENT_BIT |
|
|
DETEX_PIXEL_FORMAT_FOUR_COMPONENTS_BITS |
|
|
DETEX_PIXEL_FORMAT_64BIT_PIXEL_BITS |
|
|
DETEX_PIXEL_FORMAT_FLOAT_BIT
|
|
),
|
|
DETEX_PIXEL_FORMAT_FLOAT_RGB16 = (
|
|
DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT |
|
|
DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS |
|
|
DETEX_PIXEL_FORMAT_48BIT_PIXEL_BITS |
|
|
DETEX_PIXEL_FORMAT_FLOAT_BIT
|
|
),
|
|
DETEX_PIXEL_FORMAT_FLOAT_RGB16_HDR = (
|
|
DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT |
|
|
DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS |
|
|
DETEX_PIXEL_FORMAT_48BIT_PIXEL_BITS |
|
|
DETEX_PIXEL_FORMAT_FLOAT_BIT |
|
|
DETEX_PIXEL_FORMAT_HDR_BIT
|
|
),
|
|
DETEX_PIXEL_FORMAT_FLOAT_BGRX16 = (
|
|
DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT |
|
|
DETEX_PIXEL_FORMAT_BGR_COMPONENT_ORDER_BIT |
|
|
DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS |
|
|
DETEX_PIXEL_FORMAT_64BIT_PIXEL_BITS |
|
|
DETEX_PIXEL_FORMAT_FLOAT_BIT
|
|
),
|
|
DETEX_PIXEL_FORMAT_FLOAT_BGRX16_HDR = (
|
|
DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT |
|
|
DETEX_PIXEL_FORMAT_BGR_COMPONENT_ORDER_BIT |
|
|
DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS |
|
|
DETEX_PIXEL_FORMAT_64BIT_PIXEL_BITS |
|
|
DETEX_PIXEL_FORMAT_FLOAT_BIT |
|
|
DETEX_PIXEL_FORMAT_HDR_BIT
|
|
),
|
|
DETEX_PIXEL_FORMAT_SIGNED_FLOAT_RGBX16 = (
|
|
DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT |
|
|
DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS |
|
|
DETEX_PIXEL_FORMAT_64BIT_PIXEL_BITS |
|
|
DETEX_PIXEL_FORMAT_SIGNED_BIT |
|
|
DETEX_PIXEL_FORMAT_FLOAT_BIT
|
|
),
|
|
DETEX_PIXEL_FORMAT_SIGNED_FLOAT_BGRX16 = (
|
|
DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT |
|
|
DETEX_PIXEL_FORMAT_BGR_COMPONENT_ORDER_BIT |
|
|
DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS |
|
|
DETEX_PIXEL_FORMAT_64BIT_PIXEL_BITS |
|
|
DETEX_PIXEL_FORMAT_SIGNED_BIT |
|
|
DETEX_PIXEL_FORMAT_FLOAT_BIT
|
|
),
|
|
DETEX_PIXEL_FORMAT_FLOAT_R32 = (
|
|
DETEX_PIXEL_FORMAT_32BIT_COMPONENT_BIT |
|
|
DETEX_PIXEL_FORMAT_ONE_COMPONENT_BITS |
|
|
DETEX_PIXEL_FORMAT_32BIT_PIXEL_BITS |
|
|
DETEX_PIXEL_FORMAT_FLOAT_BIT
|
|
),
|
|
DETEX_PIXEL_FORMAT_FLOAT_R32_HDR = (
|
|
DETEX_PIXEL_FORMAT_32BIT_COMPONENT_BIT |
|
|
DETEX_PIXEL_FORMAT_ONE_COMPONENT_BITS |
|
|
DETEX_PIXEL_FORMAT_32BIT_PIXEL_BITS |
|
|
DETEX_PIXEL_FORMAT_FLOAT_BIT |
|
|
DETEX_PIXEL_FORMAT_HDR_BIT
|
|
),
|
|
DETEX_PIXEL_FORMAT_FLOAT_RG32 = (
|
|
DETEX_PIXEL_FORMAT_32BIT_COMPONENT_BIT |
|
|
DETEX_PIXEL_FORMAT_TWO_COMPONENTS_BITS |
|
|
DETEX_PIXEL_FORMAT_64BIT_PIXEL_BITS |
|
|
DETEX_PIXEL_FORMAT_FLOAT_BIT
|
|
),
|
|
DETEX_PIXEL_FORMAT_FLOAT_RG32_HDR = (
|
|
DETEX_PIXEL_FORMAT_32BIT_COMPONENT_BIT |
|
|
DETEX_PIXEL_FORMAT_TWO_COMPONENTS_BITS |
|
|
DETEX_PIXEL_FORMAT_64BIT_PIXEL_BITS |
|
|
DETEX_PIXEL_FORMAT_FLOAT_BIT |
|
|
DETEX_PIXEL_FORMAT_HDR_BIT
|
|
),
|
|
DETEX_PIXEL_FORMAT_FLOAT_RGB32 = (
|
|
DETEX_PIXEL_FORMAT_32BIT_COMPONENT_BIT |
|
|
DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS |
|
|
DETEX_PIXEL_FORMAT_96BIT_PIXEL_BITS |
|
|
DETEX_PIXEL_FORMAT_FLOAT_BIT
|
|
),
|
|
DETEX_PIXEL_FORMAT_FLOAT_RGB32_HDR = (
|
|
DETEX_PIXEL_FORMAT_32BIT_COMPONENT_BIT |
|
|
DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS |
|
|
DETEX_PIXEL_FORMAT_96BIT_PIXEL_BITS |
|
|
DETEX_PIXEL_FORMAT_FLOAT_BIT |
|
|
DETEX_PIXEL_FORMAT_HDR_BIT
|
|
),
|
|
DETEX_PIXEL_FORMAT_FLOAT_RGBX32 = (
|
|
DETEX_PIXEL_FORMAT_32BIT_COMPONENT_BIT |
|
|
DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS |
|
|
DETEX_PIXEL_FORMAT_128BIT_PIXEL_BITS |
|
|
DETEX_PIXEL_FORMAT_FLOAT_BIT
|
|
),
|
|
DETEX_PIXEL_FORMAT_FLOAT_RGBX32_HDR = (
|
|
DETEX_PIXEL_FORMAT_32BIT_COMPONENT_BIT |
|
|
DETEX_PIXEL_FORMAT_THREE_COMPONENTS_BITS |
|
|
DETEX_PIXEL_FORMAT_128BIT_PIXEL_BITS |
|
|
DETEX_PIXEL_FORMAT_FLOAT_BIT |
|
|
DETEX_PIXEL_FORMAT_HDR_BIT
|
|
),
|
|
DETEX_PIXEL_FORMAT_FLOAT_RGBA32 = (
|
|
DETEX_PIXEL_FORMAT_32BIT_COMPONENT_BIT |
|
|
DETEX_PIXEL_FORMAT_ALPHA_COMPONENT_BIT |
|
|
DETEX_PIXEL_FORMAT_FOUR_COMPONENTS_BITS |
|
|
DETEX_PIXEL_FORMAT_128BIT_PIXEL_BITS |
|
|
DETEX_PIXEL_FORMAT_FLOAT_BIT
|
|
),
|
|
DETEX_PIXEL_FORMAT_FLOAT_RGBA32_HDR = (
|
|
DETEX_PIXEL_FORMAT_32BIT_COMPONENT_BIT |
|
|
DETEX_PIXEL_FORMAT_ALPHA_COMPONENT_BIT |
|
|
DETEX_PIXEL_FORMAT_FOUR_COMPONENTS_BITS |
|
|
DETEX_PIXEL_FORMAT_128BIT_PIXEL_BITS |
|
|
DETEX_PIXEL_FORMAT_FLOAT_BIT |
|
|
DETEX_PIXEL_FORMAT_HDR_BIT
|
|
),
|
|
DETEX_PIXEL_FORMAT_A8 = (
|
|
DETEX_PIXEL_FORMAT_ALPHA_COMPONENT_BIT |
|
|
DETEX_PIXEL_FORMAT_ONE_COMPONENT_BITS |
|
|
DETEX_PIXEL_FORMAT_8BIT_PIXEL_BITS
|
|
),
|
|
};
|
|
|
|
void detexConvertHalfFloatToFloat(uint16_t *source_buffer, int n, float *target_buffer);
|
|
|
|
void detexConvertFloatToHalfFloat(float *source_buffer, int n, uint16_t *target_buffer);
|
|
|
|
void detexConvertNormalizedHalfFloatToUInt16(uint16_t *buffer, int n);
|
|
|
|
void detexConvertNormalizedFloatToUInt16(float * DETEX_RESTRICT source_buffer, int n, uint16_t * DETEX_RESTRICT target_buffer);
|
|
|
|
void detexConvertHDRHalfFloatToUInt16(uint16_t *buffer, int n);
|
|
|
|
void detexConvertHDRFloatToFloat(float *buffer, int n);
|
|
|
|
bool detexConvertPixels(uint8_t * DETEX_RESTRICT source_pixel_buffer, uint32_t nu_pixels, uint32_t source_pixel_format, uint8_t * DETEX_RESTRICT target_pixel_buffer, uint32_t target_pixel_format);
|
|
|
|
extern float *detex_half_float_table;
|
|
|
|
void detexValidateHalfFloatTable();
|
|
|
|
static DETEX_INLINE_ONLY float detexGetFloatFromHalfFloat(uint16_t hf) {
|
|
return detex_half_float_table[hf];
|
|
}
|
|
|
|
/* Return pixel size in bytes for pixel format or texture format (decompressed). */
|
|
static DETEX_INLINE_ONLY int detexGetPixelSize(uint32_t pixel_format)
|
|
{
|
|
return 1 + ((pixel_format & 0xF00) >> 8);
|
|
}
|
|
|
|
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ || !defined(__BYTE_ORDER__)
|
|
|
|
static DETEX_INLINE_ONLY uint32_t detexPack32RGBA8(int r, int g, int b, int a)
|
|
{
|
|
return (uint32_t)r | ((uint32_t)g << 8) | ((uint32_t)b << 16) | ((uint32_t)a << 24);
|
|
}
|
|
|
|
static DETEX_INLINE_ONLY uint32_t detexPack32RGB8Alpha0xFF(int r, int g, int b)
|
|
{
|
|
return detexPack32RGBA8(r, g, b, 0xFF);
|
|
}
|
|
|
|
static DETEX_INLINE_ONLY uint32_t detexPack32R8(int r)
|
|
{
|
|
return (uint32_t)r;
|
|
}
|
|
|
|
static DETEX_INLINE_ONLY uint32_t detexPack32G8(int g)
|
|
{
|
|
return (uint32_t)g << 8;
|
|
}
|
|
|
|
static DETEX_INLINE_ONLY uint32_t detexPack32B8(int b)
|
|
{
|
|
return (uint32_t)b << 16;
|
|
}
|
|
|
|
static DETEX_INLINE_ONLY uint32_t detexPack32A8(int a)
|
|
{
|
|
return (uint32_t)a << 24;
|
|
}
|
|
|
|
static DETEX_INLINE_ONLY uint32_t detexPack32RG8(uint32_t r8, uint32_t g8)
|
|
{
|
|
return r8 | (g8 << 8);
|
|
}
|
|
|
|
static DETEX_INLINE_ONLY uint32_t detexPack32R16(uint32_t r16)
|
|
{
|
|
return r16;
|
|
}
|
|
|
|
static DETEX_INLINE_ONLY uint32_t detexPack32G16(uint32_t g16)
|
|
{
|
|
return g16 << 16;
|
|
}
|
|
|
|
static DETEX_INLINE_ONLY uint32_t detexPack32RG16(uint32_t r16, uint32_t g16)
|
|
{
|
|
return r16 | (g16 << 16);
|
|
}
|
|
|
|
static DETEX_INLINE_ONLY uint64_t detexPack64R16(uint32_t r16)
|
|
{
|
|
return r16;
|
|
}
|
|
|
|
static DETEX_INLINE_ONLY uint64_t detexPack64G16(uint32_t g16)
|
|
{
|
|
return g16 << 16;
|
|
}
|
|
|
|
static DETEX_INLINE_ONLY uint64_t detexPack64B16(uint32_t b16)
|
|
{
|
|
return (uint64_t)b16 << 32;
|
|
}
|
|
|
|
static DETEX_INLINE_ONLY uint64_t detexPack64A16(uint32_t a16)
|
|
{
|
|
return (uint64_t)a16 << 48;
|
|
}
|
|
|
|
static DETEX_INLINE_ONLY uint64_t detexPack64RGB16(uint16_t r16, uint16_t g16, uint16_t b16)
|
|
{
|
|
return (uint64_t)r16 | ((uint64_t)g16 << 16) | ((uint64_t)b16 << 32);
|
|
}
|
|
|
|
static DETEX_INLINE_ONLY uint64_t detexPack64RGBA16(uint16_t r16, uint16_t g16, uint16_t b16, uint16_t a16)
|
|
{
|
|
return (uint64_t)r16 | ((uint64_t)g16 << 16) | ((uint64_t)b16 << 32) | ((uint64_t)a16 << 48);
|
|
}
|
|
|
|
static DETEX_INLINE_ONLY uint32_t detexPixel32GetR8(uint32_t pixel)
|
|
{
|
|
return pixel & 0xFF;
|
|
}
|
|
|
|
static DETEX_INLINE_ONLY uint32_t detexPixel32GetG8(uint32_t pixel)
|
|
{
|
|
return (pixel & 0xFF00) >> 8;
|
|
}
|
|
|
|
static DETEX_INLINE_ONLY uint32_t detexPixel32GetB8(uint32_t pixel)
|
|
{
|
|
return (pixel & 0xFF0000) >> 16;
|
|
}
|
|
|
|
static DETEX_INLINE_ONLY uint32_t detexPixel32GetA8(uint32_t pixel)
|
|
{
|
|
return (pixel & 0xFF000000) >> 24;
|
|
}
|
|
|
|
static DETEX_INLINE_ONLY int detexPixel32GetSignedR8(uint32_t pixel)
|
|
{
|
|
return (int8_t)(pixel & 0xFF);
|
|
}
|
|
|
|
static DETEX_INLINE_ONLY int detexPixel32GetSignedG8(uint32_t pixel)
|
|
{
|
|
return (int8_t)((pixel & 0xFF00) >> 8);
|
|
}
|
|
|
|
static DETEX_INLINE_ONLY uint32_t detexPixel32GetR16(uint32_t pixel)
|
|
{
|
|
return pixel & 0x0000FFFF;
|
|
}
|
|
|
|
static DETEX_INLINE_ONLY uint32_t detexPixel32GetG16(uint32_t pixel)
|
|
{
|
|
return (pixel & 0xFFFF0000) >> 16;
|
|
}
|
|
|
|
static DETEX_INLINE_ONLY int detexPixel32GetSignedR16(uint32_t pixel)
|
|
{
|
|
return (int16_t)(pixel & 0x0000FFFF);
|
|
}
|
|
|
|
static DETEX_INLINE_ONLY int detexPixel32GetSignedG16(uint32_t pixel)
|
|
{
|
|
return (int16_t)((pixel & 0xFFFF0000) >> 16);
|
|
}
|
|
|
|
static DETEX_INLINE_ONLY uint64_t detexPixel64GetR16(uint64_t pixel)
|
|
{
|
|
return pixel & 0xFFFF;
|
|
}
|
|
|
|
static DETEX_INLINE_ONLY uint64_t detexPixel64GetG16(uint64_t pixel)
|
|
{
|
|
return (pixel & 0xFFFF0000) >> 16;
|
|
}
|
|
|
|
static DETEX_INLINE_ONLY uint64_t detexPixel64GetB16(uint64_t pixel)
|
|
{
|
|
return (pixel & 0xFFFF00000000) >> 32;
|
|
}
|
|
|
|
static DETEX_INLINE_ONLY uint64_t detexPixel64GetA16(uint64_t pixel)
|
|
{
|
|
return (pixel & 0xFFFF000000000000) >> 48;
|
|
}
|
|
|
|
#define DETEX_PIXEL32_ALPHA_BYTE_OFFSET 3
|
|
|
|
#else
|
|
|
|
#error Big-endian byte order not supported.
|
|
|
|
static DETEX_INLINE_ONLY uint32_t detexPack32RGBA8(int r, int g, int b, int a)
|
|
{
|
|
return a | ((uint32_t)b << 8) | ((uint32_t)g << 16) | ((uint32_t)r << 24);
|
|
}
|
|
|
|
static DETEX_INLINE_ONLY uint32_t detexPack32RGB8Alpha0xFF(int r, int g, int b)
|
|
{
|
|
return pack_rgba(r, g, b, 0xFF);
|
|
}
|
|
|
|
static DETEX_INLINE_ONLY uint32_t detexPack32R8(int r)
|
|
{
|
|
return (uint32_t)r << 24;
|
|
}
|
|
|
|
static DETEX_INLINE_ONLY uint32_t detexPack32G8(int g)
|
|
{
|
|
return (uint32_t)g << 16;
|
|
}
|
|
|
|
static DETEX_INLINE_ONLY uint32_t detexPack32B8(int b)
|
|
{
|
|
return (uint32_t)b << 8;
|
|
}
|
|
|
|
static DETEX_INLINE_ONLY uint32_t detexPack32A8(int a)
|
|
{
|
|
return a;
|
|
}
|
|
|
|
static DETEX_INLINE_ONLY uint32_t detexPack32RG16(uint32_t r16, uint32_t g16)
|
|
{
|
|
return g16 | (r16 << 16);
|
|
}
|
|
|
|
static DETEX_INLINE_ONLY int detexPixel32GetR8(uint32_t pixel)
|
|
{
|
|
return (pixel & 0xFF000000) >> 24;
|
|
}
|
|
|
|
static DETEX_INLINE_ONLY int detexPixel32GetG8(uint32_t pixel)
|
|
{
|
|
return (pixel & 0xFF0000) >> 16;
|
|
}
|
|
|
|
static DETEX_INLINE_ONLY int detexPixel32GetB8(uint32_t pixel)
|
|
{
|
|
return (pixel & 0xFF00) >> 8;
|
|
}
|
|
|
|
static DETEX_INLINE_ONLY int detexPixel32GetA8(uint32_t pixel)
|
|
{
|
|
return pixel & 0xFF;
|
|
}
|
|
|
|
static DETEX_INLINE_ONLY uint32_t detexPixel32GetR16(uint32_t pixel)
|
|
{
|
|
return ((pixel & 0xFF000000) >> 24) | ((pixel & 0x00FF0000) >> 8);
|
|
}
|
|
|
|
static DETEX_INLINE_ONLY uint32_t detexPixel32GetG16(uint32_t pixel)
|
|
{
|
|
return ((pixel & 0x0000FF00) >> 8) | ((pixel & 0x000000FF) << 8);
|
|
}
|
|
|
|
#define DETEX_PIXEL32_ALPHA_BYTE_OFFSET 0
|
|
|
|
#endif
|