Add Table<Color> as a graphical type (#3033)

* Reduce code duplication in bounding box impls on Table

* Working Table<Color> rendering in the graph

* Implement color and fix other rendering with Vello and polish
This commit is contained in:
Keavon Chambers 2025-08-10 01:34:33 -07:00 committed by GitHub
parent 81abfe147a
commit 2f4aef34e5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
24 changed files with 462 additions and 198 deletions

View file

@ -8,6 +8,7 @@ use graphene_core::math::bbox::Bbox;
use graphene_core::raster::image::Image;
use graphene_core::raster_types::{CPU, Raster};
use graphene_core::table::Table;
#[cfg(target_family = "wasm")]
use graphene_core::transform::Footprint;
use graphene_core::vector::Vector;
use graphene_core::{Color, Context, Ctx, ExtractFootprint, Graphic, OwnedContextImpl, WasmNotSend};
@ -137,7 +138,9 @@ fn decode_image(_: impl Ctx, data: Arc<[u8]>) -> Table<Raster<CPU>> {
Table::new_from_element(Raster::new_cpu(image))
}
fn render_svg(data: impl Render, mut render: SvgRender, render_params: RenderParams, footprint: Footprint) -> RenderOutputType {
fn render_svg(data: impl Render, mut render: SvgRender, render_params: RenderParams) -> RenderOutputType {
let footprint = render_params.footprint;
if !data.contains_artboard() && !render_params.hide_artboards {
render.leaf_tag("rect", |attributes| {
attributes.push("x", "0");
@ -217,6 +220,7 @@ async fn rasterize<T: WasmNotSend + 'n>(
Table<Vector>,
Table<Raster<CPU>>,
Table<Graphic>,
Table<Color>,
)]
mut data: Table<T>,
footprint: Footprint,
@ -237,7 +241,7 @@ where
let size = aabb.size();
let resolution = footprint.resolution;
let render_params = RenderParams {
culling_bounds: None,
footprint,
for_export: true,
..Default::default()
};
@ -282,11 +286,11 @@ async fn render<'a: 'n, T: 'n + Render + WasmNotSend>(
render_config: RenderConfig,
editor_api: impl Node<Context<'static>, Output = &'a WasmEditorApi>,
#[implementations(
Context -> Table<Artboard>,
Context -> Table<Graphic>,
Context -> Table<Vector>,
Context -> Table<Raster<CPU>>,
Context -> Table<Graphic>,
Context -> Table<Artboard>,
Context -> Artboard,
Context -> Table<Color>,
Context -> Option<Color>,
Context -> Vec<Color>,
Context -> bool,
@ -308,7 +312,7 @@ async fn render<'a: 'n, T: 'n + Render + WasmNotSend>(
let RenderConfig { hide_artboards, for_export, .. } = render_config;
let render_params = RenderParams {
view_mode: render_config.view_mode,
culling_bounds: None,
footprint,
thumbnail: false,
hide_artboards,
for_export,
@ -333,7 +337,7 @@ async fn render<'a: 'n, T: 'n + Render + WasmNotSend>(
let output_format = render_config.export_format;
let data = match output_format {
ExportFormat::Svg => render_svg(data, SvgRender::new(), render_params, footprint),
ExportFormat::Svg => render_svg(data, SvgRender::new(), render_params),
ExportFormat::Canvas => {
if use_vello && editor_api.application_io.as_ref().unwrap().gpu_executor().is_some() {
#[cfg(all(feature = "vello", not(test)))]
@ -342,9 +346,9 @@ async fn render<'a: 'n, T: 'n + Render + WasmNotSend>(
metadata,
};
#[cfg(any(not(feature = "vello"), test))]
render_svg(data, SvgRender::new(), render_params, footprint)
render_svg(data, SvgRender::new(), render_params)
} else {
render_svg(data, SvgRender::new(), render_params, footprint)
render_svg(data, SvgRender::new(), render_params)
}
}
_ => todo!("Non-SVG render output for {output_format:?}"),