diff options
author | Martin Kiewitz | 2010-07-26 19:25:56 +0000 |
---|---|---|
committer | Martin Kiewitz | 2010-07-26 19:25:56 +0000 |
commit | 57136cd86a66459a1ef5f2b6d02a7662714c7f3b (patch) | |
tree | e9c927d3b0bff002b43ff1263fa42ad321da3ae1 /engines | |
parent | 95c68f029181875bcfe58c8b26358c20a5d358c4 (diff) | |
download | scummvm-rg350-57136cd86a66459a1ef5f2b6d02a7662714c7f3b.tar.gz scummvm-rg350-57136cd86a66459a1ef5f2b6d02a7662714c7f3b.tar.bz2 scummvm-rg350-57136cd86a66459a1ef5f2b6d02a7662714c7f3b.zip |
SCI: implement scaling for kDrawCel
fixes qfg4 demo properly (bug #3034506, previous commit r51304)
svn-id: r51332
Diffstat (limited to 'engines')
-rw-r--r-- | engines/sci/engine/kernel_tables.h | 2 | ||||
-rw-r--r-- | engines/sci/engine/kgraphics.cpp | 22 | ||||
-rw-r--r-- | engines/sci/graphics/paint16.cpp | 4 | ||||
-rw-r--r-- | engines/sci/graphics/paint16.h | 2 |
4 files changed, 23 insertions, 7 deletions
diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h index bc235978fc..400bbfc5d2 100644 --- a/engines/sci/engine/kernel_tables.h +++ b/engines/sci/engine/kernel_tables.h @@ -332,7 +332,7 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(DoBresen), SIG_EVERYWHERE, "o", NULL, NULL }, { MAP_CALL(DoSound), SIG_EVERYWHERE, "i(.*)", kDoSound_subops, NULL }, { MAP_CALL(DoSync), SIG_EVERYWHERE, "i(.*)", NULL, NULL }, // subop - { MAP_CALL(DrawCel), SIG_SCI11, SIGFOR_PC, "iiiii(i)(i)(r0)", NULL, NULL }, // for kq6 hires + { MAP_CALL(DrawCel), SIG_SCI11, SIGFOR_PC, "iiiii(i)(i)([ri])", NULL, NULL }, // reference for kq6 hires { MAP_CALL(DrawCel), SIG_EVERYWHERE, "iiiii(i)(i)", NULL, NULL }, { MAP_CALL(DrawControl), SIG_EVERYWHERE, "o", NULL, NULL }, { MAP_CALL(DrawMenuBar), SIG_EVERYWHERE, "i", NULL, NULL }, diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index f2be66ad85..78fb78d42c 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -1000,10 +1000,26 @@ reg_t kDrawCel(EngineState *s, int argc, reg_t *argv) { uint16 y = argv[4].toUint16(); int16 priority = (argc > 5) ? argv[5].toSint16() : -1; uint16 paletteNo = (argc > 6) ? argv[6].toUint16() : 0; - bool hiresMode = (argc > 7) ? true : false; - reg_t upscaledHiresHandle = (argc > 7) ? argv[7] : NULL_REG; + bool hiresMode = false; + reg_t upscaledHiresHandle = NULL_REG; + uint16 scaleX = 128; + uint16 scaleY = 128; + + if (argc > 7) { + // this is either kq6 hires or scaling + if (paletteNo > 0) { + // it's scaling + scaleX = argv[6].toUint16(); + scaleY = argv[7].toUint16(); + paletteNo = 0; + } else { + // KQ6 hires + hiresMode = true; + upscaledHiresHandle = argv[7]; + } + } - g_sci->_gfxPaint16->kernelDrawCel(viewId, loopNo, celNo, x, y, priority, paletteNo, hiresMode, upscaledHiresHandle); + g_sci->_gfxPaint16->kernelDrawCel(viewId, loopNo, celNo, x, y, priority, paletteNo, scaleX, scaleY, hiresMode, upscaledHiresHandle); return s->r_acc; } diff --git a/engines/sci/graphics/paint16.cpp b/engines/sci/graphics/paint16.cpp index 4227c458c5..bb3975e9ef 100644 --- a/engines/sci/graphics/paint16.cpp +++ b/engines/sci/graphics/paint16.cpp @@ -383,11 +383,11 @@ void GfxPaint16::kernelDrawPicture(GuiResourceId pictureId, int16 animationNr, b _ports->setPort(oldPort); } -void GfxPaint16::kernelDrawCel(GuiResourceId viewId, int16 loopNo, int16 celNo, uint16 leftPos, uint16 topPos, int16 priority, uint16 paletteNo, bool hiresMode, reg_t upscaledHiresHandle) { +void GfxPaint16::kernelDrawCel(GuiResourceId viewId, int16 loopNo, int16 celNo, uint16 leftPos, uint16 topPos, int16 priority, uint16 paletteNo, uint16 scaleX, uint16 scaleY, bool hiresMode, reg_t upscaledHiresHandle) { // some calls are hiresMode even under kq6 DOS, that's why we check for // upscaled hires here if ((!hiresMode) || (!_screen->getUpscaledHires())) { - drawCelAndShow(viewId, loopNo, celNo, leftPos, topPos, priority, paletteNo); + drawCelAndShow(viewId, loopNo, celNo, leftPos, topPos, priority, paletteNo, scaleX, scaleY); } else { drawHiresCelAndShow(viewId, loopNo, celNo, leftPos, topPos, priority, paletteNo, upscaledHiresHandle); } diff --git a/engines/sci/graphics/paint16.h b/engines/sci/graphics/paint16.h index 4c3ac255c4..edffa8da6e 100644 --- a/engines/sci/graphics/paint16.h +++ b/engines/sci/graphics/paint16.h @@ -73,7 +73,7 @@ public: void bitsFree(reg_t memoryHandle); void kernelDrawPicture(GuiResourceId pictureId, int16 animationNr, bool animationBlackoutFlag, bool mirroredFlag, bool addToFlag, int16 EGApaletteNo); - void kernelDrawCel(GuiResourceId viewId, int16 loopNo, int16 celNo, uint16 leftPos, uint16 topPos, int16 priority, uint16 paletteNo, bool hiresMode, reg_t upscaledHiresHandle); + void kernelDrawCel(GuiResourceId viewId, int16 loopNo, int16 celNo, uint16 leftPos, uint16 topPos, int16 priority, uint16 paletteNo, uint16 scaleX, uint16 scaleY, bool hiresMode, reg_t upscaledHiresHandle); void kernelGraphFillBoxForeground(const Common::Rect &rect); void kernelGraphFillBoxBackground(const Common::Rect &rect); |