2020-02-20 17:22:07 -05:00
|
|
|
// pathfinder/content/src/effects.rs
|
|
|
|
//
|
|
|
|
// Copyright © 2020 The Pathfinder Project Developers.
|
|
|
|
//
|
|
|
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
|
|
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
|
|
|
// option. This file may not be copied, modified, or distributed
|
|
|
|
// except according to those terms.
|
|
|
|
|
|
|
|
//! Special effects that can be applied to layers.
|
|
|
|
|
|
|
|
use pathfinder_color::ColorF;
|
|
|
|
|
|
|
|
/// This intentionally does not precisely match what Core Graphics does (a
|
|
|
|
/// Lanczos function), because we don't want any ringing artefacts.
|
|
|
|
pub static DEFRINGING_KERNEL_CORE_GRAPHICS: DefringingKernel =
|
|
|
|
DefringingKernel([0.033165660, 0.102074051, 0.221434336, 0.286651906]);
|
|
|
|
pub static DEFRINGING_KERNEL_FREETYPE: DefringingKernel =
|
|
|
|
DefringingKernel([0.0, 0.031372549, 0.301960784, 0.337254902]);
|
|
|
|
|
|
|
|
/// Should match macOS 10.13 High Sierra.
|
|
|
|
pub static STEM_DARKENING_FACTORS: [f32; 2] = [0.0121, 0.0121 * 1.25];
|
|
|
|
|
|
|
|
/// Should match macOS 10.13 High Sierra.
|
|
|
|
pub const MAX_STEM_DARKENING_AMOUNT: [f32; 2] = [0.3, 0.3];
|
|
|
|
|
|
|
|
/// This value is a subjective cutoff. Above this ppem value, no stem darkening is performed.
|
|
|
|
pub const MAX_STEM_DARKENING_PIXELS_PER_EM: f32 = 72.0;
|
|
|
|
|
|
|
|
/// Effects that can be applied to a layer.
|
|
|
|
#[derive(Clone, Copy, Debug)]
|
|
|
|
pub struct Effects {
|
|
|
|
/// The shader that should be used when compositing this layer onto its destination.
|
|
|
|
pub filter: Filter,
|
|
|
|
}
|
|
|
|
|
|
|
|
/// The shader that should be used when compositing this layer onto its destination.
|
|
|
|
#[derive(Clone, Copy, Debug)]
|
|
|
|
pub enum Filter {
|
|
|
|
/// A compositing operation.
|
|
|
|
Composite(CompositeOp),
|
|
|
|
/// Performs postprocessing operations useful for monochrome text.
|
|
|
|
Text {
|
|
|
|
/// The foreground color of the text.
|
|
|
|
fg_color: ColorF,
|
|
|
|
/// The background color of the text.
|
|
|
|
bg_color: ColorF,
|
|
|
|
/// The kernel used for defringing, if subpixel AA is enabled.
|
|
|
|
defringing_kernel: Option<DefringingKernel>,
|
|
|
|
/// Whether gamma correction is used when compositing.
|
|
|
|
///
|
|
|
|
/// If this is enabled, stem darkening is advised.
|
|
|
|
gamma_correction: bool,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Clone, Copy, Debug)]
|
|
|
|
pub enum CompositeOp {
|
|
|
|
/// The default.
|
2020-02-21 01:22:15 -05:00
|
|
|
SrcOver,
|
2020-02-20 17:22:07 -05:00
|
|
|
}
|
|
|
|
|
2020-02-22 17:39:03 -05:00
|
|
|
/// Blend modes that can be applied to individual paths.
|
2020-02-20 18:52:40 -05:00
|
|
|
#[derive(Clone, Copy, PartialEq, Debug)]
|
|
|
|
pub enum BlendMode {
|
2020-02-25 00:23:17 -05:00
|
|
|
// Supported by GPU blender
|
2020-02-20 18:52:40 -05:00
|
|
|
Clear,
|
2020-02-21 01:22:15 -05:00
|
|
|
SrcOver,
|
|
|
|
DestOver,
|
|
|
|
DestOut,
|
|
|
|
SrcAtop,
|
|
|
|
Xor,
|
|
|
|
Lighter,
|
2020-02-20 23:38:43 -05:00
|
|
|
Lighten,
|
|
|
|
Darken,
|
2020-02-25 00:23:17 -05:00
|
|
|
|
2020-02-25 15:52:11 -05:00
|
|
|
// Porter-Duff
|
|
|
|
SrcIn,
|
|
|
|
DestIn,
|
|
|
|
SrcOut,
|
|
|
|
DestAtop,
|
|
|
|
|
2020-02-25 00:23:17 -05:00
|
|
|
// Overlay
|
|
|
|
Multiply,
|
|
|
|
Screen,
|
|
|
|
HardLight,
|
|
|
|
Overlay,
|
|
|
|
|
2020-02-25 14:37:42 -05:00
|
|
|
// Dodge/burn
|
|
|
|
ColorDodge,
|
|
|
|
ColorBurn,
|
|
|
|
|
2020-02-25 00:23:17 -05:00
|
|
|
// HSL
|
2020-02-22 17:39:03 -05:00
|
|
|
Hue,
|
|
|
|
Saturation,
|
|
|
|
Color,
|
|
|
|
Luminosity,
|
2020-02-20 18:52:40 -05:00
|
|
|
}
|
|
|
|
|
2020-02-20 17:22:07 -05:00
|
|
|
#[derive(Clone, Copy, PartialEq, Debug)]
|
|
|
|
pub struct DefringingKernel(pub [f32; 4]);
|
|
|
|
|
|
|
|
impl Default for CompositeOp {
|
|
|
|
#[inline]
|
|
|
|
fn default() -> CompositeOp {
|
2020-02-21 01:22:15 -05:00
|
|
|
CompositeOp::SrcOver
|
2020-02-20 17:22:07 -05:00
|
|
|
}
|
|
|
|
}
|
2020-02-20 18:52:40 -05:00
|
|
|
|
|
|
|
impl Default for BlendMode {
|
|
|
|
#[inline]
|
|
|
|
fn default() -> BlendMode {
|
2020-02-21 01:22:15 -05:00
|
|
|
BlendMode::SrcOver
|
2020-02-20 18:52:40 -05:00
|
|
|
}
|
|
|
|
}
|
2020-02-20 21:15:20 -05:00
|
|
|
|
|
|
|
impl BlendMode {
|
|
|
|
/// Whether the backdrop is irrelevant when applying this blend mode (i.e. destination blend
|
2020-02-21 01:22:15 -05:00
|
|
|
/// factor is zero when source alpha is one).
|
2020-02-20 21:15:20 -05:00
|
|
|
#[inline]
|
|
|
|
pub fn occludes_backdrop(self) -> bool {
|
|
|
|
match self {
|
2020-02-21 01:22:15 -05:00
|
|
|
BlendMode::SrcOver | BlendMode::Clear => true,
|
|
|
|
BlendMode::DestOver |
|
|
|
|
BlendMode::DestOut |
|
|
|
|
BlendMode::SrcAtop |
|
|
|
|
BlendMode::Xor |
|
|
|
|
BlendMode::Lighter |
|
|
|
|
BlendMode::Lighten |
|
2020-02-25 14:37:42 -05:00
|
|
|
BlendMode::Darken |
|
2020-02-25 15:52:11 -05:00
|
|
|
BlendMode::SrcIn |
|
|
|
|
BlendMode::DestIn |
|
|
|
|
BlendMode::SrcOut |
|
|
|
|
BlendMode::DestAtop |
|
2020-02-25 00:23:17 -05:00
|
|
|
BlendMode::Multiply |
|
|
|
|
BlendMode::Screen |
|
|
|
|
BlendMode::HardLight |
|
|
|
|
BlendMode::Overlay |
|
2020-02-25 14:37:42 -05:00
|
|
|
BlendMode::ColorDodge |
|
|
|
|
BlendMode::ColorBurn |
|
2020-02-22 17:39:03 -05:00
|
|
|
BlendMode::Hue |
|
|
|
|
BlendMode::Saturation |
|
|
|
|
BlendMode::Color |
|
|
|
|
BlendMode::Luminosity => false,
|
2020-02-20 21:15:20 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|