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.
- package/.eslintrc.json +30 -0
- package/CHANGELOG.md +13 -0
- package/README.md +275 -0
- package/UA_Styles_Chromium.md +93 -0
- package/_ext/woff2_conversion/brotli-decode.d.ts +139 -0
- package/_ext/woff2_conversion/brotli-encode.d.ts +129 -0
- package/_ext/woff2_conversion/brotli-port.d.ts +12 -0
- package/_ext/woff2_conversion/brotli-shared-dictionary.d.ts +25 -0
- package/_ext/woff2_conversion/brotli-types.d.ts +15 -0
- package/_ext/woff2_conversion/woff2-common.d.ts +37 -0
- package/_ext/woff2_conversion/woff2-decode.d.ts +32 -0
- package/_ext/woff2_conversion/woff2-encode.d.ts +31 -0
- package/_ext/woff2_conversion/woff2-output.d.ts +39 -0
- package/_ext/woff2_original_cpp/brotli/brotli.c +1559 -0
- package/_ext/woff2_original_cpp/brotli/brotli.md +116 -0
- package/_ext/woff2_original_cpp/brotli/decode.h +409 -0
- package/_ext/woff2_original_cpp/brotli/encode.h +505 -0
- package/_ext/woff2_original_cpp/brotli/port.h +302 -0
- package/_ext/woff2_original_cpp/brotli/shared_dictionary.h +100 -0
- package/_ext/woff2_original_cpp/brotli/types.h +83 -0
- package/_ext/woff2_original_cpp/cmake/FindBrotliDec.cmake +35 -0
- package/_ext/woff2_original_cpp/cmake/FindBrotliEnc.cmake +35 -0
- package/_ext/woff2_original_cpp/include/woff2/decode.h +36 -0
- package/_ext/woff2_original_cpp/include/woff2/encode.h +43 -0
- package/_ext/woff2_original_cpp/include/woff2/output.h +86 -0
- package/_ext/woff2_original_cpp/src/buffer.h +164 -0
- package/_ext/woff2_original_cpp/src/convert_woff2ttf_fuzzer.cc +13 -0
- package/_ext/woff2_original_cpp/src/convert_woff2ttf_fuzzer_new_entry.cc +12 -0
- package/_ext/woff2_original_cpp/src/file.h +30 -0
- package/_ext/woff2_original_cpp/src/font.cc +400 -0
- package/_ext/woff2_original_cpp/src/font.h +105 -0
- package/_ext/woff2_original_cpp/src/glyph.cc +383 -0
- package/_ext/woff2_original_cpp/src/glyph.h +71 -0
- package/_ext/woff2_original_cpp/src/normalize.cc +314 -0
- package/_ext/woff2_original_cpp/src/normalize.h +39 -0
- package/_ext/woff2_original_cpp/src/port.h +66 -0
- package/_ext/woff2_original_cpp/src/round.h +27 -0
- package/_ext/woff2_original_cpp/src/store_bytes.h +55 -0
- package/_ext/woff2_original_cpp/src/table_tags.cc +82 -0
- package/_ext/woff2_original_cpp/src/table_tags.h +30 -0
- package/_ext/woff2_original_cpp/src/transform.cc +430 -0
- package/_ext/woff2_original_cpp/src/transform.h +26 -0
- package/_ext/woff2_original_cpp/src/variable_length.cc +129 -0
- package/_ext/woff2_original_cpp/src/variable_length.h +30 -0
- package/_ext/woff2_original_cpp/src/woff2_common.cc +50 -0
- package/_ext/woff2_original_cpp/src/woff2_common.h +64 -0
- package/_ext/woff2_original_cpp/src/woff2_compress.cc +43 -0
- package/_ext/woff2_original_cpp/src/woff2_dec.cc +1398 -0
- package/_ext/woff2_original_cpp/src/woff2_decompress.cc +41 -0
- package/_ext/woff2_original_cpp/src/woff2_enc.cc +458 -0
- package/_ext/woff2_original_cpp/src/woff2_info.cc +142 -0
- package/_ext/woff2_original_cpp/src/woff2_out.cc +63 -0
- package/assets/fonts/ttf/arimo/Arimo-Bold.ttf +0 -0
- package/assets/fonts/ttf/arimo/Arimo-BoldItalic.ttf +0 -0
- package/assets/fonts/ttf/arimo/Arimo-Italic.ttf +0 -0
- package/assets/fonts/ttf/arimo/Arimo-Regular.ttf +0 -0
- package/assets/fonts/ttf/cinzeldecorative/CinzelDecorative-Black.ttf +0 -0
- package/assets/fonts/ttf/cinzeldecorative/CinzelDecorative-Bold.ttf +0 -0
- package/assets/fonts/ttf/cinzeldecorative/CinzelDecorative-Regular.ttf +0 -0
- package/assets/fonts/ttf/dejavu/DejaVuSans.ttf +0 -0
- package/assets/fonts/ttf/firecode/FiraCode-Bold.ttf +0 -0
- package/assets/fonts/ttf/firecode/FiraCode-Light.ttf +0 -0
- package/assets/fonts/ttf/firecode/FiraCode-Medium.ttf +0 -0
- package/assets/fonts/ttf/firecode/FiraCode-Regular.ttf +0 -0
- package/assets/fonts/ttf/firecode/FiraCode-SemiBold.ttf +0 -0
- package/assets/fonts/ttf/notoemoji/NotoEmoji-Bold.ttf +0 -0
- package/assets/fonts/ttf/notoemoji/NotoEmoji-Light.ttf +0 -0
- package/assets/fonts/ttf/notoemoji/NotoEmoji-Medium.ttf +0 -0
- package/assets/fonts/ttf/notoemoji/NotoEmoji-Regular.ttf +0 -0
- package/assets/fonts/ttf/notoemoji/NotoEmoji-SemiBold.ttf +0 -0
- package/assets/fonts/ttf/notosans/NotoSans-Regular.ttf +0 -0
- package/assets/fonts/ttf/roboto/Roboto-Bold.ttf +0 -0
- package/assets/fonts/ttf/roboto/Roboto-BoldItalic.ttf +0 -0
- package/assets/fonts/ttf/roboto/Roboto-Italic.ttf +0 -0
- package/assets/fonts/ttf/roboto/Roboto-Regular.ttf +0 -0
- package/assets/fonts/ttf/stixtwomath/STIXTwoMath-Regular.ttf +0 -0
- package/assets/fonts/ttf/tinos/Tinos-Bold.ttf +0 -0
- package/assets/fonts/ttf/tinos/Tinos-BoldItalic.ttf +0 -0
- package/assets/fonts/ttf/tinos/Tinos-Italic.ttf +0 -0
- package/assets/fonts/ttf/tinos/Tinos-Regular.ttf +0 -0
- package/assets/fonts/woff/lato/lato-latin-400-italic.woff +0 -0
- package/assets/fonts/woff/lato/lato-latin-400-normal.woff +0 -0
- package/assets/fonts/woff/lato/lato-latin-700-italic.woff +0 -0
- package/assets/fonts/woff/lato/lato-latin-700-normal.woff +0 -0
- package/assets/fonts/woff2/caveat/Caveat-Bold.woff2 +0 -0
- package/assets/fonts/woff2/caveat/Caveat-Regular.woff2 +0 -0
- package/assets/fonts/woff2/lato/lato-latin-400-italic.woff2 +0 -0
- package/assets/fonts/woff2/lato/lato-latin-400-normal.woff2 +0 -0
- package/assets/fonts/woff2/lato/lato-latin-700-italic.woff2 +0 -0
- package/assets/fonts/woff2/lato/lato-latin-700-normal.woff2 +0 -0
- package/docs/AGENTS.md +288 -0
- package/docs/BACKGROUND-REPEAT-IMPLEMENTATION.md +127 -0
- package/docs/BACKGROUND-REPEAT-REFERENCE.md +127 -0
- package/docs/BACKGROUND-REPEAT-SPACE-ROUND.md +164 -0
- package/docs/css-properties-support.md +256 -0
- package/docs/src_modules_table.md +172 -0
- package/docs/text-overlap-fix.md +85 -0
- package/docs/text-overlap-investigation.md +27 -0
- package/eslint.config.js +36 -0
- package/glyph_measure.htm +1458 -0
- package/package.json +50 -0
- package/playground/browser-entry.ts +2 -0
- package/playground/exports/background-text-debug.pdf +0 -0
- package/playground/public/app.js +875 -0
- package/playground/public/assets/1.webp +0 -0
- package/playground/public/examples/accents-test.html +24 -0
- package/playground/public/examples/advanced-selectors-demo.html +118 -0
- package/playground/public/examples/background-advanced-showcase.html +82 -0
- package/playground/public/examples/background-clip-text.html +36 -0
- package/playground/public/examples/background-origin-showcase.html +137 -0
- package/playground/public/examples/background-position-showcase.html +83 -0
- package/playground/public/examples/background-repeat-showcase.html +83 -0
- package/playground/public/examples/background-repeat-space-round.html +348 -0
- package/playground/public/examples/background-size-showcase.html +82 -0
- package/playground/public/examples/background-text-debug.html +18 -0
- package/playground/public/examples/baseline-test.html +24 -0
- package/playground/public/examples/bold-showcase.html +150 -0
- package/playground/public/examples/bold-strike-example.html +12 -0
- package/playground/public/examples/border-collapse-test.html +23 -0
- package/playground/public/examples/centered-shadow-div.html +72 -0
- package/playground/public/examples/css-variables.html +50 -0
- package/playground/public/examples/debug-accents.html +11 -0
- package/playground/public/examples/debug-text-overlap.html +46 -0
- package/playground/public/examples/flex-gap-column.html +130 -0
- package/playground/public/examples/flex-gap-row.html +137 -0
- package/playground/public/examples/flex-padding-test.html +29 -0
- package/playground/public/examples/flexbox-text-test.html +193 -0
- package/playground/public/examples/fonts-demo.html +126 -0
- package/playground/public/examples/footer-example.html +4 -0
- package/playground/public/examples/gradient-text.html +54 -0
- package/playground/public/examples/grid-gap-demo.html +156 -0
- package/playground/public/examples/header-example.html +4 -0
- package/playground/public/examples/header-footer-example.html +27 -0
- package/playground/public/examples/image-showcase.html +33 -0
- package/playground/public/examples/justify-text.html +22 -0
- package/playground/public/examples/linear-gradient-example.html +38 -0
- package/playground/public/examples/lorem-span.html +14 -0
- package/playground/public/examples/margin-block-showcase.html +21 -0
- package/playground/public/examples/margin-inline-showcase.html +21 -0
- package/playground/public/examples/monthly-summary.html +95 -0
- package/playground/public/examples/multi-page-lorem.html +190 -0
- package/playground/public/examples/opacity-debug.html +39 -0
- package/playground/public/examples/opacity-example.html +70 -0
- package/playground/public/examples/png-image-example.html +13 -0
- package/playground/public/examples/red-rectangle.html +18 -0
- package/playground/public/examples/repro.html +24 -0
- package/playground/public/examples/rounded-borders-test.html +24 -0
- package/playground/public/examples/simple-list.html +89 -0
- package/playground/public/examples/simple-svg.html +37 -0
- package/playground/public/examples/simple-table.html +52 -0
- package/playground/public/examples/skew-div.html +138 -0
- package/playground/public/examples/skew-text.html +21 -0
- package/playground/public/examples/starter-report.css +51 -0
- package/playground/public/examples/starter-report.html +23 -0
- package/playground/public/examples/svg-aspect-ratio-showcase.html +116 -0
- package/playground/public/examples/svg-gradients-linear.html +28 -0
- package/playground/public/examples/svg-gradients-radial.html +29 -0
- package/playground/public/examples/svg-gradients-showcase.html +66 -0
- package/playground/public/examples/svg-image-path-test.html +43 -0
- package/playground/public/examples/svg-images-clipping.html +27 -0
- package/playground/public/examples/svg-path-gallery.html +118 -0
- package/playground/public/examples/svg-radial-transform-demo.html +78 -0
- package/playground/public/examples/svg-transform-stack.html +103 -0
- package/playground/public/examples/svg-transforms-demo.html +127 -0
- package/playground/public/examples/table-merge-test.html +34 -0
- package/playground/public/examples/text-decoration-showcase.html +138 -0
- package/playground/public/examples/text-indent-showcase.html +137 -0
- package/playground/public/examples/text-shadow-example.html +29 -0
- package/playground/public/examples/very-complex-css.html +293 -0
- package/playground/public/examples/webp-example.html +13 -0
- package/playground/public/examples/z-index-demo.html +93 -0
- package/playground/public/examples.json +240 -0
- package/playground/public/images/dice.png +0 -0
- package/playground/public/images/duck.jpg +0 -0
- package/playground/public/index.html +149 -0
- package/playground/public/mode.js +1 -0
- package/playground/public/styles.css +382 -0
- package/playground/public/tmp-h2-debug.html +33 -0
- package/playground/public/tmp-italic-debug.html +32 -0
- package/playground/public/vendor/codemirror/codemirror.min.css +1 -0
- package/playground/public/vendor/codemirror/codemirror.min.js +1 -0
- package/playground/public/vendor/codemirror/css.min.js +1 -0
- package/playground/public/vendor/codemirror/darcula.min.css +1 -0
- package/playground/public/vendor/codemirror/htmlmixed.min.js +1 -0
- package/playground/public/vendor/codemirror/javascript.min.js +1 -0
- package/playground/public/vendor/codemirror/xml.min.js +1 -0
- package/playground/public/vendor/pagyra-playground-browser.js +165966 -0
- package/playground/public/vendor/pagyra-playground-browser.js.map +7 -0
- package/playground/server.d.ts +1 -0
- package/playground/server.js +68 -0
- package/playground/server.ts +128 -0
- package/scripts/browser-build.ts +101 -0
- package/scripts/build-browser-bundle.ts +52 -0
- package/scripts/glyph-comparison/simulate.ts +744 -0
- package/scripts/playground-browser-server.ts +57 -0
- package/scripts/probe-roboto.ts +6 -0
- package/scripts/render-playground-example.ts +121 -0
- package/scripts/run-glyph-atlas-tuner-runner.mjs +113 -0
- package/scripts/run-glyph-atlas-tuner.ts +141 -0
- package/scripts/top-ts-files.ps1 +39 -0
- package/scripts/top-ts-files.sh +37 -0
- package/scripts/woff2_info.ps1 +132 -0
- package/src/browser-entry.ts +14 -0
- package/src/compression/adler32.ts +45 -0
- package/src/compression/brotli/brotli.ts +463 -0
- package/src/compression/brotli/index.ts +15 -0
- package/src/compression/brotli/transform.ts +184 -0
- package/src/compression/brotli/types.ts +58 -0
- package/src/compression/brotli/utils.ts +157 -0
- package/src/compression/brotli/vendor/bit_reader.js +124 -0
- package/src/compression/brotli/vendor/context.js +250 -0
- package/src/compression/brotli/vendor/decode.d.ts +2 -0
- package/src/compression/brotli/vendor/decode.js +938 -0
- package/src/compression/brotli/vendor/dictionary-data.js +9469 -0
- package/src/compression/brotli/vendor/dictionary.js +36 -0
- package/src/compression/brotli/vendor/huffman.js +123 -0
- package/src/compression/brotli/vendor/package.json +3 -0
- package/src/compression/brotli/vendor/prefix.js +60 -0
- package/src/compression/brotli/vendor/streams.js +31 -0
- package/src/compression/brotli/vendor/transform.js +247 -0
- package/src/compression/brotli/vendor-decode.d.ts +4 -0
- package/src/compression/brotli/woff2-glyf-transform.ts +623 -0
- package/src/compression/decompress.ts +16 -0
- package/src/compression/deflate.ts +295 -0
- package/src/compression/index.ts +4 -0
- package/src/compression/types.ts +26 -0
- package/src/compression/utils.ts +107 -0
- package/src/core.ts +18 -0
- package/src/css/apply-declarations.ts +86 -0
- package/src/css/background-types.ts +65 -0
- package/src/css/browser-defaults.ts +16 -0
- package/src/css/clip-path-types.ts +13 -0
- package/src/css/compute-style.ts +494 -0
- package/src/css/css-unit-resolver.ts +65 -0
- package/src/css/custom-properties.ts +215 -0
- package/src/css/enums.ts +127 -0
- package/src/css/font-face-parser.ts +233 -0
- package/src/css/font-weight.ts +65 -0
- package/src/css/inline-style-parser.ts +27 -0
- package/src/css/layout-property-resolver.ts +75 -0
- package/src/css/length.ts +141 -0
- package/src/css/line-height.ts +96 -0
- package/src/css/named-colors.ts +150 -0
- package/src/css/parsers/background-parser-extended.ts +111 -0
- package/src/css/parsers/background-parser.ts +456 -0
- package/src/css/parsers/border-block-parser.ts +26 -0
- package/src/css/parsers/border-inline-parser.ts +26 -0
- package/src/css/parsers/border-parser-extended.ts +256 -0
- package/src/css/parsers/border-parser.ts +175 -0
- package/src/css/parsers/box-shadow-parser.ts +106 -0
- package/src/css/parsers/clip-path-parser.ts +92 -0
- package/src/css/parsers/color-parser.ts +14 -0
- package/src/css/parsers/dimension-parser.ts +117 -0
- package/src/css/parsers/display-flex-parser.ts +59 -0
- package/src/css/parsers/flex-parser.ts +144 -0
- package/src/css/parsers/font-parser.ts +40 -0
- package/src/css/parsers/gradient-parser.ts +366 -0
- package/src/css/parsers/grid-parser-extended.ts +55 -0
- package/src/css/parsers/grid-parser.ts +218 -0
- package/src/css/parsers/length-parser.ts +95 -0
- package/src/css/parsers/list-style-parser.ts +39 -0
- package/src/css/parsers/margin-block-parser.ts +12 -0
- package/src/css/parsers/margin-inline-parser.ts +12 -0
- package/src/css/parsers/margin-parser.ts +30 -0
- package/src/css/parsers/opacity-parser.ts +32 -0
- package/src/css/parsers/overflow-wrap-parser.ts +38 -0
- package/src/css/parsers/padding-block-parser.ts +12 -0
- package/src/css/parsers/padding-inline-parser.ts +12 -0
- package/src/css/parsers/padding-parser.ts +30 -0
- package/src/css/parsers/position-parser.ts +75 -0
- package/src/css/parsers/register-parsers.ts +302 -0
- package/src/css/parsers/registry.ts +18 -0
- package/src/css/parsers/text-parser-extended.ts +144 -0
- package/src/css/parsers/text-parser.ts +25 -0
- package/src/css/parsers/text-shadow-parser.ts +94 -0
- package/src/css/properties/box-model.ts +82 -0
- package/src/css/properties/flexbox.ts +44 -0
- package/src/css/properties/gap.ts +14 -0
- package/src/css/properties/grid.ts +94 -0
- package/src/css/properties/layout.ts +59 -0
- package/src/css/properties/misc.ts +44 -0
- package/src/css/properties/typography.ts +71 -0
- package/src/css/properties/visual.ts +68 -0
- package/src/css/selectors/matcher.ts +219 -0
- package/src/css/selectors/parser.ts +163 -0
- package/src/css/selectors/simple-key.ts +31 -0
- package/src/css/selectors/specificity.ts +41 -0
- package/src/css/selectors/types.ts +31 -0
- package/src/css/shorthands/border-shorthand.ts +68 -0
- package/src/css/shorthands/box-shorthand.ts +33 -0
- package/src/css/style-inheritance.ts +50 -0
- package/src/css/style.ts +402 -0
- package/src/css/ua-defaults/base-defaults.ts +266 -0
- package/src/css/ua-defaults/browser-defaults.ts +134 -0
- package/src/css/ua-defaults/element-defaults.ts +374 -0
- package/src/css/ua-defaults/types.ts +43 -0
- package/src/css/unit-conversion.ts +24 -0
- package/src/css/utils.ts +108 -0
- package/src/css/viewport.ts +17 -0
- package/src/debug/audit.ts +20 -0
- package/src/debug/ids.ts +13 -0
- package/src/debug/log.js +28 -0
- package/src/debug/log.ts +52 -0
- package/src/debug/tree.ts +57 -0
- package/src/dom/node.ts +133 -0
- package/src/environment/browser-environment.ts +78 -0
- package/src/environment/environment.ts +35 -0
- package/src/environment/global.ts +13 -0
- package/src/environment/node-environment.browser.ts +28 -0
- package/src/environment/node-environment.ts +64 -0
- package/src/fonts/detector.ts +28 -0
- package/src/fonts/engines/ttf-engine.ts +28 -0
- package/src/fonts/engines/woff-engine.ts +38 -0
- package/src/fonts/engines/woff2-engine.ts +41 -0
- package/src/fonts/extractors/metrics-extractor.ts +362 -0
- package/src/fonts/font-registry-resolver.ts +132 -0
- package/src/fonts/index.ts +3 -0
- package/src/fonts/orchestrator.ts +92 -0
- package/src/fonts/parsers/base-parser.ts +23 -0
- package/src/fonts/types.ts +85 -0
- package/src/fonts/utils/ttf-reconstructor.ts +120 -0
- package/src/fonts/woff/decoder.ts +105 -0
- package/src/fonts/woff2/buffer.ts +106 -0
- package/src/fonts/woff2/decoder.ts +981 -0
- package/src/geometry/box.ts +48 -0
- package/src/geometry/matrix.ts +59 -0
- package/src/html/css/parse-css.ts +85 -0
- package/src/html/dom-converter.ts +433 -0
- package/src/html/image-converter.ts +200 -0
- package/src/html-to-pdf.ts +410 -0
- package/src/image/base-decoder.ts +149 -0
- package/src/image/image-service.ts +188 -0
- package/src/image/jpeg-decoder.ts +73 -0
- package/src/image/png-decoder.ts +550 -0
- package/src/image/types.ts +20 -0
- package/src/image/webp-decoder.ts +242 -0
- package/src/image/webp-huffman.ts +218 -0
- package/src/image/webp-riff-parser.ts +54 -0
- package/src/image/webp-vp8l-decoder.ts +199 -0
- package/src/index.ts +35 -0
- package/src/layout/context/float-context.ts +62 -0
- package/src/layout/context/layout-environment.ts +29 -0
- package/src/layout/debug.ts +18 -0
- package/src/layout/inline/bounding-box-calculator.ts +132 -0
- package/src/layout/inline/font-baseline-calculator.ts +76 -0
- package/src/layout/inline/inline-utils.ts +94 -0
- package/src/layout/inline/layout.ts +285 -0
- package/src/layout/inline/line_breaker.ts +109 -0
- package/src/layout/inline/measurement.ts +144 -0
- package/src/layout/inline/run-placer.ts +139 -0
- package/src/layout/inline/text-alignment.ts +70 -0
- package/src/layout/inline/tokenizer.ts +195 -0
- package/src/layout/inline/types.ts +76 -0
- package/src/layout/pipeline/context-factory.ts +16 -0
- package/src/layout/pipeline/default-engine.ts +24 -0
- package/src/layout/pipeline/engine.ts +59 -0
- package/src/layout/pipeline/layout-tree.ts +13 -0
- package/src/layout/pipeline/out-of-flow-manager.ts +73 -0
- package/src/layout/pipeline/strategy.ts +12 -0
- package/src/layout/pipeline/text-metrics-initializer.ts +13 -0
- package/src/layout/strategies/block.ts +236 -0
- package/src/layout/strategies/display-none.ts +14 -0
- package/src/layout/strategies/fallback.ts +15 -0
- package/src/layout/strategies/flex.ts +477 -0
- package/src/layout/strategies/fragmentation.ts +17 -0
- package/src/layout/strategies/grid.ts +247 -0
- package/src/layout/strategies/image.ts +342 -0
- package/src/layout/strategies/inline.ts +128 -0
- package/src/layout/strategies/table.ts +595 -0
- package/src/layout/table/cell_layout.ts +31 -0
- package/src/layout/table/diagnostics.ts +19 -0
- package/src/layout/text-run.ts +42 -0
- package/src/layout/utils/content-measurer.ts +117 -0
- package/src/layout/utils/display-utils.ts +24 -0
- package/src/layout/utils/floats.ts +98 -0
- package/src/layout/utils/gap-calculator.ts +167 -0
- package/src/layout/utils/inline-formatter.ts +31 -0
- package/src/layout/utils/inline-formatting.ts +9 -0
- package/src/layout/utils/margin.ts +140 -0
- package/src/layout/utils/node-math.ts +237 -0
- package/src/layout/utils/overflow.ts +14 -0
- package/src/layout/utils/sizing.ts +12 -0
- package/src/layout/utils/text-metrics.ts +361 -0
- package/src/logging/debug.ts +58 -0
- package/src/pdf/font/base14/widths-courier-bold.ts +159 -0
- package/src/pdf/font/base14/widths-courier.ts +159 -0
- package/src/pdf/font/base14/widths-helvetica-bold.ts +158 -0
- package/src/pdf/font/base14/widths-helvetica.ts +158 -0
- package/src/pdf/font/base14/widths-times-bold.ts +158 -0
- package/src/pdf/font/base14/widths-times-roman.ts +158 -0
- package/src/pdf/font/base14/widths-types.ts +25 -0
- package/src/pdf/font/base14-widths.ts +32 -0
- package/src/pdf/font/blur.ts +81 -0
- package/src/pdf/font/builtin-fonts.browser.ts +262 -0
- package/src/pdf/font/builtin-fonts.ts +126 -0
- package/src/pdf/font/composite-glyph-parser.ts +242 -0
- package/src/pdf/font/embedder.ts +395 -0
- package/src/pdf/font/font-config.ts +190 -0
- package/src/pdf/font/font-registry.ts +263 -0
- package/src/pdf/font/font-subset.ts +258 -0
- package/src/pdf/font/glyph-atlas-maxrects.ts +305 -0
- package/src/pdf/font/glyph-atlas-tuner.ts +98 -0
- package/src/pdf/font/glyph-atlas.ts +226 -0
- package/src/pdf/font/glyph-cache.ts +127 -0
- package/src/pdf/font/loca-reader.ts +109 -0
- package/src/pdf/font/managers/font-resource-manager.ts +73 -0
- package/src/pdf/font/managers/subset-resource-manager.ts +164 -0
- package/src/pdf/font/rasterizer.ts +270 -0
- package/src/pdf/font/resolvers/base-font-mapper.ts +77 -0
- package/src/pdf/font/resolvers/family-resolver.ts +33 -0
- package/src/pdf/font/resolvers/weight-style-applicator.ts +63 -0
- package/src/pdf/font/simple-glyph-parser.ts +289 -0
- package/src/pdf/font/to-unicode.ts +109 -0
- package/src/pdf/font/transformation-matrix.ts +136 -0
- package/src/pdf/font/ttf-cmap.ts +180 -0
- package/src/pdf/font/ttf-global-metrics.ts +58 -0
- package/src/pdf/font/ttf-glyf.ts +125 -0
- package/src/pdf/font/ttf-glyph-metrics.ts +43 -0
- package/src/pdf/font/ttf-lite.ts +269 -0
- package/src/pdf/font/ttf-table-parser.ts +132 -0
- package/src/pdf/font/ttf-table-provider.ts +61 -0
- package/src/pdf/font/widths.ts +79 -0
- package/src/pdf/font-subset/font-registry.ts +127 -0
- package/src/pdf/header-footer-layout.ts +153 -0
- package/src/pdf/header-footer-painter.ts +209 -0
- package/src/pdf/header-footer-renderer.ts +357 -0
- package/src/pdf/header-footer-tokens.ts +55 -0
- package/src/pdf/header-footer.ts +25 -0
- package/src/pdf/layout-tree-builder.ts +261 -0
- package/src/pdf/page-painter.ts +241 -0
- package/src/pdf/pagination.ts +155 -0
- package/src/pdf/primitives/pdf-builder.ts +378 -0
- package/src/pdf/primitives/pdf-bytes.ts +40 -0
- package/src/pdf/primitives/pdf-document.ts +108 -0
- package/src/pdf/primitives/pdf-reference-manager.ts +47 -0
- package/src/pdf/primitives/pdf-resource-registries.ts +255 -0
- package/src/pdf/primitives/pdf-serializers.ts +194 -0
- package/src/pdf/primitives/pdf-types.ts +73 -0
- package/src/pdf/render.ts +210 -0
- package/src/pdf/renderer/box-painter.ts +236 -0
- package/src/pdf/renderer/page-paint.ts +102 -0
- package/src/pdf/renderer/paint-box-shadows.ts +218 -0
- package/src/pdf/renderer/radius.ts +58 -0
- package/src/pdf/renderers/graphics-state-manager.ts +40 -0
- package/src/pdf/renderers/image-renderer.ts +127 -0
- package/src/pdf/renderers/radius-utils.ts +80 -0
- package/src/pdf/renderers/rectangle-renderer.ts +129 -0
- package/src/pdf/renderers/rounded-rect-path.ts +120 -0
- package/src/pdf/renderers/shape-renderer.ts +563 -0
- package/src/pdf/renderers/shape-utils.ts +194 -0
- package/src/pdf/renderers/text-decoration-renderer.ts +313 -0
- package/src/pdf/renderers/text-encoder.ts +41 -0
- package/src/pdf/renderers/text-font-resolver.ts +75 -0
- package/src/pdf/renderers/text-renderer-utils.ts +28 -0
- package/src/pdf/renderers/text-renderer.ts +391 -0
- package/src/pdf/renderers/text-shadow-renderer.ts +300 -0
- package/src/pdf/shading/gradient-service.ts +525 -0
- package/src/pdf/shading/index.ts +1 -0
- package/src/pdf/stacking/build-stacking-contexts.ts +93 -0
- package/src/pdf/stacking/resolve-paint-order.ts +157 -0
- package/src/pdf/stacking/types.ts +40 -0
- package/src/pdf/svg/aspect-ratio.ts +81 -0
- package/src/pdf/svg/coordinate-mapper.ts +81 -0
- package/src/pdf/svg/geometry-builder.ts +45 -0
- package/src/pdf/svg/render-svg.ts +296 -0
- package/src/pdf/svg/shape-renderer.ts +463 -0
- package/src/pdf/svg/style-computer.ts +246 -0
- package/src/pdf/transform-adapter.ts +26 -0
- package/src/pdf/types.ts +377 -0
- package/src/pdf/utils/background-layer-resolver.ts +439 -0
- package/src/pdf/utils/background-tiles.ts +192 -0
- package/src/pdf/utils/border-dashes.ts +109 -0
- package/src/pdf/utils/border-radius-utils.ts +86 -0
- package/src/pdf/utils/box-dimensions-utils.ts +47 -0
- package/src/pdf/utils/clip-path-resolver.ts +50 -0
- package/src/pdf/utils/clipping-path-builder.ts +190 -0
- package/src/pdf/utils/color-utils.ts +102 -0
- package/src/pdf/utils/coordinate-transformer.ts +30 -0
- package/src/pdf/utils/drop-shadow-raster.ts +233 -0
- package/src/pdf/utils/encoding.ts +98 -0
- package/src/pdf/utils/glyph-atlas-registrar.ts +13 -0
- package/src/pdf/utils/glyph-run-renderer.ts +129 -0
- package/src/pdf/utils/image-command-partitioner.ts +28 -0
- package/src/pdf/utils/image-matrix-builder.ts +31 -0
- package/src/pdf/utils/image-utils.ts +26 -0
- package/src/pdf/utils/list-utils.ts +194 -0
- package/src/pdf/utils/node-text-run-factory.ts +202 -0
- package/src/pdf/utils/page-resource-registrar.ts +46 -0
- package/src/pdf/utils/result-combiner.ts +102 -0
- package/src/pdf/utils/shadow-utils.ts +127 -0
- package/src/pdf/utils/text-alignment-resolver.ts +76 -0
- package/src/pdf/utils/text-decoration-utils.ts +64 -0
- package/src/pdf/utils/text-layout-adjuster.ts +185 -0
- package/src/pdf/utils/text-utils.ts +193 -0
- package/src/pdf/utils/transform-scope-manager.ts +69 -0
- package/src/render/offset.ts +170 -0
- package/src/shim/empty.ts +2 -0
- package/src/shim/fs-empty.ts +5 -0
- package/src/shim/url-empty.ts +7 -0
- package/src/shim/zlib-empty.ts +9 -0
- package/src/style/shorthands/index.ts +19 -0
- package/src/style/ua/defaults.ts +69 -0
- package/src/svg/index.ts +4 -0
- package/src/svg/parser-registry.ts +71 -0
- package/src/svg/parser.ts +486 -0
- package/src/svg/path-data.ts +515 -0
- package/src/svg/types.ts +194 -0
- package/src/text/line-breaker.ts +321 -0
- package/src/text/text-transform.ts +43 -0
- package/src/text/text.ts +33 -0
- package/src/transform/css-parser.ts +95 -0
- package/src/types/fonts.ts +62 -0
- package/src/types/public.ts +19 -0
- package/src/units/page-utils.ts +58 -0
- package/src/units/units.ts +50 -0
- package/src/utils/base64.ts +24 -0
- package/test-output.txt +79 -0
- package/tests/css/background-parser.spec.ts +14 -0
- package/tests/css/clip-path-parser.spec.ts +66 -0
- package/tests/environment/path-resolution.spec.ts +104 -0
- package/tests/helpers/ai-layout-diagnostics.ts +141 -0
- package/tests/helpers/render-utils.ts +52 -0
- package/tests/helpers/text-geometry.ts +56 -0
- package/tests/layout/custom-properties.test.ts +38 -0
- package/tests/layout/gap-calculator.spec.ts +196 -0
- package/tests/layout/inline-background-alignment.spec.ts +93 -0
- package/tests/layout/inline-fragments.spec.ts +26 -0
- package/tests/layout/run-placer-baseline.spec.ts +108 -0
- package/tests/pdf/alignments.spec.ts +26 -0
- package/tests/pdf/background-clip.spec.ts +57 -0
- package/tests/pdf/background-repeat-space-round.spec.ts +35 -0
- package/tests/pdf/background-repeat.spec.ts +137 -0
- package/tests/pdf/border-radius.spec.ts +151 -0
- package/tests/pdf/clip-path.spec.ts +92 -0
- package/tests/pdf/radial-gradient.spec.ts +50 -0
- package/tests/pdf/svg-stroke-dash.spec.ts +81 -0
- package/tests/pdf/text-transform-matrix.spec.ts +43 -0
- package/tsconfig.json +17 -0
- package/types/fonts.js +10 -0
- 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_
|