diff options
author | 2014-06-10 14:38:28 -0700 | |
---|---|---|
committer | 2014-06-10 14:38:28 -0700 | |
commit | 9de5b514d38c5b36066bcdc14fba2f7e5196d372 (patch) | |
tree | 8dfe270706133558dab7f076a27a0298ec38cc64 /src/gpu/SkGr.cpp | |
parent | ce06c485a2d897eeb3e997ed6a546e77e99e47be (diff) |
SkShader::asNewEffect Refactoring
The new signature is:
bool asNewEffect(GrContext* context, const SkPaint& paint, GrColor* grColor, GrEffectRef** grEffect, const SkMatrix* localMatrixOrNull) const;
It will fix the hack for skcolorshader by modifying the GrColor parameter in SkGr::SkPaint2GrPaintShader.
BUG=skia:2646
R=jvanverth@google.com, bsalomon@google.com
Author: dandov@google.com
Review URL: https://codereview.chromium.org/318923005
Diffstat (limited to 'src/gpu/SkGr.cpp')
-rw-r--r-- | src/gpu/SkGr.cpp | 49 |
1 files changed, 15 insertions, 34 deletions
diff --git a/src/gpu/SkGr.cpp b/src/gpu/SkGr.cpp index fb2ebdd53f..c4720b58c8 100644 --- a/src/gpu/SkGr.cpp +++ b/src/gpu/SkGr.cpp @@ -416,7 +416,7 @@ bool GrPixelConfig2ColorType(GrPixelConfig config, SkColorType* ctOut) { /////////////////////////////////////////////////////////////////////////////// -void SkPaint2GrPaintNoShader(GrContext* context, const SkPaint& skPaint, bool justAlpha, +void SkPaint2GrPaintNoShader(GrContext* context, const SkPaint& skPaint, GrColor grColor, bool constantColor, GrPaint* grPaint) { grPaint->setDither(skPaint.isDither()); @@ -440,16 +440,9 @@ void SkPaint2GrPaintNoShader(GrContext* context, const SkPaint& skPaint, bool ju dm = SkXfermode::kISA_Coeff; } grPaint->setBlendFunc(sk_blend_to_grblend(sm), sk_blend_to_grblend(dm)); - - if (justAlpha) { - uint8_t alpha = skPaint.getAlpha(); - grPaint->setColor(GrColorPackRGBA(alpha, alpha, alpha, alpha)); - // justAlpha is currently set to true only if there is a texture, - // so constantColor should not also be true. - SkASSERT(!constantColor); - } else { - grPaint->setColor(SkColor2GrColor(skPaint.getColor())); - } + + //set the color of the paint to the one of the parameter + grPaint->setColor(grColor); SkColorFilter* colorFilter = skPaint.getColorFilter(); if (NULL != colorFilter) { @@ -491,7 +484,8 @@ void SkPaint2GrPaintShader(GrContext* context, const SkPaint& skPaint, bool constantColor, GrPaint* grPaint) { SkShader* shader = skPaint.getShader(); if (NULL == shader) { - SkPaint2GrPaintNoShader(context, skPaint, false, constantColor, grPaint); + SkPaint2GrPaintNoShader(context, skPaint, SkColor2GrColor(skPaint.getColor()), + constantColor, grPaint); return; } @@ -503,28 +497,15 @@ void SkPaint2GrPaintShader(GrContext* context, const SkPaint& skPaint, AutoMatrix am(context); // setup the shader as the first color effect on the paint - SkAutoTUnref<GrEffectRef> effect(shader->asNewEffect(context, skPaint, NULL)); - if (NULL != effect.get()) { + // the default grColor is the paint's color + GrColor grColor = SkColor2GrColor(skPaint.getColor()); + GrEffectRef* grEffect = NULL; + if (shader->asNewEffect(context, skPaint, NULL, &grColor, &grEffect) && NULL != grEffect) { + SkAutoTUnref<GrEffectRef> effect(grEffect); grPaint->addColorEffect(effect); - // Now setup the rest of the paint. - SkPaint2GrPaintNoShader(context, skPaint, true, false, grPaint); - } else { - // We still don't have SkColorShader::asNewEffect() implemented. - SkShader::GradientInfo info; - SkColor color; - - info.fColors = &color; - info.fColorOffsets = NULL; - info.fColorCount = 1; - if (SkShader::kColor_GradientType == shader->asAGradient(&info)) { - SkPaint copy(skPaint); - copy.setShader(NULL); - // modulate the paint alpha by the shader's solid color alpha - U8CPU newA = SkMulDiv255Round(SkColorGetA(color), copy.getAlpha()); - copy.setColor(SkColorSetA(color, newA)); - SkPaint2GrPaintNoShader(context, copy, false, constantColor, grPaint); - } else { - SkPaint2GrPaintNoShader(context, skPaint, false, constantColor, grPaint); - } + constantColor = false; } + // The grcolor is automatically set when calling asneweffect. + // If the shader can be seen as an effect it returns true and adds its effect to the grpaint. + SkPaint2GrPaintNoShader(context, skPaint, grColor, constantColor, grPaint); } |