pagyra-js 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (540) hide show
  1. package/.eslintrc.json +30 -0
  2. package/CHANGELOG.md +13 -0
  3. package/README.md +275 -0
  4. package/UA_Styles_Chromium.md +93 -0
  5. package/_ext/woff2_conversion/brotli-decode.d.ts +139 -0
  6. package/_ext/woff2_conversion/brotli-encode.d.ts +129 -0
  7. package/_ext/woff2_conversion/brotli-port.d.ts +12 -0
  8. package/_ext/woff2_conversion/brotli-shared-dictionary.d.ts +25 -0
  9. package/_ext/woff2_conversion/brotli-types.d.ts +15 -0
  10. package/_ext/woff2_conversion/woff2-common.d.ts +37 -0
  11. package/_ext/woff2_conversion/woff2-decode.d.ts +32 -0
  12. package/_ext/woff2_conversion/woff2-encode.d.ts +31 -0
  13. package/_ext/woff2_conversion/woff2-output.d.ts +39 -0
  14. package/_ext/woff2_original_cpp/brotli/brotli.c +1559 -0
  15. package/_ext/woff2_original_cpp/brotli/brotli.md +116 -0
  16. package/_ext/woff2_original_cpp/brotli/decode.h +409 -0
  17. package/_ext/woff2_original_cpp/brotli/encode.h +505 -0
  18. package/_ext/woff2_original_cpp/brotli/port.h +302 -0
  19. package/_ext/woff2_original_cpp/brotli/shared_dictionary.h +100 -0
  20. package/_ext/woff2_original_cpp/brotli/types.h +83 -0
  21. package/_ext/woff2_original_cpp/cmake/FindBrotliDec.cmake +35 -0
  22. package/_ext/woff2_original_cpp/cmake/FindBrotliEnc.cmake +35 -0
  23. package/_ext/woff2_original_cpp/include/woff2/decode.h +36 -0
  24. package/_ext/woff2_original_cpp/include/woff2/encode.h +43 -0
  25. package/_ext/woff2_original_cpp/include/woff2/output.h +86 -0
  26. package/_ext/woff2_original_cpp/src/buffer.h +164 -0
  27. package/_ext/woff2_original_cpp/src/convert_woff2ttf_fuzzer.cc +13 -0
  28. package/_ext/woff2_original_cpp/src/convert_woff2ttf_fuzzer_new_entry.cc +12 -0
  29. package/_ext/woff2_original_cpp/src/file.h +30 -0
  30. package/_ext/woff2_original_cpp/src/font.cc +400 -0
  31. package/_ext/woff2_original_cpp/src/font.h +105 -0
  32. package/_ext/woff2_original_cpp/src/glyph.cc +383 -0
  33. package/_ext/woff2_original_cpp/src/glyph.h +71 -0
  34. package/_ext/woff2_original_cpp/src/normalize.cc +314 -0
  35. package/_ext/woff2_original_cpp/src/normalize.h +39 -0
  36. package/_ext/woff2_original_cpp/src/port.h +66 -0
  37. package/_ext/woff2_original_cpp/src/round.h +27 -0
  38. package/_ext/woff2_original_cpp/src/store_bytes.h +55 -0
  39. package/_ext/woff2_original_cpp/src/table_tags.cc +82 -0
  40. package/_ext/woff2_original_cpp/src/table_tags.h +30 -0
  41. package/_ext/woff2_original_cpp/src/transform.cc +430 -0
  42. package/_ext/woff2_original_cpp/src/transform.h +26 -0
  43. package/_ext/woff2_original_cpp/src/variable_length.cc +129 -0
  44. package/_ext/woff2_original_cpp/src/variable_length.h +30 -0
  45. package/_ext/woff2_original_cpp/src/woff2_common.cc +50 -0
  46. package/_ext/woff2_original_cpp/src/woff2_common.h +64 -0
  47. package/_ext/woff2_original_cpp/src/woff2_compress.cc +43 -0
  48. package/_ext/woff2_original_cpp/src/woff2_dec.cc +1398 -0
  49. package/_ext/woff2_original_cpp/src/woff2_decompress.cc +41 -0
  50. package/_ext/woff2_original_cpp/src/woff2_enc.cc +458 -0
  51. package/_ext/woff2_original_cpp/src/woff2_info.cc +142 -0
  52. package/_ext/woff2_original_cpp/src/woff2_out.cc +63 -0
  53. package/assets/fonts/ttf/arimo/Arimo-Bold.ttf +0 -0
  54. package/assets/fonts/ttf/arimo/Arimo-BoldItalic.ttf +0 -0
  55. package/assets/fonts/ttf/arimo/Arimo-Italic.ttf +0 -0
  56. package/assets/fonts/ttf/arimo/Arimo-Regular.ttf +0 -0
  57. package/assets/fonts/ttf/cinzeldecorative/CinzelDecorative-Black.ttf +0 -0
  58. package/assets/fonts/ttf/cinzeldecorative/CinzelDecorative-Bold.ttf +0 -0
  59. package/assets/fonts/ttf/cinzeldecorative/CinzelDecorative-Regular.ttf +0 -0
  60. package/assets/fonts/ttf/dejavu/DejaVuSans.ttf +0 -0
  61. package/assets/fonts/ttf/firecode/FiraCode-Bold.ttf +0 -0
  62. package/assets/fonts/ttf/firecode/FiraCode-Light.ttf +0 -0
  63. package/assets/fonts/ttf/firecode/FiraCode-Medium.ttf +0 -0
  64. package/assets/fonts/ttf/firecode/FiraCode-Regular.ttf +0 -0
  65. package/assets/fonts/ttf/firecode/FiraCode-SemiBold.ttf +0 -0
  66. package/assets/fonts/ttf/notoemoji/NotoEmoji-Bold.ttf +0 -0
  67. package/assets/fonts/ttf/notoemoji/NotoEmoji-Light.ttf +0 -0
  68. package/assets/fonts/ttf/notoemoji/NotoEmoji-Medium.ttf +0 -0
  69. package/assets/fonts/ttf/notoemoji/NotoEmoji-Regular.ttf +0 -0
  70. package/assets/fonts/ttf/notoemoji/NotoEmoji-SemiBold.ttf +0 -0
  71. package/assets/fonts/ttf/notosans/NotoSans-Regular.ttf +0 -0
  72. package/assets/fonts/ttf/roboto/Roboto-Bold.ttf +0 -0
  73. package/assets/fonts/ttf/roboto/Roboto-BoldItalic.ttf +0 -0
  74. package/assets/fonts/ttf/roboto/Roboto-Italic.ttf +0 -0
  75. package/assets/fonts/ttf/roboto/Roboto-Regular.ttf +0 -0
  76. package/assets/fonts/ttf/stixtwomath/STIXTwoMath-Regular.ttf +0 -0
  77. package/assets/fonts/ttf/tinos/Tinos-Bold.ttf +0 -0
  78. package/assets/fonts/ttf/tinos/Tinos-BoldItalic.ttf +0 -0
  79. package/assets/fonts/ttf/tinos/Tinos-Italic.ttf +0 -0
  80. package/assets/fonts/ttf/tinos/Tinos-Regular.ttf +0 -0
  81. package/assets/fonts/woff/lato/lato-latin-400-italic.woff +0 -0
  82. package/assets/fonts/woff/lato/lato-latin-400-normal.woff +0 -0
  83. package/assets/fonts/woff/lato/lato-latin-700-italic.woff +0 -0
  84. package/assets/fonts/woff/lato/lato-latin-700-normal.woff +0 -0
  85. package/assets/fonts/woff2/caveat/Caveat-Bold.woff2 +0 -0
  86. package/assets/fonts/woff2/caveat/Caveat-Regular.woff2 +0 -0
  87. package/assets/fonts/woff2/lato/lato-latin-400-italic.woff2 +0 -0
  88. package/assets/fonts/woff2/lato/lato-latin-400-normal.woff2 +0 -0
  89. package/assets/fonts/woff2/lato/lato-latin-700-italic.woff2 +0 -0
  90. package/assets/fonts/woff2/lato/lato-latin-700-normal.woff2 +0 -0
  91. package/docs/AGENTS.md +288 -0
  92. package/docs/BACKGROUND-REPEAT-IMPLEMENTATION.md +127 -0
  93. package/docs/BACKGROUND-REPEAT-REFERENCE.md +127 -0
  94. package/docs/BACKGROUND-REPEAT-SPACE-ROUND.md +164 -0
  95. package/docs/css-properties-support.md +256 -0
  96. package/docs/src_modules_table.md +172 -0
  97. package/docs/text-overlap-fix.md +85 -0
  98. package/docs/text-overlap-investigation.md +27 -0
  99. package/eslint.config.js +36 -0
  100. package/glyph_measure.htm +1458 -0
  101. package/package.json +50 -0
  102. package/playground/browser-entry.ts +2 -0
  103. package/playground/exports/background-text-debug.pdf +0 -0
  104. package/playground/public/app.js +875 -0
  105. package/playground/public/assets/1.webp +0 -0
  106. package/playground/public/examples/accents-test.html +24 -0
  107. package/playground/public/examples/advanced-selectors-demo.html +118 -0
  108. package/playground/public/examples/background-advanced-showcase.html +82 -0
  109. package/playground/public/examples/background-clip-text.html +36 -0
  110. package/playground/public/examples/background-origin-showcase.html +137 -0
  111. package/playground/public/examples/background-position-showcase.html +83 -0
  112. package/playground/public/examples/background-repeat-showcase.html +83 -0
  113. package/playground/public/examples/background-repeat-space-round.html +348 -0
  114. package/playground/public/examples/background-size-showcase.html +82 -0
  115. package/playground/public/examples/background-text-debug.html +18 -0
  116. package/playground/public/examples/baseline-test.html +24 -0
  117. package/playground/public/examples/bold-showcase.html +150 -0
  118. package/playground/public/examples/bold-strike-example.html +12 -0
  119. package/playground/public/examples/border-collapse-test.html +23 -0
  120. package/playground/public/examples/centered-shadow-div.html +72 -0
  121. package/playground/public/examples/css-variables.html +50 -0
  122. package/playground/public/examples/debug-accents.html +11 -0
  123. package/playground/public/examples/debug-text-overlap.html +46 -0
  124. package/playground/public/examples/flex-gap-column.html +130 -0
  125. package/playground/public/examples/flex-gap-row.html +137 -0
  126. package/playground/public/examples/flex-padding-test.html +29 -0
  127. package/playground/public/examples/flexbox-text-test.html +193 -0
  128. package/playground/public/examples/fonts-demo.html +126 -0
  129. package/playground/public/examples/footer-example.html +4 -0
  130. package/playground/public/examples/gradient-text.html +54 -0
  131. package/playground/public/examples/grid-gap-demo.html +156 -0
  132. package/playground/public/examples/header-example.html +4 -0
  133. package/playground/public/examples/header-footer-example.html +27 -0
  134. package/playground/public/examples/image-showcase.html +33 -0
  135. package/playground/public/examples/justify-text.html +22 -0
  136. package/playground/public/examples/linear-gradient-example.html +38 -0
  137. package/playground/public/examples/lorem-span.html +14 -0
  138. package/playground/public/examples/margin-block-showcase.html +21 -0
  139. package/playground/public/examples/margin-inline-showcase.html +21 -0
  140. package/playground/public/examples/monthly-summary.html +95 -0
  141. package/playground/public/examples/multi-page-lorem.html +190 -0
  142. package/playground/public/examples/opacity-debug.html +39 -0
  143. package/playground/public/examples/opacity-example.html +70 -0
  144. package/playground/public/examples/png-image-example.html +13 -0
  145. package/playground/public/examples/red-rectangle.html +18 -0
  146. package/playground/public/examples/repro.html +24 -0
  147. package/playground/public/examples/rounded-borders-test.html +24 -0
  148. package/playground/public/examples/simple-list.html +89 -0
  149. package/playground/public/examples/simple-svg.html +37 -0
  150. package/playground/public/examples/simple-table.html +52 -0
  151. package/playground/public/examples/skew-div.html +138 -0
  152. package/playground/public/examples/skew-text.html +21 -0
  153. package/playground/public/examples/starter-report.css +51 -0
  154. package/playground/public/examples/starter-report.html +23 -0
  155. package/playground/public/examples/svg-aspect-ratio-showcase.html +116 -0
  156. package/playground/public/examples/svg-gradients-linear.html +28 -0
  157. package/playground/public/examples/svg-gradients-radial.html +29 -0
  158. package/playground/public/examples/svg-gradients-showcase.html +66 -0
  159. package/playground/public/examples/svg-image-path-test.html +43 -0
  160. package/playground/public/examples/svg-images-clipping.html +27 -0
  161. package/playground/public/examples/svg-path-gallery.html +118 -0
  162. package/playground/public/examples/svg-radial-transform-demo.html +78 -0
  163. package/playground/public/examples/svg-transform-stack.html +103 -0
  164. package/playground/public/examples/svg-transforms-demo.html +127 -0
  165. package/playground/public/examples/table-merge-test.html +34 -0
  166. package/playground/public/examples/text-decoration-showcase.html +138 -0
  167. package/playground/public/examples/text-indent-showcase.html +137 -0
  168. package/playground/public/examples/text-shadow-example.html +29 -0
  169. package/playground/public/examples/very-complex-css.html +293 -0
  170. package/playground/public/examples/webp-example.html +13 -0
  171. package/playground/public/examples/z-index-demo.html +93 -0
  172. package/playground/public/examples.json +240 -0
  173. package/playground/public/images/dice.png +0 -0
  174. package/playground/public/images/duck.jpg +0 -0
  175. package/playground/public/index.html +149 -0
  176. package/playground/public/mode.js +1 -0
  177. package/playground/public/styles.css +382 -0
  178. package/playground/public/tmp-h2-debug.html +33 -0
  179. package/playground/public/tmp-italic-debug.html +32 -0
  180. package/playground/public/vendor/codemirror/codemirror.min.css +1 -0
  181. package/playground/public/vendor/codemirror/codemirror.min.js +1 -0
  182. package/playground/public/vendor/codemirror/css.min.js +1 -0
  183. package/playground/public/vendor/codemirror/darcula.min.css +1 -0
  184. package/playground/public/vendor/codemirror/htmlmixed.min.js +1 -0
  185. package/playground/public/vendor/codemirror/javascript.min.js +1 -0
  186. package/playground/public/vendor/codemirror/xml.min.js +1 -0
  187. package/playground/public/vendor/pagyra-playground-browser.js +165966 -0
  188. package/playground/public/vendor/pagyra-playground-browser.js.map +7 -0
  189. package/playground/server.d.ts +1 -0
  190. package/playground/server.js +68 -0
  191. package/playground/server.ts +128 -0
  192. package/scripts/browser-build.ts +101 -0
  193. package/scripts/build-browser-bundle.ts +52 -0
  194. package/scripts/glyph-comparison/simulate.ts +744 -0
  195. package/scripts/playground-browser-server.ts +57 -0
  196. package/scripts/probe-roboto.ts +6 -0
  197. package/scripts/render-playground-example.ts +121 -0
  198. package/scripts/run-glyph-atlas-tuner-runner.mjs +113 -0
  199. package/scripts/run-glyph-atlas-tuner.ts +141 -0
  200. package/scripts/top-ts-files.ps1 +39 -0
  201. package/scripts/top-ts-files.sh +37 -0
  202. package/scripts/woff2_info.ps1 +132 -0
  203. package/src/browser-entry.ts +14 -0
  204. package/src/compression/adler32.ts +45 -0
  205. package/src/compression/brotli/brotli.ts +463 -0
  206. package/src/compression/brotli/index.ts +15 -0
  207. package/src/compression/brotli/transform.ts +184 -0
  208. package/src/compression/brotli/types.ts +58 -0
  209. package/src/compression/brotli/utils.ts +157 -0
  210. package/src/compression/brotli/vendor/bit_reader.js +124 -0
  211. package/src/compression/brotli/vendor/context.js +250 -0
  212. package/src/compression/brotli/vendor/decode.d.ts +2 -0
  213. package/src/compression/brotli/vendor/decode.js +938 -0
  214. package/src/compression/brotli/vendor/dictionary-data.js +9469 -0
  215. package/src/compression/brotli/vendor/dictionary.js +36 -0
  216. package/src/compression/brotli/vendor/huffman.js +123 -0
  217. package/src/compression/brotli/vendor/package.json +3 -0
  218. package/src/compression/brotli/vendor/prefix.js +60 -0
  219. package/src/compression/brotli/vendor/streams.js +31 -0
  220. package/src/compression/brotli/vendor/transform.js +247 -0
  221. package/src/compression/brotli/vendor-decode.d.ts +4 -0
  222. package/src/compression/brotli/woff2-glyf-transform.ts +623 -0
  223. package/src/compression/decompress.ts +16 -0
  224. package/src/compression/deflate.ts +295 -0
  225. package/src/compression/index.ts +4 -0
  226. package/src/compression/types.ts +26 -0
  227. package/src/compression/utils.ts +107 -0
  228. package/src/core.ts +18 -0
  229. package/src/css/apply-declarations.ts +86 -0
  230. package/src/css/background-types.ts +65 -0
  231. package/src/css/browser-defaults.ts +16 -0
  232. package/src/css/clip-path-types.ts +13 -0
  233. package/src/css/compute-style.ts +494 -0
  234. package/src/css/css-unit-resolver.ts +65 -0
  235. package/src/css/custom-properties.ts +215 -0
  236. package/src/css/enums.ts +127 -0
  237. package/src/css/font-face-parser.ts +233 -0
  238. package/src/css/font-weight.ts +65 -0
  239. package/src/css/inline-style-parser.ts +27 -0
  240. package/src/css/layout-property-resolver.ts +75 -0
  241. package/src/css/length.ts +141 -0
  242. package/src/css/line-height.ts +96 -0
  243. package/src/css/named-colors.ts +150 -0
  244. package/src/css/parsers/background-parser-extended.ts +111 -0
  245. package/src/css/parsers/background-parser.ts +456 -0
  246. package/src/css/parsers/border-block-parser.ts +26 -0
  247. package/src/css/parsers/border-inline-parser.ts +26 -0
  248. package/src/css/parsers/border-parser-extended.ts +256 -0
  249. package/src/css/parsers/border-parser.ts +175 -0
  250. package/src/css/parsers/box-shadow-parser.ts +106 -0
  251. package/src/css/parsers/clip-path-parser.ts +92 -0
  252. package/src/css/parsers/color-parser.ts +14 -0
  253. package/src/css/parsers/dimension-parser.ts +117 -0
  254. package/src/css/parsers/display-flex-parser.ts +59 -0
  255. package/src/css/parsers/flex-parser.ts +144 -0
  256. package/src/css/parsers/font-parser.ts +40 -0
  257. package/src/css/parsers/gradient-parser.ts +366 -0
  258. package/src/css/parsers/grid-parser-extended.ts +55 -0
  259. package/src/css/parsers/grid-parser.ts +218 -0
  260. package/src/css/parsers/length-parser.ts +95 -0
  261. package/src/css/parsers/list-style-parser.ts +39 -0
  262. package/src/css/parsers/margin-block-parser.ts +12 -0
  263. package/src/css/parsers/margin-inline-parser.ts +12 -0
  264. package/src/css/parsers/margin-parser.ts +30 -0
  265. package/src/css/parsers/opacity-parser.ts +32 -0
  266. package/src/css/parsers/overflow-wrap-parser.ts +38 -0
  267. package/src/css/parsers/padding-block-parser.ts +12 -0
  268. package/src/css/parsers/padding-inline-parser.ts +12 -0
  269. package/src/css/parsers/padding-parser.ts +30 -0
  270. package/src/css/parsers/position-parser.ts +75 -0
  271. package/src/css/parsers/register-parsers.ts +302 -0
  272. package/src/css/parsers/registry.ts +18 -0
  273. package/src/css/parsers/text-parser-extended.ts +144 -0
  274. package/src/css/parsers/text-parser.ts +25 -0
  275. package/src/css/parsers/text-shadow-parser.ts +94 -0
  276. package/src/css/properties/box-model.ts +82 -0
  277. package/src/css/properties/flexbox.ts +44 -0
  278. package/src/css/properties/gap.ts +14 -0
  279. package/src/css/properties/grid.ts +94 -0
  280. package/src/css/properties/layout.ts +59 -0
  281. package/src/css/properties/misc.ts +44 -0
  282. package/src/css/properties/typography.ts +71 -0
  283. package/src/css/properties/visual.ts +68 -0
  284. package/src/css/selectors/matcher.ts +219 -0
  285. package/src/css/selectors/parser.ts +163 -0
  286. package/src/css/selectors/simple-key.ts +31 -0
  287. package/src/css/selectors/specificity.ts +41 -0
  288. package/src/css/selectors/types.ts +31 -0
  289. package/src/css/shorthands/border-shorthand.ts +68 -0
  290. package/src/css/shorthands/box-shorthand.ts +33 -0
  291. package/src/css/style-inheritance.ts +50 -0
  292. package/src/css/style.ts +402 -0
  293. package/src/css/ua-defaults/base-defaults.ts +266 -0
  294. package/src/css/ua-defaults/browser-defaults.ts +134 -0
  295. package/src/css/ua-defaults/element-defaults.ts +374 -0
  296. package/src/css/ua-defaults/types.ts +43 -0
  297. package/src/css/unit-conversion.ts +24 -0
  298. package/src/css/utils.ts +108 -0
  299. package/src/css/viewport.ts +17 -0
  300. package/src/debug/audit.ts +20 -0
  301. package/src/debug/ids.ts +13 -0
  302. package/src/debug/log.js +28 -0
  303. package/src/debug/log.ts +52 -0
  304. package/src/debug/tree.ts +57 -0
  305. package/src/dom/node.ts +133 -0
  306. package/src/environment/browser-environment.ts +78 -0
  307. package/src/environment/environment.ts +35 -0
  308. package/src/environment/global.ts +13 -0
  309. package/src/environment/node-environment.browser.ts +28 -0
  310. package/src/environment/node-environment.ts +64 -0
  311. package/src/fonts/detector.ts +28 -0
  312. package/src/fonts/engines/ttf-engine.ts +28 -0
  313. package/src/fonts/engines/woff-engine.ts +38 -0
  314. package/src/fonts/engines/woff2-engine.ts +41 -0
  315. package/src/fonts/extractors/metrics-extractor.ts +362 -0
  316. package/src/fonts/font-registry-resolver.ts +132 -0
  317. package/src/fonts/index.ts +3 -0
  318. package/src/fonts/orchestrator.ts +92 -0
  319. package/src/fonts/parsers/base-parser.ts +23 -0
  320. package/src/fonts/types.ts +85 -0
  321. package/src/fonts/utils/ttf-reconstructor.ts +120 -0
  322. package/src/fonts/woff/decoder.ts +105 -0
  323. package/src/fonts/woff2/buffer.ts +106 -0
  324. package/src/fonts/woff2/decoder.ts +981 -0
  325. package/src/geometry/box.ts +48 -0
  326. package/src/geometry/matrix.ts +59 -0
  327. package/src/html/css/parse-css.ts +85 -0
  328. package/src/html/dom-converter.ts +433 -0
  329. package/src/html/image-converter.ts +200 -0
  330. package/src/html-to-pdf.ts +410 -0
  331. package/src/image/base-decoder.ts +149 -0
  332. package/src/image/image-service.ts +188 -0
  333. package/src/image/jpeg-decoder.ts +73 -0
  334. package/src/image/png-decoder.ts +550 -0
  335. package/src/image/types.ts +20 -0
  336. package/src/image/webp-decoder.ts +242 -0
  337. package/src/image/webp-huffman.ts +218 -0
  338. package/src/image/webp-riff-parser.ts +54 -0
  339. package/src/image/webp-vp8l-decoder.ts +199 -0
  340. package/src/index.ts +35 -0
  341. package/src/layout/context/float-context.ts +62 -0
  342. package/src/layout/context/layout-environment.ts +29 -0
  343. package/src/layout/debug.ts +18 -0
  344. package/src/layout/inline/bounding-box-calculator.ts +132 -0
  345. package/src/layout/inline/font-baseline-calculator.ts +76 -0
  346. package/src/layout/inline/inline-utils.ts +94 -0
  347. package/src/layout/inline/layout.ts +285 -0
  348. package/src/layout/inline/line_breaker.ts +109 -0
  349. package/src/layout/inline/measurement.ts +144 -0
  350. package/src/layout/inline/run-placer.ts +139 -0
  351. package/src/layout/inline/text-alignment.ts +70 -0
  352. package/src/layout/inline/tokenizer.ts +195 -0
  353. package/src/layout/inline/types.ts +76 -0
  354. package/src/layout/pipeline/context-factory.ts +16 -0
  355. package/src/layout/pipeline/default-engine.ts +24 -0
  356. package/src/layout/pipeline/engine.ts +59 -0
  357. package/src/layout/pipeline/layout-tree.ts +13 -0
  358. package/src/layout/pipeline/out-of-flow-manager.ts +73 -0
  359. package/src/layout/pipeline/strategy.ts +12 -0
  360. package/src/layout/pipeline/text-metrics-initializer.ts +13 -0
  361. package/src/layout/strategies/block.ts +236 -0
  362. package/src/layout/strategies/display-none.ts +14 -0
  363. package/src/layout/strategies/fallback.ts +15 -0
  364. package/src/layout/strategies/flex.ts +477 -0
  365. package/src/layout/strategies/fragmentation.ts +17 -0
  366. package/src/layout/strategies/grid.ts +247 -0
  367. package/src/layout/strategies/image.ts +342 -0
  368. package/src/layout/strategies/inline.ts +128 -0
  369. package/src/layout/strategies/table.ts +595 -0
  370. package/src/layout/table/cell_layout.ts +31 -0
  371. package/src/layout/table/diagnostics.ts +19 -0
  372. package/src/layout/text-run.ts +42 -0
  373. package/src/layout/utils/content-measurer.ts +117 -0
  374. package/src/layout/utils/display-utils.ts +24 -0
  375. package/src/layout/utils/floats.ts +98 -0
  376. package/src/layout/utils/gap-calculator.ts +167 -0
  377. package/src/layout/utils/inline-formatter.ts +31 -0
  378. package/src/layout/utils/inline-formatting.ts +9 -0
  379. package/src/layout/utils/margin.ts +140 -0
  380. package/src/layout/utils/node-math.ts +237 -0
  381. package/src/layout/utils/overflow.ts +14 -0
  382. package/src/layout/utils/sizing.ts +12 -0
  383. package/src/layout/utils/text-metrics.ts +361 -0
  384. package/src/logging/debug.ts +58 -0
  385. package/src/pdf/font/base14/widths-courier-bold.ts +159 -0
  386. package/src/pdf/font/base14/widths-courier.ts +159 -0
  387. package/src/pdf/font/base14/widths-helvetica-bold.ts +158 -0
  388. package/src/pdf/font/base14/widths-helvetica.ts +158 -0
  389. package/src/pdf/font/base14/widths-times-bold.ts +158 -0
  390. package/src/pdf/font/base14/widths-times-roman.ts +158 -0
  391. package/src/pdf/font/base14/widths-types.ts +25 -0
  392. package/src/pdf/font/base14-widths.ts +32 -0
  393. package/src/pdf/font/blur.ts +81 -0
  394. package/src/pdf/font/builtin-fonts.browser.ts +262 -0
  395. package/src/pdf/font/builtin-fonts.ts +126 -0
  396. package/src/pdf/font/composite-glyph-parser.ts +242 -0
  397. package/src/pdf/font/embedder.ts +395 -0
  398. package/src/pdf/font/font-config.ts +190 -0
  399. package/src/pdf/font/font-registry.ts +263 -0
  400. package/src/pdf/font/font-subset.ts +258 -0
  401. package/src/pdf/font/glyph-atlas-maxrects.ts +305 -0
  402. package/src/pdf/font/glyph-atlas-tuner.ts +98 -0
  403. package/src/pdf/font/glyph-atlas.ts +226 -0
  404. package/src/pdf/font/glyph-cache.ts +127 -0
  405. package/src/pdf/font/loca-reader.ts +109 -0
  406. package/src/pdf/font/managers/font-resource-manager.ts +73 -0
  407. package/src/pdf/font/managers/subset-resource-manager.ts +164 -0
  408. package/src/pdf/font/rasterizer.ts +270 -0
  409. package/src/pdf/font/resolvers/base-font-mapper.ts +77 -0
  410. package/src/pdf/font/resolvers/family-resolver.ts +33 -0
  411. package/src/pdf/font/resolvers/weight-style-applicator.ts +63 -0
  412. package/src/pdf/font/simple-glyph-parser.ts +289 -0
  413. package/src/pdf/font/to-unicode.ts +109 -0
  414. package/src/pdf/font/transformation-matrix.ts +136 -0
  415. package/src/pdf/font/ttf-cmap.ts +180 -0
  416. package/src/pdf/font/ttf-global-metrics.ts +58 -0
  417. package/src/pdf/font/ttf-glyf.ts +125 -0
  418. package/src/pdf/font/ttf-glyph-metrics.ts +43 -0
  419. package/src/pdf/font/ttf-lite.ts +269 -0
  420. package/src/pdf/font/ttf-table-parser.ts +132 -0
  421. package/src/pdf/font/ttf-table-provider.ts +61 -0
  422. package/src/pdf/font/widths.ts +79 -0
  423. package/src/pdf/font-subset/font-registry.ts +127 -0
  424. package/src/pdf/header-footer-layout.ts +153 -0
  425. package/src/pdf/header-footer-painter.ts +209 -0
  426. package/src/pdf/header-footer-renderer.ts +357 -0
  427. package/src/pdf/header-footer-tokens.ts +55 -0
  428. package/src/pdf/header-footer.ts +25 -0
  429. package/src/pdf/layout-tree-builder.ts +261 -0
  430. package/src/pdf/page-painter.ts +241 -0
  431. package/src/pdf/pagination.ts +155 -0
  432. package/src/pdf/primitives/pdf-builder.ts +378 -0
  433. package/src/pdf/primitives/pdf-bytes.ts +40 -0
  434. package/src/pdf/primitives/pdf-document.ts +108 -0
  435. package/src/pdf/primitives/pdf-reference-manager.ts +47 -0
  436. package/src/pdf/primitives/pdf-resource-registries.ts +255 -0
  437. package/src/pdf/primitives/pdf-serializers.ts +194 -0
  438. package/src/pdf/primitives/pdf-types.ts +73 -0
  439. package/src/pdf/render.ts +210 -0
  440. package/src/pdf/renderer/box-painter.ts +236 -0
  441. package/src/pdf/renderer/page-paint.ts +102 -0
  442. package/src/pdf/renderer/paint-box-shadows.ts +218 -0
  443. package/src/pdf/renderer/radius.ts +58 -0
  444. package/src/pdf/renderers/graphics-state-manager.ts +40 -0
  445. package/src/pdf/renderers/image-renderer.ts +127 -0
  446. package/src/pdf/renderers/radius-utils.ts +80 -0
  447. package/src/pdf/renderers/rectangle-renderer.ts +129 -0
  448. package/src/pdf/renderers/rounded-rect-path.ts +120 -0
  449. package/src/pdf/renderers/shape-renderer.ts +563 -0
  450. package/src/pdf/renderers/shape-utils.ts +194 -0
  451. package/src/pdf/renderers/text-decoration-renderer.ts +313 -0
  452. package/src/pdf/renderers/text-encoder.ts +41 -0
  453. package/src/pdf/renderers/text-font-resolver.ts +75 -0
  454. package/src/pdf/renderers/text-renderer-utils.ts +28 -0
  455. package/src/pdf/renderers/text-renderer.ts +391 -0
  456. package/src/pdf/renderers/text-shadow-renderer.ts +300 -0
  457. package/src/pdf/shading/gradient-service.ts +525 -0
  458. package/src/pdf/shading/index.ts +1 -0
  459. package/src/pdf/stacking/build-stacking-contexts.ts +93 -0
  460. package/src/pdf/stacking/resolve-paint-order.ts +157 -0
  461. package/src/pdf/stacking/types.ts +40 -0
  462. package/src/pdf/svg/aspect-ratio.ts +81 -0
  463. package/src/pdf/svg/coordinate-mapper.ts +81 -0
  464. package/src/pdf/svg/geometry-builder.ts +45 -0
  465. package/src/pdf/svg/render-svg.ts +296 -0
  466. package/src/pdf/svg/shape-renderer.ts +463 -0
  467. package/src/pdf/svg/style-computer.ts +246 -0
  468. package/src/pdf/transform-adapter.ts +26 -0
  469. package/src/pdf/types.ts +377 -0
  470. package/src/pdf/utils/background-layer-resolver.ts +439 -0
  471. package/src/pdf/utils/background-tiles.ts +192 -0
  472. package/src/pdf/utils/border-dashes.ts +109 -0
  473. package/src/pdf/utils/border-radius-utils.ts +86 -0
  474. package/src/pdf/utils/box-dimensions-utils.ts +47 -0
  475. package/src/pdf/utils/clip-path-resolver.ts +50 -0
  476. package/src/pdf/utils/clipping-path-builder.ts +190 -0
  477. package/src/pdf/utils/color-utils.ts +102 -0
  478. package/src/pdf/utils/coordinate-transformer.ts +30 -0
  479. package/src/pdf/utils/drop-shadow-raster.ts +233 -0
  480. package/src/pdf/utils/encoding.ts +98 -0
  481. package/src/pdf/utils/glyph-atlas-registrar.ts +13 -0
  482. package/src/pdf/utils/glyph-run-renderer.ts +129 -0
  483. package/src/pdf/utils/image-command-partitioner.ts +28 -0
  484. package/src/pdf/utils/image-matrix-builder.ts +31 -0
  485. package/src/pdf/utils/image-utils.ts +26 -0
  486. package/src/pdf/utils/list-utils.ts +194 -0
  487. package/src/pdf/utils/node-text-run-factory.ts +202 -0
  488. package/src/pdf/utils/page-resource-registrar.ts +46 -0
  489. package/src/pdf/utils/result-combiner.ts +102 -0
  490. package/src/pdf/utils/shadow-utils.ts +127 -0
  491. package/src/pdf/utils/text-alignment-resolver.ts +76 -0
  492. package/src/pdf/utils/text-decoration-utils.ts +64 -0
  493. package/src/pdf/utils/text-layout-adjuster.ts +185 -0
  494. package/src/pdf/utils/text-utils.ts +193 -0
  495. package/src/pdf/utils/transform-scope-manager.ts +69 -0
  496. package/src/render/offset.ts +170 -0
  497. package/src/shim/empty.ts +2 -0
  498. package/src/shim/fs-empty.ts +5 -0
  499. package/src/shim/url-empty.ts +7 -0
  500. package/src/shim/zlib-empty.ts +9 -0
  501. package/src/style/shorthands/index.ts +19 -0
  502. package/src/style/ua/defaults.ts +69 -0
  503. package/src/svg/index.ts +4 -0
  504. package/src/svg/parser-registry.ts +71 -0
  505. package/src/svg/parser.ts +486 -0
  506. package/src/svg/path-data.ts +515 -0
  507. package/src/svg/types.ts +194 -0
  508. package/src/text/line-breaker.ts +321 -0
  509. package/src/text/text-transform.ts +43 -0
  510. package/src/text/text.ts +33 -0
  511. package/src/transform/css-parser.ts +95 -0
  512. package/src/types/fonts.ts +62 -0
  513. package/src/types/public.ts +19 -0
  514. package/src/units/page-utils.ts +58 -0
  515. package/src/units/units.ts +50 -0
  516. package/src/utils/base64.ts +24 -0
  517. package/test-output.txt +79 -0
  518. package/tests/css/background-parser.spec.ts +14 -0
  519. package/tests/css/clip-path-parser.spec.ts +66 -0
  520. package/tests/environment/path-resolution.spec.ts +104 -0
  521. package/tests/helpers/ai-layout-diagnostics.ts +141 -0
  522. package/tests/helpers/render-utils.ts +52 -0
  523. package/tests/helpers/text-geometry.ts +56 -0
  524. package/tests/layout/custom-properties.test.ts +38 -0
  525. package/tests/layout/gap-calculator.spec.ts +196 -0
  526. package/tests/layout/inline-background-alignment.spec.ts +93 -0
  527. package/tests/layout/inline-fragments.spec.ts +26 -0
  528. package/tests/layout/run-placer-baseline.spec.ts +108 -0
  529. package/tests/pdf/alignments.spec.ts +26 -0
  530. package/tests/pdf/background-clip.spec.ts +57 -0
  531. package/tests/pdf/background-repeat-space-round.spec.ts +35 -0
  532. package/tests/pdf/background-repeat.spec.ts +137 -0
  533. package/tests/pdf/border-radius.spec.ts +151 -0
  534. package/tests/pdf/clip-path.spec.ts +92 -0
  535. package/tests/pdf/radial-gradient.spec.ts +50 -0
  536. package/tests/pdf/svg-stroke-dash.spec.ts +81 -0
  537. package/tests/pdf/text-transform-matrix.spec.ts +43 -0
  538. package/tsconfig.json +17 -0
  539. package/types/fonts.js +10 -0
  540. package/vitest.config.ts +9 -0
