📄 tif_getimage.c
字号:
*/
DECLARESepPutFunc(putRGBseparate8bitMaptile)
{
TIFFRGBValue* Map = img->Map;
(void) y; (void) a;
while (h-- > 0) {
for (x = w; x > 0; x--)
*cp++ = PACK(Map[*r++], Map[*g++], Map[*b++]);
SKEW(r, g, b, fromskew);
cp += toskew;
}
}
/*
* 8-bit unpacked samples => RGBA w/ associated alpha
*/
DECLARESepPutFunc(putRGBAAseparate8bittile)
{
(void) img; (void) x; (void) y;
while (h-- > 0) {
UNROLL8(w, NOP, *cp++ = PACK4(*r++, *g++, *b++, *a++));
SKEW4(r, g, b, a, fromskew);
cp += toskew;
}
}
/*
* 8-bit unpacked samples => RGBA w/ unassociated alpha
*/
DECLARESepPutFunc(putRGBUAseparate8bittile)
{
(void) img; (void) y;
while (h-- > 0) {
uint32 rv, gv, bv, av;
for (x = w; x-- > 0;) {
av = *a++;
rv = (*r++ * av) / 255;
gv = (*g++ * av) / 255;
bv = (*b++ * av) / 255;
*cp++ = PACK4(rv,gv,bv,av);
}
SKEW4(r, g, b, a, fromskew);
cp += toskew;
}
}
/*
* 16-bit unpacked samples => RGB
*/
DECLARESepPutFunc(putRGBseparate16bittile)
{
uint16 *wr = (uint16*) r;
uint16 *wg = (uint16*) g;
uint16 *wb = (uint16*) b;
(void) img; (void) y; (void) a;
while (h-- > 0) {
for (x = 0; x < w; x++)
*cp++ = PACKW(*wr++, *wg++, *wb++);
SKEW(wr, wg, wb, fromskew);
cp += toskew;
}
}
/*
* 16-bit unpacked samples => RGBA w/ associated alpha
*/
DECLARESepPutFunc(putRGBAAseparate16bittile)
{
uint16 *wr = (uint16*) r;
uint16 *wg = (uint16*) g;
uint16 *wb = (uint16*) b;
uint16 *wa = (uint16*) a;
(void) img; (void) y;
while (h-- > 0) {
for (x = 0; x < w; x++)
*cp++ = PACKW4(*wr++, *wg++, *wb++, *wa++);
SKEW4(wr, wg, wb, wa, fromskew);
cp += toskew;
}
}
/*
* 16-bit unpacked samples => RGBA w/ unassociated alpha
*/
DECLARESepPutFunc(putRGBUAseparate16bittile)
{
uint16 *wr = (uint16*) r;
uint16 *wg = (uint16*) g;
uint16 *wb = (uint16*) b;
uint16 *wa = (uint16*) a;
(void) img; (void) y;
while (h-- > 0) {
uint32 r,g,b,a;
/*
* We shift alpha down four bits just in case unsigned
* arithmetic doesn't handle the full range.
* We still have plenty of accuracy, since the output is 8 bits.
* So we have (r * 0xffff) * (a * 0xfff)) = r*a * (0xffff*0xfff)
* Since we want r*a * 0xff for eight bit output,
* we divide by (0xffff * 0xfff) / 0xff == 0x10eff.
*/
for (x = w; x-- > 0;) {
a = *wa++ >> 4;
r = (*wr++ * a) / 0x10eff;
g = (*wg++ * a) / 0x10eff;
b = (*wb++ * a) / 0x10eff;
*cp++ = PACK4(r,g,b,a);
}
SKEW4(wr, wg, wb, wa, fromskew);
cp += toskew;
}
}
/*
* 8-bit packed CIE L*a*b 1976 samples => RGB
*/
DECLAREContigPutFunc(putcontig8bitCIELab)
{
float X, Y, Z;
uint32 r, g, b;
(void) y;
fromskew *= 3;
while (h-- > 0) {
for (x = w; x-- > 0;) {
TIFFCIELabToXYZ(img->cielab,
(unsigned char)pp[0],
(signed char)pp[1],
(signed char)pp[2],
&X, &Y, &Z);
TIFFXYZToRGB(img->cielab, X, Y, Z, &r, &g, &b);
*cp++ = PACK(r, g, b);
pp += 3;
}
cp += toskew;
pp += fromskew;
}
}
/*
* YCbCr -> RGB conversion and packing routines.
*/
#define YCbCrtoRGB(dst, Y) { \
uint32 r, g, b; \
TIFFYCbCrtoRGB(img->ycbcr, (Y), Cb, Cr, &r, &g, &b); \
dst = PACK(r, g, b); \
}
/*
* 8-bit packed YCbCr samples => RGB
* This function is generic for different sampling sizes,
* and can handle blocks sizes that aren't multiples of the
* sampling size. However, it is substantially less optimized
* than the specific sampling cases. It is used as a fallback
* for difficult blocks.
*/
#ifdef notdef
static void putcontig8bitYCbCrGenericTile(
TIFFRGBAImage* img,
uint32* cp,
uint32 x, uint32 y,
uint32 w, uint32 h,
int32 fromskew, int32 toskew,
unsigned char* pp,
int h_group,
int v_group )
{
uint32* cp1 = cp+w+toskew;
uint32* cp2 = cp1+w+toskew;
uint32* cp3 = cp2+w+toskew;
int32 incr = 3*w+4*toskew;
int32 Cb, Cr;
int group_size = v_group * h_group + 2;
(void) y;
fromskew = (fromskew * group_size) / h_group;
for( yy = 0; yy < h; yy++ )
{
unsigned char *pp_line;
int y_line_group = yy / v_group;
int y_remainder = yy - y_line_group * v_group;
pp_line = pp + v_line_group *
for( xx = 0; xx < w; xx++ )
{
Cb = pp
}
}
for (; h >= 4; h -= 4) {
x = w>>2;
do {
Cb = pp[16];
Cr = pp[17];
YCbCrtoRGB(cp [0], pp[ 0]);
YCbCrtoRGB(cp [1], pp[ 1]);
YCbCrtoRGB(cp [2], pp[ 2]);
YCbCrtoRGB(cp [3], pp[ 3]);
YCbCrtoRGB(cp1[0], pp[ 4]);
YCbCrtoRGB(cp1[1], pp[ 5]);
YCbCrtoRGB(cp1[2], pp[ 6]);
YCbCrtoRGB(cp1[3], pp[ 7]);
YCbCrtoRGB(cp2[0], pp[ 8]);
YCbCrtoRGB(cp2[1], pp[ 9]);
YCbCrtoRGB(cp2[2], pp[10]);
YCbCrtoRGB(cp2[3], pp[11]);
YCbCrtoRGB(cp3[0], pp[12]);
YCbCrtoRGB(cp3[1], pp[13]);
YCbCrtoRGB(cp3[2], pp[14]);
YCbCrtoRGB(cp3[3], pp[15]);
cp += 4, cp1 += 4, cp2 += 4, cp3 += 4;
pp += 18;
} while (--x);
cp += incr, cp1 += incr, cp2 += incr, cp3 += incr;
pp += fromskew;
}
}
#endif
/*
* 8-bit packed YCbCr samples w/ 4,4 subsampling => RGB
*/
DECLAREContigPutFunc(putcontig8bitYCbCr44tile)
{
uint32* cp1 = cp+w+toskew;
uint32* cp2 = cp1+w+toskew;
uint32* cp3 = cp2+w+toskew;
int32 incr = 3*w+4*toskew;
(void) y;
/* adjust fromskew */
fromskew = (fromskew * 18) / 4;
if ((h & 3) == 0 && (w & 3) == 0) {
for (; h >= 4; h -= 4) {
x = w>>2;
do {
int32 Cb = pp[16];
int32 Cr = pp[17];
YCbCrtoRGB(cp [0], pp[ 0]);
YCbCrtoRGB(cp [1], pp[ 1]);
YCbCrtoRGB(cp [2], pp[ 2]);
YCbCrtoRGB(cp [3], pp[ 3]);
YCbCrtoRGB(cp1[0], pp[ 4]);
YCbCrtoRGB(cp1[1], pp[ 5]);
YCbCrtoRGB(cp1[2], pp[ 6]);
YCbCrtoRGB(cp1[3], pp[ 7]);
YCbCrtoRGB(cp2[0], pp[ 8]);
YCbCrtoRGB(cp2[1], pp[ 9]);
YCbCrtoRGB(cp2[2], pp[10]);
YCbCrtoRGB(cp2[3], pp[11]);
YCbCrtoRGB(cp3[0], pp[12]);
YCbCrtoRGB(cp3[1], pp[13]);
YCbCrtoRGB(cp3[2], pp[14]);
YCbCrtoRGB(cp3[3], pp[15]);
cp += 4, cp1 += 4, cp2 += 4, cp3 += 4;
pp += 18;
} while (--x);
cp += incr, cp1 += incr, cp2 += incr, cp3 += incr;
pp += fromskew;
}
} else {
while (h > 0) {
for (x = w; x > 0;) {
int32 Cb = pp[16];
int32 Cr = pp[17];
switch (x) {
default:
switch (h) {
default: YCbCrtoRGB(cp3[3], pp[15]); /* FALLTHROUGH */
case 3: YCbCrtoRGB(cp2[3], pp[11]); /* FALLTHROUGH */
case 2: YCbCrtoRGB(cp1[3], pp[ 7]); /* FALLTHROUGH */
case 1: YCbCrtoRGB(cp [3], pp[ 3]); /* FALLTHROUGH */
} /* FALLTHROUGH */
case 3:
switch (h) {
default: YCbCrtoRGB(cp3[2], pp[14]); /* FALLTHROUGH */
case 3: YCbCrtoRGB(cp2[2], pp[10]); /* FALLTHROUGH */
case 2: YCbCrtoRGB(cp1[2], pp[ 6]); /* FALLTHROUGH */
case 1: YCbCrtoRGB(cp [2], pp[ 2]); /* FALLTHROUGH */
} /* FALLTHROUGH */
case 2:
switch (h) {
default: YCbCrtoRGB(cp3[1], pp[13]); /* FALLTHROUGH */
case 3: YCbCrtoRGB(cp2[1], pp[ 9]); /* FALLTHROUGH */
case 2: YCbCrtoRGB(cp1[1], pp[ 5]); /* FALLTHROUGH */
case 1: YCbCrtoRGB(cp [1], pp[ 1]); /* FALLTHROUGH */
} /* FALLTHROUGH */
case 1:
switch (h) {
default: YCbCrtoRGB(cp3[0], pp[12]); /* FALLTHROUGH */
case 3: YCbCrtoRGB(cp2[0], pp[ 8]); /* FALLTHROUGH */
case 2: YCbCrtoRGB(cp1[0], pp[ 4]); /* FALLTHROUGH */
case 1: YCbCrtoRGB(cp [0], pp[ 0]); /* FALLTHROUGH */
} /* FALLTHROUGH */
}
if (x < 4) {
cp += x; cp1 += x; cp2 += x; cp3 += x;
x = 0;
}
else {
cp += 4; cp1 += 4; cp2 += 4; cp3 += 4;
x -= 4;
}
pp += 18;
}
if (h <= 4)
break;
h -= 4;
cp += incr, cp1 += incr, cp2 += incr, cp3 += incr;
pp += fromskew;
}
}
}
/*
* 8-bit packed YCbCr samples w/ 4,2 subsampling => RGB
*/
DECLAREContigPutFunc(putcontig8bitYCbCr42tile)
{
uint32* cp1 = cp+w+toskew;
int32 incr = 2*toskew+w;
(void) y;
fromskew = (fromskew * 10) / 4;
if ((h & 3) == 0 && (w & 1) == 0) {
for (; h >= 2; h -= 2) {
x = w>>2;
do {
int32 Cb = pp[8];
int32 Cr = pp[9];
YCbCrtoRGB(cp [0], pp[0]);
YCbCrtoRGB(cp [1], pp[1]);
YCbCrtoRGB(cp [2], pp[2]);
YCbCrtoRGB(cp [3], pp[3]);
YCbCrtoRGB(cp1[0], pp[4]);
YCbCrtoRGB(cp1[1], pp[5]);
YCbCrtoRGB(cp1[2], pp[6]);
YCbCrtoRGB(cp1[3], pp[7]);
cp += 4, cp1 += 4;
pp += 10;
} while (--x);
cp += incr, cp1 += incr;
pp += fromskew;
}
} else {
while (h > 0) {
for (x = w; x > 0;) {
int32 Cb = pp[8];
int32 Cr = pp[9];
switch (x) {
default:
switch (h) {
default: YCbCrtoRGB(cp1[3], pp[ 7]); /* FALLTHROUGH */
case 1: YCbCrtoRGB(cp [3], pp[ 3]); /* FALLTHROUGH */
} /* FALLTHROUGH */
case 3:
switch (h) {
default: YCbCrtoRGB(cp1[2], pp[ 6]); /* FALLTHROUGH */
case 1: YCbCrtoRGB(cp [2], pp[ 2]); /* FALLTHROUGH */
} /* FALLTHROUGH */
case 2:
switch (h) {
default: YCbCrtoRGB(cp1[1], pp[ 5]); /* FALLTHROUGH */
case 1: YCbCrtoRGB(cp [1], pp[ 1]); /* FALLTHROUGH */
} /* FALLTHROUGH */
case 1:
switch (h) {
default: YCbCrtoRGB(cp1[0], pp[ 4]); /* FALLTHROUGH */
case 1: YCbCrtoRGB(cp [0], pp[ 0]); /* FALLTHROUGH */
} /* FALLTHROUGH */
}
if (x < 4) {
cp += x; cp1 += x;
x = 0;
}
else {
cp += 4; cp1 += 4;
x -= 4;
}
pp += 10;
}
if (h <= 2)
break;
h -= 2;
cp += incr, cp1 += incr;
pp += fromskew;
}
}
}
/*
* 8-bit packed YCbCr samples w/ 4,1 subsampling => RGB
*/
DECLAREContigPutFunc(putcontig8bitYCbCr41tile)
{
(void) y;
/* XXX adjust fromskew */
do {
x = w>>2;
do {
int32 Cb = pp[4];
int32 Cr = pp[5];
YCbCrtoRGB(cp [0], pp[0]);
YCbCrtoRGB(cp [1], pp[1]);
YCbCrtoRGB(cp [2], pp[2]);
YCbCrtoRGB(cp [3], pp[3]);
cp += 4;
pp += 6;
} while (--x);
if( (w&3) != 0 )
{
int32 Cb = pp[4];
int32 Cr = pp[5];
switch( (w&3) ) {
case 3: YCbCrtoRGB(cp [2], pp[2]);
case 2: YCbCrtoRGB(cp [1], pp[1]);
case 1: YCbCrtoRGB(cp [0], pp[0]);
case 0: break;
}
cp += (w&3);
pp += 6;
}
cp += toskew;
pp += fromskew;
} while (--h);
}
/*
* 8-bit packed YCbCr samples w/ 2,2 subsampling => RGB
*/
DECLAREContigPutFunc(putcontig8bitYCbCr22tile)
{
uint32* cp1 = cp+w+toskew;
int32 incr = 2*toskew+w;
(void) y;
fromskew = (fromskew * 6) / 2;
if ((h & 1) == 0 && (w & 1) == 0) {
for (; h >= 2; h -= 2) {
x = w>>1;
do {
int32 Cb = pp[4];
int32 Cr = pp[5];
YCbCrtoRGB(cp [0], pp[0]);
YCbCrtoRGB(cp [1], pp[1]);
YCbCrtoRGB(cp1[0], pp[2]);
YCbCrtoRGB(cp1[1], pp[3]);
cp += 2, cp1 += 2;
pp += 6;
} while (--x);
cp += incr, cp1 += incr;
pp += fromskew;
}
} else {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -