[librsvg: 10/90] DrawingCtx: Centralize the place where a viewport-sized surface gets created



commit 5951d00c98f04dad50c71f0f07fc7e8919e8a552
Author: Federico Mena Quintero <federico gnome org>
Date:   Fri Mar 8 15:59:42 2019 -0600

    DrawingCtx: Centralize the place where a viewport-sized surface gets created
    
    We'll fix the truncation of the width/height later; at least this
    function gives us a single place to fix that.

 rsvg_internals/src/drawing_ctx.rs | 25 +++++++++++--------------
 rsvg_internals/src/mask.rs        |  5 +----
 2 files changed, 12 insertions(+), 18 deletions(-)
---
diff --git a/rsvg_internals/src/drawing_ctx.rs b/rsvg_internals/src/drawing_ctx.rs
index 20d3802c..e4da7540 100644
--- a/rsvg_internals/src/drawing_ctx.rs
+++ b/rsvg_internals/src/drawing_ctx.rs
@@ -204,12 +204,16 @@ impl DrawingCtx {
         self.cr = cr.clone();
     }
 
-    pub fn get_width(&self) -> f64 {
-        self.rect.width
-    }
+    pub fn create_surface_for_toplevel_viewport(
+        &self,
+    ) -> Result<cairo::ImageSurface, RenderingError> {
+        // This truncation may mean that we clip off the rightmost/bottommost row of pixels.
+        // See https://gitlab.gnome.org/GNOME/librsvg/issues/295
 
-    pub fn get_height(&self) -> f64 {
-        self.rect.height
+        let width = self.rect.width as i32;
+        let height = self.rect.height as i32;
+
+        Ok(cairo::ImageSurface::create(cairo::Format::ARgb32, width, height)?)
     }
 
     /// Gets the viewport that was last pushed with `push_view_box()`.
@@ -424,12 +428,7 @@ impl DrawingCtx {
                 && enable_background == EnableBackground::Accumulate);
 
             if needs_temporary_surface {
-                let surface = cairo::ImageSurface::create(
-                    cairo::Format::ARgb32,
-                    self.rect.width as i32,
-                    self.rect.height as i32,
-                )
-                .map_err(|e| {
+                let surface = self.create_surface_for_toplevel_viewport().map_err(|e| {
                     original_cr.restore();
                     e
                 })?;
@@ -713,9 +712,7 @@ impl DrawingCtx {
     }
 
     pub fn get_snapshot(&self, surface: &cairo::ImageSurface) {
-        /*
-        let (x, y) = (self.rect.x, self.rect.y);
-         */
+        // let (x, y) = (self.rect.x, self.rect.y);
         let (x, y) = (0.0, 0.0);
 
         // TODO: as far as I can tell this should not render elements past the last (topmost) one
diff --git a/rsvg_internals/src/mask.rs b/rsvg_internals/src/mask.rs
index 9048b786..08ac4819 100644
--- a/rsvg_internals/src/mask.rs
+++ b/rsvg_internals/src/mask.rs
@@ -56,10 +56,7 @@ impl NodeMask {
         let cascaded = node.get_cascaded_values();
         let values = cascaded.get();
 
-        let width = draw_ctx.get_width() as i32;
-        let height = draw_ctx.get_height() as i32;
-
-        let surface = cairo::ImageSurface::create(cairo::Format::ARgb32, width, height)?;
+        let surface = draw_ctx.create_surface_for_toplevel_viewport()?;
 
         let mask_units = CoordUnits::from(self.units.get());
         let content_units = CoordUnits::from(self.content_units.get());


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