diff options
Diffstat (limited to 'engines/sci/engine/kgraphics32.cpp')
-rw-r--r-- | engines/sci/engine/kgraphics32.cpp | 134 |
1 files changed, 83 insertions, 51 deletions
diff --git a/engines/sci/engine/kgraphics32.cpp b/engines/sci/engine/kgraphics32.cpp index a33fcf3167..e5b8da4620 100644 --- a/engines/sci/engine/kgraphics32.cpp +++ b/engines/sci/engine/kgraphics32.cpp @@ -75,17 +75,14 @@ reg_t kBaseSetter32(EngineState *s, int argc, reg_t *argv) { CelObjView celObj(viewId, loopNo, celNo); const int16 scriptWidth = g_sci->_gfxFrameout->getCurrentBuffer().scriptWidth; - const int16 scriptHeight = g_sci->_gfxFrameout->getCurrentBuffer().scriptHeight; - - const Ratio scaleX(scriptWidth, celObj._scaledWidth); - const Ratio scaleY(scriptHeight, celObj._scaledHeight); + const Ratio scaleX(scriptWidth, celObj._xResolution); int16 brLeft; if (celObj._mirrorX) { - brLeft = x - ((celObj._width - celObj._displace.x) * scaleX).toInt(); + brLeft = x - ((celObj._width - celObj._origin.x) * scaleX).toInt(); } else { - brLeft = x - (celObj._displace.x * scaleX).toInt(); + brLeft = x - (celObj._origin.x * scaleX).toInt(); } const int16 brRight = brLeft + (celObj._width * scaleX).toInt() - 1; @@ -317,7 +314,7 @@ reg_t kText(EngineState *s, int argc, reg_t *argv) { reg_t kTextSize32(EngineState *s, int argc, reg_t *argv) { g_sci->_gfxText32->setFont(argv[2].toUint16()); - reg_t *rect = s->_segMan->derefRegPtr(argv[0], 4); + SciArray *rect = s->_segMan->lookupArray(argv[0]); if (rect == nullptr) { error("kTextSize: %04x:%04x cannot be dereferenced", PRINT_REG(argv[0])); } @@ -327,10 +324,14 @@ reg_t kTextSize32(EngineState *s, int argc, reg_t *argv) { bool doScaling = argc > 4 ? argv[4].toSint16() : true; Common::Rect textRect = g_sci->_gfxText32->getTextSize(text, maxWidth, doScaling); - rect[0] = make_reg(0, textRect.left); - rect[1] = make_reg(0, textRect.top); - rect[2] = make_reg(0, textRect.right - 1); - rect[3] = make_reg(0, textRect.bottom - 1); + + reg_t value[4] = { + make_reg(0, textRect.left), + make_reg(0, textRect.top), + make_reg(0, textRect.right - 1), + make_reg(0, textRect.bottom - 1) }; + + rect->setElements(0, 4, value); return s->r_acc; } @@ -426,7 +427,7 @@ reg_t kCelHigh32(EngineState *s, int argc, reg_t *argv) { int16 loopNo = argv[1].toSint16(); int16 celNo = argv[2].toSint16(); CelObjView celObj(resourceId, loopNo, celNo); - return make_reg(0, mulru(celObj._height, Ratio(g_sci->_gfxFrameout->getCurrentBuffer().scriptHeight, celObj._scaledHeight))); + return make_reg(0, mulru(celObj._height, Ratio(g_sci->_gfxFrameout->getCurrentBuffer().scriptHeight, celObj._yResolution))); } reg_t kCelWide32(EngineState *s, int argc, reg_t *argv) { @@ -434,7 +435,7 @@ reg_t kCelWide32(EngineState *s, int argc, reg_t *argv) { int16 loopNo = argv[1].toSint16(); int16 celNo = argv[2].toSint16(); CelObjView celObj(resourceId, loopNo, celNo); - return make_reg(0, mulru(celObj._width, Ratio(g_sci->_gfxFrameout->getCurrentBuffer().scriptWidth, celObj._scaledWidth))); + return make_reg(0, mulru(celObj._width, Ratio(g_sci->_gfxFrameout->getCurrentBuffer().scriptWidth, celObj._xResolution))); } reg_t kCelInfo(EngineState *s, int argc, reg_t *argv) { @@ -447,10 +448,10 @@ reg_t kCelInfo(EngineState *s, int argc, reg_t *argv) { switch (argv[0].toUint16()) { case 0: - result = view._displace.x; + result = view._origin.x; break; case 1: - result = view._displace.y; + result = view._origin.y; break; case 2: case 3: @@ -615,13 +616,13 @@ reg_t kSetFontHeight(EngineState *s, int argc, reg_t *argv) { // of setting the fontHeight on the font manager, in // which case we could just get the font directly ourselves. g_sci->_gfxText32->setFont(argv[0].toUint16()); - g_sci->_gfxText32->_scaledHeight = (g_sci->_gfxText32->_font->getHeight() * g_sci->_gfxFrameout->getCurrentBuffer().scriptHeight + g_sci->_gfxText32->_scaledHeight - 1) / g_sci->_gfxText32->_scaledHeight; - return make_reg(0, g_sci->_gfxText32->_scaledHeight); + g_sci->_gfxText32->_yResolution = (g_sci->_gfxText32->_font->getHeight() * g_sci->_gfxFrameout->getCurrentBuffer().scriptHeight + g_sci->_gfxText32->_yResolution - 1) / g_sci->_gfxText32->_yResolution; + return make_reg(0, g_sci->_gfxText32->_yResolution); } reg_t kSetFontRes(EngineState *s, int argc, reg_t *argv) { - g_sci->_gfxText32->_scaledWidth = argv[0].toUint16(); - g_sci->_gfxText32->_scaledHeight = argv[1].toUint16(); + g_sci->_gfxText32->_xResolution = argv[0].toUint16(); + g_sci->_gfxText32->_yResolution = argv[1].toUint16(); return s->r_acc; } @@ -636,12 +637,12 @@ reg_t kBitmapCreate(EngineState *s, int argc, reg_t *argv) { int16 height = argv[1].toSint16(); int16 skipColor = argv[2].toSint16(); int16 backColor = argv[3].toSint16(); - int16 scaledWidth = argc > 4 ? argv[4].toSint16() : g_sci->_gfxText32->_scaledWidth; - int16 scaledHeight = argc > 5 ? argv[5].toSint16() : g_sci->_gfxText32->_scaledHeight; + int16 xResolution = argc > 4 ? argv[4].toSint16() : g_sci->_gfxText32->_xResolution; + int16 yResolution = argc > 5 ? argv[5].toSint16() : g_sci->_gfxText32->_yResolution; bool useRemap = argc > 6 ? argv[6].toSint16() : false; reg_t bitmapId; - SciBitmap &bitmap = *s->_segMan->allocateBitmap(&bitmapId, width, height, skipColor, 0, 0, scaledWidth, scaledHeight, 0, useRemap, true); + SciBitmap &bitmap = *s->_segMan->allocateBitmap(&bitmapId, width, height, skipColor, 0, 0, xResolution, yResolution, 0, useRemap, true); memset(bitmap.getPixels(), backColor, width * height); return bitmapId; } @@ -675,12 +676,12 @@ reg_t kBitmapDrawView(EngineState *s, int argc, reg_t *argv) { const int16 alignY = argc > 8 ? argv[8].toSint16() : -1; Common::Point position( - x == -1 ? bitmap.getDisplace().x : x, - y == -1 ? bitmap.getDisplace().y : y + x == -1 ? bitmap.getOrigin().x : x, + y == -1 ? bitmap.getOrigin().y : y ); - position.x -= alignX == -1 ? view._displace.x : alignX; - position.y -= alignY == -1 ? view._displace.y : alignY; + position.x -= alignX == -1 ? view._origin.x : alignX; + position.y -= alignY == -1 ? view._origin.y : alignY; Common::Rect drawRect( position.x, @@ -755,16 +756,37 @@ reg_t kBitmapInvert(EngineState *s, int argc, reg_t *argv) { return kStubNull(s, argc + 1, argv - 1); } -reg_t kBitmapSetDisplace(EngineState *s, int argc, reg_t *argv) { +reg_t kBitmapSetOrigin(EngineState *s, int argc, reg_t *argv) { SciBitmap &bitmap = *s->_segMan->lookupBitmap(argv[0]); - bitmap.setDisplace(Common::Point(argv[1].toSint16(), argv[2].toSint16())); + bitmap.setOrigin(Common::Point(argv[1].toSint16(), argv[2].toSint16())); return s->r_acc; } reg_t kBitmapCreateFromView(EngineState *s, int argc, reg_t *argv) { - // viewId, loopNo, celNo, skipColor, backColor, useRemap, source overlay bitmap + CelObjView view(argv[0].toUint16(), argv[1].toSint16(), argv[2].toSint16()); + const uint8 skipColor = argc > 3 && argv[3].toSint16() != -1 ? argv[3].toSint16() : view._skipColor; + const uint8 backColor = argc > 4 && argv[4].toSint16() != -1 ? argv[4].toSint16() : view._skipColor; + const bool useRemap = argc > 5 ? (bool)argv[5].toSint16() : false; - return kStub(s, argc + 1, argv - 1); + reg_t bitmapId; + SciBitmap &bitmap = *s->_segMan->allocateBitmap(&bitmapId, view._width, view._height, skipColor, 0, 0, view._xResolution, view._yResolution, 0, useRemap, true); + Buffer &buffer = bitmap.getBuffer(); + + const Common::Rect viewRect(view._width, view._height); + buffer.fillRect(viewRect, backColor); + view.draw(buffer, viewRect, Common::Point(0, 0), view._mirrorX); + + if (argc > 6 && !argv[6].isNull()) { + reg_t clutHandle = argv[6]; + if (s->_segMan->isObject(clutHandle)) { + clutHandle = readSelector(s->_segMan, clutHandle, SELECTOR(data)); + } + + SciArray &clut = *s->_segMan->lookupArray(clutHandle); + bitmap.applyRemap(clut); + } + + return bitmapId; } reg_t kBitmapCopyPixels(EngineState *s, int argc, reg_t *argv) { @@ -780,12 +802,24 @@ reg_t kBitmapClone(EngineState *s, int argc, reg_t *argv) { } reg_t kBitmapGetInfo(EngineState *s, int argc, reg_t *argv) { - // bitmap + SciBitmap &bitmap = *s->_segMan->lookupBitmap(argv[0]); - // argc 1 = get width - // argc 2 = pixel at row 0 col n - // argc 3 = pixel at row n col n - return kStub(s, argc + 1, argv - 1); + if (argc == 1) { + return make_reg(0, bitmap.getWidth()); + } + + int32 offset; + if (argc == 2) { + offset = argv[1].toUint16(); + } else { + const int16 x = argv[1].toSint16(); + const int16 y = argv[2].toSint16(); + offset = y * bitmap.getWidth() + x; + } + + assert(offset >= 0 && offset < bitmap.getWidth() * bitmap.getHeight()); + const uint8 color = bitmap.getPixels()[offset]; + return make_reg(0, color); } reg_t kBitmapScale(EngineState *s, int argc, reg_t *argv) { @@ -924,17 +958,17 @@ reg_t kPaletteSetGamma(EngineState *s, int argc, reg_t *argv) { } reg_t kPaletteSetFade(EngineState *s, int argc, reg_t *argv) { - uint16 fromColor = argv[0].toUint16(); - uint16 toColor = argv[1].toUint16(); - uint16 percent = argv[2].toUint16(); + const uint16 fromColor = argv[0].toUint16(); + const uint16 toColor = argv[1].toUint16(); + const uint16 percent = argv[2].toUint16(); g_sci->_gfxPalette32->setFade(percent, fromColor, toColor); return s->r_acc; } reg_t kPalVarySetVary(EngineState *s, int argc, reg_t *argv) { - GuiResourceId paletteId = argv[0].toUint16(); - int time = argc > 1 ? argv[1].toSint16() * 60 : 0; - int16 percent = argc > 2 ? argv[2].toSint16() : 100; + const GuiResourceId paletteId = argv[0].toUint16(); + const int32 time = argc > 1 ? argv[1].toSint16() * 60 : 0; + const int16 percent = argc > 2 ? argv[2].toSint16() : 100; int16 fromColor; int16 toColor; @@ -950,9 +984,9 @@ reg_t kPalVarySetVary(EngineState *s, int argc, reg_t *argv) { } reg_t kPalVarySetPercent(EngineState *s, int argc, reg_t *argv) { - int time = argc > 0 ? argv[0].toSint16() * 60 : 0; - int16 percent = argc > 1 ? argv[1].toSint16() : 0; - g_sci->_gfxPalette32->setVaryPercent(percent, time, -1, -1); + const int32 time = argc > 0 ? argv[0].toSint16() * 60 : 0; + const int16 percent = argc > 1 ? argv[1].toSint16() : 0; + g_sci->_gfxPalette32->setVaryPercent(percent, time); return s->r_acc; } @@ -966,31 +1000,31 @@ reg_t kPalVaryOff(EngineState *s, int argc, reg_t *argv) { } reg_t kPalVaryMergeTarget(EngineState *s, int argc, reg_t *argv) { - GuiResourceId paletteId = argv[0].toUint16(); + const GuiResourceId paletteId = argv[0].toUint16(); g_sci->_gfxPalette32->kernelPalVaryMergeTarget(paletteId); return make_reg(0, g_sci->_gfxPalette32->getVaryPercent()); } reg_t kPalVarySetTime(EngineState *s, int argc, reg_t *argv) { - int time = argv[0].toSint16() * 60; + const int32 time = argv[0].toSint16() * 60; g_sci->_gfxPalette32->setVaryTime(time); return s->r_acc; } reg_t kPalVarySetTarget(EngineState *s, int argc, reg_t *argv) { - GuiResourceId paletteId = argv[0].toUint16(); + const GuiResourceId paletteId = argv[0].toUint16(); g_sci->_gfxPalette32->kernelPalVarySetTarget(paletteId); return make_reg(0, g_sci->_gfxPalette32->getVaryPercent()); } reg_t kPalVarySetStart(EngineState *s, int argc, reg_t *argv) { - GuiResourceId paletteId = argv[0].toUint16(); + const GuiResourceId paletteId = argv[0].toUint16(); g_sci->_gfxPalette32->kernelPalVarySetStart(paletteId); return make_reg(0, g_sci->_gfxPalette32->getVaryPercent()); } reg_t kPalVaryMergeStart(EngineState *s, int argc, reg_t *argv) { - GuiResourceId paletteId = argv[0].toUint16(); + const GuiResourceId paletteId = argv[0].toUint16(); g_sci->_gfxPalette32->kernelPalVaryMergeStart(paletteId); return make_reg(0, g_sci->_gfxPalette32->getVaryPercent()); } @@ -1006,7 +1040,6 @@ reg_t kPalCycleSetCycle(EngineState *s, int argc, reg_t *argv) { const uint16 toColor = argv[1].toUint16(); const int16 direction = argv[2].toSint16(); const uint16 delay = argc > 3 ? argv[3].toUint16() : 0; - g_sci->_gfxPalette32->setCycle(fromColor, toColor, direction, delay); return s->r_acc; } @@ -1014,7 +1047,6 @@ reg_t kPalCycleSetCycle(EngineState *s, int argc, reg_t *argv) { reg_t kPalCycleDoCycle(EngineState *s, int argc, reg_t *argv) { const uint16 fromColor = argv[0].toUint16(); const int16 speed = argc > 1 ? argv[1].toSint16() : 1; - g_sci->_gfxPalette32->doCycle(fromColor, speed); return s->r_acc; } |