This is tranrgb.c in view mode; [Download] [Up]
/*
* TransformRGBImage() - Converts the reference image from an alternate
* colorspace.
*
* RCS:
* $Revision: 2.3 $
* $Date: 1996/05/03 02:21:34 $
*
* Security:
* Unclassified
*
* Description:
* Adapted from ImageMacgick 3.0
*
* Input Parameters:
* type identifier description
*
* text
*
* Output Parameters:
* type identifier description
*
* text
*
* Return Values:
* value description
*
* Side Effects:
* text
*
* Limitations and Comments:
* text
*
* Development History:
* when who why
* 4/30/94 mm first cut
*/
#include "combine.h"
#include "defines.h"
void TransformRGBImage(image,colorspace)
Image
*image;
unsigned int
colorspace;
{
#define R 0
#define G (MaxRGB+1)
#define B (MaxRGB+1)*2
long
*blue,
*green,
*red;
register int
i,
x,
y,
z;
register Runlength
*p;
register unsigned char
*range_limit;
unsigned char
*range_table;
if ((colorspace == RGBColorspace) || (colorspace == GRAYColorspace))
return;
/*
Allocate the tables.
*/
red=(long *) malloc(3*(MaxRGB+1)*sizeof(long));
green=(long *) malloc(3*(MaxRGB+1)*sizeof(long));
blue=(long *) malloc(3*(MaxRGB+1)*sizeof(long));
range_table=(unsigned char *) malloc(3*(MaxRGB+1)*sizeof(unsigned char));
if ((red == (long *) NULL) || (green == (long *) NULL) ||
(blue == (long *) NULL) || (range_table == (unsigned char *) NULL))
{
(void) fprintf (stderr,
"Unable to transform color space,Memory allocation failed\n");
return;
}
/*
Initialize tables.
*/
for (i=0; i <= MaxRGB; i++)
{
range_table[i]=0;
range_table[i+(MaxRGB+1)]=(unsigned char) i;
range_table[i+(MaxRGB+1)*2]=MaxRGB;
}
range_limit=range_table+(MaxRGB+1);
switch (colorspace)
{
case OHTAColorspace:
{
/*
Initialize OHTA tables:
R = I1+1.00000*I2-0.66668*I3
G = I1+0.00000*I2+1.33333*I3
B = I1-1.00000*I2-0.66668*I3
I and Q, normally -0.5 through 0.5, must be normalized to the range 0
through MaxRGB.
*/
for (i=0; i <= MaxRGB; i++)
{
red[i+R]=UpShifted(1.00000)*i;
green[i+R]=UpShifted(1.0000*0.5)*((i << 1)-MaxRGB);
blue[i+R]=(-UpShifted(0.66668*0.5))*((i << 1)-MaxRGB);
red[i+G]=UpShifted(1.00000)*i;
green[i+G]=0;
blue[i+G]=UpShifted(1.33333*0.5)*((i << 1)-MaxRGB);
red[i+B]=UpShifted(1.00000)*i;
green[i+B]=(-UpShifted(1.00000*0.5))*((i << 1)-MaxRGB);
blue[i+B]=(-UpShifted(0.66668*0.5))*((i << 1)-MaxRGB);
}
break;
}
case XYZColorspace:
{
/*
Initialize XYZ tables:
R = 1.87597*X-0.53294*Y-0.34303*Z
G = -0.96670*X+1.99806*Y+0.03136*Z
B = 0.05735*X-0.11853*Y+1.06118*Z
*/
for (i=0; i <= MaxRGB; i++)
{
red[i+R]=UpShifted(1.87597)*i;
green[i+R]=(-UpShifted(0.53294))*i;
blue[i+R]=(-UpShifted(0.34303))*i;
red[i+G]=(-UpShifted(0.96670))*i;
green[i+G]=UpShifted(1.99806)*i;
blue[i+G]=UpShifted(0.03136)*i;
red[i+B]=UpShifted(0.05735)*i;
green[i+B]=(-UpShifted(0.11853))*i;
blue[i+B]=UpShifted(1.06118)*i;
}
break;
}
case YCbCrColorspace:
{
/*
Initialize YCbCr tables:
R = Y +1.40200*Cr
G = Y-0.34414*Cb-0.71414*Cr
B = Y+1.77200*Cb
Cb and Cr, normally -0.5 through 0.5, must be normalized to the range 0
through MaxRGB.
*/
for (i=0; i <= MaxRGB; i++)
{
red[i+R]=UpShifted(1.00000)*i;
green[i+R]=0;
blue[i+R]=UpShifted(1.40200*0.5)*((i << 1)-MaxRGB);
red[i+G]=UpShifted(1.00000)*i;
green[i+G]=(-UpShifted(0.34414*0.5))*((i << 1)-MaxRGB);
blue[i+G]=(-UpShifted(0.71414*0.5))*((i << 1)-MaxRGB);
red[i+B]=UpShifted(1.00000)*i;
green[i+B]=UpShifted(1.77200*0.5)*((i << 1)-MaxRGB);
blue[i+B]=0;
}
break;
}
case YIQColorspace:
{
/*
Initialize YIQ tables:
R = 0.97087*Y+1.17782*I+0.59800*Q
G = 0.97087*Y-0.28626*I-0.72851*Q
B = 0.97087*Y-1.27870*I+1.72801*Q
I and Q, normally -0.5 through 0.5, must be normalized to the range 0
through MaxRGB.
*/
for (i=0; i <= MaxRGB; i++)
{
red[i+R]=UpShifted(0.97087)*i;
green[i+R]=UpShifted(1.17782*0.5)*((i << 1)-MaxRGB);
blue[i+R]=UpShifted(0.59800*0.5)*((i << 1)-MaxRGB);
red[i+G]=UpShifted(0.97087)*i;
green[i+G]=(-UpShifted(0.28626*0.5))*((i << 1)-MaxRGB);
blue[i+G]=(-UpShifted(0.72851*0.5))*((i << 1)-MaxRGB);
red[i+B]=UpShifted(0.97087)*i;
green[i+B]=(-UpShifted(1.27870*0.5))*((i << 1)-MaxRGB);
blue[i+B]=UpShifted(1.72801*0.5)*((i << 1)-MaxRGB);
}
break;
}
case YUVColorspace:
default:
{
/*
Initialize YUV tables:
R = Y +1.13980*V
G = Y-0.39380*U-0.58050*V
B = Y+2.02790*U
U and V, normally -0.5 through 0.5, must be normalized to the range 0
through MaxRGB.
*/
for (i=0; i <= MaxRGB; i++)
{
red[i+R]=UpShifted(1.00000)*i;
green[i+R]=0;
blue[i+R]=UpShifted(1.13980*0.5)*((i << 1)-MaxRGB);
red[i+G]=UpShifted(1.00000)*i;
green[i+G]=(-UpShifted(0.39380*0.5))*((i << 1)-MaxRGB);
blue[i+G]=(-UpShifted(0.58050*0.5))*((i << 1)-MaxRGB);
red[i+B]=UpShifted(1.00000)*i;
green[i+B]=UpShifted(2.02790*0.5)*((i << 1)-MaxRGB);
blue[i+B]=0;
}
break;
}
}
/*
Convert to RGB.
*/
switch (image->class)
{
case DirectClass:
{
/*
Convert DirectClass image.
*/
p=image->pixels;
for (i=0; i < image->packets; i++)
{
x=p->red;
y=p->green;
z=p->blue;
p->red=range_limit[DownShift(red[x+R]+green[y+R]+blue[z+R])];
p->green=range_limit[DownShift(red[x+G]+green[y+G]+blue[z+G])];
p->blue=range_limit[DownShift(red[x+B]+green[y+B]+blue[z+B])];
p++;
}
break;
}
case PseudoClass:
{
/*
Convert PseudoClass image.
*/
for (i=0; i < image->colors; i++)
{
x=image->colormap[i].red;
y=image->colormap[i].green;
z=image->colormap[i].blue;
image->colormap[i].red=
range_limit[DownShift(red[x+R]+green[y+R]+blue[z+R])];
image->colormap[i].green=
range_limit[DownShift(red[x+G]+green[y+G]+blue[z+G])];
image->colormap[i].blue=
range_limit[DownShift(red[x+B]+green[y+B]+blue[z+B])];
}
p=image->pixels;
for (i=0; i < image->packets; i++)
{
x=p->red;
y=p->green;
z=p->blue;
p->red=range_limit[DownShift(red[x+R]+green[y+R]+blue[z+R])];
p->green=range_limit[DownShift(red[x+G]+green[y+G]+blue[z+G])];
p->blue=range_limit[DownShift(red[x+B]+green[y+B]+blue[z+B])];
p++;
}
break;
}
}
/*
Free allocated memory.
*/
(void) free((char *) range_table);
(void) free((char *) blue);
(void) free((char *) green);
(void) free((char *) red);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.