mirror of
https://github.com/libretro/scummvm.git
synced 2024-12-17 07:07:10 +00:00
CHEWY: Implement initial sprite drawing, font loading and text drawing
This commit is contained in:
parent
8c7c42d13d
commit
88f3fc0760
@ -86,6 +86,9 @@ Common::Error ChewyEngine::run() {
|
||||
|
||||
//_graphics->playVideo(0);
|
||||
_graphics->drawImage("episode1.tgp", 0);
|
||||
_graphics->drawSprite("det1.taf", 0, 200, 100);
|
||||
_graphics->loadFont("6x8.tff");
|
||||
_graphics->drawText("This is a test", 200, 80);
|
||||
_graphics->showCursor();
|
||||
_graphics->setCursor(0);
|
||||
//_sound->playSpeech(1);
|
||||
|
@ -24,6 +24,7 @@
|
||||
#include "common/events.h"
|
||||
#include "graphics/cursorman.h"
|
||||
#include "graphics/palette.h"
|
||||
#include "graphics/surface.h"
|
||||
|
||||
#include "chewy/graphics.h"
|
||||
#include "chewy/resource.h"
|
||||
@ -53,12 +54,26 @@ Graphics::Graphics(ChewyEngine *vm) : _vm(vm) {
|
||||
_curCursor = 0;
|
||||
_curCursorFrame = 0;
|
||||
_cursorSprites = new SpriteResource("cursor.taf");
|
||||
_font = nullptr;
|
||||
}
|
||||
|
||||
Graphics::~Graphics() {
|
||||
delete _font;
|
||||
delete _cursorSprites;
|
||||
}
|
||||
|
||||
void Graphics::drawSprite(Common::String filename, int spriteNum, uint x, uint y) {
|
||||
SpriteResource *res = new SpriteResource(filename);
|
||||
TAFChunk *sprite = res->getSprite(spriteNum);
|
||||
|
||||
drawTransparent(x, y, sprite->data, sprite->width, sprite->height, 0);
|
||||
g_system->updateScreen();
|
||||
|
||||
delete[] sprite->data;
|
||||
delete sprite;
|
||||
delete res;
|
||||
}
|
||||
|
||||
void Graphics::drawImage(Common::String filename, int imageNum) {
|
||||
BackgroundResource *res = new BackgroundResource(filename);
|
||||
TBFChunk *image = res->getImage(imageNum);
|
||||
@ -72,6 +87,32 @@ void Graphics::drawImage(Common::String filename, int imageNum) {
|
||||
delete res;
|
||||
}
|
||||
|
||||
void Graphics::loadFont(Common::String filename) {
|
||||
_font = new Font(filename);
|
||||
}
|
||||
|
||||
void Graphics::drawTransparent(uint16 x, uint16 y, byte *data, uint16 width, uint16 height, byte transparentColor) {
|
||||
::Graphics::Surface *screen = g_system->lockScreen();
|
||||
for (uint textX = 0; textX < width; textX++) {
|
||||
for (uint textY = 0; textY < height; textY++) {
|
||||
byte *src = data + (textY * width) + textX;
|
||||
byte *dst = (byte *)screen->getBasePtr(textX + x, textY + y);
|
||||
if (*src != transparentColor)
|
||||
*dst = *src;
|
||||
}
|
||||
}
|
||||
g_system->unlockScreen();
|
||||
}
|
||||
|
||||
void Graphics::drawText(Common::String text, uint x, uint y) {
|
||||
::Graphics::Surface *textSurface = _font->getLine(text);
|
||||
|
||||
drawTransparent(x, y, (byte *)textSurface->getPixels(), textSurface->pitch, textSurface->h, 0xFF);
|
||||
|
||||
textSurface->free();
|
||||
delete textSurface;
|
||||
}
|
||||
|
||||
void Graphics::playVideo(uint num) {
|
||||
CfoDecoder *cfoDecoder = new CfoDecoder(_vm->_mixer);
|
||||
VideoResource *videoResource = new VideoResource("cut.tap");
|
||||
|
@ -28,6 +28,7 @@
|
||||
namespace Chewy {
|
||||
|
||||
class SpriteResource;
|
||||
class Font;
|
||||
|
||||
class Graphics {
|
||||
public:
|
||||
@ -35,7 +36,11 @@ public:
|
||||
virtual ~Graphics();
|
||||
|
||||
void drawImage(Common::String filename, int imageNum);
|
||||
void drawSprite(Common::String filename, int spriteNum, uint x, uint y);
|
||||
void playVideo(uint num);
|
||||
void loadFont(Common::String filename);
|
||||
void drawText(Common::String text, uint x, uint y);
|
||||
|
||||
void setCursor(uint num, bool newCursor = true);
|
||||
void showCursor();
|
||||
void hideCursor();
|
||||
@ -43,11 +48,14 @@ public:
|
||||
void nextCursor();
|
||||
|
||||
private:
|
||||
void drawTransparent(uint16 x, uint16 y, byte *data, uint16 width, uint16 height, byte transparentColor);
|
||||
|
||||
ChewyEngine *_vm;
|
||||
|
||||
uint _curCursor;
|
||||
uint _curCursorFrame;
|
||||
SpriteResource *_cursorSprites;
|
||||
Font *_font;
|
||||
};
|
||||
|
||||
} // End of namespace Chewy
|
||||
|
@ -21,9 +21,12 @@
|
||||
*/
|
||||
|
||||
#include "common/debug.h"
|
||||
#include "common/rect.h"
|
||||
#include "common/stream.h"
|
||||
#include "common/substream.h"
|
||||
#include "common/textconsole.h"
|
||||
#include "graphics/pixelformat.h"
|
||||
#include "graphics/surface.h"
|
||||
|
||||
#include "chewy/chewy.h"
|
||||
#include "chewy/resource.h"
|
||||
@ -34,13 +37,11 @@ namespace Chewy {
|
||||
// ======================
|
||||
// back/episode1.gep
|
||||
// cut/blende.rnd
|
||||
// misc/*.taf, room/*.taf
|
||||
// misc/exit.eib
|
||||
// misc/inventar.iib
|
||||
// misc/inventar.sib
|
||||
// room/csp.int
|
||||
// room/test.rdi
|
||||
// txt/*.tff
|
||||
// txt/*.tap
|
||||
// txt/diah.adh
|
||||
// txt/inv_st.s and txt/room_st.s
|
||||
@ -323,4 +324,62 @@ Common::SeekableReadStream *VideoResource::getVideoStream(uint num) {
|
||||
return new Common::SeekableSubReadStream(&_stream, chunk->pos, chunk->pos + chunk->size);
|
||||
}
|
||||
|
||||
Font::Font(Common::String filename) {
|
||||
const uint32 headerFont = MKTAG('T', 'F', 'F', '\0');
|
||||
Common::File stream;
|
||||
|
||||
stream.open(filename);
|
||||
|
||||
uint32 header = stream.readUint32BE();
|
||||
|
||||
if (header != headerFont)
|
||||
error("Invalid resource - %s", filename.c_str());
|
||||
|
||||
stream.skip(4); // total memory
|
||||
_count = stream.readUint16LE();
|
||||
_first = stream.readUint16LE();
|
||||
_last = stream.readUint16LE();
|
||||
_width = stream.readUint16LE();
|
||||
_height = stream.readUint16LE();
|
||||
|
||||
_fontSurface.create(_width * _count, _height, ::Graphics::PixelFormat::createFormatCLUT8());
|
||||
|
||||
byte cur;
|
||||
int bitIndex = 7;
|
||||
byte *p;
|
||||
|
||||
cur = stream.readByte();
|
||||
|
||||
for (uint n = 0; n < _count; n++) {
|
||||
for (uint y = 0; y < _height; y++) {
|
||||
for (uint x = n * _width; x < n * _width + _width; x++) {
|
||||
p = (byte *)_fontSurface.getBasePtr(x, y);
|
||||
*p = (cur & (1 << bitIndex)) ? 0 : 0xFF;
|
||||
|
||||
bitIndex--;
|
||||
if (bitIndex < 0) {
|
||||
bitIndex = 7;
|
||||
cur = stream.readByte();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Font::~Font() {
|
||||
_fontSurface.free();
|
||||
}
|
||||
|
||||
::Graphics::Surface *Font::getLine(Common::String text) {
|
||||
::Graphics::Surface *line = new ::Graphics::Surface();
|
||||
line->create(text.size() * _width, _height, ::Graphics::PixelFormat::createFormatCLUT8());
|
||||
|
||||
for (uint i = 0; i < text.size(); i++) {
|
||||
int c = text[i];
|
||||
line->copyRectToSurface(_fontSurface, i * _width, 0, Common::Rect((c - _first) * _width, 0, (c - _first) * _width + _width, _height));
|
||||
}
|
||||
|
||||
return line;
|
||||
}
|
||||
|
||||
} // End of namespace Chewy
|
||||
|
@ -32,6 +32,7 @@
|
||||
#include "common/hash-str.h"
|
||||
#include "common/random.h"
|
||||
#include "common/stream.h"
|
||||
#include "graphics/surface.h"
|
||||
|
||||
namespace Chewy {
|
||||
|
||||
@ -185,6 +186,19 @@ public:
|
||||
Common::SeekableReadStream *getVideoStream(uint num);
|
||||
};
|
||||
|
||||
class Font {
|
||||
public:
|
||||
Font(Common::String filename);
|
||||
virtual ~Font();
|
||||
|
||||
::Graphics::Surface *getLine(Common::String text);
|
||||
|
||||
private:
|
||||
uint16 _count, _first, _last, _width, _height;
|
||||
|
||||
::Graphics::Surface _fontSurface;
|
||||
};
|
||||
|
||||
} // End of namespace Chewy
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user