diff options
Diffstat (limited to 'chromium/third_party/skia/src/effects/gradients/SkTwoPointRadialGradient.cpp')
-rw-r--r-- | chromium/third_party/skia/src/effects/gradients/SkTwoPointRadialGradient.cpp | 125 |
1 files changed, 77 insertions, 48 deletions
diff --git a/chromium/third_party/skia/src/effects/gradients/SkTwoPointRadialGradient.cpp b/chromium/third_party/skia/src/effects/gradients/SkTwoPointRadialGradient.cpp index 207f3db6537..e3d89960c65 100644 --- a/chromium/third_party/skia/src/effects/gradients/SkTwoPointRadialGradient.cpp +++ b/chromium/third_party/skia/src/effects/gradients/SkTwoPointRadialGradient.cpp @@ -6,7 +6,7 @@ * found in the LICENSE file. */ - #include "SkTwoPointRadialGradient.h" +#include "SkTwoPointRadialGradient.h" /* Two-point radial gradients are specified by two circles, each with a center point and radius. The gradient can be considered to be a series of @@ -170,8 +170,8 @@ void shadeSpan_twopoint_repeat(SkScalar fx, SkScalar dx, SkTwoPointRadialGradient::SkTwoPointRadialGradient( const SkPoint& start, SkScalar startRadius, const SkPoint& end, SkScalar endRadius, - const Descriptor& desc) - : SkGradientShaderBase(desc), + const Descriptor& desc, const SkMatrix* localMatrix) + : SkGradientShaderBase(desc, localMatrix), fCenter1(start), fCenter2(end), fRadius1(startRadius), @@ -220,23 +220,47 @@ SkShader::GradientType SkTwoPointRadialGradient::asAGradient( return kRadial2_GradientType; } -void SkTwoPointRadialGradient::shadeSpan(int x, int y, SkPMColor* dstCParam, - int count) { +size_t SkTwoPointRadialGradient::contextSize() const { + return sizeof(TwoPointRadialGradientContext); +} + +SkShader::Context* SkTwoPointRadialGradient::onCreateContext(const ContextRec& rec, + void* storage) const { + // For now, we might have divided by zero, so detect that. + if (0 == fDiffRadius) { + return NULL; + } + return SkNEW_PLACEMENT_ARGS(storage, TwoPointRadialGradientContext, (*this, rec)); +} + +SkTwoPointRadialGradient::TwoPointRadialGradientContext::TwoPointRadialGradientContext( + const SkTwoPointRadialGradient& shader, const ContextRec& rec) + : INHERITED(shader, rec) +{ + // we don't have a span16 proc + fFlags &= ~kHasSpan16_Flag; +} + +void SkTwoPointRadialGradient::TwoPointRadialGradientContext::shadeSpan( + int x, int y, SkPMColor* dstCParam, int count) { SkASSERT(count > 0); + const SkTwoPointRadialGradient& twoPointRadialGradient = + static_cast<const SkTwoPointRadialGradient&>(fShader); + SkPMColor* SK_RESTRICT dstC = dstCParam; // Zero difference between radii: fill with transparent black. - if (fDiffRadius == 0) { + if (twoPointRadialGradient.fDiffRadius == 0) { sk_bzero(dstC, count * sizeof(*dstC)); return; } SkMatrix::MapXYProc dstProc = fDstToIndexProc; - TileProc proc = fTileProc; - const SkPMColor* SK_RESTRICT cache = this->getCache32(); + TileProc proc = twoPointRadialGradient.fTileProc; + const SkPMColor* SK_RESTRICT cache = fCache->getCache32(); - SkScalar foura = fA * 4; - bool posRoot = fDiffRadius < 0; + SkScalar foura = twoPointRadialGradient.fA * 4; + bool posRoot = twoPointRadialGradient.fDiffRadius < 0; if (fDstToIndexClass != kPerspective_MatrixClass) { SkPoint srcPt; dstProc(fDstToIndex, SkIntToScalar(x) + SK_ScalarHalf, @@ -254,21 +278,23 @@ void SkTwoPointRadialGradient::shadeSpan(int x, int y, SkPMColor* dstCParam, dx = fDstToIndex.getScaleX(); dy = fDstToIndex.getSkewY(); } - SkScalar b = (SkScalarMul(fDiff.fX, fx) + - SkScalarMul(fDiff.fY, fy) - fStartRadius) * 2; - SkScalar db = (SkScalarMul(fDiff.fX, dx) + - SkScalarMul(fDiff.fY, dy)) * 2; + SkScalar b = (SkScalarMul(twoPointRadialGradient.fDiff.fX, fx) + + SkScalarMul(twoPointRadialGradient.fDiff.fY, fy) - + twoPointRadialGradient.fStartRadius) * 2; + SkScalar db = (SkScalarMul(twoPointRadialGradient.fDiff.fX, dx) + + SkScalarMul(twoPointRadialGradient.fDiff.fY, dy)) * 2; TwoPointRadialShadeProc shadeProc = shadeSpan_twopoint_repeat; - if (SkShader::kClamp_TileMode == fTileMode) { + if (SkShader::kClamp_TileMode == twoPointRadialGradient.fTileMode) { shadeProc = shadeSpan_twopoint_clamp; - } else if (SkShader::kMirror_TileMode == fTileMode) { + } else if (SkShader::kMirror_TileMode == twoPointRadialGradient.fTileMode) { shadeProc = shadeSpan_twopoint_mirror; } else { - SkASSERT(SkShader::kRepeat_TileMode == fTileMode); + SkASSERT(SkShader::kRepeat_TileMode == twoPointRadialGradient.fTileMode); } (*shadeProc)(fx, dx, fy, dy, b, db, - fSr2D2, foura, fOneOverTwoA, posRoot, + twoPointRadialGradient.fSr2D2, foura, + twoPointRadialGradient.fOneOverTwoA, posRoot, dstC, cache, count); } else { // perspective case SkScalar dstX = SkIntToScalar(x); @@ -278,10 +304,11 @@ void SkTwoPointRadialGradient::shadeSpan(int x, int y, SkPMColor* dstCParam, dstProc(fDstToIndex, dstX, dstY, &srcPt); SkScalar fx = srcPt.fX; SkScalar fy = srcPt.fY; - SkScalar b = (SkScalarMul(fDiff.fX, fx) + - SkScalarMul(fDiff.fY, fy) - fStartRadius) * 2; - SkFixed t = two_point_radial(b, fx, fy, fSr2D2, foura, - fOneOverTwoA, posRoot); + SkScalar b = (SkScalarMul(twoPointRadialGradient.fDiff.fX, fx) + + SkScalarMul(twoPointRadialGradient.fDiff.fY, fy) - + twoPointRadialGradient.fStartRadius) * 2; + SkFixed t = two_point_radial(b, fx, fy, twoPointRadialGradient.fSr2D2, foura, + twoPointRadialGradient.fOneOverTwoA, posRoot); SkFixed index = proc(t); SkASSERT(index <= 0xFFFF); *dstC++ = cache[index >> SkGradientShaderBase::kCache32Shift]; @@ -290,24 +317,7 @@ void SkTwoPointRadialGradient::shadeSpan(int x, int y, SkPMColor* dstCParam, } } -bool SkTwoPointRadialGradient::setContext( const SkBitmap& device, - const SkPaint& paint, - const SkMatrix& matrix){ - // For now, we might have divided by zero, so detect that - if (0 == fDiffRadius) { - return false; - } - - if (!this->INHERITED::setContext(device, paint, matrix)) { - return false; - } - - // we don't have a span16 proc - fFlags &= ~kHasSpan16_Flag; - return true; -} - -#ifdef SK_DEVELOPER +#ifndef SK_IGNORE_TO_STRING void SkTwoPointRadialGradient::toString(SkString* str) const { str->append("SkTwoPointRadialGradient: ("); @@ -334,7 +344,7 @@ void SkTwoPointRadialGradient::toString(SkString* str) const { #endif SkTwoPointRadialGradient::SkTwoPointRadialGradient( - SkFlattenableReadBuffer& buffer) + SkReadBuffer& buffer) : INHERITED(buffer), fCenter1(buffer.readPoint()), fCenter2(buffer.readPoint()), @@ -344,7 +354,7 @@ SkTwoPointRadialGradient::SkTwoPointRadialGradient( }; void SkTwoPointRadialGradient::flatten( - SkFlattenableWriteBuffer& buffer) const { + SkWriteBuffer& buffer) const { this->INHERITED::flatten(buffer); buffer.writePoint(fCenter1); buffer.writePoint(fCenter2); @@ -373,6 +383,7 @@ void SkTwoPointRadialGradient::init() { #if SK_SUPPORT_GPU #include "GrTBackendEffectFactory.h" +#include "SkGr.h" // For brevity typedef GrGLUniformManager::UniformHandle UniformHandle; @@ -520,7 +531,10 @@ GrEffectRef* GrRadial2Gradient::TestCreate(SkRandom* random, colors, stops, colorCount, tm)); SkPaint paint; - return shader->asNewEffect(context, paint); + GrEffectRef* effect; + GrColor grColor; + shader->asNewEffect(context, paint, NULL, &grColor, &effect); + return effect; } ///////////////////////////////////////////////////////////////////// @@ -660,12 +674,22 @@ GrGLEffect::EffectKey GrGLRadial2Gradient::GenKey(const GrDrawEffect& drawEffect ///////////////////////////////////////////////////////////////////// -GrEffectRef* SkTwoPointRadialGradient::asNewEffect(GrContext* context, const SkPaint&) const { +bool SkTwoPointRadialGradient::asNewEffect(GrContext* context, const SkPaint& paint, + const SkMatrix* localMatrix, GrColor* grColor, + GrEffectRef** grEffect) const { SkASSERT(NULL != context); + // invert the localM, translate to center1 (fPtsToUni), rotate so center2 is on x axis. SkMatrix matrix; if (!this->getLocalMatrix().invert(&matrix)) { - return NULL; + return false; + } + if (localMatrix) { + SkMatrix inv; + if (!localMatrix->invert(&inv)) { + return false; + } + matrix.postConcat(inv); } matrix.postConcat(fPtsToUnit); @@ -678,14 +702,19 @@ GrEffectRef* SkTwoPointRadialGradient::asNewEffect(GrContext* context, const SkP matrix.postConcat(rot); } - return GrRadial2Gradient::Create(context, *this, matrix, fTileMode); + *grColor = SkColor2GrColorJustAlpha(paint.getColor()); + *grEffect = GrRadial2Gradient::Create(context, *this, matrix, fTileMode); + + return true; } #else -GrEffectRef* SkTwoPointRadialGradient::asNewEffect(GrContext*, const SkPaint&) const { +bool SkTwoPointRadialGradient::asNewEffect(GrContext* context, const SkPaint& paint, + const SkMatrix* localMatrix, GrColor* grColor, + GrEffectRef** grEffect) const { SkDEBUGFAIL("Should not call in GPU-less build"); - return NULL; + return false; } #endif |