diff options
-rw-r--r-- | Cargo.lock | 6 | ||||
-rw-r--r-- | Cargo.toml | 4 | ||||
-rw-r--r-- | src/backend_cairo/mask.rs | 2 | ||||
-rw-r--r-- | src/backend_cairo/pattern.rs | 2 | ||||
-rw-r--r-- | src/backend_qt/mask.rs | 2 | ||||
-rw-r--r-- | src/backend_qt/pattern.rs | 2 | ||||
-rw-r--r-- | src/backend_utils/filter.rs | 20 | ||||
-rw-r--r-- | src/geom.rs | 30 |
8 files changed, 50 insertions, 18 deletions
@@ -472,7 +472,7 @@ dependencies = [ "resvg-qt 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "rgb 0.8.11 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-segmentation 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "usvg 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "usvg 0.4.0 (git+https://github.com/RazrFalcon/usvg.git?rev=5892ebe)", ] [[package]] @@ -582,7 +582,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "usvg" version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" +source = "git+https://github.com/RazrFalcon/usvg.git?rev=5892ebe#5892ebe41203540d2c4004959aa8d85e6a6a3d6e" dependencies = [ "base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", "libflate 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", @@ -677,7 +677,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "d825be0eb33fda1a7e68012d51e9c7f451dc1a69391e7fdc197060bb8c56667b" "checksum unicode-segmentation 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "aa6024fc12ddfd1c6dbc14a80fa2324d4568849869b779f6bd37e5e4c03344d1" "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" -"checksum usvg 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f9ebf4d5244ba2e8305caf9de7949377794ecdea5a9e3c84fc5610d78d21f5ee" +"checksum usvg 0.4.0 (git+https://github.com/RazrFalcon/usvg.git?rev=5892ebe)" = "<none>" "checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0" "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" @@ -30,7 +30,9 @@ travis-ci = { repository = "RazrFalcon/resvg" } [dependencies] log = "0.4.5" rgb = "0.8.9" -usvg = "0.4" +#usvg = "0.4" +usvg = { git = "https://github.com/RazrFalcon/usvg.git", rev = "5892ebe" } +#usvg = { path = "../usvg" } unicode-segmentation = "1.2.1" # cairo backend diff --git a/src/backend_cairo/mask.rs b/src/backend_cairo/mask.rs index 7b364f5..6a93dc9 100644 --- a/src/backend_cairo/mask.rs +++ b/src/backend_cairo/mask.rs @@ -30,7 +30,7 @@ pub fn apply( mask_cr.set_matrix(sub_cr.get_matrix()); let r = if mask.units == usvg::Units::ObjectBoundingBox { - mask.rect.transform(usvg::Transform::from_bbox(bbox)) + mask.rect.bbox_transform(bbox) } else { mask.rect }; diff --git a/src/backend_cairo/pattern.rs b/src/backend_cairo/pattern.rs index 9b81b5e..96a8b6a 100644 --- a/src/backend_cairo/pattern.rs +++ b/src/backend_cairo/pattern.rs @@ -24,7 +24,7 @@ pub fn apply( cr: &cairo::Context, ) { let r = if pattern.units == usvg::Units::ObjectBoundingBox { - pattern.rect.transform(usvg::Transform::from_bbox(bbox)) + pattern.rect.bbox_transform(bbox) } else { pattern.rect }; diff --git a/src/backend_qt/mask.rs b/src/backend_qt/mask.rs index febe82b..46d20d9 100644 --- a/src/backend_qt/mask.rs +++ b/src/backend_qt/mask.rs @@ -27,7 +27,7 @@ pub fn apply( mask_p.set_transform(&sub_p.get_transform()); let r = if mask.units == usvg::Units::ObjectBoundingBox { - mask.rect.transform(usvg::Transform::from_bbox(bbox)) + mask.rect.bbox_transform(bbox) } else { mask.rect }; diff --git a/src/backend_qt/pattern.rs b/src/backend_qt/pattern.rs index 2401cbf..f609e95 100644 --- a/src/backend_qt/pattern.rs +++ b/src/backend_qt/pattern.rs @@ -20,7 +20,7 @@ pub fn apply( brush: &mut qt::Brush, ) { let r = if pattern.units == usvg::Units::ObjectBoundingBox { - pattern.rect.transform(usvg::Transform::from_bbox(bbox)) + pattern.rect.bbox_transform(bbox) } else { pattern.rect }; diff --git a/src/backend_utils/filter.rs b/src/backend_utils/filter.rs index 11b850e..12f9366 100644 --- a/src/backend_utils/filter.rs +++ b/src/backend_utils/filter.rs @@ -610,12 +610,17 @@ fn calc_subregion<T: ImageExt>( usvg::FilterKind::FeImage(..) => { // `feImage` uses the object bbox. if filter.primitive_units == usvg::Units::ObjectBoundingBox { - return Rect::new( - bbox.x + bbox.width * primitive.x.unwrap_or(0.0), - bbox.y + bbox.height * primitive.y.unwrap_or(0.0), - bbox.width * primitive.width.unwrap_or(1.0), - bbox.height * primitive.height.unwrap_or(1.0), - ).transform(*ts).to_screen_rect(); + // TODO: wrong + let ts_bbox = Rect::new(ts.e, ts.f, ts.a, ts.d); + + let r = Rect::new( + primitive.x.unwrap_or(0.0), + primitive.y.unwrap_or(0.0), + primitive.width.unwrap_or(1.0), + primitive.height.unwrap_or(1.0), + ); + + return r.bbox_transform(bbox).bbox_transform(ts_bbox).to_screen_rect(); } else { filter_region } @@ -631,9 +636,8 @@ fn calc_subregion<T: ImageExt>( primitive.width.unwrap_or(1.0), primitive.height.unwrap_or(1.0), ); - let ts = usvg::Transform::from_bbox(subregion_bbox); - region.to_rect().transform(ts) + region.to_rect().bbox_transform(subregion_bbox) } else { let (dx, dy) = ts.get_translate(); let (sx, sy) = ts.get_scale(); diff --git a/src/geom.rs b/src/geom.rs index cccd26e..cf61bc9 100644 --- a/src/geom.rs +++ b/src/geom.rs @@ -97,12 +97,15 @@ fn size_scale(s1: ScreenSize, s2: ScreenSize, expand: bool) -> ScreenSize { pub trait RectExt { /// Creates a new `Rect` for bounding box calculation. /// - /// Shorthand for `Rect::from_xywh(f64::MAX, f64::MAX, 1.0, 1.0)`. + /// Shorthand for `Rect::new(f64::MAX, f64::MAX, 1.0, 1.0)`. fn new_bbox() -> Self; - /// Expands the `Rect` to the specified size. + /// Expands the `Rect` to the provided size. fn expand(&mut self, r: Rect); + /// Transforms the `Rect` using the provided `bbox`. + fn bbox_transform(&self, bbox: Rect) -> Self; + /// Returns rect's size in screen units. fn to_screen_size(&self) -> ScreenSize; @@ -132,6 +135,15 @@ impl RectExt for Rect { } } + fn bbox_transform(&self, bbox: Rect) -> Self { + let x = self.x * bbox.width + bbox.x; + let y = self.y * bbox.height + bbox.y; + let w = self.width * bbox.width; + let h = self.height * bbox.height; + + Self::new(x, y, w, h) + } + fn to_screen_size(&self) -> ScreenSize { self.size().to_screen_size() } @@ -245,3 +257,17 @@ impl From<(i32, i32, u32, u32)> for ScreenRect { fn f64_min(v1: f64, v2: f64) -> f64 { if v1 < v2 { v1 } else { v2 } } + + +#[cfg(test)] +mod tests { + use super::*; + use usvg::FuzzyEq; + + #[test] + fn bbox_transform_1() { + let r = Rect::new(10.0, 20.0, 30.0, 40.0); + assert!(r.bbox_transform(Rect::new(0.2, 0.3, 0.4, 0.5)) + .fuzzy_eq(&Rect::new(4.2, 10.3, 12.0, 20.0))); + } +} |