aboutsummaryrefslogtreecommitdiff
path: root/engines/sci
diff options
context:
space:
mode:
Diffstat (limited to 'engines/sci')
-rw-r--r--engines/sci/engine/kgraphics32.cpp20
-rw-r--r--engines/sci/graphics/frameout.cpp91
2 files changed, 111 insertions, 0 deletions
diff --git a/engines/sci/engine/kgraphics32.cpp b/engines/sci/engine/kgraphics32.cpp
index 2ae6b1f1f5..a765fe842e 100644
--- a/engines/sci/engine/kgraphics32.cpp
+++ b/engines/sci/engine/kgraphics32.cpp
@@ -127,6 +127,26 @@ reg_t kGetHighPlanePri(EngineState *s, int argc, reg_t *argv) {
}
reg_t kFrameOut(EngineState *s, int argc, reg_t *argv) {
+/* TODO: Transcribed from SCI engine disassembly.
+ GraphicsMgr &graphicsMgr = g_sci->_graphicsMgr;
+ if (graphicsMgr.palMorphNeeded) {
+ graphicsMgr.PalMorphFrameOut(&g_PalStyleRanges, false);
+ }
+ else {
+ // TODO: Not sure if this is a pointer or not yet.
+ if (g_ScrollState != nullptr) {
+ kFrameOutDoScroll();
+ }
+
+ bool showBits = true;
+ if (argc == 1) {
+ showBits = (bool) argv[0].toUint16();
+ }
+
+ rect SOL_Rect = { .left = 0, .top = 0, .right = UINT32_MAX, .bottom = UINT32_MAX };
+ graphicsMgr.FrameOut(showBits, &rect);
+ }
+*/
g_sci->_gfxFrameout->kernelFrameout();
return NULL_REG;
}
diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp
index 7396115f4c..9512ec2ed1 100644
--- a/engines/sci/graphics/frameout.cpp
+++ b/engines/sci/graphics/frameout.cpp
@@ -651,6 +651,97 @@ void GfxFrameout::drawPicture(FrameoutEntry *itemEntry, int16 planeOffsetX, int1
// warning("picture cel %d %d", itemEntry->celNo, itemEntry->priority);
}
+/* TODO: This is the proper implementation of GraphicsMgr::FrameOut transcribed from SQ6 SCI engine disassembly.
+static DrawList* g_drawLists[100];
+static RectList* g_rectLists[100];
+void GfxFrameout::FrameOut(bool shouldShowBits, SOL_Rect *rect) {
+ if (robot) {
+ robot.doRobot();
+ }
+
+ auto planeCount = screen.planeList.planeCount;
+ if (planeCount > 0) {
+ for (int planeIndex = 0; planeIndex < planeCount; ++planeIndex) {
+ Plane plane = *screen.planeList[planeIndex];
+
+ DrawList* drawList = new DrawList();
+ g_drawLists[planeIndex] = drawList;
+ RectList* rectList = new RectList();
+ g_rectLists[planeIndex] = rectList;
+ }
+ }
+
+ if (g_Remap_numActiveRemaps > 0 && remapNeeded) {
+ screen.RemapMarkRedraw();
+ }
+
+ CalcLists(&g_drawLists, &g_rectLists, rect);
+
+ // SCI engine stores reference *after* CalcLists
+ planeCount = screen.planeList.planeCount;
+ if (planeCount > 0) {
+ for (int drawListIndex = 0; drawListIndex < planeCount; ++i) {
+ DrawList* drawList = g_drawLists[drawListIndex];
+ drawList->Sort();
+ }
+
+ for (int drawListIndex = 0; drawListIndex < planeCount; ++i) {
+ DrawList* drawList = g_drawLists[drawListIndex];
+ if (drawList == nullptr || drawList->count == 0) {
+ continue;
+ }
+
+ for (int screenItemIndex = 0, screenItemCount = drawList->count; screenItemIndex < screenItemCount; ++screenItemIndex) {
+ ScreenItem* screenItem = drawList->items[screenItemIndex];
+ screenItem->GetCelObj()->SubmitPalette();
+ }
+ }
+ }
+
+ // UpdateForFrame is where all palette mutations occur (cycles, varies, etc.)
+ bool remapNeeded = GPalette().UpdateForFrame();
+ if (planeCount > 0) {
+ frameNowVisible = false;
+
+ for (int planeIndex = 0; planeIndex < planeCount; ++planeIndex) {
+ Plane* plane = screen.planeList[planeIndex];
+
+ DrawEraseList(g_rectLists[planeIndex], plane);
+ DrawScreenItemsList(g_drawLists[planeIndex]);
+ }
+ }
+
+ if (robot) {
+ robot.FrameAlmostVisible();
+ }
+
+ GPalette().UpdateHardware();
+
+ if (shouldShowBits) {
+ ShowBits();
+ }
+
+ frameNowVisible = true;
+
+ if (robot) {
+ robot.FrameNowVisible();
+ }
+
+ if (planeCount > 0) {
+ for (int planeIndex = 0; planeIndex < planeCount; ++planeIndex) {
+ if (g_rectLists[planeIndex] != nullptr) {
+ delete g_rectLists[planeIndex];
+ }
+ if (g_drawLists[planeIndex] != nullptr) {
+ delete g_drawLists[planeIndex];
+ }
+ }
+ }
+}
+void GfxFrameout::CalcLists(DrawList **drawLists, RectList **rectLists, SOL_Rect *rect) {
+ screen.CalcLists(&visibleScreen, drawLists, rectLists, rect);
+}
+*/
void GfxFrameout::kernelFrameout() {
if (g_sci->_robotDecoder->isVideoLoaded()) {
showVideo();