Filters.h (13894B)
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/. */ 6 7 #ifndef MOZILLA_GFX_FILTERS_H_ 8 #define MOZILLA_GFX_FILTERS_H_ 9 10 #include "Types.h" 11 #include "mozilla/RefCounted.h" 12 13 #include "Point.h" 14 #include "Matrix.h" 15 16 namespace mozilla { 17 namespace gfx { 18 19 class SourceSurface; 20 21 enum FilterBackend { 22 FILTER_BACKEND_SOFTWARE = 0, 23 FILTER_BACKEND_WEBGL, 24 FILTER_BACKEND_RECORDING, 25 FILTER_BACKEND_CAPTURE 26 }; 27 28 enum TransformFilterAtts { 29 ATT_TRANSFORM_MATRIX = 0, // Matrix 30 ATT_TRANSFORM_FILTER // Filter 31 }; 32 33 enum TransformFilterInputs { IN_TRANSFORM_IN = 0 }; 34 35 enum BlendFilterAtts { 36 ATT_BLEND_BLENDMODE = 0 // uint32_t 37 }; 38 39 enum BlendMode { 40 BLEND_MODE_MULTIPLY = 0, 41 BLEND_MODE_SCREEN, 42 BLEND_MODE_DARKEN, 43 BLEND_MODE_LIGHTEN, 44 BLEND_MODE_OVERLAY, 45 BLEND_MODE_COLOR_DODGE, 46 BLEND_MODE_COLOR_BURN, 47 BLEND_MODE_HARD_LIGHT, 48 BLEND_MODE_SOFT_LIGHT, 49 BLEND_MODE_DIFFERENCE, 50 BLEND_MODE_EXCLUSION, 51 BLEND_MODE_HUE, 52 BLEND_MODE_SATURATION, 53 BLEND_MODE_COLOR, 54 BLEND_MODE_LUMINOSITY 55 }; 56 57 enum BlendFilterInputs { IN_BLEND_IN = 0, IN_BLEND_IN2 }; 58 59 enum MorphologyFilterAtts { 60 ATT_MORPHOLOGY_RADII = 0, // IntSize 61 ATT_MORPHOLOGY_OPERATOR // MorphologyOperator 62 }; 63 64 enum MorphologyOperator { 65 MORPHOLOGY_OPERATOR_ERODE = 0, 66 MORPHOLOGY_OPERATOR_DILATE 67 }; 68 69 enum MorphologyFilterInputs { IN_MORPHOLOGY_IN = 0 }; 70 71 enum AlphaMode { ALPHA_MODE_PREMULTIPLIED = 0, ALPHA_MODE_STRAIGHT }; 72 73 enum ColorMatrixFilterAtts { 74 ATT_COLOR_MATRIX_MATRIX = 0, // Matrix5x4 75 ATT_COLOR_MATRIX_ALPHA_MODE // AlphaMode 76 }; 77 78 enum ColorMatrixFilterInputs { IN_COLOR_MATRIX_IN = 0 }; 79 80 enum FloodFilterAtts { 81 ATT_FLOOD_COLOR = 0 // Color 82 }; 83 84 enum FloodFilterInputs { IN_FLOOD_IN = 0 }; 85 86 enum TileFilterAtts { 87 ATT_TILE_SOURCE_RECT = 0 // IntRect 88 }; 89 90 enum TileFilterInputs { IN_TILE_IN = 0 }; 91 92 enum TransferAtts { 93 ATT_TRANSFER_DISABLE_R = 0, // bool 94 ATT_TRANSFER_DISABLE_G, // bool 95 ATT_TRANSFER_DISABLE_B, // bool 96 ATT_TRANSFER_DISABLE_A // bool 97 }; 98 99 enum TransferInputs { IN_TRANSFER_IN = 0 }; 100 101 enum TableTransferAtts { 102 ATT_TABLE_TRANSFER_DISABLE_R = ATT_TRANSFER_DISABLE_R, 103 ATT_TABLE_TRANSFER_DISABLE_G = ATT_TRANSFER_DISABLE_G, 104 ATT_TABLE_TRANSFER_DISABLE_B = ATT_TRANSFER_DISABLE_B, 105 ATT_TABLE_TRANSFER_DISABLE_A = ATT_TRANSFER_DISABLE_A, 106 ATT_TABLE_TRANSFER_TABLE_R, // Float[] 107 ATT_TABLE_TRANSFER_TABLE_G, // Float[] 108 ATT_TABLE_TRANSFER_TABLE_B, // Float[] 109 ATT_TABLE_TRANSFER_TABLE_A // Float[] 110 }; 111 112 enum TableTransferInputs { IN_TABLE_TRANSFER_IN = IN_TRANSFER_IN }; 113 114 enum DiscreteTransferAtts { 115 ATT_DISCRETE_TRANSFER_DISABLE_R = ATT_TRANSFER_DISABLE_R, 116 ATT_DISCRETE_TRANSFER_DISABLE_G = ATT_TRANSFER_DISABLE_G, 117 ATT_DISCRETE_TRANSFER_DISABLE_B = ATT_TRANSFER_DISABLE_B, 118 ATT_DISCRETE_TRANSFER_DISABLE_A = ATT_TRANSFER_DISABLE_A, 119 ATT_DISCRETE_TRANSFER_TABLE_R, // Float[] 120 ATT_DISCRETE_TRANSFER_TABLE_G, // Float[] 121 ATT_DISCRETE_TRANSFER_TABLE_B, // Float[] 122 ATT_DISCRETE_TRANSFER_TABLE_A // Float[] 123 }; 124 125 enum DiscreteTransferInputs { IN_DISCRETE_TRANSFER_IN = IN_TRANSFER_IN }; 126 127 enum LinearTransferAtts { 128 ATT_LINEAR_TRANSFER_DISABLE_R = ATT_TRANSFER_DISABLE_R, 129 ATT_LINEAR_TRANSFER_DISABLE_G = ATT_TRANSFER_DISABLE_G, 130 ATT_LINEAR_TRANSFER_DISABLE_B = ATT_TRANSFER_DISABLE_B, 131 ATT_LINEAR_TRANSFER_DISABLE_A = ATT_TRANSFER_DISABLE_A, 132 ATT_LINEAR_TRANSFER_SLOPE_R, // Float 133 ATT_LINEAR_TRANSFER_SLOPE_G, // Float 134 ATT_LINEAR_TRANSFER_SLOPE_B, // Float 135 ATT_LINEAR_TRANSFER_SLOPE_A, // Float 136 ATT_LINEAR_TRANSFER_INTERCEPT_R, // Float 137 ATT_LINEAR_TRANSFER_INTERCEPT_G, // Float 138 ATT_LINEAR_TRANSFER_INTERCEPT_B, // Float 139 ATT_LINEAR_TRANSFER_INTERCEPT_A // Float 140 }; 141 142 enum LinearTransferInputs { IN_LINEAR_TRANSFER_IN = IN_TRANSFER_IN }; 143 144 enum GammaTransferAtts { 145 ATT_GAMMA_TRANSFER_DISABLE_R = ATT_TRANSFER_DISABLE_R, 146 ATT_GAMMA_TRANSFER_DISABLE_G = ATT_TRANSFER_DISABLE_G, 147 ATT_GAMMA_TRANSFER_DISABLE_B = ATT_TRANSFER_DISABLE_B, 148 ATT_GAMMA_TRANSFER_DISABLE_A = ATT_TRANSFER_DISABLE_A, 149 ATT_GAMMA_TRANSFER_AMPLITUDE_R, // Float 150 ATT_GAMMA_TRANSFER_AMPLITUDE_G, // Float 151 ATT_GAMMA_TRANSFER_AMPLITUDE_B, // Float 152 ATT_GAMMA_TRANSFER_AMPLITUDE_A, // Float 153 ATT_GAMMA_TRANSFER_EXPONENT_R, // Float 154 ATT_GAMMA_TRANSFER_EXPONENT_G, // Float 155 ATT_GAMMA_TRANSFER_EXPONENT_B, // Float 156 ATT_GAMMA_TRANSFER_EXPONENT_A, // Float 157 ATT_GAMMA_TRANSFER_OFFSET_R, // Float 158 ATT_GAMMA_TRANSFER_OFFSET_G, // Float 159 ATT_GAMMA_TRANSFER_OFFSET_B, // Float 160 ATT_GAMMA_TRANSFER_OFFSET_A // Float 161 }; 162 163 enum GammaTransferInputs { IN_GAMMA_TRANSFER_IN = IN_TRANSFER_IN }; 164 165 enum ConvolveMatrixAtts { 166 ATT_CONVOLVE_MATRIX_KERNEL_SIZE = 0, // IntSize 167 ATT_CONVOLVE_MATRIX_KERNEL_MATRIX, // Float[] 168 ATT_CONVOLVE_MATRIX_DIVISOR, // Float 169 ATT_CONVOLVE_MATRIX_BIAS, // Float 170 ATT_CONVOLVE_MATRIX_TARGET, // IntPoint 171 ATT_CONVOLVE_MATRIX_RENDER_RECT, // IntRect 172 ATT_CONVOLVE_MATRIX_EDGE_MODE, // ConvolveMatrixEdgeMode 173 ATT_CONVOLVE_MATRIX_KERNEL_UNIT_LENGTH, // Size 174 ATT_CONVOLVE_MATRIX_PRESERVE_ALPHA, // bool 175 }; 176 177 enum ConvolveMatrixEdgeMode { 178 EDGE_MODE_DUPLICATE = 0, 179 EDGE_MODE_WRAP, 180 EDGE_MODE_NONE 181 }; 182 183 enum ConvolveMatrixInputs { IN_CONVOLVE_MATRIX_IN = 0 }; 184 185 enum DisplacementMapAtts { 186 ATT_DISPLACEMENT_MAP_SCALE = 0, // Float 187 ATT_DISPLACEMENT_MAP_X_CHANNEL, // ColorChannel 188 ATT_DISPLACEMENT_MAP_Y_CHANNEL // ColorChannel 189 }; 190 191 enum ColorChannel { 192 COLOR_CHANNEL_R = 0, 193 COLOR_CHANNEL_G, 194 COLOR_CHANNEL_B, 195 COLOR_CHANNEL_A 196 }; 197 198 enum DisplacementMapInputs { 199 IN_DISPLACEMENT_MAP_IN = 0, 200 IN_DISPLACEMENT_MAP_IN2 201 }; 202 203 enum TurbulenceAtts { 204 ATT_TURBULENCE_BASE_FREQUENCY = 0, // Size 205 ATT_TURBULENCE_NUM_OCTAVES, // uint32_t 206 ATT_TURBULENCE_SEED, // uint32_t 207 ATT_TURBULENCE_STITCHABLE, // bool 208 ATT_TURBULENCE_TYPE, // TurbulenceType 209 ATT_TURBULENCE_RECT // IntRect 210 }; 211 212 enum TurbulenceType { 213 TURBULENCE_TYPE_TURBULENCE = 0, 214 TURBULENCE_TYPE_FRACTAL_NOISE 215 }; 216 217 enum ArithmeticCombineAtts { 218 ATT_ARITHMETIC_COMBINE_COEFFICIENTS = 0 // Float[4] 219 }; 220 221 enum ArithmeticCombineInputs { 222 IN_ARITHMETIC_COMBINE_IN = 0, 223 IN_ARITHMETIC_COMBINE_IN2 224 }; 225 226 enum CompositeAtts { 227 ATT_COMPOSITE_OPERATOR = 0 // CompositeOperator 228 }; 229 230 enum CompositeOperator { 231 COMPOSITE_OPERATOR_OVER = 0, 232 COMPOSITE_OPERATOR_IN, 233 COMPOSITE_OPERATOR_OUT, 234 COMPOSITE_OPERATOR_ATOP, 235 COMPOSITE_OPERATOR_XOR, 236 COMPOSITE_OPERATOR_LIGHTER 237 }; 238 239 enum CompositeInputs { 240 // arbitrary number of inputs 241 IN_COMPOSITE_IN_START = 0 242 }; 243 244 enum GaussianBlurAtts { 245 ATT_GAUSSIAN_BLUR_STD_DEVIATION = 0 // Float 246 }; 247 248 enum GaussianBlurInputs { IN_GAUSSIAN_BLUR_IN = 0 }; 249 250 enum DirectionalBlurAtts { 251 ATT_DIRECTIONAL_BLUR_STD_DEVIATION = 0, // Float 252 ATT_DIRECTIONAL_BLUR_DIRECTION // BlurDirection 253 }; 254 255 enum BlurDirection { BLUR_DIRECTION_X = 0, BLUR_DIRECTION_Y }; 256 257 enum DirectionalBlurInputs { IN_DIRECTIONAL_BLUR_IN = 0 }; 258 259 enum LightingAtts { 260 ATT_POINT_LIGHT_POSITION = 0, // Point3D 261 262 ATT_SPOT_LIGHT_POSITION, // Point3D 263 ATT_SPOT_LIGHT_POINTS_AT, // Point3D 264 ATT_SPOT_LIGHT_FOCUS, // Float 265 ATT_SPOT_LIGHT_LIMITING_CONE_ANGLE, // Float 266 267 ATT_DISTANT_LIGHT_AZIMUTH, // Float 268 ATT_DISTANT_LIGHT_ELEVATION, // Float 269 270 ATT_LIGHTING_COLOR, // Color 271 ATT_LIGHTING_SURFACE_SCALE, // Float 272 ATT_LIGHTING_KERNEL_UNIT_LENGTH, // Size 273 ATT_LIGHTING_RENDER_RECT, // IntRect 274 275 ATT_DIFFUSE_LIGHTING_DIFFUSE_CONSTANT, // Float 276 277 ATT_SPECULAR_LIGHTING_SPECULAR_CONSTANT, // Float 278 ATT_SPECULAR_LIGHTING_SPECULAR_EXPONENT // Float 279 }; 280 281 enum LightingInputs { IN_LIGHTING_IN = 0 }; 282 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 289 }; 290 291 enum PointDiffuseInputs { IN_POINT_DIFFUSE_IN = IN_LIGHTING_IN }; 292 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 302 }; 303 304 enum SpotDiffuseInputs { IN_SPOT_DIFFUSE_IN = IN_LIGHTING_IN }; 305 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 313 }; 314 315 enum DistantDiffuseInputs { IN_DISTANT_DIFFUSE_IN = IN_LIGHTING_IN }; 316 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 325 }; 326 327 enum PointSpecularInputs { IN_POINT_SPECULAR_IN = IN_LIGHTING_IN }; 328 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 339 }; 340 341 enum SpotSpecularInputs { IN_SPOT_SPECULAR_IN = IN_LIGHTING_IN }; 342 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 353 }; 354 355 enum DistantSpecularInputs { IN_DISTANT_SPECULAR_IN = IN_LIGHTING_IN }; 356 357 enum CropAtts { 358 ATT_CROP_RECT = 0 // Rect 359 }; 360 361 enum CropInputs { IN_CROP_IN = 0 }; 362 363 enum PremultiplyInputs { IN_PREMULTIPLY_IN = 0 }; 364 365 enum UnpremultiplyInputs { IN_UNPREMULTIPLY_IN = 0 }; 366 367 enum OpacityAtts { ATT_OPACITY_VALUE = 0 }; 368 369 enum OpacityInputs { IN_OPACITY_IN = 0 }; 370 371 class FilterNode : public external::AtomicRefCounted<FilterNode> { 372 public: 373 MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNode) 374 virtual ~FilterNode() = default; 375 376 virtual FilterBackend GetBackendType() = 0; 377 378 virtual void SetInput(uint32_t aIndex, SourceSurface* aSurface) { 379 MOZ_CRASH("GFX: FilterNode"); 380 } 381 virtual void SetInput(uint32_t aIndex, FilterNode* aFilter) { 382 MOZ_CRASH("GFX: FilterNode"); 383 } 384 385 virtual void SetAttribute(uint32_t aIndex, bool) { 386 MOZ_CRASH("GFX: FilterNode"); 387 } 388 virtual void SetAttribute(uint32_t aIndex, uint32_t) { 389 MOZ_CRASH("GFX: FilterNode"); 390 } 391 virtual void SetAttribute(uint32_t aIndex, Float) { 392 MOZ_CRASH("GFX: FilterNode"); 393 } 394 virtual void SetAttribute(uint32_t aIndex, const Size&) { 395 MOZ_CRASH("GFX: FilterNode"); 396 } 397 virtual void SetAttribute(uint32_t aIndex, const IntSize&) { 398 MOZ_CRASH("GFX: FilterNode"); 399 } 400 virtual void SetAttribute(uint32_t aIndex, const IntPoint&) { 401 MOZ_CRASH("GFX: FilterNode"); 402 } 403 virtual void SetAttribute(uint32_t aIndex, const Rect&) { 404 MOZ_CRASH("GFX: FilterNode"); 405 } 406 virtual void SetAttribute(uint32_t aIndex, const IntRect&) { 407 MOZ_CRASH("GFX: FilterNode"); 408 } 409 virtual void SetAttribute(uint32_t aIndex, const Point&) { 410 MOZ_CRASH("GFX: FilterNode"); 411 } 412 virtual void SetAttribute(uint32_t aIndex, const Matrix&) { 413 MOZ_CRASH("GFX: FilterNode"); 414 } 415 virtual void SetAttribute(uint32_t aIndex, const Matrix5x4&) { 416 MOZ_CRASH("GFX: FilterNode"); 417 } 418 virtual void SetAttribute(uint32_t aIndex, const Point3D&) { 419 MOZ_CRASH("GFX: FilterNode"); 420 } 421 virtual void SetAttribute(uint32_t aIndex, const DeviceColor&) { 422 MOZ_CRASH("GFX: FilterNode"); 423 } 424 virtual void SetAttribute(uint32_t aIndex, const Float* aFloat, 425 uint32_t aSize) { 426 MOZ_CRASH("GFX: FilterNode"); 427 } 428 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) { 434 return aMax; 435 } 436 437 protected: 438 friend class Factory; 439 440 FilterNode() = default; 441 }; 442 443 } // namespace gfx 444 } // namespace mozilla 445 446 #endif