add FontStylesScheme

This commit is contained in:
MihailRis
2024-12-04 18:04:19 +03:00
parent b15725913e
commit ce1e9f76cf
7 changed files with 83 additions and 17 deletions
+42 -10
View File
@@ -1,5 +1,6 @@
#include "Font.hpp" #include "Font.hpp"
#include <limits>
#include <utility> #include <utility>
#include "Texture.hpp" #include "Texture.hpp"
#include "Batch2D.hpp" #include "Batch2D.hpp"
@@ -64,7 +65,7 @@ static inline void draw_glyph(
-0.2f * style.italic, -0.2f * style.italic,
16, 16,
c, c,
batch.getColor() batch.getColor() * style.color
); );
} }
} }
@@ -87,7 +88,7 @@ static inline void draw_glyph(
0.5f, 0.5f,
16, 16,
c, c,
batch.getColor() batch.getColor() * style.color
); );
} }
} }
@@ -100,17 +101,33 @@ static inline void draw_text(
const glm::vec3& pos, const glm::vec3& pos,
const glm::vec3& right, const glm::vec3& right,
const glm::vec3& up, const glm::vec3& up,
float glyphInterval float glyphInterval,
const FontStylesScheme* styles
) { ) {
static FontStylesScheme defStyles {
{{std::numeric_limits<size_t>::max()}},
};
if (styles == nullptr) {
styles = &defStyles;
}
uint page = 0; uint page = 0;
uint next = MAX_CODEPAGES; uint next = MAX_CODEPAGES;
int x = 0; int x = 0;
int y = 0; int y = 0;
FontStyle style {};
do { do {
for (uint c : text){ size_t entryIndex = 0;
int styleCharsCounter = -1;
const FontStyle* style = &styles->palette.at(entryIndex);
for (uint c : text) {
styleCharsCounter++;
if (styleCharsCounter > style->n &&
entryIndex + 1 < styles->palette.size()) {
style = &styles->palette.at(++entryIndex);
styleCharsCounter = -1;
}
if (!font.isPrintableChar(c)) { if (!font.isPrintableChar(c)) {
x++; x++;
continue; continue;
@@ -119,7 +136,14 @@ static inline void draw_text(
if (charpage == page){ if (charpage == page){
batch.texture(font.getPage(charpage)); batch.texture(font.getPage(charpage));
draw_glyph( draw_glyph(
batch, pos, glm::vec2(x, y), c, right, up, glyphInterval, style batch,
pos,
glm::vec2(x, y),
c,
right,
up,
glyphInterval,
*style
); );
} }
else if (charpage > page && charpage < next){ else if (charpage > page && charpage < next){
@@ -145,20 +169,27 @@ const Texture* Font::getPage(int charpage) const {
} }
void Font::draw( void Font::draw(
Batch2D& batch, std::wstring_view text, int x, int y, float scale Batch2D& batch,
std::wstring_view text,
int x,
int y,
const FontStylesScheme* styles,
float scale
) const { ) const {
draw_text( draw_text(
*this, batch, text, *this, batch, text,
glm::vec3(x, y, 0), glm::vec3(x, y, 0),
glm::vec3(glyphInterval*scale, 0, 0), glm::vec3(glyphInterval*scale, 0, 0),
glm::vec3(0, lineHeight*scale, 0), glm::vec3(0, lineHeight*scale, 0),
glyphInterval/static_cast<float>(lineHeight) glyphInterval/static_cast<float>(lineHeight),
styles
); );
} }
void Font::draw( void Font::draw(
Batch3D& batch, Batch3D& batch,
std::wstring_view text, std::wstring_view text,
const FontStylesScheme* styles,
const glm::vec3& pos, const glm::vec3& pos,
const glm::vec3& right, const glm::vec3& right,
const glm::vec3& up const glm::vec3& up
@@ -167,6 +198,7 @@ void Font::draw(
*this, batch, text, pos, *this, batch, text, pos,
right * static_cast<float>(glyphInterval), right * static_cast<float>(glyphInterval),
up * static_cast<float>(lineHeight), up * static_cast<float>(lineHeight),
glyphInterval/static_cast<float>(lineHeight) glyphInterval/static_cast<float>(lineHeight),
styles
); );
} }
+15 -2
View File
@@ -12,11 +12,16 @@ class Batch3D;
class Camera; class Camera;
struct FontStyle { struct FontStyle {
size_t n = -1;
bool bold = false; bool bold = false;
bool italic = false; bool italic = false;
glm::vec4 color {1, 1, 1, 1}; glm::vec4 color {1, 1, 1, 1};
}; };
struct FontStylesScheme {
std::vector<FontStyle> palette;
};
class Font { class Font {
int lineHeight; int lineHeight;
int yoffset; int yoffset;
@@ -45,12 +50,20 @@ public:
/// @brief Check if character is visible (non-whitespace) /// @brief Check if character is visible (non-whitespace)
/// @param codepoint character unicode codepoint /// @param codepoint character unicode codepoint
bool isPrintableChar(uint codepoint) const; bool isPrintableChar(uint codepoint) const;
void draw(Batch2D& batch, std::wstring_view text, int x, int y, float scale=1) const; void draw(
Batch2D& batch,
std::wstring_view text,
int x,
int y,
const FontStylesScheme* styles,
float scale = 1
) const;
void draw( void draw(
Batch3D& batch, Batch3D& batch,
std::wstring_view text, std::wstring_view text,
const FontStylesScheme* styles,
const glm::vec3& pos, const glm::vec3& pos,
const glm::vec3& right={1, 0, 0}, const glm::vec3& right={1, 0, 0},
const glm::vec3& up={0, 1, 0} const glm::vec3& up={0, 1, 0}
+2
View File
@@ -98,11 +98,13 @@ void TextsRenderer::renderNote(
pos + xvec * (width * 0.5f * preset.scale))) { pos + xvec * (width * 0.5f * preset.scale))) {
return; return;
} }
static FontStylesScheme styles {};
auto color = preset.color; auto color = preset.color;
batch.setColor(glm::vec4(color.r, color.g, color.b, color.a * opacity)); batch.setColor(glm::vec4(color.r, color.g, color.b, color.a * opacity));
font.draw( font.draw(
batch, batch,
text, text,
&styles,
pos - xvec * (width * 0.5f) * preset.scale, pos - xvec * (width * 0.5f) * preset.scale,
xvec * preset.scale, xvec * preset.scale,
yvec * preset.scale yvec * preset.scale
+2 -2
View File
@@ -194,9 +194,9 @@ void SlotView::draw(const DrawContext* pctx, Assets* assets) {
int y = pos.y+slotSize-16; int y = pos.y+slotSize-16;
batch->setColor({0, 0, 0, 1.0f}); batch->setColor({0, 0, 0, 1.0f});
font->draw(*batch, text, x+1, y+1); font->draw(*batch, text, x+1, y+1, nullptr);
batch->setColor(glm::vec4(1.0f)); batch->setColor(glm::vec4(1.0f));
font->draw(*batch, text, x, y); font->draw(*batch, text, x, y, nullptr);
} }
} }
+8 -2
View File
@@ -66,6 +66,8 @@ Label::Label(const std::wstring& text, std::string fontName)
cache.update(this->text, multiline, textWrap); cache.update(this->text, multiline, textWrap);
} }
Label::~Label() = default;
glm::vec2 Label::calcSize() { glm::vec2 Label::calcSize() {
auto font = cache.font; auto font = cache.font;
uint lineHeight = font->getLineHeight(); uint lineHeight = font->getLineHeight();
@@ -201,10 +203,10 @@ void Label::draw(const DrawContext* pctx, Assets* assets) {
if (i < cache.lines.size()-1) { if (i < cache.lines.size()-1) {
view = std::wstring_view(text.c_str()+offset, cache.lines.at(i+1).offset-offset); view = std::wstring_view(text.c_str()+offset, cache.lines.at(i+1).offset-offset);
} }
font->draw(*batch, view, pos.x, pos.y + i * totalLineHeight); font->draw(*batch, view, pos.x, pos.y + i * totalLineHeight, styles.get());
} }
} else { } else {
font->draw(*batch, text, pos.x, pos.y); font->draw(*batch, text, pos.x, pos.y, styles.get());
} }
} }
@@ -239,3 +241,7 @@ void Label::setTextWrapping(bool flag) {
bool Label::isTextWrapping() const { bool Label::isTextWrapping() const {
return textWrap; return textWrap;
} }
void Label::setStyles(std::unique_ptr<FontStylesScheme> styles) {
this->styles = std::move(styles);
}
+7
View File
@@ -3,6 +3,7 @@
#include "UINode.hpp" #include "UINode.hpp"
class Font; class Font;
struct FontStylesScheme;
namespace gui { namespace gui {
struct LineScheme { struct LineScheme {
@@ -51,10 +52,14 @@ namespace gui {
/// @brief Auto resize label to fit text /// @brief Auto resize label to fit text
bool autoresize = false; bool autoresize = false;
std::unique_ptr<FontStylesScheme> styles;
public: public:
Label(const std::string& text, std::string fontName="normal"); Label(const std::string& text, std::string fontName="normal");
Label(const std::wstring& text, std::string fontName="normal"); Label(const std::wstring& text, std::string fontName="normal");
virtual ~Label();
virtual void setText(const std::wstring& text); virtual void setText(const std::wstring& text);
const std::wstring& getText() const; const std::wstring& getText() const;
@@ -107,5 +112,7 @@ namespace gui {
virtual void setTextWrapping(bool flag); virtual void setTextWrapping(bool flag);
virtual bool isTextWrapping() const; virtual bool isTextWrapping() const;
virtual void setStyles(std::unique_ptr<FontStylesScheme> styles);
}; };
} }
+7 -1
View File
@@ -47,6 +47,12 @@ void Plotter::draw(const DrawContext* pctx, Assets* assets) {
batch->setColor({1,1,1,0.2f}); batch->setColor({1,1,1,0.2f});
string = util::to_wstring(y / multiplier, 3); string = util::to_wstring(y / multiplier, 3);
} }
font->draw(*batch, string, pos.x+dmwidth+2, pos.y+dmheight-y-labelsInterval); font->draw(
*batch,
string,
pos.x + dmwidth + 2,
pos.y + dmheight - y - labelsInterval,
nullptr
);
} }
} }