diff options
author | Ali Alzyod <ali198724@gmail.com> | 2020-07-06 12:43:40 +0100 |
---|---|---|
committer | Carsten Haitzler (Rasterman) <raster@rasterman.com> | 2020-07-06 12:43:40 +0100 |
commit | 972cd7f62bbfaa03d3b25ea1e8ba643de24cf7b9 (patch) | |
tree | 9e742b7c0fab370172e1eec4f806e044996e5982 | |
parent | e561bb6980e0a5e6c2674b0e380dbbd6a7b62e4d (diff) | |
download | efl-972cd7f62bbfaa03d3b25ea1e8ba643de24cf7b9.tar.gz |
evas_text: lazy loading color glyph images in RAM
Summary:
Lazy loading for glyph images into RAM, instead of caching at layout level we will cache only when rendering.
This may affect speed a bit since color glyphs will be loaded twice before caching (with FT_Load_Glyph)
Try to run test application, and hit `scale font`
** RAM consumption (Accelerated Rendering) **
| Before | After |
|-------:|-------|
| 111.9 | 21.8 |
| 204.8 | 24.4 |
| 298.0 | 26.3 |
| 391.5 | 28.4 |
| 484.8 | 29.9 |
| 578.1 | 31.4 |
| 671.4 | 32.5 |
** RAM consumption (SW Rendering) **
| Before | After |
|-------:|-------|
| 104 | 14.6 |
| 197 | 17 |
| 290 | 19.1 |
| 384 | 21.2 |
| 477 | 22.8 |
| 571 | 24.3 |
| 664 | 25.6 |
Test Plan:
```
#include <Elementary.h>
typedef struct _APP
{
Evas_Object *tb1;
Evas_Object *btnLoad;
} APP;
char *text = "<align=center><color=#4DE0FFFF underline=on underline_color=#4DE0FFFF><a href='tel:1234567890'>1234567890</a></color>๐๐๐๐คฃ๐๐๐
๐๐๐๐๐๐๐๐๐๐โบ๐๐ค๐ค๐๐๐ถ๐๐๐ฃ๐ฅ๐ฎ๐ค๐ฏ๐ช๐ซ๐ด๐๐ค๐๐๐๐คค๐๐๐๐๐๐ค๐ฒโน๐๐๐๐๐ค๐ข๐ญ๐ฆ๐ง๐จ๐ฉ๐ฌ๐ฐ๐ฑ๐ณ๐ต๐ก๐ ๐๐ค ๐คก๐คฅ๐ท๐ค๐ค๐คข๐คงโป๐๐ฟ๐น๐บ๐โ ๐ป๐ฝ๐พ๐ค๐ฉ๐บ๐ธ๐น๐ป๐ผ๐ฝ๐๐ฟ๐พ๐๐๐๐ฆ๐ง๐จ๐ฉ๐ต๐ถ๐ผ๐จโโ๏ธ๐ฉโโ๏ธ๐จโ๐๐ฉโ๐๐จโ๐ซ๐ฉโ๐ซ๐จโโ๐ฉโโ๐จโ๐พ๐ฉโ๐พ๐จโ๐ณ๐ฉโ๐ณ๐จโ๐ง๐ฉโ๐ง๐จโ๐ญ๐ฉโ๐ญ๐จโ๐ผ๐ฉโ๐ผ๐จโ๐ฌ๐ฉโ๐ฌ๐จโ๐ป๐ฉโ๐ป๐จโ๐ค๐ฉโ๐ค๐จโ๐จ๐ฉโ๐จ๐จโโ๏ธ๐ฉโโ๏ธ๐จโ๐๐ฉโ๐๐จโ๐๐ฉโ๐๐ฎโโ๏ธ๐ฎโโ๏ธ๐ต๏ธโโ๏ธ๐ต๏ธโโ๏ธ๐โโ๏ธ๐โโ๏ธ๐ทโโ๏ธ๐ทโโ๏ธ๐ณโโ๏ธ๐ณโโ๏ธ๐ฑโโ๏ธ๐ฑโโ๏ธ๐
๐คถ๐ธ๐คด๐ฐ๐คต๐คฐ๐ฒ๐โโ๏ธ๐โโ๏ธ๐โโ๏ธ๐โโ๏ธ๐
โโ๏ธ๐
โโ๏ธ๐โโ๏ธ๐โโ๏ธ๐โโ๏ธ๐โโ๏ธ๐โโ๏ธ๐โโ๏ธ๐โโ๏ธ๐โโ๏ธ๐คฆโโ๏ธ๐คฆโโ๏ธ๐คทโโ๏ธ๐คทโโ๏ธ๐โโ๏ธ๐โโ๏ธ๐โโ๏ธ๐โโ๏ธ๐ถโโ๏ธ๐ถโโ๏ธ๐โโ๏ธ๐โโ๏ธ๐๐บ๐ฏโโ๏ธ๐ฏโโ๏ธ๐ด๐ฃ๐ค๐ฅ๐ซ๐ฌ๐ญ๐๐๐ช๐จโ๐ฉโ๐ง๐จโ๐ฉโ๐งโ๐ฆ๐จโ๐ฉโ๐ฆโ๐ฆ๐จโ๐ฉโ๐งโ๐ง๐จโ๐ฆ๐จโ๐ฆโ๐ฆ๐จโ๐ง๐จโ๐งโ๐ฆ๐จโ๐งโ๐ง๐ฉโ๐ฆ๐ฉโ๐ฆโ๐ฆ๐ฉโ๐ง๐ฉโ๐งโ๐ฆ๐ฉโ๐งโ๐ง๐ช๐คณ๐๐โ๏ธ๐๐๐โ๐ค๐๐ค๐๐โ๐๐๐โ๐๐ค๐ค๐ค๐๐โ๐๐๐๐ค๐
๐๐๐ฃ๐๐๐
๐๐๐โค๐๐๐๐๐๐๐๐๐๐ค๐๐๐โฃ๐๐ค๐ข๐ฃ๐ฅ๐ฆ๐จ๐ซ๐ฌ๐จ๐ฏ๐ญ๐ณ๐๐ถ๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐ ๐ก๐ข๐๐๐ฉ๐โ๐ฟ๐๐๐๐ต๐๐ฆ๐ถ๐๐ฉ๐บ๐ฆ๐ฑ๐๐ฆ๐ฏ๐
๐๐ด๐๐ฆ๐ฆ๐ฎ๐๐๐๐ท๐๐๐ฝ๐๐๐๐ช๐ซ๐๐ฆ๐ญ๐๐๐น๐ฐ๐๐ฟ๐ฆ๐ป๐จ๐ผ๐พ๐ฆ๐๐๐ฃ๐ค๐ฅ๐ฆ๐ง๐๐ฆ
๐ฆ๐ฆ๐ธ๐๐ข๐ฆ๐๐ฒ๐๐ณ๐๐ฌ๐๐ ๐ก๐ฆ๐๐๐ฆ๐ฆ๐ฆ๐ฆ๐๐๐๐๐๐ท๐ธ๐ฆ๐๐ธ๐ฎ๐ต๐น๐ฅ๐บ๐ป๐ผ๐ทโ๐ฑ๐ฒ๐ณ๐ด๐ต๐พ๐ฟโ๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐
๐ฅ๐ฅ๐๐ฅ๐ฅ๐ฝ๐ถ๐ฅ๐๐ฅ๐ฐ๐๐ฅ๐ฅ๐ฅ๐ง๐๐๐ฅ๐๐๐๐ญ๐ฎ๐ฏ๐ฅ๐ฅ๐ณ๐ฅ๐ฒ๐ฅ๐ฟ๐ฑ๐๐๐๐๐๐๐ ๐ข๐ฃ๐ค๐ฅ๐ก๐ฆ๐ง๐จ๐ฉ๐ช๐๐ฐ๐ซ๐ฌ๐ญ๐ฎ๐ฏ๐ผ๐ฅโ๐ต๐ถ๐พ๐ท๐ธ๐น๐บ๐ป๐ฅ๐ฝ๐ด๐ฅ๐ช๐บ๐๐๐๐โจ๐๐๐๐๐๐๐๐๐๐๐๐๐๐ซ๐๐๐
๐ฅ๐ฅ๐ฅโฝ๏ธโพ๏ธ๐๐๐๐๐พ๐ฑ๐ณ๐๐๐๐๐ธ๐ฅ๐ฅ๐ฅ
๐ฏโณ๐๏ธโโ๏ธ๐๏ธโโ๏ธโธ๐ฃ๐ฝ๐ฟโท๐๐โโ๏ธ๐โโ๏ธ๐๐โโ๏ธ๐โโ๏ธโน๏ธโโ๏ธโน๏ธโโ๏ธ๐๏ธโโ๏ธ๐๏ธโโ๏ธ๐ดโโ๏ธ๐ดโโ๏ธ๐ตโโ๏ธ๐ตโโ๏ธ๐๐๐คธโโ๏ธ๐คธโโ๏ธ๐คผโโ๏ธ๐คผโโ๏ธ๐คฝโโ๏ธ๐คฝโโ๏ธ๐คพโโ๏ธ๐คพโโ๏ธ๐คบ๐คนโโ๏ธ๐คนโโ๏ธ๐ฎ๐น๐ฒโ ๏ธโฅ๏ธโฆ๏ธโฃ๏ธ๐๐๐ด๐๐๐๐๐บ๐โฐ๐๐ป๐๐๐๐๐๐๐๐๐๐๐๐ ๐ก๐ข๐ฃ๐ค๐ฅ๐ฆ๐จ๐ฉ๐ช๐ซ๐ฌ๐ญ๐ฏ๐ฐ๐๐ผ๐ฝโช๐๐โฉ๐โฒโบ๐๐๐๐
๐๐๐โผโจ๏ธ๐๐ ๐ก๐ข๐๐ช๐ญ๐ผ๐จ๐ฐ๐๐๐๐
๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐โ๐๐ฒ๐ด๐ต๐๐ฃ๐คโฝ๐จ๐ฅ๐ฆ๐ง๐โโต๐ฃโโ๏ธ๐ฃโโ๏ธ๐ถ๐ค๐ณโด๐ฅ๐ขโ๐ฉ๐ซ๐ฌ๐บ๐๐๐ ๐ก๐๐ฐ๐๐ช๐๐๐๐ฝ๐ฟ๐๐โโณโโฐโฑโฒ๐ฐ๐๐ง๐๐๐๐๐๐๐๐๐๐ ๐๐ก๐๐ข๐๐ฃ๐๐ค๐๐ฅ๐๐ฆ๐๐๐๐๐๐๐๐๐๐๐๐๐กโ๏ธ๐๐โญ๐๐ โ๏ธโ
โ๐ค๐ฅ๐ฆ๐ง๐จ๐ฉ๐ช๐ซ๐ฌ๐๐๐โ๏ธโโฑโกโโ๏ธโโ๐ฅ๐ง๐๐๐๐๐๐ข๐ฃ๐ฏ๐๐๐ผ๐ต๐ถ๐๐๐๐ค๐ง๐ป๐ท๐ธ๐น๐บ๐ป๐ฅ๐ฑ๐ฒโ๏ธ๐๐๐ ๐๐๐ป๐ฅ๐จโจ๐ฑ๐ฒ๐ฝ๐พ๐ฟ๐๐ฅ๐๐ฝ๐ฌ๐บ๐ท๐ธ๐น๐ผ๐๐๐ฌ๐ญ๐ก๐ฏ๐ก๐ฆ๐ฎ๐๐๐๐๐๐๐๐๐๐๐๐๐ฐ๐๐๐๐ท๐ฐ๐ด๐ต๐ถ๐ท๐ธ๐ณ๐ฑ๐ฒโ๐ง๐จ๐ฉ๐ค๐ฅ๐ฆ๐ซ๐ช๐ฌ๐ญ๐ฎ๐ณโโ๐๐๐๐๐๐ผ๐๐๐๐
๐๐๐๐๐๐๐๐๐๐๐๐๐๐โ๏ธ๐๐๐๐๐๐๐๐๐๐จโโ๐ ๐กโ๐ซ๐น๐ก๐ง๐ฉโ๐โโ๐โ๐๐๐ฌโฐโฑ๐ฟ๐ข๐ฎ๐ฎ๐ง๐ฎ๐ฐโฟ๐น๐บ๐ป๐ผ๐พ๐๐๐๐
โ ๏ธ๐ธโ๐ซ๐ณ๐ญ๐ฏ๐ฑ๐ท๐ต๐โขโฃโฌ๏ธโ๏ธโก๏ธโ๏ธโฌ๏ธโ๏ธโฌ
๏ธโ๏ธโ๏ธโ๏ธโฉโชโคด๏ธโคต๏ธ๐๐๐๐๐๐๐๐โ๐โกโธโฏ๏ธโฆโฎ๐๐ฏโโโโโโโโโโโโโ๐๐๐โถ๏ธโฉโญโฏโ๏ธโชโฎ๐ผโซ๐ฝโฌโธโนโบโ๐ฆ๐
๐๐ถ๐ณ๐ดโป๏ธ๐โ๐ฐ๐ฑโญโ
โโโโโโโ๏ธโ๏ธโโโโฐโฟใฝโณโดโโ๏ธโโโโใฐ๐๐ฏ๐ ๐ก๐ข๐ฃ๐ค๐
ฐ๏ธ๐๏ธ๐
ฑ๏ธ๐๏ธ๐๏ธ๐๏ธโน๐๏ธโ๏ธ๐๏ธ๐๏ธ๐
พ๏ธ๐๏ธ๐
ฟ๏ธ๐๏ธ๐๏ธ๐๏ธ๐๐๐ท๐ถ๐ฏ๐๐น๐๐ฒ๐๐ธ๐ด๐ณใใ๐บ๐ตโซ๏ธโปโผโฝโพโฌโฌ๐ถ๏ธ๐ท๏ธ๐ธ๏ธ๐น๏ธ๐บ๏ธ๐ป๐ ๐๐ฒ๐ณโชโซ๐ด๐ต๐๐ฉ๐ด๐ณ๐ณ๏ธโ๐โโโโโโ
โพโพ๐ฆ๐จ๐ฆ๐ฉ๐ฆ๐ช๐ฆ๐ซ๐ฆ๐ฌ๐ฆ๐ฎ๐ฆ๐ฑ๐ฆ๐ฒ๐ฆ๐ด๐ฆ๐ถ๐ฆ๐ท๐ฆ๐ธ๐ฆ๐น๐ฆ๐บ๐ฆ๐ผ๐ฆ๐ฝ๐ฆ๐ฟ๐ง๐ฆ๐ง๐ง๐ง๐ฉ๐ง๐ช๐ง๐ซ๐ง๐ฌ๐ง๐ญ๐ง๐ฎ๐ง๐ฏ๐ง๐ฑ๐ง๐ฒ๐ง๐ณ๐ง๐ด๐ง๐ถ๐ง๐ท๐ง๐ธ๐ง๐น๐ง๐ผ๐ง๐พ๐ง๐ฟ๐จ๐ฆ๐จ๐จ๐จ๐ฉ๐จ๐ซ๐จ๐ฌ๐จ๐ญ๐จ๐ฎ๐จ๐ฐ๐จ๐ฑ๐จ๐ฒ๐จ๐ณ๐จ๐ด๐จ๐ท๐จ๐บ๐จ๐ป๐จ๐ผ๐จ๐ฝ๐จ๐พ๐จ๐ฟ๐ฉ๐ช๐ฉ๐ฏ๐ฉ๐ฐ๐ฉ๐ฒ๐ฉ๐ด๐ฉ๐ฟ๐ช๐จ๐ช๐ช๐ช๐ฌ๐ช๐ญ๐ช๐ท๐ช๐ธ๐ช๐น๐ช๐บ๐ซ๐ฎ๐ซ๐ฏ๐ซ๐ฐ๐ซ๐ฒ๐ซ๐ด๐ซ๐ท๐ฌ๐ฆ๐ฌ๐ง๐ฌ๐ฉ๐ฌ๐ช๐ฌ๐ซ๐ฌ๐ฌ๐ฌ๐ญ๐ฌ๐ฎ๐ฌ๐ฑ๐ฌ๐ฒ๐ฌ๐ณ๐ฌ๐ต๐ฌ๐ถ๐ฌ๐ท๐ฌ๐ธ๐ฌ๐น๐ฌ๐บ๐ฌ๐ผ๐ฌ๐พ๐ญ๐ฐ๐ญ๐ฒ๐ญ๐ณ๐ญ๐ท๐ญ๐น๐ญ๐บ๐ฎ๐จ๐ฎ๐ฉ๐ฎ๐ช๐ฎ๐ฑ๐ฎ๐ฒ๐ฎ๐ณ๐ฎ๐ด๐ฎ๐ถ๐ฎ๐ท๐ฎ๐ธ๐ฎ๐น๐ฏ๐ช๐ฏ๐ฒ๐ฏ๐ด๐ฏ๐ต๐ฐ๐ช๐ฐ๐ฌ๐ฐ๐ญ๐ฐ๐ฎ๐ฐ๐ฒ๐ฐ๐ณ๐ฐ๐ต๐ฐ๐ท๐ฐ๐ผ๐ฐ๐พ๐ฐ๐ฟ๐ฑ๐ฆ๐ฑ๐ง๐ฑ๐จ๐ฑ๐ฎ๐ฑ๐ฐ๐ฑ๐ท๐ฑ๐ธ๐ฑ๐น๐ฑ๐บ๐ฑ๐ป๐ฑ๐พ๐ฒ๐ฆ๐ฒ๐จ๐ฒ๐ฉ๐ฒ๐ช๐ฒ๐ฌ๐ฒ๐ญ๐ฒ๐ฐ๐ฒ๐ฑ๐ฒ๐ฒ๐ฒ๐ณ๐ฒ๐ด๐ฒ๐ต๐ฒ๐ถ๐ฒ๐ท๐ฒ๐ธ๐ฒ๐น๐ฒ๐บ๐ฒ๐ป๐ฒ๐ผ๐ฒ๐ฝ๐ฒ๐พ๐ฒ๐ฟ๐ณ๐ฆ๐ณ๐จ๐ณ๐ช๐ณ๐ซ๐ณ๐ฌ๐ณ๐ฎ๐ณ๐ฑ๐ณ๐ด๐ณ๐ต๐ณ๐ท๐ณ๐บ๐ณ๐ฟ๐ด๐ฒ๐ต๐ฆ๐ต๐ช๐ต๐ซ๐ต๐ฌ๐ต๐ญ๐ต๐ฐ๐ต๐ฑ๐ต๐ฒ๐ต๐ณ๐ต๐ท๐ต๐ธ๐ต๐น๐ต๐ผ๐ต๐พ๐ถ๐ฆ๐ท๐ช๐ท๐ด๐ท๐ธ๐ท๐บ๐ท๐ผ๐ธ๐ฆ๐ธ๐ง๐ธ๐จ๐ธ๐ฉ๐ธ๐ช๐ธ๐ฌ๐ธ๐ญ๐ธ๐ฎ๐ธ๐ฐ๐ธ๐ฑ๐ธ๐ฒ๐ธ๐ณ๐ธ๐ด๐ธ๐ท๐ธ๐ธ๐ธ๐น๐ธ๐ป๐ธ๐ฝ๐ธ๐พ๐ธ๐ฟ๐น๐ฆ๐น๐จ๐น๐ฉ๐น๐ซ๐น๐ฌ๐น๐ญ๐น๐ฏ๐น๐ฐ๐น๐ฑ๐น๐ฒ๐น๐ณ๐น๐ด๐น๐ท๐น๐น๐น๐ป๐น๐ผ๐น๐ฟ๐บ๐ฆ๐บ๐ฌ๐บ๐ณ๐บ๐ธ๐บ๐พ๐บ๐ฟ๐ป๐ฆ๐ป๐จ๐ป๐ช๐ป๐ฌ๐ป๐ฎ๐ป๐ณ๐ป๐บ๐ผ๐ซ๐ผ๐ธ๐ฝ๐ฐ๐พ๐ช๐พ๐น๐ฟ๐ฆ๐ฟ๐ฒ๐ฟ๐ผ8<br/><br/><br/><br/>Sent from my Samsung Galaxy smartphone.</align>";
int font_size = 50;
int counter = 0;
void _button_clicked(void *data, Evas_Object *obj, void *event_info)
{
APP *app = data;
font_size += 10;
Evas_Textblock_Style *style = evas_textblock_style_new();
char buffer[100] = {0};
sprintf(buffer, "DEFAULT='font=NotoColorEmoji font_size=%i color=red ellipsis=-1.0 wrap=mixed'", font_size);
evas_textblock_style_set(style, buffer);
evas_object_textblock_style_set(app->tb1, style);
evas_textblock_style_free(style);
style = NULL;
}
EAPI_MAIN int
elm_main(int argc EINA_UNUSED, char **argv EINA_UNUSED)
{
APP *app = calloc(1, sizeof(APP));
Evas_Object *win, *scroller1, *scroller2, *box;
elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED);
win = elm_win_util_standard_add("", "");
elm_win_autodel_set(win, EINA_TRUE);
box = elm_box_add(win);
evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL);
scroller1 = elm_scroller_add(win);
evas_object_size_hint_weight_set(scroller1, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(scroller1, EVAS_HINT_FILL, EVAS_HINT_FILL);
app->tb1 = evas_object_textblock_add(win);
Evas_Textblock_Style *style = evas_textblock_style_new();
char buffer[100] = {0};
sprintf(buffer, "DEFAULT='font=NotoColorEmoji font_size=%i color=red ellipsis=-1.0 wrap=mixed'", font_size);
evas_textblock_style_set(style, buffer);
evas_object_textblock_style_set(app->tb1, style);
evas_textblock_style_free(style);
style = NULL;
evas_font_cache_set(evas_object_evas_get(app->tb1), 0);
int w,h;
evas_object_textblock_text_markup_set(app->tb1, "");
evas_object_size_hint_min_set(app->tb1, 400, 400);
elm_object_content_set(scroller1, app->tb1);
elm_box_pack_end(box, scroller1);
elm_object_content_set(win, box);
app->btnLoad = elm_button_add(win);
elm_object_text_set(app->btnLoad, "Scale Font");
evas_object_smart_callback_add(app->btnLoad, "clicked", _button_clicked, app);
evas_object_show(app->btnLoad);
evas_object_move(app->btnLoad, 0, 20);
evas_object_resize(app->btnLoad, 150, 20);
evas_object_textblock_text_markup_set(app->tb1, text);
evas_object_textblock_size_formatted_get(app->tb1, &w, &h);
evas_object_size_hint_min_set(app->tb1, 400, w/400 + h + 150);
evas_object_resize(win, 400, 400);
evas_object_show(box);
evas_object_show(scroller1);
evas_object_show(scroller2);
evas_object_show(win);
elm_run();
return 0;
}
ELM_MAIN()
```
Reviewers: raster, woohyun, bowonryu, bu5hm4n, zmike, segfaultxavi
Subscribers: cedric, #reviewers, #committers
Tags: #efl
Maniphest Tasks: T8727
Differential Revision: https://phab.enlightenment.org/D11861
-rw-r--r-- | src/lib/evas/common/evas_font.h | 1 | ||||
-rw-r--r-- | src/lib/evas/common/evas_font_main.c | 102 | ||||
-rw-r--r-- | src/lib/evas/common/evas_font_ot.c | 2 | ||||
-rw-r--r-- | src/lib/evas/common/evas_text_utils.c | 4 |
4 files changed, 81 insertions, 28 deletions
diff --git a/src/lib/evas/common/evas_font.h b/src/lib/evas/common/evas_font.h index 8b97c19399..fbed8e64bf 100644 --- a/src/lib/evas/common/evas_font.h +++ b/src/lib/evas/common/evas_font.h @@ -362,6 +362,7 @@ struct _RGBA_Font_Glyph Evas_Coord x_bear; Evas_Coord y_bear; FT_Glyph glyph; + FT_Vector advance; RGBA_Font_Glyph_Out *glyph_out; void *col_dat; /* this is a problem - only 1 engine at a time can extend such a font... grrr */ diff --git a/src/lib/evas/common/evas_font_main.c b/src/lib/evas/common/evas_font_main.c index 548ce4d01c..3a5b280437 100644 --- a/src/lib/evas/common/evas_font_main.c +++ b/src/lib/evas/common/evas_font_main.c @@ -711,6 +711,46 @@ _fash_gl_add(Fash_Glyph *fash, int item, RGBA_Font_Glyph *glyph) fash->bucket[grp]->bucket[maj]->item[min] = glyph; } +static void evas_font_glyph_load(RGBA_Font_Glyph *fg) +{ + if(fg->glyph) return; + + RGBA_Font_Int *fi = fg->fi; + FT_UInt idx = fg->index; + FT_Error error; + + const FT_Int32 hintflags[3] = + { FT_LOAD_NO_HINTING, FT_LOAD_FORCE_AUTOHINT, FT_LOAD_NO_AUTOHINT }; + static FT_Matrix transform = {0x10000, _EVAS_FONT_SLANT_TAN * 0x10000, + 0x00000, 0x10000}; + + evas_common_font_int_reload(fi); + FTLOCK(); + error = FT_Load_Glyph(fi->src->ft.face, idx, + (FT_HAS_COLOR(fi->src->ft.face) ? + (FT_LOAD_COLOR | hintflags[fi->hinting]) : + (FT_LOAD_DEFAULT | FT_LOAD_NO_BITMAP | hintflags[fi->hinting]))); + + FTUNLOCK(); + if (error) + { + return; + } + + /* Transform the outline of Glyph according to runtime_rend. */ + if (fi->runtime_rend & FONT_REND_SLANT) + FT_Outline_Transform(&fi->src->ft.face->glyph->outline, &transform); + /* Embolden the outline of Glyph according to rundtime_rend. */ + if (fi->runtime_rend & FONT_REND_WEIGHT) + FT_GlyphSlot_Embolden(fi->src->ft.face->glyph); + + FTLOCK(); + error = FT_Get_Glyph(fi->src->ft.face->glyph, &(fg->glyph)); + FTUNLOCK(); + + return; +} + EAPI RGBA_Font_Glyph * evas_common_font_int_cache_glyph_get(RGBA_Font_Int *fi, FT_UInt idx) { @@ -749,48 +789,60 @@ evas_common_font_int_cache_glyph_get(RGBA_Font_Int *fi, FT_UInt idx) /* Transform the outline of Glyph according to runtime_rend. */ if (fi->runtime_rend & FONT_REND_SLANT) - FT_Outline_Transform(&fi->src->ft.face->glyph->outline, &transform); + FT_Outline_Transform(&fi->src->ft.face->glyph->outline, &transform); /* Embolden the outline of Glyph according to rundtime_rend. */ if (fi->runtime_rend & FONT_REND_WEIGHT) - FT_GlyphSlot_Embolden(fi->src->ft.face->glyph); + FT_GlyphSlot_Embolden(fi->src->ft.face->glyph); fg = calloc(1, sizeof(RGBA_Font_Glyph)); if (!fg) return NULL; - FTLOCK(); - error = FT_Get_Glyph(fi->src->ft.face->glyph, &(fg->glyph)); - FTUNLOCK(); - if (error) + if (FT_HAS_COLOR(fi->src->ft.face)) { - free(fg); - if (!fi->fash) fi->fash = _fash_gl_new(); - if (fi->fash) _fash_gl_add(fi->fash, idx, (void *)(-1)); - return NULL; - } + fg->advance.x = fi->src->ft.face->glyph->advance.x * 1024; + fg->advance.y = fi->src->ft.face->glyph->advance.y * 1024; - { - FT_BBox outbox; - FT_Glyph_Get_CBox(fg->glyph, - ((fi->hinting == 0) ? FT_GLYPH_BBOX_UNSCALED : - FT_GLYPH_BBOX_GRIDFIT), - &outbox); - fg->width = EVAS_FONT_ROUND_26_6_TO_INT(outbox.xMax - outbox.xMin); - fg->x_bear = EVAS_FONT_ROUND_26_6_TO_INT(outbox.xMin); - fg->y_bear = EVAS_FONT_ROUND_26_6_TO_INT(outbox.yMax); + FT_GlyphSlot slot = fi->src->ft.face->glyph; + fg->width = EVAS_FONT_ROUND_26_6_TO_INT(slot->metrics.width); + fg->x_bear = EVAS_FONT_ROUND_26_6_TO_INT(slot->metrics.horiBearingX); + fg->y_bear = EVAS_FONT_ROUND_26_6_TO_INT(slot->metrics.horiBearingY); if (FT_HAS_FIXED_SIZES(fi->src->ft.face)) { - if (FT_HAS_COLOR(fi->src->ft.face) && - fi->bitmap_scalable & EFL_TEXT_FONT_BITMAP_SCALABLE_COLOR) + if (fi->bitmap_scalable & EFL_TEXT_FONT_BITMAP_SCALABLE_COLOR) { - fg->glyph->advance.x *= fi->scale_factor; - fg->glyph->advance.y *= fi->scale_factor; + fg->advance.x *= fi->scale_factor; + fg->advance.y *= fi->scale_factor; fg->width *= fi->scale_factor; fg->x_bear *= fi->scale_factor; fg->y_bear *= fi->scale_factor; } } } + else + { + FTLOCK(); + error = FT_Get_Glyph(fi->src->ft.face->glyph, &(fg->glyph)); + FTUNLOCK(); + if (error) + { + free(fg); + if (!fi->fash) fi->fash = _fash_gl_new(); + if (fi->fash) _fash_gl_add(fi->fash, idx, (void *)(-1)); + return NULL; + } + fg->advance.x = fg->glyph->advance.x; + fg->advance.y = fg->glyph->advance.y; + + FT_BBox outbox; + FT_Glyph_Get_CBox(fg->glyph, + ((fi->hinting == 0) ? FT_GLYPH_BBOX_UNSCALED : + FT_GLYPH_BBOX_GRIDFIT), + &outbox); + fg->width = EVAS_FONT_ROUND_26_6_TO_INT(outbox.xMax - outbox.xMin); + fg->x_bear = EVAS_FONT_ROUND_26_6_TO_INT(outbox.xMin); + fg->y_bear = EVAS_FONT_ROUND_26_6_TO_INT(outbox.yMax); + } fg->index = idx; fg->fi = fi; @@ -813,7 +865,7 @@ evas_common_font_int_cache_glyph_render(RGBA_Font_Glyph *fg) /* no cserve2 case */ if (fg->glyph_out) return EINA_TRUE; - + evas_font_glyph_load(fg); FTLOCK(); error = FT_Glyph_To_Bitmap(&(fg->glyph), FT_RENDER_MODE_NORMAL, 0, 1); if (error) diff --git a/src/lib/evas/common/evas_font_ot.c b/src/lib/evas/common/evas_font_ot.c index 47c624c99a..275727d8be 100644 --- a/src/lib/evas/common/evas_font_ot.c +++ b/src/lib/evas/common/evas_font_ot.c @@ -188,7 +188,7 @@ _evas_common_font_ot_hb_get_glyph_advance(hb_font_t *font, fg = evas_common_font_int_cache_glyph_get(fi, glyph); if (fg) { - return fg->glyph->advance.x >> 10; + return fg->advance.x >> 10; } return 0; } diff --git a/src/lib/evas/common/evas_text_utils.c b/src/lib/evas/common/evas_text_utils.c index fc291a9536..b109e9b98a 100644 --- a/src/lib/evas/common/evas_text_utils.c +++ b/src/lib/evas/common/evas_text_utils.c @@ -1104,7 +1104,7 @@ _content_create_ot(RGBA_Font_Int *fi, const Eina_Unicode *text, if (is_replacement) { /* Update the advance accordingly */ - adjust_x += (pen_x + (fg->glyph->advance.x >> 16)) - + adjust_x += (pen_x + (fg->advance.x >> 16)) - gl_itr->pen_after; } pen_x = gl_itr->pen_after; @@ -1198,7 +1198,7 @@ _content_create_regular(RGBA_Font_Int *fi, const Eina_Unicode *text, gl_itr->index = idx; gl_itr->x_bear = fg->x_bear; gl_itr->y_bear = fg->y_bear; - adv = fg->glyph->advance.x >> 10; + adv = fg->advance.x >> 10; gl_itr->width = fg->width; if (EVAS_FONT_CHARACTER_IS_INVISIBLE(_gl)) |