summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSophie Herold <sophie@hemio.de>2023-04-01 17:23:37 +0200
committerSophie Herold <sophie@hemio.de>2023-04-01 17:23:37 +0200
commit3330b38a3094e09edbb80fb85f3e5c3803f718a1 (patch)
tree23d3bc64370037b337b0f3cab895aea7b08eb743
parenteb8a6742dbb97dfbc75dbe10af79aba150ad0b45 (diff)
downloadlibrsvg-3330b38a3094e09edbb80fb85f3e5c3803f718a1.tar.gz
meta: Naive move of c_api to own crate
Part-of: <https://gitlab.gnome.org/GNOME/librsvg/-/merge_requests/822>
-rw-r--r--Cargo.lock17
-rw-r--r--Cargo.toml3
-rw-r--r--librsvg-c/Cargo.toml19
-rw-r--r--librsvg-c/build.rs126
-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.rs1
-rw-r--r--rsvg/src/lib.rs3
12 files changed, 165 insertions, 4 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 1cb14730..cb6644ef 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -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"
diff --git a/Cargo.toml b/Cargo.toml
index 2e17e6a9..50c5826a 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -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::{