Go to the documentation of this file.
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))
46 uint8_t r0, g0,
b0, r1, g1,
b1;
47 uint8_t
a = dxtn ? 0 : 255;
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,
96 for (y = 0; y < 4; y++) {
97 for (x = 0; x < 4; x++) {
140 const uint8_t *
block)
150 for (y = 0; y < 4; y++) {
152 uint8_t alpha_values[4];
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++) {
160 uint8_t
alpha = alpha_values[x];
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++)
245 for (
i = 0;
i < 8;
i++)
246 dst[
i] = (
tmp >> (
i * 3)) & 0x7;
254 const uint8_t *
block)
258 uint8_t alpha_indices[16];
262 uint8_t alpha0 = *(
block);
263 uint8_t alpha1 = *(
block + 1);
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);
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;
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++)
415 const uint8_t *
block,
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];
445 const uint8_t *
block,
int sign,
int mono,
int offset,
int pix_size)
453 r0 = ((int8_t)
block[0]) + 128;
454 r1 = ((int8_t)
block[1]) + 128;
549 const uint8_t *
block,
int sign)
552 uint8_t c0[4 * 4 * 4];
553 uint8_t
c1[4 * 4 * 4];
561 for (y = 0; y < 4; y++) {
562 for (x = 0; x < 4; x++) {
563 uint8_t *p = dst + x * 4 + y *
stride;
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++) {
629 uint8_t *p = dst + x * 4 + y *
stride;
630 FFSWAP(uint8_t, p[0], p[1]);
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'.
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'.
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 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 av_always_inline void extract_color(uint32_t colors[4], uint16_t color0, uint16_t color1, int dxtn, int alpha)
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 double b1(void *priv, double x, double y)
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...
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 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 ...
static void rgtc2_block_internal(uint8_t *dst, ptrdiff_t stride, const uint8_t *block, int sign)
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...
av_cold void ff_texturedsp_init(TextureDSPContext *c)
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)
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 void rgtc1_block_internal(uint8_t *dst, ptrdiff_t stride, const uint8_t *block, int sign, int mono, int offset, int pix_size)
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)
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 ...
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 void dxt1_block_internal(uint8_t *dst, ptrdiff_t stride, const uint8_t *block, uint8_t alpha)
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_RL24
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 av_always_inline void premult2straight(uint8_t *src)
Convert a premultiplied alpha pixel to a straight alpha pixel.
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
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'...
#define i(width, name, range_min, range_max)
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
#define FFSWAP(type, a, b)
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
static void dxt5_block_internal(uint8_t *dst, ptrdiff_t stride, const uint8_t *block)
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'.
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...
static const int16_t alpha[]
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'.
The exact code depends on how similar the blocks are and how related they are to the block
static double b0(void *priv, double x, double y)
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'.
static const ColorEntry color_table[]
static av_always_inline void ycocg2rgba(uint8_t *src, int scaled)
Convert a YCoCg buffer to RGBA.