| Index: src/effects/gradients/SkLinearGradient.cpp
|
| diff --git a/src/effects/gradients/SkLinearGradient.cpp b/src/effects/gradients/SkLinearGradient.cpp
|
| index b24a6349c73cc4f94910159cb8f3a06f67aec79a..e660d7cd2d6ae936795805085eb89a89601f6113 100644
|
| --- a/src/effects/gradients/SkLinearGradient.cpp
|
| +++ b/src/effects/gradients/SkLinearGradient.cpp
|
| @@ -71,12 +71,24 @@
|
| buffer.writePoint(fEnd);
|
| }
|
|
|
| -bool SkLinearGradient::setContext(const SkBitmap& device, const SkPaint& paint,
|
| - const SkMatrix& matrix) {
|
| - if (!this->INHERITED::setContext(device, paint, matrix)) {
|
| - return false;
|
| - }
|
| -
|
| +size_t SkLinearGradient::contextSize() const {
|
| + return sizeof(LinearGradientContext);
|
| +}
|
| +
|
| +SkShader::Context* SkLinearGradient::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, LinearGradientContext, (*this, device, paint, matrix));
|
| +}
|
| +
|
| +SkLinearGradient::LinearGradientContext::LinearGradientContext(
|
| + const SkLinearGradient& shader, const SkBitmap& device,
|
| + const SkPaint& paint, const SkMatrix& matrix)
|
| + : INHERITED(shader, device, paint, matrix)
|
| +{
|
| unsigned mask = SkMatrix::kTranslate_Mask | SkMatrix::kScale_Mask;
|
| if ((fDstToIndex.getType() & ~mask) == 0) {
|
| // when we dither, we are (usually) not const-in-Y
|
| @@ -87,7 +99,6 @@
|
| fFlags |= SkShader::kConstInY16_Flag;
|
| }
|
| }
|
| - return true;
|
| }
|
|
|
| #define NO_CHECK_ITER \
|
| @@ -196,14 +207,16 @@
|
|
|
| }
|
|
|
| -void SkLinearGradient::shadeSpan(int x, int y, SkPMColor* SK_RESTRICT dstC,
|
| - int count) {
|
| +void SkLinearGradient::LinearGradientContext::shadeSpan(int x, int y, SkPMColor* SK_RESTRICT dstC,
|
| + int count) {
|
| SkASSERT(count > 0);
|
| +
|
| + const SkLinearGradient& linearGradient = static_cast<const SkLinearGradient&>(fShader);
|
|
|
| SkPoint srcPt;
|
| SkMatrix::MapXYProc dstProc = fDstToIndexProc;
|
| - TileProc proc = fTileProc;
|
| - const SkPMColor* SK_RESTRICT cache = this->getCache32();
|
| + TileProc proc = linearGradient.fTileProc;
|
| + const SkPMColor* SK_RESTRICT cache = fCache->getCache32();
|
| int toggle = init_dither_toggle(x, y);
|
|
|
| if (fDstToIndexClass != kPerspective_MatrixClass) {
|
| @@ -223,12 +236,12 @@
|
| LinearShadeProc shadeProc = shadeSpan_linear_repeat;
|
| if (0 == dx) {
|
| shadeProc = shadeSpan_linear_vertical_lerp;
|
| - } else if (SkShader::kClamp_TileMode == fTileMode) {
|
| + } else if (SkShader::kClamp_TileMode == linearGradient.fTileMode) {
|
| shadeProc = shadeSpan_linear_clamp;
|
| - } else if (SkShader::kMirror_TileMode == fTileMode) {
|
| + } else if (SkShader::kMirror_TileMode == linearGradient.fTileMode) {
|
| shadeProc = shadeSpan_linear_mirror;
|
| } else {
|
| - SkASSERT(SkShader::kRepeat_TileMode == fTileMode);
|
| + SkASSERT(SkShader::kRepeat_TileMode == linearGradient.fTileMode);
|
| }
|
| (*shadeProc)(proc, dx, fx, dstC, cache, toggle, count);
|
| } else {
|
| @@ -381,14 +394,16 @@
|
| return SkAbs32(x) < (SK_Fixed1 >> 12);
|
| }
|
|
|
| -void SkLinearGradient::shadeSpan16(int x, int y,
|
| - uint16_t* SK_RESTRICT dstC, int count) {
|
| +void SkLinearGradient::LinearGradientContext::shadeSpan16(int x, int y,
|
| + uint16_t* SK_RESTRICT dstC, int count) {
|
| SkASSERT(count > 0);
|
| +
|
| + const SkLinearGradient& linearGradient = static_cast<const SkLinearGradient&>(fShader);
|
|
|
| SkPoint srcPt;
|
| SkMatrix::MapXYProc dstProc = fDstToIndexProc;
|
| - TileProc proc = fTileProc;
|
| - const uint16_t* SK_RESTRICT cache = this->getCache16();
|
| + TileProc proc = linearGradient.fTileProc;
|
| + const uint16_t* SK_RESTRICT cache = fCache->getCache16();
|
| int toggle = init_dither_toggle16(x, y);
|
|
|
| if (fDstToIndexClass != kPerspective_MatrixClass) {
|
| @@ -408,12 +423,12 @@
|
| LinearShade16Proc shadeProc = shadeSpan16_linear_repeat;
|
| if (fixed_nearly_zero(dx)) {
|
| shadeProc = shadeSpan16_linear_vertical;
|
| - } else if (SkShader::kClamp_TileMode == fTileMode) {
|
| + } else if (SkShader::kClamp_TileMode == linearGradient.fTileMode) {
|
| shadeProc = shadeSpan16_linear_clamp;
|
| - } else if (SkShader::kMirror_TileMode == fTileMode) {
|
| + } else if (SkShader::kMirror_TileMode == linearGradient.fTileMode) {
|
| shadeProc = shadeSpan16_linear_mirror;
|
| } else {
|
| - SkASSERT(SkShader::kRepeat_TileMode == fTileMode);
|
| + SkASSERT(SkShader::kRepeat_TileMode == linearGradient.fTileMode);
|
| }
|
| (*shadeProc)(proc, dx, fx, dstC, cache, toggle, count);
|
| } else {
|
|
|