Mesen-SX/Core/DrawStringCommand.h
2020-12-19 23:30:09 +03:00

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);
}
};