FilterDescription.h (4980B)
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 __FilterDescription_h 8 #define __FilterDescription_h 9 10 #include "FilterSupport.h" 11 #include "mozilla/Variant.h" 12 #include "mozilla/gfx/Rect.h" 13 #include "nsTArray.h" 14 15 namespace mozilla::gfx { 16 class FilterPrimitiveDescription; 17 } 18 19 MOZ_DECLARE_RELOCATE_USING_MOVE_CONSTRUCTOR( 20 mozilla::gfx::FilterPrimitiveDescription) 21 22 namespace mozilla::gfx { 23 typedef Variant< 24 EmptyAttributes, BlendAttributes, MorphologyAttributes, 25 ColorMatrixAttributes, FloodAttributes, TileAttributes, 26 ComponentTransferAttributes, OpacityAttributes, ConvolveMatrixAttributes, 27 OffsetAttributes, DisplacementMapAttributes, TurbulenceAttributes, 28 CompositeAttributes, MergeAttributes, ImageAttributes, 29 GaussianBlurAttributes, DropShadowAttributes, DiffuseLightingAttributes, 30 SpecularLightingAttributes, ToAlphaAttributes> 31 PrimitiveAttributes; 32 33 /** 34 * A data structure to carry attributes for a given primitive that's part of a 35 * filter. Will be serializable via IPDL, so it must not contain complex 36 * functionality. 37 * Used as part of a FilterDescription. 38 */ 39 class FilterPrimitiveDescription final { 40 public: 41 enum { 42 kPrimitiveIndexSourceGraphic = -1, 43 kPrimitiveIndexSourceAlpha = -2, 44 kPrimitiveIndexFillPaint = -3, 45 kPrimitiveIndexStrokePaint = -4 46 }; 47 48 FilterPrimitiveDescription(); 49 explicit FilterPrimitiveDescription(PrimitiveAttributes&& aAttributes); 50 FilterPrimitiveDescription(FilterPrimitiveDescription&& aOther) = default; 51 FilterPrimitiveDescription& operator=(FilterPrimitiveDescription&& aOther) = 52 default; 53 FilterPrimitiveDescription(const FilterPrimitiveDescription& aOther) 54 : mAttributes(aOther.mAttributes), 55 mInputPrimitives(aOther.mInputPrimitives.Clone()), 56 mFilterPrimitiveSubregion(aOther.mFilterPrimitiveSubregion), 57 mFilterSpaceBounds(aOther.mFilterSpaceBounds), 58 mInputColorSpaces(aOther.mInputColorSpaces.Clone()), 59 mOutputColorSpace(aOther.mOutputColorSpace), 60 mIsTainted(aOther.mIsTainted) {} 61 62 const PrimitiveAttributes& Attributes() const { return mAttributes; } 63 PrimitiveAttributes& Attributes() { return mAttributes; } 64 65 IntRect PrimitiveSubregion() const { return mFilterPrimitiveSubregion; } 66 IntRect FilterSpaceBounds() const { return mFilterSpaceBounds; } 67 bool IsTainted() const { return mIsTainted; } 68 69 size_t NumberOfInputs() const { return mInputPrimitives.Length(); } 70 int32_t InputPrimitiveIndex(size_t aInputIndex) const { 71 return aInputIndex < mInputPrimitives.Length() 72 ? mInputPrimitives[aInputIndex] 73 : 0; 74 } 75 76 ColorSpace InputColorSpace(size_t aInputIndex) const { 77 return aInputIndex < mInputColorSpaces.Length() 78 ? mInputColorSpaces[aInputIndex] 79 : ColorSpace(); 80 } 81 82 ColorSpace OutputColorSpace() const { return mOutputColorSpace; } 83 84 void SetPrimitiveSubregion(const IntRect& aRect) { 85 mFilterPrimitiveSubregion = aRect; 86 } 87 88 void SetFilterSpaceBounds(const IntRect& aRect) { 89 mFilterSpaceBounds = aRect; 90 } 91 92 void SetIsTainted(bool aIsTainted) { mIsTainted = aIsTainted; } 93 94 void SetInputPrimitive(size_t aInputIndex, int32_t aInputPrimitiveIndex) { 95 mInputPrimitives.EnsureLengthAtLeast(aInputIndex + 1); 96 mInputPrimitives[aInputIndex] = aInputPrimitiveIndex; 97 } 98 99 void SetInputColorSpace(size_t aInputIndex, ColorSpace aColorSpace) { 100 mInputColorSpaces.EnsureLengthAtLeast(aInputIndex + 1); 101 mInputColorSpaces[aInputIndex] = aColorSpace; 102 } 103 104 void SetOutputColorSpace(const ColorSpace& aColorSpace) { 105 mOutputColorSpace = aColorSpace; 106 } 107 108 bool operator==(const FilterPrimitiveDescription& aOther) const; 109 bool operator!=(const FilterPrimitiveDescription& aOther) const { 110 return !(*this == aOther); 111 } 112 113 private: 114 PrimitiveAttributes mAttributes; 115 AutoTArray<int32_t, 2> mInputPrimitives; 116 IntRect mFilterPrimitiveSubregion; 117 IntRect mFilterSpaceBounds; 118 AutoTArray<ColorSpace, 2> mInputColorSpaces; 119 ColorSpace mOutputColorSpace; 120 bool mIsTainted; 121 }; 122 123 /** 124 * A data structure that contains one or more FilterPrimitiveDescriptions. 125 * Designed to be serializable via IPDL, so it must not contain complex 126 * functionality. 127 */ 128 struct FilterDescription final { 129 FilterDescription() = default; 130 explicit FilterDescription(nsTArray<FilterPrimitiveDescription>&& aPrimitives) 131 : mPrimitives(std::move(aPrimitives)) {} 132 133 bool operator==(const FilterDescription& aOther) const; 134 bool operator!=(const FilterDescription& aOther) const { 135 return !(*this == aOther); 136 } 137 138 CopyableTArray<FilterPrimitiveDescription> mPrimitives; 139 }; 140 } // namespace mozilla::gfx 141 142 #endif // __FilterSupport_h