blitz-pdf 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (370) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +355 -2
  3. package/THIRD_PARTY_NOTICES.md +25 -0
  4. package/assets/icon.svg +4 -0
  5. package/dist/api.d.ts +7 -0
  6. package/dist/api.d.ts.map +1 -0
  7. package/dist/api.js +46 -0
  8. package/dist/api.js.map +1 -0
  9. package/dist/assets.d.ts +7 -0
  10. package/dist/assets.d.ts.map +1 -0
  11. package/dist/assets.js +52 -0
  12. package/dist/assets.js.map +1 -0
  13. package/dist/browser.d.ts +3 -0
  14. package/dist/browser.d.ts.map +1 -0
  15. package/dist/browser.js +3 -0
  16. package/dist/browser.js.map +1 -0
  17. package/dist/node.d.ts +3 -0
  18. package/dist/node.d.ts.map +1 -0
  19. package/dist/node.js +10 -0
  20. package/dist/node.js.map +1 -0
  21. package/dist/options.d.ts +24 -0
  22. package/dist/options.d.ts.map +1 -0
  23. package/dist/options.js +135 -0
  24. package/dist/options.js.map +1 -0
  25. package/dist/types.d.ts +51 -0
  26. package/dist/types.d.ts.map +1 -0
  27. package/dist/types.js +2 -0
  28. package/dist/types.js.map +1 -0
  29. package/examples/bun.ts +8 -0
  30. package/examples/german-invoice/README.md +70 -0
  31. package/examples/german-invoice/data.mjs +83 -0
  32. package/examples/german-invoice/invoice.css +59 -0
  33. package/examples/german-invoice/template.mjs +49 -0
  34. package/examples/german-invoice.mjs +20 -0
  35. package/examples/invoice.html +29 -0
  36. package/examples/node.mjs +8 -0
  37. package/examples/pagination.html +40 -0
  38. package/examples/pagination.mjs +8 -0
  39. package/licenses/DejaVu.txt +187 -0
  40. package/licenses/RUST_DEPENDENCIES.txt +11577 -0
  41. package/package.json +89 -4
  42. package/src/api.ts +44 -0
  43. package/src/assets.ts +43 -0
  44. package/src/browser.ts +6 -0
  45. package/src/node.ts +12 -0
  46. package/src/options.ts +101 -0
  47. package/src/types.ts +49 -0
  48. package/vendor/README.md +17 -0
  49. package/vendor/stylo/.cargo-ok +1 -0
  50. package/vendor/stylo/.cargo_vcs_info.json +6 -0
  51. package/vendor/stylo/Cargo.lock +1485 -0
  52. package/vendor/stylo/Cargo.toml +274 -0
  53. package/vendor/stylo/LICENSE +373 -0
  54. package/vendor/stylo/README.md +6 -0
  55. package/vendor/stylo/applicable_declarations.rs +328 -0
  56. package/vendor/stylo/author_styles.rs +79 -0
  57. package/vendor/stylo/bezier.rs +176 -0
  58. package/vendor/stylo/bloom.rs +414 -0
  59. package/vendor/stylo/build.rs +91 -0
  60. package/vendor/stylo/build_gecko.rs +393 -0
  61. package/vendor/stylo/color/color_function.rs +601 -0
  62. package/vendor/stylo/color/component.rs +207 -0
  63. package/vendor/stylo/color/convert.rs +935 -0
  64. package/vendor/stylo/color/gamut/raytrace.rs +265 -0
  65. package/vendor/stylo/color/gamut.rs +227 -0
  66. package/vendor/stylo/color/mix.rs +645 -0
  67. package/vendor/stylo/color/mod.rs +750 -0
  68. package/vendor/stylo/color/parsing.rs +770 -0
  69. package/vendor/stylo/color/to_css.rs +297 -0
  70. package/vendor/stylo/context.rs +716 -0
  71. package/vendor/stylo/counter_style/mod.rs +754 -0
  72. package/vendor/stylo/counter_style/predefined.rs +61 -0
  73. package/vendor/stylo/counter_style/update_predefined.py +35 -0
  74. package/vendor/stylo/custom_properties.rs +2023 -0
  75. package/vendor/stylo/custom_properties_map.rs +220 -0
  76. package/vendor/stylo/data.rs +693 -0
  77. package/vendor/stylo/device/gecko.rs +486 -0
  78. package/vendor/stylo/device/mod.rs +304 -0
  79. package/vendor/stylo/device/servo.rs +507 -0
  80. package/vendor/stylo/dom.rs +1164 -0
  81. package/vendor/stylo/dom_apis.rs +937 -0
  82. package/vendor/stylo/driver.rs +172 -0
  83. package/vendor/stylo/error_reporting.rs +484 -0
  84. package/vendor/stylo/font_face.rs +558 -0
  85. package/vendor/stylo/font_metrics.rs +124 -0
  86. package/vendor/stylo/gecko/anon_boxes.toml +113 -0
  87. package/vendor/stylo/gecko/arc_types.rs +211 -0
  88. package/vendor/stylo/gecko/conversions.rs +59 -0
  89. package/vendor/stylo/gecko/data.rs +222 -0
  90. package/vendor/stylo/gecko/media_features.rs +971 -0
  91. package/vendor/stylo/gecko/mod.rs +20 -0
  92. package/vendor/stylo/gecko/non_ts_pseudo_class_list.rs +119 -0
  93. package/vendor/stylo/gecko/pseudo_element.rs +640 -0
  94. package/vendor/stylo/gecko/pseudo_element_definition.mako.rs +298 -0
  95. package/vendor/stylo/gecko/pseudo_elements.py +137 -0
  96. package/vendor/stylo/gecko/pseudo_elements.toml +197 -0
  97. package/vendor/stylo/gecko/regen_pseudo_elements.py +33 -0
  98. package/vendor/stylo/gecko/restyle_damage.rs +127 -0
  99. package/vendor/stylo/gecko/selector_parser.rs +627 -0
  100. package/vendor/stylo/gecko/snapshot.rs +202 -0
  101. package/vendor/stylo/gecko/snapshot_helpers.rs +334 -0
  102. package/vendor/stylo/gecko/traversal.rs +52 -0
  103. package/vendor/stylo/gecko/wrapper.rs +2258 -0
  104. package/vendor/stylo/gecko_bindings/mod.rs +34 -0
  105. package/vendor/stylo/gecko_bindings/sugar/mod.rs +12 -0
  106. package/vendor/stylo/gecko_bindings/sugar/ns_com_ptr.rs +15 -0
  107. package/vendor/stylo/gecko_bindings/sugar/ns_compatibility.rs +19 -0
  108. package/vendor/stylo/gecko_bindings/sugar/ns_style_auto_array.rs +111 -0
  109. package/vendor/stylo/gecko_bindings/sugar/origin_flags.rs +31 -0
  110. package/vendor/stylo/gecko_bindings/sugar/ownership.rs +70 -0
  111. package/vendor/stylo/gecko_bindings/sugar/refptr.rs +299 -0
  112. package/vendor/stylo/gecko_string_cache/mod.rs +543 -0
  113. package/vendor/stylo/gecko_string_cache/namespace.rs +106 -0
  114. package/vendor/stylo/global_style_data.rs +224 -0
  115. package/vendor/stylo/invalidation/element/document_state.rs +156 -0
  116. package/vendor/stylo/invalidation/element/element_wrapper.rs +432 -0
  117. package/vendor/stylo/invalidation/element/invalidation_map.rs +1631 -0
  118. package/vendor/stylo/invalidation/element/invalidator.rs +1470 -0
  119. package/vendor/stylo/invalidation/element/mod.rs +13 -0
  120. package/vendor/stylo/invalidation/element/relative_selector.rs +1399 -0
  121. package/vendor/stylo/invalidation/element/restyle_hints.rs +226 -0
  122. package/vendor/stylo/invalidation/element/state_and_attributes.rs +756 -0
  123. package/vendor/stylo/invalidation/media_queries.rs +144 -0
  124. package/vendor/stylo/invalidation/mod.rs +10 -0
  125. package/vendor/stylo/invalidation/stylesheets.rs +745 -0
  126. package/vendor/stylo/invalidation/viewport_units.rs +71 -0
  127. package/vendor/stylo/lib.rs +336 -0
  128. package/vendor/stylo/logical_geometry.rs +1684 -0
  129. package/vendor/stylo/macros.rs +70 -0
  130. package/vendor/stylo/matching.rs +1226 -0
  131. package/vendor/stylo/media_queries/media_list.rs +168 -0
  132. package/vendor/stylo/media_queries/media_query.rs +190 -0
  133. package/vendor/stylo/media_queries/mod.rs +13 -0
  134. package/vendor/stylo/parallel.rs +205 -0
  135. package/vendor/stylo/parser.rs +276 -0
  136. package/vendor/stylo/piecewise_linear.rs +282 -0
  137. package/vendor/stylo/prefs.rs +33 -0
  138. package/vendor/stylo/properties/build.py +119 -0
  139. package/vendor/stylo/properties/cascade.rs +2704 -0
  140. package/vendor/stylo/properties/computed_value_flags.rs +206 -0
  141. package/vendor/stylo/properties/counted_unknown_properties.py +104 -0
  142. package/vendor/stylo/properties/counter_style_descriptors.toml +45 -0
  143. package/vendor/stylo/properties/data.py +1375 -0
  144. package/vendor/stylo/properties/declaration_block.rs +1788 -0
  145. package/vendor/stylo/properties/font_face_descriptors.toml +50 -0
  146. package/vendor/stylo/properties/gecko.mako.rs +1555 -0
  147. package/vendor/stylo/properties/helpers/animated_properties.mako.rs +800 -0
  148. package/vendor/stylo/properties/helpers.mako.rs +812 -0
  149. package/vendor/stylo/properties/longhands.toml +4305 -0
  150. package/vendor/stylo/properties/mod.rs +1857 -0
  151. package/vendor/stylo/properties/properties.html.mako +31 -0
  152. package/vendor/stylo/properties/properties.mako.rs +3103 -0
  153. package/vendor/stylo/properties/property_descriptors.toml +18 -0
  154. package/vendor/stylo/properties/shorthands.rs +4241 -0
  155. package/vendor/stylo/properties/shorthands.toml +575 -0
  156. package/vendor/stylo/properties/vendored_python/mako-1.3.10-py3-none-any.whl +0 -0
  157. package/vendor/stylo/properties/vendored_python/markupsafe/LICENSE.txt +28 -0
  158. package/vendor/stylo/properties/vendored_python/markupsafe/__init__.py +384 -0
  159. package/vendor/stylo/properties/vendored_python/toml-0.10.2-py2.py3-none-any.whl +0 -0
  160. package/vendor/stylo/properties/view_transition_descriptors.toml +11 -0
  161. package/vendor/stylo/properties_and_values/mod.rs +12 -0
  162. package/vendor/stylo/properties_and_values/registry.rs +65 -0
  163. package/vendor/stylo/properties_and_values/rule.rs +331 -0
  164. package/vendor/stylo/properties_and_values/syntax/ascii.rs +60 -0
  165. package/vendor/stylo/properties_and_values/syntax/data_type.rs +146 -0
  166. package/vendor/stylo/properties_and_values/syntax/mod.rs +437 -0
  167. package/vendor/stylo/properties_and_values/value.rs +758 -0
  168. package/vendor/stylo/queries/condition.rs +996 -0
  169. package/vendor/stylo/queries/feature.rs +199 -0
  170. package/vendor/stylo/queries/feature_expression.rs +1170 -0
  171. package/vendor/stylo/queries/mod.rs +19 -0
  172. package/vendor/stylo/queries/values.rs +46 -0
  173. package/vendor/stylo/rule_cache.rs +267 -0
  174. package/vendor/stylo/rule_collector.rs +554 -0
  175. package/vendor/stylo/rule_tree/core.rs +787 -0
  176. package/vendor/stylo/rule_tree/level.rs +396 -0
  177. package/vendor/stylo/rule_tree/map.rs +201 -0
  178. package/vendor/stylo/rule_tree/mod.rs +427 -0
  179. package/vendor/stylo/rule_tree/source.rs +80 -0
  180. package/vendor/stylo/rule_tree/unsafe_box.rs +78 -0
  181. package/vendor/stylo/scoped_tls.rs +80 -0
  182. package/vendor/stylo/selector_map.rs +1050 -0
  183. package/vendor/stylo/selector_parser.rs +305 -0
  184. package/vendor/stylo/servo/animation.rs +1922 -0
  185. package/vendor/stylo/servo/attr.rs +714 -0
  186. package/vendor/stylo/servo/encoding_support.rs +81 -0
  187. package/vendor/stylo/servo/media_features.rs +254 -0
  188. package/vendor/stylo/servo/mod.rs +16 -0
  189. package/vendor/stylo/servo/restyle_damage.rs +215 -0
  190. package/vendor/stylo/servo/selector_parser.rs +1036 -0
  191. package/vendor/stylo/servo/shadow_parts.rs +207 -0
  192. package/vendor/stylo/shared_lock.rs +271 -0
  193. package/vendor/stylo/sharing/checks.rs +281 -0
  194. package/vendor/stylo/sharing/mod.rs +1000 -0
  195. package/vendor/stylo/simple_buckets_map.rs +52 -0
  196. package/vendor/stylo/str.rs +168 -0
  197. package/vendor/stylo/style_adjuster.rs +1086 -0
  198. package/vendor/stylo/style_resolver.rs +658 -0
  199. package/vendor/stylo/stylesheet_set.rs +658 -0
  200. package/vendor/stylo/stylesheets/appearance_base_rule.rs +51 -0
  201. package/vendor/stylo/stylesheets/container_rule.rs +769 -0
  202. package/vendor/stylo/stylesheets/counter_style_rule.rs +7 -0
  203. package/vendor/stylo/stylesheets/document_rule.rs +272 -0
  204. package/vendor/stylo/stylesheets/font_face_rule.rs +7 -0
  205. package/vendor/stylo/stylesheets/font_feature_values_rule.rs +481 -0
  206. package/vendor/stylo/stylesheets/font_palette_values_rule.rs +304 -0
  207. package/vendor/stylo/stylesheets/import_rule.rs +259 -0
  208. package/vendor/stylo/stylesheets/keyframes_rule.rs +733 -0
  209. package/vendor/stylo/stylesheets/layer_rule.rs +221 -0
  210. package/vendor/stylo/stylesheets/loader.rs +29 -0
  211. package/vendor/stylo/stylesheets/margin_rule.rs +190 -0
  212. package/vendor/stylo/stylesheets/media_rule.rs +191 -0
  213. package/vendor/stylo/stylesheets/mod.rs +918 -0
  214. package/vendor/stylo/stylesheets/namespace_rule.rs +43 -0
  215. package/vendor/stylo/stylesheets/nested_declarations_rule.rs +51 -0
  216. package/vendor/stylo/stylesheets/origin.rs +249 -0
  217. package/vendor/stylo/stylesheets/page_rule.rs +354 -0
  218. package/vendor/stylo/stylesheets/position_try_rule.rs +68 -0
  219. package/vendor/stylo/stylesheets/property_rule.rs +5 -0
  220. package/vendor/stylo/stylesheets/rule_list.rs +167 -0
  221. package/vendor/stylo/stylesheets/rule_parser.rs +1189 -0
  222. package/vendor/stylo/stylesheets/rules_iterator.rs +397 -0
  223. package/vendor/stylo/stylesheets/scope_rule.rs +511 -0
  224. package/vendor/stylo/stylesheets/starting_style_rule.rs +54 -0
  225. package/vendor/stylo/stylesheets/style_rule.rs +80 -0
  226. package/vendor/stylo/stylesheets/stylesheet.rs +570 -0
  227. package/vendor/stylo/stylesheets/supports_rule.rs +486 -0
  228. package/vendor/stylo/stylesheets/view_transition_rule.rs +81 -0
  229. package/vendor/stylo/stylist.rs +5076 -0
  230. package/vendor/stylo/thread_state.rs +87 -0
  231. package/vendor/stylo/traversal.rs +765 -0
  232. package/vendor/stylo/traversal_flags.rs +68 -0
  233. package/vendor/stylo/typed_om/mod.rs +981 -0
  234. package/vendor/stylo/typed_om/numeric.rs +128 -0
  235. package/vendor/stylo/typed_om/numeric_declaration.rs +93 -0
  236. package/vendor/stylo/typed_om/numeric_type.rs +640 -0
  237. package/vendor/stylo/typed_om/sum_value.rs +426 -0
  238. package/vendor/stylo/url/gecko.rs +367 -0
  239. package/vendor/stylo/url/mod.rs +71 -0
  240. package/vendor/stylo/url/servo.rs +239 -0
  241. package/vendor/stylo/use_counters/mod.rs +137 -0
  242. package/vendor/stylo/values/animated/color.rs +103 -0
  243. package/vendor/stylo/values/animated/effects.rs +26 -0
  244. package/vendor/stylo/values/animated/font.rs +37 -0
  245. package/vendor/stylo/values/animated/grid.rs +161 -0
  246. package/vendor/stylo/values/animated/lists.rs +141 -0
  247. package/vendor/stylo/values/animated/mod.rs +550 -0
  248. package/vendor/stylo/values/animated/svg.rs +46 -0
  249. package/vendor/stylo/values/animated/text.rs +58 -0
  250. package/vendor/stylo/values/animated/transform.rs +1592 -0
  251. package/vendor/stylo/values/computed/align.rs +90 -0
  252. package/vendor/stylo/values/computed/angle.rs +130 -0
  253. package/vendor/stylo/values/computed/animation.rs +124 -0
  254. package/vendor/stylo/values/computed/background.rs +13 -0
  255. package/vendor/stylo/values/computed/basic_shape.rs +267 -0
  256. package/vendor/stylo/values/computed/border.rs +163 -0
  257. package/vendor/stylo/values/computed/box.rs +267 -0
  258. package/vendor/stylo/values/computed/calc.rs +334 -0
  259. package/vendor/stylo/values/computed/color.rs +161 -0
  260. package/vendor/stylo/values/computed/column.rs +11 -0
  261. package/vendor/stylo/values/computed/corner_shape.rs +155 -0
  262. package/vendor/stylo/values/computed/counters.rs +26 -0
  263. package/vendor/stylo/values/computed/easing.rs +109 -0
  264. package/vendor/stylo/values/computed/effects.rs +30 -0
  265. package/vendor/stylo/values/computed/flex.rs +19 -0
  266. package/vendor/stylo/values/computed/font.rs +1517 -0
  267. package/vendor/stylo/values/computed/image.rs +273 -0
  268. package/vendor/stylo/values/computed/length.rs +576 -0
  269. package/vendor/stylo/values/computed/length_percentage.rs +1055 -0
  270. package/vendor/stylo/values/computed/list.rs +16 -0
  271. package/vendor/stylo/values/computed/mod.rs +1141 -0
  272. package/vendor/stylo/values/computed/motion.rs +73 -0
  273. package/vendor/stylo/values/computed/outline.rs +7 -0
  274. package/vendor/stylo/values/computed/page.rs +77 -0
  275. package/vendor/stylo/values/computed/param.rs +9 -0
  276. package/vendor/stylo/values/computed/percentage.rs +143 -0
  277. package/vendor/stylo/values/computed/position.rs +273 -0
  278. package/vendor/stylo/values/computed/ratio.rs +88 -0
  279. package/vendor/stylo/values/computed/rect.rs +19 -0
  280. package/vendor/stylo/values/computed/resolution.rs +76 -0
  281. package/vendor/stylo/values/computed/svg.rs +66 -0
  282. package/vendor/stylo/values/computed/table.rs +7 -0
  283. package/vendor/stylo/values/computed/text.rs +199 -0
  284. package/vendor/stylo/values/computed/time.rs +83 -0
  285. package/vendor/stylo/values/computed/transform.rs +559 -0
  286. package/vendor/stylo/values/computed/tree_counting.rs +30 -0
  287. package/vendor/stylo/values/computed/ui.rs +23 -0
  288. package/vendor/stylo/values/computed/url.rs +12 -0
  289. package/vendor/stylo/values/distance.rs +139 -0
  290. package/vendor/stylo/values/generics/animation.rs +363 -0
  291. package/vendor/stylo/values/generics/background.rs +65 -0
  292. package/vendor/stylo/values/generics/basic_shape.rs +1389 -0
  293. package/vendor/stylo/values/generics/border.rs +303 -0
  294. package/vendor/stylo/values/generics/box.rs +552 -0
  295. package/vendor/stylo/values/generics/calc.rs +2986 -0
  296. package/vendor/stylo/values/generics/color.rs +318 -0
  297. package/vendor/stylo/values/generics/column.rs +44 -0
  298. package/vendor/stylo/values/generics/counters.rs +320 -0
  299. package/vendor/stylo/values/generics/easing.rs +132 -0
  300. package/vendor/stylo/values/generics/effects.rs +131 -0
  301. package/vendor/stylo/values/generics/flex.rs +34 -0
  302. package/vendor/stylo/values/generics/font.rs +376 -0
  303. package/vendor/stylo/values/generics/grid.rs +962 -0
  304. package/vendor/stylo/values/generics/image.rs +653 -0
  305. package/vendor/stylo/values/generics/length.rs +656 -0
  306. package/vendor/stylo/values/generics/mod.rs +303 -0
  307. package/vendor/stylo/values/generics/motion.rs +274 -0
  308. package/vendor/stylo/values/generics/page.rs +167 -0
  309. package/vendor/stylo/values/generics/position.rs +669 -0
  310. package/vendor/stylo/values/generics/ratio.rs +88 -0
  311. package/vendor/stylo/values/generics/rect.rs +147 -0
  312. package/vendor/stylo/values/generics/size.rs +102 -0
  313. package/vendor/stylo/values/generics/svg.rs +226 -0
  314. package/vendor/stylo/values/generics/text.rs +268 -0
  315. package/vendor/stylo/values/generics/transform.rs +1157 -0
  316. package/vendor/stylo/values/generics/ui.rs +147 -0
  317. package/vendor/stylo/values/generics/url.rs +51 -0
  318. package/vendor/stylo/values/mod.rs +820 -0
  319. package/vendor/stylo/values/resolved/animation.rs +33 -0
  320. package/vendor/stylo/values/resolved/color.rs +53 -0
  321. package/vendor/stylo/values/resolved/counters.rs +45 -0
  322. package/vendor/stylo/values/resolved/mod.rs +316 -0
  323. package/vendor/stylo/values/specified/align.rs +711 -0
  324. package/vendor/stylo/values/specified/angle.rs +407 -0
  325. package/vendor/stylo/values/specified/animation.rs +921 -0
  326. package/vendor/stylo/values/specified/background.rs +270 -0
  327. package/vendor/stylo/values/specified/basic_shape.rs +986 -0
  328. package/vendor/stylo/values/specified/border.rs +430 -0
  329. package/vendor/stylo/values/specified/box.rs +2231 -0
  330. package/vendor/stylo/values/specified/calc.rs +1657 -0
  331. package/vendor/stylo/values/specified/color.rs +1210 -0
  332. package/vendor/stylo/values/specified/column.rs +11 -0
  333. package/vendor/stylo/values/specified/corner_shape.rs +152 -0
  334. package/vendor/stylo/values/specified/counters.rs +242 -0
  335. package/vendor/stylo/values/specified/easing.rs +225 -0
  336. package/vendor/stylo/values/specified/effects.rs +421 -0
  337. package/vendor/stylo/values/specified/flex.rs +42 -0
  338. package/vendor/stylo/values/specified/font.rs +2103 -0
  339. package/vendor/stylo/values/specified/frequency.rs +39 -0
  340. package/vendor/stylo/values/specified/grid.rs +407 -0
  341. package/vendor/stylo/values/specified/image.rs +1385 -0
  342. package/vendor/stylo/values/specified/intersection_observer.rs +80 -0
  343. package/vendor/stylo/values/specified/length.rs +2024 -0
  344. package/vendor/stylo/values/specified/list.rs +190 -0
  345. package/vendor/stylo/values/specified/mod.rs +531 -0
  346. package/vendor/stylo/values/specified/motion.rs +316 -0
  347. package/vendor/stylo/values/specified/number.rs +603 -0
  348. package/vendor/stylo/values/specified/outline.rs +69 -0
  349. package/vendor/stylo/values/specified/page.rs +94 -0
  350. package/vendor/stylo/values/specified/param.rs +121 -0
  351. package/vendor/stylo/values/specified/percentage.rs +364 -0
  352. package/vendor/stylo/values/specified/position.rs +2247 -0
  353. package/vendor/stylo/values/specified/ratio.rs +29 -0
  354. package/vendor/stylo/values/specified/rect.rs +28 -0
  355. package/vendor/stylo/values/specified/resolution.rs +237 -0
  356. package/vendor/stylo/values/specified/source_size_list.rs +135 -0
  357. package/vendor/stylo/values/specified/svg.rs +427 -0
  358. package/vendor/stylo/values/specified/svg_path.rs +1115 -0
  359. package/vendor/stylo/values/specified/table.rs +38 -0
  360. package/vendor/stylo/values/specified/text.rs +1561 -0
  361. package/vendor/stylo/values/specified/time.rs +313 -0
  362. package/vendor/stylo/values/specified/transform.rs +599 -0
  363. package/vendor/stylo/values/specified/tree_counting.rs +32 -0
  364. package/vendor/stylo/values/specified/ui.rs +344 -0
  365. package/vendor/stylo/values/specified/url.rs +12 -0
  366. package/vendor/stylo/values/tagged_numeric.rs +253 -0
  367. package/wasm/blitz_pdf.d.ts +67 -0
  368. package/wasm/blitz_pdf.js +699 -0
  369. package/wasm/blitz_pdf_bg.wasm +0 -0
  370. package/wasm/blitz_pdf_bg.wasm.d.ts +20 -0
