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.
- {splatthis-0.2.2 → splatthis-0.2.3}/CHANGELOG.md +29 -0
- {splatthis-0.2.2/src/splatthis.egg-info → splatthis-0.2.3}/PKG-INFO +19 -17
- {splatthis-0.2.2 → splatthis-0.2.3}/README.md +18 -16
- {splatthis-0.2.2 → splatthis-0.2.3}/pyproject.toml +1 -1
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/_version.py +1 -1
- {splatthis-0.2.2 → splatthis-0.2.3/src/splatthis.egg-info}/PKG-INFO +19 -17
- {splatthis-0.2.2 → splatthis-0.2.3}/CONTRIBUTING.md +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/LICENSE +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/MANIFEST.in +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/setup.cfg +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/__init__.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/adaptive_compute.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/artifact_backends.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/artifact_evaluation.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/artifact_gates.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/artifact_io.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/browser_capture.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/browser_export.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/budgets.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/canvas_parity.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/cli.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/color.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/config.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/conversion_engine.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/converter.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/distillation.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/domain.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/engine_artifacts.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/engine_configuration.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/engine_densification.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/engine_guidance.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/engine_initialization.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/engine_optimization.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/engine_postfit.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/engine_state.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/export_common.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/features.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/fidelity/__init__.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/fidelity/analysis.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/fidelity/config.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/fidelity/evaluator.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/fidelity/metrics.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/fidelity/operators.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/fidelity/report.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/fidelity/stage.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/io.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/mixed_primitives.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/mlx_losses.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/mlx_optimizer.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/mlx_renderer.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/mlx_runtime.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/mlx_stage.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/optimizer.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/pipeline.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/pipeline_artifacts.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/pipeline_phases.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/pixel_runtime.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/pptx_export.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/profiles.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/proxies.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/py.typed +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/quality.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/renderer.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/reporting.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/roundtrip.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/splat.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/storage.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/svg_export.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/svg_recipe_gate.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/template_assets.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/__init__.py +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/drawingml/background_shape.xml +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/drawingml/blur.xml +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/drawingml/close_group.xml +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/drawingml/edge_segment.xml +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/drawingml/effect_list.xml +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/drawingml/gradient_fill.xml +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/drawingml/gradient_stop.xml +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/drawingml/group.xml +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/drawingml/shape.xml +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/drawingml/shape_no_effect.xml +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/drawingml/slide.xml +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/drawingml/soft_edge.xml +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/drawingml/solid_fill.xml +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/pptx/app_props.xml +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/pptx/content_types.xml +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/pptx/core_props.xml +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/pptx/pres_props.xml +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/pptx/presentation.xml +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/pptx/presentation_rels.xml +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/pptx/raster_slide.xml +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/pptx/raster_slide_rels.xml +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/pptx/root_rels.xml +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/pptx/slide_layout.xml +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/pptx/slide_layout_rels.xml +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/pptx/slide_master.xml +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/pptx/slide_master_rels.xml +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/pptx/theme.xml +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/pptx/vector_slide_rels.xml +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/pptx/view_props.xml +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/reporting/side_by_side.html +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/svg/background.svg +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/svg/blur_document.svg +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/svg/blur_ellipse.svg +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/svg/blur_filter.svg +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/svg/close.svg +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/svg/edge_group.svg +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/svg/edge_line.svg +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/svg/edge_path.svg +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/svg/ellipse.svg +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/svg/empty_document.svg +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/svg/palette_background.svg +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/svg/palette_document.svg +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/svg/palette_ellipse.svg +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/svg/palette_gradient.svg +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/svg/palette_stop.svg +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/svg/scripted_document.svg +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/svg/scripted_runtime.js +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/svg/standard_document.svg +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/svg/standard_gradient.svg +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis/templates/svg/standard_stop.svg +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis.egg-info/SOURCES.txt +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis.egg-info/dependency_links.txt +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis.egg-info/entry_points.txt +0 -0
- {splatthis-0.2.2 → splatthis-0.2.3}/src/splatthis.egg-info/requires.txt +0 -0
- {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.
|
|
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
|
|
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
|
|
78
|
-
|
|
79
|
-
|
|
|
80
|
-
| the input | **0.8665** SSIM
|
|
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
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
and
|
|
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
|
-
|
|
88
|
-
|
|
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
|
-
|
|
91
|
-
|
|
92
|
-
|
|
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
|
|
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
|
|
31
|
-
|
|
32
|
-
|
|
|
33
|
-
| the input | **0.8665** SSIM
|
|
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
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
and
|
|
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
|
-
|
|
41
|
-
|
|
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
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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.
|
|
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,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: splatthis
|
|
3
|
-
Version: 0.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
|
|
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
|
|
78
|
-
|
|
79
|
-
|
|
|
80
|
-
| the input | **0.8665** SSIM
|
|
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
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
and
|
|
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
|
-
|
|
88
|
-
|
|
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
|
-
|
|
91
|
-
|
|
92
|
-
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|