@@ -0,0 +1,430 @@
1
+ /* Copyright 2013 Google Inc. All Rights Reserved.
2
+
3
+ Distributed under MIT license.
4
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
5
+ */
6
+
7
+ /* Library for preprocessing fonts as part of the WOFF 2.0 conversion. */
8
+
9
+ #include "./transform.h"
10
+
11
+ #include <complex> // for std::abs
12
+
13
+ #include "./buffer.h"
14
+ #include "./font.h"
15
+ #include "./glyph.h"
16
+ #include "./table_tags.h"
17
+ #include "./variable_length.h"
18
+
19
+ namespace woff2 {
20
+
21
+ namespace {
22
+
23
+ const int FLAG_ARG_1_AND_2_ARE_WORDS = 1 << 0;
24
+ const int FLAG_WE_HAVE_INSTRUCTIONS = 1 << 8;
25
+ const int FLAG_OVERLAP_SIMPLE_BITMAP = 1 << 0;
26
+
27
+ void WriteBytes(std::vector<uint8_t>* out, const uint8_t* data, size_t len) {
28
+ if (len == 0) return;
29
+ size_t offset = out->size();
30
+ out->resize(offset + len);
31
+ memcpy(&(*out)[offset], data, len);
32
+ }
33
+
34
+ void WriteBytes(std::vector<uint8_t>* out, const std::vector<uint8_t>& in) {
35
+ for (size_t i = 0; i < in.size(); ++i) {
36
+ out->push_back(in[i]);
37
+ }
38
+ }
39
+
40
+ void WriteUShort(std::vector<uint8_t>* out, int value) {
41
+ out->push_back(value >> 8);
42
+ out->push_back(value & 255);
43
+ }
44
+
45
+ void WriteLong(std::vector<uint8_t>* out, int value) {
46
+ out->push_back((value >> 24) & 255);
47
+ out->push_back((value >> 16) & 255);
48
+ out->push_back((value >> 8) & 255);
49
+ out->push_back(value & 255);
50
+ }
51
+
52
+ // Glyf table preprocessing, based on
53
+ // GlyfEncoder.java
54
+ class GlyfEncoder {
55
+ public:
56
+ explicit GlyfEncoder(int num_glyphs)
57
+ : n_glyphs_(num_glyphs) {
58
+ bbox_bitmap_.resize(((num_glyphs + 31) >> 5) << 2);
59
+ }
60
+
61
+ bool Encode(int glyph_id, const Glyph& glyph) {
62
+ if (glyph.composite_data_size > 0) {
63
+ WriteCompositeGlyph(glyph_id, glyph);
64
+ } else if (glyph.contours.size() > 0) {
65
+ WriteSimpleGlyph(glyph_id, glyph);
66
+ } else {
67
+ WriteUShort(&n_contour_stream_, 0);
68
+ }
69
+ return true;
70
+ }
71
+
72
+ void GetTransformedGlyfBytes(std::vector<uint8_t>* result) {
73
+ WriteUShort(result, 0); // Version
74
+ WriteUShort(result, overlap_bitmap_.empty()
75
+ ? 0x00
76
+ : FLAG_OVERLAP_SIMPLE_BITMAP); // Flags
77
+ WriteUShort(result, n_glyphs_);
78
+ WriteUShort(result, 0); // index_format, will be set later
79
+ WriteLong(result, n_contour_stream_.size());
80
+ WriteLong(result, n_points_stream_.size());
81
+ WriteLong(result, flag_byte_stream_.size());
82
+ WriteLong(result, glyph_stream_.size());
83
+ WriteLong(result, composite_stream_.size());
84
+ WriteLong(result, bbox_bitmap_.size() + bbox_stream_.size());
85
+ WriteLong(result, instruction_stream_.size());
86
+ WriteBytes(result, n_contour_stream_);
87
+ WriteBytes(result, n_points_stream_);
88
+ WriteBytes(result, flag_byte_stream_);
89
+ WriteBytes(result, glyph_stream_);
90
+ WriteBytes(result, composite_stream_);
91
+ WriteBytes(result, bbox_bitmap_);
92
+ WriteBytes(result, bbox_stream_);
93
+ WriteBytes(result, instruction_stream_);
94
+ if (!overlap_bitmap_.empty()) {
95
+ WriteBytes(result, overlap_bitmap_);
96
+ }
97
+ }
98
+
99
+ private:
100
+ void WriteInstructions(const Glyph& glyph) {
101
+ Write255UShort(&glyph_stream_, glyph.instructions_size);
102
+ WriteBytes(&instruction_stream_,
103
+ glyph.instructions_data, glyph.instructions_size);
104
+ }
105
+
106
+ bool ShouldWriteSimpleGlyphBbox(const Glyph& glyph) {
107
+ if (glyph.contours.empty() || glyph.contours[0].empty()) {
108
+ return glyph.x_min || glyph.y_min || glyph.x_max || glyph.y_max;
109
+ }
110
+
111
+ int16_t x_min = glyph.contours[0][0].x;
112
+ int16_t y_min = glyph.contours[0][0].y;
113
+ int16_t x_max = x_min;
114
+ int16_t y_max = y_min;
115
+ for (const auto& contour : glyph.contours) {
116
+ for (const auto& point : contour) {
117
+ if (point.x < x_min) x_min = point.x;
118
+ if (point.x > x_max) x_max = point.x;
119
+ if (point.y < y_min) y_min = point.y;
120
+ if (point.y > y_max) y_max = point.y;
121
+ }
122
+ }
123
+
124
+ if (glyph.x_min != x_min)
125
+ return true;
126
+ if (glyph.y_min != y_min)
127
+ return true;
128
+ if (glyph.x_max != x_max)
129
+ return true;
130
+ if (glyph.y_max != y_max)
131
+ return true;
132
+
133
+ return false;
134
+ }
135
+
136
+ void WriteSimpleGlyph(int glyph_id, const Glyph& glyph) {
137
+ if (glyph.overlap_simple_flag_set) {
138
+ EnsureOverlapBitmap();
139
+ overlap_bitmap_[glyph_id >> 3] |= 0x80 >> (glyph_id & 7);
140
+ }
141
+ int num_contours = glyph.contours.size();
142
+ WriteUShort(&n_contour_stream_, num_contours);
143
+ if (ShouldWriteSimpleGlyphBbox(glyph)) {
144
+ WriteBbox(glyph_id, glyph);
145
+ }
146
+ for (int i = 0; i < num_contours; i++) {
147
+ Write255UShort(&n_points_stream_, glyph.contours[i].size());
148
+ }
149
+ int lastX = 0;
150
+ int lastY = 0;
151
+ for (int i = 0; i < num_contours; i++) {
152
+ int num_points = glyph.contours[i].size();
153
+ for (int j = 0; j < num_points; j++) {
154
+ int x = glyph.contours[i][j].x;
155
+ int y = glyph.contours[i][j].y;
156
+ int dx = x - lastX;
157
+ int dy = y - lastY;
158
+ WriteTriplet(glyph.contours[i][j].on_curve, dx, dy);
159
+ lastX = x;
160
+ lastY = y;
161
+ }
162
+ }
163
+ if (num_contours > 0) {
164
+ WriteInstructions(glyph);
165
+ }
166
+ }
167
+
168
+ void WriteCompositeGlyph(int glyph_id, const Glyph& glyph) {
169
+ WriteUShort(&n_contour_stream_, -1);
170
+ WriteBbox(glyph_id, glyph);
171
+ WriteBytes(&composite_stream_,
172
+ glyph.composite_data,
173
+ glyph.composite_data_size);
174
+ if (glyph.have_instructions) {
175
+ WriteInstructions(glyph);
176
+ }
177
+ }
178
+
179
+ void WriteBbox(int glyph_id, const Glyph& glyph) {
180
+ bbox_bitmap_[glyph_id >> 3] |= 0x80 >> (glyph_id & 7);
181
+ WriteUShort(&bbox_stream_, glyph.x_min);
182
+ WriteUShort(&bbox_stream_, glyph.y_min);
183
+ WriteUShort(&bbox_stream_, glyph.x_max);
184
+ WriteUShort(&bbox_stream_, glyph.y_max);
185
+ }
186
+
187
+ void WriteTriplet(bool on_curve, int x, int y) {
188
+ int abs_x = std::abs(x);
189
+ int abs_y = std::abs(y);
190
+ int on_curve_bit = on_curve ? 0 : 128;
191
+ int x_sign_bit = (x < 0) ? 0 : 1;
192
+ int y_sign_bit = (y < 0) ? 0 : 1;
193
+ int xy_sign_bits = x_sign_bit + 2 * y_sign_bit;
194
+ if (x == 0 && abs_y < 1280) {
195
+ flag_byte_stream_.push_back(on_curve_bit +
196
+ ((abs_y & 0xf00) >> 7) + y_sign_bit);
197
+ glyph_stream_.push_back(abs_y & 0xff);
198
+ } else if (y == 0 && abs_x < 1280) {
199
+ flag_byte_stream_.push_back(on_curve_bit + 10 +
200
+ ((abs_x & 0xf00) >> 7) + x_sign_bit);
201
+ glyph_stream_.push_back(abs_x & 0xff);
202
+ } else if (abs_x < 65 && abs_y < 65) {
203
+ flag_byte_stream_.push_back(on_curve_bit + 20 +
204
+ ((abs_x - 1) & 0x30) +
205
+ (((abs_y - 1) & 0x30) >> 2) +
206
+ xy_sign_bits);
207
+ glyph_stream_.push_back((((abs_x - 1) & 0xf) << 4) | ((abs_y - 1) & 0xf));
208
+ } else if (abs_x < 769 && abs_y < 769) {
209
+ flag_byte_stream_.push_back(on_curve_bit + 84 +
210
+ 12 * (((abs_x - 1) & 0x300) >> 8) +
211
+ (((abs_y - 1) & 0x300) >> 6) + xy_sign_bits);
212
+ glyph_stream_.push_back((abs_x - 1) & 0xff);
213
+ glyph_stream_.push_back((abs_y - 1) & 0xff);
214
+ } else if (abs_x < 4096 && abs_y < 4096) {
215
+ flag_byte_stream_.push_back(on_curve_bit + 120 + xy_sign_bits);
216
+ glyph_stream_.push_back(abs_x >> 4);
217
+ glyph_stream_.push_back(((abs_x & 0xf) << 4) | (abs_y >> 8));
218
+ glyph_stream_.push_back(abs_y & 0xff);
219
+ } else {
220
+ flag_byte_stream_.push_back(on_curve_bit + 124 + xy_sign_bits);
221
+ glyph_stream_.push_back(abs_x >> 8);
222
+ glyph_stream_.push_back(abs_x & 0xff);
223
+ glyph_stream_.push_back(abs_y >> 8);
224
+ glyph_stream_.push_back(abs_y & 0xff);
225
+ }
226
+ }
227
+
228
+ void EnsureOverlapBitmap() {
229
+ if (overlap_bitmap_.empty()) {
230
+ overlap_bitmap_.resize((n_glyphs_ + 7) >> 3);
231
+ }
232
+ }
233
+
234
+ std::vector<uint8_t> n_contour_stream_;
235
+ std::vector<uint8_t> n_points_stream_;
236
+ std::vector<uint8_t> flag_byte_stream_;
237
+ std::vector<uint8_t> composite_stream_;
238
+ std::vector<uint8_t> bbox_bitmap_;
239
+ std::vector<uint8_t> bbox_stream_;
240
+ std::vector<uint8_t> glyph_stream_;
241
+ std::vector<uint8_t> instruction_stream_;
242
+ std::vector<uint8_t> overlap_bitmap_;
243
+ int n_glyphs_;
244
+ };
245
+
246
+ } // namespace
247
+
248
+ bool TransformGlyfAndLocaTables(Font* font) {
249
+ // no transform for CFF
250
+ const Font::Table* glyf_table = font->FindTable(kGlyfTableTag);
251
+ const Font::Table* loca_table = font->FindTable(kLocaTableTag);
252
+
253
+ // If you don't have glyf/loca this transform isn't very interesting
254
+ if (loca_table == NULL && glyf_table == NULL) {
255
+ return true;
256
+ }
257
+ // It would be best if you didn't have just one of glyf/loca
258
+ if ((glyf_table == NULL) != (loca_table == NULL)) {
259
+ return FONT_COMPRESSION_FAILURE();
260
+ }
261
+ // Must share neither or both loca & glyf
262
+ if (loca_table->IsReused() != glyf_table->IsReused()) {
263
+ return FONT_COMPRESSION_FAILURE();
264
+ }
265
+ if (loca_table->IsReused()) {
266
+ return true;
267
+ }
268
+
269
+ Font::Table* transformed_glyf = &font->tables[kGlyfTableTag ^ 0x80808080];
270
+ Font::Table* transformed_loca = &font->tables[kLocaTableTag ^ 0x80808080];
271
+
272
+ int num_glyphs = NumGlyphs(*font);
273
+ GlyfEncoder encoder(num_glyphs);
274
+ for (int i = 0; i < num_glyphs; ++i) {
275
+ Glyph glyph;
276
+ const uint8_t* glyph_data;
277
+ size_t glyph_size;
278
+ if (!GetGlyphData(*font, i, &glyph_data, &glyph_size) ||
279
+ (glyph_size > 0 && !ReadGlyph(glyph_data, glyph_size, &glyph))) {
280
+ return FONT_COMPRESSION_FAILURE();
281
+ }
282
+ encoder.Encode(i, glyph);
283
+ }
284
+ encoder.GetTransformedGlyfBytes(&transformed_glyf->buffer);
285
+
286
+ const Font::Table* head_table = font->FindTable(kHeadTableTag);
287
+ if (head_table == NULL || head_table->length < 52) {
288
+ return FONT_COMPRESSION_FAILURE();
289
+ }
290
+ transformed_glyf->buffer[7] = head_table->data[51]; // index_format
291
+
292
+ transformed_glyf->tag = kGlyfTableTag ^ 0x80808080;
293
+ transformed_glyf->length = transformed_glyf->buffer.size();
294
+ transformed_glyf->data = transformed_glyf->buffer.data();
295
+
296
+ transformed_loca->tag = kLocaTableTag ^ 0x80808080;
297
+ transformed_loca->length = 0;
298
+ transformed_loca->data = NULL;
299
+
300
+ return true;
301
+ }
302
+
303
+ // See https://www.microsoft.com/typography/otspec/hmtx.htm
304
+ // See WOFF2 spec, 5.4. Transformed hmtx table format
305
+ bool TransformHmtxTable(Font* font) {
306
+ const Font::Table* glyf_table = font->FindTable(kGlyfTableTag);
307
+ const Font::Table* hmtx_table = font->FindTable(kHmtxTableTag);
308
+ const Font::Table* hhea_table = font->FindTable(kHheaTableTag);
309
+
310
+ // If you don't have hmtx or a glyf not much is going to happen here
311
+ if (hmtx_table == NULL || glyf_table == NULL) {
312
+ return true;
313
+ }
314
+
315
+ // hmtx without hhea doesn't make sense
316
+ if (hhea_table == NULL) {
317
+ return FONT_COMPRESSION_FAILURE();
318
+ }
319
+
320
+ // Skip 34 to reach 'hhea' numberOfHMetrics
321
+ Buffer hhea_buf(hhea_table->data, hhea_table->length);
322
+ uint16_t num_hmetrics;
323
+ if (!hhea_buf.Skip(34) || !hhea_buf.ReadU16(&num_hmetrics)) {
324
+ return FONT_COMPRESSION_FAILURE();
325
+ }
326
+
327
+ // Must have at least one hMetric
328
+ if (num_hmetrics < 1) {
329
+ return FONT_COMPRESSION_FAILURE();
330
+ }
331
+
332
+ int num_glyphs = NumGlyphs(*font);
333
+
334
+ // Most fonts can be transformed; assume it's a go until proven otherwise
335
+ std::vector<uint16_t> advance_widths;
336
+ std::vector<int16_t> proportional_lsbs;
337
+ std::vector<int16_t> monospace_lsbs;
338
+
339
+ bool remove_proportional_lsb = true;
340
+ bool remove_monospace_lsb = (num_glyphs - num_hmetrics) > 0;
341
+
342
+ Buffer hmtx_buf(hmtx_table->data, hmtx_table->length);
343
+ for (int i = 0; i < num_glyphs; i++) {
344
+ Glyph glyph;
345
+ const uint8_t* glyph_data;
346
+ size_t glyph_size;
347
+ if (!GetGlyphData(*font, i, &glyph_data, &glyph_size) ||
348
+ (glyph_size > 0 && !ReadGlyph(glyph_data, glyph_size, &glyph))) {
349
+ return FONT_COMPRESSION_FAILURE();
350
+ }
351
+
352
+ uint16_t advance_width = 0;
353
+ int16_t lsb = 0;
354
+
355
+ if (i < num_hmetrics) {
356
+ // [0, num_hmetrics) are proportional hMetrics
357
+ if (!hmtx_buf.ReadU16(&advance_width)) {
358
+ return FONT_COMPRESSION_FAILURE();
359
+ }
360
+
361
+ if (!hmtx_buf.ReadS16(&lsb)) {
362
+ return FONT_COMPRESSION_FAILURE();
363
+ }
364
+
365
+ if (glyph_size > 0 && glyph.x_min != lsb) {
366
+ remove_proportional_lsb = false;
367
+ }
368
+
369
+ advance_widths.push_back(advance_width);
370
+ proportional_lsbs.push_back(lsb);
371
+ } else {
372
+ // [num_hmetrics, num_glyphs) are monospace leftSideBearing's
373
+ if (!hmtx_buf.ReadS16(&lsb)) {
374
+ return FONT_COMPRESSION_FAILURE();
375
+ }
376
+ if (glyph_size > 0 && glyph.x_min != lsb) {
377
+ remove_monospace_lsb = false;
378
+ }
379
+ monospace_lsbs.push_back(lsb);
380
+ }
381
+
382
+ // If we know we can't optimize, bail out completely
383
+ if (!remove_proportional_lsb && !remove_monospace_lsb) {
384
+ return true;
385
+ }
386
+ }
387
+
388
+ Font::Table* transformed_hmtx = &font->tables[kHmtxTableTag ^ 0x80808080];
389
+
390
+ uint8_t flags = 0;
391
+ size_t transformed_size = 1 + 2 * advance_widths.size();
392
+ if (remove_proportional_lsb) {
393
+ flags |= 1;
394
+ } else {
395
+ transformed_size += 2 * proportional_lsbs.size();
396
+ }
397
+ if (remove_monospace_lsb) {
398
+ flags |= 1 << 1;
399
+ } else {
400
+ transformed_size += 2 * monospace_lsbs.size();
401
+ }
402
+
403
+ transformed_hmtx->buffer.reserve(transformed_size);
404
+ std::vector<uint8_t>* out = &transformed_hmtx->buffer;
405
+ WriteBytes(out, &flags, 1);
406
+ for (uint16_t advance_width : advance_widths) {
407
+ WriteUShort(out, advance_width);
408
+ }
409
+
410
+ if (!remove_proportional_lsb) {
411
+ for (int16_t lsb : proportional_lsbs) {
412
+ WriteUShort(out, lsb);
413
+ }
414
+ }
415
+ if (!remove_monospace_lsb) {
416
+ for (int16_t lsb : monospace_lsbs) {
417
+ WriteUShort(out, lsb);
418
+ }
419
+ }
420
+
421
+ transformed_hmtx->tag = kHmtxTableTag ^ 0x80808080;
422
+ transformed_hmtx->flag_byte = 1 << 6;
423
+ transformed_hmtx->length = transformed_hmtx->buffer.size();
424
+ transformed_hmtx->data = transformed_hmtx->buffer.data();
425
+
426
+
427
+ return true;
428
+ }
429
+
430
+ } // namespace woff2
@@ -0,0 +1,26 @@
1
+ /* Copyright 2014 Google Inc. All Rights Reserved.
2
+
3
+ Distributed under MIT license.
4
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
5
+ */
6
+
7
+ /* Library for preprocessing fonts as part of the WOFF 2.0 conversion. */
8
+
9
+ #ifndef WOFF2_TRANSFORM_H_
10
+ #define WOFF2_TRANSFORM_H_
11
+
12
+ #include "./font.h"
13
+
14
+ namespace woff2 {
15
+
16
+ // Adds the transformed versions of the glyf and loca tables to the font. The
17
+ // transformed loca table has zero length. The tag of the transformed tables is
18
+ // derived from the original tag by flipping the MSBs of every byte.
19
+ bool TransformGlyfAndLocaTables(Font* font);
20
+
21
+ // Apply transformation to hmtx table if applicable for this font.
22
+ bool TransformHmtxTable(Font* font);
23
+
24
+ } // namespace woff2
25
+
26
+ #endif // WOFF2_TRANSFORM_H_
@@ -0,0 +1,129 @@
1
+ /* Copyright 2015 Google Inc. All Rights Reserved.
2
+
3
+ Distributed under MIT license.
4
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
5
+ */
6
+
7
+ /* Helper functions for woff2 variable length types: 255UInt16 and UIntBase128 */
8
+
9
+ #include "./variable_length.h"
10
+
11
+ namespace woff2 {
12
+
13
+ size_t Size255UShort(uint16_t value) {
14
+ size_t result = 3;
15
+ if (value < 253) {
16
+ result = 1;
17
+ } else if (value < 762) {
18
+ result = 2;
19
+ } else {
20
+ result = 3;
21
+ }
22
+ return result;
23
+ }
24
+
25
+ void Write255UShort(std::vector<uint8_t>* out, int value) {
26
+ if (value < 253) {
27
+ out->push_back(value);
28
+ } else if (value < 506) {
29
+ out->push_back(255);
30
+ out->push_back(value - 253);
31
+ } else if (value < 762) {
32
+ out->push_back(254);
33
+ out->push_back(value - 506);
34
+ } else {
35
+ out->push_back(253);
36
+ out->push_back(value >> 8);
37
+ out->push_back(value & 0xff);
38
+ }
39
+ }
40
+
41
+ void Store255UShort(int val, size_t* offset, uint8_t* dst) {
42
+ std::vector<uint8_t> packed;
43
+ Write255UShort(&packed, val);
44
+ for (uint8_t packed_byte : packed) {
45
+ dst[(*offset)++] = packed_byte;
46
+ }
47
+ }
48
+
49
+ // Based on section 6.1.1 of MicroType Express draft spec
50
+ bool Read255UShort(Buffer* buf, unsigned int* value) {
51
+ static const int kWordCode = 253;
52
+ static const int kOneMoreByteCode2 = 254;
53
+ static const int kOneMoreByteCode1 = 255;
54
+ static const int kLowestUCode = 253;
55
+ uint8_t code = 0;
56
+ if (!buf->ReadU8(&code)) {
57
+ return FONT_COMPRESSION_FAILURE();
58
+ }
59
+ if (code == kWordCode) {
60
+ uint16_t result = 0;
61
+ if (!buf->ReadU16(&result)) {
62
+ return FONT_COMPRESSION_FAILURE();
63
+ }
64
+ *value = result;
65
+ return true;
66
+ } else if (code == kOneMoreByteCode1) {
67
+ uint8_t result = 0;
68
+ if (!buf->ReadU8(&result)) {
69
+ return FONT_COMPRESSION_FAILURE();
70
+ }
71
+ *value = result + kLowestUCode;
72
+ return true;
73
+ } else if (code == kOneMoreByteCode2) {
74
+ uint8_t result = 0;
75
+ if (!buf->ReadU8(&result)) {
76
+ return FONT_COMPRESSION_FAILURE();
77
+ }
78
+ *value = result + kLowestUCode * 2;
79
+ return true;
80
+ } else {
81
+ *value = code;
82
+ return true;
83
+ }
84
+ }
85
+
86
+ bool ReadBase128(Buffer* buf, uint32_t* value) {
87
+ uint32_t result = 0;
88
+ for (size_t i = 0; i < 5; ++i) {
89
+ uint8_t code = 0;
90
+ if (!buf->ReadU8(&code)) {
91
+ return FONT_COMPRESSION_FAILURE();
92
+ }
93
+ // Leading zeros are invalid.
94
+ if (i == 0 && code == 0x80) {
95
+ return FONT_COMPRESSION_FAILURE();
96
+ }
97
+ // If any of the top seven bits are set then we're about to overflow.
98
+ if (result & 0xfe000000) {
99
+ return FONT_COMPRESSION_FAILURE();
100
+ }
101
+ result = (result << 7) | (code & 0x7f);
102
+ if ((code & 0x80) == 0) {
103
+ *value = result;
104
+ return true;
105
+ }
106
+ }
107
+ // Make sure not to exceed the size bound
108
+ return FONT_COMPRESSION_FAILURE();
109
+ }
110
+
111
+ size_t Base128Size(size_t n) {
112
+ size_t size = 1;
113
+ for (; n >= 128; n >>= 7) ++size;
114
+ return size;
115
+ }
116
+
117
+ void StoreBase128(size_t len, size_t* offset, uint8_t* dst) {
118
+ size_t size = Base128Size(len);
119
+ for (size_t i = 0; i < size; ++i) {
120
+ int b = static_cast<int>((len >> (7 * (size - i - 1))) & 0x7f);
121
+ if (i < size - 1) {
122
+ b |= 0x80;
123
+ }
124
+ dst[(*offset)++] = b;
125
+ }
126
+ }
127
+
128
+ } // namespace woff2
129
+
@@ -0,0 +1,30 @@
1
+ /* Copyright 2015 Google Inc. All Rights Reserved.
2
+
3
+ Distributed under MIT license.
4
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
5
+ */
6
+
7
+ /* Helper functions for woff2 variable length types: 255UInt16 and UIntBase128 */
8
+
9
+ #ifndef WOFF2_VARIABLE_LENGTH_H_
10
+ #define WOFF2_VARIABLE_LENGTH_H_
11
+
12
+ #include <inttypes.h>
13
+ #include <vector>
14
+ #include "./buffer.h"
15
+
16
+ namespace woff2 {
17
+
18
+ size_t Size255UShort(uint16_t value);
19
+ bool Read255UShort(Buffer* buf, unsigned int* value);
20
+ void Write255UShort(std::vector<uint8_t>* out, int value);
21
+ void Store255UShort(int val, size_t* offset, uint8_t* dst);
22
+
23
+ size_t Base128Size(size_t n);
24
+ bool ReadBase128(Buffer* buf, uint32_t* value);
25
+ void StoreBase128(size_t len, size_t* offset, uint8_t* dst);
26
+
27
+ } // namespace woff2
28
+
29
+ #endif // WOFF2_VARIABLE_LENGTH_H_
30
+
@@ -0,0 +1,50 @@
1
+ /* Copyright 2013 Google Inc. All Rights Reserved.
2
+
3
+ Distributed under MIT license.
4
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
5
+ */
6
+
7
+ /* Helpers common across multiple parts of woff2 */
8
+
9
+ #include <algorithm>
10
+
11
+ #include "./woff2_common.h"
12
+
13
+ #include "./port.h"
14
+
15
+ namespace woff2 {
16
+
17
+
18
+ uint32_t ComputeULongSum(const uint8_t* buf, size_t size) {
19
+ uint32_t checksum = 0;
20
+ size_t aligned_size = size & ~3;
21
+ for (size_t i = 0; i < aligned_size; i += 4) {
22
+ checksum +=
23
+ (buf[i] << 24) | (buf[i + 1] << 16) | (buf[i + 2] << 8) | buf[i + 3];
24
+ }
25
+
26
+ // treat size not aligned on 4 as if it were padded to 4 with 0's
27
+ if (size != aligned_size) {
28
+ uint32_t v = 0;
29
+ for (size_t i = aligned_size; i < size; ++i) {
30
+ v |= buf[i] << (24 - 8 * (i & 3));
31
+ }
32
+ checksum += v;
33
+ }
34
+
35
+ return checksum;
36
+ }
37
+
38
+ size_t CollectionHeaderSize(uint32_t header_version, uint32_t num_fonts) {
39
+ size_t size = 0;
40
+ if (header_version == 0x00020000) {
41
+ size += 12; // ulDsig{Tag,Length,Offset}
42
+ }
43
+ if (header_version == 0x00010000 || header_version == 0x00020000) {
44
+ size += 12 // TTCTag, Version, numFonts
45
+ + 4 * num_fonts; // OffsetTable[numFonts]
46
+ }
47
+ return size;
48
+ }
49
+
50
+ } // namespace woff2