diff options
-rw-r--r-- | Cargo.lock | 17 | ||||
-rw-r--r-- | Cargo.toml | 3 | ||||
-rw-r--r-- | librsvg-c/Cargo.toml | 19 | ||||
-rw-r--r-- | librsvg-c/build.rs | 126 | ||||
-rw-r--r-- | librsvg-c/src/c_api/dpi.rs (renamed from rsvg/src/c_api/dpi.rs) | 0 | ||||
-rw-r--r-- | librsvg-c/src/c_api/handle.rs (renamed from rsvg/src/c_api/handle.rs) | 0 | ||||
-rw-r--r-- | librsvg-c/src/c_api/messages.rs (renamed from rsvg/src/c_api/messages.rs) | 0 | ||||
-rw-r--r-- | librsvg-c/src/c_api/mod.rs (renamed from rsvg/src/c_api/mod.rs) | 0 | ||||
-rw-r--r-- | librsvg-c/src/c_api/pixbuf_utils.rs (renamed from rsvg/src/c_api/pixbuf_utils.rs) | 0 | ||||
-rw-r--r-- | librsvg-c/src/c_api/sizing.rs (renamed from rsvg/src/c_api/sizing.rs) | 0 | ||||
-rw-r--r-- | librsvg-c/src/lib.rs | 1 | ||||
-rw-r--r-- | rsvg/src/lib.rs | 3 |
12 files changed, 165 insertions, 4 deletions
@@ -1163,6 +1163,23 @@ dependencies = [ ] [[package]] +name = "librsvg-c" +version = "0.1.0" +dependencies = [ + "cairo-rs", + "cast", + "float-cmp", + "gdk-pixbuf", + "gio", + "glib", + "libc", + "librsvg", + "once_cell", + "regex", + "url", +] + +[[package]] name = "link-cplusplus" version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -15,10 +15,11 @@ overflow-checks = true [workspace] members = [ "gdk-pixbuf-loader", + "librsvg-c", "rsvg", "rsvg-convert", "rsvg-bench", ] default-members = [ "rsvg-convert", -]
\ No newline at end of file +] diff --git a/librsvg-c/Cargo.toml b/librsvg-c/Cargo.toml new file mode 100644 index 00000000..cb2209cd --- /dev/null +++ b/librsvg-c/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "librsvg-c" +version = "0.1.0" +edition = "2021" + +[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" +gdk-pixbuf = "0.17" +libc = "0.2" +float-cmp = "0.9.0" +url = "2" +once_cell = "1.2.0" + +[build-dependencies] +regex = "1.7.1"
\ No newline at end of file diff --git a/librsvg-c/build.rs b/librsvg-c/build.rs new file mode 100644 index 00000000..7a46d6c6 --- /dev/null +++ b/librsvg-c/build.rs @@ -0,0 +1,126 @@ +use regex::Regex; +use std::env; +use std::fs::File; +use std::io::prelude::*; +use std::io::{BufReader, BufWriter, 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; + 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/rsvg/src/c_api/dpi.rs b/librsvg-c/src/c_api/dpi.rs index b2e15eef..b2e15eef 100644 --- a/rsvg/src/c_api/dpi.rs +++ b/librsvg-c/src/c_api/dpi.rs diff --git a/rsvg/src/c_api/handle.rs b/librsvg-c/src/c_api/handle.rs index 1698cc17..1698cc17 100644 --- a/rsvg/src/c_api/handle.rs +++ b/librsvg-c/src/c_api/handle.rs diff --git a/rsvg/src/c_api/messages.rs b/librsvg-c/src/c_api/messages.rs index 5b227cb8..5b227cb8 100644 --- a/rsvg/src/c_api/messages.rs +++ b/librsvg-c/src/c_api/messages.rs diff --git a/rsvg/src/c_api/mod.rs b/librsvg-c/src/c_api/mod.rs index febca033..febca033 100644 --- a/rsvg/src/c_api/mod.rs +++ b/librsvg-c/src/c_api/mod.rs diff --git a/rsvg/src/c_api/pixbuf_utils.rs b/librsvg-c/src/c_api/pixbuf_utils.rs index 710f2c4b..710f2c4b 100644 --- a/rsvg/src/c_api/pixbuf_utils.rs +++ b/librsvg-c/src/c_api/pixbuf_utils.rs diff --git a/rsvg/src/c_api/sizing.rs b/librsvg-c/src/c_api/sizing.rs index e0c85bd1..e0c85bd1 100644 --- a/rsvg/src/c_api/sizing.rs +++ b/librsvg-c/src/c_api/sizing.rs diff --git a/librsvg-c/src/lib.rs b/librsvg-c/src/lib.rs new file mode 100644 index 00000000..ec407516 --- /dev/null +++ b/librsvg-c/src/lib.rs @@ -0,0 +1 @@ +pub use c_api; diff --git a/rsvg/src/lib.rs b/rsvg/src/lib.rs index 345c559e..bfe2e73d 100644 --- a/rsvg/src/lib.rs +++ b/rsvg/src/lib.rs @@ -175,7 +175,6 @@ mod angle; mod api; mod aspect_ratio; mod bbox; -pub mod c_api; mod color; mod cond; mod css; @@ -240,8 +239,6 @@ pub mod doctest_only { #[doc(hidden)] pub mod rsvg_convert_only { pub use crate::aspect_ratio::AspectRatio; - pub use crate::c_api::handle::PathOrUrl; - pub use crate::c_api::sizing::LegacySize; pub use crate::dpi::Dpi; pub use crate::error::ParseError; pub use crate::length::{ |