splatthis 0.2.2__tar.gz → 0.2.3__tar.gz

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 (126) hide show
  1. {splatthis-0.2.2 → splatthis-0.2.3}/CHANGELOG.md +29 -0
  2. {splatthis-0.2.2/src/splatthis.egg-info → splatthis-0.2.3}/PKG-INFO +19 -17
  3. {splatthis-0.2.2 → splatthis-0.2.3}/README.md +18 -16
  4. {splatthis-0.2.2 → splatthis-0.2.3}/pyproject.toml +1 -1
  5. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/_version.py +1 -1
  6. {splatthis-0.2.2 → splatthis-0.2.3/src/splatthis.egg-info}/PKG-INFO +19 -17
  7. {splatthis-0.2.2 → splatthis-0.2.3}/CONTRIBUTING.md +0 -0
  8. {splatthis-0.2.2 → splatthis-0.2.3}/LICENSE +0 -0
  9. {splatthis-0.2.2 → splatthis-0.2.3}/MANIFEST.in +0 -0
  10. {splatthis-0.2.2 → splatthis-0.2.3}/setup.cfg +0 -0
  11. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/__init__.py +0 -0
  12. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/adaptive_compute.py +0 -0
  13. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/artifact_backends.py +0 -0
  14. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/artifact_evaluation.py +0 -0
  15. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/artifact_gates.py +0 -0
  16. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/artifact_io.py +0 -0
  17. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/browser_capture.py +0 -0
  18. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/browser_export.py +0 -0
  19. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/budgets.py +0 -0
  20. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/canvas_parity.py +0 -0
  21. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/cli.py +0 -0
  22. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/color.py +0 -0
  23. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/config.py +0 -0
  24. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/conversion_engine.py +0 -0
  25. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/converter.py +0 -0
  26. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/distillation.py +0 -0
  27. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/domain.py +0 -0
  28. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/engine_artifacts.py +0 -0
  29. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/engine_configuration.py +0 -0
  30. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/engine_densification.py +0 -0
  31. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/engine_guidance.py +0 -0
  32. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/engine_initialization.py +0 -0
  33. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/engine_optimization.py +0 -0
  34. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/engine_postfit.py +0 -0
  35. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/engine_state.py +0 -0
  36. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/export_common.py +0 -0
  37. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/features.py +0 -0
  38. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/fidelity/__init__.py +0 -0
  39. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/fidelity/analysis.py +0 -0
  40. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/fidelity/config.py +0 -0
  41. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/fidelity/evaluator.py +0 -0
  42. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/fidelity/metrics.py +0 -0
  43. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/fidelity/operators.py +0 -0
  44. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/fidelity/report.py +0 -0
  45. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/fidelity/stage.py +0 -0
  46. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/io.py +0 -0
  47. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/mixed_primitives.py +0 -0
  48. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/mlx_losses.py +0 -0
  49. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/mlx_optimizer.py +0 -0
  50. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/mlx_renderer.py +0 -0
  51. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/mlx_runtime.py +0 -0
  52. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/mlx_stage.py +0 -0
  53. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/optimizer.py +0 -0
  54. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/pipeline.py +0 -0
  55. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/pipeline_artifacts.py +0 -0
  56. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/pipeline_phases.py +0 -0
  57. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/pixel_runtime.py +0 -0
  58. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/pptx_export.py +0 -0
  59. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/profiles.py +0 -0
  60. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/proxies.py +0 -0
  61. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/py.typed +0 -0
  62. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/quality.py +0 -0
  63. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/renderer.py +0 -0
  64. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/reporting.py +0 -0
  65. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/roundtrip.py +0 -0
  66. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/splat.py +0 -0
  67. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/storage.py +0 -0
  68. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/svg_export.py +0 -0
  69. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/svg_recipe_gate.py +0 -0
  70. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/template_assets.py +0 -0
  71. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/__init__.py +0 -0
  72. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/drawingml/background_shape.xml +0 -0
  73. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/drawingml/blur.xml +0 -0
  74. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/drawingml/close_group.xml +0 -0
  75. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/drawingml/edge_segment.xml +0 -0
  76. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/drawingml/effect_list.xml +0 -0
  77. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/drawingml/gradient_fill.xml +0 -0
  78. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/drawingml/gradient_stop.xml +0 -0
  79. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/drawingml/group.xml +0 -0
  80. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/drawingml/shape.xml +0 -0
  81. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/drawingml/shape_no_effect.xml +0 -0
  82. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/drawingml/slide.xml +0 -0
  83. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/drawingml/soft_edge.xml +0 -0
  84. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/drawingml/solid_fill.xml +0 -0
  85. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/pptx/app_props.xml +0 -0
  86. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/pptx/content_types.xml +0 -0
  87. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/pptx/core_props.xml +0 -0
  88. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/pptx/pres_props.xml +0 -0
  89. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/pptx/presentation.xml +0 -0
  90. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/pptx/presentation_rels.xml +0 -0
  91. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/pptx/raster_slide.xml +0 -0
  92. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/pptx/raster_slide_rels.xml +0 -0
  93. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/pptx/root_rels.xml +0 -0
  94. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/pptx/slide_layout.xml +0 -0
  95. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/pptx/slide_layout_rels.xml +0 -0
  96. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/pptx/slide_master.xml +0 -0
  97. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/pptx/slide_master_rels.xml +0 -0
  98. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/pptx/theme.xml +0 -0
  99. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/pptx/vector_slide_rels.xml +0 -0
  100. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/pptx/view_props.xml +0 -0
  101. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/reporting/side_by_side.html +0 -0
  102. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/svg/background.svg +0 -0
  103. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/svg/blur_document.svg +0 -0
  104. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/svg/blur_ellipse.svg +0 -0
  105. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/svg/blur_filter.svg +0 -0
  106. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/svg/close.svg +0 -0
  107. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/svg/edge_group.svg +0 -0
  108. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/svg/edge_line.svg +0 -0
  109. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/svg/edge_path.svg +0 -0
  110. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/svg/ellipse.svg +0 -0
  111. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/svg/empty_document.svg +0 -0
  112. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/svg/palette_background.svg +0 -0
  113. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/svg/palette_document.svg +0 -0
  114. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/svg/palette_ellipse.svg +0 -0
  115. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/svg/palette_gradient.svg +0 -0
  116. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/svg/palette_stop.svg +0 -0
  117. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/svg/scripted_document.svg +0 -0
  118. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/svg/scripted_runtime.js +0 -0
  119. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/svg/standard_document.svg +0 -0
  120. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/svg/standard_gradient.svg +0 -0
  121. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/svg/standard_stop.svg +0 -0
  122. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis.egg-info/SOURCES.txt +0 -0
  123. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis.egg-info/dependency_links.txt +0 -0
  124. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis.egg-info/entry_points.txt +0 -0
  125. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis.egg-info/requires.txt +0 -0
  126. {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis.egg-info/top_level.txt +0 -0
@@ -2,6 +2,35 @@
2
2
 
3
3
  All notable changes to SplatThis are documented here.
4
4
 
5
+ ## 0.2.3 - 2026-08-01
6
+
7
+ ### Changed
8
+
9
+ - The README showcase renders all four outputs at one size and adds scriptless
10
+ CSS as a fourth column. The previous table sized each image by its own
11
+ intrinsic pixels -- 476x502, 364x384 and 728x768 -- so a three-way comparison
12
+ appeared at three different scales.
13
+
14
+ Sized with explicit `width` attributes rather than by resampling the files:
15
+ PyPI's `readme_renderer` allowlist keeps `width` and `height` on `<img>`, and
16
+ GitHub does too, so every asset stays at native resolution and stays crisp on
17
+ high-DPI displays.
18
+
19
+ CSS appears as a Chromium capture rather than live. Both platforms sanitize
20
+ README markup through an allowlist that omits the `<style>` tag and the
21
+ `style` attribute -- `readme_renderer` runs `nh3.clean()` with no CSS
22
+ sanitizer configured -- so a build made entirely of CSS radial gradients
23
+ arrives as 1,615 unstyled `<div>` elements. Each cell is labelled as live
24
+ vector or as a capture, and captures are noted as lower bounds: they carry
25
+ screen-capture and rescaling losses on top of the compositor's own.
26
+
27
+ ### Fixed
28
+
29
+ - The relative-link guard now covers `src="..."` as well as markdown `](...)`.
30
+ The showcase moved to raw `<img>` tags for sizing, which had made the
31
+ markdown-only check blind to every image on the page -- the same class of
32
+ defect that put 18 dead links on the 0.2.0 project page.
33
+
5
34
  ## 0.2.2 - 2026-08-01
6
35
 
7
36
  ### Changed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: splatthis
3
- Version: 0.2.2
3
+ Version: 0.2.3
4
4
  Summary: Fit 2D Gaussian splats to an image and deploy them as SVG, CSS, Canvas, a pixel runtime, or editable PowerPoint shapes
5
5
  Author: Bram Alkema
6
6
  License-Expression: MIT
@@ -71,26 +71,28 @@ deployed-fidelity claim.
71
71
  ## See it
72
72
 
73
73
  One 476x502 photograph, fitted to Gaussian splats and emitted to three
74
- compositors that share no rendering code. The middle image is a real SVG, not a
75
- raster of one — your browser is drawing 1,615 gradient ellipses.
74
+ compositors that share no rendering code — vector, stylesheet, and DrawingML.
76
75
 
77
- | Source photograph | Native SVG | Native PowerPoint |
78
- |---|---|---|
79
- | ![source image](https://bramalkema.github.io/SplatThis/demo/source.png) | ![Browser-rendered SVG](https://bramalkema.github.io/SplatThis/demo/chameleon.svg) | ![PowerPoint slideshow capture](https://bramalkema.github.io/SplatThis/demo/chameleon-pptx.png) |
80
- | the input | **0.8665** SSIM · vector · 1.5 MB | **0.7885** SSIM · editable shapes · 161 KB |
76
+ | Source | SVG | Scriptless CSS | PowerPoint |
77
+ |:---:|:---:|:---:|:---:|
78
+ | <img src="https://bramalkema.github.io/SplatThis/demo/source.png" alt="Source photograph" width="210"> | <img src="https://bramalkema.github.io/SplatThis/demo/chameleon.svg" alt="Browser-rendered SVG" width="210"> | <img src="https://bramalkema.github.io/SplatThis/demo/chameleon-css.png" alt="Chromium capture of the scriptless CSS build" width="210"> | <img src="https://bramalkema.github.io/SplatThis/demo/chameleon-pptx.png" alt="Microsoft PowerPoint slideshow capture" width="210"> |
79
+ | the input | **0.8665** SSIM<br>vector · 1.5 MB | **0.8748** SSIM<br>DOM + CSS · 0.8 MB | **0.7885** SSIM<br>editable shapes · 161 KB |
80
+ | — | live vector | Chromium capture | PowerPoint capture |
81
81
 
82
- The third image is the only screenshot here, and it has to be: it is Microsoft
83
- PowerPoint in slideshow, photographed, because there is no other honest way to
84
- show what PowerPoint actually draws. Its score is measured through that capture
85
- and is therefore a lower bound.
82
+ The SVG is the real thing: your browser is drawing 1,615 gradient ellipses, not
83
+ displaying a picture of them. The other two are captures because they have to
84
+ be. GitHub and PyPI both sanitize README markup through an allowlist that omits
85
+ the `<style>` tag and the `style` attribute — PyPI's `readme_renderer` runs
86
+ `nh3.clean()` with no CSS sanitizer configured — so a build made entirely of
87
+ CSS radial gradients arrives as 1,615 unstyled `<div>` elements on either site.
88
+ PowerPoint, obviously, does not run in a browser at all.
86
89
 
87
- **[Open the scriptless CSS build →](https://bramalkema.github.io/SplatThis/demo/chameleon-css.html)**
88
- &nbsp;&nbsp;**0.8748** SSIM · 0.8 MB · no script, no canvas, no SVG, no bitmap
90
+ Both captures are therefore lower bounds: they carry the losses of screen
91
+ capture and rescaling on top of whatever the compositor itself costs.
89
92
 
90
- That one is deliberately a link rather than a picture. It is 1,615 DOM elements
91
- with CSS radial gradients, and a screenshot of it would be indistinguishable
92
- from a screenshot of anything else — the point is that your browser is
93
- compositing it from a stylesheet. View source on it.
93
+ **[Open the scriptless CSS build →](https://bramalkema.github.io/SplatThis/demo/chameleon-css.html)**
94
+ — no script, no canvas, no SVG, no bitmap. View source on it; the capture above
95
+ cannot show that the page is 1,615 DOM elements composited from a stylesheet.
94
96
 
95
97
  Also available: the
96
98
  [editable .pptx](https://bramalkema.github.io/SplatThis/demo/chameleon.pptx),
@@ -24,26 +24,28 @@ deployed-fidelity claim.
24
24
  ## See it
25
25
 
26
26
  One 476x502 photograph, fitted to Gaussian splats and emitted to three
27
- compositors that share no rendering code. The middle image is a real SVG, not a
28
- raster of one — your browser is drawing 1,615 gradient ellipses.
27
+ compositors that share no rendering code — vector, stylesheet, and DrawingML.
29
28
 
30
- | Source photograph | Native SVG | Native PowerPoint |
31
- |---|---|---|
32
- | ![source image](https://bramalkema.github.io/SplatThis/demo/source.png) | ![Browser-rendered SVG](https://bramalkema.github.io/SplatThis/demo/chameleon.svg) | ![PowerPoint slideshow capture](https://bramalkema.github.io/SplatThis/demo/chameleon-pptx.png) |
33
- | the input | **0.8665** SSIM · vector · 1.5 MB | **0.7885** SSIM · editable shapes · 161 KB |
29
+ | Source | SVG | Scriptless CSS | PowerPoint |
30
+ |:---:|:---:|:---:|:---:|
31
+ | <img src="https://bramalkema.github.io/SplatThis/demo/source.png" alt="Source photograph" width="210"> | <img src="https://bramalkema.github.io/SplatThis/demo/chameleon.svg" alt="Browser-rendered SVG" width="210"> | <img src="https://bramalkema.github.io/SplatThis/demo/chameleon-css.png" alt="Chromium capture of the scriptless CSS build" width="210"> | <img src="https://bramalkema.github.io/SplatThis/demo/chameleon-pptx.png" alt="Microsoft PowerPoint slideshow capture" width="210"> |
32
+ | the input | **0.8665** SSIM<br>vector · 1.5 MB | **0.8748** SSIM<br>DOM + CSS · 0.8 MB | **0.7885** SSIM<br>editable shapes · 161 KB |
33
+ | — | live vector | Chromium capture | PowerPoint capture |
34
34
 
35
- The third image is the only screenshot here, and it has to be: it is Microsoft
36
- PowerPoint in slideshow, photographed, because there is no other honest way to
37
- show what PowerPoint actually draws. Its score is measured through that capture
38
- and is therefore a lower bound.
35
+ The SVG is the real thing: your browser is drawing 1,615 gradient ellipses, not
36
+ displaying a picture of them. The other two are captures because they have to
37
+ be. GitHub and PyPI both sanitize README markup through an allowlist that omits
38
+ the `<style>` tag and the `style` attribute — PyPI's `readme_renderer` runs
39
+ `nh3.clean()` with no CSS sanitizer configured — so a build made entirely of
40
+ CSS radial gradients arrives as 1,615 unstyled `<div>` elements on either site.
41
+ PowerPoint, obviously, does not run in a browser at all.
39
42
 
40
- **[Open the scriptless CSS build →](https://bramalkema.github.io/SplatThis/demo/chameleon-css.html)**
41
- &nbsp;&nbsp;**0.8748** SSIM · 0.8 MB · no script, no canvas, no SVG, no bitmap
43
+ Both captures are therefore lower bounds: they carry the losses of screen
44
+ capture and rescaling on top of whatever the compositor itself costs.
42
45
 
43
- That one is deliberately a link rather than a picture. It is 1,615 DOM elements
44
- with CSS radial gradients, and a screenshot of it would be indistinguishable
45
- from a screenshot of anything else — the point is that your browser is
46
- compositing it from a stylesheet. View source on it.
46
+ **[Open the scriptless CSS build →](https://bramalkema.github.io/SplatThis/demo/chameleon-css.html)**
47
+ — no script, no canvas, no SVG, no bitmap. View source on it; the capture above
48
+ cannot show that the page is 1,615 DOM elements composited from a stylesheet.
47
49
 
48
50
  Also available: the
49
51
  [editable .pptx](https://bramalkema.github.io/SplatThis/demo/chameleon.pptx),
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "splatthis"
7
- version = "0.2.2"
7
+ version = "0.2.3"
8
8
  description = "Fit 2D Gaussian splats to an image and deploy them as SVG, CSS, Canvas, a pixel runtime, or editable PowerPoint shapes"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -1,3 +1,3 @@
1
1
  """Single source of truth for the public package version."""
2
2
 
3
- __version__ = "0.2.2"
3
+ __version__ = "0.2.3"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: splatthis
3
- Version: 0.2.2
3
+ Version: 0.2.3
4
4
  Summary: Fit 2D Gaussian splats to an image and deploy them as SVG, CSS, Canvas, a pixel runtime, or editable PowerPoint shapes
5
5
  Author: Bram Alkema
6
6
  License-Expression: MIT
@@ -71,26 +71,28 @@ deployed-fidelity claim.
71
71
  ## See it
72
72
 
73
73
  One 476x502 photograph, fitted to Gaussian splats and emitted to three
74
- compositors that share no rendering code. The middle image is a real SVG, not a
75
- raster of one — your browser is drawing 1,615 gradient ellipses.
74
+ compositors that share no rendering code — vector, stylesheet, and DrawingML.
76
75
 
77
- | Source photograph | Native SVG | Native PowerPoint |
78
- |---|---|---|
79
- | ![source image](https://bramalkema.github.io/SplatThis/demo/source.png) | ![Browser-rendered SVG](https://bramalkema.github.io/SplatThis/demo/chameleon.svg) | ![PowerPoint slideshow capture](https://bramalkema.github.io/SplatThis/demo/chameleon-pptx.png) |
80
- | the input | **0.8665** SSIM · vector · 1.5 MB | **0.7885** SSIM · editable shapes · 161 KB |
76
+ | Source | SVG | Scriptless CSS | PowerPoint |
77
+ |:---:|:---:|:---:|:---:|
78
+ | <img src="https://bramalkema.github.io/SplatThis/demo/source.png" alt="Source photograph" width="210"> | <img src="https://bramalkema.github.io/SplatThis/demo/chameleon.svg" alt="Browser-rendered SVG" width="210"> | <img src="https://bramalkema.github.io/SplatThis/demo/chameleon-css.png" alt="Chromium capture of the scriptless CSS build" width="210"> | <img src="https://bramalkema.github.io/SplatThis/demo/chameleon-pptx.png" alt="Microsoft PowerPoint slideshow capture" width="210"> |
79
+ | the input | **0.8665** SSIM<br>vector · 1.5 MB | **0.8748** SSIM<br>DOM + CSS · 0.8 MB | **0.7885** SSIM<br>editable shapes · 161 KB |
80
+ | — | live vector | Chromium capture | PowerPoint capture |
81
81
 
82
- The third image is the only screenshot here, and it has to be: it is Microsoft
83
- PowerPoint in slideshow, photographed, because there is no other honest way to
84
- show what PowerPoint actually draws. Its score is measured through that capture
85
- and is therefore a lower bound.
82
+ The SVG is the real thing: your browser is drawing 1,615 gradient ellipses, not
83
+ displaying a picture of them. The other two are captures because they have to
84
+ be. GitHub and PyPI both sanitize README markup through an allowlist that omits
85
+ the `<style>` tag and the `style` attribute — PyPI's `readme_renderer` runs
86
+ `nh3.clean()` with no CSS sanitizer configured — so a build made entirely of
87
+ CSS radial gradients arrives as 1,615 unstyled `<div>` elements on either site.
88
+ PowerPoint, obviously, does not run in a browser at all.
86
89
 
87
- **[Open the scriptless CSS build →](https://bramalkema.github.io/SplatThis/demo/chameleon-css.html)**
88
- &nbsp;&nbsp;**0.8748** SSIM · 0.8 MB · no script, no canvas, no SVG, no bitmap
90
+ Both captures are therefore lower bounds: they carry the losses of screen
91
+ capture and rescaling on top of whatever the compositor itself costs.
89
92
 
90
- That one is deliberately a link rather than a picture. It is 1,615 DOM elements
91
- with CSS radial gradients, and a screenshot of it would be indistinguishable
92
- from a screenshot of anything else — the point is that your browser is
93
- compositing it from a stylesheet. View source on it.
93
+ **[Open the scriptless CSS build →](https://bramalkema.github.io/SplatThis/demo/chameleon-css.html)**
94
+ — no script, no canvas, no SVG, no bitmap. View source on it; the capture above
95
+ cannot show that the page is 1,615 DOM elements composited from a stylesheet.
94
96
 
95
97
  Also available: the
96
98
  [editable .pptx](https://bramalkema.github.io/SplatThis/demo/chameleon.pptx),
File without changes
File without changes
File without changes
File without changes
File without changes