16 #include "TextEffect.h"
17 #include "TextAlignment.h"
18 #include "TextVerticalAlignment.h"
19 #include <gpu/Batch.h>
20 #include <gpu/Pipeline.h>
22 class Font :
public QObject {
26 using Pointer = std::shared_ptr<Font>;
28 Font(
const QString& family);
30 void read(QIODevice& path);
36 vec2 unitRange { 1.0f };
39 float effectThickness { 0.0f };
41 vec3 effectColor { 0.0f };
43 #if defined(__clang__)
44 __attribute__((unused))
50 gpu::BufferPointer verticesBuffer {
nullptr };
51 gpu::BufferPointer indicesBuffer {
nullptr };
52 gpu::BufferPointer paramsBuffer {
nullptr };
61 TextAlignment alignment { TextAlignment::LEFT };
62 TextVerticalAlignment verticalAlignment { TextVerticalAlignment::TOP };
65 glm::vec2 computeExtent(
const QString& str)
const;
66 float getFontHeight()
const {
return _fontHeight; }
69 DrawProps(
const QString& str,
const glm::vec4& color,
const glm::vec3& effectColor,
const glm::vec2& origin,
const glm::vec2& bounds,
70 float scale,
float effectThickness, TextEffect effect, TextAlignment alignment, TextVerticalAlignment verticalAlignment,
bool unlit,
71 bool forward,
bool mirror,
bool fading) :
72 str(str), color(color), effectColor(effectColor), origin(origin), bounds(bounds), scale(scale), effectThickness(effectThickness),
73 effect(effect), alignment(alignment), verticalAlignment(verticalAlignment), unlit(unlit), forward(forward), mirror(mirror), fading(fading) {}
74 DrawProps(
const QString& str,
const glm::vec4& color,
const glm::vec2& origin,
const glm::vec2& bounds, TextAlignment alignment,
bool forward) :
75 str(str), color(color), origin(origin), bounds(bounds), alignment(alignment), forward(forward) {}
79 glm::vec3 effectColor { glm::vec3(0.0f) };
83 float effectThickness { 0.0f };
84 TextEffect effect { TextEffect::NO_EFFECT };
85 TextAlignment alignment { TextAlignment::LEFT };
86 TextVerticalAlignment verticalAlignment { TextVerticalAlignment::TOP };
94 void drawString(gpu::Batch& batch, DrawInfo& drawInfo,
const DrawProps& props);
96 static Pointer load(
const QString& family);
98 bool isLoaded()
const {
return _loaded; }
101 void handleFontNetworkReply();
104 static Pointer load(
const QString& family, QIODevice& fontFile);
105 QStringList tokenizeForWrapping(
const QString& str)
const;
106 QStringList splitLines(
const QString& str)
const;
107 float computeTokenWidth(
const QString& str)
const;
109 const Glyph& getGlyph(
const QChar& c)
const;
110 void buildVertices(DrawInfo& drawInfo,
const QString& str,
const glm::vec2& origin,
const glm::vec2& bounds,
float scale,
bool enlargeForShadows,
111 TextAlignment alignment, TextVerticalAlignment verticalAlignment);
120 mutable QHash<QChar, Glyph> _glyphs;
125 glm::vec2 _distanceRange { 1.0f };
126 float _fontHeight { 0.0f };
127 float _leading { 0.0f };
128 float _spaceWidth { 0.0f };
130 bool _loaded {
false };
131 bool _needsParamsUpdate {
false };
133 gpu::TexturePointer _texture;
134 gpu::BufferStreamPointer _stream;
136 static std::map<std::tuple<bool, bool, bool, bool, bool>, gpu::PipelinePointer> _pipelines;
137 static gpu::Stream::FormatPointer _format;