Changed all remaining code to use the GfxObj class to keep frames data. This allows for more uniform processing during rendering, and also fixes the display of dialogue faces for BRA.

svn-id: r32833
This commit is contained in:
Nicola Mettifogo 2008-06-29 09:30:32 +00:00
parent 7a9e911896
commit d8645297cd
10 changed files with 93 additions and 83 deletions

View file

@ -51,8 +51,8 @@ class DialogueManager {
bool _askPassword;
bool isNpc;
Frames *_questioner;
Frames *_answerer;
GfxObj *_questioner;
GfxObj *_answerer;
Question *_q;

View file

@ -55,13 +55,13 @@ public:
virtual Script* loadLocation(const char *name) = 0;
virtual Script* loadScript(const char* name) = 0;
virtual Frames* loadTalk(const char *name) = 0;
virtual Frames* loadObjects(const char *name) = 0;
virtual GfxObj* loadTalk(const char *name) = 0;
virtual GfxObj* loadObjects(const char *name) = 0;
virtual Frames* loadPointer(const char *name) = 0;
virtual Frames* loadHead(const char* name) = 0;
virtual GfxObj* loadHead(const char* name) = 0;
virtual Font* loadFont(const char* name) = 0;
virtual Frames* loadStatic(const char* name) = 0;
virtual Frames* loadFrames(const char* name) = 0;
virtual GfxObj* loadStatic(const char* name) = 0;
virtual GfxObj* loadFrames(const char* name) = 0;
virtual void loadSlide(BackgroundInfo& info, const char *filename) = 0;
virtual void loadScenery(BackgroundInfo& info, const char* background, const char* mask, const char* path) = 0;
virtual Table* loadTable(const char* name) = 0;
@ -147,13 +147,13 @@ public:
Script* loadLocation(const char *name);
Script* loadScript(const char* name);
Frames* loadTalk(const char *name);
Frames* loadObjects(const char *name);
GfxObj* loadTalk(const char *name);
GfxObj* loadObjects(const char *name);
Frames* loadPointer(const char *name);
Frames* loadHead(const char* name);
GfxObj* loadHead(const char* name);
Font* loadFont(const char* name);
Frames* loadStatic(const char* name);
Frames* loadFrames(const char* name);
GfxObj* loadStatic(const char* name);
GfxObj* loadFrames(const char* name);
void loadSlide(BackgroundInfo& info, const char *filename);
void loadScenery(BackgroundInfo& info, const char* background, const char* mask, const char* path);
Table* loadTable(const char* name);
@ -181,13 +181,13 @@ public:
Script* loadLocation(const char *name);
Script* loadScript(const char* name);
Frames* loadTalk(const char *name);
Frames* loadObjects(const char *name);
GfxObj* loadTalk(const char *name);
GfxObj* loadObjects(const char *name);
Frames* loadPointer(const char *name);
Frames* loadHead(const char* name);
GfxObj* loadHead(const char* name);
Font* loadFont(const char* name);
Frames* loadStatic(const char* name);
Frames* loadFrames(const char* name);
GfxObj* loadStatic(const char* name);
GfxObj* loadFrames(const char* name);
void loadSlide(BackgroundInfo& info, const char *filename);
void loadScenery(BackgroundInfo& info, const char* background, const char* mask, const char* path);
Table* loadTable(const char* name);
@ -220,13 +220,13 @@ public:
void setLanguage(uint16 language);
Script* loadLocation(const char *name);
Script* loadScript(const char* name);
Frames* loadTalk(const char *name);
Frames* loadObjects(const char *name);
GfxObj* loadTalk(const char *name);
GfxObj* loadObjects(const char *name);
Frames* loadPointer(const char *name);
Frames* loadHead(const char* name);
GfxObj* loadHead(const char* name);
Font* loadFont(const char* name);
Frames* loadStatic(const char* name);
Frames* loadFrames(const char* name);
GfxObj* loadStatic(const char* name);
GfxObj* loadFrames(const char* name);
void loadSlide(BackgroundInfo& info, const char *filename);
void loadScenery(BackgroundInfo& info, const char* name, const char* mask, const char* path);
Table* loadTable(const char* name);
@ -248,10 +248,10 @@ public:
AmigaDisk_br(Parallaction *vm);
virtual ~AmigaDisk_br();
Frames* loadTalk(const char *name);
GfxObj* loadTalk(const char *name);
Font* loadFont(const char* name);
Frames* loadStatic(const char* name);
Frames* loadFrames(const char* name);
GfxObj* loadStatic(const char* name);
GfxObj* loadFrames(const char* name);
void loadSlide(BackgroundInfo& info, const char *filename);
void loadScenery(BackgroundInfo& info, const char* name, const char* mask, const char* path);
};

