1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #ifndef MOZILLA_GFX_FILTERS_H_
8 #define MOZILLA_GFX_FILTERS_H_
11 #include "mozilla/RefPtr.h"
23 FILTER_BACKEND_SOFTWARE
= 0,
24 FILTER_BACKEND_DIRECT2D1_1
,
25 FILTER_BACKEND_RECORDING
,
26 FILTER_BACKEND_CAPTURE
29 enum TransformFilterAtts
{
30 ATT_TRANSFORM_MATRIX
= 0, // Matrix
31 ATT_TRANSFORM_FILTER
// Filter
34 enum TransformFilterInputs
{ IN_TRANSFORM_IN
= 0 };
36 enum BlendFilterAtts
{
37 ATT_BLEND_BLENDMODE
= 0 // uint32_t
41 BLEND_MODE_MULTIPLY
= 0,
46 BLEND_MODE_COLOR_DODGE
,
47 BLEND_MODE_COLOR_BURN
,
48 BLEND_MODE_HARD_LIGHT
,
49 BLEND_MODE_SOFT_LIGHT
,
50 BLEND_MODE_DIFFERENCE
,
53 BLEND_MODE_SATURATION
,
58 enum BlendFilterInputs
{ IN_BLEND_IN
= 0, IN_BLEND_IN2
};
60 enum MorphologyFilterAtts
{
61 ATT_MORPHOLOGY_RADII
= 0, // IntSize
62 ATT_MORPHOLOGY_OPERATOR
// MorphologyOperator
65 enum MorphologyOperator
{
66 MORPHOLOGY_OPERATOR_ERODE
= 0,
67 MORPHOLOGY_OPERATOR_DILATE
70 enum MorphologyFilterInputs
{ IN_MORPHOLOGY_IN
= 0 };
72 enum AlphaMode
{ ALPHA_MODE_PREMULTIPLIED
= 0, ALPHA_MODE_STRAIGHT
};
74 enum ColorMatrixFilterAtts
{
75 ATT_COLOR_MATRIX_MATRIX
= 0, // Matrix5x4
76 ATT_COLOR_MATRIX_ALPHA_MODE
// AlphaMode
79 enum ColorMatrixFilterInputs
{ IN_COLOR_MATRIX_IN
= 0 };
81 enum FloodFilterAtts
{
82 ATT_FLOOD_COLOR
= 0 // Color
85 enum FloodFilterInputs
{ IN_FLOOD_IN
= 0 };
88 ATT_TILE_SOURCE_RECT
= 0 // IntRect
91 enum TileFilterInputs
{ IN_TILE_IN
= 0 };
94 ATT_TRANSFER_DISABLE_R
= 0, // bool
95 ATT_TRANSFER_DISABLE_G
, // bool
96 ATT_TRANSFER_DISABLE_B
, // bool
97 ATT_TRANSFER_DISABLE_A
// bool
100 enum TransferInputs
{ IN_TRANSFER_IN
= 0 };
102 enum TableTransferAtts
{
103 ATT_TABLE_TRANSFER_DISABLE_R
= ATT_TRANSFER_DISABLE_R
,
104 ATT_TABLE_TRANSFER_DISABLE_G
= ATT_TRANSFER_DISABLE_G
,
105 ATT_TABLE_TRANSFER_DISABLE_B
= ATT_TRANSFER_DISABLE_B
,
106 ATT_TABLE_TRANSFER_DISABLE_A
= ATT_TRANSFER_DISABLE_A
,
107 ATT_TABLE_TRANSFER_TABLE_R
, // Float[]
108 ATT_TABLE_TRANSFER_TABLE_G
, // Float[]
109 ATT_TABLE_TRANSFER_TABLE_B
, // Float[]
110 ATT_TABLE_TRANSFER_TABLE_A
// Float[]
113 enum TableTransferInputs
{ IN_TABLE_TRANSFER_IN
= IN_TRANSFER_IN
};
115 enum DiscreteTransferAtts
{
116 ATT_DISCRETE_TRANSFER_DISABLE_R
= ATT_TRANSFER_DISABLE_R
,
117 ATT_DISCRETE_TRANSFER_DISABLE_G
= ATT_TRANSFER_DISABLE_G
,
118 ATT_DISCRETE_TRANSFER_DISABLE_B
= ATT_TRANSFER_DISABLE_B
,
119 ATT_DISCRETE_TRANSFER_DISABLE_A
= ATT_TRANSFER_DISABLE_A
,
120 ATT_DISCRETE_TRANSFER_TABLE_R
, // Float[]
121 ATT_DISCRETE_TRANSFER_TABLE_G
, // Float[]
122 ATT_DISCRETE_TRANSFER_TABLE_B
, // Float[]
123 ATT_DISCRETE_TRANSFER_TABLE_A
// Float[]
126 enum DiscreteTransferInputs
{ IN_DISCRETE_TRANSFER_IN
= IN_TRANSFER_IN
};
128 enum LinearTransferAtts
{
129 ATT_LINEAR_TRANSFER_DISABLE_R
= ATT_TRANSFER_DISABLE_R
,
130 ATT_LINEAR_TRANSFER_DISABLE_G
= ATT_TRANSFER_DISABLE_G
,
131 ATT_LINEAR_TRANSFER_DISABLE_B
= ATT_TRANSFER_DISABLE_B
,
132 ATT_LINEAR_TRANSFER_DISABLE_A
= ATT_TRANSFER_DISABLE_A
,
133 ATT_LINEAR_TRANSFER_SLOPE_R
, // Float
134 ATT_LINEAR_TRANSFER_SLOPE_G
, // Float
135 ATT_LINEAR_TRANSFER_SLOPE_B
, // Float
136 ATT_LINEAR_TRANSFER_SLOPE_A
, // Float
137 ATT_LINEAR_TRANSFER_INTERCEPT_R
, // Float
138 ATT_LINEAR_TRANSFER_INTERCEPT_G
, // Float
139 ATT_LINEAR_TRANSFER_INTERCEPT_B
, // Float
140 ATT_LINEAR_TRANSFER_INTERCEPT_A
// Float
143 enum LinearTransferInputs
{ IN_LINEAR_TRANSFER_IN
= IN_TRANSFER_IN
};
145 enum GammaTransferAtts
{
146 ATT_GAMMA_TRANSFER_DISABLE_R
= ATT_TRANSFER_DISABLE_R
,
147 ATT_GAMMA_TRANSFER_DISABLE_G
= ATT_TRANSFER_DISABLE_G
,
148 ATT_GAMMA_TRANSFER_DISABLE_B
= ATT_TRANSFER_DISABLE_B
,
149 ATT_GAMMA_TRANSFER_DISABLE_A
= ATT_TRANSFER_DISABLE_A
,
150 ATT_GAMMA_TRANSFER_AMPLITUDE_R
, // Float
151 ATT_GAMMA_TRANSFER_AMPLITUDE_G
, // Float
152 ATT_GAMMA_TRANSFER_AMPLITUDE_B
, // Float
153 ATT_GAMMA_TRANSFER_AMPLITUDE_A
, // Float
154 ATT_GAMMA_TRANSFER_EXPONENT_R
, // Float
155 ATT_GAMMA_TRANSFER_EXPONENT_G
, // Float
156 ATT_GAMMA_TRANSFER_EXPONENT_B
, // Float
157 ATT_GAMMA_TRANSFER_EXPONENT_A
, // Float
158 ATT_GAMMA_TRANSFER_OFFSET_R
, // Float
159 ATT_GAMMA_TRANSFER_OFFSET_G
, // Float
160 ATT_GAMMA_TRANSFER_OFFSET_B
, // Float
161 ATT_GAMMA_TRANSFER_OFFSET_A
// Float
164 enum GammaTransferInputs
{ IN_GAMMA_TRANSFER_IN
= IN_TRANSFER_IN
};
166 enum ConvolveMatrixAtts
{
167 ATT_CONVOLVE_MATRIX_KERNEL_SIZE
= 0, // IntSize
168 ATT_CONVOLVE_MATRIX_KERNEL_MATRIX
, // Float[]
169 ATT_CONVOLVE_MATRIX_DIVISOR
, // Float
170 ATT_CONVOLVE_MATRIX_BIAS
, // Float
171 ATT_CONVOLVE_MATRIX_TARGET
, // IntPoint
172 ATT_CONVOLVE_MATRIX_SOURCE_RECT
, // IntRect
173 ATT_CONVOLVE_MATRIX_EDGE_MODE
, // ConvolveMatrixEdgeMode
174 ATT_CONVOLVE_MATRIX_KERNEL_UNIT_LENGTH
, // Size
175 ATT_CONVOLVE_MATRIX_PRESERVE_ALPHA
, // bool
178 enum ConvolveMatrixEdgeMode
{
179 EDGE_MODE_DUPLICATE
= 0,
184 enum ConvolveMatrixInputs
{ IN_CONVOLVE_MATRIX_IN
= 0 };
186 enum DisplacementMapAtts
{
187 ATT_DISPLACEMENT_MAP_SCALE
= 0, // Float
188 ATT_DISPLACEMENT_MAP_X_CHANNEL
, // ColorChannel
189 ATT_DISPLACEMENT_MAP_Y_CHANNEL
// ColorChannel
199 enum DisplacementMapInputs
{
200 IN_DISPLACEMENT_MAP_IN
= 0,
201 IN_DISPLACEMENT_MAP_IN2
204 enum TurbulenceAtts
{
205 ATT_TURBULENCE_BASE_FREQUENCY
= 0, // Size
206 ATT_TURBULENCE_NUM_OCTAVES
, // uint32_t
207 ATT_TURBULENCE_SEED
, // uint32_t
208 ATT_TURBULENCE_STITCHABLE
, // bool
209 ATT_TURBULENCE_TYPE
, // TurbulenceType
210 ATT_TURBULENCE_RECT
// IntRect
213 enum TurbulenceType
{
214 TURBULENCE_TYPE_TURBULENCE
= 0,
215 TURBULENCE_TYPE_FRACTAL_NOISE
218 enum ArithmeticCombineAtts
{
219 ATT_ARITHMETIC_COMBINE_COEFFICIENTS
= 0 // Float[4]
222 enum ArithmeticCombineInputs
{
223 IN_ARITHMETIC_COMBINE_IN
= 0,
224 IN_ARITHMETIC_COMBINE_IN2
228 ATT_COMPOSITE_OPERATOR
= 0 // CompositeOperator
231 enum CompositeOperator
{
232 COMPOSITE_OPERATOR_OVER
= 0,
233 COMPOSITE_OPERATOR_IN
,
234 COMPOSITE_OPERATOR_OUT
,
235 COMPOSITE_OPERATOR_ATOP
,
236 COMPOSITE_OPERATOR_XOR
,
237 COMPOSITE_OPERATOR_LIGHTER
240 enum CompositeInputs
{
241 // arbitrary number of inputs
242 IN_COMPOSITE_IN_START
= 0
245 enum GaussianBlurAtts
{
246 ATT_GAUSSIAN_BLUR_STD_DEVIATION
= 0 // Float
249 enum GaussianBlurInputs
{ IN_GAUSSIAN_BLUR_IN
= 0 };
251 enum DirectionalBlurAtts
{
252 ATT_DIRECTIONAL_BLUR_STD_DEVIATION
= 0, // Float
253 ATT_DIRECTIONAL_BLUR_DIRECTION
// BlurDirection
256 enum BlurDirection
{ BLUR_DIRECTION_X
= 0, BLUR_DIRECTION_Y
};
258 enum DirectionalBlurInputs
{ IN_DIRECTIONAL_BLUR_IN
= 0 };
261 ATT_POINT_LIGHT_POSITION
= 0, // Point3D
263 ATT_SPOT_LIGHT_POSITION
, // Point3D
264 ATT_SPOT_LIGHT_POINTS_AT
, // Point3D
265 ATT_SPOT_LIGHT_FOCUS
, // Float
266 ATT_SPOT_LIGHT_LIMITING_CONE_ANGLE
, // Float
268 ATT_DISTANT_LIGHT_AZIMUTH
, // Float
269 ATT_DISTANT_LIGHT_ELEVATION
, // Float
271 ATT_LIGHTING_COLOR
, // Color
272 ATT_LIGHTING_SURFACE_SCALE
, // Float
273 ATT_LIGHTING_KERNEL_UNIT_LENGTH
, // Size
275 ATT_DIFFUSE_LIGHTING_DIFFUSE_CONSTANT
, // Float
277 ATT_SPECULAR_LIGHTING_SPECULAR_CONSTANT
, // Float
278 ATT_SPECULAR_LIGHTING_SPECULAR_EXPONENT
// Float
281 enum LightingInputs
{ IN_LIGHTING_IN
= 0 };
283 enum PointDiffuseAtts
{
284 ATT_POINT_DIFFUSE_POSITION
= ATT_POINT_LIGHT_POSITION
,
285 ATT_POINT_DIFFUSE_COLOR
= ATT_LIGHTING_COLOR
,
286 ATT_POINT_DIFFUSE_SURFACE_SCALE
= ATT_LIGHTING_SURFACE_SCALE
,
287 ATT_POINT_DIFFUSE_KERNEL_UNIT_LENGTH
= ATT_LIGHTING_KERNEL_UNIT_LENGTH
,
288 ATT_POINT_DIFFUSE_DIFFUSE_CONSTANT
= ATT_DIFFUSE_LIGHTING_DIFFUSE_CONSTANT
291 enum PointDiffuseInputs
{ IN_POINT_DIFFUSE_IN
= IN_LIGHTING_IN
};
293 enum SpotDiffuseAtts
{
294 ATT_SPOT_DIFFUSE_POSITION
= ATT_SPOT_LIGHT_POSITION
,
295 ATT_SPOT_DIFFUSE_POINTS_AT
= ATT_SPOT_LIGHT_POINTS_AT
,
296 ATT_SPOT_DIFFUSE_FOCUS
= ATT_SPOT_LIGHT_FOCUS
,
297 ATT_SPOT_DIFFUSE_LIMITING_CONE_ANGLE
= ATT_SPOT_LIGHT_LIMITING_CONE_ANGLE
,
298 ATT_SPOT_DIFFUSE_COLOR
= ATT_LIGHTING_COLOR
,
299 ATT_SPOT_DIFFUSE_SURFACE_SCALE
= ATT_LIGHTING_SURFACE_SCALE
,
300 ATT_SPOT_DIFFUSE_KERNEL_UNIT_LENGTH
= ATT_LIGHTING_KERNEL_UNIT_LENGTH
,
301 ATT_SPOT_DIFFUSE_DIFFUSE_CONSTANT
= ATT_DIFFUSE_LIGHTING_DIFFUSE_CONSTANT
304 enum SpotDiffuseInputs
{ IN_SPOT_DIFFUSE_IN
= IN_LIGHTING_IN
};
306 enum DistantDiffuseAtts
{
307 ATT_DISTANT_DIFFUSE_AZIMUTH
= ATT_DISTANT_LIGHT_AZIMUTH
,
308 ATT_DISTANT_DIFFUSE_ELEVATION
= ATT_DISTANT_LIGHT_ELEVATION
,
309 ATT_DISTANT_DIFFUSE_COLOR
= ATT_LIGHTING_COLOR
,
310 ATT_DISTANT_DIFFUSE_SURFACE_SCALE
= ATT_LIGHTING_SURFACE_SCALE
,
311 ATT_DISTANT_DIFFUSE_KERNEL_UNIT_LENGTH
= ATT_LIGHTING_KERNEL_UNIT_LENGTH
,
312 ATT_DISTANT_DIFFUSE_DIFFUSE_CONSTANT
= ATT_DIFFUSE_LIGHTING_DIFFUSE_CONSTANT
315 enum DistantDiffuseInputs
{ IN_DISTANT_DIFFUSE_IN
= IN_LIGHTING_IN
};
317 enum PointSpecularAtts
{
318 ATT_POINT_SPECULAR_POSITION
= ATT_POINT_LIGHT_POSITION
,
319 ATT_POINT_SPECULAR_COLOR
= ATT_LIGHTING_COLOR
,
320 ATT_POINT_SPECULAR_SURFACE_SCALE
= ATT_LIGHTING_SURFACE_SCALE
,
321 ATT_POINT_SPECULAR_KERNEL_UNIT_LENGTH
= ATT_LIGHTING_KERNEL_UNIT_LENGTH
,
322 ATT_POINT_SPECULAR_SPECULAR_CONSTANT
=
323 ATT_SPECULAR_LIGHTING_SPECULAR_CONSTANT
,
324 ATT_POINT_SPECULAR_SPECULAR_EXPONENT
= ATT_SPECULAR_LIGHTING_SPECULAR_EXPONENT
327 enum PointSpecularInputs
{ IN_POINT_SPECULAR_IN
= IN_LIGHTING_IN
};
329 enum SpotSpecularAtts
{
330 ATT_SPOT_SPECULAR_POSITION
= ATT_SPOT_LIGHT_POSITION
,
331 ATT_SPOT_SPECULAR_POINTS_AT
= ATT_SPOT_LIGHT_POINTS_AT
,
332 ATT_SPOT_SPECULAR_FOCUS
= ATT_SPOT_LIGHT_FOCUS
,
333 ATT_SPOT_SPECULAR_LIMITING_CONE_ANGLE
= ATT_SPOT_LIGHT_LIMITING_CONE_ANGLE
,
334 ATT_SPOT_SPECULAR_COLOR
= ATT_LIGHTING_COLOR
,
335 ATT_SPOT_SPECULAR_SURFACE_SCALE
= ATT_LIGHTING_SURFACE_SCALE
,
336 ATT_SPOT_SPECULAR_KERNEL_UNIT_LENGTH
= ATT_LIGHTING_KERNEL_UNIT_LENGTH
,
337 ATT_SPOT_SPECULAR_SPECULAR_CONSTANT
= ATT_SPECULAR_LIGHTING_SPECULAR_CONSTANT
,
338 ATT_SPOT_SPECULAR_SPECULAR_EXPONENT
= ATT_SPECULAR_LIGHTING_SPECULAR_EXPONENT
341 enum SpotSpecularInputs
{ IN_SPOT_SPECULAR_IN
= IN_LIGHTING_IN
};
343 enum DistantSpecularAtts
{
344 ATT_DISTANT_SPECULAR_AZIMUTH
= ATT_DISTANT_LIGHT_AZIMUTH
,
345 ATT_DISTANT_SPECULAR_ELEVATION
= ATT_DISTANT_LIGHT_ELEVATION
,
346 ATT_DISTANT_SPECULAR_COLOR
= ATT_LIGHTING_COLOR
,
347 ATT_DISTANT_SPECULAR_SURFACE_SCALE
= ATT_LIGHTING_SURFACE_SCALE
,
348 ATT_DISTANT_SPECULAR_KERNEL_UNIT_LENGTH
= ATT_LIGHTING_KERNEL_UNIT_LENGTH
,
349 ATT_DISTANT_SPECULAR_SPECULAR_CONSTANT
=
350 ATT_SPECULAR_LIGHTING_SPECULAR_CONSTANT
,
351 ATT_DISTANT_SPECULAR_SPECULAR_EXPONENT
=
352 ATT_SPECULAR_LIGHTING_SPECULAR_EXPONENT
355 enum DistantSpecularInputs
{ IN_DISTANT_SPECULAR_IN
= IN_LIGHTING_IN
};
358 ATT_CROP_RECT
= 0 // Rect
361 enum CropInputs
{ IN_CROP_IN
= 0 };
363 enum PremultiplyInputs
{ IN_PREMULTIPLY_IN
= 0 };
365 enum UnpremultiplyInputs
{ IN_UNPREMULTIPLY_IN
= 0 };
367 enum OpacityAtts
{ ATT_OPACITY_VALUE
= 0 };
369 enum OpacityInputs
{ IN_OPACITY_IN
= 0 };
371 class FilterNode
: public external::AtomicRefCounted
<FilterNode
> {
373 MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNode
)
374 virtual ~FilterNode() = default;
376 virtual FilterBackend
GetBackendType() = 0;
378 virtual void SetInput(uint32_t aIndex
, SourceSurface
* aSurface
) {
379 MOZ_CRASH("GFX: FilterNode");
381 virtual void SetInput(uint32_t aIndex
, FilterNode
* aFilter
) {
382 MOZ_CRASH("GFX: FilterNode");
385 virtual void SetAttribute(uint32_t aIndex
, bool) {
386 MOZ_CRASH("GFX: FilterNode");
388 virtual void SetAttribute(uint32_t aIndex
, uint32_t) {
389 MOZ_CRASH("GFX: FilterNode");
391 virtual void SetAttribute(uint32_t aIndex
, Float
) {
392 MOZ_CRASH("GFX: FilterNode");
394 virtual void SetAttribute(uint32_t aIndex
, const Size
&) {
395 MOZ_CRASH("GFX: FilterNode");
397 virtual void SetAttribute(uint32_t aIndex
, const IntSize
&) {
398 MOZ_CRASH("GFX: FilterNode");
400 virtual void SetAttribute(uint32_t aIndex
, const IntPoint
&) {
401 MOZ_CRASH("GFX: FilterNode");
403 virtual void SetAttribute(uint32_t aIndex
, const Rect
&) {
404 MOZ_CRASH("GFX: FilterNode");
406 virtual void SetAttribute(uint32_t aIndex
, const IntRect
&) {
407 MOZ_CRASH("GFX: FilterNode");
409 virtual void SetAttribute(uint32_t aIndex
, const Point
&) {
410 MOZ_CRASH("GFX: FilterNode");
412 virtual void SetAttribute(uint32_t aIndex
, const Matrix
&) {
413 MOZ_CRASH("GFX: FilterNode");
415 virtual void SetAttribute(uint32_t aIndex
, const Matrix5x4
&) {
416 MOZ_CRASH("GFX: FilterNode");
418 virtual void SetAttribute(uint32_t aIndex
, const Point3D
&) {
419 MOZ_CRASH("GFX: FilterNode");
421 virtual void SetAttribute(uint32_t aIndex
, const DeviceColor
&) {
422 MOZ_CRASH("GFX: FilterNode");
424 virtual void SetAttribute(uint32_t aIndex
, const Float
* aFloat
,
426 MOZ_CRASH("GFX: FilterNode");
429 /** Maps a rectangle in filter space back to a rectangle in the space of
430 * aSourceNode's first input. aSourceNode should not have an input
431 * assigned when calling this function. */
432 virtual IntRect
MapRectToSource(const IntRect
& aRect
, const IntRect
& aMax
,
433 FilterNode
* aSourceNode
) {
438 friend class Factory
;
440 FilterNode() = default;
444 } // namespace mozilla