V10/cmd/dimpress/rotate.c


/*
 *
 * Things needed to rotate glyphs. Includes setting new reference point,
 * bitmap dimensions, and filling in the new bitmap.
 *
 */


#include <stdio.h>

#include "gen.h"			/* a few general definitions */
#include "rast.h"			/* for definition of Glyph */
#include "rotate.h"			/* rotation macros */


/*
 *
 * These guys are used in the translation and rotation macros defined
 * in rotate.h.
 *
 */


int	cosine[ROT_COUNT] = {1, 0, -1, 0};
int	sine[ROT_COUNT] = {0, 1, 0, -1};
int	delta[ROT_COUNT] = {1, 0, 0, 0};


char	*bptr = NULL;			/* last rotated bitmap */


/*****************************************************************************/


rotate(glyph, angle)


    Glyph	*glyph;			/* rotate this glyph */
    int		angle;			/* to this orientation */


{


    Glyph	oglyph;			/* old glyph data */
    int		orwid;			/* rows in the old bitmap */
    int		nrwid;			/* same but for the new bitmap */
    int		mapsize;		/* byte size of the new map */
    int		i, j;			/* coordinates in the old bitmap */
    int		x, y;			/* same but in the new bitmap */


/*
 *
 * Called when we want to rotate glyph to an orientation of angle, where
 * angle should be 0, 1, 2, or 3. I decided against using a complete set
 * of raster files that had already been rotated in favor of doing the work
 * at run time. Really don't expect this stuff to be used that much and
 * we've already got too many raster files around.
 *
 */


    if ( angle == 0 ) return;		/* everything's already done */

    oglyph = *glyph;			/* we'll need most of the old values */

    glyph->xref = NEWX(oglyph.xref, oglyph.yref, oglyph.height, oglyph.width, angle);
    glyph->yref = NEWY(oglyph.xref, oglyph.yref, oglyph.height, oglyph.width, angle);
    glyph->width = (angle % 2) ? oglyph.height : oglyph.width;
    glyph->height = (angle % 2) ? oglyph.width : oglyph.height;

    if ( bptr != NULL )
	free(bptr);

    mapsize = ((glyph->width + BYTE - 1) / BYTE) * glyph->height;
    if ( (bptr = (char *) calloc(mapsize, sizeof(char))) == NULL )
	error(FATAL, "can't get memory for bitmap");

    orwid = (oglyph.width + BYTE - 1) / BYTE;
    nrwid = (glyph->width + BYTE - 1) / BYTE;

    for ( j = 0; j < oglyph.height; j++ )
	for ( i = 0; i < oglyph.width; i++ )
	    if ( checkbit(oglyph.bptr, orwid * j * BYTE + i) )  {
		x = NEWX(i, j, oglyph.height, oglyph.width, angle);
		y = NEWY(i, j, oglyph.height, oglyph.width, angle);
		setbit(bptr, nrwid * y * BYTE + x);
	    }	/* End if */

    glyph->bptr = bptr;

}   /* End of rotate */


/*****************************************************************************/