summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRazrFalcon <razrfalcon@gmail.com>2018-12-06 16:58:54 +0200
committerRazrFalcon <razrfalcon@gmail.com>2018-12-06 17:06:46 +0200
commitd3c3aa9732c52998a9706baff53b89d84869e690 (patch)
tree0462b145434a4e85a9220f2c99fcd7557c580738 /src
parenta332ca2d4ae324df46ce394b4e45eb86cd10ff8e (diff)
(cairo-backend) Handle mask in a separate context.
Diffstat (limited to 'src')
-rw-r--r--src/backend_cairo/ext.rs4
-rw-r--r--src/backend_cairo/fill.rs2
-rw-r--r--src/backend_cairo/mask.rs18
-rw-r--r--src/backend_cairo/mod.rs24
-rw-r--r--src/backend_cairo/stroke.rs2
-rw-r--r--src/backend_qt/mask.rs4
-rw-r--r--src/backend_utils/mask.rs9
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;