diff options
Diffstat (limited to 'tiny_skia/src')
| -rw-r--r-- | tiny_skia/src/backend.rs | 91 | ||||
| -rw-r--r-- | tiny_skia/src/geometry.rs | 6 | 
2 files changed, 48 insertions, 49 deletions
| diff --git a/tiny_skia/src/backend.rs b/tiny_skia/src/backend.rs index 468bcb7e..87007a51 100644 --- a/tiny_skia/src/backend.rs +++ b/tiny_skia/src/backend.rs @@ -3,7 +3,7 @@ use tiny_skia::Size;  use crate::core::{Background, Color, Gradient, Rectangle, Vector};  use crate::graphics::backend;  use crate::graphics::text; -use crate::graphics::Viewport; +use crate::graphics::{Transformation, Viewport};  use crate::primitive::{self, Primitive};  use std::borrow::Cow; @@ -106,7 +106,7 @@ impl Backend {                      clip_mask,                      region,                      scale_factor, -                    Vector::ZERO, +                    Transformation::IDENTITY,                  );              } @@ -146,7 +146,7 @@ impl Backend {          clip_mask: &mut tiny_skia::Mask,          clip_bounds: Rectangle,          scale_factor: f32, -        translation: Vector, +        transformation: Transformation,      ) {          match primitive {              Primitive::Quad { @@ -164,7 +164,7 @@ impl Backend {                      "Quad with non-normal height!"                  ); -                let physical_bounds = (*bounds + translation) * scale_factor; +                let physical_bounds = (*bounds * transformation) * scale_factor;                  if !clip_bounds.intersects(&physical_bounds) {                      return; @@ -173,11 +173,8 @@ impl Backend {                  let clip_mask = (!physical_bounds.is_within(&clip_bounds))                      .then_some(clip_mask as &_); -                let transform = tiny_skia::Transform::from_translate( -                    translation.x, -                    translation.y, -                ) -                .post_scale(scale_factor, scale_factor); +                let transform = into_transform(transformation) +                    .post_scale(scale_factor, scale_factor);                  // Make sure the border radius is not larger than the bounds                  let border_width = border @@ -199,7 +196,7 @@ impl Backend {                          y: bounds.y + shadow.offset.y - shadow.blur_radius,                          width: bounds.width + shadow.blur_radius * 2.0,                          height: bounds.height + shadow.blur_radius * 2.0, -                    } + translation) +                    } * transformation)                          * scale_factor;                      let radii = fill_border_radius @@ -451,7 +448,7 @@ impl Backend {                  clip_bounds: text_clip_bounds,              } => {                  let physical_bounds = -                    (*text_clip_bounds + translation) * scale_factor; +                    *text_clip_bounds * transformation * scale_factor;                  if !clip_bounds.intersects(&physical_bounds) {                      return; @@ -462,7 +459,7 @@ impl Backend {                  self.text_pipeline.draw_paragraph(                      paragraph, -                    *position + translation, +                    *position * transformation,                      *color,                      scale_factor,                      pixels, @@ -476,7 +473,7 @@ impl Backend {                  clip_bounds: text_clip_bounds,              } => {                  let physical_bounds = -                    (*text_clip_bounds + translation) * scale_factor; +                    (*text_clip_bounds * transformation) * scale_factor;                  if !clip_bounds.intersects(&physical_bounds) {                      return; @@ -487,7 +484,7 @@ impl Backend {                  self.text_pipeline.draw_editor(                      editor, -                    *position + translation, +                    *position * transformation,                      *color,                      scale_factor,                      pixels, @@ -507,7 +504,7 @@ impl Backend {                  clip_bounds: text_clip_bounds,              } => {                  let physical_bounds = -                    (*text_clip_bounds + translation) * scale_factor; +                    *text_clip_bounds * transformation * scale_factor;                  if !clip_bounds.intersects(&physical_bounds) {                      return; @@ -518,7 +515,7 @@ impl Backend {                  self.text_pipeline.draw_cached(                      content, -                    *bounds + translation, +                    *bounds * transformation,                      *color,                      *size,                      *line_height, @@ -542,7 +539,7 @@ impl Backend {                  };                  let physical_bounds = -                    (*text_clip_bounds + translation) * scale_factor; +                    *text_clip_bounds * transformation * scale_factor;                  if !clip_bounds.intersects(&physical_bounds) {                      return; @@ -553,7 +550,7 @@ impl Backend {                  self.text_pipeline.draw_raw(                      &buffer, -                    *position + translation, +                    *position * transformation,                      *color,                      scale_factor,                      pixels, @@ -566,7 +563,7 @@ impl Backend {                  filter_method,                  bounds,              } => { -                let physical_bounds = (*bounds + translation) * scale_factor; +                let physical_bounds = (*bounds * transformation) * scale_factor;                  if !clip_bounds.intersects(&physical_bounds) {                      return; @@ -575,11 +572,8 @@ impl Backend {                  let clip_mask = (!physical_bounds.is_within(&clip_bounds))                      .then_some(clip_mask as &_); -                let transform = tiny_skia::Transform::from_translate( -                    translation.x, -                    translation.y, -                ) -                .post_scale(scale_factor, scale_factor); +                let transform = into_transform(transformation) +                    .post_scale(scale_factor, scale_factor);                  self.raster_pipeline.draw(                      handle, @@ -602,7 +596,7 @@ impl Backend {                  bounds,                  color,              } => { -                let physical_bounds = (*bounds + translation) * scale_factor; +                let physical_bounds = (*bounds * transformation) * scale_factor;                  if !clip_bounds.intersects(&physical_bounds) {                      return; @@ -614,7 +608,7 @@ impl Backend {                  self.vector_pipeline.draw(                      handle,                      *color, -                    (*bounds + translation) * scale_factor, +                    (*bounds * transformation) * scale_factor,                      pixels,                      clip_mask,                  ); @@ -637,7 +631,7 @@ impl Backend {                      y: bounds.y(),                      width: bounds.width(),                      height: bounds.height(), -                } + translation) +                } * transformation)                      * scale_factor;                  if !clip_bounds.intersects(&physical_bounds) { @@ -651,11 +645,8 @@ impl Backend {                      path,                      paint,                      *rule, -                    tiny_skia::Transform::from_translate( -                        translation.x, -                        translation.y, -                    ) -                    .post_scale(scale_factor, scale_factor), +                    into_transform(transformation) +                        .post_scale(scale_factor, scale_factor),                      clip_mask,                  );              } @@ -671,7 +662,7 @@ impl Backend {                      y: bounds.y(),                      width: bounds.width(),                      height: bounds.height(), -                } + translation) +                } * transformation)                      * scale_factor;                  if !clip_bounds.intersects(&physical_bounds) { @@ -685,11 +676,8 @@ impl Backend {                      path,                      paint,                      stroke, -                    tiny_skia::Transform::from_translate( -                        translation.x, -                        translation.y, -                    ) -                    .post_scale(scale_factor, scale_factor), +                    into_transform(transformation) +                        .post_scale(scale_factor, scale_factor),                      clip_mask,                  );              } @@ -701,12 +689,12 @@ impl Backend {                          clip_mask,                          clip_bounds,                          scale_factor, -                        translation, +                        transformation,                      );                  }              } -            Primitive::Translate { -                translation: offset, +            Primitive::Transform { +                transformation: new_transformation,                  content,              } => {                  self.draw_primitive( @@ -715,11 +703,11 @@ impl Backend {                      clip_mask,                      clip_bounds,                      scale_factor, -                    translation + *offset, +                    transformation * *new_transformation,                  );              }              Primitive::Clip { bounds, content } => { -                let bounds = (*bounds + translation) * scale_factor; +                let bounds = (*bounds * transformation) * scale_factor;                  if bounds == clip_bounds {                      self.draw_primitive( @@ -728,7 +716,7 @@ impl Backend {                          clip_mask,                          bounds,                          scale_factor, -                        translation, +                        transformation,                      );                  } else if let Some(bounds) = clip_bounds.intersection(&bounds) {                      if bounds.x + bounds.width <= 0.0 @@ -749,7 +737,7 @@ impl Backend {                          clip_mask,                          bounds,                          scale_factor, -                        translation, +                        transformation,                      );                      adjust_clip_mask(clip_mask, clip_bounds); @@ -762,7 +750,7 @@ impl Backend {                      clip_mask,                      clip_bounds,                      scale_factor, -                    translation, +                    transformation,                  );              }          } @@ -780,6 +768,17 @@ fn into_color(color: Color) -> tiny_skia::Color {          .expect("Convert color from iced to tiny_skia")  } +fn into_transform(transformation: Transformation) -> tiny_skia::Transform { +    tiny_skia::Transform { +        sx: transformation.scale_x(), +        kx: 0.0, +        ky: 0.0, +        sy: transformation.scale_y(), +        tx: transformation.translation_x(), +        ty: transformation.translation_y(), +    } +} +  fn rounded_rectangle(      bounds: Rectangle,      border_radius: [f32; 4], diff --git a/tiny_skia/src/geometry.rs b/tiny_skia/src/geometry.rs index 74a08d38..579c153a 100644 --- a/tiny_skia/src/geometry.rs +++ b/tiny_skia/src/geometry.rs @@ -3,7 +3,7 @@ use crate::core::{Pixels, Point, Rectangle, Size, Vector};  use crate::graphics::geometry::fill::{self, Fill};  use crate::graphics::geometry::stroke::{self, Stroke};  use crate::graphics::geometry::{Path, Style, Text}; -use crate::graphics::Gradient; +use crate::graphics::{Gradient, Transformation};  use crate::primitive::{self, Primitive};  pub struct Frame { @@ -181,8 +181,8 @@ impl Frame {      }      pub fn clip(&mut self, frame: Self, at: Point) { -        self.primitives.push(Primitive::Translate { -            translation: Vector::new(at.x, at.y), +        self.primitives.push(Primitive::Transform { +            transformation: Transformation::translate(at.x, at.y),              content: Box::new(frame.into_primitive()),          });      } | 
