summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSophie Herold <sophie@hemio.de>2023-04-01 17:17:41 +0200
committerSophie Herold <sophie@hemio.de>2023-04-01 22:14:56 +0200
commit950425c215b9cd819b1cffb568de7ae1270040ed (patch)
tree361f217b3b7b2c023a0aea19e679b96ea909a17b
parent3330b38a3094e09edbb80fb85f3e5c3803f718a1 (diff)
downloadlibrsvg-950425c215b9cd819b1cffb568de7ae1270040ed.tar.gz
meta: Separate C API from rust crate
Part-of: <https://gitlab.gnome.org/GNOME/librsvg/-/merge_requests/822>
-rw-r--r--Cargo.lock12
-rw-r--r--Cargo.toml1
-rw-r--r--gdk-pixbuf-loader/Cargo.toml11
-rw-r--r--gdk-pixbuf-loader/src/lib.rs4
-rw-r--r--librsvg-c/Cargo.toml23
-rw-r--r--librsvg-c/build.rs57
-rw-r--r--librsvg-c/src/c_api/handle.rs20
-rw-r--r--librsvg-c/src/c_api/pixbuf_utils.rs8
-rw-r--r--librsvg-c/src/c_api/sizing.rs12
-rw-r--r--librsvg-c/src/lib.rs2
-rw-r--r--librsvg-c/tests-c/Makefile.am (renamed from rsvg/tests/Makefile.am)0
-rw-r--r--librsvg-c/tests-c/api.c (renamed from rsvg/tests/api.c)0
-rw-r--r--librsvg-c/tests-c/test-utils.c (renamed from rsvg/tests/test-utils.c)0
-rw-r--r--librsvg-c/tests-c/test-utils.h (renamed from rsvg/tests/test-utils.h)0
-rw-r--r--librsvg-c/tests/legacy_sizing.rs (renamed from rsvg/tests/src/legacy_sizing.rs)6
-rw-r--r--rsvg-bench/Cargo.toml2
-rw-r--r--rsvg-convert/Cargo.toml13
-rw-r--r--rsvg-convert/src/main.rs9
l---------rsvg-convert/tests/fixtures1
-rw-r--r--rsvg-convert/tests/internal_predicates/file.rs (renamed from rsvg/tests/src/predicates/file.rs)6
-rw-r--r--rsvg-convert/tests/internal_predicates/mod.rs4
-rw-r--r--rsvg-convert/tests/internal_predicates/pdf.rs (renamed from rsvg/tests/src/predicates/pdf.rs)0
-rw-r--r--rsvg-convert/tests/internal_predicates/png.rs (renamed from rsvg/tests/src/predicates/png.rs)4
-rw-r--r--rsvg-convert/tests/internal_predicates/svg.rs (renamed from rsvg/tests/src/predicates/svg.rs)2
-rw-r--r--rsvg-convert/tests/rsvg_convert.rs (renamed from rsvg/tests/src/cmdline/rsvg_convert.rs)8
-rw-r--r--rsvg/Cargo.toml13
-rw-r--r--rsvg/build.rs66
-rw-r--r--rsvg/example.svg (renamed from example.svg)0
-rw-r--r--rsvg/src/api.rs22
-rw-r--r--rsvg/src/lib.rs12
-rw-r--r--rsvg/src/test_utils/compare_surfaces.rs (renamed from rsvg/tests/src/compare_surfaces.rs)2
-rw-r--r--rsvg/src/test_utils/mod.rs (renamed from rsvg/tests/src/utils.rs)6
-rw-r--r--rsvg/src/test_utils/reference_utils.rs (renamed from rsvg/tests/src/reference_utils.rs)14
-rw-r--r--rsvg/tests/src/api.rs4
-rw-r--r--rsvg/tests/src/bugs.rs4
-rw-r--r--rsvg/tests/src/cmdline/mod.rs1
-rw-r--r--rsvg/tests/src/filters.rs6
-rw-r--r--rsvg/tests/src/intrinsic_dimensions.rs4
-rw-r--r--rsvg/tests/src/main.rs60
-rw-r--r--rsvg/tests/src/predicates/mod.rs10
-rw-r--r--rsvg/tests/src/primitives.rs6
-rw-r--r--rsvg/tests/src/reference.rs6
-rw-r--r--rsvg/tests/src/shapes.rs2
-rw-r--r--rsvg/tests/src/text.rs6
44 files changed, 161 insertions, 288 deletions
diff --git a/Cargo.lock b/Cargo.lock
index cb6644ef..b87beb1b 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1117,7 +1117,6 @@ name = "librsvg"
version = "2.56.0"
dependencies = [
"anyhow",
- "assert_cmd",
"byteorder",
"cairo-rs",
"cast",
@@ -1164,7 +1163,7 @@ dependencies = [
[[package]]
name = "librsvg-c"
-version = "0.1.0"
+version = "2.56.0"
dependencies = [
"cairo-rs",
"cast",
@@ -1662,6 +1661,7 @@ dependencies = [
"glib",
"libc",
"librsvg",
+ "librsvg-c",
]
[[package]]
@@ -2041,16 +2041,24 @@ dependencies = [
name = "rsvg-convert"
version = "2.56.0"
dependencies = [
+ "assert_cmd",
"cairo-rs",
"cast",
"chrono",
"clap 4.1.9",
"clap_complete",
"cssparser",
+ "float-cmp",
"gio",
"libc",
"librsvg",
+ "librsvg-c",
+ "lopdf",
+ "png",
+ "predicates 2.1.5",
"system-deps",
+ "tempfile",
+ "url",
]
[[package]]
diff --git a/Cargo.toml b/Cargo.toml
index 50c5826a..9d66510d 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -21,5 +21,6 @@ members = [
"rsvg-bench",
]
default-members = [
+ "rsvg",
"rsvg-convert",
]
diff --git a/gdk-pixbuf-loader/Cargo.toml b/gdk-pixbuf-loader/Cargo.toml
index d9132e7a..f1458fc0 100644
--- a/gdk-pixbuf-loader/Cargo.toml
+++ b/gdk-pixbuf-loader/Cargo.toml
@@ -11,10 +11,11 @@ rust-version.workspace = true
crate-type = ["cdylib"]
[dependencies]
-librsvg = { path = "../rsvg" }
+cairo-rs = "0.17"
+cstr = "0.2"
gdk-pixbuf = "0.17"
-libc = "0.2"
-glib = "0.17"
gio = "0.17"
-cairo-rs = "0.17"
-cstr = "0.2" \ No newline at end of file
+glib = "0.17"
+libc = "0.2"
+librsvg = { path = "../rsvg" }
+librsvg-c = { path = "../librsvg-c" }
diff --git a/gdk-pixbuf-loader/src/lib.rs b/gdk-pixbuf-loader/src/lib.rs
index 007367c1..06e541ce 100644
--- a/gdk-pixbuf-loader/src/lib.rs
+++ b/gdk-pixbuf-loader/src/lib.rs
@@ -16,7 +16,7 @@ use gio::prelude::MemoryInputStreamExt;
use gio::MemoryInputStream;
use glib::gobject_ffi::GObject;
-use rsvg::rsvg_convert_only::LegacySize;
+use librsvg_c::c_api::sizing::LegacySize;
use rsvg::Loader;
use cstr::cstr;
@@ -104,7 +104,7 @@ unsafe extern "C" fn stop_load(user_data: gpointer, error: *mut *mut GError) ->
}
}
- let pb = rsvg::c_api::pixbuf_utils::render_to_pixbuf_at_size(
+ let pb = librsvg_c::c_api::pixbuf_utils::render_to_pixbuf_at_size(
&renderer, w as f64, h as f64, w as f64, h as f64,
)
.map_err(|e| e.to_string())?;
diff --git a/librsvg-c/Cargo.toml b/librsvg-c/Cargo.toml
index cb2209cd..9996027b 100644
--- a/librsvg-c/Cargo.toml
+++ b/librsvg-c/Cargo.toml
@@ -1,19 +1,26 @@
[package]
name = "librsvg-c"
-version = "0.1.0"
-edition = "2021"
+version.workspace = true
+authors.workspace = true
+description.workspace = true
+license.workspace = true
+homepage.workspace = true
+repository.workspace = true
+edition.workspace = true
+rust-version.workspace = true
[dependencies]
-librsvg = { version = "*", path = "../rsvg" }
-gio = "0.17"
-glib = "0.17"
cairo-rs = { version = "0.17", features=["v1_16", "png", "pdf", "ps", "svg"] }
cast = "0.3.0"
+float-cmp = "0.9.0"
gdk-pixbuf = "0.17"
+gio = "0.17"
+glib = "0.17"
libc = "0.2"
-float-cmp = "0.9.0"
-url = "2"
+librsvg = { path = "../rsvg", features = ["c-api"] }
once_cell = "1.2.0"
+url = "2"
[build-dependencies]
-regex = "1.7.1" \ No newline at end of file
+regex = "1.7.1"
+librsvg = { path = "../rsvg", features = ["c-api", "test-utils"] } \ No newline at end of file
diff --git a/librsvg-c/build.rs b/librsvg-c/build.rs
index 7a46d6c6..0a0bdd9b 100644
--- a/librsvg-c/build.rs
+++ b/librsvg-c/build.rs
@@ -2,68 +2,13 @@ use regex::Regex;
use std::env;
use std::fs::File;
use std::io::prelude::*;
-use std::io::{BufReader, BufWriter, Write};
+use std::io::{BufReader, Write};
use std::path::Path;
-use std::process;
fn main() {
- if let Err(e) = system_deps::Config::new().probe() {
- eprintln!("{e}");
- process::exit(1);
- }
-
- generate_srgb_tables();
write_version();
}
-/// Converts an sRGB color value to a linear sRGB color value (undoes the gamma correction).
-///
-/// The input and the output are supposed to be in the [0, 1] range.
-#[inline]
-fn linearize(c: f64) -> f64 {
- if c <= (12.92 * 0.0031308) {
- c / 12.92
- } else {
- ((c + 0.055) / 1.055).powf(2.4)
- }
-}
-
-/// Converts a linear sRGB color value to a normal sRGB color value (applies the gamma correction).
-///
-/// The input and the output are supposed to be in the [0, 1] range.
-#[inline]
-fn unlinearize(c: f64) -> f64 {
- if c <= 0.0031308 {
- 12.92 * c
- } else {
- 1.055 * c.powf(1f64 / 2.4) - 0.055
- }
-}
-
-fn print_table<W, F>(w: &mut W, name: &str, f: F, len: u32)
-where
- W: Write,
- F: Fn(f64) -> f64,
-{
- writeln!(w, "const {name}: [u8; {len}] = [").unwrap();
-
- for i in 0..len {
- let x = f(i as f64 / 255.0);
- let v = (x * 255.0).round() as u8;
- writeln!(w, " {v},").unwrap();
- }
-
- writeln!(w, "];").unwrap();
-}
-
-fn generate_srgb_tables() {
- let path = Path::new(&env::var("OUT_DIR").unwrap()).join("srgb-codegen.rs");
- let mut file = BufWriter::new(File::create(path).unwrap());
-
- print_table(&mut file, "LINEARIZE", linearize, 256);
- print_table(&mut file, "UNLINEARIZE", unlinearize, 256);
-}
-
fn write_version() {
let mut major = None;
let mut minor = None;
diff --git a/librsvg-c/src/c_api/handle.rs b/librsvg-c/src/c_api/handle.rs
index 1698cc17..3ab6acc5 100644
--- a/librsvg-c/src/c_api/handle.rs
+++ b/librsvg-c/src/c_api/handle.rs
@@ -38,14 +38,10 @@ use glib::types::instance_of;
use glib::{ffi::gpointer, gobject_ffi};
use glib::{Bytes, Cast, StaticType, ToValue};
-use crate::api::{self, CairoRenderer, IntrinsicDimensions, Loader, LoadingError, SvgHandle};
-
-use crate::{
- length::RsvgLength,
- rsvg_log,
- session::Session,
- surface_utils::shared_surface::{SharedImageSurface, SurfaceType},
-};
+use rsvg::c_api_only::Session;
+use rsvg::surface_utils::shared_surface::{SharedImageSurface, SurfaceType};
+use rsvg::{rsvg_log, Length};
+use rsvg::{CairoRenderer, IntrinsicDimensions, Loader, LoadingError, SvgHandle};
use super::dpi::Dpi;
use super::messages::{rsvg_g_critical, rsvg_g_warning};
@@ -59,13 +55,13 @@ include!(concat!(env!("OUT_DIR"), "/version.rs"));
// This is basically the same as api::RenderingError but with extra cases for
// the peculiarities of the C API.
enum RenderingError {
- RenderingError(api::RenderingError),
+ RenderingError(rsvg::RenderingError),
// The RsvgHandle is created, but hasn't been loaded yet.
HandleIsNotLoaded,
}
-impl<T: Into<api::RenderingError>> From<T> for RenderingError {
+impl<T: Into<rsvg::RenderingError>> From<T> for RenderingError {
fn from(e: T) -> RenderingError {
RenderingError::RenderingError(e.into())
}
@@ -1645,9 +1641,9 @@ pub unsafe extern "C" fn rsvg_handle_set_stylesheet(
pub unsafe extern "C" fn rsvg_handle_get_intrinsic_dimensions(
handle: *const RsvgHandle,
out_has_width: *mut glib::ffi::gboolean,
- out_width: *mut RsvgLength,
+ out_width: *mut Length,
out_has_height: *mut glib::ffi::gboolean,
- out_height: *mut RsvgLength,
+ out_height: *mut Length,
out_has_viewbox: *mut glib::ffi::gboolean,
out_viewbox: *mut RsvgRectangle,
) {
diff --git a/librsvg-c/src/c_api/pixbuf_utils.rs b/librsvg-c/src/c_api/pixbuf_utils.rs
index 710f2c4b..da1ad804 100644
--- a/librsvg-c/src/c_api/pixbuf_utils.rs
+++ b/librsvg-c/src/c_api/pixbuf_utils.rs
@@ -12,10 +12,10 @@ use super::dpi::Dpi;
use super::handle::{checked_i32, set_gerror};
use super::sizing::LegacySize;
-use crate::api::{CairoRenderer, Loader};
-use crate::error::RenderingError;
-use crate::session::Session;
-use crate::surface_utils::shared_surface::{SharedImageSurface, SurfaceType};
+use rsvg::c_api_only::Session;
+use rsvg::surface_utils::shared_surface::{SharedImageSurface, SurfaceType};
+use rsvg::RenderingError;
+use rsvg::{CairoRenderer, Loader};
pub fn empty_pixbuf() -> Result<Pixbuf, RenderingError> {
// GdkPixbuf does not allow zero-sized pixbufs, but Cairo allows zero-sized
diff --git a/librsvg-c/src/c_api/sizing.rs b/librsvg-c/src/c_api/sizing.rs
index e0c85bd1..4d16e483 100644
--- a/librsvg-c/src/c_api/sizing.rs
+++ b/librsvg-c/src/c_api/sizing.rs
@@ -12,10 +12,8 @@
use float_cmp::approx_eq;
-use crate::api::{CairoRenderer, IntrinsicDimensions, RenderingError};
-use crate::dpi::Dpi;
-use crate::handle::Handle;
-use crate::length::*;
+use rsvg::c_api_only::Handle;
+use rsvg::{CairoRenderer, Dpi, IntrinsicDimensions, RenderingError};
use super::handle::CairoRectangleExt;
@@ -51,9 +49,9 @@ impl<'a> LegacySize for CairoRenderer<'a> {
let size_from_intrinsic_dimensions =
self.intrinsic_size_in_pixels().or_else(|| {
size_in_pixels_from_percentage_width_and_height(
- &self.handle.handle,
+ self.handle(),
&self.intrinsic_dimensions(),
- self.dpi,
+ self.dpi(),
)
});
@@ -94,7 +92,7 @@ fn size_in_pixels_from_percentage_width_and_height(
vbox,
} = *dim;
- use LengthUnit::*;
+ use rsvg::LengthUnit::*;
// Unwrap or return None if we don't know the aspect ratio -> Let the caller handle it.
let vbox = vbox?;
diff --git a/librsvg-c/src/lib.rs b/librsvg-c/src/lib.rs
index ec407516..3b543815 100644
--- a/librsvg-c/src/lib.rs
+++ b/librsvg-c/src/lib.rs
@@ -1 +1 @@
-pub use c_api;
+pub mod c_api;
diff --git a/rsvg/tests/Makefile.am b/librsvg-c/tests-c/Makefile.am
index b645ea6d..b645ea6d 100644
--- a/rsvg/tests/Makefile.am
+++ b/librsvg-c/tests-c/Makefile.am
diff --git a/rsvg/tests/api.c b/librsvg-c/tests-c/api.c
index f7b01c2e..f7b01c2e 100644
--- a/rsvg/tests/api.c
+++ b/librsvg-c/tests-c/api.c
diff --git a/rsvg/tests/test-utils.c b/librsvg-c/tests-c/test-utils.c
index 128611f4..128611f4 100644
--- a/rsvg/tests/test-utils.c
+++ b/librsvg-c/tests-c/test-utils.c
diff --git a/rsvg/tests/test-utils.h b/librsvg-c/tests-c/test-utils.h
index d71af69d..d71af69d 100644
--- a/rsvg/tests/test-utils.h
+++ b/librsvg-c/tests-c/test-utils.h
diff --git a/rsvg/tests/src/legacy_sizing.rs b/librsvg-c/tests/legacy_sizing.rs
index 78f2a13f..3ccc1f01 100644
--- a/rsvg/tests/src/legacy_sizing.rs
+++ b/librsvg-c/tests/legacy_sizing.rs
@@ -1,8 +1,8 @@
use cairo;
-use rsvg::{rsvg_convert_only::LegacySize, CairoRenderer};
-
-use crate::utils::load_svg;
+use librsvg_c::c_api::sizing::LegacySize;
+use rsvg::test_utils::load_svg;
+use rsvg::CairoRenderer;
#[test]
fn just_viewbox_uses_viewbox_size() {
diff --git a/rsvg-bench/Cargo.toml b/rsvg-bench/Cargo.toml
index f951faf9..4eecd476 100644
--- a/rsvg-bench/Cargo.toml
+++ b/rsvg-bench/Cargo.toml
@@ -16,5 +16,5 @@ documentation = "https://gnome.pages.gitlab.gnome.org/librsvg/doc/rsvg/index.htm
anyhow = "1.0"
cairo-rs = { version = "0.17", features=["v1_16", "png", "pdf", "ps", "svg"] }
clap = { version = "4.0.17", features = ["cargo", "derive"] } # rsvg-convert
-librsvg = { version = "*", path = "../rsvg" }
+librsvg = { path = "../rsvg" }
thiserror = "1.0" \ No newline at end of file
diff --git a/rsvg-convert/Cargo.toml b/rsvg-convert/Cargo.toml
index feb8aa9c..c3e103fb 100644
--- a/rsvg-convert/Cargo.toml
+++ b/rsvg-convert/Cargo.toml
@@ -25,7 +25,18 @@ clap_complete = "4.0.5" # rsvg-convert
cssparser = "0.29.0"
gio = "0.17"
libc = "0.2"
-librsvg = { version = "*", path = "../rsvg" }
+librsvg = { path = "../rsvg" }
+librsvg-c = { path = "../librsvg-c" }
+
+[dev-dependencies]
+assert_cmd = "2.0.2"
+predicates = "2.0.0"
+tempfile = "3"
+url = "2"
+lopdf = "0.29.0"
+png = "0.17.2"
+float-cmp = "0.9.0"
+librsvg = { path = "../rsvg", features = ["test-utils"] }
[build-dependencies]
system-deps = "6.0.0" \ No newline at end of file
diff --git a/rsvg-convert/src/main.rs b/rsvg-convert/src/main.rs
index 9c472331..dc1cb396 100644
--- a/rsvg-convert/src/main.rs
+++ b/rsvg-convert/src/main.rs
@@ -21,11 +21,14 @@ use self::windows_imports::*;
use cssparser::{_cssparser_internal_to_lowercase, match_ignore_ascii_case};
+use librsvg_c::c_api::{handle::PathOrUrl, sizing::LegacySize};
use rsvg::rsvg_convert_only::{
- AspectRatio, CssLength, Dpi, Horizontal, LegacySize, Length, Normalize, NormalizeParams, Parse,
- PathOrUrl, Rect, Signed, ULength, Unsigned, Validate, Vertical, ViewBox,
+ AspectRatio, CssLength, Horizontal, Length, Normalize, NormalizeParams, Parse, Signed, ULength,
+ Unsigned, Validate, Vertical, ViewBox,
+};
+use rsvg::{
+ AcceptLanguage, CairoRenderer, Color, Dpi, Language, LengthUnit, Loader, Rect, RenderingError,
};
-use rsvg::{AcceptLanguage, CairoRenderer, Color, Language, LengthUnit, Loader, RenderingError};
use std::ffi::OsString;
use std::io;
diff --git a/rsvg-convert/tests/fixtures b/rsvg-convert/tests/fixtures
new file mode 120000
index 00000000..ab9214e0
--- /dev/null
+++ b/rsvg-convert/tests/fixtures
@@ -0,0 +1 @@
+../../rsvg/tests/fixtures/ \ No newline at end of file
diff --git a/rsvg/tests/src/predicates/file.rs b/rsvg-convert/tests/internal_predicates/file.rs
index 997b3690..a7af5acf 100644
--- a/rsvg/tests/src/predicates/file.rs
+++ b/rsvg-convert/tests/internal_predicates/file.rs
@@ -1,9 +1,9 @@
use predicates::prelude::*;
use predicates::str::StartsWithPredicate;
-use crate::predicates::pdf::PdfPredicate;
-use crate::predicates::png::PngPredicate;
-use crate::predicates::svg::SvgPredicate;
+use super::pdf::PdfPredicate;
+use super::png::PngPredicate;
+use super::svg::SvgPredicate;
/// Predicates to check that some output ([u8]) is of a certain file type
diff --git a/rsvg-convert/tests/internal_predicates/mod.rs b/rsvg-convert/tests/internal_predicates/mod.rs
new file mode 100644
index 00000000..7e15354d
--- /dev/null
+++ b/rsvg-convert/tests/internal_predicates/mod.rs
@@ -0,0 +1,4 @@
+pub mod file;
+mod pdf;
+mod png;
+mod svg;
diff --git a/rsvg/tests/src/predicates/pdf.rs b/rsvg-convert/tests/internal_predicates/pdf.rs
index f7872d71..f7872d71 100644
--- a/rsvg/tests/src/predicates/pdf.rs
+++ b/rsvg-convert/tests/internal_predicates/pdf.rs
diff --git a/rsvg/tests/src/predicates/png.rs b/rsvg-convert/tests/internal_predicates/png.rs
index 452e756e..f629b510 100644
--- a/rsvg/tests/src/predicates/png.rs
+++ b/rsvg-convert/tests/internal_predicates/png.rs
@@ -7,8 +7,8 @@ use std::path::{Path, PathBuf};
use rsvg::surface_utils::shared_surface::{SharedImageSurface, SurfaceType};
-use crate::compare_surfaces::BufferDiff;
-use crate::reference_utils::{surface_from_png, Compare, Deviation, Reference};
+use rsvg::test_utils::compare_surfaces::BufferDiff;
+use rsvg::test_utils::reference_utils::{surface_from_png, Compare, Deviation, Reference};
/// Checks that the variable of type [u8] can be parsed as a PNG file.
#[derive(Debug)]
diff --git a/rsvg/tests/src/predicates/svg.rs b/rsvg-convert/tests/internal_predicates/svg.rs
index cd6071b7..70473812 100644
--- a/rsvg/tests/src/predicates/svg.rs
+++ b/rsvg-convert/tests/internal_predicates/svg.rs
@@ -1,6 +1,6 @@
use float_cmp::approx_eq;
+use gio::glib::Bytes;
use gio::MemoryInputStream;
-use glib::Bytes;
use predicates::prelude::*;
use predicates::reflection::{Case, Child, PredicateReflection, Product};
use std::cmp;
diff --git a/rsvg/tests/src/cmdline/rsvg_convert.rs b/rsvg-convert/tests/rsvg_convert.rs
index 88e63ce8..dcd04838 100644
--- a/rsvg/tests/src/cmdline/rsvg_convert.rs
+++ b/rsvg-convert/tests/rsvg_convert.rs
@@ -1,5 +1,6 @@
-use crate::predicates::ends_with_pkg_version;
-use crate::predicates::file;
+//use crate::predicates::ends_with_pkg_version;
+mod internal_predicates;
+use internal_predicates::file;
use assert_cmd::assert::IntoOutputPredicate;
use assert_cmd::Command;
@@ -1051,7 +1052,8 @@ fn no_keep_image_data_option() {
}
fn is_version_output() -> AndPredicate<StartsWithPredicate, TrimPredicate<EndsWithPredicate>, str> {
- starts_with("rsvg-convert version ").and(ends_with_pkg_version().trim())
+ starts_with("rsvg-convert version ")
+ .and(predicates::str::ends_with(env!("CARGO_PKG_VERSION")).trim())
}
#[test]
diff --git a/rsvg/Cargo.toml b/rsvg/Cargo.toml
index 4f6fa35e..5469ad5d 100644
--- a/rsvg/Cargo.toml
+++ b/rsvg/Cargo.toml
@@ -11,6 +11,9 @@ edition.workspace = true
rust-version.workspace = true
[package.metadata.system-deps]
+cairo-pdf = { version = "1.16", optional = true }
+cairo-ps = { version = "1.16", optional = true }
+cairo-svg = { version = "1.16", optional = true }
gdk-pixbuf = { name = "gdk-pixbuf-2.0", version = "2.20" }
gio = { name = "gio-2.0", version = "2.24" }
glib = { name = "glib-2.0", version = "2.50" }
@@ -36,6 +39,10 @@ harfbuzz = "2.0"
freetype2 = "20.0.14"
libxml2 = { name = "libxml-2.0", version = "2.9" }
+[features]
+c-api = []
+test-utils = ["yeslogic-fontconfig-sys"]
+
[lib]
name = "rsvg"
crate-type = [ "staticlib", "rlib" ]
@@ -69,14 +76,13 @@ regex = "1.7.1"
rgb = { version="0.8", features=["argb"] }
selectors = "0.24.0"
string_cache = "0.8.0"
-#thiserror = "1.0"
tinyvec = { version = "1.2.0", features = ["alloc"] }
url = "2"
xml5ever = "0.17.0"
+yeslogic-fontconfig-sys = { version = "4.0.1", optional = true }
[dev-dependencies]
anyhow = "1.0"
-assert_cmd = "2.0.2"
chrono = { version = "0.4.23", default-features = false, features = ["clock", "std"] }
criterion = "0.4"
lopdf = "0.29.0"
@@ -88,10 +94,9 @@ quick-error = "2.0.0"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
tempfile = "3"
-yeslogic-fontconfig-sys = "4.0.1"
+#librsvg = { path = ".", features = ["tests"] }
[build-dependencies]
-regex = "1.7.1"
system-deps = "6.0.0"
[[bench]]
diff --git a/rsvg/build.rs b/rsvg/build.rs
index 7a46d6c6..92037d16 100644
--- a/rsvg/build.rs
+++ b/rsvg/build.rs
@@ -1,8 +1,6 @@
-use regex::Regex;
use std::env;
use std::fs::File;
-use std::io::prelude::*;
-use std::io::{BufReader, BufWriter, Write};
+use std::io::{BufWriter, Write};
use std::path::Path;
use std::process;
@@ -13,7 +11,6 @@ fn main() {
}
generate_srgb_tables();
- write_version();
}
/// Converts an sRGB color value to a linear sRGB color value (undoes the gamma correction).
@@ -63,64 +60,3 @@ fn generate_srgb_tables() {
print_table(&mut file, "LINEARIZE", linearize, 256);
print_table(&mut file, "UNLINEARIZE", unlinearize, 256);
}
-
-fn write_version() {
- let mut major = None;
- let mut minor = None;
- let mut micro = None;
-
- {
- let file = File::open("../configure.ac")
- .expect("builds must take place within the librsvg source tree");
-
- let major_regex = Regex::new(r#"^m4_define\(\[rsvg_major_version\],\[(\d+)\]\)"#).unwrap();
- let minor_regex = Regex::new(r#"^m4_define\(\[rsvg_minor_version\],\[(\d+)\]\)"#).unwrap();
- let micro_regex = Regex::new(r#"^m4_define\(\[rsvg_micro_version\],\[(\d+)\]\)"#).unwrap();
-
- for line in BufReader::new(file).lines() {
- match line {
- Ok(line) => {
- if let Some(nums) = major_regex.captures(&line) {
- major = Some(String::from(
- nums.get(1).expect("major_regex matched once").as_str(),
- ));
- } else if let Some(nums) = minor_regex.captures(&line) {
- minor = Some(String::from(
- nums.get(1).expect("minor_regex matched once").as_str(),
- ));
- } else if let Some(nums) = micro_regex.captures(&line) {
- micro = Some(String::from(
- nums.get(1).expect("micro_regex matched once").as_str(),
- ));
- }
- }
-
- Err(e) => panic!("could not parse version from configure.ac: {e}"),
- }
- }
- }
-
- let output = Path::new(&env::var("OUT_DIR").unwrap()).join("version.rs");
- let mut file = File::create(output).expect("open version.rs for writing");
- file.write_all(
- format!(
- r#"
-use std::os::raw::c_uint;
-
-#[no_mangle]
-pub static rsvg_major_version: c_uint = {};
-
-#[no_mangle]
-pub static rsvg_minor_version: c_uint = {};
-
-#[no_mangle]
-pub static rsvg_micro_version: c_uint = {};
-"#,
- major.expect("major version is set"),
- minor.expect("minor version is set"),
- micro.expect("micro version is set")
- )
- .as_bytes(),
- )
- .expect("write version.rs");
-}
diff --git a/example.svg b/rsvg/example.svg
index 1a6c762d..1a6c762d 100644
--- a/example.svg
+++ b/rsvg/example.svg
diff --git a/rsvg/src/api.rs b/rsvg/src/api.rs
index beaee9a9..34945afa 100644
--- a/rsvg/src/api.rs
+++ b/rsvg/src/api.rs
@@ -6,6 +6,7 @@
pub use crate::{
accept_language::{AcceptLanguage, Language},
+ dpi::Dpi,
error::{ImplementationLimit, LoadingError, RenderingError},
length::{LengthUnit, RsvgLength as Length},
};
@@ -22,7 +23,6 @@ use locale_config::{LanguageRange, Locale};
use crate::{
accept_language::{LanguageTags, UserLanguage},
- dpi::Dpi,
handle::{Handle, LoadOptions},
session::Session,
url_resolver::UrlResolver,
@@ -64,14 +64,19 @@ impl Loader {
/// ```
#[allow(clippy::new_without_default)]
pub fn new() -> Self {
- Self::new_with_session(Session::default())
+ Self {
+ unlimited_size: false,
+ keep_image_data: false,
+ session: Session::default(),
+ }
}
/// Creates a `Loader` from a pre-created [`Session`].
///
/// This is useful when a `Loader` must be created by the C API, which should already
/// have created a session for logging.
- pub(crate) fn new_with_session(session: Session) -> Self {
+ #[cfg(feature = "c-api")]
+ pub fn new_with_session(session: Session) -> Self {
Self {
unlimited_size: false,
keep_image_data: false,
@@ -615,6 +620,17 @@ impl<'a> CairoRenderer<'a> {
)
}
+ /// Returns DPI TODO
+ pub fn dpi(&self) -> Dpi {
+ self.dpi
+ }
+
+ /// Questionable Special function TODO
+ #[cfg(feature = "c-api")]
+ pub fn handle(&self) -> &Handle {
+ &self.handle.handle
+ }
+
/// Turns on test mode. Do not use this function; it is for librsvg's test suite only.
pub fn test_mode(self, is_testing: bool) -> Self {
CairoRenderer { is_testing, ..self }
diff --git a/rsvg/src/lib.rs b/rsvg/src/lib.rs
index bfe2e73d..6d470d59 100644
--- a/rsvg/src/lib.rs
+++ b/rsvg/src/lib.rs
@@ -218,6 +218,10 @@ mod url_resolver;
mod viewbox;
mod xml;
+#[cfg(feature = "test-utils")]
+#[doc(hidden)]
+pub mod test_utils;
+
#[doc(hidden)]
pub mod bench_only {
pub use crate::path_builder::PathBuilder;
@@ -225,6 +229,13 @@ pub mod bench_only {
}
#[doc(hidden)]
+#[cfg(feature = "c-api")]
+pub mod c_api_only {
+ pub use crate::handle::Handle;
+ pub use crate::session::Session;
+}
+
+#[doc(hidden)]
pub mod doctest_only {
pub use crate::aspect_ratio::AspectRatio;
pub use crate::error::AttributeResultExt;
@@ -239,7 +250,6 @@ pub mod doctest_only {
#[doc(hidden)]
pub mod rsvg_convert_only {
pub use crate::aspect_ratio::AspectRatio;
- pub use crate::dpi::Dpi;
pub use crate::error::ParseError;
pub use crate::length::{
CssLength, Horizontal, Length, Normalize, NormalizeParams, Signed, ULength, Unsigned,
diff --git a/rsvg/tests/src/compare_surfaces.rs b/rsvg/src/test_utils/compare_surfaces.rs
index 0a170441..06100db9 100644
--- a/rsvg/tests/src/compare_surfaces.rs
+++ b/rsvg/src/test_utils/compare_surfaces.rs
@@ -1,6 +1,6 @@
use std::fmt;
-use rsvg::surface_utils::{
+use crate::surface_utils::{
iterators::Pixels,
shared_surface::{SharedImageSurface, SurfaceType},
ImageSurfaceDataExt, Pixel, PixelOps,
diff --git a/rsvg/tests/src/utils.rs b/rsvg/src/test_utils/mod.rs
index 158fc77e..c5aabb91 100644
--- a/rsvg/tests/src/utils.rs
+++ b/rsvg/src/test_utils/mod.rs
@@ -1,5 +1,5 @@
-#![cfg(test)]
-#![allow(unused)]
+pub mod compare_surfaces;
+pub mod reference_utils;
use cairo;
use gio;
@@ -10,7 +10,7 @@ use std::env;
use std::ffi::CString;
use std::sync::Once;
-use rsvg::{
+use crate::{
surface_utils::shared_surface::{SharedImageSurface, SurfaceType},
CairoRenderer, Loader, LoadingError, RenderingError, SvgHandle,
};
diff --git a/rsvg/tests/src/reference_utils.rs b/rsvg/src/test_utils/reference_utils.rs
index 8232d4c9..9f4a51d5 100644
--- a/rsvg/tests/src/reference_utils.rs
+++ b/rsvg/src/test_utils/reference_utils.rs
@@ -12,9 +12,9 @@ use std::io::{BufReader, Read};
use std::path::{Path, PathBuf};
use std::sync::Once;
-use rsvg::surface_utils::shared_surface::{SharedImageSurface, SurfaceType};
+use crate::surface_utils::shared_surface::{SharedImageSurface, SurfaceType};
-use crate::compare_surfaces::{compare_surfaces, BufferDiff, Diff};
+use super::compare_surfaces::{compare_surfaces, BufferDiff, Diff};
pub struct Reference(SharedImageSurface);
@@ -23,7 +23,7 @@ impl Reference {
where
P: AsRef<Path>,
{
- let file = File::open(path).map_err(|e| cairo::IoError::Io(e))?;
+ let file = File::open(path).map_err(cairo::IoError::Io)?;
let mut reader = BufReader::new(file);
let surface = surface_from_png(&mut reader)?;
Self::from_surface(surface)
@@ -100,7 +100,7 @@ impl Evaluate for Result<BufferDiff, cairo::IoError> {
}
fn write_to_file(input: &SharedImageSurface, output_base_name: &str, suffix: &str) {
- let path = output_dir().join(&format!("{}-{}.png", output_base_name, suffix));
+ let path = output_dir().join(format!("{}-{}.png", output_base_name, suffix));
println!("{}: {}", suffix, path.to_string_lossy());
let mut output_file = File::create(path).unwrap();
input
@@ -191,7 +191,7 @@ macro_rules! test_compare_render_output {
($test_name:ident, $width:expr, $height:expr, $test:expr, $reference:expr $(,)?) => {
#[test]
fn $test_name() {
- crate::utils::setup_font_map();
+ $crate::test_utils::setup_font_map();
let sx: i32 = $width;
let sy: i32 = $height;
@@ -235,10 +235,10 @@ macro_rules! test_svg_reference {
($test_name:ident, $test_filename:expr, $reference_filename:expr) => {
#[test]
fn $test_name() {
- use crate::reference_utils::{Compare, Evaluate, Reference};
- use crate::utils::{render_document, setup_font_map, SurfaceSize};
use cairo;
use rsvg::{CairoRenderer, Loader};
+ use $crate::test_utils::reference_utils::{Compare, Evaluate, Reference};
+ use $crate::test_utils::{render_document, setup_font_map, SurfaceSize};
setup_font_map();
diff --git a/rsvg/tests/src/api.rs b/rsvg/tests/src/api.rs
index 7846b2cb..88735ec0 100644
--- a/rsvg/tests/src/api.rs
+++ b/rsvg/tests/src/api.rs
@@ -2,8 +2,8 @@ use cairo;
use rsvg::surface_utils::shared_surface::{SharedImageSurface, SurfaceType};
use rsvg::{CairoRenderer, RenderingError};
-use crate::reference_utils::{Compare, Evaluate, Reference};
-use crate::utils::load_svg;
+use rsvg::test_utils::load_svg;
+use rsvg::test_utils::reference_utils::{Compare, Evaluate, Reference};
#[test]
fn has_element_with_id_works() {
diff --git a/rsvg/tests/src/bugs.rs b/rsvg/tests/src/bugs.rs
index 6fb75f7c..447e5159 100644
--- a/rsvg/tests/src/bugs.rs
+++ b/rsvg/tests/src/bugs.rs
@@ -2,8 +2,8 @@ use cairo;
use matches::matches;
use rsvg::{CairoRenderer, Loader, LoadingError, SvgHandle};
-use crate::reference_utils::{Compare, Evaluate, Reference};
-use crate::utils::{load_svg, render_document, setup_font_map, setup_language, SurfaceSize};
+use rsvg::test_utils::reference_utils::{Compare, Evaluate, Reference};
+use rsvg::test_utils::{load_svg, render_document, setup_font_map, setup_language, SurfaceSize};
// https://gitlab.gnome.org/GNOME/librsvg/issues/335
#[test]
diff --git a/rsvg/tests/src/cmdline/mod.rs b/rsvg/tests/src/cmdline/mod.rs
deleted file mode 100644
index c694bf2e..00000000
--- a/rsvg/tests/src/cmdline/mod.rs
+++ /dev/null
@@ -1 +0,0 @@
-mod rsvg_convert;
diff --git a/rsvg/tests/src/filters.rs b/rsvg/tests/src/filters.rs
index 9517e651..28fc867c 100644
--- a/rsvg/tests/src/filters.rs
+++ b/rsvg/tests/src/filters.rs
@@ -1,8 +1,8 @@
use cairo;
-use crate::reference_utils::{Compare, Evaluate, Reference};
-use crate::utils::{load_svg, render_document, SurfaceSize};
-use crate::{test_compare_render_output, test_svg_reference};
+use rsvg::test_utils::reference_utils::{Compare, Evaluate, Reference};
+use rsvg::test_utils::{load_svg, render_document, SurfaceSize};
+use rsvg::{test_compare_render_output, test_svg_reference};
#[test]
fn invalid_filter_reference_cancels_filter_chain() {
diff --git a/rsvg/tests/src/intrinsic_dimensions.rs b/rsvg/tests/src/intrinsic_dimensions.rs
index 4ca31f93..fdbec145 100644
--- a/rsvg/tests/src/intrinsic_dimensions.rs
+++ b/rsvg/tests/src/intrinsic_dimensions.rs
@@ -2,8 +2,8 @@ use cairo;
use rsvg::{CairoRenderer, IntrinsicDimensions, Length, LengthUnit, RenderingError};
-use crate::reference_utils::{Compare, Evaluate, Reference};
-use crate::utils::{load_svg, render_document, SurfaceSize};
+use rsvg::test_utils::reference_utils::{Compare, Evaluate, Reference};
+use rsvg::test_utils::{load_svg, render_document, SurfaceSize};
#[test]
fn no_intrinsic_dimensions() {
diff --git a/rsvg/tests/src/main.rs b/rsvg/tests/src/main.rs
deleted file mode 100644
index 467cbb47..00000000
--- a/rsvg/tests/src/main.rs
+++ /dev/null
@@ -1,60 +0,0 @@
-#[cfg(test)]
-mod api;
-
-#[cfg(test)]
-mod bugs;
-
-#[cfg(test)]
-mod cmdline;
-
-#[cfg(test)]
-mod compare_surfaces;
-
-#[cfg(test)]
-mod errors;
-
-#[cfg(test)]
-mod filters;
-
-#[cfg(test)]
-mod geometries;
-
-#[cfg(test)]
-mod intrinsic_dimensions;
-
-#[cfg(test)]
-mod legacy_sizing;
-
-#[cfg(test)]
-mod loading_crash;
-
-#[cfg(test)]
-mod predicates;
-
-#[cfg(test)]
-mod primitive_geometries;
-
-#[cfg(test)]
-mod primitives;
-
-#[cfg(test)]
-mod reference;
-
-#[cfg(test)]
-mod reference_utils;
-
-#[cfg(test)]
-mod render_crash;
-
-#[cfg(test)]
-mod shapes;
-
-#[cfg(test)]
-mod text;
-
-#[cfg(test)]
-mod utils;
-
-fn main() {
- println!("Use 'cargo test' to run the tests.");
-}
diff --git a/rsvg/tests/src/predicates/mod.rs b/rsvg/tests/src/predicates/mod.rs
deleted file mode 100644
index e14061f0..00000000
--- a/rsvg/tests/src/predicates/mod.rs
+++ /dev/null
@@ -1,10 +0,0 @@
-pub mod file;
-mod pdf;
-mod png;
-mod svg;
-
-use predicates::str;
-
-pub fn ends_with_pkg_version() -> str::EndsWithPredicate {
- str::ends_with(env!("CARGO_PKG_VERSION"))
-}
diff --git a/rsvg/tests/src/primitives.rs b/rsvg/tests/src/primitives.rs
index b12906f4..b24c1a6a 100644
--- a/rsvg/tests/src/primitives.rs
+++ b/rsvg/tests/src/primitives.rs
@@ -1,8 +1,8 @@
use cairo;
-use crate::reference_utils::{Compare, Evaluate, Reference};
-use crate::test_compare_render_output;
-use crate::utils::{load_svg, render_document, SurfaceSize};
+use rsvg::test_compare_render_output;
+use rsvg::test_utils::reference_utils::{Compare, Evaluate, Reference};
+use rsvg::test_utils::{load_svg, render_document, SurfaceSize};
#[test]
fn simple_opacity_with_transform() {
diff --git a/rsvg/tests/src/reference.rs b/rsvg/tests/src/reference.rs
index 37f1a562..37eed1b1 100644
--- a/rsvg/tests/src/reference.rs
+++ b/rsvg/tests/src/reference.rs
@@ -12,9 +12,9 @@ use rsvg::{
CairoRenderer, IntrinsicDimensions, Length, Loader,
};
-use crate::reference_utils::{Compare, Evaluate, Reference};
-use crate::utils::{load_svg, render_document, setup_font_map, setup_language, SurfaceSize};
-use crate::{test_compare_render_output, test_svg_reference};
+use rsvg::test_utils::reference_utils::{Compare, Evaluate, Reference};
+use rsvg::test_utils::{load_svg, render_document, setup_font_map, setup_language, SurfaceSize};
+use rsvg::{test_compare_render_output, test_svg_reference};
use std::path::{Path, PathBuf};
diff --git a/rsvg/tests/src/shapes.rs b/rsvg/tests/src/shapes.rs
index 8545b79d..23a75d49 100644
--- a/rsvg/tests/src/shapes.rs
+++ b/rsvg/tests/src/shapes.rs
@@ -1,4 +1,4 @@
-use crate::test_svg_reference;
+use rsvg::test_svg_reference;
test_svg_reference!(
ellipse_auto_rx_ry,
diff --git a/rsvg/tests/src/text.rs b/rsvg/tests/src/text.rs
index 257d7f0c..05c3de3e 100644
--- a/rsvg/tests/src/text.rs
+++ b/rsvg/tests/src/text.rs
@@ -2,9 +2,9 @@ use cairo;
use float_cmp::approx_eq;
use rsvg::{CairoRenderer, Loader};
-use crate::reference_utils::{Compare, Evaluate, Reference};
-use crate::utils::{load_svg, render_document, setup_font_map, SurfaceSize};
-use crate::{test_compare_render_output, test_svg_reference};
+use rsvg::test_utils::reference_utils::{Compare, Evaluate, Reference};
+use rsvg::test_utils::{load_svg, render_document, setup_font_map, SurfaceSize};
+use rsvg::{test_compare_render_output, test_svg_reference};
// From https://www.w3.org/Style/CSS/Test/Fonts/Ahem/
//