| Index: src/core/SkShader.cpp
|
| diff --git a/src/core/SkShader.cpp b/src/core/SkShader.cpp
|
| index 40e52a05cbf59e217a644195fa7a957c5c543719..e337b7d9063eda8003e8bc00317dd9041fa92bb0 100644
|
| --- a/src/core/SkShader.cpp
|
| +++ b/src/core/SkShader.cpp
|
| @@ -17,6 +17,7 @@
|
|
|
| SkShader::SkShader() {
|
| fLocalMatrix.reset();
|
| + SkDEBUGCODE(fInSetContext = false;)
|
| }
|
|
|
| SkShader::SkShader(SkReadBuffer& buffer)
|
| @@ -26,9 +27,12 @@
|
| } else {
|
| fLocalMatrix.reset();
|
| }
|
| +
|
| + SkDEBUGCODE(fInSetContext = false;)
|
| }
|
|
|
| SkShader::~SkShader() {
|
| + SkASSERT(!fInSetContext);
|
| }
|
|
|
| void SkShader::flatten(SkWriteBuffer& buffer) const {
|
| @@ -40,48 +44,39 @@
|
| }
|
| }
|
|
|
| -bool SkShader::computeTotalInverse(const SkMatrix& matrix, SkMatrix* totalInverse) const {
|
| +bool SkShader::setContext(const SkBitmap& device,
|
| + const SkPaint& paint,
|
| + const SkMatrix& matrix) {
|
| + SkASSERT(!this->setContextHasBeenCalled());
|
| +
|
| const SkMatrix* m = &matrix;
|
| SkMatrix total;
|
|
|
| + fPaintAlpha = paint.getAlpha();
|
| if (this->hasLocalMatrix()) {
|
| total.setConcat(matrix, this->getLocalMatrix());
|
| m = &total;
|
| }
|
| -
|
| - return m->invert(totalInverse);
|
| -}
|
| -
|
| -bool SkShader::validContext(const SkBitmap& device,
|
| - const SkPaint& paint,
|
| - const SkMatrix& matrix,
|
| - SkMatrix* totalInverse) const {
|
| - return this->computeTotalInverse(matrix, totalInverse);
|
| -}
|
| -
|
| -SkShader::Context::Context(const SkShader& shader, const SkBitmap& device,
|
| - const SkPaint& paint, const SkMatrix& matrix)
|
| - : fShader(shader)
|
| -{
|
| - SkASSERT(fShader.validContext(device, paint, matrix));
|
| -
|
| - // Because the context parameters must be valid at this point, we know that the matrix is
|
| - // invertible.
|
| - SkAssertResult(fShader.computeTotalInverse(matrix, &fTotalInverse));
|
| - fTotalInverseClass = (uint8_t)ComputeMatrixClass(fTotalInverse);
|
| -
|
| - fPaintAlpha = paint.getAlpha();
|
| -}
|
| -
|
| -SkShader::Context::~Context() {}
|
| -
|
| -SkShader::Context::ShadeProc SkShader::Context::asAShadeProc(void** ctx) {
|
| + if (m->invert(&fTotalInverse)) {
|
| + fTotalInverseClass = (uint8_t)ComputeMatrixClass(fTotalInverse);
|
| + SkDEBUGCODE(fInSetContext = true;)
|
| + return true;
|
| + }
|
| + return false;
|
| +}
|
| +
|
| +void SkShader::endContext() {
|
| + SkASSERT(fInSetContext);
|
| + SkDEBUGCODE(fInSetContext = false;)
|
| +}
|
| +
|
| +SkShader::ShadeProc SkShader::asAShadeProc(void** ctx) {
|
| return NULL;
|
| }
|
|
|
| #include "SkColorPriv.h"
|
|
|
| -void SkShader::Context::shadeSpan16(int x, int y, uint16_t span16[], int count) {
|
| +void SkShader::shadeSpan16(int x, int y, uint16_t span16[], int count) {
|
| SkASSERT(span16);
|
| SkASSERT(count > 0);
|
| SkASSERT(this->canCallShadeSpan16());
|
| @@ -99,7 +94,7 @@
|
| #define SkU32BitShiftToByteOffset(shift) ((shift) >> 3)
|
| #endif
|
|
|
| -void SkShader::Context::shadeSpanAlpha(int x, int y, uint8_t alpha[], int count) {
|
| +void SkShader::shadeSpanAlpha(int x, int y, uint8_t alpha[], int count) {
|
| SkASSERT(count > 0);
|
|
|
| SkPMColor colors[kTempColorCount];
|
| @@ -153,7 +148,7 @@
|
| #endif
|
| }
|
|
|
| -SkShader::Context::MatrixClass SkShader::Context::ComputeMatrixClass(const SkMatrix& mat) {
|
| +SkShader::MatrixClass SkShader::ComputeMatrixClass(const SkMatrix& mat) {
|
| MatrixClass mc = kLinear_MatrixClass;
|
|
|
| if (mat.hasPerspective()) {
|
| @@ -168,7 +163,8 @@
|
|
|
| //////////////////////////////////////////////////////////////////////////////
|
|
|
| -SkShader::BitmapType SkShader::asABitmap(SkBitmap*, SkMatrix*, TileMode*) const {
|
| +SkShader::BitmapType SkShader::asABitmap(SkBitmap*, SkMatrix*,
|
| + TileMode*) const {
|
| return kNone_BitmapType;
|
| }
|
|
|
| @@ -203,15 +199,18 @@
|
| #include "SkColorShader.h"
|
| #include "SkUtils.h"
|
|
|
| -SkColorShader::SkColorShader()
|
| - : fColor()
|
| - , fInheritColor(true) {
|
| -}
|
| -
|
| -SkColorShader::SkColorShader(SkColor c)
|
| - : fColor(c)
|
| - , fInheritColor(false) {
|
| -}
|
| +SkColorShader::SkColorShader() {
|
| + fFlags = 0;
|
| + fInheritColor = true;
|
| +}
|
| +
|
| +SkColorShader::SkColorShader(SkColor c) {
|
| + fFlags = 0;
|
| + fColor = c;
|
| + fInheritColor = false;
|
| +}
|
| +
|
| +SkColorShader::~SkColorShader() {}
|
|
|
| bool SkColorShader::isOpaque() const {
|
| if (fInheritColor) {
|
| @@ -221,6 +220,8 @@
|
| }
|
|
|
| SkColorShader::SkColorShader(SkReadBuffer& b) : INHERITED(b) {
|
| + fFlags = 0; // computed in setContext
|
| +
|
| fInheritColor = b.readBool();
|
| if (fInheritColor) {
|
| return;
|
| @@ -237,43 +238,32 @@
|
| buffer.writeColor(fColor);
|
| }
|
|
|
| -uint32_t SkColorShader::ColorShaderContext::getFlags() const {
|
| +uint32_t SkColorShader::getFlags() {
|
| return fFlags;
|
| }
|
|
|
| -uint8_t SkColorShader::ColorShaderContext::getSpan16Alpha() const {
|
| +uint8_t SkColorShader::getSpan16Alpha() const {
|
| return SkGetPackedA32(fPMColor);
|
| }
|
|
|
| -SkShader::Context* SkColorShader::createContext(const SkBitmap& device, const SkPaint& paint,
|
| - const SkMatrix& matrix, void* storage) const {
|
| - if (!this->validContext(device, paint, matrix)) {
|
| - return NULL;
|
| - }
|
| -
|
| - return SkNEW_PLACEMENT_ARGS(storage, ColorShaderContext, (*this, device, paint, matrix));
|
| -}
|
| -
|
| -SkColorShader::ColorShaderContext::ColorShaderContext(const SkColorShader& shader,
|
| - const SkBitmap& device,
|
| - const SkPaint& paint,
|
| - const SkMatrix& matrix)
|
| - : INHERITED(shader, device, paint, matrix)
|
| -{
|
| +bool SkColorShader::setContext(const SkBitmap& device, const SkPaint& paint,
|
| + const SkMatrix& matrix) {
|
| + if (!this->INHERITED::setContext(device, paint, matrix)) {
|
| + return false;
|
| + }
|
| +
|
| unsigned a;
|
|
|
| - SkColor color;
|
| - if (shader.fInheritColor) {
|
| - color = paint.getColor();
|
| - a = SkColorGetA(color);
|
| + if (fInheritColor) {
|
| + fColor = paint.getColor();
|
| + a = SkColorGetA(fColor);
|
| } else {
|
| - color = shader.fColor;
|
| - a = SkAlphaMul(SkColorGetA(color), SkAlpha255To256(paint.getAlpha()));
|
| - }
|
| -
|
| - unsigned r = SkColorGetR(color);
|
| - unsigned g = SkColorGetG(color);
|
| - unsigned b = SkColorGetB(color);
|
| + a = SkAlphaMul(SkColorGetA(fColor), SkAlpha255To256(paint.getAlpha()));
|
| + }
|
| +
|
| + unsigned r = SkColorGetR(fColor);
|
| + unsigned g = SkColorGetG(fColor);
|
| + unsigned b = SkColorGetB(fColor);
|
|
|
| // we want this before we apply any alpha
|
| fColor16 = SkPack888ToRGB16(r, g, b);
|
| @@ -292,17 +282,19 @@
|
| fFlags |= kHasSpan16_Flag;
|
| }
|
| }
|
| -}
|
| -
|
| -void SkColorShader::ColorShaderContext::shadeSpan(int x, int y, SkPMColor span[], int count) {
|
| +
|
| + return true;
|
| +}
|
| +
|
| +void SkColorShader::shadeSpan(int x, int y, SkPMColor span[], int count) {
|
| sk_memset32(span, fPMColor, count);
|
| }
|
|
|
| -void SkColorShader::ColorShaderContext::shadeSpan16(int x, int y, uint16_t span[], int count) {
|
| +void SkColorShader::shadeSpan16(int x, int y, uint16_t span[], int count) {
|
| sk_memset16(span, fColor16, count);
|
| }
|
|
|
| -void SkColorShader::ColorShaderContext::shadeSpanAlpha(int x, int y, uint8_t alpha[], int count) {
|
| +void SkColorShader::shadeSpanAlpha(int x, int y, uint8_t alpha[], int count) {
|
| memset(alpha, SkGetPackedA32(fPMColor), count);
|
| }
|
|
|
| @@ -342,9 +334,27 @@
|
|
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|
| +#include "SkEmptyShader.h"
|
| +
|
| +uint32_t SkEmptyShader::getFlags() { return 0; }
|
| +uint8_t SkEmptyShader::getSpan16Alpha() const { return 0; }
|
| +
|
| +bool SkEmptyShader::setContext(const SkBitmap&, const SkPaint&,
|
| + const SkMatrix&) { return false; }
|
| +
|
| +void SkEmptyShader::shadeSpan(int x, int y, SkPMColor span[], int count) {
|
| + SkDEBUGFAIL("should never get called, since setContext() returned false");
|
| +}
|
| +
|
| +void SkEmptyShader::shadeSpan16(int x, int y, uint16_t span[], int count) {
|
| + SkDEBUGFAIL("should never get called, since setContext() returned false");
|
| +}
|
| +
|
| +void SkEmptyShader::shadeSpanAlpha(int x, int y, uint8_t alpha[], int count) {
|
| + SkDEBUGFAIL("should never get called, since setContext() returned false");
|
| +}
|
| +
|
| #ifndef SK_IGNORE_TO_STRING
|
| -#include "SkEmptyShader.h"
|
| -
|
| void SkEmptyShader::toString(SkString* str) const {
|
| str->append("SkEmptyShader: (");
|
|
|
|
|