172 lines
5.1 KiB
C++
172 lines
5.1 KiB
C++
#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);
|
|
}
|
|
};
|