vello_hybrid: Expose glyph cache rendering state APIs publicly
diff --git a/sparse_strips/vello_hybrid/src/lib.rs b/sparse_strips/vello_hybrid/src/lib.rs
index fd8bf21..7dca888 100644
--- a/sparse_strips/vello_hybrid/src/lib.rs
+++ b/sparse_strips/vello_hybrid/src/lib.rs
@@ -59,7 +59,7 @@
 pub use render::{Config, GpuStrip, RenderSize};
 #[cfg(all(target_arch = "wasm32", feature = "webgl"))]
 pub use render::{WebGlAtlasWriter, WebGlRenderer, WebGlTextureWithDimensions};
-pub use scene::{RenderSettings, Scene, SceneConstraints};
+pub use scene::{RenderSettings, RenderState, Scene, SceneConstraints};
 pub use util::DimensionConstraints;
 pub use vello_common::multi_atlas::{AllocationStrategy, AtlasConfig, AtlasId};
 pub use vello_common::pixmap::Pixmap;
diff --git a/sparse_strips/vello_hybrid/src/render/wgpu.rs b/sparse_strips/vello_hybrid/src/render/wgpu.rs
index 39fab5c..9d1ec2f 100644
--- a/sparse_strips/vello_hybrid/src/render/wgpu.rs
+++ b/sparse_strips/vello_hybrid/src/render/wgpu.rs
@@ -86,7 +86,7 @@
     /// The state used by the scheduler.
     scheduler_state: SchedulerState,
     /// Image cache for storing images atlas allocations.
-    pub(crate) image_cache: ImageCache,
+    pub image_cache: ImageCache,
     /// Encoded paints for storing encoded paints.
     encoded_paints: Vec<GpuEncodedPaint>,
     /// Stores the index (offset) of the encoded paints in the encoded paints texture.
diff --git a/sparse_strips/vello_hybrid/src/scene.rs b/sparse_strips/vello_hybrid/src/scene.rs
index 1421baf..7f624dd 100644
--- a/sparse_strips/vello_hybrid/src/scene.rs
+++ b/sparse_strips/vello_hybrid/src/scene.rs
@@ -141,7 +141,7 @@
 ///
 /// This is used to save and restore rendering state during recording operations.
 #[derive(Debug)]
-struct RenderState {
+pub struct RenderState {
     /// The paint type (solid color, gradient, or image).
     pub(crate) paint: PaintType,
     /// Transform applied to the paint coordinates.
@@ -726,6 +726,28 @@
     pub fn height(&self) -> u16 {
         self.height
     }
+
+    /// Save current rendering state.
+    pub fn take_current_state(&mut self) -> RenderState {
+        RenderState {
+            paint: self.paint.clone(),
+            paint_transform: self.paint_transform,
+            transform: self.transform,
+            fill_rule: self.fill_rule,
+            blend_mode: self.blend_mode,
+            stroke: core::mem::take(&mut self.stroke),
+        }
+    }
+
+    /// Restore rendering state.
+    pub fn restore_state(&mut self, state: RenderState) {
+        self.paint = state.paint;
+        self.paint_transform = state.paint_transform;
+        self.stroke = state.stroke;
+        self.transform = state.transform;
+        self.fill_rule = state.fill_rule;
+        self.blend_mode = state.blend_mode;
+    }
 }
 
 #[cfg(feature = "text")]
@@ -1064,26 +1086,4 @@
             })
             .collect()
     }
-
-    /// Save current rendering state.
-    fn take_current_state(&mut self) -> RenderState {
-        RenderState {
-            paint: self.paint.clone(),
-            paint_transform: self.paint_transform,
-            transform: self.transform,
-            fill_rule: self.fill_rule,
-            blend_mode: self.blend_mode,
-            stroke: core::mem::take(&mut self.stroke),
-        }
-    }
-
-    /// Restore rendering state.
-    fn restore_state(&mut self, state: RenderState) {
-        self.paint = state.paint;
-        self.paint_transform = state.paint_transform;
-        self.stroke = state.stroke;
-        self.transform = state.transform;
-        self.fill_rule = state.fill_rule;
-        self.blend_mode = state.blend_mode;
-    }
 }