ftp.nice.ch/pub/next/graphics/viewer/pCD.0.34.N.bs.tar.gz#/pCD0.3.4/Photo_CD.subproj/rotate.c

This is rotate.c in view mode; [Download] [Up]

#include <stdlib.h>		//  on NeXT, at least
#include <string.h>		//  on NeXT, at least

typedef unsigned char uBYTE;
typedef unsigned long dim;

struct _implane
 {dim  mwidth,mheight,
       iwidth,iheight;
  uBYTE *im;
 };
typedef struct _implane implane;
enum TURNS  { T_NONE,T_RIGHT,T_LEFT };

extern planealloc();

void rotateBm( dim *wid, dim *ht, implane *r, implane *g, implane *b, enum TURNS t)
{
	dim x,y,w,h;
	implane Out;
	register uBYTE *pIn,*pOut;
	uBYTE  *work;

	w = *wid, h = *ht;
	work = malloc(h);
	planealloc(&Out, w, h);
	switch (t) {

	   case T_RIGHT:
		  pOut = Out.im;
	      for( y=0; y<w; y++ ) {
		    pIn = r->im + r->mwidth * ( r->mheight -1) + y;
     		for( x=0; x<h; x++ ) {
			   work[x] = *pIn;	
		 	   pIn -= r->mwidth;
            }
		    bcopy(work, pOut, h);
			pOut += h;
	      }
		  bcopy( Out.im, r->im, w*h);
		  pOut = Out.im;
	      for( y=0; y<w; y++ ) {
		    pIn = g->im + g->mwidth * ( r->mheight -1) + y;
     		for( x=0; x<h; x++ ) {
			   work[x] = *pIn;	
		 	   pIn -= g->mwidth;
            }
		    bcopy(work, pOut, h);
			pOut += h;
	      }
		  bcopy( Out.im, g->im, w*h);
		  pOut = Out.im;
	      for( y=0; y<w; y++ ) {
		    pIn = b->im + b->mwidth * ( r->mheight -1) + y;
     		for( x=0; x<h; x++ ) {
			   work[x] = *pIn;	
		 	   pIn -= b->mwidth;
            }
		    bcopy(work, pOut, h);
			pOut += h;
	      }
		  bcopy( Out.im, b->im, w*h);
	      break;
	   
	   case T_LEFT:
		  pOut = Out.im;
	      for( y=0; y<w; y++ ) {
		    pIn = r->im + r->mwidth - 1 - y;
     		for( x=0; x<h; x++ ) {
			   work[x] = *pIn;	
		 	   pIn += r->mwidth;
            }
		    bcopy(work, pOut, h);
			pOut += h;
	      }
		  bcopy( Out.im, r->im, w*h);
		  pOut = Out.im;
	      for( y=0; y<w; y++ ) {
		    pIn = g->im + g->mwidth - 1 - y;
     		for( x=0; x<h; x++ ) {
			   work[x] = *pIn;	
		 	   pIn += g->mwidth;
            }
		    bcopy(work, pOut, h);
			pOut += h;
	      }
		  bcopy( Out.im, g->im, w*h);
		  pOut = Out.im;
	      for( y=0; y<w; y++ ) {
		    pIn = b->im + b->mwidth - 1 - y;
     		for( x=0; x<h; x++ ) {
			   work[x] = *pIn;	
		 	   pIn += b->mwidth;
            }
		    bcopy(work, pOut, h);
			pOut += h;
	      }
		  bcopy( Out.im, b->im, w*h);
	      break;
	   
	   default:	/* T_NONE (or something else) */
	      /* probably an internal error, but ignore for now */
	      break;
	}
	*wid = h, *ht = w;
	free(Out.im);
	free(work);
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.