This is rotate.c in view mode; [Download] [Up]
/* * MrotateImage() - rotates image an integral of 90 degrees * * * RCS: * $Revision: 2.3 $ * $Date: 1996/05/03 02:21:34 $ * * Security: * Unclassified * * Description: * From ImageMagick * * Input Parameters: * type identifier description * * Image *image image to rotate * int degress degrees to rotate (intergral of 90) * * Output Parameters: * type identifier description * * text * * Return Values: * value description * * Side Effects: * text * * Limitations and Comments: * rotation is performed on a copy of the passed image. the caller * shuld free the passed copy after obtaing the rotated copy of the * image. * * Development History: * when who why * 07/31/94 muquit first cut */ #include "combine.h" Image *RotateImage(image, degrees) Image *image; int degrees; { Image *rotated_image; register Runlength *p, *q; register int x, y; unsigned int rotations; if (degrees%90 != 0) { (void) fprintf (stderr," %d is not multiple of 90\n",degrees); return ((Image *) NULL); } if (degrees == 360) { (void) fprintf (stderr," No need to rotate %d\n",degrees); return ((Image *) NULL); } if(degrees < 0) { degrees+=360; } for (rotations=0; degrees > 45; rotations++) { degrees-=90; } rotations%=4; if ((rotations == 1) || (rotations == 3)) { rotated_image=DuplicateImage(image, image->rows, image->columns, False); } else { rotated_image =DuplicateImage(image, image->columns, image->rows, False); } if (rotated_image == (Image *) NULL) { (void) fprintf (stderr, "Unable to rotate image,Memory allocation failed\n"); return ((Image *) NULL); } p = image->pixels; image->runlength = p->length+1; switch (rotations) { case 0: { /* ** 0 degree rotation */ q=rotated_image->pixels; for (y=0; y < image->rows; y++) { for (x=0; x < image->columns; x++) { if (image->runlength != 0) image->runlength--; else { p++; image->runlength=p->length; } *q=(*p); q->length=0; q++; } } break; } case 1: { /* ** 90 degrees */ for(x=0; x < rotated_image->columns; x++) { q = rotated_image->pixels+(rotated_image->columns-x)-1; for (y=0; y < rotated_image->rows; y++) { if (image->runlength != 0) image->runlength--; else { p++; image->runlength = p->length; } *q = (*p); q->length = 0; q+=rotated_image->columns; } } break; } case 2: { /* ** rotate 180 degrees */ q=rotated_image->pixels+ (rotated_image->columns*rotated_image->rows)-1; for (y=image->rows-1; y >=0; y--) { for (x=0; x < image->columns; x++) { if (image->runlength != 0) image->runlength--; else { p++; image->runlength=p->length; } *q=(*p); q->length=0; q--; } } break; } case 3: { /* ** 270 degress */ for(x=rotated_image->columns-1; x >=0; x--) { q = rotated_image->pixels+(rotated_image->columns* rotated_image->rows)-x-1; for (y=0; y < rotated_image->rows; y++) { if (image->runlength != 0) image->runlength--; else { p++; image->runlength = p->length; } *q = (*p); q->length = 0; q-=rotated_image->columns; } } break; } } return(rotated_image); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.