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,314 @@
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
+ /* Glyph normalization */
8
+
9
+ #include "./normalize.h"
10
+
11
+ #include <inttypes.h>
12
+ #include <stddef.h>
13
+
14
+ #include "./buffer.h"
15
+ #include "./port.h"
16
+ #include "./font.h"
17
+ #include "./glyph.h"
18
+ #include "./round.h"
19
+ #include "./store_bytes.h"
20
+ #include "./table_tags.h"
21
+ #include "./woff2_common.h"
22
+
23
+ namespace woff2 {
24
+
25
+ namespace {
26
+
27
+ void StoreLoca(int index_fmt, uint32_t value, size_t* offset, uint8_t* dst) {
28
+ if (index_fmt == 0) {
29
+ Store16(value >> 1, offset, dst);
30
+ } else {
31
+ StoreU32(value, offset, dst);
32
+ }
33
+ }
34
+
35
+ } // namespace
36
+
37
+ namespace {
38
+
39
+ bool WriteNormalizedLoca(int index_fmt, int num_glyphs, Font* font) {
40
+ Font::Table* glyf_table = font->FindTable(kGlyfTableTag);
41
+ Font::Table* loca_table = font->FindTable(kLocaTableTag);
42
+
43
+ int glyph_sz = index_fmt == 0 ? 2 : 4;
44
+ loca_table->buffer.resize(Round4(num_glyphs + 1) * glyph_sz);
45
+ loca_table->length = (num_glyphs + 1) * glyph_sz;
46
+
47
+ uint8_t* glyf_dst = num_glyphs ? &glyf_table->buffer[0] : NULL;
48
+ uint8_t* loca_dst = &loca_table->buffer[0];
49
+ uint32_t glyf_offset = 0;
50
+ size_t loca_offset = 0;
51
+
52
+ for (int i = 0; i < num_glyphs; ++i) {
53
+ StoreLoca(index_fmt, glyf_offset, &loca_offset, loca_dst);
54
+ Glyph glyph;
55
+ const uint8_t* glyph_data;
56
+ size_t glyph_size;
57
+ if (!GetGlyphData(*font, i, &glyph_data, &glyph_size) ||
58
+ (glyph_size > 0 && !ReadGlyph(glyph_data, glyph_size, &glyph))) {
59
+ return FONT_COMPRESSION_FAILURE();
60
+ }
61
+ size_t glyf_dst_size = glyf_table->buffer.size() - glyf_offset;
62
+ if (!StoreGlyph(glyph, glyf_dst + glyf_offset, &glyf_dst_size)) {
63
+ return FONT_COMPRESSION_FAILURE();
64
+ }
65
+ glyf_dst_size = Round4(glyf_dst_size);
66
+ if (glyf_dst_size > std::numeric_limits<uint32_t>::max() ||
67
+ glyf_offset + static_cast<uint32_t>(glyf_dst_size) < glyf_offset ||
68
+ (index_fmt == 0 && glyf_offset + glyf_dst_size >= (1UL << 17))) {
69
+ return FONT_COMPRESSION_FAILURE();
70
+ }
71
+ glyf_offset += glyf_dst_size;
72
+ }
73
+
74
+ StoreLoca(index_fmt, glyf_offset, &loca_offset, loca_dst);
75
+
76
+ glyf_table->buffer.resize(glyf_offset);
77
+ glyf_table->data = glyf_offset ? &glyf_table->buffer[0] : NULL;
78
+ glyf_table->length = glyf_offset;
79
+ loca_table->data = loca_offset ? &loca_table->buffer[0] : NULL;
80
+
81
+ return true;
82
+ }
83
+
84
+ } // namespace
85
+
86
+ namespace {
87
+
88
+ bool MakeEditableBuffer(Font* font, int tableTag) {
89
+ Font::Table* table = font->FindTable(tableTag);
90
+ if (table == NULL) {
91
+ return FONT_COMPRESSION_FAILURE();
92
+ }
93
+ if (table->IsReused()) {
94
+ return true;
95
+ }
96
+ int sz = Round4(table->length);
97
+ table->buffer.resize(sz);
98
+ uint8_t* buf = &table->buffer[0];
99
+ memcpy(buf, table->data, table->length);
100
+ if (PREDICT_FALSE(sz > table->length)) {
101
+ memset(buf + table->length, 0, sz - table->length);
102
+ }
103
+ table->data = buf;
104
+ return true;
105
+ }
106
+
107
+ } // namespace
108
+
109
+ bool NormalizeGlyphs(Font* font) {
110
+ Font::Table* head_table = font->FindTable(kHeadTableTag);
111
+ Font::Table* glyf_table = font->FindTable(kGlyfTableTag);
112
+ Font::Table* loca_table = font->FindTable(kLocaTableTag);
113
+ if (head_table == NULL) {
114
+ return FONT_COMPRESSION_FAILURE();
115
+ }
116
+ // If you don't have glyf/loca this transform isn't very interesting
117
+ if (loca_table == NULL && glyf_table == NULL) {
118
+ return true;
119
+ }
120
+ // It would be best if you didn't have just one of glyf/loca
121
+ if ((glyf_table == NULL) != (loca_table == NULL)) {
122
+ return FONT_COMPRESSION_FAILURE();
123
+ }
124
+ // Must share neither or both loca & glyf
125
+ if (loca_table->IsReused() != glyf_table->IsReused()) {
126
+ return FONT_COMPRESSION_FAILURE();
127
+ }
128
+ if (loca_table->IsReused()) {
129
+ return true;
130
+ }
131
+
132
+ int index_fmt = head_table->data[51];
133
+ int num_glyphs = NumGlyphs(*font);
134
+
135
+ // We need to allocate a bit more than its original length for the normalized
136
+ // glyf table, since it can happen that the glyphs in the original table are
137
+ // 2-byte aligned, while in the normalized table they are 4-byte aligned.
138
+ // That gives a maximum of 2 bytes increase per glyph. However, there is no
139
+ // theoretical guarantee that the total size of the flags plus the coordinates
140
+ // is the smallest possible in the normalized version, so we have to allow
141
+ // some general overhead.
142
+ // TODO(user) Figure out some more precise upper bound on the size of
143
+ // the overhead.
144
+ size_t max_normalized_glyf_size = 1.1 * glyf_table->length + 2 * num_glyphs;
145
+
146
+ glyf_table->buffer.resize(max_normalized_glyf_size);
147
+
148
+ // if we can't write a loca using short's (index_fmt 0)
149
+ // try again using longs (index_fmt 1)
150
+ if (!WriteNormalizedLoca(index_fmt, num_glyphs, font)) {
151
+ if (index_fmt != 0) {
152
+ return FONT_COMPRESSION_FAILURE();
153
+ }
154
+
155
+ // Rewrite loca with 4-byte entries & update head to match
156
+ index_fmt = 1;
157
+ if (!WriteNormalizedLoca(index_fmt, num_glyphs, font)) {
158
+ return FONT_COMPRESSION_FAILURE();
159
+ }
160
+ head_table->buffer[51] = 1;
161
+ }
162
+
163
+ return true;
164
+ }
165
+
166
+ bool NormalizeOffsets(Font* font) {
167
+ uint32_t offset = 12 + 16 * font->num_tables;
168
+ for (auto tag : font->OutputOrderedTags()) {
169
+ auto& table = font->tables[tag];
170
+ table.offset = offset;
171
+ offset += Round4(table.length);
172
+ }
173
+ return true;
174
+ }
175
+
176
+ namespace {
177
+
178
+ uint32_t ComputeHeaderChecksum(const Font& font) {
179
+ uint32_t checksum = font.flavor;
180
+ uint16_t max_pow2 = font.num_tables ? Log2Floor(font.num_tables) : 0;
181
+ uint16_t search_range = max_pow2 ? 1 << (max_pow2 + 4) : 0;
182
+ uint16_t range_shift = (font.num_tables << 4) - search_range;
183
+ checksum += (font.num_tables << 16 | search_range);
184
+ checksum += (max_pow2 << 16 | range_shift);
185
+ for (const auto& i : font.tables) {
186
+ const Font::Table* table = &i.second;
187
+ if (table->IsReused()) {
188
+ table = table->reuse_of;
189
+ }
190
+ checksum += table->tag;
191
+ checksum += table->checksum;
192
+ checksum += table->offset;
193
+ checksum += table->length;
194
+ }
195
+ return checksum;
196
+ }
197
+
198
+ } // namespace
199
+
200
+ bool FixChecksums(Font* font) {
201
+ Font::Table* head_table = font->FindTable(kHeadTableTag);
202
+ if (head_table == NULL) {
203
+ return FONT_COMPRESSION_FAILURE();
204
+ }
205
+ if (head_table->reuse_of != NULL) {
206
+ head_table = head_table->reuse_of;
207
+ }
208
+ if (head_table->length < 12) {
209
+ return FONT_COMPRESSION_FAILURE();
210
+ }
211
+
212
+ uint8_t* head_buf = &head_table->buffer[0];
213
+ size_t offset = 8;
214
+ StoreU32(0, &offset, head_buf);
215
+ uint32_t file_checksum = 0;
216
+ uint32_t head_checksum = 0;
217
+ for (auto& i : font->tables) {
218
+ Font::Table* table = &i.second;
219
+ if (table->IsReused()) {
220
+ table = table->reuse_of;
221
+ }
222
+ table->checksum = ComputeULongSum(table->data, table->length);
223
+ file_checksum += table->checksum;
224
+
225
+ if (table->tag == kHeadTableTag) {
226
+ head_checksum = table->checksum;
227
+ }
228
+ }
229
+
230
+ file_checksum += ComputeHeaderChecksum(*font);
231
+ offset = 8;
232
+ StoreU32(0xb1b0afba - file_checksum, &offset, head_buf);
233
+
234
+ return true;
235
+ }
236
+
237
+ namespace {
238
+ bool MarkTransformed(Font* font) {
239
+ Font::Table* head_table = font->FindTable(kHeadTableTag);
240
+ if (head_table == NULL) {
241
+ return FONT_COMPRESSION_FAILURE();
242
+ }
243
+ if (head_table->reuse_of != NULL) {
244
+ head_table = head_table->reuse_of;
245
+ }
246
+ if (head_table->length < 17) {
247
+ return FONT_COMPRESSION_FAILURE();
248
+ }
249
+ // set bit 11 of head table 'flags' to indicate that font has undergone
250
+ // lossless modifying transform
251
+ int head_flags = head_table->data[16];
252
+ head_table->buffer[16] = head_flags | 0x08;
253
+ return true;
254
+ }
255
+ } // namespace
256
+
257
+
258
+ bool NormalizeWithoutFixingChecksums(Font* font) {
259
+ return (MakeEditableBuffer(font, kHeadTableTag) &&
260
+ RemoveDigitalSignature(font) &&
261
+ MarkTransformed(font) &&
262
+ NormalizeGlyphs(font) &&
263
+ NormalizeOffsets(font));
264
+ }
265
+
266
+ bool NormalizeFont(Font* font) {
267
+ return (NormalizeWithoutFixingChecksums(font) &&
268
+ FixChecksums(font));
269
+ }
270
+
271
+ bool NormalizeFontCollection(FontCollection* font_collection) {
272
+ if (font_collection->fonts.size() == 1) {
273
+ return NormalizeFont(&font_collection->fonts[0]);
274
+ }
275
+
276
+ uint32_t offset = CollectionHeaderSize(font_collection->header_version,
277
+ font_collection->fonts.size());
278
+ for (auto& font : font_collection->fonts) {
279
+ if (!NormalizeWithoutFixingChecksums(&font)) {
280
+ #ifdef FONT_COMPRESSION_BIN
281
+ fprintf(stderr, "Font normalization failed.\n");
282
+ #endif
283
+ return FONT_COMPRESSION_FAILURE();
284
+ }
285
+ offset += kSfntHeaderSize + kSfntEntrySize * font.num_tables;
286
+ }
287
+
288
+ // Start table offsets after TTC Header and Sfnt Headers
289
+ for (auto& font : font_collection->fonts) {
290
+ for (auto tag : font.OutputOrderedTags()) {
291
+ Font::Table& table = font.tables[tag];
292
+ if (table.IsReused()) {
293
+ table.offset = table.reuse_of->offset;
294
+ } else {
295
+ table.offset = offset;
296
+ offset += Round4(table.length);
297
+ }
298
+ }
299
+ }
300
+
301
+ // Now we can fix the checksums
302
+ for (auto& font : font_collection->fonts) {
303
+ if (!FixChecksums(&font)) {
304
+ #ifdef FONT_COMPRESSION_BIN
305
+ fprintf(stderr, "Failed to fix checksums\n");
306
+ #endif
307
+ return FONT_COMPRESSION_FAILURE();
308
+ }
309
+ }
310
+
311
+ return true;
312
+ }
313
+
314
+ } // namespace woff2
@@ -0,0 +1,39 @@
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
+ /* Functions for normalizing fonts. Since the WOFF 2.0 decoder creates font
8
+ files in normalized form, the WOFF 2.0 conversion is guaranteed to be
9
+ lossless (in a bitwise sense) only for normalized font files. */
10
+
11
+ #ifndef WOFF2_NORMALIZE_H_
12
+ #define WOFF2_NORMALIZE_H_
13
+
14
+ namespace woff2 {
15
+
16
+ struct Font;
17
+ struct FontCollection;
18
+
19
+ // Changes the offset fields of the table headers so that the data for the
20
+ // tables will be written in order of increasing tag values, without any gaps
21
+ // other than the 4-byte padding.
22
+ bool NormalizeOffsets(Font* font);
23
+
24
+ // Changes the checksum fields of the table headers and the checksum field of
25
+ // the head table so that it matches the current data.
26
+ bool FixChecksums(Font* font);
27
+
28
+ // Parses each of the glyphs in the font and writes them again to the glyf
29
+ // table in normalized form, as defined by the StoreGlyph() function. Changes
30
+ // the loca table accordigly.
31
+ bool NormalizeGlyphs(Font* font);
32
+
33
+ // Performs all of the normalization steps above.
34
+ bool NormalizeFont(Font* font);
35
+ bool NormalizeFontCollection(FontCollection* font_collection);
36
+
37
+ } // namespace woff2
38
+
39
+ #endif // WOFF2_NORMALIZE_H_
@@ -0,0 +1,66 @@
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
+ /* Helper function for bit twiddling and macros for branch prediction. */
8
+
9
+ #ifndef WOFF2_PORT_H_
10
+ #define WOFF2_PORT_H_
11
+
12
+ #include <assert.h>
13
+
14
+ namespace woff2 {
15
+
16
+ typedef unsigned int uint32;
17
+
18
+ inline int Log2Floor(uint32 n) {
19
+ #if defined(__GNUC__)
20
+ return n == 0 ? -1 : 31 ^ __builtin_clz(n);
21
+ #else
22
+ if (n == 0)
23
+ return -1;
24
+ int log = 0;
25
+ uint32 value = n;
26
+ for (int i = 4; i >= 0; --i) {
27
+ int shift = (1 << i);
28
+ uint32 x = value >> shift;
29
+ if (x != 0) {
30
+ value = x;
31
+ log += shift;
32
+ }
33
+ }
34
+ assert(value == 1);
35
+ return log;
36
+ #endif
37
+ }
38
+
39
+ } // namespace woff2
40
+
41
+ /* Compatibility with non-clang compilers. */
42
+ #ifndef __has_builtin
43
+ #define __has_builtin(x) 0
44
+ #endif
45
+
46
+ #if (__GNUC__ > 2) || (__GNUC__ == 2 && __GNUC_MINOR__ > 95) || \
47
+ (defined(__llvm__) && __has_builtin(__builtin_expect))
48
+ #define PREDICT_FALSE(x) (__builtin_expect(x, 0))
49
+ #define PREDICT_TRUE(x) (__builtin_expect(!!(x), 1))
50
+ #else
51
+ #define PREDICT_FALSE(x) (x)
52
+ #define PREDICT_TRUE(x) (x)
53
+ #endif
54
+
55
+ #if (defined(__ARM_ARCH) && (__ARM_ARCH == 7)) || \
56
+ (defined(M_ARM) && (M_ARM == 7)) || \
57
+ defined(__aarch64__) || defined(__ARM64_ARCH_8__) || defined(__i386) || \
58
+ defined(_M_IX86) || defined(__x86_64__) || defined(_M_X64)
59
+ #if defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
60
+ #define WOFF_LITTLE_ENDIAN
61
+ #elif defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
62
+ #define WOFF_BIG_ENDIAN
63
+ #endif /* endianness */
64
+ #endif /* CPU whitelist */
65
+
66
+ #endif // WOFF2_PORT_H_
@@ -0,0 +1,27 @@
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
+ /* Helper for rounding */
8
+
9
+ #ifndef WOFF2_ROUND_H_
10
+ #define WOFF2_ROUND_H_
11
+
12
+ #include <limits>
13
+
14
+ namespace woff2 {
15
+
16
+ // Round a value up to the nearest multiple of 4. Don't round the value in the
17
+ // case that rounding up overflows.
18
+ template<typename T> T Round4(T value) {
19
+ if (std::numeric_limits<T>::max() - value < 3) {
20
+ return value;
21
+ }
22
+ return (value + 3) & ~3;
23
+ }
24
+
25
+ } // namespace woff2
26
+
27
+ #endif // WOFF2_ROUND_H_
@@ -0,0 +1,55 @@
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
+ /* Helper functions for storing integer values into byte streams.
8
+ No bounds checking is performed, that is the responsibility of the caller. */
9
+
10
+ #ifndef WOFF2_STORE_BYTES_H_
11
+ #define WOFF2_STORE_BYTES_H_
12
+
13
+ #include <inttypes.h>
14
+ #include <stddef.h>
15
+ #include <string.h>
16
+
17
+ #include "./port.h"
18
+
19
+ namespace woff2 {
20
+
21
+ inline size_t StoreU32(uint8_t* dst, size_t offset, uint32_t x) {
22
+ dst[offset] = x >> 24;
23
+ dst[offset + 1] = x >> 16;
24
+ dst[offset + 2] = x >> 8;
25
+ dst[offset + 3] = x;
26
+ return offset + 4;
27
+ }
28
+
29
+ inline size_t Store16(uint8_t* dst, size_t offset, int x) {
30
+ dst[offset] = x >> 8;
31
+ dst[offset + 1] = x;
32
+ return offset + 2;
33
+ }
34
+
35
+ inline void StoreU32(uint32_t val, size_t* offset, uint8_t* dst) {
36
+ dst[(*offset)++] = val >> 24;
37
+ dst[(*offset)++] = val >> 16;
38
+ dst[(*offset)++] = val >> 8;
39
+ dst[(*offset)++] = val;
40
+ }
41
+
42
+ inline void Store16(int val, size_t* offset, uint8_t* dst) {
43
+ dst[(*offset)++] = val >> 8;
44
+ dst[(*offset)++] = val;
45
+ }
46
+
47
+ inline void StoreBytes(const uint8_t* data, size_t len,
48
+ size_t* offset, uint8_t* dst) {
49
+ memcpy(&dst[*offset], data, len);
50
+ *offset += len;
51
+ }
52
+
53
+ } // namespace woff2
54
+
55
+ #endif // WOFF2_STORE_BYTES_H_
@@ -0,0 +1,82 @@
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
+ /* Font table tags */
8
+
9
+ #include "./table_tags.h"
10
+
11
+ namespace woff2 {
12
+
13
+ // Note that the byte order is big-endian, not the same as ots.cc
14
+ #define TAG(a, b, c, d) ((a << 24) | (b << 16) | (c << 8) | d)
15
+
16
+ const uint32_t kKnownTags[63] = {
17
+ TAG('c', 'm', 'a', 'p'), // 0
18
+ TAG('h', 'e', 'a', 'd'), // 1
19
+ TAG('h', 'h', 'e', 'a'), // 2
20
+ TAG('h', 'm', 't', 'x'), // 3
21
+ TAG('m', 'a', 'x', 'p'), // 4
22
+ TAG('n', 'a', 'm', 'e'), // 5
23
+ TAG('O', 'S', '/', '2'), // 6
24
+ TAG('p', 'o', 's', 't'), // 7
25
+ TAG('c', 'v', 't', ' '), // 8
26
+ TAG('f', 'p', 'g', 'm'), // 9
27
+ TAG('g', 'l', 'y', 'f'), // 10
28
+ TAG('l', 'o', 'c', 'a'), // 11
29
+ TAG('p', 'r', 'e', 'p'), // 12
30
+ TAG('C', 'F', 'F', ' '), // 13
31
+ TAG('V', 'O', 'R', 'G'), // 14
32
+ TAG('E', 'B', 'D', 'T'), // 15
33
+ TAG('E', 'B', 'L', 'C'), // 16
34
+ TAG('g', 'a', 's', 'p'), // 17
35
+ TAG('h', 'd', 'm', 'x'), // 18
36
+ TAG('k', 'e', 'r', 'n'), // 19
37
+ TAG('L', 'T', 'S', 'H'), // 20
38
+ TAG('P', 'C', 'L', 'T'), // 21
39
+ TAG('V', 'D', 'M', 'X'), // 22
40
+ TAG('v', 'h', 'e', 'a'), // 23
41
+ TAG('v', 'm', 't', 'x'), // 24
42
+ TAG('B', 'A', 'S', 'E'), // 25
43
+ TAG('G', 'D', 'E', 'F'), // 26
44
+ TAG('G', 'P', 'O', 'S'), // 27
45
+ TAG('G', 'S', 'U', 'B'), // 28
46
+ TAG('E', 'B', 'S', 'C'), // 29
47
+ TAG('J', 'S', 'T', 'F'), // 30
48
+ TAG('M', 'A', 'T', 'H'), // 31
49
+ TAG('C', 'B', 'D', 'T'), // 32
50
+ TAG('C', 'B', 'L', 'C'), // 33
51
+ TAG('C', 'O', 'L', 'R'), // 34
52
+ TAG('C', 'P', 'A', 'L'), // 35
53
+ TAG('S', 'V', 'G', ' '), // 36
54
+ TAG('s', 'b', 'i', 'x'), // 37
55
+ TAG('a', 'c', 'n', 't'), // 38
56
+ TAG('a', 'v', 'a', 'r'), // 39
57
+ TAG('b', 'd', 'a', 't'), // 40
58
+ TAG('b', 'l', 'o', 'c'), // 41
59
+ TAG('b', 's', 'l', 'n'), // 42
60
+ TAG('c', 'v', 'a', 'r'), // 43
61
+ TAG('f', 'd', 's', 'c'), // 44
62
+ TAG('f', 'e', 'a', 't'), // 45
63
+ TAG('f', 'm', 't', 'x'), // 46
64
+ TAG('f', 'v', 'a', 'r'), // 47
65
+ TAG('g', 'v', 'a', 'r'), // 48
66
+ TAG('h', 's', 't', 'y'), // 49
67
+ TAG('j', 'u', 's', 't'), // 50
68
+ TAG('l', 'c', 'a', 'r'), // 51
69
+ TAG('m', 'o', 'r', 't'), // 52
70
+ TAG('m', 'o', 'r', 'x'), // 53
71
+ TAG('o', 'p', 'b', 'd'), // 54
72
+ TAG('p', 'r', 'o', 'p'), // 55
73
+ TAG('t', 'r', 'a', 'k'), // 56
74
+ TAG('Z', 'a', 'p', 'f'), // 57
75
+ TAG('S', 'i', 'l', 'f'), // 58
76
+ TAG('G', 'l', 'a', 't'), // 59
77
+ TAG('G', 'l', 'o', 'c'), // 60
78
+ TAG('F', 'e', 'a', 't'), // 61
79
+ TAG('S', 'i', 'l', 'l'), // 62
80
+ };
81
+
82
+ } // namespace woff2
@@ -0,0 +1,30 @@
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
+ /* Font table tags */
8
+
9
+ #ifndef WOFF2_TABLE_TAGS_H_
10
+ #define WOFF2_TABLE_TAGS_H_
11
+
12
+ #include <inttypes.h>
13
+
14
+ namespace woff2 {
15
+
16
+ // Tags of popular tables.
17
+ static const uint32_t kGlyfTableTag = 0x676c7966;
18
+ static const uint32_t kHeadTableTag = 0x68656164;
19
+ static const uint32_t kLocaTableTag = 0x6c6f6361;
20
+ static const uint32_t kDsigTableTag = 0x44534947;
21
+ static const uint32_t kCffTableTag = 0x43464620;
22
+ static const uint32_t kHmtxTableTag = 0x686d7478;
23
+ static const uint32_t kHheaTableTag = 0x68686561;
24
+ static const uint32_t kMaxpTableTag = 0x6d617870;
25
+
26
+ extern const uint32_t kKnownTags[];
27
+
28
+ } // namespace woff2
29
+
30
+ #endif // WOFF2_TABLE_TAGS_H_