gfx/2d/FilterNodeSoftware.h

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 /* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*-
     2  * This Source Code Form is subject to the terms of the Mozilla Public
     3  * License, v. 2.0. If a copy of the MPL was not distributed with this
     4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     6 #ifndef _MOZILLA_GFX_FILTERNODESOFTWARE_H_
     7 #define _MOZILLA_GFX_FILTERNODESOFTWARE_H_
     9 #include "Filters.h"
    10 #include <vector>
    12 namespace mozilla {
    13 namespace gfx {
    15 class DataSourceSurface;
    16 class DrawTarget;
    17 struct DrawOptions;
    18 class FilterNodeSoftware;
    20 /**
    21  * Can be attached to FilterNodeSoftware instances using
    22  * AddInvalidationListener. FilterInvalidated is called whenever the output of
    23  * the observed filter may have changed; that is, whenever cached GetOutput()
    24  * results (and results derived from them) need to discarded.
    25  */
    26 class FilterInvalidationListener
    27 {
    28 public:
    29   virtual void FilterInvalidated(FilterNodeSoftware* aFilter) = 0;
    30 };
    32 /**
    33  * This is the base class for the software (i.e. pure CPU, non-accelerated)
    34  * FilterNode implementation. The software implementation is backend-agnostic,
    35  * so it can be used as a fallback for all DrawTarget implementations.
    36  */
    37 class FilterNodeSoftware : public FilterNode,
    38                            public FilterInvalidationListener
    39 {
    40 public:
    41   MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeSoftware)
    42   virtual ~FilterNodeSoftware();
    44   // Factory method, intended to be called from DrawTarget*::CreateFilter.
    45   static TemporaryRef<FilterNode> Create(FilterType aType);
    47   // Draw the filter, intended to be called by DrawTarget*::DrawFilter.
    48   void Draw(DrawTarget* aDrawTarget, const Rect &aSourceRect,
    49             const Point &aDestPoint, const DrawOptions &aOptions);
    51   virtual FilterBackend GetBackendType() MOZ_OVERRIDE { return FILTER_BACKEND_SOFTWARE; }
    52   virtual void SetInput(uint32_t aIndex, SourceSurface *aSurface) MOZ_OVERRIDE;
    53   virtual void SetInput(uint32_t aIndex, FilterNode *aFilter) MOZ_OVERRIDE;
    55   virtual const char* GetName() { return "Unknown"; }
    57   virtual void AddInvalidationListener(FilterInvalidationListener* aListener);
    58   virtual void RemoveInvalidationListener(FilterInvalidationListener* aListener);
    60   // FilterInvalidationListener implementation
    61   virtual void FilterInvalidated(FilterNodeSoftware* aFilter);
    63 protected:
    65   // The following methods are intended to be overriden by subclasses.
    67   /**
    68    * Translates a *FilterInputs enum value into an index for the
    69    * mInputFilters / mInputSurfaces arrays. Returns -1 for invalid inputs.
    70    * If somebody calls SetInput(enumValue, input) with an enumValue for which
    71    * InputIndex(enumValue) is -1, we abort.
    72    */
    73   virtual int32_t InputIndex(uint32_t aInputEnumIndex) { return -1; }
    75   /**
    76    * Every filter node has an output rect, which can also be infinite. The
    77    * output rect can depend on the values of any set attributes and on the
    78    * output rects of any input filters or surfaces.
    79    * This method returns the intersection of the filter's output rect with
    80    * aInRect. Filters with unconstrained output always return aInRect.
    81    */
    82   virtual IntRect GetOutputRectInRect(const IntRect& aInRect) = 0;
    84   /**
    85    * Return a surface with the rendered output which is of size aRect.Size().
    86    * aRect is required to be a subrect of this filter's output rect; in other
    87    * words, aRect == GetOutputRectInRect(aRect) must always be true.
    88    * May return nullptr in error conditions or for an empty aRect.
    89    * Implementations are not required to allocate a new surface and may even
    90    * pass through input surfaces unchanged.
    91    * Callers need to treat the returned surface as immutable.
    92    */
    93   virtual TemporaryRef<DataSourceSurface> Render(const IntRect& aRect) = 0;
    95   /**
    96    * Call RequestRect (see below) on any input filters with the desired input
    97    * rect, so that the input filter knows what to cache the next time it
    98    * renders.
    99    */
   100   virtual void RequestFromInputsForRect(const IntRect &aRect) {}
   102   /**
   103    * This method provides a caching default implementation but can be overriden
   104    * by subclasses that don't want to cache their output. Those classes should
   105    * call Render(aRect) directly from here.
   106    */
   107   virtual TemporaryRef<DataSourceSurface> GetOutput(const IntRect &aRect);
   109   // The following methods are non-virtual helper methods.
   111   /**
   112    * Format hints for GetInputDataSourceSurface. Some callers of
   113    * GetInputDataSourceSurface can handle both B8G8R8A8 and A8 surfaces, these
   114    * should pass CAN_HANDLE_A8 in order to avoid unnecessary conversions.
   115    * Callers that can only handle B8G8R8A8 surfaces pass NEED_COLOR_CHANNELS.
   116    */
   117   enum FormatHint {
   118     CAN_HANDLE_A8,
   119     NEED_COLOR_CHANNELS
   120   };
   122   /**
   123    * Returns SurfaceFormat::B8G8R8A8 or SurfaceFormat::A8, depending on the current surface
   124    * format and the format hint.
   125    */
   126   SurfaceFormat DesiredFormat(SurfaceFormat aCurrentFormat,
   127                               FormatHint aFormatHint);
   129   /**
   130    * Intended to be called by FilterNodeSoftware::Render implementations.
   131    * Returns a surface of size aRect.Size() or nullptr in error conditions. The
   132    * returned surface contains the output of the specified input filter or
   133    * input surface in aRect. If aRect extends beyond the input filter's output
   134    * rect (or the input surface's dimensions), the remaining area is filled
   135    * according to aEdgeMode: The default, EDGE_MODE_NONE, simply pads with
   136    * transparent black.
   137    * If non-null, the returned surface is guaranteed to be of SurfaceFormat::A8 or
   138    * SurfaceFormat::B8G8R8A8. If aFormatHint is NEED_COLOR_CHANNELS, the returned
   139    * surface is guaranteed to be of SurfaceFormat::B8G8R8A8 always.
   140    * Each pixel row of the returned surface is guaranteed to be 16-byte aligned.
   141    */
   142   TemporaryRef<DataSourceSurface>
   143     GetInputDataSourceSurface(uint32_t aInputEnumIndex, const IntRect& aRect,
   144                               FormatHint aFormatHint = CAN_HANDLE_A8,
   145                               ConvolveMatrixEdgeMode aEdgeMode = EDGE_MODE_NONE,
   146                               const IntRect *aTransparencyPaddedSourceRect = nullptr);
   148   /**
   149    * Returns the intersection of the input filter's or surface's output rect
   150    * with aInRect.
   151    */
   152   IntRect GetInputRectInRect(uint32_t aInputEnumIndex, const IntRect& aInRect);
   154   /**
   155    * Calls RequestRect on the specified input, if it's a filter.
   156    */
   157   void RequestInputRect(uint32_t aInputEnumIndex, const IntRect& aRect);
   159   /**
   160    * Returns the number of set input filters or surfaces. Needed for filters
   161    * which can have an arbitrary number of inputs.
   162    */
   163   size_t NumberOfSetInputs();
   165   /**
   166    * Discard the cached surface that was stored in the GetOutput default
   167    * implementation. Needs to be called whenever attributes or inputs are set
   168    * that might change the result of a Render() call.
   169    */
   170   void Invalidate();
   172   /**
   173    * Called in order to let this filter know what to cache during the next
   174    * GetOutput call. Expected to call RequestRect on this filter's input
   175    * filters.
   176    */
   177   void RequestRect(const IntRect &aRect);
   179   /**
   180    * Set input filter and clear input surface for this input index, or set
   181    * input surface and clear input filter. One of aSurface and aFilter should
   182    * be null.
   183    */
   184   void SetInput(uint32_t aIndex, SourceSurface *aSurface,
   185                 FilterNodeSoftware *aFilter);
   187 protected:
   188   /**
   189    * mInputSurfaces / mInputFilters: For each input index, either a surface or
   190    * a filter is set, and the other is null.
   191    */
   192   std::vector<RefPtr<SourceSurface> > mInputSurfaces;
   193   std::vector<RefPtr<FilterNodeSoftware> > mInputFilters;
   195   /**
   196    * Weak pointers to our invalidation listeners, i.e. to those filters who
   197    * have this filter as an input. Invalidation listeners are required to
   198    * unsubscribe themselves from us when they let go of their reference to us.
   199    * This ensures that the pointers in this array are never stale.
   200    */
   201   std::vector<FilterInvalidationListener*> mInvalidationListeners;
   203   /**
   204    * Stores the rect which we want to render and cache on the next call to
   205    * GetOutput.
   206    */
   207   IntRect mRequestedRect;
   209   /**
   210    * Stores our cached output.
   211    */
   212   IntRect mCachedRect;
   213   RefPtr<DataSourceSurface> mCachedOutput;
   214 };
   216 // Subclasses for specific filters.
   218 class FilterNodeTransformSoftware : public FilterNodeSoftware
   219 {
   220 public:
   221   MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeTransformSoftware)
   222   FilterNodeTransformSoftware();
   223   virtual const char* GetName() MOZ_OVERRIDE { return "Transform"; }
   224   using FilterNodeSoftware::SetAttribute;
   225   virtual void SetAttribute(uint32_t aIndex, uint32_t aGraphicsFilter) MOZ_OVERRIDE;
   226   virtual void SetAttribute(uint32_t aIndex, const Matrix &aMatrix) MOZ_OVERRIDE;
   228 protected:
   229   virtual TemporaryRef<DataSourceSurface> Render(const IntRect& aRect) MOZ_OVERRIDE;
   230   virtual IntRect GetOutputRectInRect(const IntRect& aRect) MOZ_OVERRIDE;
   231   virtual int32_t InputIndex(uint32_t aInputEnumIndex) MOZ_OVERRIDE;
   232   virtual void RequestFromInputsForRect(const IntRect &aRect) MOZ_OVERRIDE;
   233   IntRect SourceRectForOutputRect(const IntRect &aRect);
   235 private:
   236   Matrix mMatrix;
   237   Filter mFilter;
   238 };
   240 class FilterNodeBlendSoftware : public FilterNodeSoftware
   241 {
   242 public:
   243   MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeBlendSoftware)
   244   FilterNodeBlendSoftware();
   245   virtual const char* GetName() MOZ_OVERRIDE { return "Blend"; }
   246   using FilterNodeSoftware::SetAttribute;
   247   virtual void SetAttribute(uint32_t aIndex, uint32_t aBlendMode) MOZ_OVERRIDE;
   249 protected:
   250   virtual TemporaryRef<DataSourceSurface> Render(const IntRect& aRect) MOZ_OVERRIDE;
   251   virtual IntRect GetOutputRectInRect(const IntRect& aRect) MOZ_OVERRIDE;
   252   virtual int32_t InputIndex(uint32_t aInputEnumIndex) MOZ_OVERRIDE;
   253   virtual void RequestFromInputsForRect(const IntRect &aRect) MOZ_OVERRIDE;
   255 private:
   256   BlendMode mBlendMode;
   257 };
   259 class FilterNodeMorphologySoftware : public FilterNodeSoftware
   260 {
   261 public:
   262   MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeMorphologySoftware)
   263   FilterNodeMorphologySoftware();
   264   virtual const char* GetName() MOZ_OVERRIDE { return "Morphology"; }
   265   using FilterNodeSoftware::SetAttribute;
   266   virtual void SetAttribute(uint32_t aIndex, const IntSize &aRadii) MOZ_OVERRIDE;
   267   virtual void SetAttribute(uint32_t aIndex, uint32_t aOperator) MOZ_OVERRIDE;
   269 protected:
   270   virtual TemporaryRef<DataSourceSurface> Render(const IntRect& aRect) MOZ_OVERRIDE;
   271   virtual IntRect GetOutputRectInRect(const IntRect& aRect) MOZ_OVERRIDE;
   272   virtual int32_t InputIndex(uint32_t aInputEnumIndex) MOZ_OVERRIDE;
   273   virtual void RequestFromInputsForRect(const IntRect &aRect) MOZ_OVERRIDE;
   275 private:
   276   IntSize mRadii;
   277   MorphologyOperator mOperator;
   278 };
   280 class FilterNodeColorMatrixSoftware : public FilterNodeSoftware
   281 {
   282 public:
   283   MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeColorMatrixSoftware)
   284   virtual const char* GetName() MOZ_OVERRIDE { return "ColorMatrix"; }
   285   using FilterNodeSoftware::SetAttribute;
   286   virtual void SetAttribute(uint32_t aIndex, const Matrix5x4 &aMatrix) MOZ_OVERRIDE;
   287   virtual void SetAttribute(uint32_t aIndex, uint32_t aAlphaMode) MOZ_OVERRIDE;
   289 protected:
   290   virtual TemporaryRef<DataSourceSurface> Render(const IntRect& aRect) MOZ_OVERRIDE;
   291   virtual IntRect GetOutputRectInRect(const IntRect& aRect) MOZ_OVERRIDE;
   292   virtual int32_t InputIndex(uint32_t aInputEnumIndex) MOZ_OVERRIDE;
   293   virtual void RequestFromInputsForRect(const IntRect &aRect) MOZ_OVERRIDE;
   295 private:
   296   Matrix5x4 mMatrix;
   297   AlphaMode mAlphaMode;
   298 };
   300 class FilterNodeFloodSoftware : public FilterNodeSoftware
   301 {
   302 public:
   303   MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeFloodSoftware)
   304   virtual const char* GetName() MOZ_OVERRIDE { return "Flood"; }
   305   using FilterNodeSoftware::SetAttribute;
   306   virtual void SetAttribute(uint32_t aIndex, const Color &aColor) MOZ_OVERRIDE;
   308 protected:
   309   virtual TemporaryRef<DataSourceSurface> GetOutput(const IntRect &aRect) MOZ_OVERRIDE;
   310   virtual TemporaryRef<DataSourceSurface> Render(const IntRect& aRect) MOZ_OVERRIDE;
   311   virtual IntRect GetOutputRectInRect(const IntRect& aRect) MOZ_OVERRIDE;
   313 private:
   314   Color mColor;
   315 };
   317 class FilterNodeTileSoftware : public FilterNodeSoftware
   318 {
   319 public:
   320   MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeTileSoftware)
   321   virtual const char* GetName() MOZ_OVERRIDE { return "Tile"; }
   322   using FilterNodeSoftware::SetAttribute;
   323   virtual void SetAttribute(uint32_t aIndex, const IntRect &aSourceRect) MOZ_OVERRIDE;
   325 protected:
   326   virtual TemporaryRef<DataSourceSurface> Render(const IntRect& aRect) MOZ_OVERRIDE;
   327   virtual IntRect GetOutputRectInRect(const IntRect& aRect) MOZ_OVERRIDE;
   328   virtual int32_t InputIndex(uint32_t aInputEnumIndex) MOZ_OVERRIDE;
   329   virtual void RequestFromInputsForRect(const IntRect &aRect) MOZ_OVERRIDE;
   331 private:
   332   IntRect mSourceRect;
   333 };
   335 /**
   336  * Baseclass for the four different component transfer filters.
   337  */
   338 class FilterNodeComponentTransferSoftware : public FilterNodeSoftware
   339 {
   340 public:
   341   MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeComponentTransferSoftware)
   342   FilterNodeComponentTransferSoftware();
   344   using FilterNodeSoftware::SetAttribute;
   345   virtual void SetAttribute(uint32_t aIndex, bool aDisable) MOZ_OVERRIDE;
   347 protected:
   348   virtual TemporaryRef<DataSourceSurface> Render(const IntRect& aRect) MOZ_OVERRIDE;
   349   virtual IntRect GetOutputRectInRect(const IntRect& aRect) MOZ_OVERRIDE;
   350   virtual int32_t InputIndex(uint32_t aInputEnumIndex) MOZ_OVERRIDE;
   351   virtual void RequestFromInputsForRect(const IntRect &aRect) MOZ_OVERRIDE;
   352   virtual void GenerateLookupTable(ptrdiff_t aComponent, uint8_t aTables[4][256],
   353                                    bool aDisabled);
   354   virtual void FillLookupTable(ptrdiff_t aComponent, uint8_t aTable[256]) = 0;
   356   bool mDisableR;
   357   bool mDisableG;
   358   bool mDisableB;
   359   bool mDisableA;
   360 };
   362 class FilterNodeTableTransferSoftware : public FilterNodeComponentTransferSoftware
   363 {
   364 public:
   365   MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeTableTransferSoftware)
   366   virtual const char* GetName() MOZ_OVERRIDE { return "TableTransfer"; }
   367   using FilterNodeComponentTransferSoftware::SetAttribute;
   368   virtual void SetAttribute(uint32_t aIndex, const Float* aFloat, uint32_t aSize) MOZ_OVERRIDE;
   370 protected:
   371   virtual void FillLookupTable(ptrdiff_t aComponent, uint8_t aTable[256]) MOZ_OVERRIDE;
   373 private:
   374   void FillLookupTableImpl(std::vector<Float>& aTableValues, uint8_t aTable[256]);
   376   std::vector<Float> mTableR;
   377   std::vector<Float> mTableG;
   378   std::vector<Float> mTableB;
   379   std::vector<Float> mTableA;
   380 };
   382 class FilterNodeDiscreteTransferSoftware : public FilterNodeComponentTransferSoftware
   383 {
   384 public:
   385   MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeDiscreteTransferSoftware)
   386   virtual const char* GetName() MOZ_OVERRIDE { return "DiscreteTransfer"; }
   387   using FilterNodeComponentTransferSoftware::SetAttribute;
   388   virtual void SetAttribute(uint32_t aIndex, const Float* aFloat, uint32_t aSize) MOZ_OVERRIDE;
   390 protected:
   391   virtual void FillLookupTable(ptrdiff_t aComponent, uint8_t aTable[256]) MOZ_OVERRIDE;
   393 private:
   394   void FillLookupTableImpl(std::vector<Float>& aTableValues, uint8_t aTable[256]);
   396   std::vector<Float> mTableR;
   397   std::vector<Float> mTableG;
   398   std::vector<Float> mTableB;
   399   std::vector<Float> mTableA;
   400 };
   402 class FilterNodeLinearTransferSoftware : public FilterNodeComponentTransferSoftware
   403 {
   404 public:
   405   MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeLinearTransformSoftware)
   406   FilterNodeLinearTransferSoftware();
   407   virtual const char* GetName() MOZ_OVERRIDE { return "LinearTransfer"; }
   408   using FilterNodeComponentTransferSoftware::SetAttribute;
   409   virtual void SetAttribute(uint32_t aIndex, Float aValue) MOZ_OVERRIDE;
   411 protected:
   412   virtual void FillLookupTable(ptrdiff_t aComponent, uint8_t aTable[256]) MOZ_OVERRIDE;
   414 private:
   415   void FillLookupTableImpl(Float aSlope, Float aIntercept, uint8_t aTable[256]);
   417   Float mSlopeR;
   418   Float mSlopeG;
   419   Float mSlopeB;
   420   Float mSlopeA;
   421   Float mInterceptR;
   422   Float mInterceptG;
   423   Float mInterceptB;
   424   Float mInterceptA;
   425 };
   427 class FilterNodeGammaTransferSoftware : public FilterNodeComponentTransferSoftware
   428 {
   429 public:
   430   MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeGammaTransferSoftware)
   431   FilterNodeGammaTransferSoftware();
   432   virtual const char* GetName() MOZ_OVERRIDE { return "GammaTransfer"; }
   433   using FilterNodeComponentTransferSoftware::SetAttribute;
   434   virtual void SetAttribute(uint32_t aIndex, Float aValue) MOZ_OVERRIDE;
   436 protected:
   437   virtual void FillLookupTable(ptrdiff_t aComponent, uint8_t aTable[256]) MOZ_OVERRIDE;
   439 private:
   440   void FillLookupTableImpl(Float aAmplitude, Float aExponent, Float aOffset, uint8_t aTable[256]);
   442   Float mAmplitudeR;
   443   Float mAmplitudeG;
   444   Float mAmplitudeB;
   445   Float mAmplitudeA;
   446   Float mExponentR;
   447   Float mExponentG;
   448   Float mExponentB;
   449   Float mExponentA;
   450   Float mOffsetR;
   451   Float mOffsetG;
   452   Float mOffsetB;
   453   Float mOffsetA;
   454 };
   456 class FilterNodeConvolveMatrixSoftware : public FilterNodeSoftware
   457 {
   458 public:
   459   MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeConvolveMatrixSoftware)
   460   FilterNodeConvolveMatrixSoftware();
   461   virtual const char* GetName() MOZ_OVERRIDE { return "ConvolveMatrix"; }
   462   using FilterNodeSoftware::SetAttribute;
   463   virtual void SetAttribute(uint32_t aIndex, const IntSize &aKernelSize) MOZ_OVERRIDE;
   464   virtual void SetAttribute(uint32_t aIndex, const Float* aMatrix, uint32_t aSize) MOZ_OVERRIDE;
   465   virtual void SetAttribute(uint32_t aIndex, Float aValue) MOZ_OVERRIDE;
   466   virtual void SetAttribute(uint32_t aIndex, const Size &aKernelUnitLength) MOZ_OVERRIDE;
   467   virtual void SetAttribute(uint32_t aIndex, const IntRect &aSourceRect) MOZ_OVERRIDE;
   468   virtual void SetAttribute(uint32_t aIndex, const IntPoint &aTarget) MOZ_OVERRIDE;
   469   virtual void SetAttribute(uint32_t aIndex, uint32_t aEdgeMode) MOZ_OVERRIDE;
   470   virtual void SetAttribute(uint32_t aIndex, bool aPreserveAlpha) MOZ_OVERRIDE;
   472 protected:
   473   virtual TemporaryRef<DataSourceSurface> Render(const IntRect& aRect) MOZ_OVERRIDE;
   474   virtual IntRect GetOutputRectInRect(const IntRect& aRect) MOZ_OVERRIDE;
   475   virtual int32_t InputIndex(uint32_t aInputEnumIndex) MOZ_OVERRIDE;
   476   virtual void RequestFromInputsForRect(const IntRect &aRect) MOZ_OVERRIDE;
   478 private:
   479   template<typename CoordType>
   480   TemporaryRef<DataSourceSurface> DoRender(const IntRect& aRect,
   481                                            CoordType aKernelUnitLengthX,
   482                                            CoordType aKernelUnitLengthY);
   484   IntRect InflatedSourceRect(const IntRect &aDestRect);
   485   IntRect InflatedDestRect(const IntRect &aSourceRect);
   487   IntSize mKernelSize;
   488   std::vector<Float> mKernelMatrix;
   489   Float mDivisor;
   490   Float mBias;
   491   IntPoint mTarget;
   492   IntRect mSourceRect;
   493   ConvolveMatrixEdgeMode mEdgeMode;
   494   Size mKernelUnitLength;
   495   bool mPreserveAlpha;
   496 };
   498 class FilterNodeDisplacementMapSoftware : public FilterNodeSoftware
   499 {
   500 public:
   501   MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeDisplacementMapSoftware)
   502   FilterNodeDisplacementMapSoftware();
   503   virtual const char* GetName() MOZ_OVERRIDE { return "DisplacementMap"; }
   504   using FilterNodeSoftware::SetAttribute;
   505   virtual void SetAttribute(uint32_t aIndex, Float aScale) MOZ_OVERRIDE;
   506   virtual void SetAttribute(uint32_t aIndex, uint32_t aValue) MOZ_OVERRIDE;
   508 protected:
   509   virtual TemporaryRef<DataSourceSurface> Render(const IntRect& aRect) MOZ_OVERRIDE;
   510   virtual IntRect GetOutputRectInRect(const IntRect& aRect) MOZ_OVERRIDE;
   511   virtual int32_t InputIndex(uint32_t aInputEnumIndex) MOZ_OVERRIDE;
   512   virtual void RequestFromInputsForRect(const IntRect &aRect) MOZ_OVERRIDE;
   514 private:
   515   IntRect InflatedSourceOrDestRect(const IntRect &aDestOrSourceRect);
   517   Float mScale;
   518   ColorChannel mChannelX;
   519   ColorChannel mChannelY;
   520 };
   522 class FilterNodeTurbulenceSoftware : public FilterNodeSoftware
   523 {
   524 public:
   525   MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeTurbulenceSoftware)
   526   FilterNodeTurbulenceSoftware();
   527   virtual const char* GetName() MOZ_OVERRIDE { return "Turbulence"; }
   528   using FilterNodeSoftware::SetAttribute;
   529   virtual void SetAttribute(uint32_t aIndex, const Size &aSize) MOZ_OVERRIDE;
   530   virtual void SetAttribute(uint32_t aIndex, const IntRect &aRenderRect) MOZ_OVERRIDE;
   531   virtual void SetAttribute(uint32_t aIndex, bool aStitchable) MOZ_OVERRIDE;
   532   virtual void SetAttribute(uint32_t aIndex, uint32_t aValue) MOZ_OVERRIDE;
   534 protected:
   535   virtual TemporaryRef<DataSourceSurface> Render(const IntRect& aRect) MOZ_OVERRIDE;
   536   virtual IntRect GetOutputRectInRect(const IntRect& aRect) MOZ_OVERRIDE;
   537   virtual int32_t InputIndex(uint32_t aInputEnumIndex) MOZ_OVERRIDE;
   539 private:
   540   IntRect mRenderRect;
   541   Size mBaseFrequency;
   542   uint32_t mNumOctaves;
   543   uint32_t mSeed;
   544   bool mStitchable;
   545   TurbulenceType mType;
   546 };
   548 class FilterNodeArithmeticCombineSoftware : public FilterNodeSoftware
   549 {
   550 public:
   551   MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeArithmeticCombineSoftware)
   552   FilterNodeArithmeticCombineSoftware();
   553   virtual const char* GetName() MOZ_OVERRIDE { return "ArithmeticCombine"; }
   554   using FilterNodeSoftware::SetAttribute;
   555   virtual void SetAttribute(uint32_t aIndex, const Float* aFloat, uint32_t aSize) MOZ_OVERRIDE;
   557 protected:
   558   virtual TemporaryRef<DataSourceSurface> Render(const IntRect& aRect) MOZ_OVERRIDE;
   559   virtual IntRect GetOutputRectInRect(const IntRect& aRect) MOZ_OVERRIDE;
   560   virtual int32_t InputIndex(uint32_t aInputEnumIndex) MOZ_OVERRIDE;
   561   virtual void RequestFromInputsForRect(const IntRect &aRect) MOZ_OVERRIDE;
   563 private:
   564   Float mK1;
   565   Float mK2;
   566   Float mK3;
   567   Float mK4;
   568 };
   570 class FilterNodeCompositeSoftware : public FilterNodeSoftware
   571 {
   572 public:
   573   MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeCompositeSoftware)
   574   FilterNodeCompositeSoftware();
   575   virtual const char* GetName() MOZ_OVERRIDE { return "Composite"; }
   576   using FilterNodeSoftware::SetAttribute;
   577   virtual void SetAttribute(uint32_t aIndex, uint32_t aOperator) MOZ_OVERRIDE;
   579 protected:
   580   virtual TemporaryRef<DataSourceSurface> Render(const IntRect& aRect) MOZ_OVERRIDE;
   581   virtual IntRect GetOutputRectInRect(const IntRect& aRect) MOZ_OVERRIDE;
   582   virtual int32_t InputIndex(uint32_t aInputEnumIndex) MOZ_OVERRIDE;
   583   virtual void RequestFromInputsForRect(const IntRect &aRect) MOZ_OVERRIDE;
   585 private:
   586   CompositeOperator mOperator;
   587 };
   589 // Base class for FilterNodeGaussianBlurSoftware and
   590 // FilterNodeDirectionalBlurSoftware.
   591 class FilterNodeBlurXYSoftware : public FilterNodeSoftware
   592 {
   593 public:
   594   MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeBlurXYSoftware)
   595 protected:
   596   virtual TemporaryRef<DataSourceSurface> Render(const IntRect& aRect) MOZ_OVERRIDE;
   597   virtual IntRect GetOutputRectInRect(const IntRect& aRect) MOZ_OVERRIDE;
   598   virtual int32_t InputIndex(uint32_t aInputEnumIndex) MOZ_OVERRIDE;
   599   IntRect InflatedSourceOrDestRect(const IntRect &aDestRect);
   600   virtual void RequestFromInputsForRect(const IntRect &aRect) MOZ_OVERRIDE;
   602   // Implemented by subclasses.
   603   virtual Size StdDeviationXY() = 0;
   604 };
   606 class FilterNodeGaussianBlurSoftware : public FilterNodeBlurXYSoftware
   607 {
   608 public:
   609   MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeGaussianBlurSoftware)
   610   FilterNodeGaussianBlurSoftware();
   611   virtual const char* GetName() MOZ_OVERRIDE { return "GaussianBlur"; }
   612   using FilterNodeSoftware::SetAttribute;
   613   virtual void SetAttribute(uint32_t aIndex, Float aStdDeviation) MOZ_OVERRIDE;
   615 protected:
   616   virtual Size StdDeviationXY() MOZ_OVERRIDE;
   618 private:
   619   Float mStdDeviation;
   620 };
   622 class FilterNodeDirectionalBlurSoftware : public FilterNodeBlurXYSoftware
   623 {
   624 public:
   625   MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeDirectionalBlurSoftware)
   626   FilterNodeDirectionalBlurSoftware();
   627   virtual const char* GetName() MOZ_OVERRIDE { return "DirectionalBlur"; }
   628   using FilterNodeSoftware::SetAttribute;
   629   virtual void SetAttribute(uint32_t aIndex, Float aStdDeviation) MOZ_OVERRIDE;
   630   virtual void SetAttribute(uint32_t aIndex, uint32_t aBlurDirection) MOZ_OVERRIDE;
   632 protected:
   633   virtual Size StdDeviationXY() MOZ_OVERRIDE;
   635 private:
   636   Float mStdDeviation;
   637   BlurDirection mBlurDirection;
   638 };
   640 class FilterNodeCropSoftware : public FilterNodeSoftware
   641 {
   642 public:
   643   MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeCropSoftware)
   644   virtual const char* GetName() MOZ_OVERRIDE { return "Crop"; }
   645   using FilterNodeSoftware::SetAttribute;
   646   virtual void SetAttribute(uint32_t aIndex, const Rect &aSourceRect) MOZ_OVERRIDE;
   648 protected:
   649   virtual TemporaryRef<DataSourceSurface> Render(const IntRect& aRect) MOZ_OVERRIDE;
   650   virtual IntRect GetOutputRectInRect(const IntRect& aRect) MOZ_OVERRIDE;
   651   virtual int32_t InputIndex(uint32_t aInputEnumIndex) MOZ_OVERRIDE;
   652   virtual void RequestFromInputsForRect(const IntRect &aRect) MOZ_OVERRIDE;
   654 private:
   655   IntRect mCropRect;
   656 };
   658 class FilterNodePremultiplySoftware : public FilterNodeSoftware
   659 {
   660 public:
   661   MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodePremultiplySoftware)
   662   virtual const char* GetName() MOZ_OVERRIDE { return "Premultiply"; }
   663 protected:
   664   virtual TemporaryRef<DataSourceSurface> Render(const IntRect& aRect) MOZ_OVERRIDE;
   665   virtual IntRect GetOutputRectInRect(const IntRect& aRect) MOZ_OVERRIDE;
   666   virtual int32_t InputIndex(uint32_t aInputEnumIndex) MOZ_OVERRIDE;
   667   virtual void RequestFromInputsForRect(const IntRect &aRect) MOZ_OVERRIDE;
   668 };
   670 class FilterNodeUnpremultiplySoftware : public FilterNodeSoftware
   671 {
   672 public:
   673   MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeUnpremultiplySoftware)
   674   virtual const char* GetName() MOZ_OVERRIDE { return "Unpremultiply"; }
   675 protected:
   676   virtual TemporaryRef<DataSourceSurface> Render(const IntRect& aRect) MOZ_OVERRIDE;
   677   virtual IntRect GetOutputRectInRect(const IntRect& aRect) MOZ_OVERRIDE;
   678   virtual int32_t InputIndex(uint32_t aInputEnumIndex) MOZ_OVERRIDE;
   679   virtual void RequestFromInputsForRect(const IntRect &aRect) MOZ_OVERRIDE;
   680 };
   682 template<typename LightType, typename LightingType>
   683 class FilterNodeLightingSoftware : public FilterNodeSoftware
   684 {
   685 public:
   686 #if defined(MOZILLA_INTERNAL_API) && (defined(DEBUG) || defined(FORCE_BUILD_REFCNT_LOGGING))
   687   // Helpers for refcounted
   688   virtual const char* typeName() const MOZ_OVERRIDE { return mTypeName; }
   689   virtual size_t typeSize() const MOZ_OVERRIDE { return sizeof(*this); }
   690 #endif
   691   explicit FilterNodeLightingSoftware(const char* aTypeName);
   692   virtual const char* GetName() MOZ_OVERRIDE { return "Lighting"; }
   693   using FilterNodeSoftware::SetAttribute;
   694   virtual void SetAttribute(uint32_t aIndex, Float) MOZ_OVERRIDE;
   695   virtual void SetAttribute(uint32_t aIndex, const Size &) MOZ_OVERRIDE;
   696   virtual void SetAttribute(uint32_t aIndex, const Point3D &) MOZ_OVERRIDE;
   697   virtual void SetAttribute(uint32_t aIndex, const Color &) MOZ_OVERRIDE;
   699 protected:
   700   virtual TemporaryRef<DataSourceSurface> Render(const IntRect& aRect) MOZ_OVERRIDE;
   701   virtual IntRect GetOutputRectInRect(const IntRect& aRect) MOZ_OVERRIDE;
   702   virtual int32_t InputIndex(uint32_t aInputEnumIndex) MOZ_OVERRIDE;
   703   virtual void RequestFromInputsForRect(const IntRect &aRect) MOZ_OVERRIDE;
   705 private:
   706   template<typename CoordType>
   707   TemporaryRef<DataSourceSurface> DoRender(const IntRect& aRect,
   708                                            CoordType aKernelUnitLengthX,
   709                                            CoordType aKernelUnitLengthY);
   711   LightType mLight;
   712   LightingType mLighting;
   713   Float mSurfaceScale;
   714   Size mKernelUnitLength;
   715   Color mColor;
   716 #if defined(MOZILLA_INTERNAL_API) && (defined(DEBUG) || defined(FORCE_BUILD_REFCNT_LOGGING))
   717   const char* mTypeName;
   718 #endif
   719 };
   721 }
   722 }
   724 #endif // _MOZILLA_GFX_FILTERNODESOFTWARE_H_

mercurial