[librsvg: 3/5] handle: move dpi to rust
- From: Federico Mena Quintero <federico src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [librsvg: 3/5] handle: move dpi to rust
- Date: Mon, 10 Dec 2018 16:58:00 +0000 (UTC)
commit 4db16b1acd11571db5053a5b4a8f50a0f3573f55
Author: Paolo Borelli <pborelli gnome org>
Date: Thu Dec 6 22:53:34 2018 +0100
handle: move dpi to rust
Note that the default dpi is still handled in the C part, since
it uses global variables
Makefile.am | 1 +
librsvg/rsvg-handle.c | 56 +++++++++++---------------------------------
librsvg/rsvg-private.h | 3 ---
rsvg_internals/src/dpi.rs | 38 ++++++++++++++++++++++++++++++
rsvg_internals/src/handle.rs | 31 ++++++++++++++++++++++++
rsvg_internals/src/lib.rs | 5 ++++
6 files changed, 89 insertions(+), 45 deletions(-)
---
diff --git a/Makefile.am b/Makefile.am
index 7978dddd..f1ddc052 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -53,6 +53,7 @@ RUST_SRC = \
rsvg_internals/src/croco.rs \
rsvg_internals/src/css.rs \
rsvg_internals/src/defs.rs \
+ rsvg_internals/src/dpi.rs \
rsvg_internals/src/drawing_ctx.rs \
rsvg_internals/src/filters/bounds.rs \
rsvg_internals/src/filters/blend.rs \
diff --git a/librsvg/rsvg-handle.c b/librsvg/rsvg-handle.c
index 3383a8d2..4b582a60 100644
--- a/librsvg/rsvg-handle.c
+++ b/librsvg/rsvg-handle.c
@@ -131,6 +131,10 @@
extern RsvgHandleRust *rsvg_handle_rust_new (void);
extern void rsvg_handle_rust_free (RsvgHandleRust *raw_handle);
extern void rsvg_handle_rust_cascade (RsvgHandleRust *raw_handle);
+extern double rsvg_handle_rust_get_dpi_x (RsvgHandleRust *raw_handle);
+extern double rsvg_handle_rust_get_dpi_y (RsvgHandleRust *raw_handle);
+extern void rsvg_handle_rust_set_dpi_x (RsvgHandleRust *raw_handle, double dpi_x);
+extern void rsvg_handle_rust_set_dpi_y (RsvgHandleRust *raw_handle, double dpi_y);
extern void rsvg_handle_rust_set_base_url (RsvgHandleRust *raw_handle, const char *uri);
extern RsvgNode *rsvg_handle_rust_get_root (RsvgHandleRust *raw_handle);
extern GFile *rsvg_handle_rust_get_base_gfile (RsvgHandleRust *raw_handle);
@@ -189,8 +193,6 @@ rsvg_handle_init (RsvgHandle * self)
self->priv->flags = RSVG_HANDLE_FLAGS_NONE;
self->priv->hstate = RSVG_HANDLE_STATE_START;
- self->priv->dpi_x = 0.;
- self->priv->dpi_y = 0.;
self->priv->in_loop = FALSE;
@@ -228,38 +230,6 @@ rsvg_handle_dispose (GObject *instance)
G_OBJECT_CLASS (rsvg_handle_parent_class)->dispose (instance);
}
-static double
-rsvg_handle_get_dpi_x (RsvgHandle *handle)
-{
- if (handle->priv->dpi_x <= 0.) {
- return rsvg_get_default_dpi_x ();
- }
-
- return handle->priv->dpi_x;
-}
-
-static double
-rsvg_handle_get_dpi_y (RsvgHandle *handle)
-{
- if (handle->priv->dpi_y <= 0.) {
- return rsvg_get_default_dpi_y ();
- }
-
- return handle->priv->dpi_y;
-}
-
-static void
-rsvg_handle_set_dpi_x (RsvgHandle *handle, double dpi_x)
-{
- handle->priv->dpi_x = dpi_x;
-}
-
-static void
-rsvg_handle_set_dpi_y (RsvgHandle *handle, double dpi_y)
-{
- handle->priv->dpi_y = dpi_y;
-}
-
static void
rsvg_handle_set_property (GObject * instance, guint prop_id, GValue const *value, GParamSpec * pspec)
{
@@ -270,10 +240,10 @@ rsvg_handle_set_property (GObject * instance, guint prop_id, GValue const *value
self->priv->flags = g_value_get_flags (value);
break;
case PROP_DPI_X:
- rsvg_handle_set_dpi_x (self, g_value_get_double (value));
+ rsvg_handle_rust_set_dpi_x (self->priv->rust_handle, g_value_get_double (value));
break;
case PROP_DPI_Y:
- rsvg_handle_set_dpi_y (self, g_value_get_double (value));
+ rsvg_handle_rust_set_dpi_y (self->priv->rust_handle, g_value_get_double (value));
break;
case PROP_BASE_URI:
rsvg_handle_set_base_uri (self, g_value_get_string (value));
@@ -294,10 +264,10 @@ rsvg_handle_get_property (GObject * instance, guint prop_id, GValue * value, GPa
g_value_set_flags (value, self->priv->flags);
break;
case PROP_DPI_X:
- g_value_set_double (value, rsvg_handle_get_dpi_x (self));
+ g_value_set_double (value, rsvg_handle_rust_get_dpi_x (self->priv->rust_handle));
break;
case PROP_DPI_Y:
- g_value_set_double (value, rsvg_handle_get_dpi_y (self));
+ g_value_set_double (value, rsvg_handle_rust_get_dpi_y (self->priv->rust_handle));
break;
case PROP_BASE_URI:
g_value_set_string (value, rsvg_handle_get_base_uri (self));
@@ -1061,7 +1031,8 @@ rsvg_handle_create_drawing_ctx(RsvgHandle *handle,
cr,
dimensions->width, dimensions->height,
dimensions->em, dimensions->ex,
- rsvg_handle_get_dpi_x (handle), rsvg_handle_get_dpi_y (handle),
+ rsvg_handle_rust_get_dpi_x (handle->priv->rust_handle),
+ rsvg_handle_rust_get_dpi_y (handle->priv->rust_handle),
handle->priv->is_testing);
}
@@ -1304,7 +1275,8 @@ rsvg_handle_get_geometry_sub (RsvgHandle * handle, RsvgRectangle * ink_rect, Rsv
}
has_size = rsvg_node_svg_get_size (root,
- rsvg_handle_get_dpi_x (handle), rsvg_handle_get_dpi_y (handle),
+ rsvg_handle_rust_get_dpi_x (handle->priv->rust_handle),
+ rsvg_handle_rust_get_dpi_y (handle->priv->rust_handle),
&root_width, &root_height);
if (id || !has_size) {
@@ -1523,8 +1495,8 @@ rsvg_handle_set_dpi_x_y (RsvgHandle * handle, double dpi_x, double dpi_y)
{
g_return_if_fail (RSVG_IS_HANDLE (handle));
- rsvg_handle_set_dpi_x (handle, dpi_x);
- rsvg_handle_set_dpi_y (handle, dpi_y);
+ rsvg_handle_rust_set_dpi_x (handle->priv->rust_handle, dpi_x);
+ rsvg_handle_rust_set_dpi_y (handle->priv->rust_handle, dpi_y);
}
/**
diff --git a/librsvg/rsvg-private.h b/librsvg/rsvg-private.h
index 5aaa4910..c205f551 100644
--- a/librsvg/rsvg-private.h
+++ b/librsvg/rsvg-private.h
@@ -99,9 +99,6 @@ struct RsvgHandlePrivate {
gpointer user_data;
GDestroyNotify user_data_destroy;
- double dpi_x;
- double dpi_y;
-
gchar *base_uri; // Keep this here; since rsvg_handle_get_base_uri() returns a const char *
gboolean in_loop; /* see get_dimension() */
diff --git a/rsvg_internals/src/dpi.rs b/rsvg_internals/src/dpi.rs
new file mode 100644
index 00000000..6d4693ba
--- /dev/null
+++ b/rsvg_internals/src/dpi.rs
@@ -0,0 +1,38 @@
+use std::cell::Cell;
+
+extern "C" {
+ fn rsvg_get_default_dpi_y() -> f64;
+ fn rsvg_get_default_dpi_x() -> f64;
+}
+
+#[derive(Debug, Clone, Default)]
+pub struct Dpi {
+ x: Cell<f64>,
+ y: Cell<f64>,
+}
+
+impl Dpi {
+ pub fn x(&self) -> f64 {
+ if self.x.get() <= 0.0 {
+ unsafe { rsvg_get_default_dpi_x() }
+ } else {
+ self.x.get()
+ }
+ }
+
+ pub fn set_x(&self, dpi_x: f64) {
+ self.x.set(dpi_x)
+ }
+
+ pub fn y(&self) -> f64 {
+ if self.y.get() <= 0.0 {
+ unsafe { rsvg_get_default_dpi_y() }
+ } else {
+ self.y.get()
+ }
+ }
+
+ pub fn set_y(&self, dpi_y: f64) {
+ self.y.set(dpi_y)
+ }
+}
diff --git a/rsvg_internals/src/handle.rs b/rsvg_internals/src/handle.rs
index 5de142bf..9afcc0fd 100644
--- a/rsvg_internals/src/handle.rs
+++ b/rsvg_internals/src/handle.rs
@@ -16,6 +16,7 @@ use url::Url;
use allowed_url::AllowedUrl;
use css::{self, CssStyles};
use defs::{Fragment, Href};
+use dpi::Dpi;
use error::{set_gerror, LoadingError};
use io;
use node::{box_node, Node, RsvgNode};
@@ -31,6 +32,7 @@ pub struct RsvgHandle {
}
pub struct Handle {
+ dpi: Dpi,
base_url: RefCell<Option<Url>>,
svg: RefCell<Option<Svg>>,
}
@@ -38,6 +40,7 @@ pub struct Handle {
impl Handle {
fn new() -> Handle {
Handle {
+ dpi: Dpi::default(),
base_url: RefCell::new(None),
svg: RefCell::new(None),
}
@@ -305,6 +308,34 @@ pub unsafe extern "C" fn rsvg_handle_rust_get_base_gfile(
}
}
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_handle_rust_set_dpi_x(raw_handle: *const Handle, dpi_x: f64) {
+ let handle = &*(raw_handle as *const Handle);
+
+ handle.dpi.set_x(dpi_x);
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_handle_rust_get_dpi_x(raw_handle: *const Handle) -> f64 {
+ let handle = &*(raw_handle as *const Handle);
+
+ handle.dpi.x()
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_handle_rust_set_dpi_y(raw_handle: *const Handle, dpi_y: f64) {
+ let handle = &*(raw_handle as *const Handle);
+
+ handle.dpi.set_y(dpi_y);
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn rsvg_handle_rust_get_dpi_y(raw_handle: *const Handle) -> f64 {
+ let handle = &*(raw_handle as *const Handle);
+
+ handle.dpi.y()
+}
+
#[no_mangle]
pub unsafe extern "C" fn rsvg_handle_defs_lookup(
handle: *const RsvgHandle,
diff --git a/rsvg_internals/src/lib.rs b/rsvg_internals/src/lib.rs
index bc0164bc..0ba60145 100644
--- a/rsvg_internals/src/lib.rs
+++ b/rsvg_internals/src/lib.rs
@@ -50,10 +50,14 @@ pub use handle::{
rsvg_handle_rust_cascade,
rsvg_handle_rust_free,
rsvg_handle_rust_get_base_gfile,
+ rsvg_handle_rust_get_dpi_x,
+ rsvg_handle_rust_get_dpi_y,
rsvg_handle_rust_get_root,
rsvg_handle_rust_new,
rsvg_handle_rust_node_is_root,
rsvg_handle_rust_set_base_url,
+ rsvg_handle_rust_set_dpi_x,
+ rsvg_handle_rust_set_dpi_y,
rsvg_handle_rust_steal_result,
};
@@ -97,6 +101,7 @@ mod create_node;
mod croco;
mod css;
mod defs;
+mod dpi;
mod drawing_ctx;
mod error;
pub mod filters;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]