| Index: src/gpu/SkGr.cpp | 
| diff --git a/src/gpu/SkGr.cpp b/src/gpu/SkGr.cpp | 
| index 2596e966bfeda7736575c712fb2197d7e4b86b57..d0db55f7daef71cfa88353361737c055717b29ed 100644 | 
| --- a/src/gpu/SkGr.cpp | 
| +++ b/src/gpu/SkGr.cpp | 
| @@ -6,7 +6,9 @@ | 
| */ | 
|  | 
| #include "SkGr.h" | 
| +#include "SkColorFilter.h" | 
| #include "SkConfig8888.h" | 
| +#include "SkGpuDevice.h" | 
| #include "SkMessageBus.h" | 
| #include "SkPixelRef.h" | 
| #include "GrResourceCache.h" | 
| @@ -323,3 +325,96 @@ bool GrPixelConfig2ColorType(GrPixelConfig config, SkColorType* ctOut) { | 
| } | 
| return true; | 
| } | 
| + | 
| +/////////////////////////////////////////////////////////////////////////////// | 
| + | 
| +void SkPaint2GrPaintNoShader(SkGpuDevice* dev, const SkPaint& skPaint, bool justAlpha, | 
| +                             bool constantColor, GrPaint* grPaint) { | 
| + | 
| +    grPaint->setDither(skPaint.isDither()); | 
| +    grPaint->setAntiAlias(skPaint.isAntiAlias()); | 
| + | 
| +    SkXfermode::Coeff sm; | 
| +    SkXfermode::Coeff dm; | 
| + | 
| +    SkXfermode* mode = skPaint.getXfermode(); | 
| +    GrEffectRef* xferEffect = NULL; | 
| +    if (SkXfermode::AsNewEffectOrCoeff(mode, &xferEffect, &sm, &dm)) { | 
| +        if (NULL != xferEffect) { | 
| +            grPaint->addColorEffect(xferEffect)->unref(); | 
| +            sm = SkXfermode::kOne_Coeff; | 
| +            dm = SkXfermode::kZero_Coeff; | 
| +        } | 
| +    } else { | 
| +        //SkDEBUGCODE(SkDebugf("Unsupported xfer mode.\n");) | 
| +        // Fall back to src-over | 
| +        sm = SkXfermode::kOne_Coeff; | 
| +        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())); | 
| +    } | 
| + | 
| +    SkColorFilter* colorFilter = skPaint.getColorFilter(); | 
| +    if (NULL != colorFilter) { | 
| +        // if the source color is a constant then apply the filter here once rather than per pixel | 
| +        // in a shader. | 
| +        if (constantColor) { | 
| +            SkColor filtered = colorFilter->filterColor(skPaint.getColor()); | 
| +            grPaint->setColor(SkColor2GrColor(filtered)); | 
| +        } else { | 
| +            SkAutoTUnref<GrEffectRef> effect(colorFilter->asNewEffect(dev->context())); | 
| +            if (NULL != effect.get()) { | 
| +                grPaint->addColorEffect(effect); | 
| +            } | 
| +        } | 
| +    } | 
| +} | 
| + | 
| +void SkPaint2GrPaintShader(SkGpuDevice* dev, const SkPaint& skPaint, | 
| +                           bool constantColor, GrPaint* grPaint) { | 
| +    SkShader* shader = skPaint.getShader(); | 
| +    if (NULL == shader) { | 
| +        SkPaint2GrPaintNoShader(dev, skPaint, false, constantColor, grPaint); | 
| +        return; | 
| +    } | 
| + | 
| +    // SkShader::asNewEffect() may do offscreen rendering. Setup default drawing state and require | 
| +    // the shader to set a render target. | 
| +    GrContext::AutoWideOpenIdentityDraw awo(dev->context(), NULL); | 
| + | 
| +    // setup the shader as the first color effect on the paint | 
| +    SkAutoTUnref<GrEffectRef> effect(shader->asNewEffect(dev->context(), skPaint, NULL)); | 
| +    if (NULL != effect.get()) { | 
| +        grPaint->addColorEffect(effect); | 
| +        // Now setup the rest of the paint. | 
| +        SkPaint2GrPaintNoShader(dev, 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(dev, copy, false, constantColor, grPaint); | 
| +        } else { | 
| +            SkPaint2GrPaintNoShader(dev, skPaint, false, constantColor, grPaint); | 
| +        } | 
| +    } | 
| +} | 
| + | 
|  |