View file

@ -138,7 +138,7 @@ DosDisk_br::DosDisk_br(Parallaction* vm) : _vm(vm) {
DosDisk_br::~DosDisk_br() {
}
Frames* DosDisk_br::loadTalk(const char *name) {
GfxObj* DosDisk_br::loadTalk(const char *name) {
debugC(5, kDebugDisk, "DosDisk_br::loadTalk(%s)", name);
Common::File stream;
@ -151,7 +151,7 @@ Frames* DosDisk_br::loadTalk(const char *name) {
errorFileNotFound(path);
}
return createSprites(stream);
return new GfxObj(0, createSprites(stream), name);
}
Script* DosDisk_br::loadLocation(const char *name) {
@ -184,7 +184,7 @@ Script* DosDisk_br::loadScript(const char* name) {
}
// there are no Head resources in Big Red Adventure
Frames* DosDisk_br::loadHead(const char* name) {
GfxObj* DosDisk_br::loadHead(const char* name) {
debugC(5, kDebugDisk, "DosDisk_br::loadHead");
return 0;
}
@ -235,7 +235,7 @@ Font* DosDisk_br::loadFont(const char* name) {
}
Frames* DosDisk_br::loadObjects(const char *name) {
GfxObj* DosDisk_br::loadObjects(const char *name) {
debugC(5, kDebugDisk, "DosDisk_br::loadObjects");
return 0;
}
@ -244,7 +244,7 @@ void genSlidePath(char *path, const char* name) {
sprintf(path, "%s.bmp", name);
}
Frames* DosDisk_br::loadStatic(const char* name) {
GfxObj* DosDisk_br::loadStatic(const char* name) {
debugC(5, kDebugDisk, "DosDisk_br::loadStatic");
char path[PATH_LEN];
@ -256,7 +256,7 @@ Frames* DosDisk_br::loadStatic(const char* name) {
Graphics::Surface *surf = new Graphics::Surface;
loadBitmap(stream, *surf, 0);
return new SurfaceToFrames(surf);
return new GfxObj(0, new SurfaceToFrames(surf), name);
}
Sprites* DosDisk_br::createSprites(Common::ReadStream &stream) {
@ -280,7 +280,7 @@ Sprites* DosDisk_br::createSprites(Common::ReadStream &stream) {
return sprites;
}
Frames* DosDisk_br::loadFrames(const char* name) {
GfxObj* DosDisk_br::loadFrames(const char* name) {
debugC(5, kDebugDisk, "DosDisk_br::loadFrames");
char path[PATH_LEN];
@ -291,7 +291,7 @@ Frames* DosDisk_br::loadFrames(const char* name) {
errorFileNotFound(path);
return createSprites(stream);
return new GfxObj(0, createSprites(stream), name);
}
// Slides in Nippon Safes are basically screen-sized pictures with valid
@ -552,7 +552,7 @@ void AmigaDisk_br::loadSlide(BackgroundInfo& info, const char *name) {
return;
}
Frames* AmigaDisk_br::loadStatic(const char* name) {
GfxObj* AmigaDisk_br::loadStatic(const char* name) {
debugC(1, kDebugDisk, "AmigaDisk_br::loadStatic '%s'", name);
char path[PATH_LEN];
@ -570,7 +570,7 @@ Frames* AmigaDisk_br::loadStatic(const char* name) {
free(pal);
return new SurfaceToFrames(surf);
return new GfxObj(0, new SurfaceToFrames(surf));
}
Sprites* AmigaDisk_br::createSprites(const char *path) {
@ -600,22 +600,22 @@ Sprites* AmigaDisk_br::createSprites(const char *path) {
return sprites;
}
Frames* AmigaDisk_br::loadFrames(const char* name) {
GfxObj* AmigaDisk_br::loadFrames(const char* name) {
debugC(1, kDebugDisk, "AmigaDisk_br::loadFrames '%s'", name);
char path[PATH_LEN];
sprintf(path, "%s/anims/%s", _partPath, name);
return createSprites(path);
return new GfxObj(0, createSprites(path));
}
Frames* AmigaDisk_br::loadTalk(const char *name) {
GfxObj* AmigaDisk_br::loadTalk(const char *name) {
debugC(1, kDebugDisk, "AmigaDisk_br::loadTalk '%s'", name);
char path[PATH_LEN];
sprintf(path, "%s/talks/%s.tal", _partPath, name);
return createSprites(path);
return new GfxObj(0, createSprites(path));
}
Font* AmigaDisk_br::loadFont(const char* name) {

View file

@ -385,12 +385,12 @@ Cnv* DosDisk_ns::loadCnv(const char *filename) {
return new Cnv(numFrames, width, height, data);
}
Frames* DosDisk_ns::loadTalk(const char *name) {
GfxObj* DosDisk_ns::loadTalk(const char *name) {
const char *ext = strstr(name, ".talk");
if (ext != NULL) {
// npc talk
return loadCnv(name);
return new GfxObj(0, loadCnv(name), name);
}
@ -401,7 +401,7 @@ Frames* DosDisk_ns::loadTalk(const char *name) {
sprintf(v20, "%stal", name);
}
return loadExternalCnv(v20);
return new GfxObj(0, loadExternalCnv(v20), name);
}
Script* DosDisk_ns::loadLocation(const char *name) {
@ -434,14 +434,14 @@ Script* DosDisk_ns::loadScript(const char* name) {
return new Script(new DummyArchiveStream(_resArchive), true);
}
Frames* DosDisk_ns::loadHead(const char* name) {
GfxObj* DosDisk_ns::loadHead(const char* name) {
char path[PATH_LEN];
sprintf(path, "%shead", name);
path[8] = '\0';
return loadExternalStaticCnv(path);
return new GfxObj(0, loadExternalStaticCnv(path));
}
@ -457,15 +457,15 @@ Font* DosDisk_ns::loadFont(const char* name) {
}
Frames* DosDisk_ns::loadObjects(const char *name) {
GfxObj* DosDisk_ns::loadObjects(const char *name) {
char path[PATH_LEN];
sprintf(path, "%sobj", name);
return loadExternalCnv(path);
return new GfxObj(0, loadExternalCnv(path), name);
}
Frames* DosDisk_ns::loadStatic(const char* name) {
GfxObj* DosDisk_ns::loadStatic(const char* name) {
char path[PATH_LEN];
@ -487,11 +487,11 @@ Frames* DosDisk_ns::loadStatic(const char* name) {
Graphics::PackBitsReadStream decoder(_resArchive);
decoder.read(cnv->pixels, w*h);
return new SurfaceToFrames(cnv);
return new GfxObj(0, new SurfaceToFrames(cnv), name);
}
Frames* DosDisk_ns::loadFrames(const char* name) {
return loadCnv(name);
GfxObj* DosDisk_ns::loadFrames(const char* name) {
return new GfxObj(0, loadCnv(name), name);
}
//
@ -1025,7 +1025,7 @@ Frames* AmigaDisk_ns::loadPointer(const char* name) {
return makeStaticCnv(stream);
}
Frames* AmigaDisk_ns::loadStatic(const char* name) {
GfxObj* AmigaDisk_ns::loadStatic(const char* name) {
debugC(1, kDebugDisk, "AmigaDisk_ns::loadStatic '%s'", name);
Common::SeekableReadStream *s = openArchivedFile(name, true);
@ -1033,7 +1033,7 @@ Frames* AmigaDisk_ns::loadStatic(const char* name) {
delete s;
return cnv;
return new GfxObj(0, cnv, name);
}
Common::SeekableReadStream *AmigaDisk_ns::openArchivedFile(const char* name, bool errorOnFileNotFound) {
@ -1258,7 +1258,7 @@ void AmigaDisk_ns::loadSlide(BackgroundInfo& info, const char *name) {
return;
}
Frames* AmigaDisk_ns::loadFrames(const char* name) {
GfxObj* AmigaDisk_ns::loadFrames(const char* name) {
debugC(1, kDebugDisk, "AmigaDisk_ns::loadFrames '%s'", name);
Common::SeekableReadStream *s;
@ -1273,10 +1273,10 @@ Frames* AmigaDisk_ns::loadFrames(const char* name) {
Cnv *cnv = makeCnv(*s);
delete s;
return cnv;
return new GfxObj(0, cnv, name);
}
Frames* AmigaDisk_ns::loadHead(const char* name) {
GfxObj* AmigaDisk_ns::loadHead(const char* name) {
debugC(1, kDebugDisk, "AmigaDisk_ns::loadHead '%s'", name);
char path[PATH_LEN];
@ -1287,11 +1287,11 @@ Frames* AmigaDisk_ns::loadHead(const char* name) {
delete s;
return cnv;
return new GfxObj(0, cnv, name);
}
Frames* AmigaDisk_ns::loadObjects(const char *name) {
GfxObj* AmigaDisk_ns::loadObjects(const char *name) {
debugC(1, kDebugDisk, "AmigaDisk_ns::loadObjects");
char path[PATH_LEN];
@ -1305,11 +1305,11 @@ Frames* AmigaDisk_ns::loadObjects(const char *name) {
Cnv *cnv = makeCnv(*s);
delete s;
return cnv;
return new GfxObj(0, cnv, name);
}
Frames* AmigaDisk_ns::loadTalk(const char *name) {
GfxObj* AmigaDisk_ns::loadTalk(const char *name) {
debugC(1, kDebugDisk, "AmigaDisk_ns::loadTalk '%s'", name);
Common::SeekableReadStream *s;
@ -1328,7 +1328,7 @@ Frames* AmigaDisk_ns::loadTalk(const char *name) {
Cnv *cnv = makeCnv(*s);
delete s;
return cnv;
return new GfxObj(0, cnv, name);
}
Table* AmigaDisk_ns::loadTable(const char* name) {

View file

@ -86,27 +86,27 @@ void GfxObj::clearFlags(uint32 flags) {
}
GfxObj* Gfx::loadAnim(const char *name) {
Frames *frames = _disk->loadFrames(name);
GfxObj *obj = new GfxObj(kGfxObjTypeAnim, frames, name);
GfxObj *obj = _disk->loadFrames(name);
assert(obj);
obj->type = kGfxObjTypeAnim;
return obj;
}
GfxObj* Gfx::loadGet(const char *name) {
Frames *frames = _disk->loadStatic(name);
GfxObj *obj = new GfxObj(kGfxObjTypeGet, frames, name);
GfxObj *obj = _disk->loadStatic(name);
assert(obj);
obj->type = kGfxObjTypeGet;
return obj;
}
GfxObj* Gfx::loadDoor(const char *name) {
Frames *frames = _disk->loadFrames(name);
GfxObj *obj = new GfxObj(kGfxObjTypeDoor, frames, name);
GfxObj *obj = _disk->loadFrames(name);
assert(obj);
obj->type = kGfxObjTypeDoor;
return obj;
}

View file

@ -356,7 +356,17 @@ void Gfx::drawItems() {
Graphics::Surface *surf = g_system->lockScreen();
for (uint i = 0; i < _numItems; i++) {
blt(_items[i].rect, _items[i].data->getData(_items[i].frame), surf, LAYER_FOREGROUND, _items[i].transparentColor);
GfxObj *obj = _items[i].data;
Common::Rect rect;
obj->getRect(obj->frame, rect);
rect.translate(obj->x, obj->y);
if (obj->getSize(obj->frame) == obj->getRawSize(obj->frame)) {
blt(rect, obj->getData(obj->frame), surf, LAYER_FOREGROUND, _items[i].transparentColor);
} else {
unpackBlt(rect, obj->getData(obj->frame), obj->getRawSize(obj->frame), surf, LAYER_FOREGROUND, _items[i].transparentColor);
}
}
g_system->unlockScreen();
}
@ -949,7 +959,7 @@ Gfx::~Gfx() {
int Gfx::setItem(Frames* frames, uint16 x, uint16 y, byte transparentColor) {
int Gfx::setItem(GfxObj* frames, uint16 x, uint16 y, byte transparentColor) {
int id = _numItems;
_items[id].data = frames;
@ -965,9 +975,9 @@ int Gfx::setItem(Frames* frames, uint16 x, uint16 y, byte transparentColor) {
void Gfx::setItemFrame(uint item, uint16 f) {
assert(item < _numItems);
_items[item].frame = f;
_items[item].data->getRect(f, _items[item].rect);
_items[item].rect.moveTo(_items[item].x, _items[item].y);
_items[item].data->frame = f;
_items[item].data->x = _items[item].x;
_items[item].data->y = _items[item].y;
}
Gfx::Balloon* Gfx::getBalloon(uint id) {

View file

@ -157,11 +157,11 @@ struct SurfaceToMultiFrames : public Frames {
r.setHeight(_height);
}
uint getRawSize(uint16 index) {
assert(index == 0);
assert(index < _num);
return getSize(index);
}
uint getSize(uint16 index) {
assert(index == 0);
assert(index < _num);
return _width * _height;
}
@ -487,7 +487,7 @@ public:
void getStringExtent(Font *font, char *text, uint16 maxwidth, int16* width, int16* height);
// other items
int setItem(Frames* frames, uint16 x, uint16 y, byte transparentColor = 0);
int setItem(GfxObj* obj, uint16 x, uint16 y, byte transparentColor = 0);
void setItemFrame(uint item, uint16 f);
void hideDialogueStuff();
void freeBalloons();
@ -549,7 +549,7 @@ protected:
Graphics::Surface _bitmapMask;
int32 getRenderMode(const char *type);
protected:
public:
static int16 _dialogueBalloonX[5];
struct Balloon {
@ -567,7 +567,7 @@ protected:
uint16 x;
uint16 y;
uint16 frame;
Frames *data;
GfxObj *data;
byte transparentColor;
Common::Rect rect;

View file

@ -122,7 +122,7 @@ int Parallaction_br::guiShowMenu() {
// TODO: filter menu entries according to progress in game
#define NUM_MENULINES 7
Frames *_lines[NUM_MENULINES];
GfxObj *_lines[NUM_MENULINES];
const char *menuStrings[NUM_MENULINES] = {
"SEE INTRO",
@ -157,7 +157,7 @@ int Parallaction_br::guiShowMenu() {
int i;
for (i = 0; i < availItems; i++) {
_lines[i] = guiRenderMenuItem(menuStrings[i]);
_lines[i] = new GfxObj(0, guiRenderMenuItem(menuStrings[i]), "MenuItem");
uint id = _gfx->setItem(_lines[i], MENUITEMS_X, MENUITEMS_Y + MENUITEM_HEIGHT * i, 0xFF);
_gfx->setItemFrame(id, 0);
}

View file

@ -209,7 +209,7 @@ struct SpeakData { // size = 36
}
};
struct ExamineData { // size = 28
Frames *_cnv;
GfxObj *_cnv;
uint16 _opBase; // unused
uint16 field_12; // unused
char* _description;

View file

@ -202,9 +202,9 @@ struct Character {
AnimationPtr _ani;
Frames *_head;
Frames *_talk;
Frames *_objs;
GfxObj *_head;
GfxObj *_talk;
GfxObj *_objs;
PathBuilder _builder;
WalkNodeList *_walkPath;