diff options
| author | Filippos Karapetis | 2009-10-06 19:57:55 +0000 | 
|---|---|---|
| committer | Filippos Karapetis | 2009-10-06 19:57:55 +0000 | 
| commit | 6d135e904f33c5f473294dfa389a496abcd8dd8a (patch) | |
| tree | 1aa957e2de9de6b846a69a07992b8be827239e2e | |
| parent | 7601f1b14fadb108f99557ca5c90a481a7efe0e0 (diff) | |
| download | scummvm-rg350-6d135e904f33c5f473294dfa389a496abcd8dd8a.tar.gz scummvm-rg350-6d135e904f33c5f473294dfa389a496abcd8dd8a.tar.bz2 scummvm-rg350-6d135e904f33c5f473294dfa389a496abcd8dd8a.zip | |
WIP code for replacing the FreeSCI view decoding code with the new one (no changes to the logic, yet)
svn-id: r44717
| -rw-r--r-- | engines/sci/gfx/gfx_resmgr.cpp | 60 | ||||
| -rw-r--r-- | engines/sci/gfx/gfx_resmgr.h | 5 | ||||
| -rw-r--r-- | engines/sci/gfx/operations.cpp | 4 | ||||
| -rw-r--r-- | engines/sci/gfx/operations.h | 2 | ||||
| -rw-r--r-- | engines/sci/gui/gui.cpp | 20 | ||||
| -rw-r--r-- | engines/sci/gui/gui.h | 4 | ||||
| -rw-r--r-- | engines/sci/gui/gui_palette.cpp | 6 | ||||
| -rw-r--r-- | engines/sci/gui/gui_palette.h | 3 | ||||
| -rw-r--r-- | engines/sci/gui/gui_screen.cpp | 2 | ||||
| -rw-r--r-- | engines/sci/gui/gui_screen.h | 2 | ||||
| -rw-r--r-- | engines/sci/gui/gui_view.h | 1 | ||||
| -rw-r--r-- | engines/sci/gui32/gui32.cpp | 2 | ||||
| -rw-r--r-- | engines/sci/gui32/gui32.h | 2 | ||||
| -rw-r--r-- | engines/sci/sci.cpp | 9 | 
14 files changed, 93 insertions, 29 deletions
| diff --git a/engines/sci/gfx/gfx_resmgr.cpp b/engines/sci/gfx/gfx_resmgr.cpp index ad1172fefc..7b69c5995c 100644 --- a/engines/sci/gfx/gfx_resmgr.cpp +++ b/engines/sci/gfx/gfx_resmgr.cpp @@ -32,7 +32,9 @@  #include "sci/sci.h"  #include "sci/gfx/gfx_resource.h"  #include "sci/gfx/gfx_tools.h" +#include "sci/gui/gui_palette.h"  #include "sci/gui/gui_screen.h" +#include "sci/gui/gui_view.h"  #include "sci/gfx/gfx_driver.h"  #include "sci/gfx/gfx_resmgr.h"  #include "sci/gfx/gfx_state_internal.h" @@ -50,8 +52,8 @@ struct param_struct {  	GfxDriver *driver;  }; -GfxResManager::GfxResManager(gfx_options_t *options, GfxDriver *driver, ResourceManager *resMan) : -				_options(options), _driver(driver), _resMan(resMan), +GfxResManager::GfxResManager(gfx_options_t *options, GfxDriver *driver, ResourceManager *resMan, SciGuiScreen *screen, SciGuiPalette *palette) : +				_options(options), _driver(driver), _resMan(resMan), _screen(screen), _palette(palette),  				_lockCounter(0), _tagLockCounter(0), _staticPalette(0) {  	gfxr_init_static_palette(); @@ -495,6 +497,58 @@ gfxr_pic_t *GfxResManager::addToPic(int old_nr, int new_nr, int flags, int old_d  }  gfxr_view_t *GfxResManager::getView(int nr, int *loop, int *cel, int palette) { + +	// Wrapper code for the new view decoder - still WIP +#if 0 + +	IntResMap &resMap = _resourceMaps[GFX_RESOURCE_TYPE_VIEW]; +	gfx_resource_t *res = NULL; +	gfxr_view_t *result = (gfxr_view_t *)malloc(sizeof(gfxr_view_t)); + +	result->ID = nr; +	result->flags = 0; + +	SciGuiView *view = new SciGuiView(_resMan, _screen, _palette, nr); + +	result->loops_nr = view->getLoopCount(); +	result->palette = NULL; +	result->loops = (gfxr_loop_t*)malloc(sizeof(gfxr_loop_t) * ((result->loops_nr) ? result->loops_nr : 1)); /* Alloc 1 if no loop */ + +	if (*loop >= result->loops_nr) +		*loop = result->loops_nr - 1; + +	for (int i = 0; i < result->loops_nr; i++) { +		result->loops[i].cels_nr = view->getLoopInfo(i)->celCount; +		result->loops[i].cels = (gfx_pixmap_t**)calloc(result->loops[i].cels_nr, sizeof(gfx_pixmap_t *)); + +		if (*cel >= result->loops[i].cels_nr) +			*cel = result->loops[i].cels_nr - 1; + +		for (int j = 0; j < result->loops[i].cels_nr; j++) { +			sciViewCelInfo *celInfo = view->getCelInfo(i, j); +			result->loops[i].cels[j] = gfx_pixmap_alloc_index_data(gfx_new_pixmap(celInfo->width, celInfo->height, nr, i, j)); +			gfx_pixmap_t *curCel = result->loops[i].cels[j]; +			curCel->alpha_map = 0;	// TODO +			curCel->color_key = celInfo->clearKey; +			curCel->index_data = view->getBitmap(i, j); +			curCel->data = curCel->index_data; +			curCel->flags = 0; +			curCel->width = celInfo->width; +			curCel->height = celInfo->height; +			curCel->index_width = celInfo->width; +			curCel->index_height = celInfo->height; +			curCel->palette = 0;	// TODO +			curCel->palette_revision = 0; +			curCel->xoffset = celInfo->displaceX; +			curCel->yoffset = celInfo->displaceY; +		} +	} + +	return result; + +#else + +	// Existing code  	IntResMap &resMap = _resourceMaps[GFX_RESOURCE_TYPE_VIEW];  	gfx_resource_t *res = NULL;  	int hash = palette; @@ -585,6 +639,8 @@ gfxr_view_t *GfxResManager::getView(int nr, int *loop, int *cel, int palette) {  	}  	return view; + +#endif  }  gfx_bitmap_font_t *GfxResManager::getFont(int num, bool scaled) { diff --git a/engines/sci/gfx/gfx_resmgr.h b/engines/sci/gfx/gfx_resmgr.h index 03f9ecc69b..851ba642b5 100644 --- a/engines/sci/gfx/gfx_resmgr.h +++ b/engines/sci/gfx/gfx_resmgr.h @@ -31,6 +31,7 @@  // or something like that.  #include "sci/gfx/gfx_resource.h" +#include "sci/gui/gui_palette.h"  #include "sci/resource.h"  #include "common/hashmap.h" @@ -90,7 +91,7 @@ typedef Common::HashMap<int, gfx_resource_t *> IntResMap;  /** Graphics resource manager */  class GfxResManager {  public: -	GfxResManager(gfx_options_t *options, GfxDriver *driver, ResourceManager *resMan); +	GfxResManager(gfx_options_t *options, GfxDriver *driver, ResourceManager *resMan, SciGuiScreen *screen, SciGuiPalette *palette);  	~GfxResManager();  	/** @@ -303,6 +304,8 @@ private:  	IntResMap _resourceMaps[GFX_RESOURCE_TYPES_NR];  	ResourceManager *_resMan; +	SciGuiScreen *_screen; +	SciGuiPalette *_palette;  };  } // End of namespace Sci diff --git a/engines/sci/gfx/operations.cpp b/engines/sci/gfx/operations.cpp index 8e6db7895a..67fa522be5 100644 --- a/engines/sci/gfx/operations.cpp +++ b/engines/sci/gfx/operations.cpp @@ -386,7 +386,7 @@ static void init_aux_pixmap(gfx_pixmap_t **pixmap) {  void gfxop_init(GfxState *state,  				gfx_options_t *options, ResourceManager *resMan, -				SciGuiScreen *screen, int scaleFactor) { +				SciGuiScreen *screen, SciGuiPalette *palette, int scaleFactor) {  	state->options = options;  	state->visible_map = GFX_MASK_VISUAL;  	state->fullscreen_override = NULL; // No magical override @@ -401,7 +401,7 @@ void gfxop_init(GfxState *state,  	state->driver = new GfxDriver(screen, scaleFactor); -	state->gfxResMan = new GfxResManager(state->options, state->driver, resMan); +	state->gfxResMan = new GfxResManager(state->options, state->driver, resMan, screen, palette);  	gfxop_set_clip_zone(state, gfx_rect(0, 0, 320, 200));  	state->pointerZone = Common::Rect(0, 0, 320, 200); diff --git a/engines/sci/gfx/operations.h b/engines/sci/gfx/operations.h index 84dace4394..15f0aeec17 100644 --- a/engines/sci/gfx/operations.h +++ b/engines/sci/gfx/operations.h @@ -143,7 +143,7 @@ struct GfxState {   */  void gfxop_init(GfxState *state,   		gfx_options_t *options, ResourceManager *resMan, -		SciGuiScreen *screen, int scaleFactor = 1); +		SciGuiScreen *screen, SciGuiPalette *palette, int scaleFactor = 1);  /**   * Deinitializes a currently active driver. diff --git a/engines/sci/gui/gui.cpp b/engines/sci/gui/gui.cpp index 898de3d0a3..31ff341aa6 100644 --- a/engines/sci/gui/gui.cpp +++ b/engines/sci/gui/gui.cpp @@ -41,11 +41,9 @@  namespace Sci { -SciGui::SciGui(OSystem *system, EngineState *state, SciGuiScreen *screen) -	: _system(system), _s(state), _screen(screen) { -	_picNotValid = 0; +SciGui::SciGui(OSystem *system, EngineState *state, SciGuiScreen *screen, SciGuiPalette *palette) +	: _system(system), _s(state), _screen(screen), _palette(palette) { -	_palette = new SciGuiPalette(_s, this, _screen);  	_gfx = new SciGuiGfx(_s, _screen, _palette);  	_windowMgr = new SciGuiWindowMgr(_s, _gfx);  } @@ -266,7 +264,7 @@ void SciGui::drawPicture(GuiResourceId pictureId, uint16 style, uint16 flags, in  	_screen->copyToScreen();  	_gfx->SetPort(oldPort); -	_picNotValid = true; +	_screen->_picNotValid = true;  }  void SciGui::drawCel(GuiResourceId viewId, GuiViewLoopNo loopNo, GuiViewCelNo celNo, uint16 leftPos, uint16 topPos, int16 priority, uint16 paletteNo) { @@ -379,13 +377,13 @@ int16 SciGui::onControl(byte screenMask, Common::Rect rect) {  }  void SciGui::animate(reg_t listReference, bool cycle, int argc, reg_t *argv) { -	bool old_picNotValid = _picNotValid; +	bool old_picNotValid = _screen->_picNotValid;  	if (listReference.isNull()) {  		_gfx->AnimateDisposeLastCast(); -		if (_picNotValid) { +		if (_screen->_picNotValid) {  			//(this->*ShowPic)(_showMap, _showStyle); -			_picNotValid = 0; +			_screen->_picNotValid = false;  		}  		return;  	} @@ -409,9 +407,9 @@ void SciGui::animate(reg_t listReference, bool cycle, int argc, reg_t *argv) {  	_gfx->AnimateDrawCels(); -	if (_picNotValid) { +	if (_screen->_picNotValid) {  		//(this->*ShowPic)(_showMap, _showStyle); -		_picNotValid = 0; +		_screen->_picNotValid = false;  	}  	//_gfx->AnimateUpdateScreen(); @@ -449,7 +447,7 @@ void SciGui::addToPicList(reg_t listReference, int argc, reg_t *argv) {  //	}  //	animSort(arrObj, arrY, szList); -	_picNotValid = 2; +	_screen->_picNotValid = 2;	// FIXME: _picNotValid is a boolean!  	delete sortedList;  } diff --git a/engines/sci/gui/gui.h b/engines/sci/gui/gui.h index cbd1f315ef..e84b199d16 100644 --- a/engines/sci/gui/gui.h +++ b/engines/sci/gui/gui.h @@ -37,7 +37,7 @@ class SciGuiresources;  class SciGuiWindowMgr;  class SciGui {  public: -	SciGui(OSystem *system, EngineState *s, SciGuiScreen *screen); +	SciGui(OSystem *system, EngineState *s, SciGuiScreen *screen, SciGuiPalette *palette);  	SciGui();  	virtual ~SciGui(); @@ -89,7 +89,7 @@ public:  	virtual void moveCursor(int16 x, int16 y, int16 scaleFactor = 1);  	void moveCursor(Common::Point p, int16 scaleFactor = 1) { moveCursor(p.x, p.y, scaleFactor); } -	int _picNotValid; // possible values 0, 1 and 2 +	SciGuiPalette *getPalette() { return _palette; }  private:  	OSystem *_system; diff --git a/engines/sci/gui/gui_palette.cpp b/engines/sci/gui/gui_palette.cpp index 953ed93121..b9f75e464a 100644 --- a/engines/sci/gui/gui_palette.cpp +++ b/engines/sci/gui/gui_palette.cpp @@ -34,8 +34,8 @@  namespace Sci { -SciGuiPalette::SciGuiPalette(EngineState *state, SciGui *gui, SciGuiScreen *screen) -	: _s(state), _gui(gui), _screen(screen) { +SciGuiPalette::SciGuiPalette(EngineState *state, SciGuiScreen *screen) +	: _s(state), _screen(screen) {  	init();  } @@ -186,7 +186,7 @@ void SciGuiPalette::set(GuiPalette *sciPal, int16 flag) {  	if (flag == 2 || sciPal->timestamp != systime) {  		merge(sciPal, &_sysPalette, flag);  		sciPal->timestamp = _sysPalette.timestamp; -		if (_gui->_picNotValid == 0 && systime != _sysPalette.timestamp) +		if (_screen->_picNotValid == 0 && systime != _sysPalette.timestamp)  			setOnScreen();  	}  } diff --git a/engines/sci/gui/gui_palette.h b/engines/sci/gui/gui_palette.h index 4283466eaf..b3fa839076 100644 --- a/engines/sci/gui/gui_palette.h +++ b/engines/sci/gui/gui_palette.h @@ -33,7 +33,7 @@ namespace Sci {  class SciGuiScreen;  class SciGuiPalette {  public: -	SciGuiPalette(EngineState *state, SciGui *gui, SciGuiScreen *screen); +	SciGuiPalette(EngineState *state, SciGuiScreen *screen);  	~SciGuiPalette();  	void init(); @@ -56,7 +56,6 @@ public:  private:  	EngineState *_s; -	SciGui *_gui;  	SciGuiScreen *_screen;  	uint16 _clrPowers[256]; diff --git a/engines/sci/gui/gui_screen.cpp b/engines/sci/gui/gui_screen.cpp index 7786dc7282..f493eb050d 100644 --- a/engines/sci/gui/gui_screen.cpp +++ b/engines/sci/gui/gui_screen.cpp @@ -55,6 +55,8 @@ SciGuiScreen::SciGuiScreen(OSystem *system, int16 width, int16 height, int16 sca  		_baseTable[i] = base; _baseDisplayTable[i] = base;  		base += _width;  	} + +	_picNotValid = false;  }  SciGuiScreen::~SciGuiScreen() { diff --git a/engines/sci/gui/gui_screen.h b/engines/sci/gui/gui_screen.h index 75913515e9..196e0e1cab 100644 --- a/engines/sci/gui/gui_screen.h +++ b/engines/sci/gui/gui_screen.h @@ -70,6 +70,8 @@ public:  	uint16 _displayHeight;  	uint _displayPixels; +	int _picNotValid; // possible values 0, 1 and 2 +  private:  	void restoreBitsScreen(Common::Rect rect, byte *&memoryPtr, byte *screen);  	void saveBitsScreen(Common::Rect rect, byte *screen, byte *&memoryPtr); diff --git a/engines/sci/gui/gui_view.h b/engines/sci/gui/gui_view.h index c356fbe579..289edb268a 100644 --- a/engines/sci/gui/gui_view.h +++ b/engines/sci/gui/gui_view.h @@ -58,6 +58,7 @@ public:  	void getCelRect(GuiViewLoopNo loopNo, GuiViewCelNo celNo, int16 x, int16 y, int16 z, Common::Rect *outRect);  	byte *getBitmap(GuiViewLoopNo loopNo, GuiViewCelNo celNo);  	void draw(Common::Rect rect, Common::Rect clipRect, Common::Rect clipRectTranslated, GuiViewLoopNo loopNo, GuiViewCelNo celNo, byte priority, uint16 paletteNo); +	uint16 getLoopCount() const { return _loopCount; }  private:  	void initData(GuiResourceId resourceId); diff --git a/engines/sci/gui32/gui32.cpp b/engines/sci/gui32/gui32.cpp index 6f86f8a309..9463d19c9a 100644 --- a/engines/sci/gui32/gui32.cpp +++ b/engines/sci/gui32/gui32.cpp @@ -64,7 +64,7 @@  namespace Sci { -SciGui32::SciGui32(OSystem *system, EngineState *state, SciGuiScreen *screen) +SciGui32::SciGui32(OSystem *system, EngineState *state, SciGuiScreen *screen, SciGuiPalette *palette)  	: _system(system), s(state) {  } diff --git a/engines/sci/gui32/gui32.h b/engines/sci/gui32/gui32.h index 8f6981dd88..16f48c7c54 100644 --- a/engines/sci/gui32/gui32.h +++ b/engines/sci/gui32/gui32.h @@ -32,7 +32,7 @@ namespace Sci {  class SciGui32 : public SciGui {  public: -	SciGui32(OSystem *system, EngineState *s, SciGuiScreen *screen); +	SciGui32(OSystem *system, EngineState *s, SciGuiScreen *screen, SciGuiPalette *palette);  	~SciGui32();  	// FIXME: Don't store EngineState diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index bd96f04978..800e72b051 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -37,6 +37,7 @@  #include "sci/gfx/gfx_state_internal.h"	// required for GfxContainer, GfxPort, GfxVisual  #include "sci/gui32/gui32.h" +#include "sci/gui/gui_palette.h"  #include "sci/gfx/gfx_resource.h"  #include "sci/gfx/gfx_tools.h" @@ -156,10 +157,11 @@ Common::Error SciEngine::run() {  	_gamestate->gfx_state = &gfx_state;  	SciGuiScreen *screen = new SciGuiScreen(_system); +	SciGuiPalette *palette = new SciGuiPalette(_gamestate, screen);  	// Gui change -	//_gamestate->gui = new SciGui(_system, _gamestate, screen);    // new -	_gamestate->gui = new SciGui32(_system, _gamestate, screen);  // old +	//_gamestate->gui = new SciGui(_system, _gamestate, screen, palette);    // new +	_gamestate->gui = new SciGui32(_system, _gamestate, screen, palette);  // old  	// Assign default values to the config manager, in case settings are missing  	ConfMan.registerDefault("dither_mode", "0"); @@ -180,7 +182,7 @@ Common::Error SciEngine::run() {  	// Default config ends  #endif -	gfxop_init(&gfx_state, &gfx_options, _resMan, screen, 1); +	gfxop_init(&gfx_state, &gfx_options, _resMan, screen, palette, 1);  	if (game_init_graphics(_gamestate)) { // Init interpreter graphics  		warning("Game initialization failed: Error in GFX subsystem. Aborting..."); @@ -202,6 +204,7 @@ Common::Error SciEngine::run() {  	script_free_engine(_gamestate); // Uninitialize game state  	script_free_breakpoints(_gamestate); +	delete palette;  	delete screen;  	delete _gamestate; | 
