18#ifndef TEEUI_LIBTEEUI_FONT_RENDERING_H_
19#define TEEUI_LIBTEEUI_FONT_RENDERING_H_
23#include <freetype/ftglyph.h>
36template <
typename T,
typename Deleter = HandleDelete<T>>
class Handle {
45 other.handle_ =
nullptr;
61 operator bool()
const {
return handle_ !=
nullptr; }
73#define MAP_HANDLE_DELETER(type, deleter) \
74 template <> struct HandleDelete<type> { \
75 void operator()(type h) { deleter(h); } \
118 auto checkAndUpdate = [&](
unsigned long cp) {
120 bool result = prevBreaking == current;
121 prevBreaking = current;
158 FT_Bitmap* bitmap = &
face_->glyph->bitmap;
159 uint8_t* rowBuffer = bitmap->buffer;
161 auto bPos = pos + offset;
162 for (
unsigned y = 0; y < bitmap->rows; ++y) {
163 for (
unsigned x = 0; x < bitmap->width; ++x) {
165 switch (bitmap->pixel_mode) {
166 case FT_PIXEL_MODE_GRAY:
167 alpha = rowBuffer[x];
169 alpha /= bitmap->num_grays;
172 case FT_PIXEL_MODE_LCD:
173 case FT_PIXEL_MODE_BGRA:
174 case FT_PIXEL_MODE_NONE:
175 case FT_PIXEL_MODE_LCD_V:
176 case FT_PIXEL_MODE_MONO:
177 case FT_PIXEL_MODE_GRAY2:
178 case FT_PIXEL_MODE_GRAY4:
182 if (drawPixel(bPos.x().count() + x, bPos.y().count() + y, alpha)) {
186 rowBuffer += bitmap->pitch;
200 static std::tuple<Error, TextContext>
create();
202 template <
typename Buffer>
203 std::tuple<Error, TextFace>
loadFace(
const Buffer&
data,
signed long face_index = 0) {
204 std::tuple<Error, TextFace> result;
205 auto& [rc, tface] = result;
211 if (
error)
return result;
212 tface.face_ =
Handle(face);
213 tface.hasKerning_ = FT_HAS_KERNING(face);
219std::tuple<Error, Box<pxs>, UTF8Range<const char*>>
221 const Box<pxs>& boundingBox);
@ FaceNotLoaded
Definition: error.h:31
@ NotInitialized
Definition: error.h:30
@ OK
Definition: error.h:29
@ OutOfBoundsDrawing
Definition: error.h:37
@ UnsupportedPixelFormat
Definition: error.h:36
Definition: font_rendering.h:36
Handle(T handle)
Definition: font_rendering.h:39
const T operator->() const
Definition: font_rendering.h:63
~Handle()
Definition: font_rendering.h:57
T handle_
Definition: font_rendering.h:67
T operator*() const
Definition: font_rendering.h:62
Handle(const Handle &)=delete
T operator->()
Definition: font_rendering.h:64
Handle & operator=(const Handle &)=delete
Handle()
Definition: font_rendering.h:38
Handle(Handle &&other)
Definition: font_rendering.h:43
Handle & operator=(Handle &&rhs)
Definition: font_rendering.h:48
Definition: font_rendering.h:196
Handle< FT_Library > library_
Definition: font_rendering.h:197
static std::tuple< Error, TextContext > create()
Definition: font_rendering.cpp:122
std::tuple< Error, TextFace > loadFace(const Buffer &data, signed long face_index=0)
Definition: font_rendering.h:203
Definition: font_rendering.h:145
GlyphIndex getCharIndex(unsigned long codePoint)
Definition: font_rendering.cpp:75
Error drawGlyph(const Vec2d< pxs > &pos, const PixelDrawer &drawPixel)
Definition: font_rendering.h:157
bool hasKerning_
Definition: font_rendering.h:148
optional< Box< pxs > > getGlyphBBox() const
Definition: font_rendering.cpp:111
friend TextContext
Definition: font_rendering.h:146
Vec2d< pxs > advance() const
Definition: font_rendering.cpp:96
Error loadGlyph(GlyphIndex index)
Definition: font_rendering.cpp:80
Vec2d< pxs > kern(GlyphIndex previous) const
Definition: font_rendering.cpp:100
Error renderGlyph()
Definition: font_rendering.cpp:88
Error setCharSize(signed long char_size, unsigned int dpi)
Definition: font_rendering.cpp:60
Error setCharSizeInPix(pxs size)
Definition: font_rendering.cpp:67
Handle< FT_Face > face_
Definition: font_rendering.h:147
Definition: utf8range.h:75
Definition: utf8range.h:30
Definition: font_rendering.h:98
bool operator!=(const Iter &rhs) const
Definition: font_rendering.h:135
Iter & operator=(const Iter &rhs)
Definition: font_rendering.h:106
Iter & operator++()
Definition: font_rendering.h:112
Iter(const Iter &rhs)
Definition: font_rendering.h:105
UTF8Iterator begin_
Definition: font_rendering.h:99
UTF8Iterator end_
Definition: font_rendering.h:100
Iter(UTF8Iterator begin, UTF8Iterator end)
Definition: font_rendering.h:104
Iter()
Definition: font_rendering.h:103
UTF8Iterator operator*() const
Definition: font_rendering.h:111
Iter operator++(int)
Definition: font_rendering.h:129
bool operator==(const Iter &rhs) const
Definition: font_rendering.h:134
Definition: font_rendering.h:85
UTF8WordRange & operator=(const UTF8WordRange &)=default
Iter begin() const
Definition: font_rendering.h:137
UTF8WordRange(CharIterator begin, CharIterator end)
Definition: font_rendering.h:89
UTF8WordRange(const UTF8Range< CharIterator > &range)
Definition: font_rendering.h:90
UTF8WordRange(UTF8WordRange &&)=default
UTF8WordRange(const UTF8WordRange &)=default
UTF8WordRange & operator=(UTF8WordRange &&)=default
Iter end() const
Definition: font_rendering.h:138
typename UTF8Range< CharIterator >::Iter UTF8Iterator
Definition: font_rendering.h:97
UTF8Range< CharIterator > range_
Definition: font_rendering.h:86
static const char *const text[]
Definition: ext2_err.c:10
#define error(format, args...)
Definition: fec_private.h:201
char data[Size]
Definition: incremental_server.cpp:1
uint32_t size
Definition: io.h:2
Error drawText(TextFace *face, const UTF8Range< const char * > &text, const PixelDrawer &drawPixel, PxPoint pen)
Definition: font_rendering.cpp:217
Callback< Error(uint32_t, uint32_t, Color)> PixelDrawer
Definition: utils.h:885
bool isNewline(unsigned long codePoint)
Definition: font_rendering.cpp:56
Point< pxs > PxPoint
Definition: utils.h:603
Handle(T handle) -> Handle< T, HandleDelete< T > >
MAP_HANDLE_DELETER(FT_Face, FT_Done_Face)
unsigned int GlyphIndex
Definition: font_rendering.h:143
std::tuple< Error, Box< pxs >, UTF8Range< const char * > > findLongestWordSequence(TextFace *face, const UTF8Range< const char * > &text, const Box< pxs > &boundingBox)
Definition: font_rendering.cpp:135
uint32_t Color
Definition: utils.h:594
bool isBreakable(unsigned long codePoint)
Definition: font_rendering.cpp:22
Definition: font_rendering.h:34