summaryrefslogtreecommitdiff
path: root/capi
diff options
context:
space:
mode:
authorReizner Evgeniy <razrfalcon@gmail.com>2018-03-16 15:10:56 +0200
committerReizner Evgeniy <razrfalcon@gmail.com>2018-03-16 15:10:56 +0200
commitd3b63c807705503130d76c39f62a19cf2c410fef (patch)
treecc03cc5dd11d45f37bfb9b98db50296692e6d3f0 /capi
parentcbcb49dc6be03728e279e2cadbc7ce5b2aa44e31 (diff)
Require image size instead of image rect.
Diffstat (limited to 'capi')
-rw-r--r--capi/include/resvg.h13
-rw-r--r--capi/src/lib.rs215
2 files changed, 114 insertions, 114 deletions
diff --git a/capi/include/resvg.h b/capi/include/resvg.h
index e01c30b..b301db9 100644
--- a/capi/include/resvg.h
+++ b/capi/include/resvg.h
@@ -49,6 +49,11 @@ typedef struct resvg_rect {
double height;
} resvg_rect;
+typedef struct resvg_size {
+ unsigned int width;
+ unsigned int height;
+} resvg_size;
+
typedef struct resvg_transform {
double a;
double b;
@@ -128,12 +133,12 @@ bool resvg_cairo_render_to_image(const resvg_render_tree *rtree,
void resvg_cairo_render_to_canvas(const resvg_render_tree *rtree,
const resvg_options *opt,
- resvg_rect view,
+ resvg_size size,
cairo_t *cr);
void resvg_cairo_render_to_canvas_by_id(const resvg_render_tree *rtree,
const resvg_options *opt,
- resvg_rect view,
+ resvg_size size,
const char *id,
void *painter);
#endif
@@ -150,12 +155,12 @@ bool resvg_qt_render_to_image(const resvg_render_tree *rtree,
void resvg_qt_render_to_canvas(const resvg_render_tree *rtree,
const resvg_options *opt,
- resvg_rect view,
+ resvg_size size,
void *painter);
void resvg_qt_render_to_canvas_by_id(const resvg_render_tree *rtree,
const resvg_options *opt,
- resvg_rect view,
+ resvg_size size,
const char *id,
void *painter);
#endif
diff --git a/capi/src/lib.rs b/capi/src/lib.rs
index ec50e6c..d4c154b 100644
--- a/capi/src/lib.rs
+++ b/capi/src/lib.rs
@@ -74,6 +74,12 @@ pub struct resvg_rect {
}
#[repr(C)]
+pub struct resvg_size {
+ pub width: u32,
+ pub height: u32,
+}
+
+#[repr(C)]
pub struct resvg_transform {
pub a: f64,
pub b: f64,
@@ -138,54 +144,6 @@ fn log_format(out: fern::FormatCallback, message: &fmt::Arguments, record: &log:
))
}
-fn to_native_opt(opt: &resvg_options) -> resvg::Options {
- let mut path: Option<path::PathBuf> = None;
-
- if !opt.path.is_null() {
- if let Some(p) = cstr_to_str(opt.path) {
- if !p.is_empty() {
- path = Some(p.into());
- }
- }
- };
-
- let fit_to = match opt.fit_to.kind {
- resvg_fit_to_type::RESVG_FIT_TO_ORIGINAL => {
- resvg::FitTo::Original
- }
- resvg_fit_to_type::RESVG_FIT_TO_WIDTH => {
- assert!(opt.fit_to.value > 0.0);
- resvg::FitTo::Width(opt.fit_to.value as u32)
- }
- resvg_fit_to_type::RESVG_FIT_TO_HEIGHT => {
- assert!(opt.fit_to.value > 0.0);
- resvg::FitTo::Height(opt.fit_to.value as u32)
- }
- resvg_fit_to_type::RESVG_FIT_TO_ZOOM => {
- assert!(opt.fit_to.value > 0.0);
- resvg::FitTo::Zoom(opt.fit_to.value)
- }
- };
-
- let background = if opt.draw_background {
- Some(resvg::tree::Color::new(
- opt.background.r,
- opt.background.g,
- opt.background.b,
- ))
- } else {
- None
- };
-
- resvg::Options {
- path,
- dpi: opt.dpi,
- fit_to,
- background,
- keep_named_groups: opt.keep_named_groups,
- }
-}
-
#[no_mangle]
pub extern fn resvg_parse_rtree_from_file(
file_path: *const c_char,
@@ -246,15 +204,6 @@ pub extern fn resvg_rtree_destroy(rtree: *mut resvg_render_tree) {
};
}
-fn cstr_to_str(text: *const c_char) -> Option<&'static str> {
- let text = unsafe {
- assert!(!text.is_null());
- CStr::from_ptr(text)
- };
-
- text.to_str().ok()
-}
-
#[cfg(feature = "qt-backend")]
#[no_mangle]
pub extern fn resvg_qt_render_to_image(
@@ -312,7 +261,7 @@ fn render_to_image(
pub extern fn resvg_qt_render_to_canvas(
rtree: *const resvg_render_tree,
opt: *const resvg_options,
- view: resvg_rect,
+ size: resvg_size,
painter: *mut qt::qtc_qpainter,
) {
let rtree = unsafe {
@@ -321,63 +270,68 @@ pub extern fn resvg_qt_render_to_canvas(
};
let painter = unsafe { qt::Painter::from_raw(painter) };
- let rect = resvg::Rect::from_xywh(view.x, view.y, view.width, view.height);
-
+ let size = resvg::ScreenSize::new(size.width, size.height);
let opt = to_native_opt(unsafe { &*opt });
- resvg::render_qt::render_to_canvas(&rtree.0, &opt, rect, &painter);
+ resvg::render_qt::render_to_canvas(&rtree.0, &opt, size, &painter);
}
-#[cfg(feature = "qt-backend")]
+#[cfg(feature = "cairo-backend")]
#[no_mangle]
-pub extern fn resvg_qt_render_to_canvas_by_id(
+pub extern fn resvg_cairo_render_to_canvas(
rtree: *const resvg_render_tree,
opt: *const resvg_options,
- view: resvg_rect,
- id: *const c_char,
- painter: *mut qt::qtc_qpainter,
+ size: resvg_size,
+ cr: *mut cairo_sys::cairo_t,
) {
let rtree = unsafe {
assert!(!rtree.is_null());
&*rtree
};
- let painter = unsafe { qt::Painter::from_raw(painter) };
- let rect = resvg::Rect::from_xywh(view.x, view.y, view.width, view.height);
+ use glib::translate::FromGlibPtrNone;
- let opt = to_native_opt(unsafe { &*opt });
+ let cr = unsafe { cairo::Context::from_glib_none(cr) };
+ let size = resvg::ScreenSize::new(size.width, size.height);
- let id = match cstr_to_str(id) {
- Some(v) => v,
- None => return,
- };
+ let opt = to_native_opt(unsafe { &*opt });
- if let Some(node) = node_by_id(&rtree.0, id) {
- resvg::render_qt::render_node_to_canvas(node, &opt, rect.to_screen_size(), &painter);
- }
+ resvg::render_cairo::render_to_canvas(&rtree.0, &opt, size, &cr);
}
-#[cfg(feature = "cairo-backend")]
+#[cfg(feature = "qt-backend")]
#[no_mangle]
-pub extern fn resvg_cairo_render_to_canvas(
+pub extern fn resvg_qt_render_to_canvas_by_id(
rtree: *const resvg_render_tree,
opt: *const resvg_options,
- view: resvg_rect,
- cr: *mut cairo_sys::cairo_t,
+ size: resvg_size,
+ id: *const c_char,
+ painter: *mut qt::qtc_qpainter,
) {
let rtree = unsafe {
assert!(!rtree.is_null());
&*rtree
};
- use glib::translate::FromGlibPtrNone;
+ let painter = unsafe { qt::Painter::from_raw(painter) };
+ let size = resvg::ScreenSize::new(size.width, size.height);
+ let opt = to_native_opt(unsafe { &*opt });
- let cr = unsafe { cairo::Context::from_glib_none(cr) };
- let rect = resvg::Rect::from_xywh(view.x, view.y, view.width, view.height);
+ let id = match cstr_to_str(id) {
+ Some(v) => v,
+ None => return,
+ };
- let opt = to_native_opt(unsafe { &*opt });
+ if let Some(node) = rtree.0.node_by_svg_id(id) {
+ if let Some(bbox) = resvg::render_qt::calc_node_bbox(node, &opt) {
+ let vbox = tree::ViewBox {
+ rect: bbox,
+ .. tree::ViewBox::default()
+ };
- resvg::render_cairo::render_to_canvas(&rtree.0, &opt, rect, &cr);
+ resvg::render_qt::render_node_to_canvas(node, &opt, vbox, size, &painter);
+ }
+ }
}
#[cfg(feature = "cairo-backend")]
@@ -385,7 +339,7 @@ pub extern fn resvg_cairo_render_to_canvas(
pub extern fn resvg_cairo_render_to_canvas_by_id(
rtree: *const resvg_render_tree,
opt: *const resvg_options,
- view: resvg_rect,
+ size: resvg_size,
id: *const c_char,
cr: *mut cairo_sys::cairo_t,
) {
@@ -402,12 +356,19 @@ pub extern fn resvg_cairo_render_to_canvas_by_id(
use glib::translate::FromGlibPtrNone;
let cr = unsafe { cairo::Context::from_glib_none(cr) };
- let rect = resvg::Rect::from_xywh(view.x, view.y, view.width, view.height);
+ let size = resvg::ScreenSize::new(size.width, size.height);
let opt = to_native_opt(unsafe { &*opt });
- if let Some(node) = node_by_id(&rtree.0, id) {
- resvg::render_cairo::render_node_to_canvas(node, &opt, rect.to_screen_size(), &cr);
+ if let Some(node) = rtree.0.node_by_svg_id(id) {
+ if let Some(bbox) = resvg::render_cairo::calc_node_bbox(node, &opt) {
+ let vbox = tree::ViewBox {
+ rect: bbox,
+ .. tree::ViewBox::default()
+ };
+
+ resvg::render_cairo::render_node_to_canvas(node, &opt, vbox, size, &cr);
+ }
}
}
@@ -482,7 +443,7 @@ fn get_node_bbox(
let opt = to_native_opt(unsafe { &*opt });
- match node_by_id(&rtree.0, id) {
+ match rtree.0.node_by_svg_id(id) {
Some(node) => {
if let Some(r) = backend.calc_node_bbox(node, &opt) {
unsafe {
@@ -517,16 +478,12 @@ pub extern fn resvg_node_exists(
}
};
- if id.is_empty() {
- return false;
- }
-
let rtree = unsafe {
assert!(!rtree.is_null());
&*rtree
};
- node_by_id(&rtree.0, id).is_some()
+ rtree.0.node_by_svg_id(id).is_some()
}
#[no_mangle]
@@ -543,16 +500,12 @@ pub extern fn resvg_get_node_transform(
}
};
- if id.is_empty() {
- return false;
- }
-
let rtree = unsafe {
assert!(!rtree.is_null());
&*rtree
};
- if let Some(node) = node_by_id(&rtree.0, id) {
+ if let Some(node) = rtree.0.node_by_svg_id(id) {
let abs_ts = resvg::utils::abs_transform(node);
unsafe {
@@ -570,17 +523,59 @@ pub extern fn resvg_get_node_transform(
false
}
-fn node_by_id<'a>(
- rtree: &'a resvg::tree::RenderTree,
- id: &str
-) -> Option<resvg::tree::NodeRef<'a>> {
- for node in rtree.root().descendants() {
- if !rtree.is_in_defs(node) {
- if node.svg_id() == id {
- return Some(node);
+fn cstr_to_str(text: *const c_char) -> Option<&'static str> {
+ let text = unsafe {
+ assert!(!text.is_null());
+ CStr::from_ptr(text)
+ };
+
+ text.to_str().ok()
+}
+
+fn to_native_opt(opt: &resvg_options) -> resvg::Options {
+ let mut path: Option<path::PathBuf> = None;
+
+ if !opt.path.is_null() {
+ if let Some(p) = cstr_to_str(opt.path) {
+ if !p.is_empty() {
+ path = Some(p.into());
}
}
- }
+ };
- None
+ let fit_to = match opt.fit_to.kind {
+ resvg_fit_to_type::RESVG_FIT_TO_ORIGINAL => {
+ resvg::FitTo::Original
+ }
+ resvg_fit_to_type::RESVG_FIT_TO_WIDTH => {
+ assert!(opt.fit_to.value > 0.0);
+ resvg::FitTo::Width(opt.fit_to.value as u32)
+ }
+ resvg_fit_to_type::RESVG_FIT_TO_HEIGHT => {
+ assert!(opt.fit_to.value > 0.0);
+ resvg::FitTo::Height(opt.fit_to.value as u32)
+ }
+ resvg_fit_to_type::RESVG_FIT_TO_ZOOM => {
+ assert!(opt.fit_to.value > 0.0);
+ resvg::FitTo::Zoom(opt.fit_to.value)
+ }
+ };
+
+ let background = if opt.draw_background {
+ Some(resvg::tree::Color::new(
+ opt.background.r,
+ opt.background.g,
+ opt.background.b,
+ ))
+ } else {
+ None
+ };
+
+ resvg::Options {
+ path,
+ dpi: opt.dpi,
+ fit_to,
+ background,
+ keep_named_groups: opt.keep_named_groups,
+ }
}