1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gfx/2d/FilterNodeSoftware.h Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,724 @@ 1.4 +/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*- 1.5 + * This Source Code Form is subject to the terms of the Mozilla Public 1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.7 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.8 + 1.9 +#ifndef _MOZILLA_GFX_FILTERNODESOFTWARE_H_ 1.10 +#define _MOZILLA_GFX_FILTERNODESOFTWARE_H_ 1.11 + 1.12 +#include "Filters.h" 1.13 +#include <vector> 1.14 + 1.15 +namespace mozilla { 1.16 +namespace gfx { 1.17 + 1.18 +class DataSourceSurface; 1.19 +class DrawTarget; 1.20 +struct DrawOptions; 1.21 +class FilterNodeSoftware; 1.22 + 1.23 +/** 1.24 + * Can be attached to FilterNodeSoftware instances using 1.25 + * AddInvalidationListener. FilterInvalidated is called whenever the output of 1.26 + * the observed filter may have changed; that is, whenever cached GetOutput() 1.27 + * results (and results derived from them) need to discarded. 1.28 + */ 1.29 +class FilterInvalidationListener 1.30 +{ 1.31 +public: 1.32 + virtual void FilterInvalidated(FilterNodeSoftware* aFilter) = 0; 1.33 +}; 1.34 + 1.35 +/** 1.36 + * This is the base class for the software (i.e. pure CPU, non-accelerated) 1.37 + * FilterNode implementation. The software implementation is backend-agnostic, 1.38 + * so it can be used as a fallback for all DrawTarget implementations. 1.39 + */ 1.40 +class FilterNodeSoftware : public FilterNode, 1.41 + public FilterInvalidationListener 1.42 +{ 1.43 +public: 1.44 + MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeSoftware) 1.45 + virtual ~FilterNodeSoftware(); 1.46 + 1.47 + // Factory method, intended to be called from DrawTarget*::CreateFilter. 1.48 + static TemporaryRef<FilterNode> Create(FilterType aType); 1.49 + 1.50 + // Draw the filter, intended to be called by DrawTarget*::DrawFilter. 1.51 + void Draw(DrawTarget* aDrawTarget, const Rect &aSourceRect, 1.52 + const Point &aDestPoint, const DrawOptions &aOptions); 1.53 + 1.54 + virtual FilterBackend GetBackendType() MOZ_OVERRIDE { return FILTER_BACKEND_SOFTWARE; } 1.55 + virtual void SetInput(uint32_t aIndex, SourceSurface *aSurface) MOZ_OVERRIDE; 1.56 + virtual void SetInput(uint32_t aIndex, FilterNode *aFilter) MOZ_OVERRIDE; 1.57 + 1.58 + virtual const char* GetName() { return "Unknown"; } 1.59 + 1.60 + virtual void AddInvalidationListener(FilterInvalidationListener* aListener); 1.61 + virtual void RemoveInvalidationListener(FilterInvalidationListener* aListener); 1.62 + 1.63 + // FilterInvalidationListener implementation 1.64 + virtual void FilterInvalidated(FilterNodeSoftware* aFilter); 1.65 + 1.66 +protected: 1.67 + 1.68 + // The following methods are intended to be overriden by subclasses. 1.69 + 1.70 + /** 1.71 + * Translates a *FilterInputs enum value into an index for the 1.72 + * mInputFilters / mInputSurfaces arrays. Returns -1 for invalid inputs. 1.73 + * If somebody calls SetInput(enumValue, input) with an enumValue for which 1.74 + * InputIndex(enumValue) is -1, we abort. 1.75 + */ 1.76 + virtual int32_t InputIndex(uint32_t aInputEnumIndex) { return -1; } 1.77 + 1.78 + /** 1.79 + * Every filter node has an output rect, which can also be infinite. The 1.80 + * output rect can depend on the values of any set attributes and on the 1.81 + * output rects of any input filters or surfaces. 1.82 + * This method returns the intersection of the filter's output rect with 1.83 + * aInRect. Filters with unconstrained output always return aInRect. 1.84 + */ 1.85 + virtual IntRect GetOutputRectInRect(const IntRect& aInRect) = 0; 1.86 + 1.87 + /** 1.88 + * Return a surface with the rendered output which is of size aRect.Size(). 1.89 + * aRect is required to be a subrect of this filter's output rect; in other 1.90 + * words, aRect == GetOutputRectInRect(aRect) must always be true. 1.91 + * May return nullptr in error conditions or for an empty aRect. 1.92 + * Implementations are not required to allocate a new surface and may even 1.93 + * pass through input surfaces unchanged. 1.94 + * Callers need to treat the returned surface as immutable. 1.95 + */ 1.96 + virtual TemporaryRef<DataSourceSurface> Render(const IntRect& aRect) = 0; 1.97 + 1.98 + /** 1.99 + * Call RequestRect (see below) on any input filters with the desired input 1.100 + * rect, so that the input filter knows what to cache the next time it 1.101 + * renders. 1.102 + */ 1.103 + virtual void RequestFromInputsForRect(const IntRect &aRect) {} 1.104 + 1.105 + /** 1.106 + * This method provides a caching default implementation but can be overriden 1.107 + * by subclasses that don't want to cache their output. Those classes should 1.108 + * call Render(aRect) directly from here. 1.109 + */ 1.110 + virtual TemporaryRef<DataSourceSurface> GetOutput(const IntRect &aRect); 1.111 + 1.112 + // The following methods are non-virtual helper methods. 1.113 + 1.114 + /** 1.115 + * Format hints for GetInputDataSourceSurface. Some callers of 1.116 + * GetInputDataSourceSurface can handle both B8G8R8A8 and A8 surfaces, these 1.117 + * should pass CAN_HANDLE_A8 in order to avoid unnecessary conversions. 1.118 + * Callers that can only handle B8G8R8A8 surfaces pass NEED_COLOR_CHANNELS. 1.119 + */ 1.120 + enum FormatHint { 1.121 + CAN_HANDLE_A8, 1.122 + NEED_COLOR_CHANNELS 1.123 + }; 1.124 + 1.125 + /** 1.126 + * Returns SurfaceFormat::B8G8R8A8 or SurfaceFormat::A8, depending on the current surface 1.127 + * format and the format hint. 1.128 + */ 1.129 + SurfaceFormat DesiredFormat(SurfaceFormat aCurrentFormat, 1.130 + FormatHint aFormatHint); 1.131 + 1.132 + /** 1.133 + * Intended to be called by FilterNodeSoftware::Render implementations. 1.134 + * Returns a surface of size aRect.Size() or nullptr in error conditions. The 1.135 + * returned surface contains the output of the specified input filter or 1.136 + * input surface in aRect. If aRect extends beyond the input filter's output 1.137 + * rect (or the input surface's dimensions), the remaining area is filled 1.138 + * according to aEdgeMode: The default, EDGE_MODE_NONE, simply pads with 1.139 + * transparent black. 1.140 + * If non-null, the returned surface is guaranteed to be of SurfaceFormat::A8 or 1.141 + * SurfaceFormat::B8G8R8A8. If aFormatHint is NEED_COLOR_CHANNELS, the returned 1.142 + * surface is guaranteed to be of SurfaceFormat::B8G8R8A8 always. 1.143 + * Each pixel row of the returned surface is guaranteed to be 16-byte aligned. 1.144 + */ 1.145 + TemporaryRef<DataSourceSurface> 1.146 + GetInputDataSourceSurface(uint32_t aInputEnumIndex, const IntRect& aRect, 1.147 + FormatHint aFormatHint = CAN_HANDLE_A8, 1.148 + ConvolveMatrixEdgeMode aEdgeMode = EDGE_MODE_NONE, 1.149 + const IntRect *aTransparencyPaddedSourceRect = nullptr); 1.150 + 1.151 + /** 1.152 + * Returns the intersection of the input filter's or surface's output rect 1.153 + * with aInRect. 1.154 + */ 1.155 + IntRect GetInputRectInRect(uint32_t aInputEnumIndex, const IntRect& aInRect); 1.156 + 1.157 + /** 1.158 + * Calls RequestRect on the specified input, if it's a filter. 1.159 + */ 1.160 + void RequestInputRect(uint32_t aInputEnumIndex, const IntRect& aRect); 1.161 + 1.162 + /** 1.163 + * Returns the number of set input filters or surfaces. Needed for filters 1.164 + * which can have an arbitrary number of inputs. 1.165 + */ 1.166 + size_t NumberOfSetInputs(); 1.167 + 1.168 + /** 1.169 + * Discard the cached surface that was stored in the GetOutput default 1.170 + * implementation. Needs to be called whenever attributes or inputs are set 1.171 + * that might change the result of a Render() call. 1.172 + */ 1.173 + void Invalidate(); 1.174 + 1.175 + /** 1.176 + * Called in order to let this filter know what to cache during the next 1.177 + * GetOutput call. Expected to call RequestRect on this filter's input 1.178 + * filters. 1.179 + */ 1.180 + void RequestRect(const IntRect &aRect); 1.181 + 1.182 + /** 1.183 + * Set input filter and clear input surface for this input index, or set 1.184 + * input surface and clear input filter. One of aSurface and aFilter should 1.185 + * be null. 1.186 + */ 1.187 + void SetInput(uint32_t aIndex, SourceSurface *aSurface, 1.188 + FilterNodeSoftware *aFilter); 1.189 + 1.190 +protected: 1.191 + /** 1.192 + * mInputSurfaces / mInputFilters: For each input index, either a surface or 1.193 + * a filter is set, and the other is null. 1.194 + */ 1.195 + std::vector<RefPtr<SourceSurface> > mInputSurfaces; 1.196 + std::vector<RefPtr<FilterNodeSoftware> > mInputFilters; 1.197 + 1.198 + /** 1.199 + * Weak pointers to our invalidation listeners, i.e. to those filters who 1.200 + * have this filter as an input. Invalidation listeners are required to 1.201 + * unsubscribe themselves from us when they let go of their reference to us. 1.202 + * This ensures that the pointers in this array are never stale. 1.203 + */ 1.204 + std::vector<FilterInvalidationListener*> mInvalidationListeners; 1.205 + 1.206 + /** 1.207 + * Stores the rect which we want to render and cache on the next call to 1.208 + * GetOutput. 1.209 + */ 1.210 + IntRect mRequestedRect; 1.211 + 1.212 + /** 1.213 + * Stores our cached output. 1.214 + */ 1.215 + IntRect mCachedRect; 1.216 + RefPtr<DataSourceSurface> mCachedOutput; 1.217 +}; 1.218 + 1.219 +// Subclasses for specific filters. 1.220 + 1.221 +class FilterNodeTransformSoftware : public FilterNodeSoftware 1.222 +{ 1.223 +public: 1.224 + MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeTransformSoftware) 1.225 + FilterNodeTransformSoftware(); 1.226 + virtual const char* GetName() MOZ_OVERRIDE { return "Transform"; } 1.227 + using FilterNodeSoftware::SetAttribute; 1.228 + virtual void SetAttribute(uint32_t aIndex, uint32_t aGraphicsFilter) MOZ_OVERRIDE; 1.229 + virtual void SetAttribute(uint32_t aIndex, const Matrix &aMatrix) MOZ_OVERRIDE; 1.230 + 1.231 +protected: 1.232 + virtual TemporaryRef<DataSourceSurface> Render(const IntRect& aRect) MOZ_OVERRIDE; 1.233 + virtual IntRect GetOutputRectInRect(const IntRect& aRect) MOZ_OVERRIDE; 1.234 + virtual int32_t InputIndex(uint32_t aInputEnumIndex) MOZ_OVERRIDE; 1.235 + virtual void RequestFromInputsForRect(const IntRect &aRect) MOZ_OVERRIDE; 1.236 + IntRect SourceRectForOutputRect(const IntRect &aRect); 1.237 + 1.238 +private: 1.239 + Matrix mMatrix; 1.240 + Filter mFilter; 1.241 +}; 1.242 + 1.243 +class FilterNodeBlendSoftware : public FilterNodeSoftware 1.244 +{ 1.245 +public: 1.246 + MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeBlendSoftware) 1.247 + FilterNodeBlendSoftware(); 1.248 + virtual const char* GetName() MOZ_OVERRIDE { return "Blend"; } 1.249 + using FilterNodeSoftware::SetAttribute; 1.250 + virtual void SetAttribute(uint32_t aIndex, uint32_t aBlendMode) MOZ_OVERRIDE; 1.251 + 1.252 +protected: 1.253 + virtual TemporaryRef<DataSourceSurface> Render(const IntRect& aRect) MOZ_OVERRIDE; 1.254 + virtual IntRect GetOutputRectInRect(const IntRect& aRect) MOZ_OVERRIDE; 1.255 + virtual int32_t InputIndex(uint32_t aInputEnumIndex) MOZ_OVERRIDE; 1.256 + virtual void RequestFromInputsForRect(const IntRect &aRect) MOZ_OVERRIDE; 1.257 + 1.258 +private: 1.259 + BlendMode mBlendMode; 1.260 +}; 1.261 + 1.262 +class FilterNodeMorphologySoftware : public FilterNodeSoftware 1.263 +{ 1.264 +public: 1.265 + MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeMorphologySoftware) 1.266 + FilterNodeMorphologySoftware(); 1.267 + virtual const char* GetName() MOZ_OVERRIDE { return "Morphology"; } 1.268 + using FilterNodeSoftware::SetAttribute; 1.269 + virtual void SetAttribute(uint32_t aIndex, const IntSize &aRadii) MOZ_OVERRIDE; 1.270 + virtual void SetAttribute(uint32_t aIndex, uint32_t aOperator) MOZ_OVERRIDE; 1.271 + 1.272 +protected: 1.273 + virtual TemporaryRef<DataSourceSurface> Render(const IntRect& aRect) MOZ_OVERRIDE; 1.274 + virtual IntRect GetOutputRectInRect(const IntRect& aRect) MOZ_OVERRIDE; 1.275 + virtual int32_t InputIndex(uint32_t aInputEnumIndex) MOZ_OVERRIDE; 1.276 + virtual void RequestFromInputsForRect(const IntRect &aRect) MOZ_OVERRIDE; 1.277 + 1.278 +private: 1.279 + IntSize mRadii; 1.280 + MorphologyOperator mOperator; 1.281 +}; 1.282 + 1.283 +class FilterNodeColorMatrixSoftware : public FilterNodeSoftware 1.284 +{ 1.285 +public: 1.286 + MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeColorMatrixSoftware) 1.287 + virtual const char* GetName() MOZ_OVERRIDE { return "ColorMatrix"; } 1.288 + using FilterNodeSoftware::SetAttribute; 1.289 + virtual void SetAttribute(uint32_t aIndex, const Matrix5x4 &aMatrix) MOZ_OVERRIDE; 1.290 + virtual void SetAttribute(uint32_t aIndex, uint32_t aAlphaMode) MOZ_OVERRIDE; 1.291 + 1.292 +protected: 1.293 + virtual TemporaryRef<DataSourceSurface> Render(const IntRect& aRect) MOZ_OVERRIDE; 1.294 + virtual IntRect GetOutputRectInRect(const IntRect& aRect) MOZ_OVERRIDE; 1.295 + virtual int32_t InputIndex(uint32_t aInputEnumIndex) MOZ_OVERRIDE; 1.296 + virtual void RequestFromInputsForRect(const IntRect &aRect) MOZ_OVERRIDE; 1.297 + 1.298 +private: 1.299 + Matrix5x4 mMatrix; 1.300 + AlphaMode mAlphaMode; 1.301 +}; 1.302 + 1.303 +class FilterNodeFloodSoftware : public FilterNodeSoftware 1.304 +{ 1.305 +public: 1.306 + MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeFloodSoftware) 1.307 + virtual const char* GetName() MOZ_OVERRIDE { return "Flood"; } 1.308 + using FilterNodeSoftware::SetAttribute; 1.309 + virtual void SetAttribute(uint32_t aIndex, const Color &aColor) MOZ_OVERRIDE; 1.310 + 1.311 +protected: 1.312 + virtual TemporaryRef<DataSourceSurface> GetOutput(const IntRect &aRect) MOZ_OVERRIDE; 1.313 + virtual TemporaryRef<DataSourceSurface> Render(const IntRect& aRect) MOZ_OVERRIDE; 1.314 + virtual IntRect GetOutputRectInRect(const IntRect& aRect) MOZ_OVERRIDE; 1.315 + 1.316 +private: 1.317 + Color mColor; 1.318 +}; 1.319 + 1.320 +class FilterNodeTileSoftware : public FilterNodeSoftware 1.321 +{ 1.322 +public: 1.323 + MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeTileSoftware) 1.324 + virtual const char* GetName() MOZ_OVERRIDE { return "Tile"; } 1.325 + using FilterNodeSoftware::SetAttribute; 1.326 + virtual void SetAttribute(uint32_t aIndex, const IntRect &aSourceRect) MOZ_OVERRIDE; 1.327 + 1.328 +protected: 1.329 + virtual TemporaryRef<DataSourceSurface> Render(const IntRect& aRect) MOZ_OVERRIDE; 1.330 + virtual IntRect GetOutputRectInRect(const IntRect& aRect) MOZ_OVERRIDE; 1.331 + virtual int32_t InputIndex(uint32_t aInputEnumIndex) MOZ_OVERRIDE; 1.332 + virtual void RequestFromInputsForRect(const IntRect &aRect) MOZ_OVERRIDE; 1.333 + 1.334 +private: 1.335 + IntRect mSourceRect; 1.336 +}; 1.337 + 1.338 +/** 1.339 + * Baseclass for the four different component transfer filters. 1.340 + */ 1.341 +class FilterNodeComponentTransferSoftware : public FilterNodeSoftware 1.342 +{ 1.343 +public: 1.344 + MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeComponentTransferSoftware) 1.345 + FilterNodeComponentTransferSoftware(); 1.346 + 1.347 + using FilterNodeSoftware::SetAttribute; 1.348 + virtual void SetAttribute(uint32_t aIndex, bool aDisable) MOZ_OVERRIDE; 1.349 + 1.350 +protected: 1.351 + virtual TemporaryRef<DataSourceSurface> Render(const IntRect& aRect) MOZ_OVERRIDE; 1.352 + virtual IntRect GetOutputRectInRect(const IntRect& aRect) MOZ_OVERRIDE; 1.353 + virtual int32_t InputIndex(uint32_t aInputEnumIndex) MOZ_OVERRIDE; 1.354 + virtual void RequestFromInputsForRect(const IntRect &aRect) MOZ_OVERRIDE; 1.355 + virtual void GenerateLookupTable(ptrdiff_t aComponent, uint8_t aTables[4][256], 1.356 + bool aDisabled); 1.357 + virtual void FillLookupTable(ptrdiff_t aComponent, uint8_t aTable[256]) = 0; 1.358 + 1.359 + bool mDisableR; 1.360 + bool mDisableG; 1.361 + bool mDisableB; 1.362 + bool mDisableA; 1.363 +}; 1.364 + 1.365 +class FilterNodeTableTransferSoftware : public FilterNodeComponentTransferSoftware 1.366 +{ 1.367 +public: 1.368 + MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeTableTransferSoftware) 1.369 + virtual const char* GetName() MOZ_OVERRIDE { return "TableTransfer"; } 1.370 + using FilterNodeComponentTransferSoftware::SetAttribute; 1.371 + virtual void SetAttribute(uint32_t aIndex, const Float* aFloat, uint32_t aSize) MOZ_OVERRIDE; 1.372 + 1.373 +protected: 1.374 + virtual void FillLookupTable(ptrdiff_t aComponent, uint8_t aTable[256]) MOZ_OVERRIDE; 1.375 + 1.376 +private: 1.377 + void FillLookupTableImpl(std::vector<Float>& aTableValues, uint8_t aTable[256]); 1.378 + 1.379 + std::vector<Float> mTableR; 1.380 + std::vector<Float> mTableG; 1.381 + std::vector<Float> mTableB; 1.382 + std::vector<Float> mTableA; 1.383 +}; 1.384 + 1.385 +class FilterNodeDiscreteTransferSoftware : public FilterNodeComponentTransferSoftware 1.386 +{ 1.387 +public: 1.388 + MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeDiscreteTransferSoftware) 1.389 + virtual const char* GetName() MOZ_OVERRIDE { return "DiscreteTransfer"; } 1.390 + using FilterNodeComponentTransferSoftware::SetAttribute; 1.391 + virtual void SetAttribute(uint32_t aIndex, const Float* aFloat, uint32_t aSize) MOZ_OVERRIDE; 1.392 + 1.393 +protected: 1.394 + virtual void FillLookupTable(ptrdiff_t aComponent, uint8_t aTable[256]) MOZ_OVERRIDE; 1.395 + 1.396 +private: 1.397 + void FillLookupTableImpl(std::vector<Float>& aTableValues, uint8_t aTable[256]); 1.398 + 1.399 + std::vector<Float> mTableR; 1.400 + std::vector<Float> mTableG; 1.401 + std::vector<Float> mTableB; 1.402 + std::vector<Float> mTableA; 1.403 +}; 1.404 + 1.405 +class FilterNodeLinearTransferSoftware : public FilterNodeComponentTransferSoftware 1.406 +{ 1.407 +public: 1.408 + MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeLinearTransformSoftware) 1.409 + FilterNodeLinearTransferSoftware(); 1.410 + virtual const char* GetName() MOZ_OVERRIDE { return "LinearTransfer"; } 1.411 + using FilterNodeComponentTransferSoftware::SetAttribute; 1.412 + virtual void SetAttribute(uint32_t aIndex, Float aValue) MOZ_OVERRIDE; 1.413 + 1.414 +protected: 1.415 + virtual void FillLookupTable(ptrdiff_t aComponent, uint8_t aTable[256]) MOZ_OVERRIDE; 1.416 + 1.417 +private: 1.418 + void FillLookupTableImpl(Float aSlope, Float aIntercept, uint8_t aTable[256]); 1.419 + 1.420 + Float mSlopeR; 1.421 + Float mSlopeG; 1.422 + Float mSlopeB; 1.423 + Float mSlopeA; 1.424 + Float mInterceptR; 1.425 + Float mInterceptG; 1.426 + Float mInterceptB; 1.427 + Float mInterceptA; 1.428 +}; 1.429 + 1.430 +class FilterNodeGammaTransferSoftware : public FilterNodeComponentTransferSoftware 1.431 +{ 1.432 +public: 1.433 + MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeGammaTransferSoftware) 1.434 + FilterNodeGammaTransferSoftware(); 1.435 + virtual const char* GetName() MOZ_OVERRIDE { return "GammaTransfer"; } 1.436 + using FilterNodeComponentTransferSoftware::SetAttribute; 1.437 + virtual void SetAttribute(uint32_t aIndex, Float aValue) MOZ_OVERRIDE; 1.438 + 1.439 +protected: 1.440 + virtual void FillLookupTable(ptrdiff_t aComponent, uint8_t aTable[256]) MOZ_OVERRIDE; 1.441 + 1.442 +private: 1.443 + void FillLookupTableImpl(Float aAmplitude, Float aExponent, Float aOffset, uint8_t aTable[256]); 1.444 + 1.445 + Float mAmplitudeR; 1.446 + Float mAmplitudeG; 1.447 + Float mAmplitudeB; 1.448 + Float mAmplitudeA; 1.449 + Float mExponentR; 1.450 + Float mExponentG; 1.451 + Float mExponentB; 1.452 + Float mExponentA; 1.453 + Float mOffsetR; 1.454 + Float mOffsetG; 1.455 + Float mOffsetB; 1.456 + Float mOffsetA; 1.457 +}; 1.458 + 1.459 +class FilterNodeConvolveMatrixSoftware : public FilterNodeSoftware 1.460 +{ 1.461 +public: 1.462 + MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeConvolveMatrixSoftware) 1.463 + FilterNodeConvolveMatrixSoftware(); 1.464 + virtual const char* GetName() MOZ_OVERRIDE { return "ConvolveMatrix"; } 1.465 + using FilterNodeSoftware::SetAttribute; 1.466 + virtual void SetAttribute(uint32_t aIndex, const IntSize &aKernelSize) MOZ_OVERRIDE; 1.467 + virtual void SetAttribute(uint32_t aIndex, const Float* aMatrix, uint32_t aSize) MOZ_OVERRIDE; 1.468 + virtual void SetAttribute(uint32_t aIndex, Float aValue) MOZ_OVERRIDE; 1.469 + virtual void SetAttribute(uint32_t aIndex, const Size &aKernelUnitLength) MOZ_OVERRIDE; 1.470 + virtual void SetAttribute(uint32_t aIndex, const IntRect &aSourceRect) MOZ_OVERRIDE; 1.471 + virtual void SetAttribute(uint32_t aIndex, const IntPoint &aTarget) MOZ_OVERRIDE; 1.472 + virtual void SetAttribute(uint32_t aIndex, uint32_t aEdgeMode) MOZ_OVERRIDE; 1.473 + virtual void SetAttribute(uint32_t aIndex, bool aPreserveAlpha) MOZ_OVERRIDE; 1.474 + 1.475 +protected: 1.476 + virtual TemporaryRef<DataSourceSurface> Render(const IntRect& aRect) MOZ_OVERRIDE; 1.477 + virtual IntRect GetOutputRectInRect(const IntRect& aRect) MOZ_OVERRIDE; 1.478 + virtual int32_t InputIndex(uint32_t aInputEnumIndex) MOZ_OVERRIDE; 1.479 + virtual void RequestFromInputsForRect(const IntRect &aRect) MOZ_OVERRIDE; 1.480 + 1.481 +private: 1.482 + template<typename CoordType> 1.483 + TemporaryRef<DataSourceSurface> DoRender(const IntRect& aRect, 1.484 + CoordType aKernelUnitLengthX, 1.485 + CoordType aKernelUnitLengthY); 1.486 + 1.487 + IntRect InflatedSourceRect(const IntRect &aDestRect); 1.488 + IntRect InflatedDestRect(const IntRect &aSourceRect); 1.489 + 1.490 + IntSize mKernelSize; 1.491 + std::vector<Float> mKernelMatrix; 1.492 + Float mDivisor; 1.493 + Float mBias; 1.494 + IntPoint mTarget; 1.495 + IntRect mSourceRect; 1.496 + ConvolveMatrixEdgeMode mEdgeMode; 1.497 + Size mKernelUnitLength; 1.498 + bool mPreserveAlpha; 1.499 +}; 1.500 + 1.501 +class FilterNodeDisplacementMapSoftware : public FilterNodeSoftware 1.502 +{ 1.503 +public: 1.504 + MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeDisplacementMapSoftware) 1.505 + FilterNodeDisplacementMapSoftware(); 1.506 + virtual const char* GetName() MOZ_OVERRIDE { return "DisplacementMap"; } 1.507 + using FilterNodeSoftware::SetAttribute; 1.508 + virtual void SetAttribute(uint32_t aIndex, Float aScale) MOZ_OVERRIDE; 1.509 + virtual void SetAttribute(uint32_t aIndex, uint32_t aValue) MOZ_OVERRIDE; 1.510 + 1.511 +protected: 1.512 + virtual TemporaryRef<DataSourceSurface> Render(const IntRect& aRect) MOZ_OVERRIDE; 1.513 + virtual IntRect GetOutputRectInRect(const IntRect& aRect) MOZ_OVERRIDE; 1.514 + virtual int32_t InputIndex(uint32_t aInputEnumIndex) MOZ_OVERRIDE; 1.515 + virtual void RequestFromInputsForRect(const IntRect &aRect) MOZ_OVERRIDE; 1.516 + 1.517 +private: 1.518 + IntRect InflatedSourceOrDestRect(const IntRect &aDestOrSourceRect); 1.519 + 1.520 + Float mScale; 1.521 + ColorChannel mChannelX; 1.522 + ColorChannel mChannelY; 1.523 +}; 1.524 + 1.525 +class FilterNodeTurbulenceSoftware : public FilterNodeSoftware 1.526 +{ 1.527 +public: 1.528 + MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeTurbulenceSoftware) 1.529 + FilterNodeTurbulenceSoftware(); 1.530 + virtual const char* GetName() MOZ_OVERRIDE { return "Turbulence"; } 1.531 + using FilterNodeSoftware::SetAttribute; 1.532 + virtual void SetAttribute(uint32_t aIndex, const Size &aSize) MOZ_OVERRIDE; 1.533 + virtual void SetAttribute(uint32_t aIndex, const IntRect &aRenderRect) MOZ_OVERRIDE; 1.534 + virtual void SetAttribute(uint32_t aIndex, bool aStitchable) MOZ_OVERRIDE; 1.535 + virtual void SetAttribute(uint32_t aIndex, uint32_t aValue) MOZ_OVERRIDE; 1.536 + 1.537 +protected: 1.538 + virtual TemporaryRef<DataSourceSurface> Render(const IntRect& aRect) MOZ_OVERRIDE; 1.539 + virtual IntRect GetOutputRectInRect(const IntRect& aRect) MOZ_OVERRIDE; 1.540 + virtual int32_t InputIndex(uint32_t aInputEnumIndex) MOZ_OVERRIDE; 1.541 + 1.542 +private: 1.543 + IntRect mRenderRect; 1.544 + Size mBaseFrequency; 1.545 + uint32_t mNumOctaves; 1.546 + uint32_t mSeed; 1.547 + bool mStitchable; 1.548 + TurbulenceType mType; 1.549 +}; 1.550 + 1.551 +class FilterNodeArithmeticCombineSoftware : public FilterNodeSoftware 1.552 +{ 1.553 +public: 1.554 + MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeArithmeticCombineSoftware) 1.555 + FilterNodeArithmeticCombineSoftware(); 1.556 + virtual const char* GetName() MOZ_OVERRIDE { return "ArithmeticCombine"; } 1.557 + using FilterNodeSoftware::SetAttribute; 1.558 + virtual void SetAttribute(uint32_t aIndex, const Float* aFloat, uint32_t aSize) MOZ_OVERRIDE; 1.559 + 1.560 +protected: 1.561 + virtual TemporaryRef<DataSourceSurface> Render(const IntRect& aRect) MOZ_OVERRIDE; 1.562 + virtual IntRect GetOutputRectInRect(const IntRect& aRect) MOZ_OVERRIDE; 1.563 + virtual int32_t InputIndex(uint32_t aInputEnumIndex) MOZ_OVERRIDE; 1.564 + virtual void RequestFromInputsForRect(const IntRect &aRect) MOZ_OVERRIDE; 1.565 + 1.566 +private: 1.567 + Float mK1; 1.568 + Float mK2; 1.569 + Float mK3; 1.570 + Float mK4; 1.571 +}; 1.572 + 1.573 +class FilterNodeCompositeSoftware : public FilterNodeSoftware 1.574 +{ 1.575 +public: 1.576 + MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeCompositeSoftware) 1.577 + FilterNodeCompositeSoftware(); 1.578 + virtual const char* GetName() MOZ_OVERRIDE { return "Composite"; } 1.579 + using FilterNodeSoftware::SetAttribute; 1.580 + virtual void SetAttribute(uint32_t aIndex, uint32_t aOperator) MOZ_OVERRIDE; 1.581 + 1.582 +protected: 1.583 + virtual TemporaryRef<DataSourceSurface> Render(const IntRect& aRect) MOZ_OVERRIDE; 1.584 + virtual IntRect GetOutputRectInRect(const IntRect& aRect) MOZ_OVERRIDE; 1.585 + virtual int32_t InputIndex(uint32_t aInputEnumIndex) MOZ_OVERRIDE; 1.586 + virtual void RequestFromInputsForRect(const IntRect &aRect) MOZ_OVERRIDE; 1.587 + 1.588 +private: 1.589 + CompositeOperator mOperator; 1.590 +}; 1.591 + 1.592 +// Base class for FilterNodeGaussianBlurSoftware and 1.593 +// FilterNodeDirectionalBlurSoftware. 1.594 +class FilterNodeBlurXYSoftware : public FilterNodeSoftware 1.595 +{ 1.596 +public: 1.597 + MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeBlurXYSoftware) 1.598 +protected: 1.599 + virtual TemporaryRef<DataSourceSurface> Render(const IntRect& aRect) MOZ_OVERRIDE; 1.600 + virtual IntRect GetOutputRectInRect(const IntRect& aRect) MOZ_OVERRIDE; 1.601 + virtual int32_t InputIndex(uint32_t aInputEnumIndex) MOZ_OVERRIDE; 1.602 + IntRect InflatedSourceOrDestRect(const IntRect &aDestRect); 1.603 + virtual void RequestFromInputsForRect(const IntRect &aRect) MOZ_OVERRIDE; 1.604 + 1.605 + // Implemented by subclasses. 1.606 + virtual Size StdDeviationXY() = 0; 1.607 +}; 1.608 + 1.609 +class FilterNodeGaussianBlurSoftware : public FilterNodeBlurXYSoftware 1.610 +{ 1.611 +public: 1.612 + MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeGaussianBlurSoftware) 1.613 + FilterNodeGaussianBlurSoftware(); 1.614 + virtual const char* GetName() MOZ_OVERRIDE { return "GaussianBlur"; } 1.615 + using FilterNodeSoftware::SetAttribute; 1.616 + virtual void SetAttribute(uint32_t aIndex, Float aStdDeviation) MOZ_OVERRIDE; 1.617 + 1.618 +protected: 1.619 + virtual Size StdDeviationXY() MOZ_OVERRIDE; 1.620 + 1.621 +private: 1.622 + Float mStdDeviation; 1.623 +}; 1.624 + 1.625 +class FilterNodeDirectionalBlurSoftware : public FilterNodeBlurXYSoftware 1.626 +{ 1.627 +public: 1.628 + MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeDirectionalBlurSoftware) 1.629 + FilterNodeDirectionalBlurSoftware(); 1.630 + virtual const char* GetName() MOZ_OVERRIDE { return "DirectionalBlur"; } 1.631 + using FilterNodeSoftware::SetAttribute; 1.632 + virtual void SetAttribute(uint32_t aIndex, Float aStdDeviation) MOZ_OVERRIDE; 1.633 + virtual void SetAttribute(uint32_t aIndex, uint32_t aBlurDirection) MOZ_OVERRIDE; 1.634 + 1.635 +protected: 1.636 + virtual Size StdDeviationXY() MOZ_OVERRIDE; 1.637 + 1.638 +private: 1.639 + Float mStdDeviation; 1.640 + BlurDirection mBlurDirection; 1.641 +}; 1.642 + 1.643 +class FilterNodeCropSoftware : public FilterNodeSoftware 1.644 +{ 1.645 +public: 1.646 + MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeCropSoftware) 1.647 + virtual const char* GetName() MOZ_OVERRIDE { return "Crop"; } 1.648 + using FilterNodeSoftware::SetAttribute; 1.649 + virtual void SetAttribute(uint32_t aIndex, const Rect &aSourceRect) MOZ_OVERRIDE; 1.650 + 1.651 +protected: 1.652 + virtual TemporaryRef<DataSourceSurface> Render(const IntRect& aRect) MOZ_OVERRIDE; 1.653 + virtual IntRect GetOutputRectInRect(const IntRect& aRect) MOZ_OVERRIDE; 1.654 + virtual int32_t InputIndex(uint32_t aInputEnumIndex) MOZ_OVERRIDE; 1.655 + virtual void RequestFromInputsForRect(const IntRect &aRect) MOZ_OVERRIDE; 1.656 + 1.657 +private: 1.658 + IntRect mCropRect; 1.659 +}; 1.660 + 1.661 +class FilterNodePremultiplySoftware : public FilterNodeSoftware 1.662 +{ 1.663 +public: 1.664 + MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodePremultiplySoftware) 1.665 + virtual const char* GetName() MOZ_OVERRIDE { return "Premultiply"; } 1.666 +protected: 1.667 + virtual TemporaryRef<DataSourceSurface> Render(const IntRect& aRect) MOZ_OVERRIDE; 1.668 + virtual IntRect GetOutputRectInRect(const IntRect& aRect) MOZ_OVERRIDE; 1.669 + virtual int32_t InputIndex(uint32_t aInputEnumIndex) MOZ_OVERRIDE; 1.670 + virtual void RequestFromInputsForRect(const IntRect &aRect) MOZ_OVERRIDE; 1.671 +}; 1.672 + 1.673 +class FilterNodeUnpremultiplySoftware : public FilterNodeSoftware 1.674 +{ 1.675 +public: 1.676 + MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(FilterNodeUnpremultiplySoftware) 1.677 + virtual const char* GetName() MOZ_OVERRIDE { return "Unpremultiply"; } 1.678 +protected: 1.679 + virtual TemporaryRef<DataSourceSurface> Render(const IntRect& aRect) MOZ_OVERRIDE; 1.680 + virtual IntRect GetOutputRectInRect(const IntRect& aRect) MOZ_OVERRIDE; 1.681 + virtual int32_t InputIndex(uint32_t aInputEnumIndex) MOZ_OVERRIDE; 1.682 + virtual void RequestFromInputsForRect(const IntRect &aRect) MOZ_OVERRIDE; 1.683 +}; 1.684 + 1.685 +template<typename LightType, typename LightingType> 1.686 +class FilterNodeLightingSoftware : public FilterNodeSoftware 1.687 +{ 1.688 +public: 1.689 +#if defined(MOZILLA_INTERNAL_API) && (defined(DEBUG) || defined(FORCE_BUILD_REFCNT_LOGGING)) 1.690 + // Helpers for refcounted 1.691 + virtual const char* typeName() const MOZ_OVERRIDE { return mTypeName; } 1.692 + virtual size_t typeSize() const MOZ_OVERRIDE { return sizeof(*this); } 1.693 +#endif 1.694 + explicit FilterNodeLightingSoftware(const char* aTypeName); 1.695 + virtual const char* GetName() MOZ_OVERRIDE { return "Lighting"; } 1.696 + using FilterNodeSoftware::SetAttribute; 1.697 + virtual void SetAttribute(uint32_t aIndex, Float) MOZ_OVERRIDE; 1.698 + virtual void SetAttribute(uint32_t aIndex, const Size &) MOZ_OVERRIDE; 1.699 + virtual void SetAttribute(uint32_t aIndex, const Point3D &) MOZ_OVERRIDE; 1.700 + virtual void SetAttribute(uint32_t aIndex, const Color &) MOZ_OVERRIDE; 1.701 + 1.702 +protected: 1.703 + virtual TemporaryRef<DataSourceSurface> Render(const IntRect& aRect) MOZ_OVERRIDE; 1.704 + virtual IntRect GetOutputRectInRect(const IntRect& aRect) MOZ_OVERRIDE; 1.705 + virtual int32_t InputIndex(uint32_t aInputEnumIndex) MOZ_OVERRIDE; 1.706 + virtual void RequestFromInputsForRect(const IntRect &aRect) MOZ_OVERRIDE; 1.707 + 1.708 +private: 1.709 + template<typename CoordType> 1.710 + TemporaryRef<DataSourceSurface> DoRender(const IntRect& aRect, 1.711 + CoordType aKernelUnitLengthX, 1.712 + CoordType aKernelUnitLengthY); 1.713 + 1.714 + LightType mLight; 1.715 + LightingType mLighting; 1.716 + Float mSurfaceScale; 1.717 + Size mKernelUnitLength; 1.718 + Color mColor; 1.719 +#if defined(MOZILLA_INTERNAL_API) && (defined(DEBUG) || defined(FORCE_BUILD_REFCNT_LOGGING)) 1.720 + const char* mTypeName; 1.721 +#endif 1.722 +}; 1.723 + 1.724 +} 1.725 +} 1.726 + 1.727 +#endif // _MOZILLA_GFX_FILTERNODESOFTWARE_H_