summaryrefslogtreecommitdiffstats
path: root/tiny_skia/src
diff options
context:
space:
mode:
Diffstat (limited to 'tiny_skia/src')
-rw-r--r--tiny_skia/src/backend.rs30
-rw-r--r--tiny_skia/src/text.rs73
2 files changed, 87 insertions, 16 deletions
diff --git a/tiny_skia/src/backend.rs b/tiny_skia/src/backend.rs
index 65aca4b0..3c6fe288 100644
--- a/tiny_skia/src/backend.rs
+++ b/tiny_skia/src/backend.rs
@@ -1,6 +1,5 @@
use crate::core::{Background, Color, Gradient, Rectangle, Vector};
use crate::graphics::backend;
-use crate::graphics::text;
use crate::graphics::{Damage, Viewport};
use crate::primitive::{self, Primitive};
@@ -384,6 +383,31 @@ impl Backend {
clip_mask,
);
}
+ Primitive::Editor {
+ editor,
+ position,
+ color,
+ } => {
+ let physical_bounds =
+ (Rectangle::new(*position, editor.bounds) + translation)
+ * scale_factor;
+
+ if !clip_bounds.intersects(&physical_bounds) {
+ return;
+ }
+
+ let clip_mask = (!physical_bounds.is_within(&clip_bounds))
+ .then_some(clip_mask as &_);
+
+ self.text_pipeline.draw_editor(
+ editor,
+ *position + translation,
+ *color,
+ scale_factor,
+ pixels,
+ clip_mask,
+ );
+ }
Primitive::Text {
content,
bounds,
@@ -803,10 +827,6 @@ impl iced_graphics::Backend for Backend {
}
impl backend::Text for Backend {
- fn font_system(&self) -> &text::FontSystem {
- self.text_pipeline.font_system()
- }
-
fn load_font(&mut self, font: Cow<'static, [u8]>) {
self.text_pipeline.load_font(font);
}
diff --git a/tiny_skia/src/text.rs b/tiny_skia/src/text.rs
index cb3ef54c..70e95d01 100644
--- a/tiny_skia/src/text.rs
+++ b/tiny_skia/src/text.rs
@@ -1,9 +1,11 @@
use crate::core::alignment;
use crate::core::text::{LineHeight, Shaping};
use crate::core::{Color, Font, Pixels, Point, Rectangle};
+use crate::graphics::color;
use crate::graphics::text::cache::{self, Cache};
+use crate::graphics::text::editor;
+use crate::graphics::text::font_system;
use crate::graphics::text::paragraph;
-use crate::graphics::text::FontSystem;
use rustc_hash::{FxHashMap, FxHashSet};
use std::borrow::Cow;
@@ -12,7 +14,6 @@ use std::collections::hash_map;
#[allow(missing_debug_implementations)]
pub struct Pipeline {
- font_system: FontSystem,
glyph_cache: GlyphCache,
cache: RefCell<Cache>,
}
@@ -20,18 +21,16 @@ pub struct Pipeline {
impl Pipeline {
pub fn new() -> Self {
Pipeline {
- font_system: FontSystem::new(),
glyph_cache: GlyphCache::new(),
cache: RefCell::new(Cache::new()),
}
}
- pub fn font_system(&self) -> &FontSystem {
- &self.font_system
- }
-
pub fn load_font(&mut self, bytes: Cow<'static, [u8]>) {
- self.font_system.load_font(bytes);
+ font_system()
+ .write()
+ .expect("Write font system")
+ .load_font(bytes);
self.cache = RefCell::new(Cache::new());
}
@@ -51,8 +50,10 @@ impl Pipeline {
return;
};
+ let mut font_system = font_system().write().expect("Write font system");
+
draw(
- self.font_system.get_mut(),
+ font_system.raw(),
&mut self.glyph_cache,
paragraph.buffer(),
Rectangle::new(position, paragraph.min_bounds()),
@@ -65,6 +66,37 @@ impl Pipeline {
);
}
+ pub fn draw_editor(
+ &mut self,
+ editor: &editor::Weak,
+ position: Point,
+ color: Color,
+ scale_factor: f32,
+ pixels: &mut tiny_skia::PixmapMut<'_>,
+ clip_mask: Option<&tiny_skia::Mask>,
+ ) {
+ use crate::core::text::Editor as _;
+
+ let Some(editor) = editor.upgrade() else {
+ return;
+ };
+
+ let mut font_system = font_system().write().expect("Write font system");
+
+ draw(
+ font_system.raw(),
+ &mut self.glyph_cache,
+ editor.buffer(),
+ Rectangle::new(position, editor.bounds()),
+ color,
+ alignment::Horizontal::Left,
+ alignment::Vertical::Top,
+ scale_factor,
+ pixels,
+ clip_mask,
+ );
+ }
+
pub fn draw_cached(
&mut self,
content: &str,
@@ -82,7 +114,9 @@ impl Pipeline {
) {
let line_height = f32::from(line_height.to_absolute(size));
- let font_system = self.font_system.get_mut();
+ let mut font_system = font_system().write().expect("Write font system");
+ let font_system = font_system.raw();
+
let key = cache::Key {
bounds: bounds.size(),
content,
@@ -155,7 +189,7 @@ fn draw(
if let Some((buffer, placement)) = glyph_cache.allocate(
physical_glyph.cache_key,
- color,
+ glyph.color_opt.map(from_color).unwrap_or(color),
font_system,
&mut swash,
) {
@@ -180,6 +214,23 @@ fn draw(
}
}
+fn from_color(color: cosmic_text::Color) -> Color {
+ let [r, g, b, a] = color.as_rgba();
+
+ if color::GAMMA_CORRECTION {
+ // `cosmic_text::Color` is linear RGB in this case, so we
+ // need to convert back to sRGB
+ Color::from_linear_rgba(
+ r as f32 / 255.0,
+ g as f32 / 255.0,
+ b as f32 / 255.0,
+ a as f32 / 255.0,
+ )
+ } else {
+ Color::from_rgba8(r, g, b, a as f32 / 255.0)
+ }
+}
+
#[derive(Debug, Clone, Default)]
struct GlyphCache {
entries: FxHashMap<