diff options
author | Paweł Kołodziejski | 2006-12-06 19:27:02 +0000 |
---|---|---|
committer | Paweł Kołodziejski | 2006-12-06 19:27:02 +0000 |
commit | 1d3ca2e40908ababd16fe8b1c9070198f9b75c82 (patch) | |
tree | 3c38e45040b1bbd97694b6eaf0ea4dec6f460753 /engines/agi/sprite.cpp | |
parent | 1a85adfa833e78d4460e89ff5db1c6bc8688b048 (diff) | |
download | scummvm-rg350-1d3ca2e40908ababd16fe8b1c9070198f9b75c82.tar.gz scummvm-rg350-1d3ca2e40908ababd16fe8b1c9070198f9b75c82.tar.bz2 scummvm-rg350-1d3ca2e40908ababd16fe8b1c9070198f9b75c82.zip |
first phase of objectisation of agi engine
svn-id: r24808
Diffstat (limited to 'engines/agi/sprite.cpp')
-rw-r--r-- | engines/agi/sprite.cpp | 148 |
1 files changed, 72 insertions, 76 deletions
diff --git a/engines/agi/sprite.cpp b/engines/agi/sprite.cpp index 4653093c77..333bea2753 100644 --- a/engines/agi/sprite.cpp +++ b/engines/agi/sprite.cpp @@ -46,8 +46,6 @@ struct sprite { uint8 *hires; /**< buffer for hi-res background */ }; -SpritesMan *_sprites; - /* * Sprite pool replaces dynamic allocation */ @@ -57,7 +55,7 @@ SpritesMan *_sprites; #define POOL_SIZE 68000 /* Gold Rush mine room needs > 50000 */ /* Speeder bike challenge needs > 67000 */ -void *SpritesMan::pool_alloc(int size) { +void *SpritesMgr::pool_alloc(int size) { uint8 *x; /* Adjust size to 32-bit boundary to prevent data misalignment @@ -80,7 +78,7 @@ void *SpritesMan::pool_alloc(int size) { /* Note: it's critical that pool_release() is called in the exact reverse order of pool_alloc() */ -void SpritesMan::pool_release(void *s) { +void SpritesMgr::pool_release(void *s) { pool_top = (uint8 *)s; } @@ -90,7 +88,7 @@ void SpritesMan::pool_release(void *s) { /* Blit one pixel considering the priorities */ -void SpritesMan::blit_pixel(uint8 *p, uint8 *end, uint8 col, int spr, int width, int *hidden) { +void SpritesMgr::blit_pixel(uint8 *p, uint8 *end, uint8 col, int spr, int width, int *hidden) { int epr = 0, pr = 0; /* effective and real priorities */ /* CM: priority 15 overrides control lines and is ignored when @@ -138,7 +136,7 @@ void SpritesMan::blit_pixel(uint8 *p, uint8 *end, uint8 col, int spr, int width, #define X_FACT 2 /* Horizontal hires factor */ -int SpritesMan::blit_hires_cel(int x, int y, int spr, view_cel *c) { +int SpritesMgr::blit_hires_cel(int x, int y, int spr, view_cel *c) { uint8 *q = NULL; uint8 *h0, *h, *end; int i, j, t, m, col; @@ -148,9 +146,9 @@ int SpritesMan::blit_hires_cel(int x, int y, int spr, view_cel *c) { t = c->transparency; m = c->mirror; spr <<= 4; - h0 = &game.hires[(x + y * _WIDTH + m * (c->width - 1)) * X_FACT]; + h0 = &_vm->game.hires[(x + y * _WIDTH + m * (c->width - 1)) * X_FACT]; - end = game.hires + _WIDTH * X_FACT * _HEIGHT; + end = _vm->game.hires + _WIDTH * X_FACT * _HEIGHT; for (i = 0; i < c->height; i++) { h = h0; @@ -170,7 +168,7 @@ int SpritesMan::blit_hires_cel(int x, int y, int spr, view_cel *c) { return hidden; } -int SpritesMan::blit_cel(int x, int y, int spr, view_cel *c) { +int SpritesMgr::blit_cel(int x, int y, int spr, view_cel *c) { uint8 *p0, *p, *q = NULL, *end; int i, j, t, m, col; int hidden = true; @@ -185,16 +183,16 @@ int SpritesMan::blit_cel(int x, int y, int spr, view_cel *c) { if (x >= _WIDTH) x = _WIDTH - 1; - if (opt.hires) + if (_vm->opt.hires) blit_hires_cel(x, y, spr, c); q = c->data; t = c->transparency; m = c->mirror; spr <<= 4; - p0 = &game.sbuf[x + y * _WIDTH + m * (c->width - 1)]; + p0 = &_vm->game.sbuf[x + y * _WIDTH + m * (c->width - 1)]; - end = game.sbuf + _WIDTH * _HEIGHT; + end = _vm->game.sbuf + _WIDTH * _HEIGHT; for (i = 0; i < c->height; i++) { p = p0; @@ -214,7 +212,7 @@ int SpritesMan::blit_cel(int x, int y, int spr, view_cel *c) { return hidden; } -void SpritesMan::objs_savearea(sprite *s) { +void SpritesMgr::objs_savearea(sprite *s) { int y; int16 x_pos = s->x_pos, y_pos = s->y_pos; int16 x_size = s->x_size, y_size = s->y_size; @@ -240,9 +238,9 @@ void SpritesMan::objs_savearea(sprite *s) { if (x_size <= 0 || y_size <= 0) return; - p0 = &game.sbuf[x_pos + y_pos * _WIDTH]; + p0 = &_vm->game.sbuf[x_pos + y_pos * _WIDTH]; q = s->buffer; - h0 = &game.hires[(x_pos + y_pos * _WIDTH) * 2]; + h0 = &_vm->game.hires[(x_pos + y_pos * _WIDTH) * 2]; k = s->hires; for (y = 0; y < y_size; y++) { memcpy(q, p0, x_size); @@ -254,7 +252,7 @@ void SpritesMan::objs_savearea(sprite *s) { } } -void SpritesMan::objs_restorearea(sprite *s) { +void SpritesMgr::objs_restorearea(sprite *s) { int y, offset; int16 x_pos = s->x_pos, y_pos = s->y_pos; int16 x_size = s->x_size, y_size = s->y_size; @@ -280,19 +278,19 @@ void SpritesMan::objs_restorearea(sprite *s) { if (x_size <= 0 || y_size <= 0) return; - p0 = &game.sbuf[x_pos + y_pos * _WIDTH]; + p0 = &_vm->game.sbuf[x_pos + y_pos * _WIDTH]; q = s->buffer; - h0 = &game.hires[(x_pos + y_pos * _WIDTH) * 2]; + h0 = &_vm->game.hires[(x_pos + y_pos * _WIDTH) * 2]; k = s->hires; - offset = game.line_min_print * CHAR_LINES; + offset = _vm->game.line_min_print * CHAR_LINES; for (y = 0; y < y_size; y++) { memcpy(p0, q, x_size); - put_pixels_a(x_pos, y_pos + y + offset, x_size, p0); + _gfx->putPixelsA(x_pos, y_pos + y + offset, x_size, p0); q += x_size; p0 += _WIDTH; memcpy(h0, k, x_size * 2); - if (opt.hires) { - put_pixels_hires(x_pos * 2, y_pos + y + offset, x_size * 2, h0); + if (_vm->opt.hires) { + _gfx->putPixelsHires(x_pos * 2, y_pos + y + offset, x_size * 2, h0); } k += x_size * 2; h0 += _WIDTH * 2; @@ -303,9 +301,9 @@ void SpritesMan::objs_restorearea(sprite *s) { /** * Condition to determine whether a sprite will be in the 'updating' list. */ -static bool test_updating(vt_entry *v) { +bool SpritesMgr::test_updating(vt_entry *v, AgiEngine *agi) { /* Sanity check (see bug #779302) */ - if (~game.dir_view[v->current_view].flags & RES_LOADED) + if (~agi->game.dir_view[v->current_view].flags & RES_LOADED) return false; return (v->flags & (ANIMATED | UPDATE | DRAWN)) == (ANIMATED | UPDATE | DRAWN); @@ -314,9 +312,9 @@ static bool test_updating(vt_entry *v) { /** * Condition to determine whether a sprite will be in the 'non-updating' list. */ -static bool test_not_updating(vt_entry *v) { +bool SpritesMgr::test_not_updating(vt_entry *v, AgiEngine *agi) { /* Sanity check (see bug #779302) */ - if (~game.dir_view[v->current_view].flags & RES_LOADED) + if (~agi->game.dir_view[v->current_view].flags & RES_LOADED) return false; return (v->flags & (ANIMATED | UPDATE | DRAWN)) == (ANIMATED | DRAWN); @@ -325,14 +323,14 @@ static bool test_not_updating(vt_entry *v) { /** * Convert sprite priority to y value. */ -INLINE int SpritesMan::prio_to_y(int p) { +INLINE int SpritesMgr::prio_to_y(int p) { int i; if (p == 0) return -1; for (i = 167; i >= 0; i--) { - if (game.pri_table[i] < p) + if (_vm->game.pri_table[i] < p) return i; } @@ -342,7 +340,7 @@ INLINE int SpritesMan::prio_to_y(int p) { /** * Create and initialize a new sprite structure. */ -sprite *SpritesMan::new_sprite(vt_entry *v) { +sprite *SpritesMgr::new_sprite(vt_entry *v) { sprite *s; s = (sprite *)pool_alloc(sizeof(sprite)); if (s == NULL) @@ -363,7 +361,7 @@ sprite *SpritesMan::new_sprite(vt_entry *v) { /** * Insert sprite in the specified sprite list. */ -void SpritesMan::spr_addlist(SpriteList& l, vt_entry *v) { +void SpritesMgr::spr_addlist(SpriteList& l, vt_entry *v) { sprite *s = new_sprite(v); l.push_back(s); } @@ -371,7 +369,7 @@ void SpritesMan::spr_addlist(SpriteList& l, vt_entry *v) { /** * Sort sprites from lower y values to build a sprite list. */ -void SpritesMan::build_list(SpriteList& l, bool (*test) (vt_entry *)) { +void SpritesMgr::build_list(SpriteList& l, bool (*test) (vt_entry *, AgiEngine *)) { int i, j, k; vt_entry *v; vt_entry *entry[0x100]; @@ -382,8 +380,8 @@ void SpritesMan::build_list(SpriteList& l, bool (*test) (vt_entry *)) { * condition and their y values */ i = 0; - for (v = game.view_table; v < &game.view_table[MAX_VIEWTABLE]; v++) { - if ((*test)(v)) { + for (v = _vm->game.view_table; v < &_vm->game.view_table[MAX_VIEWTABLE]; v++) { + if ((*test)(v, _vm)) { entry[i] = v; y_val[i] = v->flags & FIXED_PRIORITY ? prio_to_y(v->priority) : v->y_pos; i++; @@ -410,21 +408,21 @@ void SpritesMan::build_list(SpriteList& l, bool (*test) (vt_entry *)) { /** * Build list of updating sprites. */ -void SpritesMan::build_upd_blitlist() { +void SpritesMgr::build_upd_blitlist() { build_list(spr_upd, test_updating); } /** * Build list of non-updating sprites. */ -void SpritesMan::build_nonupd_blitlist() { +void SpritesMgr::build_nonupd_blitlist() { build_list(spr_nonupd, test_not_updating); } /** * Clear the given sprite list. */ -void SpritesMan::free_list(SpriteList& l) { +void SpritesMgr::free_list(SpriteList& l) { SpriteList::iterator iter; for (iter = l.reverse_begin(); iter != l.end(); ) { sprite* s = *iter; @@ -439,7 +437,7 @@ void SpritesMan::free_list(SpriteList& l) { * Copy sprites from the pic buffer to the screen buffer, and check if * sprites of the given list have moved. */ -void SpritesMan::commit_sprites(SpriteList& l) { +void SpritesMgr::commit_sprites(SpriteList& l) { SpriteList::iterator iter; for (iter = l.begin(); iter != l.end(); ++iter) { sprite *s = *iter; @@ -489,7 +487,7 @@ void SpritesMan::commit_sprites(SpriteList& l) { /** * Erase all sprites in the given list. */ -void SpritesMan::erase_sprites(SpriteList& l) { +void SpritesMgr::erase_sprites(SpriteList& l) { SpriteList::iterator iter; for (iter = l.reverse_begin(); iter != l.end(); --iter) { sprite *s = *iter; @@ -502,7 +500,7 @@ void SpritesMan::erase_sprites(SpriteList& l) { /** * Blit all sprites in the given list. */ -void SpritesMan::blit_sprites(SpriteList& l) { +void SpritesMgr::blit_sprites(SpriteList& l) { int hidden; SpriteList::iterator iter; for (iter = l.begin(); iter != l.end(); ++iter) { @@ -511,7 +509,7 @@ void SpritesMan::blit_sprites(SpriteList& l) { debugC(8, kDebugLevelSprites, "s->v->entry = %d (prio %d)", s->v->entry, s->v->priority); hidden = blit_cel(s->x_pos, s->y_pos, s->v->priority, s->v->cel_data); if (s->v->entry == 0) { /* if ego, update f1 */ - setflag(F_ego_invisible, hidden); + _vm->setflag(F_ego_invisible, hidden); } } } @@ -520,16 +518,16 @@ void SpritesMan::blit_sprites(SpriteList& l) { * Public functions */ -void SpritesMan::commit_upd_sprites() { +void SpritesMgr::commit_upd_sprites() { commit_sprites(spr_upd); } -void SpritesMan::commit_nonupd_sprites() { +void SpritesMgr::commit_nonupd_sprites() { commit_sprites(spr_nonupd); } /* check moves in both lists */ -void SpritesMan::commit_both() { +void SpritesMgr::commit_both() { commit_upd_sprites(); commit_nonupd_sprites(); } @@ -543,7 +541,7 @@ void SpritesMan::commit_both() { * @see erase_nonupd_sprites() * @see erase_both() */ -void SpritesMan::erase_upd_sprites() { +void SpritesMgr::erase_upd_sprites() { erase_sprites(spr_upd); } @@ -556,7 +554,7 @@ void SpritesMan::erase_upd_sprites() { * @see erase_upd_sprites() * @see erase_both() */ -void SpritesMan::erase_nonupd_sprites() { +void SpritesMgr::erase_nonupd_sprites() { erase_sprites(spr_nonupd); } @@ -569,7 +567,7 @@ void SpritesMan::erase_nonupd_sprites() { * @see erase_upd_sprites() * @see erase_nonupd_sprites() */ -void SpritesMan::erase_both() { +void SpritesMgr::erase_both() { erase_upd_sprites(); erase_nonupd_sprites(); } @@ -582,7 +580,7 @@ void SpritesMan::erase_both() { * @see blit_nonupd_sprites() * @see blit_both() */ -void SpritesMan::blit_upd_sprites() { +void SpritesMgr::blit_upd_sprites() { debugC(7, kDebugLevelSprites, "blit updating"); build_upd_blitlist(); blit_sprites(spr_upd); @@ -596,7 +594,7 @@ void SpritesMan::blit_upd_sprites() { * @see blit_upd_sprites() * @see blit_both() */ -void SpritesMan::blit_nonupd_sprites() { +void SpritesMgr::blit_nonupd_sprites() { debugC(7, kDebugLevelSprites, "blit non-updating"); build_nonupd_blitlist(); blit_sprites(spr_nonupd); @@ -610,7 +608,7 @@ void SpritesMan::blit_nonupd_sprites() { * @see blit_upd_sprites() * @see blit_nonupd_sprites() */ -void SpritesMan::blit_both() { +void SpritesMgr::blit_both() { blit_nonupd_sprites(); blit_upd_sprites(); } @@ -628,23 +626,23 @@ void SpritesMan::blit_both() { * @param pri priority to use * @param mar if < 4, create a margin around the the base of the cel */ -void SpritesMan::add_to_pic(int view, int loop, int cel, int x, int y, int pri, int mar) { +void SpritesMgr::add_to_pic(int view, int loop, int cel, int x, int y, int pri, int mar) { view_cel *c = NULL; int x1, y1, x2, y2, y3; uint8 *p1, *p2; debugC(3, kDebugLevelSprites, "v=%d, l=%d, c=%d, x=%d, y=%d, p=%d, m=%d", view, loop, cel, x, y, pri, mar); - record_image_stack_call(ADD_VIEW, view, loop, cel, x, y, pri, mar); + _vm->record_image_stack_call(ADD_VIEW, view, loop, cel, x, y, pri, mar); /* * Was hardcoded to 8, changed to pri_table[y] to fix Gold * Rush (see bug #587558) */ if (pri == 0) - pri = game.pri_table[y]; + pri = _vm->game.pri_table[y]; - c = &game.views[view].loop[loop].cel[cel]; + c = &_vm->game.views[view].loop[loop].cel[cel]; x1 = x; y1 = y - c->height + 1; @@ -685,8 +683,8 @@ void SpritesMan::add_to_pic(int view, int loop, int cel, int x, int y, int pri, // don't let box extend below y. if (y3 > y2) y3 = y2; - p1 = &game.sbuf[x1 + y3 * _WIDTH]; - p2 = &game.sbuf[x2 + y3 * _WIDTH]; + p1 = &_vm->game.sbuf[x1 + y3 * _WIDTH]; + p2 = &_vm->game.sbuf[x2 + y3 * _WIDTH]; for (y = y3; y <= y2; y++) { if ((*p1 >> 4) >= 4) @@ -698,8 +696,8 @@ void SpritesMan::add_to_pic(int view, int loop, int cel, int x, int y, int pri, } debugC(4, kDebugLevelSprites, "pri box: %d %d %d %d (%d)", x1, y3, x2, y2, mar); - p1 = &game.sbuf[x1 + y3 * _WIDTH]; - p2 = &game.sbuf[x1 + y2 * _WIDTH]; + p1 = &_vm->game.sbuf[x1 + y3 * _WIDTH]; + p2 = &_vm->game.sbuf[x1 + y2 * _WIDTH]; for (x = x1; x <= x2; x++) { if ((*p1 >> 4) >= 4) *p1 = (mar << 4) | (*p1 & 0x0f); @@ -722,13 +720,13 @@ void SpritesMan::add_to_pic(int view, int loop, int cel, int x, int y, int pri, * a message box with the object description. * @param n Number of the object to show */ -void SpritesMan::show_obj(int n) { +void SpritesMgr::show_obj(int n) { view_cel *c; sprite s; int x1, y1, x2, y2; - agi_load_resource(rVIEW, n); - if (!(c = &game.views[n].loop[0].cel[0])) + _vm->agiLoadResource(rVIEW, n); + if (!(c = &_vm->game.views[n].loop[0].cel[0])) return; x1 = (_WIDTH - c->width) / 2; @@ -746,7 +744,7 @@ void SpritesMan::show_obj(int n) { objs_savearea(&s); blit_cel(x1, y1, s.x_size, c); commit_block(x1, y1, x2, y2); - _text->message_box(game.views[n].descr); + _vm->message_box(_vm->game.views[n].descr); objs_restorearea(&s); commit_block(x1, y1, x2, y2); @@ -756,12 +754,12 @@ void SpritesMan::show_obj(int n) { free(s.hires); } -void SpritesMan::commit_block(int x1, int y1, int x2, int y2) { +void SpritesMgr::commit_block(int x1, int y1, int x2, int y2) { int i, w, offset; uint8 *q; uint8 *h; - if (!game.picture_shown) + if (!_vm->game.picture_shown) return; /* Clipping */ @@ -785,32 +783,30 @@ void SpritesMan::commit_block(int x1, int y1, int x2, int y2) { debugC(7, kDebugLevelSprites, "%d, %d, %d, %d", x1, y1, x2, y2); w = x2 - x1 + 1; - q = &game.sbuf[x1 + _WIDTH * y1]; - h = &game.hires[(x1 + _WIDTH * y1) * 2]; - offset = game.line_min_print * CHAR_LINES; + q = &_vm->game.sbuf[x1 + _WIDTH * y1]; + h = &_vm->game.hires[(x1 + _WIDTH * y1) * 2]; + offset = _vm->game.line_min_print * CHAR_LINES; for (i = y1; i <= y2; i++) { - put_pixels_a(x1, i + offset, w, q); + _gfx->putPixelsA(x1, i + offset, w, q); q += _WIDTH; - if (opt.hires) { - put_pixels_hires(x1 * 2, i + offset, w * 2, h); + if (_vm->opt.hires) { + _gfx->putPixelsHires(x1 * 2, i + offset, w * 2, h); } h += _WIDTH * 2; } - flush_block_a(x1, y1 + offset, x2, y2 + offset); + _gfx->flushBlockA(x1, y1 + offset, x2, y2 + offset); } -SpritesMan::SpritesMan() { -// if ((sprite_pool = (uint8 *)malloc(POOL_SIZE)) == NULL) -// return err_NotEnoughMemory; +SpritesMgr::SpritesMgr(AgiEngine *agi, GfxMgr *gfx) { + _vm = agi; + _gfx = gfx; sprite_pool = (uint8 *)malloc(POOL_SIZE); pool_top = sprite_pool; - -// return err_OK; } -SpritesMan::~SpritesMan() { +SpritesMgr::~SpritesMgr() { free(sprite_pool); } |