mirror of
https://gitlab.com/niansa/llama_nds.git
synced 2025-03-06 20:53:28 +01:00
Make sure enough characters can be rendered using pixel budget
This commit is contained in:
parent
42723347f1
commit
c17cc85aed
2 changed files with 31 additions and 25 deletions
50
NDSUI.cpp
50
NDSUI.cpp
|
@ -7,7 +7,7 @@
|
|||
#include <nds/touch.h>
|
||||
#include <nds/input.h>
|
||||
|
||||
#define SCREEN_BORDER_PADDING 4
|
||||
#define SCREEN_BORDER_PADDING 8
|
||||
#define FONT_PADDING 1
|
||||
#define INPUT_LINE_HEIGHT (FONT_HEIGHT+FONT_PADDING)
|
||||
|
||||
|
@ -18,7 +18,7 @@ NDSUI *NDSUI::currentInstance;
|
|||
|
||||
consteval
|
||||
unsigned NDSUI::calcMaxCharsInLine(unsigned int width) {
|
||||
return width / (FONT_WIDTH + FONT_PADDING);
|
||||
return width / (FONT_WIDTH + FONT_PADDING) - 1;
|
||||
}
|
||||
consteval
|
||||
unsigned NDSUI::calcMaxLinesInRow(unsigned height) {
|
||||
|
@ -44,8 +44,17 @@ void NDSUI::renderMessageLog() {
|
|||
|
||||
// Log messages renderer
|
||||
auto renderLine = [this, y = int(boxDims.bottomRight.y - FONT_PADDING - FONT_HEIGHT), boxDims] (std::string_view line) mutable {
|
||||
print(line, {boxDims.topLeft.x + FONT_PADDING, unsigned(y)}, RGB15(28, 28, 28));
|
||||
y -= FONT_PADDING + FONT_HEIGHT;
|
||||
// Skip empty lines
|
||||
if (line.empty()) return;
|
||||
// Check if line is bold
|
||||
bool bold = line[0] == '\t';
|
||||
if (bold) {
|
||||
line = {line.data()+1, line.size()-1};
|
||||
}
|
||||
// Print line itself
|
||||
print(line, {boxDims.topLeft.x + FONT_PADDING, unsigned(y)}, RGB15(28, 28, 28), bold);
|
||||
// Go to next line
|
||||
y -= FONT_PADDING * 3 + FONT_HEIGHT;
|
||||
if (y < 0) {
|
||||
throw std::exception(); // Stop rendering any more lines
|
||||
}
|
||||
|
@ -89,11 +98,12 @@ void NDSUI::renderInputLine() {
|
|||
print(&inputLineBuf[startIdx], textTopLeft, RGB15(28, 28, 28));
|
||||
}
|
||||
|
||||
bool NDSUI::printChar(const char character, Position2D *topleftpos, const int color) {
|
||||
bool NDSUI::printChar(const char character, Position2D *topleftpos, const int color, bool bold) {
|
||||
const bool *fontChar = font_get_character(character);
|
||||
int x = 0;
|
||||
int y = 0;
|
||||
unsigned no = 0;
|
||||
unsigned row = 0;
|
||||
unsigned x_start = 0;
|
||||
for (const bool *thispixel = fontChar; ; thispixel++) {
|
||||
if (x == FONT_WIDTH) {
|
||||
x = 0;
|
||||
|
@ -101,27 +111,23 @@ bool NDSUI::printChar(const char character, Position2D *topleftpos, const int co
|
|||
} if (y == FONT_HEIGHT) {
|
||||
break;
|
||||
} if (*thispixel) {
|
||||
// Calculate spareout
|
||||
unsigned spareout = font_pixels / 500;
|
||||
// Skip pixel for spareout
|
||||
if (!(no++ % spareout)) {
|
||||
// Draw pixel with melonDS fallback for debug builds
|
||||
# ifdef NDEBUG
|
||||
glPutPixel(topleftpos->x + x, topleftpos->y + y, color);
|
||||
# else
|
||||
glBoxFilled(topleftpos->x + x, topleftpos->y + y, topleftpos->x + x, topleftpos->y + y, color);
|
||||
# endif
|
||||
font_pixels++;
|
||||
if (row == 0) x_start = x;
|
||||
row++;
|
||||
} else if (row) {
|
||||
if (currentFontBoxCount < 125 || row > 2 || (y % 3)) {
|
||||
glBoxFilled(topleftpos->x + x_start, topleftpos->y + y, topleftpos->x + x - (!bold)*1, topleftpos->y + y, color);
|
||||
currentFontBoxCount++;
|
||||
}
|
||||
row = 0;
|
||||
}
|
||||
x++;
|
||||
++x;
|
||||
}
|
||||
return fontChar != fontBitmapUnk;
|
||||
}
|
||||
|
||||
void NDSUI::print(std::string_view str, Position2D topleftpos, const int color) {
|
||||
void NDSUI::print(std::string_view str, Position2D topleftpos, const int color, bool bold) {
|
||||
for (const char c : str) {
|
||||
printChar(c, &topleftpos, color);
|
||||
printChar(c, &topleftpos, color, bold);
|
||||
topleftpos.x += FONT_WIDTH + FONT_PADDING;
|
||||
}
|
||||
}
|
||||
|
@ -164,7 +170,7 @@ NDSUI::NDSUI() {
|
|||
|
||||
void NDSUI::run() {
|
||||
currentInstance = this;
|
||||
font_pixels = 0;
|
||||
currentFontBoxCount = 0;
|
||||
// Update keyboard
|
||||
keyboardUpdate();
|
||||
// Draw
|
||||
|
@ -179,7 +185,7 @@ void NDSUI::run() {
|
|||
|
||||
LineWrappedString NDSUI::createLogMessage(const char *username, std::string_view message) {
|
||||
// Do line-wrapping, create and return Message instance
|
||||
return LineWrappedString(" "+std::string(username)+"\n"+std::string(message)+"\n", calcMaxCharsInLine(calcMessageLogDimensions().width()));
|
||||
return LineWrappedString("\t "+std::string(username)+"\n"+std::string(message)+"\n", calcMaxCharsInLine(calcMessageLogDimensions().width()));
|
||||
}
|
||||
|
||||
void LineWrappedString::split(std::string_view str, unsigned maxCharsPerLine) {
|
||||
|
|
|
@ -61,7 +61,7 @@ class NDSUI {
|
|||
unsigned inputLineBufHead = 0;
|
||||
std::vector<LineWrappedString> messages;
|
||||
std::unique_ptr<basiccoro::SingleEvent<std::string>> userInputHandler = nullptr;
|
||||
size_t font_pixels;
|
||||
unsigned currentFontBoxCount;
|
||||
|
||||
static void kbCallback(int key);
|
||||
|
||||
|
@ -78,8 +78,8 @@ class NDSUI {
|
|||
static consteval
|
||||
unsigned calcMaxLinesInRow(unsigned height);
|
||||
|
||||
bool printChar(const char character, Position2D *topleftpos, const int color);
|
||||
void print(std::string_view str, Position2D topleftpos, const int color);
|
||||
bool printChar(const char character, Position2D *topleftpos, const int color, bool bold = false);
|
||||
void print(std::string_view str, Position2D topleftpos, const int color, bool bold = false);
|
||||
|
||||
void handleInput(char);
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue