use pdfrum_object::{Dict, Name, Object, names as pdf_names};
use super::Canvas;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum BlendMode {
#[default]
Normal,
Multiply,
Screen,
Overlay,
Darken,
Lighten,
ColorDodge,
ColorBurn,
HardLight,
SoftLight,
Difference,
Exclusion,
Hue,
Saturation,
Color,
Luminosity,
}
impl BlendMode {
fn name(self) -> &'static str {
match self {
Self::Normal => "Normal",
Self::Multiply => "Multiply",
Self::Screen => "Screen",
Self::Overlay => "Overlay",
Self::Darken => "Darken",
Self::Lighten => "Lighten",
Self::ColorDodge => "ColorDodge",
Self::ColorBurn => "ColorBurn",
Self::HardLight => "HardLight",
Self::SoftLight => "SoftLight",
Self::Difference => "Difference",
Self::Exclusion => "Exclusion",
Self::Hue => "Hue",
Self::Saturation => "Saturation",
Self::Color => "Color",
Self::Luminosity => "Luminosity",
}
}
}
impl Canvas<'_, '_> {
pub fn blend(&mut self, mode: BlendMode) {
let state = Dict::from_pairs([(Name::from("BM"), Object::Name(Name::from(mode.name())))]);
let name = self.realize(pdf_names::EXT_G_STATE, Object::Dict(state));
self.out.push('/');
self.push_name(&name);
self.out.push_str(" gs\n");
}
}