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,86 @@
1
+ /* Copyright 2016 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
+ /* Output buffer for WOFF2 decompression. */
8
+
9
+ #ifndef WOFF2_WOFF2_OUT_H_
10
+ #define WOFF2_WOFF2_OUT_H_
11
+
12
+ #include <algorithm>
13
+ #include <cstring>
14
+ #include <memory>
15
+ #include <string>
16
+
17
+ namespace woff2 {
18
+
19
+ // Suggested max size for output.
20
+ const size_t kDefaultMaxSize = 30 * 1024 * 1024;
21
+
22
+ /**
23
+ * Output interface for the woff2 decoding.
24
+ *
25
+ * Writes to arbitrary offsets are supported to facilitate updating offset
26
+ * table and checksums after tables are ready. Reading the current size is
27
+ * supported so a 'loca' table can be built up while writing glyphs.
28
+ *
29
+ * By default limits size to kDefaultMaxSize.
30
+ */
31
+ class WOFF2Out {
32
+ public:
33
+ virtual ~WOFF2Out(void) {}
34
+
35
+ // Append n bytes of data from buf.
36
+ // Return true if all written, false otherwise.
37
+ virtual bool Write(const void *buf, size_t n) = 0;
38
+
39
+ // Write n bytes of data from buf at offset.
40
+ // Return true if all written, false otherwise.
41
+ virtual bool Write(const void *buf, size_t offset, size_t n) = 0;
42
+
43
+ virtual size_t Size() = 0;
44
+ };
45
+
46
+ /**
47
+ * Expanding memory block for woff2 out. By default limited to kDefaultMaxSize.
48
+ */
49
+ class WOFF2StringOut : public WOFF2Out {
50
+ public:
51
+ // Create a writer that writes its data to buf.
52
+ // buf->size() will grow to at most max_size
53
+ // buf may be sized (e.g. using EstimateWOFF2FinalSize) or empty.
54
+ explicit WOFF2StringOut(std::string *buf);
55
+
56
+ bool Write(const void *buf, size_t n) override;
57
+ bool Write(const void *buf, size_t offset, size_t n) override;
58
+ size_t Size() override { return offset_; }
59
+ size_t MaxSize() { return max_size_; }
60
+ void SetMaxSize(size_t max_size);
61
+ private:
62
+ std::string *buf_;
63
+ size_t max_size_;
64
+ size_t offset_;
65
+ };
66
+
67
+ /**
68
+ * Fixed memory block for woff2 out.
69
+ */
70
+ class WOFF2MemoryOut : public WOFF2Out {
71
+ public:
72
+ // Create a writer that writes its data to buf.
73
+ WOFF2MemoryOut(uint8_t* buf, size_t buf_size);
74
+
75
+ bool Write(const void *buf, size_t n) override;
76
+ bool Write(const void *buf, size_t offset, size_t n) override;
77
+ size_t Size() override { return offset_; }
78
+ private:
79
+ uint8_t* buf_;
80
+ size_t buf_size_;
81
+ size_t offset_;
82
+ };
83
+
84
+ } // namespace woff2
85
+
86
+ #endif // WOFF2_WOFF2_OUT_H_
@@ -0,0 +1,164 @@
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
+ /* The parts of ots.h & opentype-sanitiser.h that we need, taken from the
8
+ https://code.google.com/p/ots/ project. */
9
+
10
+ #ifndef WOFF2_BUFFER_H_
11
+ #define WOFF2_BUFFER_H_
12
+
13
+ #if defined(_WIN32)
14
+ #include <stdlib.h>
15
+ typedef signed char int8_t;
16
+ typedef unsigned char uint8_t;
17
+ typedef short int16_t;
18
+ typedef unsigned short uint16_t;
19
+ typedef int int32_t;
20
+ typedef unsigned int uint32_t;
21
+ typedef __int64 int64_t;
22
+ typedef unsigned __int64 uint64_t;
23
+ #define ntohl(x) _byteswap_ulong (x)
24
+ #define ntohs(x) _byteswap_ushort (x)
25
+ #define htonl(x) _byteswap_ulong (x)
26
+ #define htons(x) _byteswap_ushort (x)
27
+ #else
28
+ #include <arpa/inet.h>
29
+ #include <stdint.h>
30
+ #endif
31
+
32
+ #include <cstdio>
33
+ #include <cstdlib>
34
+ #include <cstring>
35
+ #include <limits>
36
+
37
+ namespace woff2 {
38
+
39
+ #if defined(_MSC_VER) || !defined(FONT_COMPRESSION_DEBUG)
40
+ #define FONT_COMPRESSION_FAILURE() false
41
+ #else
42
+ #define FONT_COMPRESSION_FAILURE() \
43
+ woff2::Failure(__FILE__, __LINE__, __PRETTY_FUNCTION__)
44
+ inline bool Failure(const char *f, int l, const char *fn) {
45
+ fprintf(stderr, "ERROR at %s:%d (%s)\n", f, l, fn);
46
+ fflush(stderr);
47
+ return false;
48
+ }
49
+ #endif
50
+
51
+ // -----------------------------------------------------------------------------
52
+ // Buffer helper class
53
+ //
54
+ // This class perform some trival buffer operations while checking for
55
+ // out-of-bounds errors. As a family they return false if anything is amiss,
56
+ // updating the current offset otherwise.
57
+ // -----------------------------------------------------------------------------
58
+ class Buffer {
59
+ public:
60
+ Buffer(const uint8_t *data, size_t len)
61
+ : buffer_(data),
62
+ length_(len),
63
+ offset_(0) { }
64
+
65
+ bool Skip(size_t n_bytes) {
66
+ return Read(NULL, n_bytes);
67
+ }
68
+
69
+ bool Read(uint8_t *data, size_t n_bytes) {
70
+ if (n_bytes > 1024 * 1024 * 1024) {
71
+ return FONT_COMPRESSION_FAILURE();
72
+ }
73
+ if ((offset_ + n_bytes > length_) ||
74
+ (offset_ > length_ - n_bytes)) {
75
+ return FONT_COMPRESSION_FAILURE();
76
+ }
77
+ if (data) {
78
+ std::memcpy(data, buffer_ + offset_, n_bytes);
79
+ }
80
+ offset_ += n_bytes;
81
+ return true;
82
+ }
83
+
84
+ inline bool ReadU8(uint8_t *value) {
85
+ if (offset_ + 1 > length_) {
86
+ return FONT_COMPRESSION_FAILURE();
87
+ }
88
+ *value = buffer_[offset_];
89
+ ++offset_;
90
+ return true;
91
+ }
92
+
93
+ bool ReadU16(uint16_t *value) {
94
+ if (offset_ + 2 > length_) {
95
+ return FONT_COMPRESSION_FAILURE();
96
+ }
97
+ std::memcpy(value, buffer_ + offset_, sizeof(uint16_t));
98
+ *value = ntohs(*value);
99
+ offset_ += 2;
100
+ return true;
101
+ }
102
+
103
+ bool ReadS16(int16_t *value) {
104
+ return ReadU16(reinterpret_cast<uint16_t*>(value));
105
+ }
106
+
107
+ bool ReadU24(uint32_t *value) {
108
+ if (offset_ + 3 > length_) {
109
+ return FONT_COMPRESSION_FAILURE();
110
+ }
111
+ *value = static_cast<uint32_t>(buffer_[offset_]) << 16 |
112
+ static_cast<uint32_t>(buffer_[offset_ + 1]) << 8 |
113
+ static_cast<uint32_t>(buffer_[offset_ + 2]);
114
+ offset_ += 3;
115
+ return true;
116
+ }
117
+
118
+ bool ReadU32(uint32_t *value) {
119
+ if (offset_ + 4 > length_) {
120
+ return FONT_COMPRESSION_FAILURE();
121
+ }
122
+ std::memcpy(value, buffer_ + offset_, sizeof(uint32_t));
123
+ *value = ntohl(*value);
124
+ offset_ += 4;
125
+ return true;
126
+ }
127
+
128
+ bool ReadS32(int32_t *value) {
129
+ return ReadU32(reinterpret_cast<uint32_t*>(value));
130
+ }
131
+
132
+ bool ReadTag(uint32_t *value) {
133
+ if (offset_ + 4 > length_) {
134
+ return FONT_COMPRESSION_FAILURE();
135
+ }
136
+ std::memcpy(value, buffer_ + offset_, sizeof(uint32_t));
137
+ offset_ += 4;
138
+ return true;
139
+ }
140
+
141
+ bool ReadR64(uint64_t *value) {
142
+ if (offset_ + 8 > length_) {
143
+ return FONT_COMPRESSION_FAILURE();
144
+ }
145
+ std::memcpy(value, buffer_ + offset_, sizeof(uint64_t));
146
+ offset_ += 8;
147
+ return true;
148
+ }
149
+
150
+ const uint8_t *buffer() const { return buffer_; }
151
+ size_t offset() const { return offset_; }
152
+ size_t length() const { return length_; }
153
+
154
+ void set_offset(size_t newoffset) { offset_ = newoffset; }
155
+
156
+ private:
157
+ const uint8_t * const buffer_;
158
+ const size_t length_;
159
+ size_t offset_;
160
+ };
161
+
162
+ } // namespace woff2
163
+
164
+ #endif // WOFF2_BUFFER_H_
@@ -0,0 +1,13 @@
1
+ #include <stddef.h>
2
+ #include <stdint.h>
3
+
4
+ #include <woff2/decode.h>
5
+
6
+ // Entry point for LibFuzzer.
7
+ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
8
+ std::string buf;
9
+ woff2::WOFF2StringOut out(&buf);
10
+ out.SetMaxSize(30 * 1024 * 1024);
11
+ woff2::ConvertWOFF2ToTTF(data, size, &out);
12
+ return 0;
13
+ }
@@ -0,0 +1,12 @@
1
+ #include <string>
2
+ #include <woff2/decode.h>
3
+
4
+ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t data_size) {
5
+ // Decode using newer entry pattern.
6
+ // Same pattern as woff2_decompress.
7
+ std::string output(std::min(woff2::ComputeWOFF2FinalSize(data, data_size),
8
+ woff2::kDefaultMaxSize), 0);
9
+ woff2::WOFF2StringOut out(&output);
10
+ woff2::ConvertWOFF2ToTTF(data, data_size, &out);
11
+ return 0;
12
+ }
@@ -0,0 +1,30 @@
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
+ /* File IO helpers. */
8
+
9
+ #ifndef WOFF2_FILE_H_
10
+ #define WOFF2_FILE_H_
11
+
12
+ #include <fstream>
13
+ #include <iterator>
14
+
15
+ namespace woff2 {
16
+
17
+ inline std::string GetFileContent(std::string filename) {
18
+ std::ifstream ifs(filename.c_str(), std::ios::binary);
19
+ return std::string(std::istreambuf_iterator<char>(ifs.rdbuf()),
20
+ std::istreambuf_iterator<char>());
21
+ }
22
+
23
+ inline void SetFileContents(std::string filename, std::string::iterator start,
24
+ std::string::iterator end) {
25
+ std::ofstream ofs(filename.c_str(), std::ios::binary);
26
+ std::copy(start, end, std::ostream_iterator<char>(ofs));
27
+ }
28
+
29
+ } // namespace woff2
30
+ #endif // WOFF2_FILE_H_
@@ -0,0 +1,400 @@
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
+ /* Font management utilities */
8
+
9
+ #include "./font.h"
10
+
11
+ #include <algorithm>
12
+
13
+ #include "./buffer.h"
14
+ #include "./port.h"
15
+ #include "./store_bytes.h"
16
+ #include "./table_tags.h"
17
+ #include "./woff2_common.h"
18
+
19
+ namespace woff2 {
20
+
21
+ Font::Table* Font::FindTable(uint32_t tag) {
22
+ std::map<uint32_t, Font::Table>::iterator it = tables.find(tag);
23
+ return it == tables.end() ? 0 : &it->second;
24
+ }
25
+
26
+ const Font::Table* Font::FindTable(uint32_t tag) const {
27
+ std::map<uint32_t, Font::Table>::const_iterator it = tables.find(tag);
28
+ return it == tables.end() ? 0 : &it->second;
29
+ }
30
+
31
+ std::vector<uint32_t> Font::OutputOrderedTags() const {
32
+ std::vector<uint32_t> output_order;
33
+
34
+ for (const auto& i : tables) {
35
+ const Font::Table& table = i.second;
36
+ // This is a transformed table, we will write it together with the
37
+ // original version.
38
+ if (table.tag & 0x80808080) {
39
+ continue;
40
+ }
41
+ output_order.push_back(table.tag);
42
+ }
43
+
44
+ // Alphabetize then put loca immediately after glyf
45
+ auto glyf_loc = std::find(output_order.begin(), output_order.end(),
46
+ kGlyfTableTag);
47
+ auto loca_loc = std::find(output_order.begin(), output_order.end(),
48
+ kLocaTableTag);
49
+ if (glyf_loc != output_order.end() && loca_loc != output_order.end()) {
50
+ output_order.erase(loca_loc);
51
+ output_order.insert(std::find(output_order.begin(), output_order.end(),
52
+ kGlyfTableTag) + 1, kLocaTableTag);
53
+ }
54
+
55
+ return output_order;
56
+ }
57
+
58
+ bool ReadTrueTypeFont(Buffer* file, const uint8_t* data, size_t len,
59
+ Font* font) {
60
+ // We don't care about the search_range, entry_selector and range_shift
61
+ // fields, they will always be computed upon writing the font.
62
+ if (!file->ReadU16(&font->num_tables) ||
63
+ !file->Skip(6)) {
64
+ return FONT_COMPRESSION_FAILURE();
65
+ }
66
+
67
+ std::map<uint32_t, uint32_t> intervals;
68
+ for (uint16_t i = 0; i < font->num_tables; ++i) {
69
+ Font::Table table;
70
+ table.flag_byte = 0;
71
+ table.reuse_of = NULL;
72
+ if (!file->ReadU32(&table.tag) ||
73
+ !file->ReadU32(&table.checksum) ||
74
+ !file->ReadU32(&table.offset) ||
75
+ !file->ReadU32(&table.length)) {
76
+ return FONT_COMPRESSION_FAILURE();
77
+ }
78
+ if ((table.offset & 3) != 0 ||
79
+ table.length > len ||
80
+ len - table.length < table.offset) {
81
+ return FONT_COMPRESSION_FAILURE();
82
+ }
83
+ intervals[table.offset] = table.length;
84
+ table.data = data + table.offset;
85
+ if (font->tables.find(table.tag) != font->tables.end()) {
86
+ return FONT_COMPRESSION_FAILURE();
87
+ }
88
+ font->tables[table.tag] = table;
89
+ }
90
+
91
+ // Check that tables are non-overlapping.
92
+ uint32_t last_offset = 12UL + 16UL * font->num_tables;
93
+ for (const auto& i : intervals) {
94
+ if (i.first < last_offset || i.first + i.second < i.first) {
95
+ return FONT_COMPRESSION_FAILURE();
96
+ }
97
+ last_offset = i.first + i.second;
98
+ }
99
+
100
+ // Sanity check key tables
101
+ const Font::Table* head_table = font->FindTable(kHeadTableTag);
102
+ if (head_table != NULL && head_table->length < 52) {
103
+ return FONT_COMPRESSION_FAILURE();
104
+ }
105
+
106
+ return true;
107
+ }
108
+
109
+ bool ReadCollectionFont(Buffer* file, const uint8_t* data, size_t len,
110
+ Font* font,
111
+ std::map<uint32_t, Font::Table*>* all_tables) {
112
+ if (!file->ReadU32(&font->flavor)) {
113
+ return FONT_COMPRESSION_FAILURE();
114
+ }
115
+ if (!ReadTrueTypeFont(file, data, len, font)) {
116
+ return FONT_COMPRESSION_FAILURE();
117
+ }
118
+
119
+ for (auto& entry : font->tables) {
120
+ Font::Table& table = entry.second;
121
+
122
+ if (all_tables->find(table.offset) == all_tables->end()) {
123
+ (*all_tables)[table.offset] = font->FindTable(table.tag);
124
+ } else {
125
+ table.reuse_of = (*all_tables)[table.offset];
126
+ if (table.tag != table.reuse_of->tag) {
127
+ return FONT_COMPRESSION_FAILURE();
128
+ }
129
+ }
130
+
131
+ }
132
+ return true;
133
+ }
134
+
135
+ bool ReadTrueTypeCollection(Buffer* file, const uint8_t* data, size_t len,
136
+ FontCollection* font_collection) {
137
+ uint32_t num_fonts;
138
+
139
+ if (!file->ReadU32(&font_collection->header_version) ||
140
+ !file->ReadU32(&num_fonts)) {
141
+ return FONT_COMPRESSION_FAILURE();
142
+ }
143
+
144
+ std::vector<uint32_t> offsets;
145
+ for (size_t i = 0; i < num_fonts; i++) {
146
+ uint32_t offset;
147
+ if (!file->ReadU32(&offset)) {
148
+ return FONT_COMPRESSION_FAILURE();
149
+ }
150
+ offsets.push_back(offset);
151
+ }
152
+
153
+ font_collection->fonts.resize(offsets.size());
154
+ std::vector<Font>::iterator font_it = font_collection->fonts.begin();
155
+
156
+ std::map<uint32_t, Font::Table*> all_tables;
157
+ for (const auto offset : offsets) {
158
+ file->set_offset(offset);
159
+ Font& font = *font_it++;
160
+ if (!ReadCollectionFont(file, data, len, &font, &all_tables)) {
161
+ return FONT_COMPRESSION_FAILURE();
162
+ }
163
+ }
164
+
165
+ return true;
166
+ }
167
+
168
+ bool ReadFont(const uint8_t* data, size_t len, Font* font) {
169
+ Buffer file(data, len);
170
+
171
+ if (!file.ReadU32(&font->flavor)) {
172
+ return FONT_COMPRESSION_FAILURE();
173
+ }
174
+
175
+ if (font->flavor == kTtcFontFlavor) {
176
+ return FONT_COMPRESSION_FAILURE();
177
+ }
178
+ return ReadTrueTypeFont(&file, data, len, font);
179
+ }
180
+
181
+ bool ReadFontCollection(const uint8_t* data, size_t len,
182
+ FontCollection* font_collection) {
183
+ Buffer file(data, len);
184
+
185
+ if (!file.ReadU32(&font_collection->flavor)) {
186
+ return FONT_COMPRESSION_FAILURE();
187
+ }
188
+
189
+ if (font_collection->flavor != kTtcFontFlavor) {
190
+ font_collection->fonts.resize(1);
191
+ Font& font = font_collection->fonts[0];
192
+ font.flavor = font_collection->flavor;
193
+ return ReadTrueTypeFont(&file, data, len, &font);
194
+ }
195
+ return ReadTrueTypeCollection(&file, data, len, font_collection);
196
+ }
197
+
198
+ size_t FontFileSize(const Font& font) {
199
+ size_t max_offset = 12ULL + 16ULL * font.num_tables;
200
+ for (const auto& i : font.tables) {
201
+ const Font::Table& table = i.second;
202
+ size_t padding_size = (4 - (table.length & 3)) & 3;
203
+ size_t end_offset = (padding_size + table.offset) + table.length;
204
+ max_offset = std::max(max_offset, end_offset);
205
+ }
206
+ return max_offset;
207
+ }
208
+
209
+ size_t FontCollectionFileSize(const FontCollection& font_collection) {
210
+ size_t max_offset = 0;
211
+ for (auto& font : font_collection.fonts) {
212
+ // font file size actually just finds max offset
213
+ max_offset = std::max(max_offset, FontFileSize(font));
214
+ }
215
+ return max_offset;
216
+ }
217
+
218
+ bool WriteFont(const Font& font, uint8_t* dst, size_t dst_size) {
219
+ size_t offset = 0;
220
+ return WriteFont(font, &offset, dst, dst_size);
221
+ }
222
+
223
+ bool WriteTableRecord(const Font::Table* table, size_t* offset, uint8_t* dst,
224
+ size_t dst_size) {
225
+ if (dst_size < *offset + kSfntEntrySize) {
226
+ return FONT_COMPRESSION_FAILURE();
227
+ }
228
+ if (table->IsReused()) {
229
+ table = table->reuse_of;
230
+ }
231
+ StoreU32(table->tag, offset, dst);
232
+ StoreU32(table->checksum, offset, dst);
233
+ StoreU32(table->offset, offset, dst);
234
+ StoreU32(table->length, offset, dst);
235
+ return true;
236
+ }
237
+
238
+ bool WriteTable(const Font::Table& table, size_t* offset, uint8_t* dst,
239
+ size_t dst_size) {
240
+ if (!WriteTableRecord(&table, offset, dst, dst_size)) {
241
+ return false;
242
+ }
243
+
244
+ // Write the actual table data if it's the first time we've seen it
245
+ if (!table.IsReused()) {
246
+ if (table.offset + table.length < table.offset ||
247
+ dst_size < table.offset + table.length) {
248
+ return FONT_COMPRESSION_FAILURE();
249
+ }
250
+ memcpy(dst + table.offset, table.data, table.length);
251
+ size_t padding_size = (4 - (table.length & 3)) & 3;
252
+ if (table.offset + table.length + padding_size < padding_size ||
253
+ dst_size < table.offset + table.length + padding_size) {
254
+ return FONT_COMPRESSION_FAILURE();
255
+ }
256
+ memset(dst + table.offset + table.length, 0, padding_size);
257
+ }
258
+ return true;
259
+ }
260
+
261
+ bool WriteFont(const Font& font, size_t* offset, uint8_t* dst,
262
+ size_t dst_size) {
263
+ if (dst_size < 12ULL + 16ULL * font.num_tables) {
264
+ return FONT_COMPRESSION_FAILURE();
265
+ }
266
+ StoreU32(font.flavor, offset, dst);
267
+ Store16(font.num_tables, offset, dst);
268
+ uint16_t max_pow2 = font.num_tables ? Log2Floor(font.num_tables) : 0;
269
+ uint16_t search_range = max_pow2 ? 1 << (max_pow2 + 4) : 0;
270
+ uint16_t range_shift = (font.num_tables << 4) - search_range;
271
+ Store16(search_range, offset, dst);
272
+ Store16(max_pow2, offset, dst);
273
+ Store16(range_shift, offset, dst);
274
+
275
+ for (const auto& i : font.tables) {
276
+ if (!WriteTable(i.second, offset, dst, dst_size)) {
277
+ return false;
278
+ }
279
+ }
280
+
281
+ return true;
282
+ }
283
+
284
+ bool WriteFontCollection(const FontCollection& font_collection, uint8_t* dst,
285
+ size_t dst_size) {
286
+ size_t offset = 0;
287
+
288
+ // It's simpler if this just a simple sfnt
289
+ if (font_collection.flavor != kTtcFontFlavor) {
290
+ return WriteFont(font_collection.fonts[0], &offset, dst, dst_size);
291
+ }
292
+
293
+ // Write TTC header
294
+ StoreU32(kTtcFontFlavor, &offset, dst);
295
+ StoreU32(font_collection.header_version, &offset, dst);
296
+ StoreU32(font_collection.fonts.size(), &offset, dst);
297
+
298
+ // Offset Table, zeroed for now
299
+ size_t offset_table = offset; // where to write offsets later
300
+ for (size_t i = 0; i < font_collection.fonts.size(); i++) {
301
+ StoreU32(0, &offset, dst);
302
+ }
303
+
304
+ if (font_collection.header_version == 0x00020000) {
305
+ StoreU32(0, &offset, dst); // ulDsigTag
306
+ StoreU32(0, &offset, dst); // ulDsigLength
307
+ StoreU32(0, &offset, dst); // ulDsigOffset
308
+ }
309
+
310
+ // Write fonts and their offsets.
311
+ for (size_t i = 0; i < font_collection.fonts.size(); i++) {
312
+ const auto& font = font_collection.fonts[i];
313
+ StoreU32(offset, &offset_table, dst);
314
+ if (!WriteFont(font, &offset, dst, dst_size)) {
315
+ return false;
316
+ }
317
+ }
318
+
319
+ return true;
320
+ }
321
+
322
+ int NumGlyphs(const Font& font) {
323
+ const Font::Table* head_table = font.FindTable(kHeadTableTag);
324
+ const Font::Table* loca_table = font.FindTable(kLocaTableTag);
325
+ if (head_table == NULL || loca_table == NULL || head_table->length < 52) {
326
+ return 0;
327
+ }
328
+ int index_fmt = IndexFormat(font);
329
+ int loca_record_size = (index_fmt == 0 ? 2 : 4);
330
+ if (loca_table->length < loca_record_size) {
331
+ return 0;
332
+ }
333
+ return (loca_table->length / loca_record_size) - 1;
334
+ }
335
+
336
+ int IndexFormat(const Font& font) {
337
+ const Font::Table* head_table = font.FindTable(kHeadTableTag);
338
+ if (head_table == NULL) {
339
+ return 0;
340
+ }
341
+ return head_table->data[51];
342
+ }
343
+
344
+ bool Font::Table::IsReused() const {
345
+ return this->reuse_of != NULL;
346
+ }
347
+
348
+ bool GetGlyphData(const Font& font, int glyph_index,
349
+ const uint8_t** glyph_data, size_t* glyph_size) {
350
+ if (glyph_index < 0) {
351
+ return FONT_COMPRESSION_FAILURE();
352
+ }
353
+ const Font::Table* head_table = font.FindTable(kHeadTableTag);
354
+ const Font::Table* loca_table = font.FindTable(kLocaTableTag);
355
+ const Font::Table* glyf_table = font.FindTable(kGlyfTableTag);
356
+ if (head_table == NULL || loca_table == NULL || glyf_table == NULL ||
357
+ head_table->length < 52) {
358
+ return FONT_COMPRESSION_FAILURE();
359
+ }
360
+
361
+ int index_fmt = IndexFormat(font);
362
+
363
+ Buffer loca_buf(loca_table->data, loca_table->length);
364
+ if (index_fmt == 0) {
365
+ uint16_t offset1, offset2;
366
+ if (!loca_buf.Skip(2 * glyph_index) ||
367
+ !loca_buf.ReadU16(&offset1) ||
368
+ !loca_buf.ReadU16(&offset2) ||
369
+ offset2 < offset1 ||
370
+ 2 * offset2 > glyf_table->length) {
371
+ return FONT_COMPRESSION_FAILURE();
372
+ }
373
+ *glyph_data = glyf_table->data + 2 * offset1;
374
+ *glyph_size = 2 * (offset2 - offset1);
375
+ } else {
376
+ uint32_t offset1, offset2;
377
+ if (!loca_buf.Skip(4 * glyph_index) ||
378
+ !loca_buf.ReadU32(&offset1) ||
379
+ !loca_buf.ReadU32(&offset2) ||
380
+ offset2 < offset1 ||
381
+ offset2 > glyf_table->length) {
382
+ return FONT_COMPRESSION_FAILURE();
383
+ }
384
+ *glyph_data = glyf_table->data + offset1;
385
+ *glyph_size = offset2 - offset1;
386
+ }
387
+ return true;
388
+ }
389
+
390
+ bool RemoveDigitalSignature(Font* font) {
391
+ std::map<uint32_t, Font::Table>::iterator it =
392
+ font->tables.find(kDsigTableTag);
393
+ if (it != font->tables.end()) {
394
+ font->tables.erase(it);
395
+ font->num_tables = font->tables.size();
396
+ }
397
+ return true;
398
+ }
399
+
400
+ } // namespace woff2