Prerequestite libraries: OSlib
/* By Johnathan Coxhead - released onto the net 23/7/96 */ #ifndef spritefile_H #define spritefile_H #ifndef types_H #include "types.h" #endif #ifndef os_H #include "os.h" #endif #ifndef osspriteop_H #include "osspriteop.h" #endif #define spritefile_NARROW_ENTRIES 0x1u /************************* * Function declarations * *************************/ #ifdef __cplusplus extern "C" { #endif /* ------------------------------------------------------------------------ * Function: spritefile_render() */ extern void spritefile_render (bits flags, osspriteop_header const *sprite, int size, os_trfm const *trfm, os_box const *clip); /* ------------------------------------------------------------------------ * Function: spritefile_bbox() */ extern void spritefile_bbox (bits flags, osspriteop_header const *sprite, int size, os_trfm const *trfm, os_box *bbox); /* ------------------------------------------------------------------------ * Function: spritefile_declare_fonts() */ extern void spritefile_declare_fonts (bits flags, osspriteop_header const *sprite, int size); #ifdef __cplusplus } #endif #endif
/* By Johnathan Coxhead - released onto the net 23/7/96 */ #include "colourtrans.h" #include "draw.h" #include "os.h" #include "osspriteop.h" #include "wimp.h" #include "x.h" #include "spritefile.h" #include "trfm.h" x_LOCAL_ERROR (Bad_Mode, 1, "Bad mode") void spritefile_render (bits flags, osspriteop_header const *sprite, int size, os_trfm const *trfm, os_box const *clip) { osspriteop_trans_tab *table; bool narrow_entries = (flags & spritefile_NARROW_ENTRIES) != NONE; os_PALETTE (20) palette; int log2_bpp; if ((sprite->image - sizeof (osspriteop_header))/sizeof (os_colour_pair) == 0) { if ((os_read_mode_variable (sprite->mode, os_MODEVAR_LOG2_BPP, &log2_bpp) & _C) != NONE) x_THROW (Bad_Mode); if (log2_bpp < 3) wimp_read_true_palette ((os_palette *) &palette); switch (log2_bpp) { case 0: palette.entries [1] = palette.entries [7]; break; case 1: palette.entries [1] = palette.entries [2]; palette.entries [2] = palette.entries [4]; palette.entries [3] = palette.entries [7]; break; } colourtrans_generate_table ( sprite->mode, log2_bpp < 3? (os_palette *) &palette: colourtrans_CURRENT_PALETTE, colourtrans_CURRENT_MODE, colourtrans_CURRENT_PALETTE, table = x_ALLOC ( colourtrans_generate_table ( sprite->mode, log2_bpp < 3? (os_palette *) &palette: colourtrans_CURRENT_PALETTE, colourtrans_CURRENT_MODE, colourtrans_CURRENT_PALETTE, NULL, colourtrans_GIVEN_SPRITE | (narrow_entries? NONE: colourtrans_RETURN_WIDE_ENTRIES), SKIP, SKIP ) ), colourtrans_GIVEN_SPRITE | (narrow_entries? NONE: colourtrans_RETURN_WIDE_ENTRIES), SKIP, SKIP ); } else colourtrans_generate_table_for_sprite ( osspriteop_UNSPECIFIED, (osspriteop_id) sprite, colourtrans_CURRENT_MODE, colourtrans_CURRENT_PALETTE, table = x_ALLOC ( colourtrans_generate_table_for_sprite ( osspriteop_UNSPECIFIED, (osspriteop_id) sprite, colourtrans_CURRENT_MODE, colourtrans_CURRENT_PALETTE, NULL, colourtrans_GIVEN_SPRITE | (narrow_entries? NONE: colourtrans_RETURN_WIDE_ENTRIES), SKIP, SKIP ) ), colourtrans_GIVEN_SPRITE | (narrow_entries? NONE: colourtrans_RETURN_WIDE_ENTRIES), SKIP, SKIP ); osspriteop_put_sprite_trfm (osspriteop_PTR, osspriteop_UNSPECIFIED, (osspriteop_id) sprite, NONE, NULL, os_ACTION_USE_MASK | (narrow_entries? NONE: osspriteop_GIVEN_WIDE_ENTRIES), trfm, table); x_FREE (table, 0); } void spritefile_bbox (bits flags, osspriteop_header const *sprite, int size, os_trfm const *trfm, os_box *bbox) { os_box box; os_mode mode; int width, height, xeig, yeig; /*Get bbox of sprite into box.*/ osspriteop_read_sprite_size (osspriteop_PTR, osspriteop_UNSPECIFIED, (osspriteop_id) sprite, &width, &height, NULL, &mode); if ((os_read_mode_variable (mode, os_MODEVAR_XEIG_FACTOR, &xeig) & _C) != NONE || (os_read_mode_variable (mode, os_MODEVAR_YEIG_FACTOR, &yeig) & _C) != NONE) x_THROW (Bad_Mode); box.x0 = box.y0 = 0; box.x1 = (width << xeig)*draw_OS_UNIT; box.y1 = (height << yeig)*draw_OS_UNIT; trfm_box (bbox, trfm, &box); } void spritefile_declare_fonts (bits flags, osspriteop_header const *sprite, int size) { NOT_USED (flags) NOT_USED (sprite) NOT_USED (size) } ---------------------------------------------------------------------------- Trfm_box() just transforms a box and rebounds it: ---------------------------------------------------------------------------- void trfm_box (os_box *b, os_trfm const *m, os_box const *b1) /*set |b| to the bbox of |b1| after transformation by |m|.*/ { os_coord c [4], c1 [4]; int i; /*Get the four corners of |b1|.*/ c1 [0].x = b1->x0, c1 [0].y = b1->y0; c1 [1].x = b1->x1, c1 [1].y = b1->y0; c1 [2].x = b1->x1, c1 [2].y = b1->y1; c1 [3].x = b1->x0, c1 [3].y = b1->y1; /*Transform them all.*/ for (i = 0; i < 4; i++) trfm_point (&c [i], m, &c1 [i]); /*Bound the four new points.*/ b->x0 = b->y0 = INT_MAX; b->x1 = b->y1 =-INT_MAX; for (i = 0; i < 4; i++) { (void) MINAB (b->x0, c [i].x); (void) MINAB (b->y0, c [i].y); (void) MAXAB (b->x1, c [i].x); (void) MAXAB (b->y1, c [i].y); } }