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