[librsvg: 2/10] draw: move set_affine_on_cr to rust



commit 22fb00e469ac17b416c26352429ddf9d3937c63f
Author: Paolo Borelli <pborelli gnome org>
Date:   Sun May 13 12:14:38 2018 +0200

    draw: move set_affine_on_cr to rust

 librsvg/rsvg-base.c               | 15 ---------------
 librsvg/rsvg-cairo-draw.c         |  6 ++++++
 librsvg/rsvg-cairo-draw.h         |  3 +++
 librsvg/rsvg-private.h            |  3 ---
 rsvg_internals/src/draw.rs        | 27 +++++++++++++++++++++++----
 rsvg_internals/src/drawing_ctx.rs | 36 +++++++++++++++++++++++-------------
 6 files changed, 55 insertions(+), 35 deletions(-)
---
diff --git a/librsvg/rsvg-base.c b/librsvg/rsvg-base.c
index 64e2b3e6..57e78325 100644
--- a/librsvg/rsvg-base.c
+++ b/librsvg/rsvg-base.c
@@ -642,21 +642,6 @@ rsvg_drawing_ctx_draw_node_from_stack (RsvgDrawingCtx *ctx,
     ctx->drawsub_stack = stacksave;
 }
 
-void
-rsvg_drawing_ctx_set_affine_on_cr (RsvgDrawingCtx *draw_ctx, cairo_t *cr, cairo_matrix_t *affine)
-{
-    RsvgCairoRender *render = draw_ctx->render;
-    gboolean nest = cr != render->initial_cr;
-    cairo_matrix_t matrix;
-
-    cairo_matrix_init (&matrix,
-                       affine->xx, affine->yx,
-                       affine->xy, affine->yy,
-                       affine->x0 + (nest ? 0 : render->offset_x),
-                       affine->y0 + (nest ? 0 : render->offset_y));
-    cairo_set_matrix (cr, &matrix);
-}
-
 void
 rsvg_drawing_ctx_get_offset (RsvgDrawingCtx *draw_ctx, double *x, double *y)
 {
diff --git a/librsvg/rsvg-cairo-draw.c b/librsvg/rsvg-cairo-draw.c
index 974b68fd..f4e6a907 100644
--- a/librsvg/rsvg-cairo-draw.c
+++ b/librsvg/rsvg-cairo-draw.c
@@ -178,6 +178,12 @@ rsvg_cairo_set_cairo_context (RsvgDrawingCtx *ctx, cairo_t *cr)
     ctx->render->cr = cr;
 }
 
