1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149

//! A set of predefined blendmodes for use with `Layer::set_blendmode()`.
//!
//! See [`BlendMode`](../struct.BlendMode.html) to define your own blendmodes.

use super::*;
use core::{Color};

/// Replaces source into destination, overwriting color and alpha values.
pub const COPY: BlendMode = BlendMode {
    color: BlendingFunction::AlwaysReplace,
    alpha: BlendingFunction::AlwaysReplace,
    constant_value: Color(0.0, 0.0, 0.0, 0.0)
};

/// Alpha-blends source into destination.
pub const ALPHA: BlendMode = BlendMode {
    color: BlendingFunction::Addition {
        source: LinearBlendingFactor::One,
        destination: LinearBlendingFactor::OneMinusSourceAlpha,
    },
    alpha: BlendingFunction::Addition {
        source: LinearBlendingFactor::One,
        destination: LinearBlendingFactor::OneMinusSourceAlpha,
    },
    constant_value: Color(0.0, 0.0, 0.0, 0.0)
};

/// Adds source and destination.
pub const ADD: BlendMode = BlendMode {
    color: BlendingFunction::Addition {
        source: LinearBlendingFactor::One,
        destination: LinearBlendingFactor::One,
    },
    alpha: BlendingFunction::Addition {
        source: LinearBlendingFactor::One,
        destination: LinearBlendingFactor::One,
    },
    constant_value: Color(0.0, 0.0, 0.0, 0.0)
};

/// Subtracts source from destination.
pub const SUBTRACT: BlendMode = BlendMode {
    color: BlendingFunction::Subtraction {
        source: LinearBlendingFactor::One,
        destination: LinearBlendingFactor::One,
    },
    alpha: BlendingFunction::Subtraction {
        source: LinearBlendingFactor::One,
        destination: LinearBlendingFactor::One,
    },
    constant_value: Color(0.0, 0.0, 0.0, 0.0)
};

/// Subtracts destination from source.
pub const REVERSE_SUBTRACT: BlendMode = BlendMode {
    color: BlendingFunction::ReverseSubtraction {
        source: LinearBlendingFactor::One,
        destination: LinearBlendingFactor::One,
    },
    alpha: BlendingFunction::ReverseSubtraction {
        source: LinearBlendingFactor::One,
        destination: LinearBlendingFactor::One,
    },
    constant_value: Color(0.0, 0.0, 0.0, 0.0)
};

/// Writes the maximum of source and destination into destination.
pub const LIGHTEN: BlendMode = BlendMode {
    color: BlendingFunction::Max,
    alpha: BlendingFunction::Max,
    constant_value: Color(0.0, 0.0, 0.0, 0.0),
};

/// Writes the minimum of source and destination into destination.
pub const DARKEN: BlendMode = BlendMode {
    color: BlendingFunction::Min,
    alpha: BlendingFunction::Min,
    constant_value: Color(0.0, 0.0, 0.0, 0.0),
};

/// Alpha-blends source into destination.
pub const SQUARED: BlendMode = BlendMode {
    color: BlendingFunction::Addition {
        source: LinearBlendingFactor::SourceColor,
        destination: LinearBlendingFactor::DestinationColor,
    },
    alpha: BlendingFunction::Addition {
        source: LinearBlendingFactor::One,
        destination: LinearBlendingFactor::OneMinusSourceAlpha,
    },
    constant_value: Color(0.0, 0.0, 0.0, 0.0)
};

/// Overlays source and destination.
pub const SCREEN: BlendMode = BlendMode {
    color: BlendingFunction::Addition {
        source: LinearBlendingFactor::One,
        destination: LinearBlendingFactor::OneMinusSourceColor,
    },
    alpha: BlendingFunction::Addition {
        source: LinearBlendingFactor::One,
        destination: LinearBlendingFactor::OneMinusSourceAlpha,
    },
    constant_value: Color(0.0, 0.0, 0.0, 0.0)
};

/// Overlays source and destination, masking the destination where source alpha is low.
pub const SCREEN_MASK: BlendMode = BlendMode {
    color: BlendingFunction::Addition {
        source: LinearBlendingFactor::One,
        destination: LinearBlendingFactor::OneMinusSourceColor,
    },
    alpha: BlendingFunction::Addition {
        source: LinearBlendingFactor::One,
        destination: LinearBlendingFactor::OneMinusSourceAlpha,
    },
    constant_value: Color(0.0, 0.0, 0.0, 0.0)
};

/// Lika ALPHA but multiplies source with given color.
pub fn colorize(color: Color) -> BlendMode {
   BlendMode {
        color: BlendingFunction::Addition {
            source: LinearBlendingFactor::ConstantAlpha,
            destination: LinearBlendingFactor::OneMinusSourceAlpha,
        },
        alpha: BlendingFunction::Addition {
            source: LinearBlendingFactor::ConstantColor,
            destination: LinearBlendingFactor::OneMinusSourceAlpha,
        },
        constant_value: color
    }
}

/// Fades between source at 1.0 and destination at 0.0
pub fn fade(value: f32) -> BlendMode {
   BlendMode {
        color: BlendingFunction::Addition {
            source: LinearBlendingFactor::ConstantAlpha,
            destination: LinearBlendingFactor::ConstantAlpha,
        },
        alpha: BlendingFunction::Addition {
            source: LinearBlendingFactor::OneMinusConstantAlpha,
            destination: LinearBlendingFactor::OneMinusConstantAlpha,
        },
        constant_value: Color(1., 1., 1., value)
    }
}