#pragma once #include "stdafx.h" #include "DrawCommand.h" class DrawStringCommand : public DrawCommand { private: int _x, _y, _color, _backColor; string _text; //Taken from FCEUX's LUA code const int _tabSpace = 4; const uint8_t _font[792] = { 6, 0, 0, 0, 0, 0, 0, 0, // 0x20 - Spacebar 3, 64, 64, 64, 64, 64, 0, 64, 5, 80, 80, 80, 0, 0, 0, 0, 6, 80, 80,248, 80,248, 80, 80, 6, 32,120,160,112, 40,240, 32, 6, 64,168, 80, 32, 80,168, 16, 6, 96,144,160, 64,168,144,104, 3, 64, 64, 0, 0, 0, 0, 0, 4, 32, 64, 64, 64, 64, 64, 32, 4, 64, 32, 32, 32, 32, 32, 64, 6, 0, 80, 32,248, 32, 80, 0, 6, 0, 32, 32,248, 32, 32, 0, 3, 0, 0, 0, 0, 0, 64,128, 5, 0, 0, 0,240, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 64, 5, 16, 16, 32, 32, 32, 64, 64, 6,112,136,136,136,136,136,112, // 0x30 - 0 6, 32, 96, 32, 32, 32, 32, 32, 6,112,136, 8, 48, 64,128,248, 6,112,136, 8, 48, 8,136,112, 6, 16, 48, 80,144,248, 16, 16, 6,248,128,128,240, 8, 8,240, 6, 48, 64,128,240,136,136,112, 6,248, 8, 16, 16, 32, 32, 32, 6,112,136,136,112,136,136,112, 6,112,136,136,120, 8, 16, 96, 3, 0, 0, 64, 0, 0, 64, 0, 3, 0, 0, 64, 0, 0, 64,128, 4, 0, 32, 64,128, 64, 32, 0, 5, 0, 0,240, 0,240, 0, 0, 4, 0,128, 64, 32, 64,128, 0, 6,112,136, 8, 16, 32, 0, 32, // 0x3F - ? 6,112,136,136,184,176,128,112, // 0x40 - @ 6,112,136,136,248,136,136,136, // 0x41 - A 6,240,136,136,240,136,136,240, 6,112,136,128,128,128,136,112, 6,224,144,136,136,136,144,224, 6,248,128,128,240,128,128,248, 6,248,128,128,240,128,128,128, 6,112,136,128,184,136,136,120, 6,136,136,136,248,136,136,136, 4,224, 64, 64, 64, 64, 64,224, 6, 8, 8, 8, 8, 8,136,112, 6,136,144,160,192,160,144,136, 6,128,128,128,128,128,128,248, 6,136,216,168,168,136,136,136, 6,136,136,200,168,152,136,136, 7, 48, 72,132,132,132, 72, 48, 6,240,136,136,240,128,128,128, 6,112,136,136,136,168,144,104, 6,240,136,136,240,144,136,136, 6,112,136,128,112, 8,136,112, 6,248, 32, 32, 32, 32, 32, 32, 6,136,136,136,136,136,136,112, 6,136,136,136, 80, 80, 32, 32, 6,136,136,136,136,168,168, 80, 6,136,136, 80, 32, 80,136,136, 6,136,136, 80, 32, 32, 32, 32, 6,248, 8, 16, 32, 64,128,248, 3,192,128,128,128,128,128,192, 5, 64, 64, 32, 32, 32, 16, 16, 3,192, 64, 64, 64, 64, 64,192, 4, 64,160, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0,248, 3,128, 64, 0, 0, 0, 0, 0, 5, 0, 0, 96, 16,112,144,112, // 0x61 - a 5,128,128,224,144,144,144,224, 5, 0, 0,112,128,128,128,112, 5, 16, 16,112,144,144,144,112, 5, 0, 0, 96,144,240,128,112, 5, 48, 64,224, 64, 64, 64, 64, 5, 0,112,144,144,112, 16,224, 5,128,128,224,144,144,144,144, 2,128, 0,128,128,128,128,128, 4, 32, 0, 32, 32, 32, 32,192, 5,128,128,144,160,192,160,144, 2,128,128,128,128,128,128,128, 6, 0, 0,208,168,168,168,168, 5, 0, 0,224,144,144,144,144, 5, 0, 0, 96,144,144,144, 96, 5, 0,224,144,144,224,128,128, 5, 0,112,144,144,112, 16, 16, 5, 0, 0,176,192,128,128,128, 5, 0, 0,112,128, 96, 16,224, 4, 64, 64,224, 64, 64, 64, 32, 5, 0, 0,144,144,144,144,112, 5, 0, 0,144,144,144,160,192, 6, 0, 0,136,136,168,168, 80, 5, 0, 0,144,144, 96,144,144, 5, 0,144,144,144,112, 16, 96, 5, 0, 0,240, 32, 64,128,240, 4, 32, 64, 64,128, 64, 64, 32, 3, 64, 64, 64, 64, 64, 64, 64, 4,128, 64, 64, 32, 64, 64,128, 6, 0,104,176, 0, 0, 0, 0 }; int GetCharNumber(char ch) { ch -= 32; return (ch < 0 || ch > 98) ? 0 : ch; } int GetCharWidth(char ch) { return _font[GetCharNumber(ch) * 8]; } protected: void InternalDraw() { int startX = (int)(_x * _xScale / _yScale); int x = startX; int y = _y; for(char c : _text) { if(c == '\n') { x = startX; y += 9; } else if(c == '\t') { x += (_tabSpace - (((x - startX) / 8) % _tabSpace)) * 8; } else { int ch = GetCharNumber(c); int width = GetCharWidth(c); int rowOffset = (c == 'y' || c == 'g' || c == 'p' || c == 'q') ? 1 : 0; for(int j = 0; j < 8; j++) { uint8_t rowData = ((j == 7 && rowOffset == 0) || (j == 0 && rowOffset == 1)) ? 0 : _font[ch * 8 + 1 + j - rowOffset]; for(int i = 0; i < width; i++) { int drawFg = (rowData >> (7 - i)) & 0x01; DrawPixel(x + i, y + j, drawFg ? _color : _backColor); } } for(int i = 0; i < width; i++) { DrawPixel(x + i, y - 1, _backColor); } x += width; } } } public: DrawStringCommand(int x, int y, string text, int color, int backColor, int frameCount, int startFrame) : DrawCommand(startFrame, frameCount, true), _x(x), _y(y), _color(color), _backColor(backColor), _text(text) { //Invert alpha byte - 0 = opaque, 255 = transparent (this way, no need to specifiy alpha channel all the time) _color = (~color & 0xFF000000) | (color & 0xFFFFFF); _backColor = (~backColor & 0xFF000000) | (backColor & 0xFFFFFF); } };