From 89993e128fe15efd16fdf89696682f0e24cb8593 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sun, 24 Aug 2014 23:59:37 -0400 Subject: ACCESS: Split font code into a separate file --- engines/access/access.h | 1 + engines/access/data.cpp | 144 ---------------------------------------- engines/access/data.h | 68 ------------------- engines/access/font.cpp | 169 +++++++++++++++++++++++++++++++++++++++++++++++ engines/access/font.h | 104 +++++++++++++++++++++++++++++ engines/access/module.mk | 1 + 6 files changed, 275 insertions(+), 212 deletions(-) create mode 100644 engines/access/font.cpp create mode 100644 engines/access/font.h (limited to 'engines') diff --git a/engines/access/access.h b/engines/access/access.h index bd1269f3f9..2aa41308c3 100644 --- a/engines/access/access.h +++ b/engines/access/access.h @@ -37,6 +37,7 @@ #include "access/debugger.h" #include "access/events.h" #include "access/files.h" +#include "access/font.h" #include "access/inventory.h" #include "access/player.h" #include "access/room.h" diff --git a/engines/access/data.cpp b/engines/access/data.cpp index a13c6d9a67..0279cd5052 100644 --- a/engines/access/data.cpp +++ b/engines/access/data.cpp @@ -59,148 +59,4 @@ void TimerList::updateTimers() { } } -/*------------------------------------------------------------------------*/ - -byte Font::_fontColors[4]; - -Font::Font() { -} - -Font::~Font() { - for (uint i = 0; i < _chars.size(); ++i) - _chars[i].free(); -} - -void Font::load(const int *fontIndex, const byte *fontData) { - assert(_chars.size() == 0); - int count = fontIndex[0]; - _bitWidth = fontIndex[1]; - _height = fontIndex[2]; - - _chars.resize(count); - - for (int i = 0; i < count; ++i) { - const byte *pData = fontData + fontIndex[i + 3]; - _chars[i].create(*pData++, _height, Graphics::PixelFormat::createFormatCLUT8()); - - for (int y = 0; y < _height; ++y) { - int bitsLeft = 0; - byte srcByte = 0; - byte pixel; - - byte *pDest = (byte *)_chars[i].getBasePtr(0, y); - for (int x = 0; x < _chars[i].w; ++x, ++pDest) { - // Get the pixel - pixel = 0; - for (int pixelCtr = 0; pixelCtr < _bitWidth; ++pixelCtr, --bitsLeft) { - // No bits in current byte left, so get next byte - if (bitsLeft == 0) { - bitsLeft = 8; - srcByte = *pData++; - } - - pixel = (pixel << 1) | (srcByte >> 7); - srcByte <<= 1; - } - - // Write out the pixel - *pDest = pixel; - } - } - } -} - -int Font::charWidth(char c) { - return _chars[c - ' '].w; -} - -int Font::stringWidth(const Common::String &msg) { - int total = 0; - - for (const char *c = msg.c_str(); *c != '\0'; ++c) - total += charWidth(*c); - - return total; -} - -bool Font::getLine(Common::String &s, int maxWidth, Common::String &line, int &width) { - assert(maxWidth > 0); - width = 0; - const char *src = s.c_str(); - char c; - - while ((c = *src) != '\0') { - if (c == '\r') { - // End of line, so return calculated line - line = Common::String(s.c_str(), src - 1); - s = Common::String(src + 1); - return false; - } - - ++src; - width += charWidth(c); - if (width < maxWidth) - continue; - - // Reached maximum allowed size - // If this was the last character of the string, let it go - if (*src == '\0') - break; - - // Work backwards to find space at the start of the current word - // as a point to split the line on - while (src >= s.c_str() && *src != ' ') { - width -= charWidth(*src); - --src; - } - if (src < s.c_str()) - error("Could not fit line"); - - // Split the line around the space - line = Common::String(s.c_str(), src); - s = Common::String(src + 1); - return false; - } - - // Return entire string - line = s; - s = Common::String(); - return true; -} - -void Font::drawString(Graphics::Surface *s, const Common::String &msg, const Common::Point &pt) { - Common::Point currPt = pt; - const char *msgP = msg.c_str(); - - while (*msgP) { - currPt.x += drawChar(s, *msgP, currPt); - ++msgP; - } -} - -int Font::drawChar(Graphics::Surface *s, char c, Common::Point &pt) { - Graphics::Surface &ch = _chars[c - ' ']; - - // Loop through the lines of the character - for (int y = 0; y < ch.h; ++y) { - byte *pSrc = (byte *)ch.getBasePtr(0, y); - byte *pDest = (byte *)s->getBasePtr(pt.x, pt.y + y); - - // Loop through the horizontal pixels of the line - for (int x = 0; x < ch.w; ++x, ++pSrc, ++pDest) { - if (*pSrc != 0) - *pDest = _fontColors[*pSrc]; - } - } - - return ch.w; -} - -/*------------------------------------------------------------------------*/ - -FontManager::FontManager() { - _printMaxX = 0; - Common::fill(&Font::_fontColors[0], &Font::_fontColors[4], 0); -} - } // End of namespace Access diff --git a/engines/access/data.h b/engines/access/data.h index 3238dafa33..1d64a6ff86 100644 --- a/engines/access/data.h +++ b/engines/access/data.h @@ -82,74 +82,6 @@ public: FileIdent _vidSound; }; -struct FontVal { -public: - int _lo, _hi; - - FontVal() { _lo = _hi = 0; } -}; - -class Font { -private: - int _bitWidth; - int _height; - Common::Array _chars; -public: - static byte _fontColors[4]; -public: - Font(); - - ~Font(); - - /** - * Load the given font data - */ - void load(const int *fontIndex, const byte *fontData); - - /** - * Get the width of a given character - */ - int charWidth(char c); - - /** - * Get the width of a given string - */ - int stringWidth(const Common::String &msg); - - /** - * Get a partial string that will fit in a given width - * @param s Source string. Modified to remove line - * @param maxWidth Maximum width allowed - * @param line Output line - * @param width Calculated width of returned line - * @returns True if last line - */ - bool getLine(Common::String &s, int maxWidth, Common::String &line, int &width); - - /** - * Draw a string on a given surface - */ - void drawString(Graphics::Surface *s, const Common::String &msg, const Common::Point &pt); - - /** - * Draw a character on a given surface - */ - int drawChar(Graphics::Surface *s, char c, Common::Point &pt); -}; - -class FontManager { -public: - FontVal _charSet; - FontVal _charFor; - Common::Point _printOrg; - Common::Point _printStart; - int _printMaxX; - Font _font1; - Font _font2; -public: - FontManager(); -}; - } // End of namespace Access #endif /* ACCESS_DATA_H */ diff --git a/engines/access/font.cpp b/engines/access/font.cpp new file mode 100644 index 0000000000..d5ad3b3d24 --- /dev/null +++ b/engines/access/font.cpp @@ -0,0 +1,169 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "access/font.h" + +namespace Access { + +byte Font::_fontColors[4]; + +Font::Font() { +} + +Font::~Font() { + for (uint i = 0; i < _chars.size(); ++i) + _chars[i].free(); +} + +void Font::load(const int *fontIndex, const byte *fontData) { + assert(_chars.size() == 0); + int count = fontIndex[0]; + _bitWidth = fontIndex[1]; + _height = fontIndex[2]; + + _chars.resize(count); + + for (int i = 0; i < count; ++i) { + const byte *pData = fontData + fontIndex[i + 3]; + _chars[i].create(*pData++, _height, Graphics::PixelFormat::createFormatCLUT8()); + + for (int y = 0; y < _height; ++y) { + int bitsLeft = 0; + byte srcByte = 0; + byte pixel; + + byte *pDest = (byte *)_chars[i].getBasePtr(0, y); + for (int x = 0; x < _chars[i].w; ++x, ++pDest) { + // Get the pixel + pixel = 0; + for (int pixelCtr = 0; pixelCtr < _bitWidth; ++pixelCtr, --bitsLeft) { + // No bits in current byte left, so get next byte + if (bitsLeft == 0) { + bitsLeft = 8; + srcByte = *pData++; + } + + pixel = (pixel << 1) | (srcByte >> 7); + srcByte <<= 1; + } + + // Write out the pixel + *pDest = pixel; + } + } + } +} + +int Font::charWidth(char c) { + return _chars[c - ' '].w; +} + +int Font::stringWidth(const Common::String &msg) { + int total = 0; + + for (const char *c = msg.c_str(); *c != '\0'; ++c) + total += charWidth(*c); + + return total; +} + +bool Font::getLine(Common::String &s, int maxWidth, Common::String &line, int &width) { + assert(maxWidth > 0); + width = 0; + const char *src = s.c_str(); + char c; + + while ((c = *src) != '\0') { + if (c == '\r') { + // End of line, so return calculated line + line = Common::String(s.c_str(), src - 1); + s = Common::String(src + 1); + return false; + } + + ++src; + width += charWidth(c); + if (width < maxWidth) + continue; + + // Reached maximum allowed size + // If this was the last character of the string, let it go + if (*src == '\0') + break; + + // Work backwards to find space at the start of the current word + // as a point to split the line on + while (src >= s.c_str() && *src != ' ') { + width -= charWidth(*src); + --src; + } + if (src < s.c_str()) + error("Could not fit line"); + + // Split the line around the space + line = Common::String(s.c_str(), src); + s = Common::String(src + 1); + return false; + } + + // Return entire string + line = s; + s = Common::String(); + return true; +} + +void Font::drawString(Graphics::Surface *s, const Common::String &msg, const Common::Point &pt) { + Common::Point currPt = pt; + const char *msgP = msg.c_str(); + + while (*msgP) { + currPt.x += drawChar(s, *msgP, currPt); + ++msgP; + } +} + +int Font::drawChar(Graphics::Surface *s, char c, Common::Point &pt) { + Graphics::Surface &ch = _chars[c - ' ']; + + // Loop through the lines of the character + for (int y = 0; y < ch.h; ++y) { + byte *pSrc = (byte *)ch.getBasePtr(0, y); + byte *pDest = (byte *)s->getBasePtr(pt.x, pt.y + y); + + // Loop through the horizontal pixels of the line + for (int x = 0; x < ch.w; ++x, ++pSrc, ++pDest) { + if (*pSrc != 0) + *pDest = _fontColors[*pSrc]; + } + } + + return ch.w; +} + +/*------------------------------------------------------------------------*/ + +FontManager::FontManager() { + _printMaxX = 0; + Common::fill(&Font::_fontColors[0], &Font::_fontColors[4], 0); +} + +} // End of namespace Access diff --git a/engines/access/font.h b/engines/access/font.h new file mode 100644 index 0000000000..2c9ffd0f34 --- /dev/null +++ b/engines/access/font.h @@ -0,0 +1,104 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef ACCESS_FONT_H +#define ACCESS_FONT_H + +#include "common/scummsys.h" +#include "common/array.h" +#include "common/rect.h" +#include "access/asurface.h" +#include "access/data.h" + +namespace Access { + +struct FontVal { +public: + int _lo, _hi; + + FontVal() { _lo = _hi = 0; } +}; + +class Font { +private: + int _bitWidth; + int _height; + Common::Array _chars; +public: + static byte _fontColors[4]; +public: + Font(); + + ~Font(); + + /** + * Load the given font data + */ + void load(const int *fontIndex, const byte *fontData); + + /** + * Get the width of a given character + */ + int charWidth(char c); + + /** + * Get the width of a given string + */ + int stringWidth(const Common::String &msg); + + /** + * Get a partial string that will fit in a given width + * @param s Source string. Modified to remove line + * @param maxWidth Maximum width allowed + * @param line Output line + * @param width Calculated width of returned line + * @returns True if last line + */ + bool getLine(Common::String &s, int maxWidth, Common::String &line, int &width); + + /** + * Draw a string on a given surface + */ + void drawString(Graphics::Surface *s, const Common::String &msg, const Common::Point &pt); + + /** + * Draw a character on a given surface + */ + int drawChar(Graphics::Surface *s, char c, Common::Point &pt); +}; + +class FontManager { +public: + FontVal _charSet; + FontVal _charFor; + Common::Point _printOrg; + Common::Point _printStart; + int _printMaxX; + Font _font1; + Font _font2; +public: + FontManager(); +}; + +} // End of namespace Access + +#endif /* ACCESS_FONT_H */ diff --git a/engines/access/module.mk b/engines/access/module.mk index e92c2cc564..b6e73b66bd 100644 --- a/engines/access/module.mk +++ b/engines/access/module.mk @@ -12,6 +12,7 @@ MODULE_OBJS := \ detection.o \ events.o \ files.o \ + font.o \ inventory.o \ player.o \ resources.o \ -- cgit v1.2.3