diff options
author | RazrFalcon <razrfalcon@gmail.com> | 2018-12-06 16:58:54 +0200 |
---|---|---|
committer | RazrFalcon <razrfalcon@gmail.com> | 2018-12-06 17:06:46 +0200 |
commit | d3c3aa9732c52998a9706baff53b89d84869e690 (patch) | |
tree | 0462b145434a4e85a9220f2c99fcd7557c580738 /src | |
parent | a332ca2d4ae324df46ce394b4e45eb86cd10ff8e (diff) |
(cairo-backend) Handle mask in a separate context.
Diffstat (limited to 'src')
-rw-r--r-- | src/backend_cairo/ext.rs | 4 | ||||
-rw-r--r-- | src/backend_cairo/fill.rs | 2 | ||||
-rw-r--r-- | src/backend_cairo/mask.rs | 18 | ||||
-rw-r--r-- | src/backend_cairo/mod.rs | 24 | ||||
-rw-r--r-- | src/backend_cairo/stroke.rs | 2 | ||||
-rw-r--r-- | src/backend_qt/mask.rs | 4 | ||||
-rw-r--r-- | src/backend_utils/mask.rs | 9 |
7 files changed, 30 insertions, 33 deletions
diff --git a/src/backend_cairo/ext.rs b/src/backend_cairo/ext.rs index 3debf51..fcf5335 100644 --- a/src/backend_cairo/ext.rs +++ b/src/backend_cairo/ext.rs @@ -8,12 +8,12 @@ use usvg; pub trait ReCairoContextExt { - fn set_source_color(&self, color: &usvg::Color, opacity: usvg::Opacity); + fn set_source_color(&self, color: usvg::Color, opacity: usvg::Opacity); fn reset_source_rgba(&self); } impl ReCairoContextExt for cairo::Context { - fn set_source_color(&self, color: &usvg::Color, opacity: usvg::Opacity) { + fn set_source_color(&self, color: usvg::Color, opacity: usvg::Opacity) { self.set_source_rgba( color.red as f64 / 255.0, color.green as f64 / 255.0, diff --git a/src/backend_cairo/fill.rs b/src/backend_cairo/fill.rs index 4f621ec..dc3d675 100644 --- a/src/backend_cairo/fill.rs +++ b/src/backend_cairo/fill.rs @@ -25,7 +25,7 @@ pub fn apply( Some(ref fill) => { match fill.paint { usvg::Paint::Color(c) => { - cr.set_source_color(&c, fill.opacity); + cr.set_source_color(c, fill.opacity); } usvg::Paint::Link(ref id) => { if let Some(node) = tree.defs_by_id(id) { diff --git a/src/backend_cairo/mask.rs b/src/backend_cairo/mask.rs index 4750c52..9ff485d 100644 --- a/src/backend_cairo/mask.rs +++ b/src/backend_cairo/mask.rs @@ -19,8 +19,8 @@ pub fn apply( mask: &usvg::Mask, opt: &Options, bbox: Rect, - opacity: Option<usvg::Opacity>, layers: &mut CairoLayers, + sub_cr: &cairo::Context, cr: &cairo::Context, ) { let mask_surface = try_opt!(layers.get(), ()); @@ -49,11 +49,17 @@ pub fn apply( { let mut data = try_opt_warn!(mask_surface.get_data().ok(), (), "Failed to borrow a surface for mask: {:?}.", mask.id); - mask::image_to_mask(&mut data, layers.image_size(), opacity); + mask::image_to_mask(&mut data, layers.image_size()); } - let patt = cairo::SurfacePattern::create(&*mask_surface); - cr.set_matrix(cairo::Matrix::identity()); - cr.mask(&cairo::Pattern::SurfacePattern(patt)); - cr.reset_source_rgba(); + sub_cr.set_matrix(cairo::Matrix::identity()); + sub_cr.set_source_surface(&*mask_surface, 0.0, 0.0); + sub_cr.set_operator(cairo::Operator::DestIn); + sub_cr.paint(); + + // Reset operator. + sub_cr.set_operator(cairo::Operator::Over); + + // Reset source to unborrow the `mask_surface` from the `Context`. + sub_cr.reset_source_rgba(); } diff --git a/src/backend_cairo/mod.rs b/src/backend_cairo/mod.rs index 9238509..429e4b9 100644 --- a/src/backend_cairo/mod.rs +++ b/src/backend_cairo/mod.rs @@ -139,7 +139,7 @@ pub fn render_to_image( // Fill background. if let Some(color) = opt.background { - cr.set_source_color(&color, 1.0.into()); + cr.set_source_color(color, 1.0.into()); cr.paint(); } @@ -171,7 +171,7 @@ pub fn render_node_to_image( // Fill background. if let Some(color) = opt.background { - cr.set_source_color(&color, 1.0.into()); + cr.set_source_color(color, 1.0.into()); cr.paint(); } @@ -309,23 +309,21 @@ fn render_group_impl( } } - let curr_matrix = cr.get_matrix(); - cr.set_matrix(cairo::Matrix::identity()); - cr.set_source_surface(&*sub_surface, 0.0, 0.0); - if let Some(ref id) = g.mask { if let Some(mask_node) = node.tree().defs_by_id(id) { if let usvg::NodeKind::Mask(ref mask) = *mask_node.borrow() { - cr.set_matrix(curr_matrix); - mask::apply(&mask_node, mask, opt, bbox, g.opacity, layers, cr); + mask::apply(&mask_node, mask, opt, bbox, layers, &sub_cr, cr); } } + } + + let curr_matrix = cr.get_matrix(); + cr.set_matrix(cairo::Matrix::identity()); + cr.set_source_surface(&*sub_surface, 0.0, 0.0); + if let Some(opacity) = g.opacity { + cr.paint_with_alpha(*opacity); } else { - if let Some(opacity) = g.opacity { - cr.paint_with_alpha(*opacity); - } else { - cr.paint(); - } + cr.paint(); } cr.set_matrix(curr_matrix); diff --git a/src/backend_cairo/stroke.rs b/src/backend_cairo/stroke.rs index 8e6db8f..9a16d8b 100644 --- a/src/backend_cairo/stroke.rs +++ b/src/backend_cairo/stroke.rs @@ -25,7 +25,7 @@ pub fn apply( Some(ref stroke) => { match stroke.paint { usvg::Paint::Color(c) => { - cr.set_source_color(&c, stroke.opacity); + cr.set_source_color(c, stroke.opacity); } usvg::Paint::Link(ref id) => { if let Some(node) = tree.defs_by_id(id) { diff --git a/src/backend_qt/mask.rs b/src/backend_qt/mask.rs index a5a4c42..676a8f7 100644 --- a/src/backend_qt/mask.rs +++ b/src/backend_qt/mask.rs @@ -18,7 +18,7 @@ pub fn apply( bbox: Rect, layers: &mut QtLayers, sub_p: &mut qt::Painter, - p: &mut qt::Painter, + p: &qt::Painter, ) { let mask_img = try_opt!(layers.get(), ()); let mut mask_img = mask_img.borrow_mut(); @@ -42,7 +42,7 @@ pub fn apply( super::render_group(node, opt, layers, &mut mask_p); } - mask::image_to_mask(&mut mask_img.data_mut(), layers.image_size(), None); + mask::image_to_mask(&mut mask_img.data_mut(), layers.image_size()); sub_p.set_transform(&qt::Transform::default()); sub_p.set_composition_mode(qt::CompositionMode::DestinationIn); diff --git a/src/backend_utils/mask.rs b/src/backend_utils/mask.rs index 4527054..48b79a3 100644 --- a/src/backend_utils/mask.rs +++ b/src/backend_utils/mask.rs @@ -2,9 +2,6 @@ // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. -// external -use usvg; - // self use geom::*; @@ -13,7 +10,6 @@ use geom::*; pub fn image_to_mask( data: &mut [u8], img_size: ScreenSize, - opacity: Option<usvg::Opacity>, ) { let width = img_size.width; let height = img_size.height; @@ -31,10 +27,7 @@ pub fn image_to_mask( let g = data[idx + 1] as f64; let b = data[idx + 0] as f64; - let mut luma = r * coeff_r + g * coeff_g + b * coeff_b; - if let Some(opacity) = opacity { - luma *= opacity.value(); - } + let luma = r * coeff_r + g * coeff_g + b * coeff_b; data[idx + 0] = 0; data[idx + 1] = 0; |