Chromium Code Reviews| Index: include/core/SkShader.h |
| diff --git a/include/core/SkShader.h b/include/core/SkShader.h |
| index d0fac49f7e22cc30cbcb847c1538aada687fa18e..49a84db95423f17dae25ee7190d1e2d4126c67d9 100644 |
| --- a/include/core/SkShader.h |
| +++ b/include/core/SkShader.h |
| @@ -37,23 +37,29 @@ public: |
| virtual ~SkShader(); |
| /** |
| - * Returns true if the local matrix is not an identity matrix. |
| + * Returns true if the local matrix is not an identity matrix. |
| + * FIXME: local matrix is moving to SkPaint. |
| */ |
| bool hasLocalMatrix() const { return !fLocalMatrix.isIdentity(); } |
| /** |
| * Returns the local matrix. |
| + * FIXME: local matrix is moving to SkPaint. |
| */ |
| const SkMatrix& getLocalMatrix() const { return fLocalMatrix; } |
| /** |
| * Set the shader's local matrix. |
| * @param localM The shader's new local matrix. |
| + * |
| + * FIXME: local matrix is moving to SkPaint. |
| */ |
| void setLocalMatrix(const SkMatrix& localM) { fLocalMatrix = localM; } |
| /** |
| * Reset the shader's local matrix to identity. |
| + * |
| + * FIXME: local matrix is moving to SkPaint. |
| */ |
| void resetLocalMatrix() { fLocalMatrix.reset(); } |
| @@ -95,7 +101,7 @@ public: |
| */ |
| kIntrinsicly16_Flag = 0x04, |
| - /** set (after setContext) if the spans only vary in X (const in Y). |
| + /** set if the spans only vary in X (const in Y). |
| e.g. an Nx1 bitmap that is being tiled in Y, or a linear-gradient |
| that varies from left-to-right. This flag specifies this for |
| shadeSpan(). |
| @@ -111,84 +117,108 @@ public: |
| }; |
| /** |
| - * Called sometimes before drawing with this shader. Return the type of |
| - * alpha your shader will return. The default implementation returns 0. |
| - * Your subclass should override if it can (even sometimes) report a |
| - * non-zero value, since that will enable various blitters to perform |
| - * faster. |
| - */ |
| - virtual uint32_t getFlags() { return 0; } |
| - |
| - /** |
| * Returns true if the shader is guaranteed to produce only opaque |
| * colors, subject to the SkPaint using the shader to apply an opaque |
| * alpha value. Subclasses should override this to allow some |
| - * optimizations. isOpaque() can be called at any time, unlike getFlags, |
| - * which only works properly when the context is set. |
| + * optimizations. |
| */ |
| virtual bool isOpaque() const { return false; } |
| - /** |
| - * Return the alpha associated with the data returned by shadeSpan16(). If |
| - * kHasSpan16_Flag is not set, this value is meaningless. |
| - */ |
| - virtual uint8_t getSpan16Alpha() const { return fPaintAlpha; } |
| + class Context : public SkNoncopyable { |
| + public: |
| + Context(const SkShader& shader, const SkBitmap& device, |
| + const SkPaint& paint, const SkMatrix& matrix); |
| - /** |
| - * Called once before drawing, with the current paint and device matrix. |
| - * Return true if your shader supports these parameters, or false if not. |
| - * If false is returned, nothing will be drawn. If true is returned, then |
| - * a balancing call to endContext() will be made before the next call to |
| - * setContext. |
| - * |
| - * Subclasses should be sure to call their INHERITED::setContext() if they |
| - * override this method. |
| - */ |
| - virtual bool setContext(const SkBitmap& device, const SkPaint& paint, |
| - const SkMatrix& matrix); |
| + virtual ~Context(); |
| - /** |
| - * Assuming setContext returned true, endContext() will be called when |
| - * the draw using the shader has completed. It is an error for setContext |
| - * to be called twice w/o an intervening call to endContext(). |
| - * |
| - * Subclasses should be sure to call their INHERITED::endContext() if they |
| - * override this method. |
| - */ |
| - virtual void endContext(); |
| + /** |
| + * Called sometimes before drawing with this shader. Return the type of |
| + * alpha your shader will return. The default implementation returns 0. |
| + * Your subclass should override if it can (even sometimes) report a |
| + * non-zero value, since that will enable various blitters to perform |
| + * faster. |
| + */ |
| + virtual uint32_t getFlags() const { return 0; } |
| - SkDEBUGCODE(bool setContextHasBeenCalled() const { return SkToBool(fInSetContext); }) |
| + /** |
| + * Return the alpha associated with the data returned by shadeSpan16(). If |
| + * kHasSpan16_Flag is not set, this value is meaningless. |
| + */ |
| + virtual uint8_t getSpan16Alpha() const { return fPaintAlpha; } |
| - /** |
| - * Called for each span of the object being drawn. Your subclass should |
| - * set the appropriate colors (with premultiplied alpha) that correspond |
| - * to the specified device coordinates. |
| - */ |
| - virtual void shadeSpan(int x, int y, SkPMColor[], int count) = 0; |
| + /** |
| + * Called for each span of the object being drawn. Your subclass should |
| + * set the appropriate colors (with premultiplied alpha) that correspond |
| + * to the specified device coordinates. |
| + */ |
| + virtual void shadeSpan(int x, int y, SkPMColor[], int count) = 0; |
| + |
| + typedef void (*ShadeProc)(void* ctx, int x, int y, SkPMColor[], int count); |
| + virtual ShadeProc asAShadeProc(void** ctx); |
| + |
| + /** |
| + * Called only for 16bit devices when getFlags() returns |
| + * kOpaqueAlphaFlag | kHasSpan16_Flag |
| + */ |
| + virtual void shadeSpan16(int x, int y, uint16_t[], int count); |
| + |
| + /** |
| + * Similar to shadeSpan, but only returns the alpha-channel for a span. |
| + * The default implementation calls shadeSpan() and then extracts the alpha |
| + * values from the returned colors. |
| + */ |
| + virtual void shadeSpanAlpha(int x, int y, uint8_t alpha[], int count); |
| - typedef void (*ShadeProc)(void* ctx, int x, int y, SkPMColor[], int count); |
| - virtual ShadeProc asAShadeProc(void** ctx); |
| + /** |
| + * Helper function that returns true if this shader's shadeSpan16() method |
| + * can be called. |
| + */ |
| + bool canCallShadeSpan16() { |
| + return SkShader::CanCallShadeSpan16(this->getFlags()); |
| + } |
| + |
| + protected: |
| + // Reference to generator, so we don't have to dupe information. |
| + const SkShader& fShader; |
| + |
| + enum MatrixClass { |
| + kLinear_MatrixClass, // no perspective |
| + kFixedStepInX_MatrixClass, // fast perspective, need to call fixedStepInX() each scanline |
|
scroggo
2014/03/24 21:24:46
nit: line too long
Dominik Grewe
2014/03/26 17:22:22
Done.
|
| + kPerspective_MatrixClass // slow perspective, need to mappoints each pixel |
| + }; |
| + static MatrixClass ComputeMatrixClass(const SkMatrix&); |
| + |
| + uint8_t getPaintAlpha() const { return fPaintAlpha; } |
| + const SkMatrix& getTotalInverse() const { return fTotalInverse; } |
| + MatrixClass getInverseClass() const { return (MatrixClass)fTotalInverseClass; } |
| + private: |
| + SkMatrix fTotalInverse; |
| + uint8_t fPaintAlpha; |
| + uint8_t fTotalInverseClass; |
| + }; |
| /** |
| - * Called only for 16bit devices when getFlags() returns |
| - * kOpaqueAlphaFlag | kHasSpan16_Flag |
| + * Subclasses should be sure to call their INHERITED::validContext() if |
| + * they override this method. |
| + * FIXME: Make sure device is still needed. |
|
scroggo
2014/03/24 21:24:46
You can remove this line. device is still used by
Dominik Grewe
2014/03/26 17:22:22
Done.
|
| */ |
| - virtual void shadeSpan16(int x, int y, uint16_t[], int count); |
| + virtual bool validContext(const SkBitmap& device, const SkPaint& paint, |
| + const SkMatrix& matrix) const; |
| /** |
| - * Similar to shadeSpan, but only returns the alpha-channel for a span. |
| - * The default implementation calls shadeSpan() and then extracts the alpha |
| - * values from the returned colors. |
| + * Called internally to create the actual object that does the shading. |
| + * Only valid if validContext() returned true. |
| + * Size of storage must be >= contextSize. |
| */ |
| - virtual void shadeSpanAlpha(int x, int y, uint8_t alpha[], int count); |
| + virtual Context* createContext(const SkBitmap& device, |
| + const SkPaint& paint, |
| + const SkMatrix& matrix, |
| + void* storage) const = 0; |
| /** |
| - * Helper function that returns true if this shader's shadeSpan16() method |
| - * can be called. |
| + * Return the size of a Context returned by createContext. |
| */ |
| - bool canCallShadeSpan16() { |
| - return SkShader::CanCallShadeSpan16(this->getFlags()); |
| - } |
| + virtual size_t contextSize() const = 0; |
| /** |
| * Helper to check the flags to know if it is legal to call shadeSpan16() |
| @@ -321,7 +351,7 @@ public: |
| * The incoming color to the effect has r=g=b=a all extracted from the SkPaint's alpha. |
| * The output color should be the computed SkShader premul color modulated by the incoming |
| * color. The GrContext may be used by the effect to create textures. The GPU device does not |
| - * call setContext. Instead we pass the SkPaint here in case the shader needs paint info. |
| + * call createContext. Instead we pass the SkPaint here in case the shader needs paint info. |
| */ |
| virtual GrEffectRef* asNewEffect(GrContext* context, const SkPaint& paint) const; |
| @@ -350,26 +380,13 @@ public: |
| SK_DEFINE_FLATTENABLE_TYPE(SkShader) |
| protected: |
| - enum MatrixClass { |
| - kLinear_MatrixClass, // no perspective |
| - kFixedStepInX_MatrixClass, // fast perspective, need to call fixedStepInX() each scanline |
| - kPerspective_MatrixClass // slow perspective, need to mappoints each pixel |
| - }; |
| - static MatrixClass ComputeMatrixClass(const SkMatrix&); |
| - |
| - // These can be called by your subclass after setContext() has been called |
| - uint8_t getPaintAlpha() const { return fPaintAlpha; } |
| - const SkMatrix& getTotalInverse() const { return fTotalInverse; } |
| - MatrixClass getInverseClass() const { return (MatrixClass)fTotalInverseClass; } |
| SkShader(SkReadBuffer& ); |
| virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE; |
| + |
| private: |
| + // FIXME: Move to SkPaint. |
| SkMatrix fLocalMatrix; |
| - SkMatrix fTotalInverse; |
| - uint8_t fPaintAlpha; |
| - uint8_t fTotalInverseClass; |
| - SkDEBUGCODE(SkBool8 fInSetContext;) |
| typedef SkFlattenable INHERITED; |
| }; |