35 #define RGBA(r, g, b, a) (((uint8_t)(r) << 0) | \ 36 ((uint8_t)(g) << 8) | \ 37 ((uint8_t)(b) << 16) | \ 38 ((unsigned)(uint8_t)(a) << 24)) 49 tmp = (color0 >> 11) * 255 + 16;
50 r0 = (
uint8_t) ((tmp / 32 + tmp) / 32);
51 tmp = ((color0 & 0x07E0) >> 5) * 255 + 32;
52 g0 = (
uint8_t) ((tmp / 64 + tmp) / 64);
53 tmp = (color0 & 0x001F) * 255 + 16;
54 b0 = (
uint8_t) ((tmp / 32 + tmp) / 32);
56 tmp = (color1 >> 11) * 255 + 16;
57 r1 = (
uint8_t) ((tmp / 32 + tmp) / 32);
58 tmp = ((color1 & 0x07E0) >> 5) * 255 + 32;
59 g1 = (
uint8_t) ((tmp / 64 + tmp) / 64);
60 tmp = (color1 & 0x001F) * 255 + 16;
61 b1 = (
uint8_t) ((tmp / 32 + tmp) / 32);
63 if (dxtn || color0 > color1) {
64 colors[0] =
RGBA(r0, g0, b0, a);
65 colors[1] =
RGBA(r1, g1, b1, a);
66 colors[2] =
RGBA((2 * r0 + r1) / 3,
70 colors[3] =
RGBA((2 * r1 + r0) / 3,
75 colors[0] =
RGBA(r0, g0, b0, a);
76 colors[1] =
RGBA(r1, g1, b1, a);
77 colors[2] =
RGBA((r0 + r1) / 2,
81 colors[3] =
RGBA(0, 0, 0, alpha);
90 uint16_t color0 =
AV_RL16(block + 0);
91 uint16_t color1 =
AV_RL16(block + 2);
96 for (y = 0; y < 4; y++) {
97 for (x = 0; x < 4; x++) {
98 uint32_t
pixel = colors[code & 3];
144 uint16_t color0 =
AV_RL16(block + 8);
145 uint16_t color1 =
AV_RL16(block + 10);
150 for (y = 0; y < 4; y++) {
151 const uint16_t alpha_code =
AV_RL16(block + 2 * y);
154 alpha_values[0] = ((alpha_code >> 0) & 0x0F) * 17;
155 alpha_values[1] = ((alpha_code >> 4) & 0x0F) * 17;
156 alpha_values[2] = ((alpha_code >> 8) & 0x0F) * 17;
157 alpha_values[3] = ((alpha_code >> 12) & 0x0F) * 17;
159 for (x = 0; x < 4; x++) {
161 uint32_t
pixel = colors[code & 3] | ((unsigned)alpha << 24);
178 src[0] = (
uint8_t) r * a / 255;
179 src[1] = (
uint8_t) g * a / 255;
180 src[2] = (
uint8_t) b * a / 255;
200 for (y = 0; y < 4; y++)
201 for (x = 0; x < 4; x++)
241 for (block = 0; block < 2; block++) {
245 for (i = 0; i < 8; i++)
246 dst[i] = (tmp >> (i * 3)) & 0x7;
259 uint16_t color0 =
AV_RL16(block + 8);
260 uint16_t color1 =
AV_RL16(block + 10);
269 for (y = 0; y < 4; y++) {
270 for (x = 0; x < 4; x++) {
271 int alpha_code = alpha_indices[x + y * 4];
275 if (alpha_code == 0) {
277 }
else if (alpha_code == 1) {
280 if (alpha0 > alpha1) {
281 alpha = (
uint8_t) (((8 - alpha_code) * alpha0 +
282 (alpha_code - 1) * alpha1) / 7);
284 if (alpha_code == 6) {
286 }
else if (alpha_code == 7) {
289 alpha = (
uint8_t) (((6 - alpha_code) * alpha0 +
290 (alpha_code - 1) * alpha1) / 5);
294 pixel = colors[code & 3] | ((unsigned)alpha << 24);
319 for (y = 0; y < 4; y++)
320 for (x = 0; x < 4; x++)
355 int s = scaled ? (b >> 3) + 1 : 1;
357 int co = (r - 128) / s;
358 int cg = (g - 128) / s;
360 src[0] = av_clip_uint8(y + co - cg);
361 src[1] = av_clip_uint8(y + cg);
362 src[2] = av_clip_uint8(y - co - cg);
363 src[3] = scaled ? 255 :
b;
383 for (y = 0; y < 4; y++)
384 for (x = 0; x < 4; x++)
407 for (y = 0; y < 4; y++)
408 for (x = 0; x < 4; x++)
416 const int *color_tab,
int mono,
int offset,
int pix_size)
427 for (y = 0; y < 4; y++) {
428 for (x = 0; x < 4; x++) {
429 int i = indices[x + y * 4];
431 int c = color_tab[
i];
438 AV_WL32(dst + x * pix_size + y * stride, pixel);
453 r0 = ((int8_t) block[0]) + 128;
454 r1 = ((int8_t) block[1]) + 128;
465 color_table[2] = (6 * r0 + 1 * r1) / 7;
466 color_table[3] = (5 * r0 + 2 * r1) / 7;
467 color_table[4] = (4 * r0 + 3 * r1) / 7;
468 color_table[5] = (3 * r0 + 4 * r1) / 7;
469 color_table[6] = (2 * r0 + 5 * r1) / 7;
470 color_table[7] = (1 * r0 + 6 * r1) / 7;
473 color_table[2] = (4 * r0 + 1 * r1) / 5;
474 color_table[3] = (3 * r0 + 2 * r1) / 5;
475 color_table[4] = (2 * r0 + 3 * r1) / 5;
476 color_table[5] = (1 * r0 + 4 * r1) / 5;
478 color_table[7] = 255;
561 for (y = 0; y < 4; y++) {
562 for (x = 0; x < 4; x++) {
564 int r = c0[x * 4 + y * 16];
565 int g = c1[x * 4 + y * 16];
568 int d = (255 * 255 - r * r - g *
g) / 2;
627 for (y = 0; y < 4; y++) {
628 for (x = 0; x < 4; x++) {
int(* dxt5_block)(uint8_t *dst, ptrdiff_t stride, const uint8_t *block)
Texture block (4x4) module.
int(* rgtc1u_alpha_block)(uint8_t *dst, ptrdiff_t stride, const uint8_t *block)
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
static void rgtc2_block_internal(uint8_t *dst, ptrdiff_t stride, const uint8_t *block, int sign)
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_RL16
static void dxt3_block_internal(uint8_t *dst, ptrdiff_t stride, const uint8_t *block)
Macro definitions for various function/variable attributes.
static int dxt4_block(uint8_t *dst, ptrdiff_t stride, const uint8_t *block)
Decompress one block of a DXT4 texture and store the resulting RGBA pixels in 'dst'.
static void rgtc1_block_internal(uint8_t *dst, ptrdiff_t stride, const uint8_t *block, int sign, int mono, int offset, int pix_size)
static av_always_inline void ycocg2rgba(uint8_t *src, int scaled)
Convert a YCoCg buffer to RGBA.
The exact code depends on how similar the blocks are and how related they are to the block
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
static int dxt3_block(uint8_t *dst, ptrdiff_t stride, const uint8_t *block)
Decompress one block of a DXT3 texture and store the resulting RGBA pixels in 'dst'.
int(* dxt5y_block)(uint8_t *dst, ptrdiff_t stride, const uint8_t *block)
int(* dxt3_block)(uint8_t *dst, ptrdiff_t stride, const uint8_t *block)
int(* rgtc2s_block)(uint8_t *dst, ptrdiff_t stride, const uint8_t *block)
int(* dxt5ys_block)(uint8_t *dst, ptrdiff_t stride, const uint8_t *block)
int(* rgtc1u_block)(uint8_t *dst, ptrdiff_t stride, const uint8_t *block)
static const ColorEntry color_table[]
static int rgtc2u_block(uint8_t *dst, ptrdiff_t stride, const uint8_t *block)
Decompress one block of a RGRC2 texture with unsigned components and store the resulting RGBA pixels ...
static int rgtc1u_block(uint8_t *dst, ptrdiff_t stride, const uint8_t *block)
Decompress one block of a RGRC1 texture with unsigned components and store the resulting RGBA pixels ...
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_RL24
static int rgtc1u_alpha_block(uint8_t *dst, ptrdiff_t stride, const uint8_t *block)
Decompress one block of a RGTC1 texture with unsigned components and overwrite the alpha component in...
static void dxt1_block_internal(uint8_t *dst, ptrdiff_t stride, const uint8_t *block, uint8_t alpha)
av_cold void ff_texturedsp_init(TextureDSPContext *c)
int(* dxt1a_block)(uint8_t *dst, ptrdiff_t stride, const uint8_t *block)
static int rgtc1u_gray_block(uint8_t *dst, ptrdiff_t stride, const uint8_t *block)
Decompress one block of a RGTC1 texture with unsigned components to Gray 8.
static int dxt5y_block(uint8_t *dst, ptrdiff_t stride, const uint8_t *block)
Decompress one block of a DXT5 texture with classic YCoCg and store the resulting RGBA pixels in 'dst...
static av_always_inline void premult2straight(uint8_t *src)
Convert a premultiplied alpha pixel to a straight alpha pixel.
static av_always_inline void extract_color(uint32_t colors[4], uint16_t color0, uint16_t color1, int dxtn, int alpha)
static double b0(void *priv, double x, double y)
static int dxt5ys_block(uint8_t *dst, ptrdiff_t stride, const uint8_t *block)
Decompress one block of a DXT5 texture with scaled YCoCg and store the resulting RGBA pixels in 'dst'...
int(* dxt2_block)(uint8_t *dst, ptrdiff_t stride, const uint8_t *block)
static void dxt5_block_internal(uint8_t *dst, ptrdiff_t stride, const uint8_t *block)
static double b1(void *priv, double x, double y)
static const int16_t alpha[]
static int rgtc2s_block(uint8_t *dst, ptrdiff_t stride, const uint8_t *block)
Decompress one block of a RGRC2 texture with signed components and store the resulting RGBA pixels in...
int(* dxt1_block)(uint8_t *dst, ptrdiff_t stride, const uint8_t *block)
Replacements for frequently missing libm functions.
int(* dxt4_block)(uint8_t *dst, ptrdiff_t stride, const uint8_t *block)
static int dxt2_block(uint8_t *dst, ptrdiff_t stride, const uint8_t *block)
Decompress one block of a DXT2 texture and store the resulting RGBA pixels in 'dst'.
int(* rgtc1s_block)(uint8_t *dst, ptrdiff_t stride, const uint8_t *block)
and forward the test the status of outputs and forward it to the corresponding return FFERROR_NOT_READY If the filters stores internally one or a few frame for some it can consider them to be part of the FIFO and delay acknowledging a status change accordingly Example code
static int dxt5_block(uint8_t *dst, ptrdiff_t stride, const uint8_t *block)
Decompress one block of a DXT5 texture and store the resulting RGBA pixels in 'dst'.
GLint GLenum GLboolean GLsizei stride
common internal and external API header
static void rgtc_block_internal(uint8_t *dst, ptrdiff_t stride, const uint8_t *block, const int *color_tab, int mono, int offset, int pix_size)
int(* rgtc2u_block)(uint8_t *dst, ptrdiff_t stride, const uint8_t *block)
#define FFSWAP(type, a, b)
static int dxn3dc_block(uint8_t *dst, ptrdiff_t stride, const uint8_t *block)
Decompress one block of a 3Dc texture with unsigned components and store the resulting RGBA pixels in...
int(* rgtc1u_gray_block)(uint8_t *dst, ptrdiff_t stride, const uint8_t *block)
static int rgtc1s_block(uint8_t *dst, ptrdiff_t stride, const uint8_t *block)
Decompress one block of a RGRC1 texture with signed components and store the resulting RGBA pixels in...
static int dxt1a_block(uint8_t *dst, ptrdiff_t stride, const uint8_t *block)
Decompress one block of a DXT1 with 1-bit alpha texture and store the resulting RGBA pixels in 'dst'...
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
int(* dxn3dc_block)(uint8_t *dst, ptrdiff_t stride, const uint8_t *block)
static void decompress_indices(uint8_t *dst, const uint8_t *src)
Decompress a BC 16x3 index block stored as h g f e d c b a p o n m l k j i.
static int dxt1_block(uint8_t *dst, ptrdiff_t stride, const uint8_t *block)
Decompress one block of a DXT1 texture and store the resulting RGBA pixels in 'dst'.