Mercurial > hgrepos > Python2 > PyMuPDF
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% |
