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