home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Developer CD v1.2
/
amidev_cd_12.iso
/
reference
/
amiga_mail_vol2
/
v-23
/
rotate.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-01-30
|
10KB
|
211 lines
;/* Rotate.c - Execute me to compile me with SAS/C 6.56
sc NMINC STRMERGE STREQ NOSTKCHK SAVEDS IGNORE=73 Rotate.c
slink FROM LIB:c.o,BulletMain.o,engine.o,Rotate.o TO Rotate LIBRARY LIB:sc.lib,LIB:amiga.lib
quit ;*/
/* (c) Copyright 1992 Commodore-Amiga, Inc. All rights reserved. */
/* The information contained herein is subject to change without notice, */
/* and is provided "as is" without warranty of any kind, either expressed */
/* or implied. The entire risk as to the use of this information is */
/* assumed by the user. */
#include <exec/types.h>
#include <diskfont/diskfonttag.h>
#include <diskfont/diskfont.h>
#include <diskfont/glyph.h>
#include <diskfont/oterrors.h>
#include <graphics/gfx.h>
#include <graphics/regions.h>
#include <utility/tagitem.h>
#include <intuition/intuition.h>
#include <devices/timer.h>
#include <clib/alib_stdio_protos.h>
#include <clib/alib_protos.h>
#include <clib/bullet_protos.h>
#include <clib/exec_protos.h>
#include <clib/layers_protos.h>
#include <clib/graphics_protos.h>
#include <clib/intuition_protos.h>
extern struct Library *BulletBase, *UtilityBase, *GfxBase, *IntuitionBase;
struct Library *LayersBase;
void BulletExample(struct GlyphEngine *,
struct Window *,
struct RastPort *,
ULONG, ULONG, ULONG, ULONG, ULONG);
UBYTE *vers = "\0$VER: Rotate 38.10";
#define TABLE_ENTRIES 24
#define SINE_INDEX 0
#define COSINE_INDEX 1
/* precalculated sine and cosine */
LONG table[TABLE_ENTRIES][2] =
{
{0x0, 0x10000}, /* 0 degrees */ /* Notice that the sine and cosine */
{0x424e, 0xf747}, /* 15 degrees */ /* values have to correspond to the */
{0x8000, 0xddb4}, /* 30 degrees */ /* same angle. The IntelliFont */
{0xb505, 0xb505}, /* 45 degrees */ /* engine will have severe mental */
{0xddb4, 0x8000}, /* 60 degrees */ /* problems if the values aren't */
{0xf747, 0x424e}, /* 75 degrees */ /* close to representing the same */
{0x10000, 0x0}, /* 90 degrees */ /* angle. */
{0xf747, 0xffffbdbe}, /* 105 degrees */
{0xddb4, 0xffff8000}, /* 120 degrees */
{0xb505, 0xffff4afb}, /* 135 degrees */
{0x8000, 0xffff224c}, /* 150 degrees */
{0x424e, 0xffff08b9}, /* 165 degrees */
{0x0, 0xffff0000}, /* 180 degrees */
{0xffffbdbe, 0xffff08b9}, /* 195 degrees */
{0xffff8000, 0xffff224c}, /* 210 degrees */
{0xffff4afb, 0xffff4afb}, /* 225 degrees */
{0xffff224c, 0xffff8000}, /* 240 degrees */
{0xffff08b9, 0xffffbdbe}, /* 255 degrees */
{0xffff0000, 0x0}, /* 270 degrees */
{0xffff08b9, 0x424e}, /* 285 degrees */
{0xffff224c, 0x8000}, /* 300 degrees */
{0xffff4afb, 0xb505}, /* 315 degrees */
{0xffff8000, 0xddb4}, /* 330 degrees */
{0xffffbdbe, 0xf747} /* 345 degrees */
};
struct Rectangle rectangle;
struct Region *region;
void
BulletExample(struct GlyphEngine * ge,
struct Window * w, struct RastPort * rp,
ULONG pointheight, ULONG xdpi, ULONG ydpi, ULONG unicode, ULONG unicode2)
{
struct GlyphMap *gm;
PLANEPTR tempbitmap;
ULONG centerx, centery, x, y, dx, dy, sin, cos, oldx, oldy, olddx,
olddy, emheight, emwidth;
ULONG i = 0;
struct IntuiMessage *mymsg;
BOOL done = FALSE;
if (pointheight > 180) pointheight = 180;
if (SetInfo(ge,
OT_DeviceDPI, ((ULONG) xdpi) << 16 | ydpi,
TAG_END) != OTERR_Success)
return;
emheight = (pointheight * ydpi) / 72; /* Calculate the pixel dimensions */
emwidth = (pointheight * xdpi) / 72; /* of the EM square. */
centerx = w->BorderLeft + emheight;
centery = w->BorderTop + emwidth;
dx = (2 * emwidth) + w->BorderLeft + w->BorderRight; /* Calculate window size to */
dy = (2 * emheight) + w->BorderTop + w->BorderBottom; /* fit around glyph com- */
dx = (dx > 640) ? 640 : dx; /* fortablely. */
dy = (dy > 200) ? 200 : dy;
dx = (dx < 80) ? 80: dx;
dy = (dy < 50) ? 50: dy;
if (ModifyIDCMP(w, IDCMP_CHANGEWINDOW))
{
ChangeWindowBox(w, w->LeftEdge, w->TopEdge, dx, dy); /* Set window size */
WaitPort(w->UserPort); /* and wait for the */
while (mymsg = (struct IntuiMessage *) GetMsg(w->UserPort)) /* dimension change */
ReplyMsg((struct Message *) mymsg); /* to take place. */
if (!(ModifyIDCMP(w, NULL))) return; /* Quit if there is a problem with IDCMP. */
}
x = centerx; /* calculate original rendering position. */
y = centery;
dx = 1; /* Since dx and dy are no longer necessary for figuring out the window */
dy = 1; /* dimensions, I use them to measure the full width and height of the */
/* glyph bitmap supplied by bullet. I need this to erase the glyph. */
if (LayersBase = OpenLibrary("layers.library", 37L)) /* These lines are */
{ /* here to install */
rectangle.MinX = w->BorderLeft; /* a clipping */
rectangle.MinY = w->BorderTop; /* region to the */
rectangle.MaxX = w->Width - w->BorderRight - 1; /* window to keep */
rectangle.MaxY = w->Height - w->BorderBottom - 1; /* the glyph within */
/* window bounds. */
if (region = NewRegion()) /* For more information, */
{ /* see the "Layers" */
if (OrRectRegion(region, &rectangle)) /* chapter of the */
{ /* RKRM: Libraries */
InstallClipRegion(w->WLayer, region); /* Manual. */
if (SetInfo(ge,
OT_GlyphCode, unicode, /* Set the glyph to */
OT_PointHeight, (ULONG) pointheight << 16, /* rotate and its */
TAG_END) == OTERR_Success) /* pointsize. */
{
SetDrMd(w->RPort, JAM1);
if (tempbitmap = AllocRaster(640, 200))
{
if (ModifyIDCMP(w, IDCMP_CLOSEWINDOW)) /* Turn on close window reports */
{ /* so the example can quit. */
for (i = 0; done == FALSE; i++)
{
if (i == TABLE_ENTRIES)
i = 0;
sin = table[i][SINE_INDEX]; /* Step through the sine/cosine array */
cos = table[i][COSINE_INDEX]; /* 360 degrees @ 15 degree increments */
if (SetInfo(ge, /* Set the current rotation angle. */
OT_RotateSin, sin,
OT_RotateCos, cos,
TAG_END) == OTERR_Success)
{
if ((ObtainInfo(ge, OT_GlyphMap, &gm, TAG_END)) == OTERR_Success)
{
oldx = x; /* Calculate the dimension and position */
oldy = y; /* of the new glyph's bitmap and save */
olddx = dx; /* the old values so we can erase the */
olddy = dy; /* glyph that is still on the screen. */
x = centerx - gm->glm_X0;
y = centery - gm->glm_Y0;
dx = gm->glm_BMModulo * 8;
dy = gm->glm_BMRows;
CopyMem(gm->glm_BitMap,/* Copy the glyph's bitmap into Chip RAM */
tempbitmap, /* so we can blit it into a RastPort. */
gm->glm_BMModulo * gm->glm_BMRows);
/* Erase the old glyph. */
RectFill(rp, oldx, oldy, oldx + olddx, oldy + olddy);
WaitBlit(); /* Wait for the old glyph to erase. */
BltTemplate( /* Blit the new glyph into the */
tempbitmap, /* window's RastPort. */
0,
gm->glm_BMModulo,
w->RPort,
x,
y,
dx,
dy); /* Running several instances of this */
/* example simultaneously can really */
/* slow the system, so we give other */
TimeDelay(UNIT_VBLANK, 0, 250000); /* tasks a chance to run. */
ReleaseInfo(ge, OT_GlyphMap, gm, TAG_END);
}
} /* Check for a CLOSEWINDOW message. */
while (mymsg = (struct IntuiMessage *) GetMsg(w->UserPort))
{
ReplyMsg((struct Message *) mymsg);
done = TRUE;
}
}
}
FreeRaster(tempbitmap, 640, 200);
}
}
}
DisposeRegion(region);
}
CloseLibrary(LayersBase);
}
}