aboutsummaryrefslogtreecommitdiff
path: root/engines/agi/sprite.cpp
diff options
context:
space:
mode:
authorPaweł Kołodziejski2006-12-06 19:27:02 +0000
committerPaweł Kołodziejski2006-12-06 19:27:02 +0000
commit1d3ca2e40908ababd16fe8b1c9070198f9b75c82 (patch)
tree3c38e45040b1bbd97694b6eaf0ea4dec6f460753 /engines/agi/sprite.cpp
parent1a85adfa833e78d4460e89ff5db1c6bc8688b048 (diff)
downloadscummvm-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.cpp148
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);
}