@@ -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);
0 commit comments