[librsvg: 2/10] draw: move set_affine_on_cr to rust
- From: Federico Mena Quintero <federico src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [librsvg: 2/10] draw: move set_affine_on_cr to rust
- Date: Mon, 14 May 2018 01:38:09 +0000 (UTC)
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]