+gboolean
+rsvg_cairo_is_cairo_context_nested (RsvgDrawingCtx *ctx, cairo_t *cr)
+{
+    return cr != ctx->render->initial_cr;
+}
+
 static void
 rsvg_cairo_generate_mask (cairo_t * cr, RsvgNode *mask, RsvgDrawingCtx *ctx)
 {
diff --git a/librsvg/rsvg-cairo-draw.h b/librsvg/rsvg-cairo-draw.h
index 533067b9..18377a3b 100644
--- a/librsvg/rsvg-cairo-draw.h
+++ b/librsvg/rsvg-cairo-draw.h
@@ -40,6 +40,9 @@ cairo_t *rsvg_cairo_get_cairo_context (RsvgDrawingCtx *ctx);
 G_GNUC_INTERNAL
 void rsvg_cairo_set_cairo_context (RsvgDrawingCtx *ctx, cairo_t *cr);
 
+G_GNUC_INTERNAL
+gboolean rsvg_cairo_is_cairo_context_nested (RsvgDrawingCtx *ctx, cairo_t *cr);
+
 G_GNUC_INTERNAL
 void         rsvg_cairo_push_discrete_layer        (RsvgDrawingCtx *ctx, gboolean clipping);
 G_GNUC_INTERNAL
diff --git a/librsvg/rsvg-private.h b/librsvg/rsvg-private.h
index f0cfb2da..18f8cace 100644
--- a/librsvg/rsvg-private.h
+++ b/librsvg/rsvg-private.h
@@ -506,9 +506,6 @@ double rsvg_length_hand_normalize (const RsvgLength *length,
                                    double width_or_height,
                                    double font_size);
 
-G_GNUC_INTERNAL
-void rsvg_drawing_ctx_set_affine_on_cr (RsvgDrawingCtx *draw_ctx, cairo_t *cr, cairo_matrix_t *affine);
-
 /* Implemented in rust/src/length.rs */
 G_GNUC_INTERNAL
 RsvgLength rsvg_length_parse (const char *str, LengthDir dir);
diff --git a/rsvg_internals/src/draw.rs b/rsvg_internals/src/draw.rs
index b9dbd0a8..b556263a 100644
--- a/rsvg_internals/src/draw.rs
+++ b/rsvg_internals/src/draw.rs
@@ -1,4 +1,5 @@
 use cairo;
+use cairo::MatrixTrait;
 use cairo_sys;
 use glib::translate::*;
 use pango::{self, ContextExt, LayoutExt};
@@ -31,6 +32,24 @@ use state::{
     TextRendering,
 };
 
+fn set_affine_on_cr(draw_ctx: *mut RsvgDrawingCtx, cr: &cairo::Context, affine: &cairo::Matrix) {
+    let (x0, y0) = if drawing_ctx::is_cairo_context_nested(draw_ctx, cr) {
+        (0.0, 0.0)
+    } else {
+        drawing_ctx::get_offset(draw_ctx)
+    };
+
+    let matrix = cairo::Matrix::new(
+        affine.xx,
+        affine.yx,
+        affine.xy,
+        affine.yy,
+        affine.x0 + x0,
+        affine.y0 + y0,
+    );
+    cr.set_matrix(matrix);
+}
+
 pub fn draw_path_builder(
     draw_ctx: *mut RsvgDrawingCtx,
     state: &State,
@@ -43,7 +62,7 @@ pub fn draw_path_builder(
 
     let cr = drawing_ctx::get_cairo_context(draw_ctx);
 
-    drawing_ctx::set_affine_on_cr(draw_ctx, &cr, &state.affine);
+    set_affine_on_cr(draw_ctx, &cr, &state.affine);
 
     builder.to_cairo(&cr);
 
@@ -392,7 +411,7 @@ pub fn draw_pango_layout(
 
     setup_cr_for_stroke(&cr, draw_ctx, state);
 
-    drawing_ctx::set_affine_on_cr(draw_ctx, &cr, &state.affine);
+    set_affine_on_cr(draw_ctx, &cr, &state.affine);
 
     let rotation = unsafe { pango_sys::pango_gravity_to_rotation(gravity.to_glib()) };
 
@@ -561,7 +580,7 @@ pub fn draw_surface(
         height,
     });
 
-    drawing_ctx::set_affine_on_cr(draw_ctx, &cr, &affine);
+    set_affine_on_cr(draw_ctx, &cr, &affine);
     cr.scale(w / width, h / height);
     let x = x * width / w;
     let y = y * height / h;
@@ -584,7 +603,7 @@ pub fn add_clipping_rect(
 ) {
     let cr = drawing_ctx::get_cairo_context(draw_ctx);
 
-    drawing_ctx::set_affine_on_cr(draw_ctx, &cr, affine);
+    set_affine_on_cr(draw_ctx, &cr, affine);
 
     cr.rectangle(x, y, w, h);
     cr.clip();
diff --git a/rsvg_internals/src/drawing_ctx.rs b/rsvg_internals/src/drawing_ctx.rs
index bc12fc6b..f0478ac8 100644
--- a/rsvg_internals/src/drawing_ctx.rs
+++ b/rsvg_internals/src/drawing_ctx.rs
@@ -49,10 +49,10 @@ extern "C" {
 
     fn rsvg_drawing_ctx_release_node(draw_ctx: *const RsvgDrawingCtx, node: *mut RsvgNode);
 
-    fn rsvg_drawing_ctx_set_affine_on_cr(
+    fn rsvg_drawing_ctx_get_offset(
         draw_ctx: *const RsvgDrawingCtx,
-        cr: *mut cairo_sys::cairo_t,
-        affine: *const cairo::Matrix,
+        out_x: *mut f64,
+        out_y: *mut f64,
     );
 
     fn rsvg_drawing_ctx_insert_bbox(draw_ctx: *const RsvgDrawingCtx, bbox: *const RsvgBbox);
@@ -71,6 +71,11 @@ extern "C" {
     fn rsvg_cairo_get_cairo_context(draw_ctx: *const RsvgDrawingCtx) -> *mut cairo_sys::cairo_t;
     fn rsvg_cairo_set_cairo_context(draw_ctx: *const RsvgDrawingCtx, cr: *const cairo_sys::cairo_t);
 
+    fn rsvg_cairo_is_cairo_context_nested(
+        draw_ctx: *const RsvgDrawingCtx,
+        cr: *const cairo_sys::cairo_t,
+    ) -> glib_sys::gboolean;
+
     fn rsvg_cairo_get_pango_context(
         draw_ctx: *const RsvgDrawingCtx,
     ) -> *mut pango_sys::PangoContext;
@@ -246,20 +251,25 @@ pub fn set_cairo_context(draw_ctx: *const RsvgDrawingCtx, cr: &cairo::Context) {
     }
 }
 
-pub fn set_affine_on_cr(
-    draw_ctx: *const RsvgDrawingCtx,
-    cr: &cairo::Context,
-    affine: &cairo::Matrix,
-) {
+pub fn is_cairo_context_nested(draw_ctx: *const RsvgDrawingCtx, cr: &cairo::Context) -> bool {
     unsafe {
-        rsvg_drawing_ctx_set_affine_on_cr(
-            draw_ctx,
-            cr.to_glib_none().0,
-            affine as *const cairo::Matrix,
-        );
+        let raw_cr = cr.to_glib_none().0;
+
+        from_glib(rsvg_cairo_is_cairo_context_nested(draw_ctx, raw_cr))
     }
 }
 
+pub fn get_offset(draw_ctx: *const RsvgDrawingCtx) -> (f64, f64) {
+    let mut w: f64 = 0.0;
+    let mut h: f64 = 0.0;
+
+    unsafe {
+        rsvg_drawing_ctx_get_offset(draw_ctx, &mut w, &mut h);
+    }
+
+    (w, h)
+}
+
 pub fn get_pango_context(draw_ctx: *const RsvgDrawingCtx) -> pango::Context {
     unsafe { from_glib_full(rsvg_cairo_get_pango_context(draw_ctx)) }
 }


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