[librsvg/rect: 4/10] Move all the internals from cairo:Rect to Rect



commit 25306613261b6eca1842caa880a4d277a175616b
Author: Paolo Borelli <pborelli gnome org>
Date:   Sun Dec 8 13:45:42 2019 +0100

    Move all the internals from cairo:Rect to Rect

 rsvg_internals/src/aspect_ratio.rs   | 19 +++++++--------
 rsvg_internals/src/drawing_ctx.rs    | 45 ++++++++++++++++++------------------
 rsvg_internals/src/filters/bounds.rs |  4 ++--
 rsvg_internals/src/filters/image.rs  |  8 +++----
 rsvg_internals/src/handle.rs         | 22 ++++++++----------
 rsvg_internals/src/image.rs          |  5 ++--
 rsvg_internals/src/marker.rs         | 14 ++++++-----
 rsvg_internals/src/mask.rs           | 13 +++++++----
 rsvg_internals/src/pattern.rs        |  4 ++--
 rsvg_internals/src/structure.rs      | 29 +++++++++++------------
 10 files changed, 80 insertions(+), 83 deletions(-)
---
diff --git a/rsvg_internals/src/aspect_ratio.rs b/rsvg_internals/src/aspect_ratio.rs
index a42362d0..feb704f9 100644
--- a/rsvg_internals/src/aspect_ratio.rs
+++ b/rsvg_internals/src/aspect_ratio.rs
@@ -27,6 +27,7 @@ use cairo;
 use crate::error::ValueErrorKind;
 use crate::float_eq_cairo::ApproxEqCairo;
 use crate::parsers::Parse;
+use crate::rect::Rect;
 use crate::viewbox::ViewBox;
 use cssparser::{CowRcStr, Parser};
 
@@ -124,13 +125,13 @@ impl AspectRatio {
         }
     }
 
