YCbCr->RGB conversion routines now in the tif_color.c module. New function

TIFFYCbCrtoRGB() available in TIFF API.
This commit is contained in:
Andrey Kiselev 2003-12-04 10:31:54 +00:00
parent a5407eb75f
commit 1e2bc737c6
3 changed files with 52 additions and 64 deletions

View File

@ -1,4 +1,4 @@
/* $Header: /cvs/maptools/cvsroot/libtiff/libtiff/tif_color.c,v 1.2 2003-12-03 19:54:03 dron Exp $ */
/* $Header: /cvs/maptools/cvsroot/libtiff/libtiff/tif_color.c,v 1.3 2003-12-04 10:31:54 dron Exp $ */
/*
* Copyright (c) 1988-1997 Sam Leffler
@ -40,8 +40,7 @@
#include <math.h>
/*
* Convert color value from the CIE L*a*b* 1976 space to CIE XYZ. Different
* reference white tristimuli can be specified.
* Convert color value from the CIE L*a*b* 1976 space to CIE XYZ.
*/
void
TIFFCIELabToXYZ(TIFFCIELabToRGB *cielab, uint32 l, int32 a, int32 b,
@ -203,17 +202,30 @@ TIFFCIELabToRGBInit(TIFFCIELabToRGB* cielab, TIFFDisplay *display,
/*
* Free TIFFYCbCrToRGB structure.
*/
int
void
TIFFCIELabToRGBEnd(TIFFCIELabToRGB* cielab)
{
static char module[] = "TIFFCIELabToRGBEnd";
_TIFFfree(cielab->Yr2r);
_TIFFfree(cielab->Yg2g);
_TIFFfree(cielab->Yb2b);
_TIFFfree(cielab->display);
}
/*
* Convert color value from the YCbCr space to CIE XYZ.
* The colorspace conversion algorithm comes from the IJG v5a code;
* see below for more information on how it works.
*/
void
TIFFYCbCrtoRGB(TIFFYCbCrToRGB *ycbcr, uint32 Y, int32 Cb, int32 Cr,
uint32 *r, uint32 *g, uint32 *b)
{
*r = ycbcr->clamptab[Y + ycbcr->Cr_r_tab[Cr]];
*g = ycbcr->clamptab[Y
+ (int)((ycbcr->Cb_g_tab[Cb] + ycbcr->Cr_g_tab[Cr]) >> 16)];
*b = ycbcr->clamptab[Y + ycbcr->Cb_b_tab[Cb]];
}
#define SHIFT 16
#define FIX(x) ((int32)((x) * (1L<<SHIFT) + 0.5))
#define ONE_HALF ((int32)(1<<(SHIFT-1)))

View File

@ -1,4 +1,4 @@
/* $Header: /cvs/maptools/cvsroot/libtiff/libtiff/tif_getimage.c,v 1.31 2003-12-03 19:54:03 dron Exp $ */
/* $Header: /cvs/maptools/cvsroot/libtiff/libtiff/tif_getimage.c,v 1.32 2003-12-04 10:31:54 dron Exp $ */
/*
* Copyright (c) 1991-1997 Sam Leffler
@ -1571,25 +1571,14 @@ DECLAREContigPutFunc(putcontig8bitCIELab)
}
/*
* YCbCr -> RGB conversion and packing routines. The colorspace
* conversion algorithm comes from the IJG v5a code; see below
* for more information on how it works.
* YCbCr -> RGB conversion and packing routines.
*/
#define YCbCrtoRGB(dst, yc) { \
int Y = (yc); \
dst = PACK( \
clamptab[Y+Crrtab[Cr]], \
clamptab[Y + (int)((Cbgtab[Cb]+Crgtab[Cr])>>16)], \
clamptab[Y+Cbbtab[Cb]]); \
#define YCbCrtoRGB(dst, Y) { \
uint32 r, g, b; \
TIFFYCbCrtoRGB(img->ycbcr, (Y), Cb, Cr, &r, &g, &b); \
dst = PACK(r, g, b); \
}
#define YCbCrSetup \
TIFFYCbCrToRGB* ycbcr = img->ycbcr; \
int* Crrtab = ycbcr->Cr_r_tab; \
int* Cbbtab = ycbcr->Cb_b_tab; \
int32* Crgtab = ycbcr->Cr_g_tab; \
int32* Cbgtab = ycbcr->Cb_g_tab; \
TIFFRGBValue* clamptab = ycbcr->clamptab
/*
* 8-bit packed YCbCr samples => RGB
@ -1611,13 +1600,11 @@ static void putcontig8bitYCbCrGenericTile(
int v_group )
{
YCbCrSetup;
uint32* cp1 = cp+w+toskew;
uint32* cp2 = cp1+w+toskew;
uint32* cp3 = cp2+w+toskew;
int32 incr = 3*w+4*toskew;
int Cb, Cr;
int32 Cb, Cr;
int group_size = v_group * h_group + 2;
(void) y;
@ -1674,7 +1661,6 @@ static void putcontig8bitYCbCrGenericTile(
*/
DECLAREContigPutFunc(putcontig8bitYCbCr44tile)
{
YCbCrSetup;
uint32* cp1 = cp+w+toskew;
uint32* cp2 = cp1+w+toskew;
uint32* cp3 = cp2+w+toskew;
@ -1687,8 +1673,8 @@ DECLAREContigPutFunc(putcontig8bitYCbCr44tile)
for (; h >= 4; h -= 4) {
x = w>>2;
do {
int Cb = pp[16];
int Cr = pp[17];
int32 Cb = pp[16];
int32 Cr = pp[17];
YCbCrtoRGB(cp [0], pp[ 0]);
YCbCrtoRGB(cp [1], pp[ 1]);
@ -1716,8 +1702,8 @@ DECLAREContigPutFunc(putcontig8bitYCbCr44tile)
} else {
while (h > 0) {
for (x = w; x > 0;) {
int Cb = pp[16];
int Cr = pp[17];
int32 Cb = pp[16];
int32 Cr = pp[17];
switch (x) {
default:
switch (h) {
@ -1772,7 +1758,6 @@ DECLAREContigPutFunc(putcontig8bitYCbCr44tile)
*/
DECLAREContigPutFunc(putcontig8bitYCbCr42tile)
{
YCbCrSetup;
uint32* cp1 = cp+w+toskew;
int32 incr = 2*toskew+w;
@ -1782,8 +1767,8 @@ DECLAREContigPutFunc(putcontig8bitYCbCr42tile)
for (; h >= 2; h -= 2) {
x = w>>2;
do {
int Cb = pp[8];
int Cr = pp[9];
int32 Cb = pp[8];
int32 Cr = pp[9];
YCbCrtoRGB(cp [0], pp[0]);
YCbCrtoRGB(cp [1], pp[1]);
@ -1803,8 +1788,8 @@ DECLAREContigPutFunc(putcontig8bitYCbCr42tile)
} else {
while (h > 0) {
for (x = w; x > 0;) {
int Cb = pp[8];
int Cr = pp[9];
int32 Cb = pp[8];
int32 Cr = pp[9];
switch (x) {
default:
switch (h) {
@ -1851,15 +1836,13 @@ DECLAREContigPutFunc(putcontig8bitYCbCr42tile)
*/
DECLAREContigPutFunc(putcontig8bitYCbCr41tile)
{
YCbCrSetup;
(void) y;
/* XXX adjust fromskew */
do {
x = w>>2;
do {
int Cb = pp[4];
int Cr = pp[5];
int32 Cb = pp[4];
int32 Cr = pp[5];
YCbCrtoRGB(cp [0], pp[0]);
YCbCrtoRGB(cp [1], pp[1]);
@ -1872,8 +1855,8 @@ DECLAREContigPutFunc(putcontig8bitYCbCr41tile)
if( (w&3) != 0 )
{
int Cb = pp[4];
int Cr = pp[5];
int32 Cb = pp[4];
int32 Cr = pp[5];
switch( (w&3) ) {
case 3: YCbCrtoRGB(cp [2], pp[2]);
@ -1897,7 +1880,6 @@ DECLAREContigPutFunc(putcontig8bitYCbCr41tile)
*/
DECLAREContigPutFunc(putcontig8bitYCbCr22tile)
{
YCbCrSetup;
uint32* cp1 = cp+w+toskew;
int32 incr = 2*toskew+w;
@ -1907,8 +1889,8 @@ DECLAREContigPutFunc(putcontig8bitYCbCr22tile)
for (; h >= 2; h -= 2) {
x = w>>1;
do {
int Cb = pp[4];
int Cr = pp[5];
int32 Cb = pp[4];
int32 Cr = pp[5];
YCbCrtoRGB(cp [0], pp[0]);
YCbCrtoRGB(cp [1], pp[1]);
@ -1924,8 +1906,8 @@ DECLAREContigPutFunc(putcontig8bitYCbCr22tile)
} else {
while (h > 0) {
for (x = w; x > 0;) {
int Cb = pp[4];
int Cr = pp[5];
int32 Cb = pp[4];
int32 Cr = pp[5];
switch (x) {
default:
switch (h) {
@ -1962,15 +1944,13 @@ DECLAREContigPutFunc(putcontig8bitYCbCr22tile)
*/
DECLAREContigPutFunc(putcontig8bitYCbCr21tile)
{
YCbCrSetup;
(void) y;
fromskew = (fromskew * 4) / 2;
do {
x = w>>1;
do {
int Cb = pp[2];
int Cr = pp[3];
int32 Cb = pp[2];
int32 Cr = pp[3];
YCbCrtoRGB(cp[0], pp[0]);
YCbCrtoRGB(cp[1], pp[1]);
@ -1981,8 +1961,8 @@ DECLAREContigPutFunc(putcontig8bitYCbCr21tile)
if( (w&1) != 0 )
{
int Cb = pp[2];
int Cr = pp[3];
int32 Cb = pp[2];
int32 Cr = pp[3];
YCbCrtoRGB(cp [0], pp[0]);
@ -2000,15 +1980,13 @@ DECLAREContigPutFunc(putcontig8bitYCbCr21tile)
*/
DECLAREContigPutFunc(putcontig8bitYCbCr11tile)
{
YCbCrSetup;
(void) y;
fromskew *= 3;
do {
x = w; /* was x = w>>1; patched 2000/09/25 warmerda@home.com */
do {
int Cb = pp[1];
int Cr = pp[2];
int32 Cb = pp[1];
int32 Cr = pp[2];
YCbCrtoRGB(*cp++, pp[0]);
@ -2018,7 +1996,6 @@ DECLAREContigPutFunc(putcontig8bitYCbCr11tile)
pp += fromskew;
} while (--h);
}
#undef YCbCrSetup
#undef YCbCrtoRGB
static tileContigRoutine

View File

@ -1,4 +1,4 @@
/* $Header: /cvs/maptools/cvsroot/libtiff/libtiff/tiffio.h,v 1.22 2003-12-03 19:54:03 dron Exp $ */
/* $Header: /cvs/maptools/cvsroot/libtiff/libtiff/tiffio.h,v 1.23 2003-12-04 10:31:54 dron Exp $ */
/*
* Copyright (c) 1988-1997 Sam Leffler
@ -153,8 +153,6 @@ typedef struct { /* YCbCr->RGB support */
int* Cb_b_tab;
int32* Cr_g_tab;
int32* Cb_g_tab;
float coeffs[3]; /* XXX: no longer required. Will
be removed in the future. */
} TIFFYCbCrToRGB;
typedef struct { /* CIE Lab 1976->RGB support */
@ -169,14 +167,15 @@ typedef struct { /* CIE Lab 1976->RGB support */
extern int TIFFCIELabToRGBInit(TIFFCIELabToRGB*, TIFFDisplay *display,
float X0, float Y0, float Z0);
extern int TIFFCIELabToRGBEnd(TIFFCIELabToRGB*);
extern void TIFFCIELabToRGBEnd(TIFFCIELabToRGB*);
extern void TIFFCIELabToXYZ(TIFFCIELabToRGB *, uint32, int32, int32,
float *, float *, float *);
extern void TIFFXYZToRGB(TIFFCIELabToRGB *, float, float, float,
uint32 *, uint32 *, uint32 *);
extern int
TIFFYCbCrToRGBInit(TIFFYCbCrToRGB*, float, float, float);
extern int TIFFYCbCrToRGBInit(TIFFYCbCrToRGB*, float, float, float);
extern void TIFFYCbCrtoRGB(TIFFYCbCrToRGB *, uint32, int32, int32,
uint32 *, uint32 *, uint32 *);
/*
* RGBA-style image support.