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,105 @@
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
+ /* Data model for a font file in sfnt format, reading and writing functions and
8
+ accessors for the glyph data. */
9
+
10
+ #ifndef WOFF2_FONT_H_
11
+ #define WOFF2_FONT_H_
12
+
13
+ #include <stddef.h>
14
+ #include <inttypes.h>
15
+ #include <map>
16
+ #include <vector>
17
+
18
+ namespace woff2 {
19
+
20
+ // Represents an sfnt font file. Only the table directory is parsed, for the
21
+ // table data we only store a raw pointer, therefore a font object is valid only
22
+ // as long the data from which it was parsed is around.
23
+ struct Font {
24
+ uint32_t flavor;
25
+ uint16_t num_tables;
26
+
27
+ struct Table {
28
+ uint32_t tag;
29
+ uint32_t checksum;
30
+ uint32_t offset;
31
+ uint32_t length;
32
+ const uint8_t* data;
33
+
34
+ // Buffer used to mutate the data before writing out.
35
+ std::vector<uint8_t> buffer;
36
+
37
+ // If we've seen this tag/offset before, pointer to the first time we saw it
38
+ // If this is the first time we've seen this table, NULL
39
+ // Intended use is to bypass re-processing tables
40
+ Font::Table* reuse_of;
41
+
42
+ uint8_t flag_byte;
43
+
44
+ // Is this table reused by a TTC
45
+ bool IsReused() const;
46
+ };
47
+ std::map<uint32_t, Table> tables;
48
+ std::vector<uint32_t> OutputOrderedTags() const;
49
+
50
+ Table* FindTable(uint32_t tag);
51
+ const Table* FindTable(uint32_t tag) const;
52
+ };
53
+
54
+ // Accomodates both singular (OTF, TTF) and collection (TTC) fonts
55
+ struct FontCollection {
56
+ uint32_t flavor;
57
+ uint32_t header_version;
58
+ // (offset, first use of table*) pairs
59
+ std::map<uint32_t, Font::Table*> tables;
60
+ std::vector<Font> fonts;
61
+ };
62
+
63
+ // Parses the font from the given data. Returns false on parsing failure or
64
+ // buffer overflow. The font is valid only so long the input data pointer is
65
+ // valid. Does NOT support collections.
66
+ bool ReadFont(const uint8_t* data, size_t len, Font* font);
67
+
68
+ // Parses the font from the given data. Returns false on parsing failure or
69
+ // buffer overflow. The font is valid only so long the input data pointer is
70
+ // valid. Supports collections.
71
+ bool ReadFontCollection(const uint8_t* data, size_t len, FontCollection* fonts);
72
+
73
+ // Returns the file size of the font.
74
+ size_t FontFileSize(const Font& font);
75
+ size_t FontCollectionFileSize(const FontCollection& font);
76
+
77
+ // Writes the font into the specified dst buffer. The dst_size should be the
78
+ // same as returned by FontFileSize(). Returns false upon buffer overflow (which
79
+ // should not happen if dst_size was computed by FontFileSize()).
80
+ bool WriteFont(const Font& font, uint8_t* dst, size_t dst_size);
81
+ // Write the font at a specific offset
82
+ bool WriteFont(const Font& font, size_t* offset, uint8_t* dst, size_t dst_size);
83
+
84
+ bool WriteFontCollection(const FontCollection& font_collection, uint8_t* dst,
85
+ size_t dst_size);
86
+
87
+ // Returns the number of glyphs in the font.
88
+ // NOTE: Currently this works only for TrueType-flavored fonts, will return
89
+ // zero for CFF-flavored fonts.
90
+ int NumGlyphs(const Font& font);
91
+
92
+ // Returns the index format of the font
93
+ int IndexFormat(const Font& font);
94
+
95
+ // Sets *glyph_data and *glyph_size to point to the location of the glyph data
96
+ // with the given index. Returns false if the glyph is not found.
97
+ bool GetGlyphData(const Font& font, int glyph_index,
98
+ const uint8_t** glyph_data, size_t* glyph_size);
99
+
100
+ // Removes the digital signature (DSIG) table
101
+ bool RemoveDigitalSignature(Font* font);
102
+
103
+ } // namespace woff2
104
+
105
+ #endif // WOFF2_FONT_H_
@@ -0,0 +1,383 @@
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 manipulation */
8
+
9
+ #include "./glyph.h"
10
+
11
+ #include <stdlib.h>
12
+ #include <limits>
13
+ #include "./buffer.h"
14
+ #include "./store_bytes.h"
15
+
16
+ namespace woff2 {
17
+
18
+ static const int32_t kFLAG_ONCURVE = 1;
19
+ static const int32_t kFLAG_XSHORT = 1 << 1;
20
+ static const int32_t kFLAG_YSHORT = 1 << 2;
21
+ static const int32_t kFLAG_REPEAT = 1 << 3;
22
+ static const int32_t kFLAG_XREPEATSIGN = 1 << 4;
23
+ static const int32_t kFLAG_YREPEATSIGN = 1 << 5;
24
+ static const int32_t kFLAG_OVERLAP_SIMPLE = 1 << 6;
25
+ static const int32_t kFLAG_ARG_1_AND_2_ARE_WORDS = 1 << 0;
26
+ static const int32_t kFLAG_WE_HAVE_A_SCALE = 1 << 3;
27
+ static const int32_t kFLAG_MORE_COMPONENTS = 1 << 5;
28
+ static const int32_t kFLAG_WE_HAVE_AN_X_AND_Y_SCALE = 1 << 6;
29
+ static const int32_t kFLAG_WE_HAVE_A_TWO_BY_TWO = 1 << 7;
30
+ static const int32_t kFLAG_WE_HAVE_INSTRUCTIONS = 1 << 8;
31
+
32
+ bool ReadCompositeGlyphData(Buffer* buffer, Glyph* glyph) {
33
+ glyph->have_instructions = false;
34
+ glyph->composite_data = buffer->buffer() + buffer->offset();
35
+ size_t start_offset = buffer->offset();
36
+ uint16_t flags = kFLAG_MORE_COMPONENTS;
37
+ while (flags & kFLAG_MORE_COMPONENTS) {
38
+ if (!buffer->ReadU16(&flags)) {
39
+ return FONT_COMPRESSION_FAILURE();
40
+ }
41
+ glyph->have_instructions |= (flags & kFLAG_WE_HAVE_INSTRUCTIONS) != 0;
42
+ size_t arg_size = 2; // glyph index
43
+ if (flags & kFLAG_ARG_1_AND_2_ARE_WORDS) {
44
+ arg_size += 4;
45
+ } else {
46
+ arg_size += 2;
47
+ }
48
+ if (flags & kFLAG_WE_HAVE_A_SCALE) {
49
+ arg_size += 2;
50
+ } else if (flags & kFLAG_WE_HAVE_AN_X_AND_Y_SCALE) {
51
+ arg_size += 4;
52
+ } else if (flags & kFLAG_WE_HAVE_A_TWO_BY_TWO) {
53
+ arg_size += 8;
54
+ }
55
+ if (!buffer->Skip(arg_size)) {
56
+ return FONT_COMPRESSION_FAILURE();
57
+ }
58
+ }
59
+ if (buffer->offset() - start_offset > std::numeric_limits<uint32_t>::max()) {
60
+ return FONT_COMPRESSION_FAILURE();
61
+ }
62
+ glyph->composite_data_size = buffer->offset() - start_offset;
63
+ return true;
64
+ }
65
+
66
+ bool ReadGlyph(const uint8_t* data, size_t len, Glyph* glyph) {
67
+ Buffer buffer(data, len);
68
+
69
+ int16_t num_contours;
70
+ if (!buffer.ReadS16(&num_contours)) {
71
+ return FONT_COMPRESSION_FAILURE();
72
+ }
73
+
74
+ // Read the bounding box.
75
+ if (!buffer.ReadS16(&glyph->x_min) ||
76
+ !buffer.ReadS16(&glyph->y_min) ||
77
+ !buffer.ReadS16(&glyph->x_max) ||
78
+ !buffer.ReadS16(&glyph->y_max)) {
79
+ return FONT_COMPRESSION_FAILURE();
80
+ }
81
+
82
+ if (num_contours == 0) {
83
+ // Empty glyph.
84
+ return true;
85
+ }
86
+
87
+ if (num_contours > 0) {
88
+ // Simple glyph.
89
+ glyph->contours.resize(num_contours);
90
+
91
+ // Read the number of points per contour.
92
+ uint16_t last_point_index = 0;
93
+ for (int i = 0; i < num_contours; ++i) {
94
+ uint16_t point_index;
95
+ if (!buffer.ReadU16(&point_index)) {
96
+ return FONT_COMPRESSION_FAILURE();
97
+ }
98
+ uint16_t num_points = point_index - last_point_index + (i == 0 ? 1 : 0);
99
+ glyph->contours[i].resize(num_points);
100
+ last_point_index = point_index;
101
+ }
102
+
103
+ // Read the instructions.
104
+ if (!buffer.ReadU16(&glyph->instructions_size)) {
105
+ return FONT_COMPRESSION_FAILURE();
106
+ }
107
+ glyph->instructions_data = data + buffer.offset();
108
+ if (!buffer.Skip(glyph->instructions_size)) {
109
+ return FONT_COMPRESSION_FAILURE();
110
+ }
111
+
112
+ // Read the run-length coded flags.
113
+ std::vector<std::vector<uint8_t> > flags(num_contours);
114
+ {
115
+ uint8_t flag = 0;
116
+ uint8_t flag_repeat = 0;
117
+ for (int i = 0; i < num_contours; ++i) {
118
+ flags[i].resize(glyph->contours[i].size());
119
+ for (size_t j = 0; j < glyph->contours[i].size(); ++j) {
120
+ if (flag_repeat == 0) {
121
+ if (!buffer.ReadU8(&flag)) {
122
+ return FONT_COMPRESSION_FAILURE();
123
+ }
124
+ if (flag & kFLAG_REPEAT) {
125
+ if (!buffer.ReadU8(&flag_repeat)) {
126
+ return FONT_COMPRESSION_FAILURE();
127
+ }
128
+ }
129
+ } else {
130
+ flag_repeat--;
131
+ }
132
+ flags[i][j] = flag;
133
+ glyph->contours[i][j].on_curve = flag & kFLAG_ONCURVE;
134
+ }
135
+ }
136
+ }
137
+
138
+ if (!flags.empty() && !flags[0].empty()) {
139
+ glyph->overlap_simple_flag_set = (flags[0][0] & kFLAG_OVERLAP_SIMPLE);
140
+ }
141
+
142
+ // Read the x coordinates.
143
+ int prev_x = 0;
144
+ for (int i = 0; i < num_contours; ++i) {
145
+ for (size_t j = 0; j < glyph->contours[i].size(); ++j) {
146
+ uint8_t flag = flags[i][j];
147
+ if (flag & kFLAG_XSHORT) {
148
+ // single byte x-delta coord value
149
+ uint8_t x_delta;
150
+ if (!buffer.ReadU8(&x_delta)) {
151
+ return FONT_COMPRESSION_FAILURE();
152
+ }
153
+ int sign = (flag & kFLAG_XREPEATSIGN) ? 1 : -1;
154
+ glyph->contours[i][j].x = prev_x + sign * x_delta;
155
+ } else {
156
+ // double byte x-delta coord value
157
+ int16_t x_delta = 0;
158
+ if (!(flag & kFLAG_XREPEATSIGN)) {
159
+ if (!buffer.ReadS16(&x_delta)) {
160
+ return FONT_COMPRESSION_FAILURE();
161
+ }
162
+ }
163
+ glyph->contours[i][j].x = prev_x + x_delta;
164
+ }
165
+ prev_x = glyph->contours[i][j].x;
166
+ }
167
+ }
168
+
169
+ // Read the y coordinates.
170
+ int prev_y = 0;
171
+ for (int i = 0; i < num_contours; ++i) {
172
+ for (size_t j = 0; j < glyph->contours[i].size(); ++j) {
173
+ uint8_t flag = flags[i][j];
174
+ if (flag & kFLAG_YSHORT) {
175
+ // single byte y-delta coord value
176
+ uint8_t y_delta;
177
+ if (!buffer.ReadU8(&y_delta)) {
178
+ return FONT_COMPRESSION_FAILURE();
179
+ }
180
+ int sign = (flag & kFLAG_YREPEATSIGN) ? 1 : -1;
181
+ glyph->contours[i][j].y = prev_y + sign * y_delta;
182
+ } else {
183
+ // double byte y-delta coord value
184
+ int16_t y_delta = 0;
185
+ if (!(flag & kFLAG_YREPEATSIGN)) {
186
+ if (!buffer.ReadS16(&y_delta)) {
187
+ return FONT_COMPRESSION_FAILURE();
188
+ }
189
+ }
190
+ glyph->contours[i][j].y = prev_y + y_delta;
191
+ }
192
+ prev_y = glyph->contours[i][j].y;
193
+ }
194
+ }
195
+ } else if (num_contours == -1) {
196
+ // Composite glyph.
197
+ if (!ReadCompositeGlyphData(&buffer, glyph)) {
198
+ return FONT_COMPRESSION_FAILURE();
199
+ }
200
+ // Read the instructions.
201
+ if (glyph->have_instructions) {
202
+ if (!buffer.ReadU16(&glyph->instructions_size)) {
203
+ return FONT_COMPRESSION_FAILURE();
204
+ }
205
+ glyph->instructions_data = data + buffer.offset();
206
+ if (!buffer.Skip(glyph->instructions_size)) {
207
+ return FONT_COMPRESSION_FAILURE();
208
+ }
209
+ } else {
210
+ glyph->instructions_size = 0;
211
+ }
212
+ } else {
213
+ return FONT_COMPRESSION_FAILURE();
214
+ }
215
+ return true;
216
+ }
217
+
218
+ namespace {
219
+
220
+ void StoreBbox(const Glyph& glyph, size_t* offset, uint8_t* dst) {
221
+ Store16(glyph.x_min, offset, dst);
222
+ Store16(glyph.y_min, offset, dst);
223
+ Store16(glyph.x_max, offset, dst);
224
+ Store16(glyph.y_max, offset, dst);
225
+ }
226
+
227
+ void StoreInstructions(const Glyph& glyph, size_t* offset, uint8_t* dst) {
228
+ Store16(glyph.instructions_size, offset, dst);
229
+ StoreBytes(glyph.instructions_data, glyph.instructions_size, offset, dst);
230
+ }
231
+
232
+ bool StoreEndPtsOfContours(const Glyph& glyph, size_t* offset, uint8_t* dst) {
233
+ int end_point = -1;
234
+ for (const auto& contour : glyph.contours) {
235
+ end_point += contour.size();
236
+ if (contour.size() > std::numeric_limits<uint16_t>::max() ||
237
+ end_point > std::numeric_limits<uint16_t>::max()) {
238
+ return FONT_COMPRESSION_FAILURE();
239
+ }
240
+ Store16(end_point, offset, dst);
241
+ }
242
+ return true;
243
+ }
244
+
245
+ bool StorePoints(const Glyph& glyph, size_t* offset,
246
+ uint8_t* dst, size_t dst_size) {
247
+ int previous_flag = -1;
248
+ int repeat_count = 0;
249
+ int last_x = 0;
250
+ int last_y = 0;
251
+ size_t x_bytes = 0;
252
+ size_t y_bytes = 0;
253
+
254
+ // Store the flags and calculate the total size of the x and y coordinates.
255
+ for (const auto& contour : glyph.contours) {
256
+ for (const auto& point : contour) {
257
+ int flag = point.on_curve ? kFLAG_ONCURVE : 0;
258
+ if (previous_flag == -1 && glyph.overlap_simple_flag_set) {
259
+ // First flag needs to have overlap simple bit set.
260
+ flag = flag | kFLAG_OVERLAP_SIMPLE;
261
+ }
262
+ int dx = point.x - last_x;
263
+ int dy = point.y - last_y;
264
+ if (dx == 0) {
265
+ flag |= kFLAG_XREPEATSIGN;
266
+ } else if (dx > -256 && dx < 256) {
267
+ flag |= kFLAG_XSHORT | (dx > 0 ? kFLAG_XREPEATSIGN : 0);
268
+ x_bytes += 1;
269
+ } else {
270
+ x_bytes += 2;
271
+ }
272
+ if (dy == 0) {
273
+ flag |= kFLAG_YREPEATSIGN;
274
+ } else if (dy > -256 && dy < 256) {
275
+ flag |= kFLAG_YSHORT | (dy > 0 ? kFLAG_YREPEATSIGN : 0);
276
+ y_bytes += 1;
277
+ } else {
278
+ y_bytes += 2;
279
+ }
280
+ if (flag == previous_flag && repeat_count != 255) {
281
+ dst[*offset - 1] |= kFLAG_REPEAT;
282
+ repeat_count++;
283
+ } else {
284
+ if (repeat_count != 0) {
285
+ if (*offset >= dst_size) {
286
+ return FONT_COMPRESSION_FAILURE();
287
+ }
288
+ dst[(*offset)++] = repeat_count;
289
+ }
290
+ if (*offset >= dst_size) {
291
+ return FONT_COMPRESSION_FAILURE();
292
+ }
293
+ dst[(*offset)++] = flag;
294
+ repeat_count = 0;
295
+ }
296
+ last_x = point.x;
297
+ last_y = point.y;
298
+ previous_flag = flag;
299
+ }
300
+ }
301
+ if (repeat_count != 0) {
302
+ if (*offset >= dst_size) {
303
+ return FONT_COMPRESSION_FAILURE();
304
+ }
305
+ dst[(*offset)++] = repeat_count;
306
+ }
307
+
308
+ if (*offset + x_bytes + y_bytes > dst_size) {
309
+ return FONT_COMPRESSION_FAILURE();
310
+ }
311
+
312
+ // Store the x and y coordinates.
313
+ size_t x_offset = *offset;
314
+ size_t y_offset = *offset + x_bytes;
315
+ last_x = 0;
316
+ last_y = 0;
317
+ for (const auto& contour : glyph.contours) {
318
+ for (const auto& point : contour) {
319
+ int dx = point.x - last_x;
320
+ int dy = point.y - last_y;
321
+ if (dx == 0) {
322
+ // pass
323
+ } else if (dx > -256 && dx < 256) {
324
+ dst[x_offset++] = std::abs(dx);
325
+ } else {
326
+ Store16(dx, &x_offset, dst);
327
+ }
328
+ if (dy == 0) {
329
+ // pass
330
+ } else if (dy > -256 && dy < 256) {
331
+ dst[y_offset++] = std::abs(dy);
332
+ } else {
333
+ Store16(dy, &y_offset, dst);
334
+ }
335
+ last_x += dx;
336
+ last_y += dy;
337
+ }
338
+ }
339
+ *offset = y_offset;
340
+ return true;
341
+ }
342
+
343
+ } // namespace
344
+
345
+ bool StoreGlyph(const Glyph& glyph, uint8_t* dst, size_t* dst_size) {
346
+ size_t offset = 0;
347
+ if (glyph.composite_data_size > 0) {
348
+ // Composite glyph.
349
+ if (*dst_size < ((10ULL + glyph.composite_data_size) +
350
+ ((glyph.have_instructions ? 2ULL : 0) +
351
+ glyph.instructions_size))) {
352
+ return FONT_COMPRESSION_FAILURE();
353
+ }
354
+ Store16(-1, &offset, dst);
355
+ StoreBbox(glyph, &offset, dst);
356
+ StoreBytes(glyph.composite_data, glyph.composite_data_size, &offset, dst);
357
+ if (glyph.have_instructions) {
358
+ StoreInstructions(glyph, &offset, dst);
359
+ }
360
+ } else if (glyph.contours.size() > 0) {
361
+ // Simple glyph.
362
+ if (glyph.contours.size() > std::numeric_limits<int16_t>::max()) {
363
+ return FONT_COMPRESSION_FAILURE();
364
+ }
365
+ if (*dst_size < ((12ULL + 2 * glyph.contours.size()) +
366
+ glyph.instructions_size)) {
367
+ return FONT_COMPRESSION_FAILURE();
368
+ }
369
+ Store16(glyph.contours.size(), &offset, dst);
370
+ StoreBbox(glyph, &offset, dst);
371
+ if (!StoreEndPtsOfContours(glyph, &offset, dst)) {
372
+ return FONT_COMPRESSION_FAILURE();
373
+ }
374
+ StoreInstructions(glyph, &offset, dst);
375
+ if (!StorePoints(glyph, &offset, dst, *dst_size)) {
376
+ return FONT_COMPRESSION_FAILURE();
377
+ }
378
+ }
379
+ *dst_size = offset;
380
+ return true;
381
+ }
382
+
383
+ } // namespace woff2
@@ -0,0 +1,71 @@
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
+ /* Data model and I/O for glyph data within sfnt format files for the purpose of
8
+ performing the preprocessing step of the WOFF 2.0 conversion. */
9
+
10
+ #ifndef WOFF2_GLYPH_H_
11
+ #define WOFF2_GLYPH_H_
12
+
13
+ #include <inttypes.h>
14
+ #include <stddef.h>
15
+
16
+ #include <cstdint>
17
+ #include <vector>
18
+
19
+ namespace woff2 {
20
+
21
+ // Represents a parsed simple or composite glyph. The composite glyph data and
22
+ // instructions are un-parsed and we keep only pointers to the raw data,
23
+ // therefore the glyph is valid only so long the data from which it was parsed
24
+ // is around.
25
+ class Glyph {
26
+ public:
27
+ Glyph()
28
+ : instructions_size(0),
29
+ overlap_simple_flag_set(false),
30
+ composite_data_size(0) {}
31
+
32
+ // Bounding box.
33
+ int16_t x_min;
34
+ int16_t x_max;
35
+ int16_t y_min;
36
+ int16_t y_max;
37
+
38
+ // Instructions.
39
+ uint16_t instructions_size;
40
+ const uint8_t* instructions_data;
41
+
42
+ // Flags.
43
+ bool overlap_simple_flag_set;
44
+
45
+ // Data model for simple glyphs.
46
+ struct Point {
47
+ int x;
48
+ int y;
49
+ bool on_curve;
50
+ };
51
+ std::vector<std::vector<Point> > contours;
52
+
53
+ // Data for composite glyphs.
54
+ const uint8_t* composite_data;
55
+ uint32_t composite_data_size;
56
+ bool have_instructions;
57
+ };
58
+
59
+ // Parses the glyph from the given data. Returns false on parsing failure or
60
+ // buffer overflow. The glyph is valid only so long the input data pointer is
61
+ // valid.
62
+ bool ReadGlyph(const uint8_t* data, size_t len, Glyph* glyph);
63
+
64
+ // Stores the glyph into the specified dst buffer. The *dst_size is the buffer
65
+ // size on entry and is set to the actual (unpadded) stored size on exit.
66
+ // Returns false on buffer overflow.
67
+ bool StoreGlyph(const Glyph& glyph, uint8_t* dst, size_t* dst_size);
68
+
69
+ } // namespace woff2
70
+
71
+ #endif // WOFF2_GLYPH_H_