diff options
Diffstat (limited to 'tiny_skia')
| -rw-r--r-- | tiny_skia/src/backend.rs | 30 | ||||
| -rw-r--r-- | tiny_skia/src/text.rs | 73 | 
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< | 
