comparison mupdf-source/thirdparty/harfbuzz/docs/subset-preprocessing.md @ 2:b50eed0cc0ef upstream

ADD: MuPDF v1.26.7: the MuPDF source as downloaded by a default build of PyMuPDF 1.26.4. The directory name has changed: no version number in the expanded directory now.
author Franz Glasner <fzglas.hg@dom66.de>
date Mon, 15 Sep 2025 11:43:07 +0200
parents
children
comparison
equal deleted inserted replaced
1:1d09e1dec1d9 2:b50eed0cc0ef
1 # Introduction
2
3 Subset preprocessing is a mechanism which can significantly speed up font subsetting operations.
4 It works by prepopulating datastructures from the source font which can be used in later subsetting
5 operations to more quickly produce the subset. Preprocessing is useful in cases where multiple subsets
6 will be cut from the same source font.
7
8 # Usage
9
10 ```c++
11 hb_face_t* preprocessed = hb_subset_preprocess (source_face);
12
13 ...
14
15 hb_face_t* subset = hb_subset_or_fail (preprocessed, subset_input);
16 ```
17
18 # Additional Details
19
20 * A subset produced from a preprocessed face should be identical to a subset produced from only the
21 original face. The preprocessor does not change the functionality of the subsetter, just speeds
22 things up.
23
24 * The preprocessing operation may take longer than the time it takes to produce a subset from the
25 source font. Thus the main performance gains are made when a preprocessed face is reused for
26 multiple subsetting operations.
27
28 * Currently the largest performance gains are seen when using a preprocessed face for CFF subsetting.
29
30 * The preprocessed face may contain references to the memory backing the source face. If this memory
31 is fully owned by a harfbuzz hb_blob_t* then it will automatically be kept alive for the lifetime
32 of the preprocessed face. However, if this memory is not fully owned by a harfbuzz hb_blob_t* then
33 it is necessary to ensure that the memory is kept alive for the lifetime of the preprocessed face.
34
35
36 # Performance Improvements
37
38 Here is the performance difference of producing a subset with a preprocessed face vs producing
39 a subset with the source face:
40
41 Benchmark | Delta Time (%)
42 ----------|-----------------
43 BM_subset/subset_glyphs/Roboto-Regular.ttf/10_median|-56%
44 BM_subset/subset_glyphs/Roboto-Regular.ttf/64_median|-33%
45 BM_subset/subset_glyphs/Roboto-Regular.ttf/512_median|-28%
46 BM_subset/subset_glyphs/Roboto-Regular.ttf/1000_median|-11%
47 BM_subset/subset_glyphs/Roboto-Regular.ttf/nohinting/10_median|-56%
48 BM_subset/subset_glyphs/Roboto-Regular.ttf/nohinting/64_median|-33%
49 BM_subset/subset_glyphs/Roboto-Regular.ttf/nohinting/512_median|-21%
50 BM_subset/subset_glyphs/Roboto-Regular.ttf/nohinting/1000_median|-9%
51 BM_subset/subset_glyphs/Amiri-Regular.ttf/10_median|-67%
52 BM_subset/subset_glyphs/Amiri-Regular.ttf/64_median|-48%
53 BM_subset/subset_glyphs/Amiri-Regular.ttf/512_median|-21%
54 BM_subset/subset_glyphs/Amiri-Regular.ttf/4096_median|-9%
55 BM_subset/subset_glyphs/Amiri-Regular.ttf/nohinting/10_median|-66%
56 BM_subset/subset_glyphs/Amiri-Regular.ttf/nohinting/64_median|-50%
57 BM_subset/subset_glyphs/Amiri-Regular.ttf/nohinting/512_median|-8%
58 BM_subset/subset_glyphs/Amiri-Regular.ttf/nohinting/4096_median|-9%
59 BM_subset/subset_glyphs/NotoNastaliqUrdu-Regular.ttf/10_median|-85%
60 BM_subset/subset_glyphs/NotoNastaliqUrdu-Regular.ttf/64_median|-71%
61 BM_subset/subset_glyphs/NotoNastaliqUrdu-Regular.ttf/512_median|-3%
62 BM_subset/subset_glyphs/NotoNastaliqUrdu-Regular.ttf/1400_median|4%
63 BM_subset/subset_glyphs/NotoNastaliqUrdu-Regular.ttf/nohinting/10_median|-84%
64 BM_subset/subset_glyphs/NotoNastaliqUrdu-Regular.ttf/nohinting/64_median|-72%
65 BM_subset/subset_glyphs/NotoNastaliqUrdu-Regular.ttf/nohinting/512_median|0%
66 BM_subset/subset_glyphs/NotoNastaliqUrdu-Regular.ttf/nohinting/1400_median|0%
67 BM_subset/subset_glyphs/NotoSansDevanagari-Regular.ttf/10_median|-30%
68 BM_subset/subset_glyphs/NotoSansDevanagari-Regular.ttf/64_median|-24%
69 BM_subset/subset_glyphs/NotoSansDevanagari-Regular.ttf/512_median|-3%
70 BM_subset/subset_glyphs/NotoSansDevanagari-Regular.ttf/1000_median|-3%
71 BM_subset/subset_glyphs/NotoSansDevanagari-Regular.ttf/nohinting/10_median|-30%
72 BM_subset/subset_glyphs/NotoSansDevanagari-Regular.ttf/nohinting/64_median|-24%
73 BM_subset/subset_glyphs/NotoSansDevanagari-Regular.ttf/nohinting/512_median|-3%
74 BM_subset/subset_glyphs/NotoSansDevanagari-Regular.ttf/nohinting/1000_median|-5%
75 BM_subset/subset_glyphs/Mplus1p-Regular.ttf/10_median|-96%
76 BM_subset/subset_glyphs/Mplus1p-Regular.ttf/64_median|-90%
77 BM_subset/subset_glyphs/Mplus1p-Regular.ttf/512_median|-74%
78 BM_subset/subset_glyphs/Mplus1p-Regular.ttf/4096_median|-25%
79 BM_subset/subset_glyphs/Mplus1p-Regular.ttf/10000_median|-23%
80 BM_subset/subset_glyphs/Mplus1p-Regular.ttf/nohinting/10_median|-95%
81 BM_subset/subset_glyphs/Mplus1p-Regular.ttf/nohinting/64_median|-90%
82 BM_subset/subset_glyphs/Mplus1p-Regular.ttf/nohinting/512_median|-73%
83 BM_subset/subset_glyphs/Mplus1p-Regular.ttf/nohinting/4096_median|-24%
84 BM_subset/subset_glyphs/Mplus1p-Regular.ttf/nohinting/10000_median|-11%
85 BM_subset/subset_glyphs/SourceHanSans-Regular_subset.otf/10_median|-84%
86 BM_subset/subset_glyphs/SourceHanSans-Regular_subset.otf/64_median|-77%
87 BM_subset/subset_glyphs/SourceHanSans-Regular_subset.otf/512_median|-70%
88 BM_subset/subset_glyphs/SourceHanSans-Regular_subset.otf/4096_median|-80%
89 BM_subset/subset_glyphs/SourceHanSans-Regular_subset.otf/10000_median|-86%
90 BM_subset/subset_glyphs/SourceHanSans-Regular_subset.otf/nohinting/10_median|-84%
91 BM_subset/subset_glyphs/SourceHanSans-Regular_subset.otf/nohinting/64_median|-78%
92 BM_subset/subset_glyphs/SourceHanSans-Regular_subset.otf/nohinting/512_median|-71%
93 BM_subset/subset_glyphs/SourceHanSans-Regular_subset.otf/nohinting/4096_median|-86%
94 BM_subset/subset_glyphs/SourceHanSans-Regular_subset.otf/nohinting/10000_median|-88%
95 BM_subset/subset_glyphs/SourceSansPro-Regular.otf/10_median|-59%
96 BM_subset/subset_glyphs/SourceSansPro-Regular.otf/64_median|-55%
97 BM_subset/subset_glyphs/SourceSansPro-Regular.otf/512_median|-67%
98 BM_subset/subset_glyphs/SourceSansPro-Regular.otf/2000_median|-68%
99 BM_subset/subset_glyphs/SourceSansPro-Regular.otf/nohinting/10_median|-60%
100 BM_subset/subset_glyphs/SourceSansPro-Regular.otf/nohinting/64_median|-58%
101 BM_subset/subset_glyphs/SourceSansPro-Regular.otf/nohinting/512_median|-72%
102 BM_subset/subset_glyphs/SourceSansPro-Regular.otf/nohinting/2000_median|-71%
103 BM_subset/subset_glyphs/AdobeVFPrototype.otf/10_median|-70%
104 BM_subset/subset_glyphs/AdobeVFPrototype.otf/64_median|-64%
105 BM_subset/subset_glyphs/AdobeVFPrototype.otf/300_median|-73%
106 BM_subset/subset_glyphs/AdobeVFPrototype.otf/nohinting/10_median|-71%
107 BM_subset/subset_glyphs/AdobeVFPrototype.otf/nohinting/64_median|-68%
108 BM_subset/subset_glyphs/AdobeVFPrototype.otf/nohinting/300_median|-72%
109 BM_subset/subset_glyphs/MPLUS1-Variable.ttf/10_median|-90%
110 BM_subset/subset_glyphs/MPLUS1-Variable.ttf/64_median|-82%
111 BM_subset/subset_glyphs/MPLUS1-Variable.ttf/512_median|-31%
112 BM_subset/subset_glyphs/MPLUS1-Variable.ttf/4096_median|-9%
113 BM_subset/subset_glyphs/MPLUS1-Variable.ttf/6000_median|-22%
114 BM_subset/subset_glyphs/MPLUS1-Variable.ttf/nohinting/10_median|-88%
115 BM_subset/subset_glyphs/MPLUS1-Variable.ttf/nohinting/64_median|-83%
116 BM_subset/subset_glyphs/MPLUS1-Variable.ttf/nohinting/512_median|-31%
117 BM_subset/subset_glyphs/MPLUS1-Variable.ttf/nohinting/4096_median|-16%
118 BM_subset/subset_glyphs/MPLUS1-Variable.ttf/nohinting/6000_median|-18%
119 BM_subset/subset_glyphs/RobotoFlex-Variable.ttf/10_median|-44%
120 BM_subset/subset_glyphs/RobotoFlex-Variable.ttf/64_median|-18%
121 BM_subset/subset_glyphs/RobotoFlex-Variable.ttf/512_median|-2%
122 BM_subset/subset_glyphs/RobotoFlex-Variable.ttf/900_median|-6%
123 BM_subset/subset_glyphs/RobotoFlex-Variable.ttf/nohinting/10_median|-45%
124 BM_subset/subset_glyphs/RobotoFlex-Variable.ttf/nohinting/64_median|-17%
125 BM_subset/subset_glyphs/RobotoFlex-Variable.ttf/nohinting/512_median|-15%
126 BM_subset/subset_glyphs/RobotoFlex-Variable.ttf/nohinting/900_median|-3%
127 BM_subset/subset_codepoints/Roboto-Regular.ttf/10_median|-20%
128 BM_subset/subset_codepoints/Roboto-Regular.ttf/64_median|-16%
129 BM_subset/subset_codepoints/Roboto-Regular.ttf/512_median|-12%
130 BM_subset/subset_codepoints/Roboto-Regular.ttf/1000_median|-10%
131 BM_subset/subset_codepoints/Roboto-Regular.ttf/nohinting/10_median|-24%
132 BM_subset/subset_codepoints/Roboto-Regular.ttf/nohinting/64_median|-14%
133 BM_subset/subset_codepoints/Roboto-Regular.ttf/nohinting/512_median|-15%
134 BM_subset/subset_codepoints/Roboto-Regular.ttf/nohinting/1000_median|-9%
135 BM_subset/subset_codepoints/Amiri-Regular.ttf/10_median|-51%
136 BM_subset/subset_codepoints/Amiri-Regular.ttf/64_median|-37%
137 BM_subset/subset_codepoints/Amiri-Regular.ttf/512_median|-12%
138 BM_subset/subset_codepoints/Amiri-Regular.ttf/4096_median|-1%
139 BM_subset/subset_codepoints/Amiri-Regular.ttf/nohinting/10_median|-49%
140 BM_subset/subset_codepoints/Amiri-Regular.ttf/nohinting/64_median|-35%
141 BM_subset/subset_codepoints/Amiri-Regular.ttf/nohinting/512_median|-6%
142 BM_subset/subset_codepoints/Amiri-Regular.ttf/nohinting/4096_median|-1%
143 BM_subset/subset_codepoints/NotoNastaliqUrdu-Regular.ttf/10_median|-82%
144 BM_subset/subset_codepoints/NotoNastaliqUrdu-Regular.ttf/64_median|-9%
145 BM_subset/subset_codepoints/NotoNastaliqUrdu-Regular.ttf/512_median|0%
146 BM_subset/subset_codepoints/NotoNastaliqUrdu-Regular.ttf/1400_median|0%
147 BM_subset/subset_codepoints/NotoNastaliqUrdu-Regular.ttf/nohinting/10_median|-82%
148 BM_subset/subset_codepoints/NotoNastaliqUrdu-Regular.ttf/nohinting/64_median|-13%
149 BM_subset/subset_codepoints/NotoNastaliqUrdu-Regular.ttf/nohinting/512_median|-3%
150 BM_subset/subset_codepoints/NotoNastaliqUrdu-Regular.ttf/nohinting/1400_median|2%
151 BM_subset/subset_codepoints/NotoSansDevanagari-Regular.ttf/10_median|-40%
152 BM_subset/subset_codepoints/NotoSansDevanagari-Regular.ttf/64_median|-26%
153 BM_subset/subset_codepoints/NotoSansDevanagari-Regular.ttf/512_median|-5%
154 BM_subset/subset_codepoints/NotoSansDevanagari-Regular.ttf/1000_median|3%
155 BM_subset/subset_codepoints/NotoSansDevanagari-Regular.ttf/nohinting/10_median|-43%
156 BM_subset/subset_codepoints/NotoSansDevanagari-Regular.ttf/nohinting/64_median|-24%
157 BM_subset/subset_codepoints/NotoSansDevanagari-Regular.ttf/nohinting/512_median|-2%
158 BM_subset/subset_codepoints/NotoSansDevanagari-Regular.ttf/nohinting/1000_median|2%
159 BM_subset/subset_codepoints/Mplus1p-Regular.ttf/10_median|-83%
160 BM_subset/subset_codepoints/Mplus1p-Regular.ttf/64_median|-67%
161 BM_subset/subset_codepoints/Mplus1p-Regular.ttf/512_median|-39%
162 BM_subset/subset_codepoints/Mplus1p-Regular.ttf/4096_median|-20%
163 BM_subset/subset_codepoints/Mplus1p-Regular.ttf/10000_median|-25%
164 BM_subset/subset_codepoints/Mplus1p-Regular.ttf/nohinting/10_median|-83%
165 BM_subset/subset_codepoints/Mplus1p-Regular.ttf/nohinting/64_median|-65%
166 BM_subset/subset_codepoints/Mplus1p-Regular.ttf/nohinting/512_median|-42%
167 BM_subset/subset_codepoints/Mplus1p-Regular.ttf/nohinting/4096_median|-34%
168 BM_subset/subset_codepoints/Mplus1p-Regular.ttf/nohinting/10000_median|-21%
169 BM_subset/subset_codepoints/SourceHanSans-Regular_subset.otf/10_median|-69%
170 BM_subset/subset_codepoints/SourceHanSans-Regular_subset.otf/64_median|-69%
171 BM_subset/subset_codepoints/SourceHanSans-Regular_subset.otf/512_median|-70%
172 BM_subset/subset_codepoints/SourceHanSans-Regular_subset.otf/4096_median|-84%
173 BM_subset/subset_codepoints/SourceHanSans-Regular_subset.otf/10000_median|-83%
174 BM_subset/subset_codepoints/SourceHanSans-Regular_subset.otf/nohinting/10_median|-71%
175 BM_subset/subset_codepoints/SourceHanSans-Regular_subset.otf/nohinting/64_median|-68%
176 BM_subset/subset_codepoints/SourceHanSans-Regular_subset.otf/nohinting/512_median|-70%
177 BM_subset/subset_codepoints/SourceHanSans-Regular_subset.otf/nohinting/4096_median|-86%
178 BM_subset/subset_codepoints/SourceHanSans-Regular_subset.otf/nohinting/10000_median|-88%
179 BM_subset/subset_codepoints/SourceSansPro-Regular.otf/10_median|-45%
180 BM_subset/subset_codepoints/SourceSansPro-Regular.otf/64_median|-48%
181 BM_subset/subset_codepoints/SourceSansPro-Regular.otf/512_median|-57%
182 BM_subset/subset_codepoints/SourceSansPro-Regular.otf/2000_median|-66%
183 BM_subset/subset_codepoints/SourceSansPro-Regular.otf/nohinting/10_median|-43%
184 BM_subset/subset_codepoints/SourceSansPro-Regular.otf/nohinting/64_median|-50%
185 BM_subset/subset_codepoints/SourceSansPro-Regular.otf/nohinting/512_median|-63%
186 BM_subset/subset_codepoints/SourceSansPro-Regular.otf/nohinting/2000_median|-72%
187 BM_subset/subset_codepoints/AdobeVFPrototype.otf/10_median|-69%
188 BM_subset/subset_codepoints/AdobeVFPrototype.otf/64_median|-66%
189 BM_subset/subset_codepoints/AdobeVFPrototype.otf/300_median|-74%
190 BM_subset/subset_codepoints/AdobeVFPrototype.otf/nohinting/10_median|-70%
191 BM_subset/subset_codepoints/AdobeVFPrototype.otf/nohinting/64_median|-71%
192 BM_subset/subset_codepoints/AdobeVFPrototype.otf/nohinting/300_median|-75%
193 BM_subset/subset_codepoints/MPLUS1-Variable.ttf/10_median|-66%
194 BM_subset/subset_codepoints/MPLUS1-Variable.ttf/64_median|-46%
195 BM_subset/subset_codepoints/MPLUS1-Variable.ttf/512_median|-15%
196 BM_subset/subset_codepoints/MPLUS1-Variable.ttf/4096_median|-5%
197 BM_subset/subset_codepoints/MPLUS1-Variable.ttf/6000_median|-16%
198 BM_subset/subset_codepoints/MPLUS1-Variable.ttf/nohinting/10_median|-66%
199 BM_subset/subset_codepoints/MPLUS1-Variable.ttf/nohinting/64_median|-45%
200 BM_subset/subset_codepoints/MPLUS1-Variable.ttf/nohinting/512_median|-14%
201 BM_subset/subset_codepoints/MPLUS1-Variable.ttf/nohinting/4096_median|-11%
202 BM_subset/subset_codepoints/MPLUS1-Variable.ttf/nohinting/6000_median|-27%
203 BM_subset/subset_codepoints/RobotoFlex-Variable.ttf/10_median|-38%
204 BM_subset/subset_codepoints/RobotoFlex-Variable.ttf/64_median|-9%
205 BM_subset/subset_codepoints/RobotoFlex-Variable.ttf/512_median|-3%
206 BM_subset/subset_codepoints/RobotoFlex-Variable.ttf/900_median|-16%
207 BM_subset/subset_codepoints/RobotoFlex-Variable.ttf/nohinting/10_median|-39%
208 BM_subset/subset_codepoints/RobotoFlex-Variable.ttf/nohinting/64_median|-12%
209 BM_subset/subset_codepoints/RobotoFlex-Variable.ttf/nohinting/512_median|-4%
210 BM_subset/subset_codepoints/RobotoFlex-Variable.ttf/nohinting/900_median|-2%
211 BM_subset/instance/MPLUS1-Variable.ttf/10_median|-68%
212 BM_subset/instance/MPLUS1-Variable.ttf/64_median|-45%
213 BM_subset/instance/MPLUS1-Variable.ttf/512_median|-18%
214 BM_subset/instance/MPLUS1-Variable.ttf/4096_median|-2%
215 BM_subset/instance/MPLUS1-Variable.ttf/6000_median|4%
216 BM_subset/instance/MPLUS1-Variable.ttf/nohinting/10_median|-69%
217 BM_subset/instance/MPLUS1-Variable.ttf/nohinting/64_median|-46%
218 BM_subset/instance/MPLUS1-Variable.ttf/nohinting/512_median|-11%
219 BM_subset/instance/MPLUS1-Variable.ttf/nohinting/4096_median|4%
220 BM_subset/instance/MPLUS1-Variable.ttf/nohinting/6000_median|-5%
221 BM_subset/instance/RobotoFlex-Variable.ttf/10_median|-34%
222 BM_subset/instance/RobotoFlex-Variable.ttf/64_median|-12%
223 BM_subset/instance/RobotoFlex-Variable.ttf/512_median|6%
224 BM_subset/instance/RobotoFlex-Variable.ttf/900_median|-6%
225 BM_subset/instance/RobotoFlex-Variable.ttf/nohinting/10_median|-33%
226 BM_subset/instance/RobotoFlex-Variable.ttf/nohinting/64_median|-11%
227 BM_subset/instance/RobotoFlex-Variable.ttf/nohinting/512_median|3%
228 BM_subset/instance/RobotoFlex-Variable.ttf/nohinting/900_median|0%