-    pub fn compute(&self, vbox: &ViewBox, viewport: &cairo::Rectangle) -> (f64, f64, f64, f64) {
+    pub fn compute(&self, vbox: &ViewBox, viewport: &Rect) -> (f64, f64, f64, f64) {
         match self.align {
-            None => (viewport.x, viewport.y, viewport.width, viewport.height),
+            None => (viewport.x0, viewport.y0, viewport.width(), viewport.height()),
 
             Some(Align { x, y, fit }) => {
-                let w_factor = viewport.width / vbox.width;
-                let h_factor = viewport.height / vbox.height;
+                let w_factor = viewport.width() / vbox.width;
+                let h_factor = viewport.height() / vbox.height;
                 let factor = match fit {
                     FitMode::Meet => w_factor.min(h_factor),
                     FitMode::Slice => w_factor.max(h_factor),
@@ -139,8 +140,8 @@ impl AspectRatio {
                 let w = vbox.width * factor;
                 let h = vbox.height * factor;
 
-                let xpos = x.compute(viewport.x, viewport.width, w);
-                let ypos = y.compute(viewport.y, viewport.height, h);
+                let xpos = x.compute(viewport.x0, viewport.width(), w);
+                let ypos = y.compute(viewport.y0, viewport.height(), h);
 
                 (xpos, ypos, w, h)
             }
@@ -152,7 +153,7 @@ impl AspectRatio {
     pub fn viewport_to_viewbox_transform(
         &self,
         vbox: Option<ViewBox>,
-        viewport: &cairo::Rectangle,
+        viewport: &Rect,
     ) -> Option<cairo::Matrix> {
         // width or height set to 0 disables rendering of the element
         // https://www.w3.org/TR/SVG/struct.html#SVGElementWidthAttribute
@@ -160,7 +161,7 @@ impl AspectRatio {
         // https://www.w3.org/TR/SVG/struct.html#ImageElementWidthAttribute
         // https://www.w3.org/TR/SVG/painting.html#MarkerWidthAttribute
 
-        if viewport.width.approx_eq_cairo(0.0) || viewport.height.approx_eq_cairo(0.0) {
+        if viewport.is_empty() {
             return None;
         }
 
@@ -181,7 +182,7 @@ impl AspectRatio {
             }
         } else {
             let mut matrix = cairo::Matrix::identity();
-            matrix.translate(viewport.x, viewport.y);
+            matrix.translate(viewport.x0, viewport.y0);
             Some(matrix)
         }
     }
diff --git a/rsvg_internals/src/drawing_ctx.rs b/rsvg_internals/src/drawing_ctx.rs
index 29e805f1..68009607 100644
--- a/rsvg_internals/src/drawing_ctx.rs
+++ b/rsvg_internals/src/drawing_ctx.rs
@@ -23,7 +23,7 @@ use crate::properties::ComputedValues;
 use crate::property_defs::{
     ClipRule, FillRule, ShapeRendering, StrokeDasharray, StrokeLinecap, StrokeLinejoin,
 };
-use crate::rect::RectangleExt;
+use crate::rect::Rect;
 use crate::surface_utils::shared_surface::SharedImageSurface;
 use crate::unit_interval::UnitInterval;
 use crate::viewbox::ViewBox;
@@ -79,7 +79,7 @@ pub struct DrawingCtx {
 
     initial_affine: cairo::Matrix,
 
-    rect: cairo::Rectangle,
+    rect: Rect,
     dpi: Dpi,
 
     // This is a mitigation for SVG files that try to instance a huge number of
@@ -104,7 +104,7 @@ impl DrawingCtx {
         document: Rc<Document>,
         node: Option<&RsvgNode>,
         cr: &cairo::Context,
-        viewport: &cairo::Rectangle,
+        viewport: Rect,
         dpi: Dpi,
         measuring: bool,
         testing: bool,
@@ -116,12 +116,10 @@ impl DrawingCtx {
 
         let (rect, vbox) = if measuring {
             (
-                cairo::Rectangle::new(0.0, 0.0, 1.0, 1.0),
+                Rect::from_size(1.0, 1.0),
                 ViewBox::new(0.0, 0.0, 1.0, 1.0),
             )
         } else {
-            let rect = *viewport;
-
             // https://www.w3.org/TR/SVG2/coords.html#InitialCoordinateSystem
             //
             // "For the outermost svg element, the SVG user agent must
@@ -137,11 +135,11 @@ impl DrawingCtx {
             let vbox = ViewBox {
                 x: 0.0,
                 y: 0.0,
-                width: viewport.width,
-                height: viewport.height,
+                width: viewport.width(),
+                height: viewport.height(),
             };
 
-            (rect, vbox)
+            (viewport, vbox)
         };
 
         let mut view_box_stack = Vec::new();
@@ -171,7 +169,7 @@ impl DrawingCtx {
         draw_ctx
     }
 
-    pub fn toplevel_viewport(&self) -> cairo::Rectangle {
+    pub fn toplevel_viewport(&self) -> Rect {
         self.rect
     }
 
@@ -212,7 +210,7 @@ impl DrawingCtx {
     }
 
     fn size_for_temporary_surface(&self) -> (i32, i32) {
-        let (viewport_width, viewport_height) = (self.rect.width, self.rect.height);
+        let (viewport_width, viewport_height) = (self.rect.width(), self.rect.height());
 
         let (scaled_width, scaled_height) = self
             .initial_affine_with_offset()
@@ -292,25 +290,30 @@ impl DrawingCtx {
     pub fn push_new_viewport(
         &self,
         vbox: Option<ViewBox>,
-        viewport: &cairo::Rectangle,
+        viewport: Rect,
         preserve_aspect_ratio: AspectRatio,
         clip_mode: Option<ClipMode>,
     ) -> Option<ViewParams> {
         if let Some(ref clip) = clip_mode {
             if *clip == ClipMode::ClipToViewport {
-                self.clip(viewport.x, viewport.y, viewport.width, viewport.height);
+                self.clip(viewport);
             }
         }
 
         preserve_aspect_ratio
-            .viewport_to_viewbox_transform(vbox, viewport)
+            .viewport_to_viewbox_transform(vbox, &viewport)
             .and_then(|matrix| {
                 self.cr.transform(matrix);
 
                 if let Some(vbox) = vbox {
                     if let Some(ref clip) = clip_mode {
                         if *clip == ClipMode::ClipToVbox {
-                            self.clip(vbox.x, vbox.y, vbox.width, vbox.height);
+                            self.clip(Rect::new(
+                                vbox.x,
+                                vbox.y,
+                                vbox.x + vbox.width,
+                                vbox.y + vbox.height,
+                            ));
                         }
                     }
 
@@ -535,7 +538,7 @@ impl DrawingCtx {
 
     fn initial_affine_with_offset(&self) -> cairo::Matrix {
         let mut initial_with_offset = self.initial_affine;
-        initial_with_offset.translate(self.rect.x, self.rect.y);
+        initial_with_offset.translate(self.rect.x0, self.rect.y0);
         initial_with_offset
     }
 
@@ -783,10 +786,9 @@ impl DrawingCtx {
         res.and_then(|_: ()| Ok(bbox))
     }
 
-    pub fn clip(&self, x: f64, y: f64, w: f64, h: f64) {
+    pub fn clip(&self, rect: Rect) {
         let cr = self.get_cairo_context();
-
-        cr.rectangle(x, y, w, h);
+        cr.rectangle(rect.x0, rect.y0, rect.width(), rect.height());
         cr.clip();
     }
 
@@ -842,10 +844,7 @@ impl DrawingCtx {
         cr.set_matrix(affine);
 
         self.cr = cr;
-        self.rect.x = 0.0;
-        self.rect.y = 0.0;
-        self.rect.width = width;
-        self.rect.height = height;
+        self.rect = Rect::from_size(width, height);
 
         let res = self.draw_node_from_stack(cascaded, node, false);
 
diff --git a/rsvg_internals/src/filters/bounds.rs b/rsvg_internals/src/filters/bounds.rs
index 10094f9d..8799ad56 100644
--- a/rsvg_internals/src/filters/bounds.rs
+++ b/rsvg_internals/src/filters/bounds.rs
@@ -4,7 +4,7 @@ use cairo;
 use crate::bbox::BoundingBox;
 use crate::drawing_ctx::DrawingCtx;
 use crate::length::*;
-use crate::rect::IRect;
+use crate::rect::{IRect, Rect};
 
 use super::context::{FilterContext, FilterInput};
 
@@ -88,7 +88,7 @@ impl<'a> BoundsBuilder<'a> {
     ///
     /// Used by feImage.
     #[inline]
-    pub fn into_irect_without_clipping(self, draw_ctx: &mut DrawingCtx) -> IRect {
+    pub fn into_rect_without_clipping(self, draw_ctx: &mut DrawingCtx) -> Rect {
         self.apply_properties(draw_ctx).rect.unwrap().into()
     }
 
diff --git a/rsvg_internals/src/filters/image.rs b/rsvg_internals/src/filters/image.rs
index c3e13f67..ed4d7ea0 100644
--- a/rsvg_internals/src/filters/image.rs
+++ b/rsvg_internals/src/filters/image.rs
@@ -9,7 +9,7 @@ use crate::float_eq_cairo::ApproxEqCairo;
 use crate::node::{CascadedValues, NodeResult, NodeTrait, RsvgNode};
 use crate::parsers::ParseValue;
 use crate::property_bag::PropertyBag;
-use crate::rect::IRect;
+use crate::rect::{IRect, Rect};
 use crate::surface_utils::shared_surface::{SharedImageSurface, SurfaceType};
 use crate::viewbox::ViewBox;
 
@@ -101,7 +101,7 @@ impl FeImage {
         ctx: &FilterContext,
         draw_ctx: &DrawingCtx,
         bounds: &IRect,
-        unclipped_bounds: &IRect,
+        unclipped_bounds: &Rect,
         href: &Href,
     ) -> Result<ImageSurface, FilterError> {
         let surface = if let Href::PlainUrl(ref url) = *href {
@@ -127,7 +127,7 @@ impl FeImage {
                 f64::from(surface.width()),
                 f64::from(surface.height()),
             ),
-            &cairo::Rectangle::from(*unclipped_bounds),
+            unclipped_bounds,
         );
 
         if w.approx_eq_cairo(0.0) || h.approx_eq_cairo(0.0) {
@@ -197,7 +197,7 @@ impl FilterEffect for FeImage {
         if let Some(href) = self.href.as_ref() {
             let output_surface = match href {
                 Href::PlainUrl(_) => {
-                    let unclipped_bounds = bounds_builder.into_irect_without_clipping(draw_ctx);
+                    let unclipped_bounds = bounds_builder.into_rect_without_clipping(draw_ctx);
                     self.render_external_image(ctx, draw_ctx, &bounds, &unclipped_bounds, href)?
                 }
                 Href::WithFragment(ref frag) => self.render_node(ctx, draw_ctx, bounds, frag)?,
diff --git a/rsvg_internals/src/handle.rs b/rsvg_internals/src/handle.rs
index d2da4a8b..09468dc1 100644
--- a/rsvg_internals/src/handle.rs
+++ b/rsvg_internals/src/handle.rs
@@ -15,7 +15,7 @@ use crate::dpi::Dpi;
 use crate::drawing_ctx::DrawingCtx;
 use crate::error::{DefsLookupErrorKind, LoadingError, RenderingError};
 use crate::node::{CascadedValues, RsvgNode};
-use crate::rect::RectangleExt;
+use crate::rect::{Rect, RectangleExt};
 use crate::structure::{IntrinsicDimensions, Svg};
 use url::Url;
 
@@ -276,7 +276,7 @@ impl Handle {
     fn get_node_geometry_with_viewport(
         &self,
         node: &RsvgNode,
-        viewport: &cairo::Rectangle,
+        viewport: Rect,
         dpi: Dpi,
         is_testing: bool,
     ) -> Result<(cairo::Rectangle, cairo::Rectangle), RenderingError> {
@@ -331,7 +331,7 @@ impl Handle {
             }
         }
 
-        self.get_node_geometry_with_viewport(&node, &unit_rectangle(), dpi, is_testing)
+        self.get_node_geometry_with_viewport(&node, unit_rectangle(), dpi, is_testing)
     }
 
     fn get_node_or_root(&self, id: Option<&str>) -> Result<RsvgNode, RenderingError> {
@@ -350,6 +350,7 @@ impl Handle {
         is_testing: bool,
     ) -> Result<(cairo::Rectangle, cairo::Rectangle), RenderingError> {
         let node = self.get_node_or_root(id)?;
+        let viewport = Rect::from(*viewport);
         self.get_node_geometry_with_viewport(&node, viewport, dpi, is_testing)
     }
 
@@ -445,7 +446,7 @@ impl Handle {
             self.document.clone(),
             node.as_ref(),
             cr,
-            viewport,
+            Rect::from(*viewport),
             dpi,
             false,
             is_testing,
@@ -472,7 +473,7 @@ impl Handle {
             self.document.clone(),
             None,
             &cr,
-            &unit_rectangle(),
+            unit_rectangle(),
             dpi,
             true,
             is_testing,
@@ -541,7 +542,7 @@ impl Handle {
             self.document.clone(),
             None,
             &cr,
-            &unit_rectangle(),
+            unit_rectangle(),
             dpi,
             false,
             is_testing,
@@ -591,11 +592,6 @@ fn locale_from_environment() -> Locale {
     locale
 }
 
-fn unit_rectangle() -> cairo::Rectangle {
-    cairo::Rectangle {
-        x: 0.0,
-        y: 0.0,
-        width: 1.0,
-        height: 1.0,
-    }
+fn unit_rectangle() -> Rect {
+    Rect::from_size(1.0, 1.0)
 }
diff --git a/rsvg_internals/src/image.rs b/rsvg_internals/src/image.rs
index 873b75e5..b4b9281e 100644
--- a/rsvg_internals/src/image.rs
+++ b/rsvg_internals/src/image.rs
@@ -1,5 +1,4 @@
 use cairo;
-use cairo::Rectangle;
 use markup5ever::{expanded_name, local_name, namespace_url, ns};
 
 use crate::allowed_url::Href;
@@ -12,7 +11,7 @@ use crate::length::*;
 use crate::node::*;
 use crate::parsers::ParseValue;
 use crate::property_bag::PropertyBag;
-use crate::rect::RectangleExt;
+use crate::rect::Rect;
 use crate::viewbox::ViewBox;
 
 #[derive(Default)]
@@ -114,7 +113,7 @@ impl NodeTrait for Image {
 
                 if let Some(_params) = dc.push_new_viewport(
                     Some(ViewBox::new(0.0, 0.0, image_width, image_height)),
-                    &Rectangle::new(x, y, w, h),
+                    Rect::new(x, y, x + w, y + h),
                     self.aspect,
                     clip_mode,
                 ) {
diff --git a/rsvg_internals/src/marker.rs b/rsvg_internals/src/marker.rs
index 4edbf600..26fa336e 100644
--- a/rsvg_internals/src/marker.rs
+++ b/rsvg_internals/src/marker.rs
@@ -18,7 +18,7 @@ use crate::parsers::{Parse, ParseValue};
 use crate::path_builder::*;
 use crate::properties::{ComputedValues, SpecifiedValue, SpecifiedValues};
 use crate::property_bag::PropertyBag;
-use crate::rect::RectangleExt;
+use crate::rect::Rect;
 use crate::viewbox::*;
 
 // markerUnits attribute: https://www.w3.org/TR/SVG/painting.html#MarkerElement
@@ -152,7 +152,7 @@ impl Marker {
             let params = if let Some(vbox) = self.vbox {
                 let (_, _, w, h) = self.aspect.compute(
                     &vbox,
-                    &cairo::Rectangle::from_size(marker_width, marker_height),
+                    &Rect::from_size(marker_width, marker_height),
                 );
 
                 if vbox.width.approx_eq_cairo(0.0) || vbox.height.approx_eq_cairo(0.0) {
@@ -172,11 +172,13 @@ impl Marker {
             );
 
             if !values.is_overflow() {
-                if let Some(vbox) = self.vbox {
-                    dc.clip(vbox.x, vbox.y, vbox.width, vbox.height);
+                let clip_rect = if let Some(vbox) = self.vbox {
+                    Rect::new(vbox.x, vbox.y, vbox.x + vbox.width, vbox.y + vbox.height)
                 } else {
-                    dc.clip(0.0, 0.0, marker_width, marker_height);
-                }
+                    Rect::from_size(marker_width, marker_height)
+                };
+
+                dc.clip(clip_rect);
             }
 
             dc.with_discrete_layer(node, values, clipping, &mut |dc| {
diff --git a/rsvg_internals/src/mask.rs b/rsvg_internals/src/mask.rs
index 4f67d197..08fb5a49 100644
--- a/rsvg_internals/src/mask.rs
+++ b/rsvg_internals/src/mask.rs
@@ -10,6 +10,7 @@ use crate::node::{CascadedValues, NodeDraw, NodeResult, NodeTrait, RsvgNode};
 use crate::parsers::{Parse, ParseValue};
 use crate::property_bag::PropertyBag;
 use crate::property_defs::Opacity;
+use crate::rect::Rect;
 use crate::surface_utils::{shared_surface::SharedImageSurface, shared_surface::SurfaceType};
 
 coord_units!(MaskUnits, CoordUnits::ObjectBoundingBox);
@@ -88,16 +89,18 @@ impl Mask {
 
             draw_ctx.push_cairo_context(mask_cr);
 
-            if mask_units == CoordUnits::ObjectBoundingBox {
-                draw_ctx.clip(
+            let (x, y, w, h) = if mask_units == CoordUnits::ObjectBoundingBox {
+                (
                     x * bbox_rect.width + bbox_rect.x,
                     y * bbox_rect.height + bbox_rect.y,
                     w * bbox_rect.width,
                     h * bbox_rect.height,
-                );
+                )
             } else {
-                draw_ctx.clip(x, y, w, h);
-            }
+                (x, y, w, h)
+            };
+
+            draw_ctx.clip(Rect::new(x, y, x + w, y + h));
 
             {
                 let _params = if content_units == CoordUnits::ObjectBoundingBox {
diff --git a/rsvg_internals/src/pattern.rs b/rsvg_internals/src/pattern.rs
index f4383700..dfe6e6b4 100644
--- a/rsvg_internals/src/pattern.rs
+++ b/rsvg_internals/src/pattern.rs
@@ -16,7 +16,7 @@ use crate::paint_server::{AsPaintSource, PaintSource};
 use crate::parsers::ParseValue;
 use crate::properties::ComputedValues;
 use crate::property_bag::PropertyBag;
-use crate::rect::RectangleExt;
+use crate::rect::Rect;
 use crate::unit_interval::UnitInterval;
 use crate::viewbox::*;
 
@@ -322,7 +322,7 @@ impl AsPaintSource for ResolvedPattern {
             // If there is a vbox, use that
             let (mut x, mut y, w, h) = preserve_aspect_ratio.compute(
                 &vbox,
-                &cairo::Rectangle::from_size(scaled_width, scaled_height),
+                &Rect::from_size(scaled_width, scaled_height),
             );
 
             x -= vbox.x * w / vbox.width;
diff --git a/rsvg_internals/src/structure.rs b/rsvg_internals/src/structure.rs
index 02c6aa6e..473855cb 100644
--- a/rsvg_internals/src/structure.rs
+++ b/rsvg_internals/src/structure.rs
@@ -1,4 +1,3 @@
-use cairo::Rectangle;
 use markup5ever::{expanded_name, local_name, namespace_url, ns};
 
 use crate::allowed_url::Fragment;
@@ -14,7 +13,7 @@ use crate::parsers::{Parse, ParseValue};
 use crate::properties::ComputedValues;
 use crate::property_bag::PropertyBag;
 use crate::property_defs::Overflow;
-use crate::rect::RectangleExt;
+use crate::rect::Rect;
 use crate::viewbox::*;
 
 #[derive(Default)]
@@ -162,15 +161,15 @@ impl Svg {
         (x, y, w, h)
     }
 
-    fn get_viewport(&self, values: &ComputedValues, params: &ViewParams) -> Rectangle {
+    fn get_viewport(&self, values: &ComputedValues, params: &ViewParams) -> Rect {
         let (x, y, w, h) = self.get_unnormalized_viewport();
 
-        Rectangle::new(
-            x.normalize(values, &params),
-            y.normalize(values, &params),
-            w.normalize(values, &params),
-            h.normalize(values, &params),
-        )
+        let nx = x.normalize(values, &params);
+        let ny = y.normalize(values, &params);
+        let nw = w.normalize(values, &params);
+        let nh = h.normalize(values, &params);
+
+        Rect::new(nx, ny, nx + nw, ny + nh)
     }
 }
 
@@ -247,8 +246,8 @@ impl NodeTrait for Svg {
                     Some(ViewBox {
                         x: 0.0,
                         y: 0.0,
-                        width: svg_viewport.width,
-                        height: svg_viewport.height,
+                        width: svg_viewport.width(),
+                        height: svg_viewport.height(),
                     })
                 }),
             )
@@ -256,7 +255,7 @@ impl NodeTrait for Svg {
 
         draw_ctx.with_discrete_layer(node, values, clipping, &mut |dc| {
             let _params =
-                dc.push_new_viewport(vbox, &viewport, self.preserve_aspect_ratio, clip_mode);
+                dc.push_new_viewport(vbox, viewport, self.preserve_aspect_ratio, clip_mode);
 
             node.draw_children(cascaded, dc, clipping)
         })
@@ -376,11 +375,9 @@ impl NodeTrait for Use {
             return Ok(draw_ctx.empty_bbox());
         }
 
-        let viewport = Rectangle::new(nx, ny, nw, nh);
-
         if child.borrow().get_type() != NodeType::Symbol {
             let cr = draw_ctx.get_cairo_context();
-            cr.translate(viewport.x, viewport.y);
+            cr.translate(nx, ny);
 
             draw_ctx.with_discrete_layer(node, values, clipping, &mut |dc| {
                 dc.draw_node_from_stack(
@@ -404,7 +401,7 @@ impl NodeTrait for Use {
             draw_ctx.with_discrete_layer(node, values, clipping, &mut |dc| {
                 let _params = dc.push_new_viewport(
                     symbol.vbox,
-                    &viewport,
+                    Rect::new(nx, ny, nx + nw, ny + nh),
                     symbol.preserve_aspect_ratio,
                     clip_mode,
                 );


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]