diff options
Diffstat (limited to 'engines/sherlock')
-rw-r--r-- | engines/sherlock/fonts.cpp | 35 | ||||
-rw-r--r-- | engines/sherlock/fonts.h | 15 | ||||
-rw-r--r-- | engines/sherlock/scalpel/scalpel_map.cpp | 4 | ||||
-rw-r--r-- | engines/sherlock/scalpel/scalpel_user_interface.cpp | 7 | ||||
-rw-r--r-- | engines/sherlock/scalpel/tsage/logo.cpp | 2 | ||||
-rw-r--r-- | engines/sherlock/screen.cpp | 8 | ||||
-rw-r--r-- | engines/sherlock/sherlock.cpp | 4 | ||||
-rw-r--r-- | engines/sherlock/surface.cpp | 8 | ||||
-rw-r--r-- | engines/sherlock/surface.h | 4 | ||||
-rw-r--r-- | engines/sherlock/tattoo/tattoo_map.cpp | 10 | ||||
-rw-r--r-- | engines/sherlock/tattoo/widget_tooltip.cpp | 2 |
11 files changed, 63 insertions, 36 deletions
diff --git a/engines/sherlock/fonts.cpp b/engines/sherlock/fonts.cpp index 974debcc1f..50d05def3b 100644 --- a/engines/sherlock/fonts.cpp +++ b/engines/sherlock/fonts.cpp @@ -25,18 +25,21 @@ #include "sherlock/fonts.h" #include "sherlock/image_file.h" #include "sherlock/surface.h" +#include "sherlock/sherlock.h" namespace Sherlock { -Common::Platform Fonts::_platform; +SherlockEngine *Fonts::_vm; ImageFile *Fonts::_font; int Fonts::_fontNumber; int Fonts::_fontHeight; +int Fonts::_widestChar; uint16 Fonts::_charCount; +byte Fonts::_yOffsets[255]; -void Fonts::init(Common::Platform platform) { +void Fonts::setVm(SherlockEngine *vm) { + _vm = vm; _font = nullptr; - _platform = platform; _charCount = 0; } @@ -52,7 +55,7 @@ void Fonts::setFont(int fontNum) { Common::String fontFilename; - if (_platform != Common::kPlatform3DO) { + if (_vm->getPlatform() != Common::kPlatform3DO) { // PC // use FONT[number].VGS, which is a regular sherlock graphic file fontFilename = Common::String::format("FONT%d.VGS", fontNum + 1); @@ -72,16 +75,32 @@ void Fonts::setFont(int fontNum) { default: error("setFont(): unsupported 3DO font number"); } + // load font data _font = new ImageFile3DO(fontFilename, kImageFile3DOType_Font); } _charCount = _font->size(); - // Iterate through the frames to find the tallest font character - _fontHeight = 0; - for (uint idx = 0; idx < _charCount; ++idx) + // Iterate through the frames to find the widest aand tallest font characters + _fontHeight = _widestChar = 0; + for (uint idx = 0; idx < _charCount; ++idx) { _fontHeight = MAX((uint16)_fontHeight, (*_font)[idx]._frame.h); + _widestChar = MAX((uint16)_widestChar, (*_font)[idx]._frame.w); + } + + // Initialize the Y offset table for the extended character set + for (int idx = 0; idx < 255; ++idx) { + _yOffsets[idx] = 0; + + if (IS_ROSE_TATTOO) { + if ((idx >= 129 && idx < 135) || (idx >= 136 && idx < 143) || (idx >= 147 && idx < 155) || + (idx >= 156 && idx < 165)) + _yOffsets[idx] = 1; + else if ((idx >= 143 && idx < 146) || idx == 165) + _yOffsets[idx] = 2; + } + } } inline byte Fonts::translateChar(byte c) { @@ -123,7 +142,7 @@ void Fonts::writeString(Surface *surface, const Common::String &str, assert(curChar < _charCount); ImageFrame &frame = (*_font)[curChar]; - surface->transBlitFrom(frame, charPos, false, overrideColor); + surface->transBlitFrom(frame, Common::Point(charPos.x, charPos.y + _yOffsets[curChar]), false, overrideColor); charPos.x += frame._frame.w + 1; } } diff --git a/engines/sherlock/fonts.h b/engines/sherlock/fonts.h index 1e47007c54..a527cc73c0 100644 --- a/engines/sherlock/fonts.h +++ b/engines/sherlock/fonts.h @@ -29,16 +29,19 @@ namespace Sherlock { +class SherlockEngine; class ImageFile; class Surface; class Fonts { private: - static Common::Platform _platform; static ImageFile *_font; + static byte _yOffsets[255]; protected: + static SherlockEngine *_vm; static int _fontNumber; static int _fontHeight; + static int _widestChar; static uint16 _charCount; static void writeString(Surface *surface, const Common::String &str, @@ -49,7 +52,7 @@ public: /** * Initialise the font manager */ - static void init(Common::Platform platform); + static void setVm(SherlockEngine *vm); /** * Frees the font manager @@ -86,6 +89,14 @@ public: */ int fontHeight() const { return _fontHeight; } + /** + * Return the width of the widest character in the font + */ + int widestChar() const { return _widestChar; } + + /** + * Return the currently active font number + */ int fontNumber() const { return _fontNumber; } }; diff --git a/engines/sherlock/scalpel/scalpel_map.cpp b/engines/sherlock/scalpel/scalpel_map.cpp index 2177fc5885..efb5e80d0f 100644 --- a/engines/sherlock/scalpel/scalpel_map.cpp +++ b/engines/sherlock/scalpel/scalpel_map.cpp @@ -56,7 +56,7 @@ const byte *MapPaths::getPath(int srcLocation, int destLocation) { /*----------------------------------------------------------------*/ -ScalpelMap::ScalpelMap(SherlockEngine *vm): Map(vm), _topLine(g_system->getWidth(), 12, vm->getPlatform()) { +ScalpelMap::ScalpelMap(SherlockEngine *vm): Map(vm), _topLine(g_system->getWidth(), 12) { _mapCursors = nullptr; _shapes = nullptr; _iconShapes = nullptr; @@ -315,7 +315,7 @@ void ScalpelMap::setupSprites() { _cursorIndex = 0; events.setCursor((*_mapCursors)[_cursorIndex]._frame); - _iconSave.create((*_shapes)[4]._width, (*_shapes)[4]._height, _vm->getPlatform()); + _iconSave.create((*_shapes)[4]._width, (*_shapes)[4]._height); Person &p = people[HOLMES]; p._description = " "; p._type = CHARACTER; diff --git a/engines/sherlock/scalpel/scalpel_user_interface.cpp b/engines/sherlock/scalpel/scalpel_user_interface.cpp index bdb169e707..5ddf2ec07c 100644 --- a/engines/sherlock/scalpel/scalpel_user_interface.cpp +++ b/engines/sherlock/scalpel/scalpel_user_interface.cpp @@ -1235,7 +1235,7 @@ void ScalpelUserInterface::doLookControl() { } else { // Looking at an inventory object // Backup the user interface - Surface tempSurface(SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_HEIGHT - CONTROLS_Y1, _vm->getPlatform()); + Surface tempSurface(SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_HEIGHT - CONTROLS_Y1); tempSurface.blitFrom(screen._backBuffer2, Common::Point(0, 0), Common::Rect(0, CONTROLS_Y1, SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_HEIGHT)); @@ -1803,7 +1803,7 @@ void ScalpelUserInterface::printObjectDesc(const Common::String &str, bool first // If it wasn't a right button click, then we need depress // the look button before we close the window. So save a copy of the // menu area, and draw the controls onto it - Surface tempSurface((*_controls)[0]._frame.w, (*_controls)[0]._frame.h, _vm->getPlatform()); + Surface tempSurface((*_controls)[0]._frame.w, (*_controls)[0]._frame.h); Common::Point pt(MENU_POINTS[0][0], MENU_POINTS[0][1]); offsetButton3DO(pt, 0); @@ -1994,8 +1994,7 @@ void ScalpelUserInterface::summonWindow(bool slideUp, int height) { Screen &screen = *_vm->_screen; // Extract the window that's been drawn on the back buffer - Surface tempSurface(SHERLOCK_SCREEN_WIDTH, - (SHERLOCK_SCREEN_HEIGHT - height), _vm->getPlatform()); + Surface tempSurface(SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_HEIGHT - height); Common::Rect r(0, height, SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_HEIGHT); tempSurface.blitFrom(screen._backBuffer1, Common::Point(0, 0), r); diff --git a/engines/sherlock/scalpel/tsage/logo.cpp b/engines/sherlock/scalpel/tsage/logo.cpp index 9026dd7342..4eab01947a 100644 --- a/engines/sherlock/scalpel/tsage/logo.cpp +++ b/engines/sherlock/scalpel/tsage/logo.cpp @@ -104,7 +104,7 @@ void Visage::surfaceFromRes(ObjectSurface &s) { int frameWidth = _stream->readUint16LE(); int frameHeight = _stream->readUint16LE(); Common::Rect r(0, 0, frameWidth, frameHeight); - s.create(r.width(), r.height(), Common::kPlatformDOS); // maybe change this to a bool later? TODO + s.create(r.width(), r.height()); s._centroid.x = _stream->readSint16LE(); s._centroid.y = _stream->readSint16LE(); diff --git a/engines/sherlock/screen.cpp b/engines/sherlock/screen.cpp index d21343bfc1..fdc10fdf33 100644 --- a/engines/sherlock/screen.cpp +++ b/engines/sherlock/screen.cpp @@ -28,9 +28,9 @@ namespace Sherlock { -Screen::Screen(SherlockEngine *vm) : Surface(g_system->getWidth(), g_system->getHeight(), vm->getPlatform()), _vm(vm), - _backBuffer1(g_system->getWidth(), g_system->getHeight(), vm->getPlatform()), - _backBuffer2(g_system->getWidth(), g_system->getHeight(), vm->getPlatform()), +Screen::Screen(SherlockEngine *vm) : Surface(g_system->getWidth(), g_system->getHeight()), _vm(vm), + _backBuffer1(g_system->getWidth(), g_system->getHeight()), + _backBuffer2(g_system->getWidth(), g_system->getHeight()), _backBuffer(&_backBuffer1) { _transitionSeed = 1; _fadeStyle = false; @@ -39,8 +39,6 @@ Screen::Screen(SherlockEngine *vm) : Surface(g_system->getWidth(), g_system->get Common::fill(&_tMap[0], &_tMap[PALETTE_SIZE], 0); // Set up the initial font - Fonts::init(_vm->getPlatform()); - setFont(IS_SERRATED_SCALPEL ? 1 : 4); // Rose Tattoo specific fields diff --git a/engines/sherlock/sherlock.cpp b/engines/sherlock/sherlock.cpp index fe92ff227f..d1e52f670a 100644 --- a/engines/sherlock/sherlock.cpp +++ b/engines/sherlock/sherlock.cpp @@ -78,10 +78,10 @@ void SherlockEngine::initialize() { DebugMan.addDebugChannel(kDebugLevelMT32Driver, "MT32", "MT32 driver debugging"); DebugMan.addDebugChannel(kDebugLevelMusic, "Music", "Music debugging"); + Fonts::setVm(this); ImageFile::setVm(this); ImageFile3DO::setVm(this); - Object::setVm(this); - Sprite::setVm(this); + BaseObject::setVm(this); if (isDemo()) { Common::File f; diff --git a/engines/sherlock/surface.cpp b/engines/sherlock/surface.cpp index 79711b44d7..60790df6b2 100644 --- a/engines/sherlock/surface.cpp +++ b/engines/sherlock/surface.cpp @@ -28,8 +28,8 @@ namespace Sherlock { -Surface::Surface(uint16 width, uint16 height, Common::Platform platform) : Fonts(), _freePixels(true) { - create(width, height, platform); +Surface::Surface(uint16 width, uint16 height) : Fonts(), _freePixels(true) { + create(width, height); } Surface::Surface() : Fonts(), _freePixels(false) { @@ -40,11 +40,11 @@ Surface::~Surface() { _surface.free(); } -void Surface::create(uint16 width, uint16 height, Common::Platform platform) { +void Surface::create(uint16 width, uint16 height) { if (_freePixels) _surface.free(); - if (platform == Common::kPlatform3DO) { + if (_vm->getPlatform() == Common::kPlatform3DO) { _surface.create(width, height, Graphics::PixelFormat(2, 5, 6, 5, 0, 11, 5, 0, 0)); } else { _surface.create(width, height, Graphics::PixelFormat::createFormatCLUT8()); diff --git a/engines/sherlock/surface.h b/engines/sherlock/surface.h index adda03dcc6..80cf0ff287 100644 --- a/engines/sherlock/surface.h +++ b/engines/sherlock/surface.h @@ -70,7 +70,7 @@ protected: virtual void addDirtyRect(const Common::Rect &r) {} public: - Surface(uint16 width, uint16 height, Common::Platform platform); + Surface(uint16 width, uint16 height); Surface(); virtual ~Surface(); @@ -78,7 +78,7 @@ public: * Sets up an internal surface with the specified dimensions that will be automatically freed * when the surface object is destroyed */ - void create(uint16 width, uint16 height, Common::Platform platform); + void create(uint16 width, uint16 height); Graphics::PixelFormat getPixelFormat(); diff --git a/engines/sherlock/tattoo/tattoo_map.cpp b/engines/sherlock/tattoo/tattoo_map.cpp index 3be97c8b84..b4ce767976 100644 --- a/engines/sherlock/tattoo/tattoo_map.cpp +++ b/engines/sherlock/tattoo/tattoo_map.cpp @@ -105,7 +105,7 @@ int TattooMap::show() { // Load the map image and draw it to the back buffer ImageFile *map = new ImageFile("map.vgs"); - screen._backBuffer1.create(SHERLOCK_SCREEN_WIDTH * 2, SHERLOCK_SCREEN_HEIGHT * 2, _vm->getPlatform()); + screen._backBuffer1.create(SHERLOCK_SCREEN_WIDTH * 2, SHERLOCK_SCREEN_HEIGHT * 2); screen._backBuffer1.blitFrom((*map)[0], Common::Point(0, 0)); delete map; @@ -114,7 +114,7 @@ int TattooMap::show() { drawMapIcons(); // Copy the map drawn in the back buffer to the secondary back buffer - screen._backBuffer2.create(SHERLOCK_SCREEN_WIDTH * 2, SHERLOCK_SCREEN_HEIGHT * 2, _vm->getPlatform()); + screen._backBuffer2.create(SHERLOCK_SCREEN_WIDTH * 2, SHERLOCK_SCREEN_HEIGHT * 2); screen._backBuffer2.blitFrom(screen._backBuffer1); // Display the built map to the screen @@ -231,8 +231,8 @@ int TattooMap::show() { _textBuffer = nullptr; // Reset the back buffers back to standard size - screen._backBuffer1.create(SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_HEIGHT, _vm->getPlatform()); - screen._backBuffer2.create(SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_HEIGHT, _vm->getPlatform()); + screen._backBuffer1.create(SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_HEIGHT); + screen._backBuffer2.create(SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_HEIGHT); return result; } @@ -391,7 +391,7 @@ void TattooMap::checkMapNames(bool slamIt) { delete _textBuffer; // Allocate a new surface - _textBuffer = new Surface(width, height, _vm->getPlatform()); + _textBuffer = new Surface(width, height); _textBuffer->fillRect(Common::Rect(0, 0, width, height), TRANSPARENCY); if (space == nullptr) { diff --git a/engines/sherlock/tattoo/widget_tooltip.cpp b/engines/sherlock/tattoo/widget_tooltip.cpp index 7d513b7af7..b5016bec75 100644 --- a/engines/sherlock/tattoo/widget_tooltip.cpp +++ b/engines/sherlock/tattoo/widget_tooltip.cpp @@ -111,7 +111,7 @@ void WidgetTooltip::execute() { } // Reallocate the text surface with the new size - _surface.create(width, height, _vm->getPlatform()); + _surface.create(width, height); _surface.fill(TRANSPARENCY); if (line2.empty()) { |