aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorjohndoe1232016-03-26 22:39:37 +0100
committerEugene Sandulenko2018-07-20 06:43:33 +0000
commit5e919fd3084d12f1d9ff9c9921e5993b8ae318eb (patch)
treeb3033d48e6d5a3c4d0d92c4884416d74a9193d31 /engines
parent2bd13865285058d72e13150ab64462dbbe23163c (diff)
downloadscummvm-rg350-5e919fd3084d12f1d9ff9c9921e5993b8ae318eb.tar.gz
scummvm-rg350-5e919fd3084d12f1d9ff9c9921e5993b8ae318eb.tar.bz2
scummvm-rg350-5e919fd3084d12f1d9ff9c9921e5993b8ae318eb.zip
ILLUSIONS: Split Screen class into variants for 8bit and 16bit (i.e. Duckman and BBDOU)
Diffstat (limited to 'engines')
-rw-r--r--engines/illusions/actor.cpp2
-rw-r--r--engines/illusions/bbdou/illusions_bbdou.cpp6
-rw-r--r--engines/illusions/duckman/illusions_duckman.cpp2
-rw-r--r--engines/illusions/screen.cpp312
-rw-r--r--engines/illusions/screen.h59
5 files changed, 176 insertions, 205 deletions
diff --git a/engines/illusions/actor.cpp b/engines/illusions/actor.cpp
index 591ad184dd..a99a124057 100644
--- a/engines/illusions/actor.cpp
+++ b/engines/illusions/actor.cpp
@@ -946,7 +946,7 @@ void Control::fillActor(byte color) {
bool Control::isPixelCollision(Common::Point &pt) {
Frame *frame = &(*_actor->_frames)[_actor->_frameIndex - 1];
- return _vm->_screen->isSpritePixelSolid16(pt, _position, _actor->_position,
+ return _vm->_screen->isSpritePixelSolid(pt, _position, _actor->_position,
_actor->_surfInfo, _actor->_scale, frame->_flags, frame->_compressedPixels);
}
diff --git a/engines/illusions/bbdou/illusions_bbdou.cpp b/engines/illusions/bbdou/illusions_bbdou.cpp
index 15b103108d..e3b0df2d07 100644
--- a/engines/illusions/bbdou/illusions_bbdou.cpp
+++ b/engines/illusions/bbdou/illusions_bbdou.cpp
@@ -151,7 +151,7 @@ Common::Error IllusionsEngine_BBDOU::run() {
_resSys->addResourceLoader(0x00120000, new FontResourceLoader(this));
_resSys->addResourceLoader(0x00170000, new SpecialCodeLoader(this));
- _screen = new Screen(this, 640, 480, 16);
+ _screen = new Screen16Bit(this, 640, 480);
_screenPalette = new NullScreenPalette();
_screenText = new ScreenText(this);
_input = new Input();
@@ -569,8 +569,8 @@ void IllusionsEngine_BBDOU::dumpActiveScenes(uint32 sceneId, uint32 threadId) {
}
void IllusionsEngine_BBDOU::enterMenuPause() {
- // TODO suspendAudio();
- _screenText->clearText();
+ // TODO suspendAudio();
+ _screenText->clearText();
}
void IllusionsEngine_BBDOU::leaveMenuPause() {
diff --git a/engines/illusions/duckman/illusions_duckman.cpp b/engines/illusions/duckman/illusions_duckman.cpp
index a9f6b6e2af..2cd338b1db 100644
--- a/engines/illusions/duckman/illusions_duckman.cpp
+++ b/engines/illusions/duckman/illusions_duckman.cpp
@@ -103,7 +103,7 @@ Common::Error IllusionsEngine_Duckman::run() {
_resSys->addResourceLoader(0x00120000, new FontResourceLoader(this));
_resSys->addResourceLoader(0x00190000, new GenericResourceLoader(this));
- _screen = new Screen(this, 320, 200, 8);
+ _screen = new Screen8Bit(this, 320, 200);
_screenPalette = new ScreenPalette(this);
_screenText = new ScreenText(this);
_input = new Input();
diff --git a/engines/illusions/screen.cpp b/engines/illusions/screen.cpp
index 3cbdd9158a..0b04c2a1d9 100644
--- a/engines/illusions/screen.cpp
+++ b/engines/illusions/screen.cpp
@@ -449,111 +449,9 @@ void Screen::clearScreenOffsetAreas() {
_backSurface->fillRect(Common::Rect(x1, 0, x2, _backSurface->h), 0);
}
-void Screen::decompressSprite(SpriteDecompressQueueItem *item) {
- switch (_backSurface->format.bytesPerPixel) {
- case 1:
- decompressSprite8(item);
- break;
- case 2:
- decompressSprite16(item);
- break;
- default:
- break;
- }
-}
-
-void Screen::drawSurface(Common::Rect &dstRect, Graphics::Surface *surface, Common::Rect &srcRect, int16 scale, uint32 flags) {
- switch (_backSurface->format.bytesPerPixel) {
- case 1:
- drawSurface8(dstRect, surface, srcRect, scale, flags);
- break;
- case 2:
- drawSurface16(dstRect, surface, srcRect, scale, flags);
- break;
- default:
- break;
- }
-}
-
-void Screen::drawText(FontResource *font, Graphics::Surface *surface, int16 x, int16 y, uint16 *text, uint count) {
- switch (_backSurface->format.bytesPerPixel) {
- case 1:
- drawText8(font, surface, x, y, text, count);
- break;
- case 2:
- drawText16(font, surface, x, y, text, count);
- break;
- default:
- break;
- }
-}
-
-void Screen::fillSurface(Graphics::Surface *surface, byte color) {
- Common::Rect r = Common::Rect(surface->w, surface->h);
- switch (_backSurface->format.bytesPerPixel) {
- case 1:
- surface->fillRect(r, color);
- break;
- case 2:
- surface->fillRect(r, convertColor(color));
- break;
- default:
- break;
- }
-}
-
-uint16 Screen::convertColor(byte color) {
- if (color == 0)
- return _colorKey1;
- if (color == 20)
- return g_system->getScreenFormat().RGBToColor(255, 255, 255);
- if (color == 80)
- return g_system->getScreenFormat().RGBToColor(176, 176, 176);
- return g_system->getScreenFormat().RGBToColor(16, 16, 16);
-}
-
-void Screen::drawText8(FontResource *font, Graphics::Surface *surface, int16 x, int16 y, uint16 *text, uint count) {
- for (uint i = 0; i < count; ++i)
- x += font->_widthC + drawChar8(font, surface, x, y, *text++);
-}
+// Screen8Bit
-int16 Screen::drawChar8(FontResource *font, Graphics::Surface *surface, int16 x, int16 y, uint16 c) {
- const CharInfo *charInfo = font->getCharInfo(c);
- const int16 charWidth = charInfo->_width;
- byte *dst = (byte*)surface->getBasePtr(x, y);
- byte *pixels = charInfo->_pixels;
- for (int16 yc = 0; yc < font->_charHeight; ++yc) {
- for (int16 xc = 0; xc < charWidth; ++xc)
- if (pixels[xc])
- dst[xc] = pixels[xc];
- dst += surface->pitch;
- pixels += charWidth;
- }
- return charWidth;
-}
-
-void Screen::drawText16(FontResource *font, Graphics::Surface *surface, int16 x, int16 y, uint16 *text, uint count) {
- for (uint i = 0; i < count; ++i)
- x += font->_widthC + drawChar16(font, surface, x, y, *text++);
-}
-
-int16 Screen::drawChar16(FontResource *font, Graphics::Surface *surface, int16 x, int16 y, uint16 c) {
- const CharInfo *charInfo = font->getCharInfo(c);
- const int16 charWidth = charInfo->_width;
- byte *pixels = charInfo->_pixels;
- for (int16 yc = 0; yc < font->_charHeight; ++yc) {
- byte *dst = (byte*)surface->getBasePtr(x, y + yc);
- for (int16 xc = 0; xc < charWidth; ++xc) {
- if (pixels[xc])
- WRITE_LE_UINT16(dst, convertFontColor(pixels[xc]));
- dst += 2;
- }
- pixels += charWidth;
- }
- return charWidth;
-}
-
-void Screen::decompressSprite8(SpriteDecompressQueueItem *item) {
+void Screen8Bit::decompressSprite(SpriteDecompressQueueItem *item) {
byte *src = item->_compressedPixels;
Graphics::Surface *dstSurface = item->_surface;
int dstSize = item->_dimensions._width * item->_dimensions._height;
@@ -587,9 +485,9 @@ void Screen::decompressSprite8(SpriteDecompressQueueItem *item) {
y = 0;
yincr = 1;
}
-
+
byte *dst = (byte*)dstSurface->getBasePtr(x, y);
-
+
while (processedSize < dstSize) {
byte op = *src++;
if (op & 0x80) {
@@ -627,16 +525,45 @@ void Screen::decompressSprite8(SpriteDecompressQueueItem *item) {
}
-void Screen::drawSurface8(Common::Rect &dstRect, Graphics::Surface *surface, Common::Rect &srcRect, int16 scale, uint32 flags) {
+void Screen8Bit::drawSurface(Common::Rect &dstRect, Graphics::Surface *surface, Common::Rect &srcRect, int16 scale, uint32 flags) {
if (scale == 100) {
- drawSurface81(dstRect.left, dstRect.top, surface, srcRect);
+ drawSurfaceUnscaled(dstRect.left, dstRect.top, surface, srcRect);
} else {
- drawSurface82(dstRect, surface, srcRect);
+ drawSurfaceScaled(dstRect, surface, srcRect);
}
}
-void Screen::drawSurface81(int16 destX, int16 destY, Graphics::Surface *surface, Common::Rect &srcRect) {
- // Unscaled
+void Screen8Bit::drawText(FontResource *font, Graphics::Surface *surface, int16 x, int16 y, uint16 *text, uint count) {
+ for (uint i = 0; i < count; ++i)
+ x += font->_widthC + drawChar(font, surface, x, y, *text++);
+}
+
+void Screen8Bit::fillSurface(Graphics::Surface *surface, byte color) {
+ surface->fillRect(Common::Rect(surface->w, surface->h), color);
+}
+
+bool Screen8Bit::isSpritePixelSolid(Common::Point &testPt, Common::Point &drawPosition, Common::Point &drawOffset,
+ const SurfInfo &surfInfo, int16 scale, uint flags, byte *compressedPixels) {
+ // Unused in Duckman
+ return false;
+}
+
+int16 Screen8Bit::drawChar(FontResource *font, Graphics::Surface *surface, int16 x, int16 y, uint16 c) {
+ const CharInfo *charInfo = font->getCharInfo(c);
+ const int16 charWidth = charInfo->_width;
+ byte *dst = (byte*)surface->getBasePtr(x, y);
+ byte *pixels = charInfo->_pixels;
+ for (int16 yc = 0; yc < font->_charHeight; ++yc) {
+ for (int16 xc = 0; xc < charWidth; ++xc)
+ if (pixels[xc])
+ dst[xc] = pixels[xc];
+ dst += surface->pitch;
+ pixels += charWidth;
+ }
+ return charWidth;
+}
+
+void Screen8Bit::drawSurfaceUnscaled(int16 destX, int16 destY, Graphics::Surface *surface, Common::Rect &srcRect) {
const int16 w = srcRect.width();
const int16 h = srcRect.height();
const byte* colorTransTbl = _vm->_screenPalette->getColorTransTbl();
@@ -656,8 +583,7 @@ void Screen::drawSurface81(int16 destX, int16 destY, Graphics::Surface *surface,
}
}
-void Screen::drawSurface82(Common::Rect &dstRect, Graphics::Surface *surface, Common::Rect &srcRect) {
- // Scaled
+void Screen8Bit::drawSurfaceScaled(Common::Rect &dstRect, Graphics::Surface *surface, Common::Rect &srcRect) {
const int dstWidth = dstRect.width(), dstHeight = dstRect.height();
const int srcWidth = srcRect.width(), srcHeight = srcRect.height();
const int errYStart = srcHeight / dstHeight;
@@ -712,7 +638,9 @@ void Screen::drawSurface82(Common::Rect &dstRect, Graphics::Surface *surface, Co
}
}
-void Screen::decompressSprite16(SpriteDecompressQueueItem *item) {
+// Screen16Bit
+
+void Screen16Bit::decompressSprite(SpriteDecompressQueueItem *item) {
byte *src = item->_compressedPixels;
Graphics::Surface *dstSurface = item->_surface;
int dstSize = item->_dimensions._width * item->_dimensions._height;
@@ -789,7 +717,7 @@ void Screen::decompressSprite16(SpriteDecompressQueueItem *item) {
}
-void Screen::drawSurface16(Common::Rect &dstRect, Graphics::Surface *surface, Common::Rect &srcRect, int16 scale, uint32 flags) {
+void Screen16Bit::drawSurface(Common::Rect &dstRect, Graphics::Surface *surface, Common::Rect &srcRect, int16 scale, uint32 flags) {
if (scale == 100) {
if (flags & 1)
drawSurface10(dstRect.left, dstRect.top, surface, srcRect, _colorKey2);
@@ -803,13 +731,94 @@ void Screen::drawSurface16(Common::Rect &dstRect, Graphics::Surface *surface, Co
}
}
-void Screen::drawSurface10(int16 destX, int16 destY, Graphics::Surface *surface, Common::Rect &srcRect, uint16 colorKey) {
+void Screen16Bit::drawText(FontResource *font, Graphics::Surface *surface, int16 x, int16 y, uint16 *text, uint count) {
+ for (uint i = 0; i < count; ++i)
+ x += font->_widthC + drawChar(font, surface, x, y, *text++);
+}
+
+void Screen16Bit::fillSurface(Graphics::Surface *surface, byte color) {
+ surface->fillRect(Common::Rect(surface->w, surface->h), convertColor(color));
+}
+
+bool Screen16Bit::isSpritePixelSolid(Common::Point &testPt, Common::Point &drawPosition, Common::Point &drawOffset,
+ const SurfInfo &surfInfo, int16 scale, uint flags, byte *compressedPixels) {
+
+ int ptX = scale * drawPosition.x / 100 + testPt.x - drawOffset.x;
+ int ptY = scale * drawPosition.y / 100 + testPt.y - drawOffset.y;
+
+ if (flags & 1) {
+ const int scaledWidth = scale * surfInfo._dimensions._width / 100;
+ ptX += 2 * (scaledWidth - scaledWidth / 2 - ptX);
+ }
+
+ if (flags & 2) {
+ const int scaledHeight = scale * surfInfo._dimensions._height / 100;
+ ptY += 2 * (scaledHeight - scaledHeight / 2 - ptY);
+ }
+
+ const int pixelLookX = 100 * ptX / scale;
+ const int pixelLookY = 100 * ptY / scale;
+ const int lookOffset = pixelLookX + surfInfo._dimensions._width * pixelLookY;
+ const int dstSize = surfInfo._dimensions._width * surfInfo._dimensions._height;
+
+ if (pixelLookX < 0 || pixelLookX >= surfInfo._dimensions._width ||
+ pixelLookY < 0 || pixelLookY >= surfInfo._dimensions._height ||
+ lookOffset < 0 || lookOffset >= dstSize)
+ return false;
+
+ byte *src = compressedPixels;
+ int processedSize = 0;
+
+ while (processedSize < dstSize) {
+ int16 op = READ_LE_UINT16(src);
+ src += 2;
+ if (op & 0x8000) {
+ int runCount = (op & 0x7FFF) + 1;
+ uint16 runColor = READ_LE_UINT16(src);
+ src += 2;
+ while (runCount--) {
+ if (processedSize == lookOffset)
+ return runColor != _colorKey1;
+ ++processedSize;
+ }
+ } else {
+ int copyCount = op + 1;
+ while (copyCount--) {
+ uint16 color = READ_LE_UINT16(src);
+ src += 2;
+ if (processedSize == lookOffset)
+ return color != _colorKey1;
+ ++processedSize;
+ }
+ }
+ }
+
+ return false;
+}
+
+int16 Screen16Bit::drawChar(FontResource *font, Graphics::Surface *surface, int16 x, int16 y, uint16 c) {
+ const CharInfo *charInfo = font->getCharInfo(c);
+ const int16 charWidth = charInfo->_width;
+ byte *pixels = charInfo->_pixels;
+ for (int16 yc = 0; yc < font->_charHeight; ++yc) {
+ byte *dst = (byte*)surface->getBasePtr(x, y + yc);
+ for (int16 xc = 0; xc < charWidth; ++xc) {
+ if (pixels[xc])
+ WRITE_LE_UINT16(dst, convertFontColor(pixels[xc]));
+ dst += 2;
+ }
+ pixels += charWidth;
+ }
+ return charWidth;
+}
+
+void Screen16Bit::drawSurface10(int16 destX, int16 destY, Graphics::Surface *surface, Common::Rect &srcRect, uint16 colorKey) {
// Unscaled
// TODO
//debug("Screen::drawSurface10");
}
-void Screen::drawSurface11(int16 destX, int16 destY, Graphics::Surface *surface, Common::Rect &srcRect) {
+void Screen16Bit::drawSurface11(int16 destX, int16 destY, Graphics::Surface *surface, Common::Rect &srcRect) {
// Unscaled
//debug("Screen::drawSurface11() destX: %d; destY: %d; srcRect: (%d, %d, %d, %d)", destX, destY, srcRect.left, srcRect.top, srcRect.right, srcRect.bottom);
const int16 w = srcRect.width();
@@ -827,13 +836,13 @@ void Screen::drawSurface11(int16 destX, int16 destY, Graphics::Surface *surface,
}
}
-void Screen::drawSurface20(Common::Rect &dstRect, Graphics::Surface *surface, Common::Rect &srcRect, uint16 colorKey) {
+void Screen16Bit::drawSurface20(Common::Rect &dstRect, Graphics::Surface *surface, Common::Rect &srcRect, uint16 colorKey) {
// Scaled
// TODO
//debug("Screen::drawSurface20");
}
-void Screen::drawSurface21(Common::Rect &dstRect, Graphics::Surface *surface, Common::Rect &srcRect) {
+void Screen16Bit::drawSurface21(Common::Rect &dstRect, Graphics::Surface *surface, Common::Rect &srcRect) {
// Scaled
const int dstWidth = dstRect.width(), dstHeight = dstRect.height();
const int srcWidth = srcRect.width(), srcHeight = srcRect.height();
@@ -878,66 +887,19 @@ void Screen::drawSurface21(Common::Rect &dstRect, Graphics::Surface *surface, Co
++srcY;
}
}
-
}
-bool Screen::isSpritePixelSolid16(Common::Point &testPt, Common::Point &drawPosition, Common::Point &drawOffset,
- const SurfInfo &surfInfo, int16 scale, uint flags, byte *compressedPixels) {
-
- int ptX = scale * drawPosition.x / 100 + testPt.x - drawOffset.x;
- int ptY = scale * drawPosition.y / 100 + testPt.y - drawOffset.y;
-
- if (flags & 1) {
- const int scaledWidth = scale * surfInfo._dimensions._width / 100;
- ptX += 2 * (scaledWidth - scaledWidth / 2 - ptX);
- }
-
- if (flags & 2) {
- const int scaledHeight = scale * surfInfo._dimensions._height / 100;
- ptY += 2 * (scaledHeight - scaledHeight / 2 - ptY);
- }
-
- const int pixelLookX = 100 * ptX / scale;
- const int pixelLookY = 100 * ptY / scale;
- const int lookOffset = pixelLookX + surfInfo._dimensions._width * pixelLookY;
- const int dstSize = surfInfo._dimensions._width * surfInfo._dimensions._height;
-
- if (pixelLookX < 0 || pixelLookX >= surfInfo._dimensions._width ||
- pixelLookY < 0 || pixelLookY >= surfInfo._dimensions._height ||
- lookOffset < 0 || lookOffset >= dstSize)
- return false;
-
- byte *src = compressedPixels;
- int processedSize = 0;
-
- while (processedSize < dstSize) {
- int16 op = READ_LE_UINT16(src);
- src += 2;
- if (op & 0x8000) {
- int runCount = (op & 0x7FFF) + 1;
- uint16 runColor = READ_LE_UINT16(src);
- src += 2;
- while (runCount--) {
- if (processedSize == lookOffset)
- return runColor != _colorKey1;
- ++processedSize;
- }
- } else {
- int copyCount = op + 1;
- while (copyCount--) {
- uint16 color = READ_LE_UINT16(src);
- src += 2;
- if (processedSize == lookOffset)
- return color != _colorKey1;
- ++processedSize;
- }
- }
- }
-
- return false;
+uint16 Screen16Bit::convertColor(byte color) {
+ if (color == 0)
+ return _colorKey1;
+ if (color == 20)
+ return g_system->getScreenFormat().RGBToColor(255, 255, 255);
+ if (color == 80)
+ return g_system->getScreenFormat().RGBToColor(176, 176, 176);
+ return g_system->getScreenFormat().RGBToColor(16, 16, 16);
}
-uint16 Screen::convertFontColor(byte color) {
+uint16 Screen16Bit::convertFontColor(byte color) {
if (color) {
byte r, g, b;
if (color == 204) {
diff --git a/engines/illusions/screen.h b/engines/illusions/screen.h
index 7715058597..1da1d5bcaa 100644
--- a/engines/illusions/screen.h
+++ b/engines/illusions/screen.h
@@ -152,12 +152,10 @@ protected:
class NullScreenPalette : public ScreenPaletteBase {
};
-// TODO Split into two classes (8bit and 16bit)?
-
class Screen {
public:
Screen(IllusionsEngine *vm, int16 width, int16 height, int bpp);
- ~Screen();
+ virtual ~Screen();
Graphics::Surface *allocSurface(int16 width, int16 height);
Graphics::Surface *allocSurface(SurfInfo &surfInfo);
bool isDisplayOn();
@@ -165,16 +163,17 @@ public:
void setScreenOffset(Common::Point offsPt);
void updateSprites();
void clearScreenOffsetAreas();
- void decompressSprite(SpriteDecompressQueueItem *item);
- void drawSurface(Common::Rect &dstRect, Graphics::Surface *surface, Common::Rect &srcRect, int16 scale, uint32 flags);
- void drawText(FontResource *font, Graphics::Surface *surface, int16 x, int16 y, uint16 *text, uint count);
- void fillSurface(Graphics::Surface *surface, byte color);
- uint16 convertColor(byte color);
uint16 getColorKey1() const { return _colorKey1; }
void setColorKey1(uint16 colorKey) { _colorKey1 = colorKey; }
uint16 getColorKey2() const { return _colorKey2; }
int16 getScreenWidth() const { return _backSurface->w; }
int16 getScreenHeight() const { return _backSurface->h; }
+ virtual void decompressSprite(SpriteDecompressQueueItem *item) = 0;
+ virtual void drawSurface(Common::Rect &dstRect, Graphics::Surface *surface, Common::Rect &srcRect, int16 scale, uint32 flags) = 0;
+ virtual void drawText(FontResource *font, Graphics::Surface *surface, int16 x, int16 y, uint16 *text, uint count) = 0;
+ virtual void fillSurface(Graphics::Surface *surface, byte color) = 0;
+ virtual bool isSpritePixelSolid(Common::Point &testPt, Common::Point &drawPosition, Common::Point &drawOffset,
+ const SurfInfo &surfInfo, int16 scale, uint flags, byte *compressedPixels) = 0;
public:
IllusionsEngine *_vm;
bool _displayOn;
@@ -183,31 +182,41 @@ public:
SpriteDecompressQueue *_decompressQueue;
SpriteDrawQueue *_drawQueue;
Graphics::Surface *_backSurface;
-
bool _isScreenOffsetActive;
Common::Point _screenOffsetPt;
+};
- void drawText8(FontResource *font, Graphics::Surface *surface, int16 x, int16 y, uint16 *text, uint count);
- int16 drawChar8(FontResource *font, Graphics::Surface *surface, int16 x, int16 y, uint16 c);
-
- void drawText16(FontResource *font, Graphics::Surface *surface, int16 x, int16 y, uint16 *text, uint count);
- int16 drawChar16(FontResource *font, Graphics::Surface *surface, int16 x, int16 y, uint16 c);
-
- void decompressSprite8(SpriteDecompressQueueItem *item);
- void drawSurface8(Common::Rect &dstRect, Graphics::Surface *surface, Common::Rect &srcRect, int16 scale, uint32 flags);
- void drawSurface81(int16 destX, int16 destY, Graphics::Surface *surface, Common::Rect &srcRect);
- void drawSurface82(Common::Rect &dstRect, Graphics::Surface *surface, Common::Rect &srcRect);
+class Screen8Bit : public Screen {
+public:
+ Screen8Bit(IllusionsEngine *vm, int16 width, int16 height) : Screen(vm, width, height, 8) {}
+ void decompressSprite(SpriteDecompressQueueItem *item);
+ void drawSurface(Common::Rect &dstRect, Graphics::Surface *surface, Common::Rect &srcRect, int16 scale, uint32 flags);
+ void drawText(FontResource *font, Graphics::Surface *surface, int16 x, int16 y, uint16 *text, uint count);
+ void fillSurface(Graphics::Surface *surface, byte color);
+ bool isSpritePixelSolid(Common::Point &testPt, Common::Point &drawPosition, Common::Point &drawOffset,
+ const SurfInfo &surfInfo, int16 scale, uint flags, byte *compressedPixels);
+public:
+ int16 drawChar(FontResource *font, Graphics::Surface *surface, int16 x, int16 y, uint16 c);
+ void drawSurfaceUnscaled(int16 destX, int16 destY, Graphics::Surface *surface, Common::Rect &srcRect);
+ void drawSurfaceScaled(Common::Rect &dstRect, Graphics::Surface *surface, Common::Rect &srcRect);
+};
- void decompressSprite16(SpriteDecompressQueueItem *item);
- void drawSurface16(Common::Rect &dstRect, Graphics::Surface *surface, Common::Rect &srcRect, int16 scale, uint32 flags);
+class Screen16Bit : public Screen {
+public:
+ Screen16Bit(IllusionsEngine *vm, int16 width, int16 height) : Screen(vm, width, height, 16) {}
+ void decompressSprite(SpriteDecompressQueueItem *item);
+ void drawSurface(Common::Rect &dstRect, Graphics::Surface *surface, Common::Rect &srcRect, int16 scale, uint32 flags);
+ void drawText(FontResource *font, Graphics::Surface *surface, int16 x, int16 y, uint16 *text, uint count);
+ void fillSurface(Graphics::Surface *surface, byte color);
+ bool isSpritePixelSolid(Common::Point &testPt, Common::Point &drawPosition, Common::Point &drawOffset,
+ const SurfInfo &surfInfo, int16 scale, uint flags, byte *compressedPixels);
+public:
+ int16 drawChar(FontResource *font, Graphics::Surface *surface, int16 x, int16 y, uint16 c);
void drawSurface10(int16 destX, int16 destY, Graphics::Surface *surface, Common::Rect &srcRect, uint16 colorKey);
void drawSurface11(int16 destX, int16 destY, Graphics::Surface *surface, Common::Rect &srcRect);
void drawSurface20(Common::Rect &dstRect, Graphics::Surface *surface, Common::Rect &srcRect, uint16 colorKey);
void drawSurface21(Common::Rect &dstRect, Graphics::Surface *surface, Common::Rect &srcRect);
-
- bool isSpritePixelSolid16(Common::Point &testPt, Common::Point &drawPosition, Common::Point &drawOffset,
- const SurfInfo &surfInfo, int16 scale, uint flags, byte *compressedPixels);
-
+ uint16 convertColor(byte color);
uint16 convertFontColor(byte color);
};