From 9f33ad5ca3011360fbb88a98be94af3851cca0dd Mon Sep 17 00:00:00 2001 From: Paolo Borelli Date: Sat, 23 Feb 2019 21:07:59 +0100 Subject: [PATCH 1/4] crate: rename LoadOptions to Loader --- librsvg_crate/examples/proportional.rs | 3 +- librsvg_crate/examples/render.rs | 3 +- librsvg_crate/src/lib.rs | 42 +++++++++++++------------- 3 files changed, 23 insertions(+), 25 deletions(-) diff --git a/librsvg_crate/examples/proportional.rs b/librsvg_crate/examples/proportional.rs index 50284b080..ea19cf0fd 100644 --- a/librsvg_crate/examples/proportional.rs +++ b/librsvg_crate/examples/proportional.rs @@ -28,8 +28,7 @@ fn main() { assert!(width > 0 && height > 0); - let handle = librsvg::LoadOptions::new().read_path(input).unwrap(); - + let handle = librsvg::Loader::new().read_path(input).unwrap(); let renderer = handle.get_cairo_renderer(); let surface = cairo::ImageSurface::create(cairo::Format::ARgb32, width, height).unwrap(); diff --git a/librsvg_crate/examples/render.rs b/librsvg_crate/examples/render.rs index cefb2f3a7..e0dde8b84 100644 --- a/librsvg_crate/examples/render.rs +++ b/librsvg_crate/examples/render.rs @@ -18,8 +18,7 @@ fn main() { let input = args.next().unwrap(); let output = args.next().unwrap(); - let handle = librsvg::LoadOptions::new().read_path(input).unwrap(); - + let handle = librsvg::Loader::new().read_path(input).unwrap(); let renderer = handle.get_cairo_renderer(); let (w, h) = renderer.get_dimensions().unwrap(); diff --git a/librsvg_crate/src/lib.rs b/librsvg_crate/src/lib.rs index 9f5bb09a3..af7b6c6be 100644 --- a/librsvg_crate/src/lib.rs +++ b/librsvg_crate/src/lib.rs @@ -12,11 +12,11 @@ //! //! # Basic usage //! -//! * Create a [`LoadOptions`] struct. -//! * Get an [`SvgHandle`] from the [`LoadOptions`]. +//! * Create a [`Loader`] struct. +//! * Get an [`SvgHandle`] from the [`Loader`]. //! * Get a [`CairoRenderer`] from the [`SvgHandle`] and render to a Cairo context. //! -//! [`LoadOptions`]: struct.LoadOptions.html +//! [`Loader`]: struct.Loader.html //! [`SvgHandle`]: struct.SvgHandle.html //! [`CairoRenderer`]: struct.CairoRenderer.html //! @@ -56,7 +56,7 @@ //! //! 2. All other URL schemes in references require a base URL. For //! example, this means that if you load an SVG with -//! [`LoadOptions.read`](struct.LoadOptions.html#method.read) without +//! [`Loader.read`](struct.Loader.html#method.read) without //! providing a `base_url`, then any referenced files will not be //! allowed (e.g. raster images to be loaded from other files will not //! work). @@ -111,23 +111,23 @@ pub use rsvg_internals::{ RenderingError, }; -/// Full configuration for loading an [`SvgHandle`][SvgHandle]. +/// Struct for loading an [`SvgHandle`][SvgHandle]. /// /// This is the starting point for using librsvg. This struct /// implements a builder pattern for configuring an /// [`SvgHandle`][SvgHandle]'s options, and then loading the SVG data. -/// You can call the methods of `LoadOptions` in sequence to configure +/// You can call the methods of `Loader` in sequence to configure /// how SVG data should be loaded, and finally use one of the loading /// functions to load an [`SvgHandle`][SvgHandle]. /// /// [SvgHandle]: struct.SvgHandle.html -pub struct LoadOptions { +pub struct Loader { unlimited_size: bool, keep_image_data: bool, } -impl LoadOptions { - /// Creates a `LoadOptions` with the default flags. +impl Loader { + /// Creates a `Loader` with the default flags. /// /// * [`unlimited_size`](#method.unlimited_size) defaults to `false`, as malicious /// SVG files could cause the XML parser to consume very large amounts of memory. @@ -142,14 +142,14 @@ impl LoadOptions { /// ```ignore /// extern crate librsvg; /// - /// use librsvg::LoadOptions; + /// use librsvg::Loader; /// - /// let svg_handle = LoadOptions::new() + /// let svg_handle = Loader::new() /// .read_path("example.svg") /// .unwrap(); /// ``` pub fn new() -> Self { - LoadOptions { + Loader { unlimited_size: false, keep_image_data: false, } @@ -168,9 +168,9 @@ impl LoadOptions { /// ```ignore /// extern crate librsvg; /// - /// use librsvg::LoadOptions; + /// use librsvg::Loader; /// - /// let svg_handle = LoadOptions::new() + /// let svg_handle = Loader::new() /// .unlimited_size(true) /// .read_path("trusted-huge-file.svg") /// .unwrap(); @@ -197,9 +197,9 @@ impl LoadOptions { /// extern crate cairo; /// extern crate librsvg; /// - /// use librsvg::LoadOptions; + /// use librsvg::Loader; /// - /// let svg_handle = LoadOptions::new() + /// let svg_handle = Loader::new() /// .keep_image_data(true) /// .read_path("svg-with-embedded-images.svg") /// .unwrap(); @@ -228,9 +228,9 @@ impl LoadOptions { /// ```ignore /// extern crate librsvg; /// - /// use librsvg::LoadOptions; + /// use librsvg::Loader; /// - /// let svg_handle = LoadOptions::new() + /// let svg_handle = Loader::new() /// .read_path("hello.svg") /// .unwrap(); /// ``` @@ -263,9 +263,9 @@ impl LoadOptions { /// extern crate gio; /// extern crate librsvg; /// - /// use librsvg::LoadOptions; + /// use librsvg::Loader; /// - /// let svg_handle = LoadOptions::new() + /// let svg_handle = Loader::new() /// .read_file(&gio::File::new_for_path("hello.svg"), None) /// .unwrap(); /// ``` @@ -311,7 +311,7 @@ impl LoadOptions { /// Handle used to hold SVG data in memory. /// /// You can create this from one of the `read` methods in -/// [`LoadOptions`](#struct.LoadOptions.html). +/// [`Loader`](#struct.Loader.html). pub struct SvgHandle(Handle); /// Can render an `SvgHandle` to a Cairo context. -- GitLab From dfaa80f3bf909b192c8ff53330e1a72d670b3987 Mon Sep 17 00:00:00 2001 From: Paolo Borelli Date: Sat, 23 Feb 2019 21:17:50 +0100 Subject: [PATCH 2/4] crate: add CairoRenderer::new Instead of getting the renderer from the handle, add a constructor that takes the handle as a parameter. This is more flexible because we can add more constructors and even more renderers without affecting the SvgHandle struct. --- librsvg_crate/examples/proportional.rs | 2 +- librsvg_crate/examples/render.rs | 2 +- librsvg_crate/src/lib.rs | 39 ++++++++++----------- librsvg_crate/tests/intrinsic-dimensions.rs | 17 ++++----- 4 files changed, 29 insertions(+), 31 deletions(-) diff --git a/librsvg_crate/examples/proportional.rs b/librsvg_crate/examples/proportional.rs index ea19cf0fd..74387ee88 100644 --- a/librsvg_crate/examples/proportional.rs +++ b/librsvg_crate/examples/proportional.rs @@ -29,7 +29,7 @@ fn main() { assert!(width > 0 && height > 0); let handle = librsvg::Loader::new().read_path(input).unwrap(); - let renderer = handle.get_cairo_renderer(); + let renderer = librsvg::CairoRenderer::new(&handle); let surface = cairo::ImageSurface::create(cairo::Format::ARgb32, width, height).unwrap(); let cr = cairo::Context::new(&surface); diff --git a/librsvg_crate/examples/render.rs b/librsvg_crate/examples/render.rs index e0dde8b84..ee88cb0d4 100644 --- a/librsvg_crate/examples/render.rs +++ b/librsvg_crate/examples/render.rs @@ -19,7 +19,7 @@ fn main() { let output = args.next().unwrap(); let handle = librsvg::Loader::new().read_path(input).unwrap(); - let renderer = handle.get_cairo_renderer(); + let renderer = librsvg::CairoRenderer::new(&handle); let (w, h) = renderer.get_dimensions().unwrap(); diff --git a/librsvg_crate/src/lib.rs b/librsvg_crate/src/lib.rs index af7b6c6be..e4f6e605b 100644 --- a/librsvg_crate/src/lib.rs +++ b/librsvg_crate/src/lib.rs @@ -14,7 +14,7 @@ //! //! * Create a [`Loader`] struct. //! * Get an [`SvgHandle`] from the [`Loader`]. -//! * Get a [`CairoRenderer`] from the [`SvgHandle`] and render to a Cairo context. +//! * Create a [`CairoRenderer`] for the [`SvgHandle`] and render to a Cairo context. //! //! [`Loader`]: struct.Loader.html //! [`SvgHandle`]: struct.SvgHandle.html @@ -207,7 +207,7 @@ impl Loader { /// let surface = cairo::pdf::File::new(..., "hello.pdf"); /// let cr = cairo::Context::new(&surface); /// - /// let renderer = svg_handle.get_cairo_renderer(); + /// let renderer = CairoRenderer::new(&svg_handle); /// renderer.render(&cr).unwrap(); /// ``` pub fn keep_image_data(mut self, keep: bool) -> Self { @@ -315,10 +315,6 @@ impl Loader { pub struct SvgHandle(Handle); /// Can render an `SvgHandle` to a Cairo context. -/// -/// Use the -/// [`get_cairo_renderer`](struct.SvgHandle.html#method.get_cairo_renderer) -/// method to create this structure. pub struct CairoRenderer<'a> { handle: &'a SvgHandle, dpi: Dpi, @@ -328,16 +324,6 @@ pub struct CairoRenderer<'a> { const DEFAULT_DPI_X: f64 = 96.0; const DEFAULT_DPI_Y: f64 = 96.0; -impl SvgHandle { - /// Creates a Cairo rendering context for the SVG handle. - pub fn get_cairo_renderer(&self) -> CairoRenderer { - CairoRenderer { - handle: self, - dpi: Dpi::new(DEFAULT_DPI_X, DEFAULT_DPI_Y), - } - } -} - #[derive(Debug, Copy, Clone, PartialEq)] pub struct IntrinsicDimensions { pub width: Option, @@ -346,16 +332,27 @@ pub struct IntrinsicDimensions { } impl<'a> CairoRenderer<'a> { - /// Configures the dots-per-inch for resolving physical lengths. + /// Creates a `CairoRenderer` for the specified `SvgHandle`. /// /// If an SVG file has physical units like `5cm`, they must be resolved - /// to pixel-based values. Use this function to configure the pixel density - /// of your output; the defaults are `96.0` DPI in both dimensions. - pub fn set_dpi(&mut self, dpi_x: f64, dpi_y: f64) { + /// to pixel-based values. The default pixel density is `96.0` DPI in + /// both dimensions. + pub fn new(handle: &'a SvgHandle) -> Self { + CairoRenderer { + handle, + dpi: Dpi::new(DEFAULT_DPI_X, DEFAULT_DPI_Y), + } + } + + /// Configures the dots-per-inch for resolving physical lengths. + pub fn with_dpi(self, dpi_x: f64, dpi_y: f64) -> Self { assert!(dpi_x > 0.0); assert!(dpi_y > 0.0); - self.dpi = Dpi::new(dpi_x, dpi_y); + CairoRenderer { + handle: self.handle, + dpi: Dpi::new(dpi_x, dpi_y), + } } pub fn get_dimensions(&self) -> Result<(i32, i32), RenderingError> { diff --git a/librsvg_crate/tests/intrinsic-dimensions.rs b/librsvg_crate/tests/intrinsic-dimensions.rs index 188f0b40c..f112de1f3 100644 --- a/librsvg_crate/tests/intrinsic-dimensions.rs +++ b/librsvg_crate/tests/intrinsic-dimensions.rs @@ -7,12 +7,13 @@ use gio::MemoryInputStreamExt; use glib::Cast; use librsvg::{ + CairoRenderer, DefsLookupErrorKind, HrefError, IntrinsicDimensions, Length, LengthUnit, - LoadOptions, + Loader, RenderingError, SvgHandle, }; @@ -21,7 +22,7 @@ fn load_svg(input: &'static [u8]) -> SvgHandle { let stream = gio::MemoryInputStream::new(); stream.add_bytes(&glib::Bytes::from_static(input)); - LoadOptions::new() + Loader::new() .read_stream(&stream.upcast(), None, None) .unwrap() } @@ -35,7 +36,7 @@ fn no_intrinsic_dimensions() { ); assert_eq!( - svg.get_cairo_renderer().get_intrinsic_dimensions(), + CairoRenderer::new(&svg).get_intrinsic_dimensions(), IntrinsicDimensions { width: None, height: None, @@ -53,7 +54,7 @@ fn has_intrinsic_dimensions() { ); assert_eq!( - svg.get_cairo_renderer().get_intrinsic_dimensions(), + CairoRenderer::new(&svg).get_intrinsic_dimensions(), IntrinsicDimensions { width: Some(Length::new(10.0, LengthUnit::Cm)), height: Some(Length::new(20.0, LengthUnit::Px)), @@ -77,7 +78,7 @@ fn root_geometry_with_percent_viewport() { "#, ); - let renderer = svg.get_cairo_renderer(); + let renderer = CairoRenderer::new(&svg); let (ink_r, logical_r) = renderer.get_geometry_for_element(None).unwrap(); let rect = cairo::Rectangle { @@ -100,7 +101,7 @@ fn element_geometry_with_percent_viewport() { "#, ); - let renderer = svg.get_cairo_renderer(); + let renderer = CairoRenderer::new(&svg); let (ink_r, logical_r) = renderer.get_geometry_for_element(Some("#foo")).unwrap(); let rect = cairo::Rectangle { @@ -121,7 +122,7 @@ fn element_geometry_for_nonexistent_element() { "#, ); - let renderer = svg.get_cairo_renderer(); + let renderer = CairoRenderer::new(&svg); match renderer.get_geometry_for_element(Some("#foo")) { Err(RenderingError::InvalidId(DefsLookupErrorKind::NotFound)) => (), _ => panic!(), @@ -136,7 +137,7 @@ fn element_geometry_for_invalid_id() { "#, ); - let renderer = svg.get_cairo_renderer(); + let renderer = CairoRenderer::new(&svg); match renderer.get_geometry_for_element(Some("foo")) { Err(RenderingError::InvalidId(DefsLookupErrorKind::CannotLookupExternalReferences)) => (), _ => panic!(), -- GitLab From 313dc2566ce1724378c14482042703d896285b37 Mon Sep 17 00:00:00 2001 From: Paolo Borelli Date: Sun, 24 Feb 2019 16:15:16 +0100 Subject: [PATCH 3/4] librsvg_crate: rename get_ from getters https://rust-lang-nursery.github.io/api-guidelines/naming.html#c-getter --- librsvg_crate/examples/render.rs | 2 +- librsvg_crate/src/lib.rs | 6 +++--- librsvg_crate/tests/intrinsic-dimensions.rs | 16 ++++++++-------- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/librsvg_crate/examples/render.rs b/librsvg_crate/examples/render.rs index ee88cb0d4..7265ec32f 100644 --- a/librsvg_crate/examples/render.rs +++ b/librsvg_crate/examples/render.rs @@ -21,7 +21,7 @@ fn main() { let handle = librsvg::Loader::new().read_path(input).unwrap(); let renderer = librsvg::CairoRenderer::new(&handle); - let (w, h) = renderer.get_dimensions().unwrap(); + let (w, h) = renderer.dimensions().unwrap(); let surface = cairo::ImageSurface::create(cairo::Format::ARgb32, w, h).unwrap(); let cr = cairo::Context::new(&surface); diff --git a/librsvg_crate/src/lib.rs b/librsvg_crate/src/lib.rs index e4f6e605b..204b5d80f 100644 --- a/librsvg_crate/src/lib.rs +++ b/librsvg_crate/src/lib.rs @@ -355,14 +355,14 @@ impl<'a> CairoRenderer<'a> { } } - pub fn get_dimensions(&self) -> Result<(i32, i32), RenderingError> { + pub fn dimensions(&self) -> Result<(i32, i32), RenderingError> { self.handle .0 .get_dimensions() .map(|dimensions| (dimensions.width, dimensions.height)) } - pub fn get_intrinsic_dimensions(&self) -> IntrinsicDimensions { + pub fn intrinsic_dimensions(&self) -> IntrinsicDimensions { let d = self.handle.0.get_intrinsic_dimensions(); IntrinsicDimensions { @@ -400,7 +400,7 @@ impl<'a> CairoRenderer<'a> { /// the child elements. /// /// FIXME: example - pub fn get_geometry_for_element( + pub fn geometry_for_element( &self, id: Option<&str>, ) -> Result<(cairo::Rectangle, cairo::Rectangle), RenderingError> { diff --git a/librsvg_crate/tests/intrinsic-dimensions.rs b/librsvg_crate/tests/intrinsic-dimensions.rs index f112de1f3..b0254eb5d 100644 --- a/librsvg_crate/tests/intrinsic-dimensions.rs +++ b/librsvg_crate/tests/intrinsic-dimensions.rs @@ -36,7 +36,7 @@ fn no_intrinsic_dimensions() { ); assert_eq!( - CairoRenderer::new(&svg).get_intrinsic_dimensions(), + CairoRenderer::new(&svg).intrinsic_dimensions(), IntrinsicDimensions { width: None, height: None, @@ -54,7 +54,7 @@ fn has_intrinsic_dimensions() { ); assert_eq!( - CairoRenderer::new(&svg).get_intrinsic_dimensions(), + CairoRenderer::new(&svg).intrinsic_dimensions(), IntrinsicDimensions { width: Some(Length::new(10.0, LengthUnit::Cm)), height: Some(Length::new(20.0, LengthUnit::Px)), @@ -79,7 +79,7 @@ fn root_geometry_with_percent_viewport() { ); let renderer = CairoRenderer::new(&svg); - let (ink_r, logical_r) = renderer.get_geometry_for_element(None).unwrap(); + let (ink_r, logical_r) = renderer.geometry_for_element(None).unwrap(); let rect = cairo::Rectangle { x: 10.0, @@ -102,7 +102,7 @@ fn element_geometry_with_percent_viewport() { ); let renderer = CairoRenderer::new(&svg); - let (ink_r, logical_r) = renderer.get_geometry_for_element(Some("#foo")).unwrap(); + let (ink_r, logical_r) = renderer.geometry_for_element(Some("#foo")).unwrap(); let rect = cairo::Rectangle { x: 10.0, @@ -123,7 +123,7 @@ fn element_geometry_for_nonexistent_element() { ); let renderer = CairoRenderer::new(&svg); - match renderer.get_geometry_for_element(Some("#foo")) { + match renderer.geometry_for_element(Some("#foo")) { Err(RenderingError::InvalidId(DefsLookupErrorKind::NotFound)) => (), _ => panic!(), } @@ -138,17 +138,17 @@ fn element_geometry_for_invalid_id() { ); let renderer = CairoRenderer::new(&svg); - match renderer.get_geometry_for_element(Some("foo")) { + match renderer.geometry_for_element(Some("foo")) { Err(RenderingError::InvalidId(DefsLookupErrorKind::CannotLookupExternalReferences)) => (), _ => panic!(), } - match renderer.get_geometry_for_element(Some("foo.svg#foo")) { + match renderer.geometry_for_element(Some("foo.svg#foo")) { Err(RenderingError::InvalidId(DefsLookupErrorKind::CannotLookupExternalReferences)) => (), _ => panic!(), } - match renderer.get_geometry_for_element(Some("")) { + match renderer.geometry_for_element(Some("")) { Err(RenderingError::InvalidId(DefsLookupErrorKind::HrefError(HrefError::ParseError))) => (), _ => panic!(), } -- GitLab From 4314bdd25648509a47361d04232d940508b7549f Mon Sep 17 00:00:00 2001 From: Paolo Borelli Date: Sun, 24 Feb 2019 19:08:32 +0100 Subject: [PATCH 4/4] librsvg_crate: remove bool arguments from loader The options are false by default, we just need methods to turn them on. Also change unlimited_size() to with_unlimited_size(). --- librsvg_crate/src/lib.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/librsvg_crate/src/lib.rs b/librsvg_crate/src/lib.rs index 204b5d80f..b3231d7b3 100644 --- a/librsvg_crate/src/lib.rs +++ b/librsvg_crate/src/lib.rs @@ -129,7 +129,7 @@ pub struct Loader { impl Loader { /// Creates a `Loader` with the default flags. /// - /// * [`unlimited_size`](#method.unlimited_size) defaults to `false`, as malicious + /// * [`unlimited_size`](#method.with_unlimited_size) defaults to `false`, as malicious /// SVG files could cause the XML parser to consume very large amounts of memory. /// /// * [`keep_image_data`](#method.keep_image_data) defaults to @@ -171,12 +171,12 @@ impl Loader { /// use librsvg::Loader; /// /// let svg_handle = Loader::new() - /// .unlimited_size(true) + /// .with_unlimited_size() /// .read_path("trusted-huge-file.svg") /// .unwrap(); /// ``` - pub fn unlimited_size(mut self, unlimited: bool) -> Self { - self.unlimited_size = unlimited; + pub fn with_unlimited_size(mut self) -> Self { + self.unlimited_size = true; self } @@ -200,7 +200,7 @@ impl Loader { /// use librsvg::Loader; /// /// let svg_handle = Loader::new() - /// .keep_image_data(true) + /// .keep_image_data() /// .read_path("svg-with-embedded-images.svg") /// .unwrap(); /// @@ -210,8 +210,8 @@ impl Loader { /// let renderer = CairoRenderer::new(&svg_handle); /// renderer.render(&cr).unwrap(); /// ``` - pub fn keep_image_data(mut self, keep: bool) -> Self { - self.keep_image_data = keep; + pub fn keep_image_data(mut self) -> Self { + self.keep_image_data = true; self } -- GitLab