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.