From 603832e66c710ea39a95009ddc905de20c6856bd Mon Sep 17 00:00:00 2001
From: Héctor Ramón Jiménez <hector@hecrj.dev>
Date: Tue, 5 Dec 2023 02:19:17 +0100
Subject: Introduce `RawText` to `Primitive` in `iced_graphics`

This should allow users to directly render a
`cosmic_text::Buffer`.
---
 wgpu/src/layer.rs      | 15 +++++++++++++++
 wgpu/src/layer/text.rs |  5 ++++-
 wgpu/src/text.rs       | 22 ++++++++++++++++++++++
 3 files changed, 41 insertions(+), 1 deletion(-)

(limited to 'wgpu')

diff --git a/wgpu/src/layer.rs b/wgpu/src/layer.rs
index 557a7633..4ad12a88 100644
--- a/wgpu/src/layer.rs
+++ b/wgpu/src/layer.rs
@@ -177,6 +177,21 @@ impl<'a> Layer<'a> {
                     clip_bounds: *clip_bounds + translation,
                 }));
             }
+            graphics::Primitive::RawText(graphics::text::Raw {
+                buffer,
+                position,
+                color,
+                clip_bounds,
+            }) => {
+                let layer = &mut layers[current_layer];
+
+                layer.text.push(Text::Raw(graphics::text::Raw {
+                    buffer: buffer.clone(),
+                    position: *position + translation,
+                    color: *color,
+                    clip_bounds: *clip_bounds + translation,
+                }));
+            }
             Primitive::Quad {
                 bounds,
                 background,
diff --git a/wgpu/src/layer/text.rs b/wgpu/src/layer/text.rs
index df2f2875..37ee5247 100644
--- a/wgpu/src/layer/text.rs
+++ b/wgpu/src/layer/text.rs
@@ -1,6 +1,7 @@
 use crate::core::alignment;
 use crate::core::text;
 use crate::core::{Color, Font, Pixels, Point, Rectangle};
+use crate::graphics;
 use crate::graphics::text::editor;
 use crate::graphics::text::paragraph;
 
@@ -23,8 +24,10 @@ pub enum Text<'a> {
         color: Color,
         clip_bounds: Rectangle,
     },
-    /// A cached text.
+    /// Some cached text.
     Cached(Cached<'a>),
+    /// Some raw text.
+    Raw(graphics::text::Raw),
 }
 
 #[derive(Debug, Clone)]
diff --git a/wgpu/src/text.rs b/wgpu/src/text.rs
index 888b1924..dca09cb8 100644
--- a/wgpu/src/text.rs
+++ b/wgpu/src/text.rs
@@ -7,6 +7,7 @@ use crate::layer::Text;
 
 use std::borrow::Cow;
 use std::cell::RefCell;
+use std::sync::Arc;
 
 #[allow(missing_debug_implementations)]
 pub struct Pipeline {
@@ -76,6 +77,7 @@ impl Pipeline {
             Paragraph(Paragraph),
             Editor(Editor),
             Cache(cache::KeyHash),
+            Raw(Arc<glyphon::Buffer>),
         }
 
         let allocations: Vec<_> = sections
@@ -107,6 +109,7 @@ impl Pipeline {
 
                     Some(Allocation::Cache(key))
                 }
+                Text::Raw(text) => text.buffer.upgrade().map(Allocation::Raw),
             })
             .collect();
 
@@ -185,6 +188,25 @@ impl Pipeline {
                             text.clip_bounds,
                         )
                     }
+                    Text::Raw(text) => {
+                        let Some(Allocation::Raw(buffer)) = allocation else {
+                            return None;
+                        };
+
+                        let (width, height) = buffer.size();
+
+                        (
+                            buffer.as_ref(),
+                            Rectangle::new(
+                                text.position,
+                                Size::new(width, height),
+                            ),
+                            alignment::Horizontal::Left,
+                            alignment::Vertical::Top,
+                            text.color,
+                            text.clip_bounds,
+                        )
+                    }
                 };
 
                 let bounds = bounds * scale_factor;
-- 
cgit