[librsvg/rect: 4/10] Move all the internals from cairo:Rect to Rect
- From: Paolo Borelli <pborelli src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [librsvg/rect: 4/10] Move all the internals from cairo:Rect to Rect
- Date: Sun, 8 Dec 2019 20:05:30 +0000 (UTC)
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, ¶ms),
- y.normalize(values, ¶ms),
- w.normalize(values, ¶ms),
- h.normalize(values, ¶ms),
- )
+ let nx = x.normalize(values, ¶ms);
+ let ny = y.normalize(values, ¶ms);
+ let nw = w.normalize(values, ¶ms);
+ let nh = h.normalize(values, ¶ms);
+
+ 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]