This is flatten.c in view mode; [Download] [Up]
/* * FlattenImage() - flattens images * * RCS: * $Revision: 2.3 $ * $Date: 1996/05/03 02:21:34 $ * * Security: * Unclassified * * Description: * Adapted from ImageMagick * * Input Parameters: * type identifier description * * Image *baseimage base image struct * Image *subimage subimage struct * unsigned int compose composite operator * int x_offset x offset from upper left corner, + rightward * int y_offset y offset from upper left corner, + downward * * Output Parameters: * type identifier description * * text * * Return Values: * value description * * Side Effects: * text * * Limitations and Comments: * text * * Development History: * when who why * 08/26/94 muquit first cut */ #include "combine.h" #include "defines.h" void FlattenImage(baseimage,subimage,compose,x_offset,y_offset) Image *baseimage; Image *subimage; unsigned int compose; int x_offset, y_offset; { int blue, green, red; register int i, x, y; register Runlength *p, *q; register short index; blue=red=green=MaxRGB; index=0; if (((x_offset+(int) baseimage->columns) < 0) || ((y_offset+(int) baseimage->rows) < 0) || (x_offset > (int) baseimage->columns) || (y_offset > (int) baseimage->rows)) { (void) fprintf (stderr, "Unable to flatten image!\n"); return; } if (!UncompressImage(baseimage)) return; #ifdef XDEBUG switch (baseimage->class) { case PseudoClass: { fprintf (stderr, "Base Image Class: PseudoClass\n"); break; } case DirectClass: { fprintf (stderr, "Base Image Class: DirectClass\n"); break; } } switch (subimage->class) { case PseudoClass: { fprintf (stderr, "Sub Image Class: PseudoClass\n"); break; } case DirectClass: { fprintf (stderr, "Sub Image Class: DirectClass\n"); break; } } #endif if (compose == ReplaceCompositeOp) { /* ** promote image to DirectClass if colormap differs */ if (baseimage->class == PseudoClass) if (subimage->class == DirectClass) baseimage->class=DirectClass; else { if (baseimage->signature == (char *) NULL) ColormapSignature(baseimage); if (subimage->signature == (char *) NULL) ColormapSignature(subimage); if (strcmp(baseimage->signature,subimage->signature) != 0) baseimage->class=DirectClass; } if (baseimage->alpha && !subimage->alpha) { p=subimage->pixels; for (i=0; i < subimage->packets; i++) { p->index=Opaque; p++; } subimage->class=DirectClass; subimage->alpha=True; } } else { /* ** initialize alpha channel of the image */ if (!baseimage->alpha) { q=baseimage->pixels; red = q->red; green = q->green; blue = q->blue; for (i=0; i < baseimage->packets; i++) { q->index = MaxRGB; if ((q->red == red) && (q->green == green) && (q->blue == blue)) q->index = 0; q++; } baseimage->class = DirectClass; baseimage->alpha = True; } if (!subimage->alpha) { p = subimage->pixels; red = p->red; green = p->green; blue = p->blue; for (i=0; i < subimage->packets; i++) { p->index = MaxRGB; if ((p->red == red) && (p->green == green) && (p->blue == blue)) p->index = 0; p++; } subimage->class = DirectClass; subimage->alpha = True; } } #ifdef XDEBUG switch (baseimage->class) { case PseudoClass: { fprintf (stderr, "Base Image Class: PseudoClass\n"); break; } case DirectClass: { fprintf (stderr, "Base Image Class: DirectClass\n"); break; } } switch (subimage->class) { case PseudoClass: { fprintf (stderr, "Sub Image Class: PseudoClass\n"); break; } case DirectClass: { fprintf (stderr, "Sub Image Class: DirectClass\n"); break; } } #endif #ifdef DEBUG (void) fprintf (stderr," flatten: subimage->alpha: %d\n",subimage->alpha); #endif p=subimage->pixels; subimage->runlength=p->length+1; for (y=0; y < subimage->rows; y++) { if (((y_offset+y) < 0) || ((y_offset+y) >= baseimage->rows)) continue; q=baseimage->pixels+(y_offset+y)*baseimage->columns+x_offset; for (x=0; x < subimage->columns; x++) { if (subimage->runlength != 0) subimage->runlength--; else { p++; subimage->runlength=p->length; } if (((x_offset+x) < 0) || ((x_offset+x) >= baseimage->columns)) { q++; continue; } /* ** Now handle compositing */ switch (compose) { /* ** make black pixels [r,g,b=(0,0,0)] of the sub_image transparent ** NOTE: NITFS black is 1, 1, 1, so we do not have to worry ** about entities having black colors, because it will be 1,1,1, not ** 0,0,0 */ case BlackTransparentOp: { if (((int)p->red == 0) && ((int)p->green == 0) && ((int)p->blue == 0)) { /* ** these pixels are transparent, i.e., keep the pixels of ** the base image intact */ red = (int) q->red; green = (int) q->green; blue = (int) q->blue; } else { /* ** these pixels are opaque.. ** replace these pixels of the base image by subimage */ red = (int) p->red; green = (int) p->green; blue = (int) p->blue; } break; } /* end case BlackTransparentOp*/ case ReplaceCompositeOp: { /* ** these pixels of the sub_image are opaque, replace the ** pixels of the base image with these */ red=p->red; green=p->green; blue=p->blue; index=p->index; break; } } /* end switch */ /* ** do some checking anyway */ if (red > MaxRGB) q->red=MaxRGB; else if (red < 0) q->red=0; else q->red=red; if (green > MaxRGB) q->green=MaxRGB; else if (green < 0) q->green=0; else q->green=green; if (blue > MaxRGB) q->blue=MaxRGB; else if (blue < 0) q->blue=0; else q->blue=blue; if (index > 255) q->index=255; else if (index < 0) q->index=0; else q->index=index; q->length=0; q++; } } }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.