@@ -0,0 +1,558 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+
5
+ //! The [`@font-face`][ff] at-rule.
6
+ //!
7
+ //! [ff]: https://drafts.csswg.org/css-fonts/#at-font-face-rule
8
+
9
+ use crate::derives::*;
10
+ use crate::error_reporting::ContextualParseError;
11
+ use crate::parser::{Parse, ParserContext};
12
+ use crate::shared_lock::{SharedRwLockReadGuard, ToCssWithGuard};
13
+ use crate::values::computed::FontWeight;
14
+ use crate::values::generics::font::FontStyle as GenericFontStyle;
15
+ use crate::values::specified::{url::SpecifiedUrl, Angle};
16
+ use cssparser::{Parser, RuleBodyParser, SourceLocation};
17
+ use std::fmt::{self, Write};
18
+ use style_traits::{CssStringWriter, CssWriter, ParseError, StyleParseErrorKind, ToCss};
19
+
20
+ pub use crate::properties::font_face::{DescriptorId, DescriptorParser, Descriptors};
21
+ pub use crate::values::computed::font::{FamilyName, FontStyle, FontWidth};
22
+ pub use crate::values::specified::font::{
23
+ AbsoluteFontWeight, FontFeatureSettings, FontLanguageOverride, FontVariationSettings,
24
+ FontWidth as SpecifiedFontWidth, MetricsOverride, SpecifiedFontStyle,
25
+ };
26
+
27
+ /// A source for a font-face rule.
28
+ #[cfg_attr(feature = "servo", derive(Deserialize, Serialize))]
29
+ #[derive(Clone, Debug, Eq, MallocSizeOf, PartialEq, ToCss, ToShmem)]
30
+ pub enum Source {
31
+ /// A `url()` source.
32
+ Url(UrlSource),
33
+ /// A `local()` source.
34
+ #[css(function)]
35
+ Local(FamilyName),
36
+ }
37
+
38
+ /// A list of sources for the font-face src descriptor.
39
+ #[derive(Clone, Debug, Eq, MallocSizeOf, PartialEq, ToCss, ToShmem)]
40
+ #[css(comma)]
41
+ pub struct SourceList(#[css(iterable)] pub Vec<Source>);
42
+
43
+ // We can't just use OneOrMoreSeparated to derive Parse for the Source list,
44
+ // because we want to filter out components that parsed as None, then fail if no
45
+ // valid components remain. So we provide our own implementation here.
46
+ impl Parse for SourceList {
47
+ fn parse(context: &ParserContext, input: &mut Parser) -> Result<Self, ParseError> {
48
+ // Parse the comma-separated list, then let filter_map discard any None items.
49
+ let list = input
50
+ .parse_comma_separated(|input| {
51
+ let s = input.parse_entirely(|input| Source::parse(context, input));
52
+ while input.next().is_ok() {}
53
+ Ok(s.ok())
54
+ })?
55
+ .into_iter()
56
+ .flatten()
57
+ .collect::<Vec<Source>>();
58
+ if list.is_empty() {
59
+ Err(ParseError::custom(StyleParseErrorKind::UnspecifiedError))
60
+ } else {
61
+ Ok(SourceList(list))
62
+ }
63
+ }
64
+ }
65
+
66
+ /// Keywords for the font-face src descriptor's format() function.
67
+ /// ('None' and 'Unknown' are for internal use in gfx, not exposed to CSS.)
68
+ #[derive(
69
+ Clone, Copy, Debug, Deserialize, Eq, MallocSizeOf, Parse, PartialEq, Serialize, ToCss, ToShmem,
70
+ )]
71
+ #[repr(u8)]
72
+ #[allow(missing_docs)]
73
+ pub enum FontFaceSourceFormatKeyword {
74
+ #[css(skip)]
75
+ None,
76
+ Collection,
77
+ EmbeddedOpentype,
78
+ Opentype,
79
+ Svg,
80
+ Truetype,
81
+ Woff,
82
+ Woff2,
83
+ #[css(skip)]
84
+ Unknown,
85
+ }
86
+
87
+ /// Flags for the @font-face tech() function, indicating font technologies
88
+ /// required by the resource.
89
+ #[derive(Clone, Copy, Debug, Deserialize, Eq, MallocSizeOf, PartialEq, Serialize, ToShmem)]
90
+ #[repr(C)]
91
+ pub struct FontFaceSourceTechFlags(u16);
92
+ bitflags! {
93
+ impl FontFaceSourceTechFlags: u16 {
94
+ /// Font requires OpenType feature support.
95
+ const FEATURES_OPENTYPE = 1 << 0;
96
+ /// Font requires Apple Advanced Typography support.
97
+ const FEATURES_AAT = 1 << 1;
98
+ /// Font requires Graphite shaping support.
99
+ const FEATURES_GRAPHITE = 1 << 2;
100
+ /// Font requires COLRv0 rendering support (simple list of colored layers).
101
+ const COLOR_COLRV0 = 1 << 3;
102
+ /// Font requires COLRv1 rendering support (graph of paint operations).
103
+ const COLOR_COLRV1 = 1 << 4;
104
+ /// Font requires SVG glyph rendering support.
105
+ const COLOR_SVG = 1 << 5;
106
+ /// Font has bitmap glyphs in 'sbix' format.
107
+ const COLOR_SBIX = 1 << 6;
108
+ /// Font has bitmap glyphs in 'CBDT' format.
109
+ const COLOR_CBDT = 1 << 7;
110
+ /// Font requires OpenType Variations support.
111
+ const VARIATIONS = 1 << 8;
112
+ /// Font requires CPAL palette selection support.
113
+ const PALETTES = 1 << 9;
114
+ /// Font requires support for incremental downloading.
115
+ const INCREMENTAL = 1 << 10;
116
+ }
117
+ }
118
+
119
+ impl FontFaceSourceTechFlags {
120
+ /// Parse a single font-technology keyword and return its flag.
121
+ pub fn parse_one(input: &mut Parser) -> Result<Self, ParseError> {
122
+ Ok(try_match_ident_ignore_ascii_case! { input,
123
+ "features-opentype" => Self::FEATURES_OPENTYPE,
124
+ "features-aat" => Self::FEATURES_AAT,
125
+ "features-graphite" => Self::FEATURES_GRAPHITE,
126
+ "color-colrv0" => Self::COLOR_COLRV0,
127
+ "color-colrv1" => Self::COLOR_COLRV1,
128
+ "color-svg" => Self::COLOR_SVG,
129
+ "color-sbix" => Self::COLOR_SBIX,
130
+ "color-cbdt" => Self::COLOR_CBDT,
131
+ "variations" => Self::VARIATIONS,
132
+ "palettes" => Self::PALETTES,
133
+ "incremental" => Self::INCREMENTAL,
134
+ })
135
+ }
136
+ }
137
+
138
+ impl Parse for FontFaceSourceTechFlags {
139
+ fn parse(_context: &ParserContext, input: &mut Parser) -> Result<Self, ParseError> {
140
+ // We don't actually care about the return value of parse_comma_separated,
141
+ // because we insert the flags into result as we go.
142
+ let mut result = Self::empty();
143
+ input.parse_comma_separated(|input| {
144
+ let flag = Self::parse_one(input)?;
145
+ result.insert(flag);
146
+ Ok(())
147
+ })?;
148
+ if !result.is_empty() {
149
+ Ok(result)
150
+ } else {
151
+ Err(ParseError::custom(StyleParseErrorKind::UnspecifiedError))
152
+ }
153
+ }
154
+ }
155
+
156
+ #[allow(unused_assignments)]
157
+ impl ToCss for FontFaceSourceTechFlags {
158
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
159
+ where
160
+ W: fmt::Write,
161
+ {
162
+ let mut first = true;
163
+
164
+ macro_rules! write_if_flag {
165
+ ($s:expr => $f:ident) => {
166
+ if self.contains(Self::$f) {
167
+ if first {
168
+ first = false;
169
+ } else {
170
+ dest.write_str(", ")?;
171
+ }
172
+ dest.write_str($s)?;
173
+ }
174
+ };
175
+ }
176
+
177
+ write_if_flag!("features-opentype" => FEATURES_OPENTYPE);
178
+ write_if_flag!("features-aat" => FEATURES_AAT);
179
+ write_if_flag!("features-graphite" => FEATURES_GRAPHITE);
180
+ write_if_flag!("color-colrv0" => COLOR_COLRV0);
181
+ write_if_flag!("color-colrv1" => COLOR_COLRV1);
182
+ write_if_flag!("color-svg" => COLOR_SVG);
183
+ write_if_flag!("color-sbix" => COLOR_SBIX);
184
+ write_if_flag!("color-cbdt" => COLOR_CBDT);
185
+ write_if_flag!("variations" => VARIATIONS);
186
+ write_if_flag!("palettes" => PALETTES);
187
+ write_if_flag!("incremental" => INCREMENTAL);
188
+
189
+ Ok(())
190
+ }
191
+ }
192
+
193
+ /// <https://drafts.csswg.org/css-fonts/#font-face-rule>
194
+ #[derive(Clone, Debug, ToShmem, PartialEq)]
195
+ pub struct FontFaceRule {
196
+ /// The descriptors of the @font-face rule.
197
+ pub descriptors: Descriptors,
198
+ /// The parser location of the rule.
199
+ pub source_location: SourceLocation,
200
+ }
201
+
202
+ impl FontFaceRule {
203
+ /// Returns an empty rule.
204
+ pub fn empty(source_location: SourceLocation) -> Self {
205
+ Self {
206
+ descriptors: Default::default(),
207
+ source_location,
208
+ }
209
+ }
210
+ }
211
+
212
+ /// A POD representation for Gecko. All pointers here are non-owned and as such
213
+ /// can't outlive the rule they came from, but we can't enforce that via C++.
214
+ ///
215
+ /// All the strings are of course utf8.
216
+ #[cfg(feature = "gecko")]
217
+ #[derive(Clone, Copy, Debug, Eq, PartialEq)]
218
+ #[repr(u8)]
219
+ #[allow(missing_docs)]
220
+ pub enum FontFaceSourceListComponent {
221
+ Url(*const crate::url::CssUrl),
222
+ Local(*mut crate::gecko_bindings::structs::nsAtom),
223
+ FormatHintKeyword(FontFaceSourceFormatKeyword),
224
+ FormatHintString {
225
+ length: usize,
226
+ utf8_bytes: *const u8,
227
+ },
228
+ TechFlags(FontFaceSourceTechFlags),
229
+ }
230
+
231
+ #[derive(Clone, Debug, Deserialize, Eq, MallocSizeOf, PartialEq, Serialize, ToCss, ToShmem)]
232
+ #[repr(u8)]
233
+ #[allow(missing_docs)]
234
+ pub enum FontFaceSourceFormat {
235
+ Keyword(FontFaceSourceFormatKeyword),
236
+ String(String),
237
+ }
238
+
239
+ /// A `UrlSource` represents a font-face source that has been specified with a
240
+ /// `url()` function.
241
+ ///
242
+ /// <https://drafts.csswg.org/css-fonts/#src-desc>
243
+ #[cfg_attr(feature = "servo", derive(Deserialize, Serialize))]
244
+ #[derive(Clone, Debug, Eq, MallocSizeOf, PartialEq, ToShmem)]
245
+ pub struct UrlSource {
246
+ /// The specified url.
247
+ pub url: SpecifiedUrl,
248
+ /// The format hint specified with the `format()` function, if present.
249
+ pub format_hint: Option<FontFaceSourceFormat>,
250
+ /// The font technology flags specified with the `tech()` function, if any.
251
+ pub tech_flags: FontFaceSourceTechFlags,
252
+ }
253
+
254
+ impl ToCss for UrlSource {
255
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
256
+ where
257
+ W: fmt::Write,
258
+ {
259
+ self.url.to_css(dest)?;
260
+ if let Some(hint) = &self.format_hint {
261
+ dest.write_str(" format(")?;
262
+ hint.to_css(dest)?;
263
+ dest.write_char(')')?;
264
+ }
265
+ if !self.tech_flags.is_empty() {
266
+ dest.write_str(" tech(")?;
267
+ self.tech_flags.to_css(dest)?;
268
+ dest.write_char(')')?;
269
+ }
270
+ Ok(())
271
+ }
272
+ }
273
+
274
+ /// A font-display value for a @font-face rule.
275
+ /// The font-display descriptor determines how a font face is displayed based
276
+ /// on whether and when it is downloaded and ready to use.
277
+ #[allow(missing_docs)]
278
+ #[derive(
279
+ Clone,
280
+ Copy,
281
+ Debug,
282
+ Deserialize,
283
+ Eq,
284
+ MallocSizeOf,
285
+ Parse,
286
+ PartialEq,
287
+ Serialize,
288
+ ToComputedValue,
289
+ ToCss,
290
+ ToShmem,
291
+ )]
292
+ #[repr(u8)]
293
+ pub enum FontDisplay {
294
+ Auto,
295
+ Block,
296
+ Swap,
297
+ Fallback,
298
+ Optional,
299
+ }
300
+
301
+ macro_rules! impl_range {
302
+ ($range:ident, $component:ident) => {
303
+ impl Parse for $range {
304
+ fn parse(context: &ParserContext, input: &mut Parser) -> Result<Self, ParseError> {
305
+ let first = $component::parse(context, input)?;
306
+ let second = input
307
+ .try_parse(|input| $component::parse(context, input))
308
+ .unwrap_or_else(|_| first.clone());
309
+ Ok($range(first, second))
310
+ }
311
+ }
312
+ impl ToCss for $range {
313
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
314
+ where
315
+ W: fmt::Write,
316
+ {
317
+ self.0.to_css(dest)?;
318
+ if self.0 != self.1 {
319
+ dest.write_char(' ')?;
320
+ self.1.to_css(dest)?;
321
+ }
322
+ Ok(())
323
+ }
324
+ }
325
+ };
326
+ }
327
+
328
+ /// The font-weight descriptor:
329
+ ///
330
+ /// https://drafts.csswg.org/css-fonts-4/#descdef-font-face-font-weight
331
+ #[derive(Clone, Debug, MallocSizeOf, PartialEq, ToShmem)]
332
+ pub struct FontWeightRange(pub AbsoluteFontWeight, pub AbsoluteFontWeight);
333
+ impl_range!(FontWeightRange, AbsoluteFontWeight);
334
+
335
+ /// The computed representation of the above so Gecko and Servo can read them easily.
336
+ ///
337
+ /// This one is needed because cbindgen doesn't know how to generate
338
+ /// specified::Number.
339
+ #[repr(C)]
340
+ #[allow(missing_docs)]
341
+ #[derive(Clone, Debug, Deserialize, Hash, MallocSizeOf, PartialEq, Serialize)]
342
+ pub struct ComputedFontWeightRange(pub FontWeight, pub FontWeight);
343
+
344
+ #[inline]
345
+ fn sort_range<T: PartialOrd>(a: T, b: T) -> (T, T) {
346
+ if a > b {
347
+ (b, a)
348
+ } else {
349
+ (a, b)
350
+ }
351
+ }
352
+
353
+ impl FontWeightRange {
354
+ /// Returns a computed font-weight range, or None if either bound is an unresolvable calc.
355
+ pub fn compute(&self) -> Option<ComputedFontWeightRange> {
356
+ let (min, max) = sort_range(self.0.compute()?, self.1.compute()?);
357
+ Some(ComputedFontWeightRange(min, max))
358
+ }
359
+ }
360
+
361
+ /// The font-width descriptor:
362
+ ///
363
+ /// https://drafts.csswg.org/css-fonts-4/#descdef-font-face-font-width
364
+ #[derive(Clone, Debug, MallocSizeOf, PartialEq, ToShmem)]
365
+ pub struct FontWidthRange(pub SpecifiedFontWidth, pub SpecifiedFontWidth);
366
+ impl_range!(FontWidthRange, SpecifiedFontWidth);
367
+
368
+ /// The computed representation of the above, so that Gecko and Servo can read them
369
+ /// easily.
370
+ #[repr(C)]
371
+ #[allow(missing_docs)]
372
+ #[derive(Clone, Debug, Deserialize, Hash, MallocSizeOf, PartialEq, Serialize)]
373
+ pub struct ComputedFontWidthRange(pub FontWidth, pub FontWidth);
374
+
375
+ impl FontWidthRange {
376
+ /// Returns a computed font-width range, or None if any value contains a calc
377
+ /// expression that cannot be resolved at parse time.
378
+ pub fn compute(&self) -> Option<ComputedFontWidthRange> {
379
+ fn compute_width(s: &SpecifiedFontWidth) -> Option<FontWidth> {
380
+ match *s {
381
+ SpecifiedFontWidth::Keyword(ref kw) => Some(kw.compute()),
382
+ SpecifiedFontWidth::Width(ref p) => {
383
+ Some(FontWidth::from_percentage(p.compute()?.0))
384
+ },
385
+ SpecifiedFontWidth::System(..) => unreachable!(),
386
+ }
387
+ }
388
+
389
+ let (min, max) = sort_range(compute_width(&self.0)?, compute_width(&self.1)?);
390
+ Some(ComputedFontWidthRange(min, max))
391
+ }
392
+ }
393
+
394
+ /// The font-style descriptor:
395
+ ///
396
+ /// https://drafts.csswg.org/css-fonts-4/#descdef-font-face-font-style
397
+ #[derive(Clone, Debug, MallocSizeOf, PartialEq, ToShmem)]
398
+ #[allow(missing_docs)]
399
+ pub enum FontStyleRange {
400
+ Italic,
401
+ Oblique(Angle, Angle),
402
+ }
403
+
404
+ /// The computed representation of the above, with angles in degrees stored as
405
+ /// signed 8.8 fixed-point values, so that Gecko and Servo can read them easily.
406
+ #[repr(C)]
407
+ #[allow(missing_docs)]
408
+ #[derive(Clone, Debug, Deserialize, Hash, MallocSizeOf, PartialEq, Serialize)]
409
+ pub struct ComputedFontStyleRange(pub FontStyle, pub FontStyle);
410
+
411
+ impl Parse for FontStyleRange {
412
+ fn parse(context: &ParserContext, input: &mut Parser) -> Result<Self, ParseError> {
413
+ // We parse 'normal' explicitly here to distinguish it from 'oblique 0deg',
414
+ // because we must not accept a following angle.
415
+ if input
416
+ .try_parse(|i| i.expect_ident_matching("normal"))
417
+ .is_ok()
418
+ {
419
+ return Ok(Self::Oblique(Angle::zero(), Angle::zero()));
420
+ }
421
+
422
+ let style = SpecifiedFontStyle::parse(context, input)?;
423
+ Ok(match style {
424
+ GenericFontStyle::Italic => Self::Italic,
425
+ GenericFontStyle::Oblique(angle) => {
426
+ let second_angle = input
427
+ .try_parse(|input| SpecifiedFontStyle::parse_angle(context, input))
428
+ .unwrap_or_else(|_| angle.clone());
429
+
430
+ Self::Oblique(angle, second_angle)
431
+ },
432
+ })
433
+ }
434
+ }
435
+
436
+ impl ToCss for FontStyleRange {
437
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
438
+ where
439
+ W: fmt::Write,
440
+ {
441
+ match *self {
442
+ Self::Italic => dest.write_str("italic"),
443
+ Self::Oblique(ref first, ref second) => {
444
+ // Not first.is_zero() because we don't want to serialize
445
+ // `oblique calc(0deg)` as `normal`.
446
+ if *first == Angle::zero() && first == second {
447
+ return dest.write_str("normal");
448
+ }
449
+ dest.write_str("oblique")?;
450
+ if *first != SpecifiedFontStyle::default_angle() || first != second {
451
+ dest.write_char(' ')?;
452
+ first.to_css(dest)?;
453
+ }
454
+ if first != second {
455
+ dest.write_char(' ')?;
456
+ second.to_css(dest)?;
457
+ }
458
+ Ok(())
459
+ },
460
+ }
461
+ }
462
+ }
463
+
464
+ impl FontStyleRange {
465
+ /// Returns a computed font-style descriptor.
466
+ pub fn compute(&self) -> Option<ComputedFontStyleRange> {
467
+ Some(match *self {
468
+ Self::Italic => ComputedFontStyleRange(FontStyle::ITALIC, FontStyle::ITALIC),
469
+ Self::Oblique(ref first, ref second) => {
470
+ let (min, max) = sort_range(first.degrees()?, second.degrees()?);
471
+ ComputedFontStyleRange(FontStyle::oblique(min), FontStyle::oblique(max))
472
+ },
473
+ })
474
+ }
475
+ }
476
+
477
+ /// Parse the block inside a `@font-face` rule.
478
+ ///
479
+ /// Note that the prelude parsing code lives in the `stylesheets` module.
480
+ pub fn parse_font_face_block(
481
+ context: &ParserContext,
482
+ input: &mut Parser,
483
+ source_location: SourceLocation,
484
+ ) -> FontFaceRule {
485
+ let mut rule = FontFaceRule::empty(source_location);
486
+ {
487
+ let mut parser = DescriptorParser {
488
+ context,
489
+ descriptors: &mut rule.descriptors,
490
+ };
491
+ let iter = RuleBodyParser::new(input, &mut parser);
492
+ for declaration in iter {
493
+ if let Err((error, slice, location)) = declaration {
494
+ let error = ContextualParseError::UnsupportedFontFaceDescriptor(slice, error);
495
+ context.log_css_error(location, error)
496
+ }
497
+ }
498
+ }
499
+ rule
500
+ }
501
+
502
+ impl Parse for Source {
503
+ fn parse(context: &ParserContext, input: &mut Parser) -> Result<Source, ParseError> {
504
+ if input
505
+ .try_parse(|input| input.expect_function_matching("local"))
506
+ .is_ok()
507
+ {
508
+ return input
509
+ .parse_nested_block(|input| FamilyName::parse(context, input))
510
+ .map(Source::Local);
511
+ }
512
+
513
+ let url = SpecifiedUrl::parse(context, input)?;
514
+
515
+ // Parsing optional format()
516
+ let format_hint = if input
517
+ .try_parse(|input| input.expect_function_matching("format"))
518
+ .is_ok()
519
+ {
520
+ input.parse_nested_block(|input| {
521
+ if let Ok(kw) = input.try_parse(FontFaceSourceFormatKeyword::parse) {
522
+ Ok(Some(FontFaceSourceFormat::Keyword(kw)))
523
+ } else {
524
+ let s = input.expect_string()?.as_ref().to_owned();
525
+ Ok(Some(FontFaceSourceFormat::String(s)))
526
+ }
527
+ })?
528
+ } else {
529
+ None
530
+ };
531
+
532
+ // Parse optional tech()
533
+ let tech_flags = if crate::pref!("layout.css.font-tech.enabled", gecko = true)
534
+ && input
535
+ .try_parse(|input| input.expect_function_matching("tech"))
536
+ .is_ok()
537
+ {
538
+ input.parse_nested_block(|input| FontFaceSourceTechFlags::parse(context, input))?
539
+ } else {
540
+ FontFaceSourceTechFlags::empty()
541
+ };
542
+
543
+ Ok(Source::Url(UrlSource {
544
+ url,
545
+ format_hint,
546
+ tech_flags,
547
+ }))
548
+ }
549
+ }
550
+
551
+ impl ToCssWithGuard for FontFaceRule {
552
+ // Serialization of FontFaceRule is not specced.
553
+ fn to_css(&self, _guard: &SharedRwLockReadGuard, dest: &mut CssStringWriter) -> fmt::Result {
554
+ dest.write_str("@font-face { ")?;
555
+ self.descriptors.to_css(&mut CssWriter::new(dest))?;
556
+ dest.write_char('}')
557
+ }
558
+ }
@@ -0,0 +1,124 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+
5
+ //! Access to font metrics from the style system.
6
+
7
+ #![deny(missing_docs)]
8
+
9
+ use crate::values::computed::Length;
10
+
11
+ /// Represents the font metrics that style needs from a font to compute the
12
+ /// value of certain CSS units like `ex`.
13
+ #[derive(Clone, Debug, PartialEq)]
14
+ pub struct FontMetrics {
15
+ /// The x-height of the font.
16
+ pub x_height: Option<Length>,
17
+ /// The zero advance. This is usually writing mode dependent
18
+ pub zero_advance_measure: Option<Length>,
19
+ /// The cap-height of the font.
20
+ pub cap_height: Option<Length>,
21
+ /// The ideographic-width of the font.
22
+ pub ic_width: Option<Length>,
23
+ /// The ascent of the font (a value is always available for this).
24
+ pub ascent: Length,
25
+ /// Script scale down factor for math-depth 1.
26
+ /// https://w3c.github.io/mathml-core/#dfn-scriptpercentscaledown
27
+ pub script_percent_scale_down: Option<f32>,
28
+ /// Script scale down factor for math-depth 2.
29
+ /// https://w3c.github.io/mathml-core/#dfn-scriptscriptpercentscaledown
30
+ pub script_script_percent_scale_down: Option<f32>,
31
+ }
32
+
33
+ impl Default for FontMetrics {
34
+ fn default() -> Self {
35
+ FontMetrics {
36
+ x_height: None,
37
+ zero_advance_measure: None,
38
+ cap_height: None,
39
+ ic_width: None,
40
+ ascent: Length::new(0.0),
41
+ script_percent_scale_down: None,
42
+ script_script_percent_scale_down: None,
43
+ }
44
+ }
45
+ }
46
+
47
+ impl FontMetrics {
48
+ /// Returns the x-height, computing a fallback value if not present
49
+ pub fn x_height_or_default(&self, reference_font_size: Length) -> Length {
50
+ // https://drafts.csswg.org/css-values/#ex
51
+ //
52
+ // In the cases where it is impossible or impractical to
53
+ // determine the x-height, a value of 0.5em must be
54
+ // assumed.
55
+ //
56
+ // (But note we use 0.5em of the used, not computed
57
+ // font-size)
58
+ self.x_height.unwrap_or_else(|| reference_font_size * 0.5)
59
+ }
60
+
61
+ /// Returns the zero advance measure, computing a fallback value if not present
62
+ pub fn zero_advance_measure_or_default(
63
+ &self,
64
+ reference_font_size: Length,
65
+ upright: bool,
66
+ ) -> Length {
67
+ // https://drafts.csswg.org/css-values/#ch
68
+ //
69
+ // In the cases where it is impossible or impractical to
70
+ // determine the measure of the “0” glyph, it must be
71
+ // assumed to be 0.5em wide by 1em tall. Thus, the ch
72
+ // unit falls back to 0.5em in the general case, and to
73
+ // 1em when it would be typeset upright (i.e.
74
+ // writing-mode is vertical-rl or vertical-lr and
75
+ // text-orientation is upright).
76
+ //
77
+ // Same caveat about computed vs. used font-size applies
78
+ // above.
79
+ self.zero_advance_measure.unwrap_or_else(|| {
80
+ if upright {
81
+ reference_font_size
82
+ } else {
83
+ reference_font_size * 0.5
84
+ }
85
+ })
86
+ }
87
+
88
+ /// Returns the cap-height, computing a fallback value if not present
89
+ pub fn cap_height_or_default(&self) -> Length {
90
+ // https://drafts.csswg.org/css-values/#cap
91
+ //
92
+ // In the cases where it is impossible or impractical to
93
+ // determine the cap-height, the font’s ascent must be
94
+ // used.
95
+ //
96
+ self.cap_height.unwrap_or(self.ascent)
97
+ }
98
+
99
+ /// Returns the ideographic advance measure, computing a fallback value if not present
100
+ pub fn ic_width_or_default(&self, reference_font_size: Length) -> Length {
101
+ // https://drafts.csswg.org/css-values/#ic
102
+ //
103
+ // In the cases where it is impossible or impractical to
104
+ // determine the ideographic advance measure, it must be
105
+ // assumed to be 1em.
106
+ //
107
+ // Same caveat about computed vs. used as for other
108
+ // metric-dependent units.
109
+ self.ic_width.unwrap_or(reference_font_size)
110
+ }
111
+ }
112
+
113
+ /// Type of font metrics to retrieve.
114
+ #[derive(Clone, Debug, PartialEq)]
115
+ pub enum FontMetricsOrientation {
116
+ /// Get metrics for horizontal or vertical according to the Context's
117
+ /// writing mode, using horizontal metrics for vertical/mixed
118
+ MatchContextPreferHorizontal,
119
+ /// Get metrics for horizontal or vertical according to the Context's
120
+ /// writing mode, using vertical metrics for vertical/mixed
121
+ MatchContextPreferVertical,
122
+ /// Force getting horizontal metrics.
123
+ Horizontal,
124
+ }