mirror of
https://github.com/libretro/scummvm.git
synced 2025-01-26 04:35:16 +00:00
7f4cda6622
reported by Crilith. To elaborate a bit, the engine no longer accesses resource data through packed structs. Instead it uses memory streams and the READ/WRITE functions. If data is mainly read, not written, I have replaced the old struct with a new one with a read() function to read the whole thing from memory into the struct's variables, and a write() function to dump the struct's variables to memory. In fact, most of these write() functions remain unused. If data is both read and written, I have replaced the struct with a class with individual get/set functions to replace the old variables. This manipulates memory directly. Since I'm fairly sure that these structs are frequently stored as local variables for a script, all script variables (both local and global) are stored as little-endian and accessed through the READ/WRITE functions, rather than being treated as arrays of 32-bit integers. On a positive note, the functions for doing endian conversion of resources and save games have been removed, and some general cleanups have been made to assist in the rewrite. Initial reports indicate that this patch indeed fixes alignment issues, and that I have not - surprisingly - broken the game on big-endian platforms. At least not in any immediately obvious way. And there's still plenty of time to fix regressions before 0.9.0, too. svn-id: r19366
119 lines
3.4 KiB
C++
119 lines
3.4 KiB
C++
/* Copyright (C) 1994-1998 Revolution Software Ltd.
|
|
* Copyright (C) 2003-2005 The ScummVM project
|
|
*
|
|
* 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.
|
|
*
|
|
* $Header$
|
|
*/
|
|
|
|
#ifndef _MAKETEXT_H
|
|
#define _MAKETEXT_H
|
|
|
|
#include "sword2/debug.h"
|
|
|
|
namespace Sword2 {
|
|
|
|
// Output colour for character border - should be be black but note that we
|
|
// have to use a different pen number during sequences
|
|
|
|
#define BORDER_PEN 194
|
|
|
|
// Usually the only texts on screen are the subtitles and the mouse-over text,
|
|
// but there can also be a considerable number of debugging messages...
|
|
|
|
#define MAX_text_blocs MAX_DEBUG_TEXTS + 1
|
|
|
|
enum {
|
|
// Doesn't keep the text inside the screen - only for debug text!
|
|
NO_JUSTIFICATION = 0,
|
|
|
|
// These all force text inside the screen edge margin when necessary
|
|
POSITION_AT_CENTRE_OF_BASE = 1,
|
|
POSITION_AT_CENTRE_OF_TOP = 2,
|
|
POSITION_AT_LEFT_OF_TOP = 3,
|
|
POSITION_AT_RIGHT_OF_TOP = 4,
|
|
POSITION_AT_LEFT_OF_BASE = 5,
|
|
POSITION_AT_RIGHT_OF_BASE = 6,
|
|
POSITION_AT_LEFT_OF_CENTRE = 7,
|
|
POSITION_AT_RIGHT_OF_CENTRE = 8
|
|
};
|
|
|
|
enum {
|
|
DEFAULT_TEXT = 0,
|
|
FINNISH_TEXT = 1,
|
|
POLISH_TEXT = 2
|
|
};
|
|
|
|
// Info about the text, used to create the SpriteInfo struct
|
|
|
|
struct TextBloc {
|
|
int16 x;
|
|
int16 y;
|
|
uint16 type;
|
|
byte *text_mem;
|
|
};
|
|
|
|
// Info for each line of words in the output text sprite
|
|
|
|
struct LineInfo {
|
|
uint16 width; // Width in pixels
|
|
uint16 length; // Length in characters
|
|
};
|
|
|
|
class FontRenderer {
|
|
private:
|
|
Sword2Engine *_vm;
|
|
TextBloc _blocList[MAX_text_blocs];
|
|
|
|
// Layout variables - these used to be defines, but now we're dealing
|
|
// with three character sets
|
|
|
|
int8 _lineSpacing; // no. of pixels to separate lines of
|
|
// characters in the output sprite - negative
|
|
// for overlap
|
|
int8 _charSpacing; // no. of pixels to separate characters along
|
|
// each line - negative for overlap
|
|
uint8 _borderPen; // output pen colour of character borders
|
|
|
|
uint16 analyseSentence(byte *sentence, uint16 maxWidth, uint32 fontRes, LineInfo *line);
|
|
byte *buildTextSprite(byte *sentence, uint32 fontRes, uint8 pen, LineInfo *line, uint16 noOfLines);
|
|
uint16 charWidth(byte ch, uint32 fontRes);
|
|
uint16 charHeight(uint32 fontRes);
|
|
byte *findChar(byte ch, byte *charSet);
|
|
void copyChar(byte *charPtr, byte *spritePtr, uint16 spriteWidth, uint8 pen);
|
|
|
|
public:
|
|
FontRenderer(Sword2Engine *vm) : _vm(vm) {
|
|
for (int i = 0; i < MAX_text_blocs; i++)
|
|
_blocList[i].text_mem = NULL;
|
|
}
|
|
|
|
~FontRenderer() {
|
|
for (int i = 0; i < MAX_text_blocs; i++)
|
|
free(_blocList[i].text_mem);
|
|
}
|
|
|
|
byte *makeTextSprite(byte *sentence, uint16 maxWidth, uint8 pen, uint32 fontRes, uint8 border = BORDER_PEN);
|
|
|
|
void killTextBloc(uint32 bloc_number);
|
|
void printTextBlocs();
|
|
|
|
uint32 buildNewBloc(byte *ascii, int16 x, int16 y, uint16 width, uint8 pen, uint32 type, uint32 fontRes, uint8 justification);
|
|
};
|
|
|
|
} // End of namespace Sword2
|
|
|
|
#endif
|