diff --git a/librsvg_crate/examples/proportional.rs b/librsvg_crate/examples/proportional.rs index 50284b080994b4279ca3b00cdee35aa6ea304cf1..74387ee8826e512930ac6d17cff4f3a81f6b0e55 100644 --- a/librsvg_crate/examples/proportional.rs +++ b/librsvg_crate/examples/proportional.rs @@ -28,9 +28,8 @@ fn main() { assert!(width > 0 && height > 0); - let handle = librsvg::LoadOptions::new().read_path(input).unwrap(); - - let renderer = handle.get_cairo_renderer(); + let handle = librsvg::Loader::new().read_path(input).unwrap(); + 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 cefb2f3a756d0a1bc400225bb6af15605e9b50e2..7265ec32fc5e0046eaa86883acb518cf2784a818 100644 --- a/librsvg_crate/examples/render.rs +++ b/librsvg_crate/examples/render.rs @@ -18,11 +18,10 @@ 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 = librsvg::CairoRenderer::new(&handle); - let renderer = handle.get_cairo_renderer(); - - 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 9f5bb09a336cc1a0c4730191c5a3c8b0b5a44ba3..b3231d7b3eda13b6bc700e095a313465fb40dfa5 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`]. -//! * Get a [`CairoRenderer`] from the [`SvgHandle`] and render to a Cairo context. +//! * Create a [`Loader`] struct. +//! * Get an [`SvgHandle`] from the [`Loader`]. +//! * Create a [`CairoRenderer`] for 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,25 +111,25 @@ 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 + /// * [`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 @@ -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,15 +168,15 @@ impl LoadOptions { /// ```ignore /// extern crate librsvg; /// - /// use librsvg::LoadOptions; + /// use librsvg::Loader; /// - /// let svg_handle = LoadOptions::new() - /// .unlimited_size(true) + /// let svg_handle = Loader::new() + /// .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 } @@ -197,21 +197,21 @@ impl LoadOptions { /// extern crate cairo; /// extern crate librsvg; /// - /// use librsvg::LoadOptions; + /// use librsvg::Loader; /// - /// let svg_handle = LoadOptions::new() - /// .keep_image_data(true) + /// let svg_handle = Loader::new() + /// .keep_image_data() /// .read_path("svg-with-embedded-images.svg") /// .unwrap(); /// /// 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 { - self.keep_image_data = keep; + pub fn keep_image_data(mut self) -> Self { + self.keep_image_data = true; self } @@ -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,14 +311,10 @@ 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. -/// -/// 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,26 +332,37 @@ 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> { + 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 { @@ -403,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 188f0b40ca47575cff612e4094db54c9d4ecf203..b0254eb5d876f547f50d4d91178a494d0dcd5757 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).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).intrinsic_dimensions(), IntrinsicDimensions { width: Some(Length::new(10.0, LengthUnit::Cm)), height: Some(Length::new(20.0, LengthUnit::Px)), @@ -77,8 +78,8 @@ fn root_geometry_with_percent_viewport() { "#, ); - let renderer = svg.get_cairo_renderer(); - let (ink_r, logical_r) = renderer.get_geometry_for_element(None).unwrap(); + let renderer = CairoRenderer::new(&svg); + let (ink_r, logical_r) = renderer.geometry_for_element(None).unwrap(); let rect = cairo::Rectangle { x: 10.0, @@ -100,8 +101,8 @@ fn element_geometry_with_percent_viewport() { "#, ); - let renderer = svg.get_cairo_renderer(); - let (ink_r, logical_r) = renderer.get_geometry_for_element(Some("#foo")).unwrap(); + let renderer = CairoRenderer::new(&svg); + let (ink_r, logical_r) = renderer.geometry_for_element(Some("#foo")).unwrap(); let rect = cairo::Rectangle { x: 10.0, @@ -121,8 +122,8 @@ fn element_geometry_for_nonexistent_element() { "#, ); - let renderer = svg.get_cairo_renderer(); - match renderer.get_geometry_for_element(Some("#foo")) { + let renderer = CairoRenderer::new(&svg); + match renderer.geometry_for_element(Some("#foo")) { Err(RenderingError::InvalidId(DefsLookupErrorKind::NotFound)) => (), _ => panic!(), } @@ -136,18 +137,18 @@ fn element_geometry_for_invalid_id() { "#, ); - let renderer = svg.get_cairo_renderer(); - match renderer.get_geometry_for_element(Some("foo")) { + let renderer = CairoRenderer::new(&svg); + 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!(), }