mirror of
https://github.com/libretro/scummvm.git
synced 2025-01-01 23:18:44 +00:00
bb87d39424
svn-id: r35060
129 lines
3.3 KiB
C++
129 lines
3.3 KiB
C++
/* 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.
|
|
*
|
|
* $URL$
|
|
* $Id$
|
|
*
|
|
*/
|
|
|
|
#include "common/file.h"
|
|
#include "graphics/surface.h"
|
|
|
|
#include "groovie/font.h"
|
|
|
|
namespace Groovie {
|
|
|
|
Font::Font(OSystem *syst) :
|
|
_syst(syst), _sphinxfnt(NULL) {
|
|
|
|
Common::File fontfile;
|
|
if (!fontfile.open("sphinx.fnt")) {
|
|
error("Groovie::Font: Couldn't open sphinx.fnt");
|
|
}
|
|
uint16 fontfilesize = fontfile.size();
|
|
_sphinxfnt = fontfile.readStream(fontfilesize);
|
|
fontfile.close();
|
|
}
|
|
|
|
Font::~Font() {
|
|
delete _sphinxfnt;
|
|
}
|
|
|
|
void Font::printstring(char *messagein) {
|
|
uint16 totalwidth = 0, currxoffset, i;
|
|
|
|
char message[15];
|
|
memset(message, 0, 15);
|
|
|
|
// Clear the top bar
|
|
Common::Rect topbar(640, 80);
|
|
Graphics::Surface *gamescreen;
|
|
gamescreen = _syst->lockScreen();
|
|
gamescreen->fillRect(topbar, 0);
|
|
_syst->unlockScreen();
|
|
|
|
for (i = 0; i < 14; i++) {
|
|
char chartocopy = messagein[i];
|
|
if (chartocopy <= 0x00 || chartocopy == 0x24) {
|
|
break;
|
|
}
|
|
message[i] = chartocopy;
|
|
}
|
|
Common::rtrim(message);
|
|
for (i = 0; i < strlen(message); i++) {
|
|
totalwidth += letterwidth(message[i]);
|
|
}
|
|
currxoffset = (640 - totalwidth) / 2;
|
|
char *currpos = message;
|
|
while (*(currpos) != 0) {
|
|
currxoffset += printletter(*(currpos++), currxoffset);
|
|
}
|
|
}
|
|
|
|
uint16 Font::letteroffset(char letter) {
|
|
uint16 offset;
|
|
offset = letter;
|
|
_sphinxfnt->seek(offset);
|
|
offset = _sphinxfnt->readByte() * 2 + 128;
|
|
_sphinxfnt->seek(offset);
|
|
offset = _sphinxfnt->readUint16LE();
|
|
return offset;
|
|
}
|
|
|
|
uint8 Font::letterwidth(char letter) {
|
|
uint16 offset = letteroffset(letter);
|
|
_sphinxfnt->seek(offset);
|
|
return _sphinxfnt->readByte();
|
|
}
|
|
|
|
uint8 Font::letterheight(char letter) {
|
|
uint16 offset, width, julia, data, counter = 0;
|
|
offset = letteroffset(letter);
|
|
_sphinxfnt->seek(offset);
|
|
width = _sphinxfnt->readByte();
|
|
julia = _sphinxfnt->readByte();
|
|
data = _sphinxfnt->readByte();
|
|
while (data != 0xFF) {
|
|
data = _sphinxfnt->readByte();
|
|
counter++;
|
|
}
|
|
if (counter % width != 0) assert("font file corrupt");
|
|
return counter / width;
|
|
}
|
|
|
|
|
|
uint8 Font::printletter(char letter, uint16 xoffset) {
|
|
uint16 offset, width, height, julia;
|
|
offset = letteroffset(letter);
|
|
height = letterheight(letter);
|
|
_sphinxfnt->seek(offset);
|
|
width = _sphinxfnt->readByte();
|
|
julia = _sphinxfnt->readByte();
|
|
|
|
byte *data = new byte[width * height];
|
|
_sphinxfnt->read(data, width * height);
|
|
_syst->copyRectToScreen(data, width, xoffset, 16, width, height);
|
|
delete data;
|
|
|
|
return width;
|
|
}
|
|
|
|
} // End of Groovie namespace
|