Skip to content

Commit e771cc4

Browse files
committed
ft2font: Split layouting from set_text
The former may be used even on PS/PDF backend where nothing is rendered.
1 parent 191d6f0 commit e771cc4

File tree

2 files changed

+33
-21
lines changed

2 files changed

+33
-21
lines changed

src/ft2font.cpp

Lines changed: 30 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -314,27 +314,12 @@ void FT2Font::set_kerning_factor(int factor)
314314
}
315315
}
316316

317-
void FT2Font::set_text(
318-
std::u32string_view text, double angle, FT_Int32 flags, std::vector<double> &xys)
317+
void FT2Font::layout(std::u32string_view text, FT_Int32 flags,
318+
std::set<FT_String*>& glyph_seen_fonts,
319+
std::vector<raqm_glyph_t>& glyphs)
319320
{
320-
FT_Matrix matrix; /* transformation matrix */
321-
322-
angle = angle * (2 * M_PI / 360.0);
323-
324-
// this computes width and height in subpixels so we have to multiply by 64
325-
double cosangle = cos(angle) * 0x10000L;
326-
double sinangle = sin(angle) * 0x10000L;
327-
328-
matrix.xx = (FT_Fixed)cosangle;
329-
matrix.xy = (FT_Fixed)-sinangle;
330-
matrix.yx = (FT_Fixed)sinangle;
331-
matrix.yy = (FT_Fixed)cosangle;
332-
333321
clear();
334322

335-
bbox.xMin = bbox.yMin = 32000;
336-
bbox.xMax = bbox.yMax = -32000;
337-
338323
auto rq = raqm_create();
339324
if (!rq) {
340325
throw std::runtime_error("failed to compute text layout");
@@ -362,7 +347,6 @@ void FT2Font::set_text(
362347
}
363348

364349
std::vector<std::pair<size_t, const FT_Face&>> face_substitutions;
365-
std::set<FT_String*> glyph_seen_fonts;
366350
glyph_seen_fonts.insert(face->family_name);
367351

368352
// Attempt to use fallback fonts if necessary.
@@ -416,9 +400,34 @@ void FT2Font::set_text(
416400
size_t num_glyphs = 0;
417401
auto const& rq_glyphs = raqm_get_glyphs(rq, &num_glyphs);
418402

419-
for (size_t i = 0; i < num_glyphs; i++) {
420-
auto const& rglyph = rq_glyphs[i];
403+
glyphs.resize(num_glyphs);
404+
memcpy(glyphs.data(), rq_glyphs, sizeof(raqm_glyph_t) * num_glyphs);
405+
}
406+
407+
void FT2Font::set_text(
408+
std::u32string_view text, double angle, FT_Int32 flags, std::vector<double> &xys)
409+
{
410+
FT_Matrix matrix; /* transformation matrix */
411+
412+
angle = angle * (2 * M_PI / 360.0);
413+
414+
// this computes width and height in subpixels so we have to multiply by 64
415+
double cosangle = cos(angle) * 0x10000L;
416+
double sinangle = sin(angle) * 0x10000L;
417+
418+
matrix.xx = (FT_Fixed)cosangle;
419+
matrix.xy = (FT_Fixed)-sinangle;
420+
matrix.yx = (FT_Fixed)sinangle;
421+
matrix.yy = (FT_Fixed)cosangle;
422+
423+
bbox.xMin = bbox.yMin = 32000;
424+
bbox.xMax = bbox.yMax = -32000;
425+
426+
std::set<FT_String*> glyph_seen_fonts;
427+
std::vector<raqm_glyph_t> rq_glyphs;
428+
layout(text, flags, glyph_seen_fonts, rq_glyphs);
421429

430+
for (auto const& rglyph : rq_glyphs) {
422431
// Warn for missing glyphs.
423432
if (rglyph.index == 0) {
424433
ft_glyph_warn(text[rglyph.cluster], glyph_seen_fonts);

src/ft2font.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,9 @@ class FT2Font
109109
void set_size(double ptsize, double dpi);
110110
void set_charmap(int i);
111111
void select_charmap(unsigned long i);
112+
void layout(std::u32string_view text, FT_Int32 flags,
113+
std::set<FT_String*>& glyph_seen_fonts,
114+
std::vector<raqm_glyph_t> &glyphs);
112115
void set_text(std::u32string_view codepoints, double angle, FT_Int32 flags,
113116
std::vector<double> &xys);
114117
int get_kerning(FT_UInt left, FT_UInt right, FT_Kerning_Mode mode);

0 commit comments

Comments
 (0)