tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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