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
|
/* This Source Code Form is subject to the terms of the Mozilla Public
* 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/. */
use api::{ColorF, PremultipliedColorF};
#[repr(u32)]
#[cfg_attr(feature = "capture", derive(Serialize))]
#[cfg_attr(feature = "replay", derive(Deserialize))]
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
pub enum PatternKind {
ColorOrTexture = 0,
RadialGradient = 1,
ConicGradient = 2,
Mask = 3,
// When adding patterns, don't forget to update the NUM_PATTERNS constant.
}
pub const NUM_PATTERNS: u32 = 4;
impl PatternKind {
pub fn from_u32(val: u32) -> Self {
assert!(val < NUM_PATTERNS);
unsafe { std::mem::transmute(val) }
}
}
/// A 32bit payload used as input for the pattern-specific logic in the shader.
///
/// Patterns typically use it as a GpuBuffer offset to fetch their data.
#[cfg_attr(feature = "capture", derive(Serialize))]
#[cfg_attr(feature = "replay", derive(Deserialize))]
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
pub struct PatternShaderInput(pub i32, pub i32);
impl Default for PatternShaderInput {
fn default() -> Self {
PatternShaderInput(0, 0)
}
}
#[derive(Copy, Clone, Debug)]
pub struct Pattern {
pub kind: PatternKind,
pub shader_input: PatternShaderInput,
pub base_color: PremultipliedColorF,
pub is_opaque: bool,
}
impl Pattern {
pub fn color(color: ColorF) -> Self {
Pattern {
kind: PatternKind::ColorOrTexture,
shader_input: PatternShaderInput::default(),
base_color: color.premultiplied(),
is_opaque: color.a >= 1.0,
}
}
pub fn clear() -> Self {
// Opaque black with operator dest out
Pattern {
kind: PatternKind::ColorOrTexture,
shader_input: PatternShaderInput::default(),
base_color: PremultipliedColorF::WHITE,
is_opaque: false,
}
}
pub fn supports_segmented_rendering(&self) -> bool {
match self.kind {
PatternKind::ColorOrTexture | PatternKind::Mask => {
true
}
PatternKind::RadialGradient | PatternKind::ConicGradient => {
// TODO: We need to fix up the layout coords mismatch in pattern
// and quad rendering to allow these to be segmented.
false
}
}
}
}
|