[librsvg/librsvg-2.48] gradient: use bbox.rect_to_transform instead of checking the rect by hand
- From: Federico Mena Quintero <federico src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [librsvg/librsvg-2.48] gradient: use bbox.rect_to_transform instead of checking the rect by hand
- Date: Thu, 30 Apr 2020 21:28:19 +0000 (UTC)
commit a7a4860bb7c2a6c43228f29627b2deaba3c3993f
Author: Federico Mena Quintero <federico gnome org>
Date: Thu Apr 30 14:50:20 2020 -0500
gradient: use bbox.rect_to_transform instead of checking the rect by hand
rsvg_internals/src/gradient.rs | 64 +++++++++++++++++-------------------------
1 file changed, 25 insertions(+), 39 deletions(-)
---
diff --git a/rsvg_internals/src/gradient.rs b/rsvg_internals/src/gradient.rs
index 552aaf07..5eb0e9ee 100644
--- a/rsvg_internals/src/gradient.rs
+++ b/rsvg_internals/src/gradient.rs
@@ -719,35 +719,34 @@ impl AsPaintSource for Gradient {
opacity: UnitInterval,
bbox: &BoundingBox,
) -> Result<bool, RenderingError> {
- let params = if self.units == GradientUnits(CoordUnits::ObjectBoundingBox) {
- if bbox.rect.map_or(true, |r| r.is_empty()) {
- // objectBoundingBox requires a non-empty bbox, see issues #187, #373
- return Ok(false);
- }
-
- draw_ctx.push_view_box(1.0, 1.0)
- } else {
- draw_ctx.get_view_params()
- };
+ if let Ok(transform) = bbox.rect_to_transform(self.units.0) {
+ let params = if self.units == GradientUnits(CoordUnits::ObjectBoundingBox) {
+ draw_ctx.push_view_box(1.0, 1.0)
+ } else {
+ draw_ctx.get_view_params()
+ };
- let p = match self.variant {
- Variant::Linear { .. } => {
- let g = self.variant.to_cairo_gradient(values, ¶ms);
- cairo::Gradient::clone(&g)
- }
+ let p = match self.variant {
+ Variant::Linear { .. } => {
+ let g = self.variant.to_cairo_gradient(values, ¶ms);
+ cairo::Gradient::clone(&g)
+ }
- Variant::Radial { .. } => {
- let g = self.variant.to_cairo_gradient(values, ¶ms);
- cairo::Gradient::clone(&g)
- }
- };
+ Variant::Radial { .. } => {
+ let g = self.variant.to_cairo_gradient(values, ¶ms);
+ cairo::Gradient::clone(&g)
+ }
+ };
- self.set_on_cairo_pattern(&p, bbox, opacity);
+ self.set_on_cairo_pattern(&p, &transform, opacity);
- let cr = draw_ctx.get_cairo_context();
- cr.set_source(&p);
+ let cr = draw_ctx.get_cairo_context();
+ cr.set_source(&p);
- Ok(true)
+ Ok(true)
+ } else {
+ Ok(false)
+ }
}
}
@@ -755,23 +754,10 @@ impl Gradient {
fn set_on_cairo_pattern(
&self,
pattern: &cairo::Gradient,
- bbox: &BoundingBox,
+ transform: &Transform,
opacity: UnitInterval,
) {
- let transform = if self.units == GradientUnits(CoordUnits::ObjectBoundingBox) {
- let bbox_rect = bbox.rect.unwrap();
- Transform::new_unchecked(
- bbox_rect.width(),
- 0.0,
- 0.0,
- bbox_rect.height(),
- bbox_rect.x0,
- bbox_rect.y0,
- )
- .pre_transform(&self.transform)
- } else {
- self.transform
- };
+ let transform = transform.pre_transform(&self.transform);
transform.invert().map(|m| pattern.set_matrix(m.into()));
pattern.set_extend(cairo::Extend::from(self.spread));
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]