| Index: src/gpu/glsl/GrGLSLBlend.cpp | 
| diff --git a/src/gpu/glsl/GrGLSLBlend.cpp b/src/gpu/glsl/GrGLSLBlend.cpp | 
| index 3c83068fc19aa8785f01c5118ae79e59070d7eed..6937977a948a47d00b2de630f6501064a656f544 100644 | 
| --- a/src/gpu/glsl/GrGLSLBlend.cpp | 
| +++ b/src/gpu/glsl/GrGLSLBlend.cpp | 
| @@ -433,3 +433,50 @@ void GrGLSLBlend::AppendMode(GrGLSLFragmentBuilder* fsBuilder, const char* srcCo | 
| emit_advanced_xfermode_code(fsBuilder, srcColor, dstColor, outColor, mode); | 
| } | 
| } | 
| + | 
| +void GrGLSLBlend::AppendRegionOp(GrGLSLFragmentBuilder* fsBuilder, const char* srcColor, | 
| +                                 const char* dstColor, const char* outColor, | 
| +                                 SkRegion::Op regionOp) { | 
| +    SkXfermode::Coeff srcCoeff, dstCoeff; | 
| +    switch (regionOp) { | 
| +        case SkRegion::kReplace_Op: | 
| +            srcCoeff = SkXfermode::kOne_Coeff; | 
| +            dstCoeff = SkXfermode::kZero_Coeff; | 
| +            break; | 
| +        case SkRegion::kIntersect_Op: | 
| +            srcCoeff = SkXfermode::kDC_Coeff; | 
| +            dstCoeff = SkXfermode::kZero_Coeff; | 
| +            break; | 
| +        case SkRegion::kUnion_Op: | 
| +            srcCoeff = SkXfermode::kOne_Coeff; | 
| +            dstCoeff = SkXfermode::kISC_Coeff; | 
| +            break; | 
| +        case SkRegion::kXOR_Op: | 
| +            srcCoeff = SkXfermode::kIDC_Coeff; | 
| +            dstCoeff = SkXfermode::kISC_Coeff; | 
| +            break; | 
| +        case SkRegion::kDifference_Op: | 
| +            srcCoeff = SkXfermode::kZero_Coeff; | 
| +            dstCoeff = SkXfermode::kISC_Coeff; | 
| +            break; | 
| +        case SkRegion::kReverseDifference_Op: | 
| +            srcCoeff = SkXfermode::kIDC_Coeff; | 
| +            dstCoeff = SkXfermode::kZero_Coeff; | 
| +            break; | 
| +        default: | 
| +            SkFAIL("Unsupported Op"); | 
| +            // We should never get here but to make compiler happy | 
| +            srcCoeff = SkXfermode::kZero_Coeff; | 
| +            dstCoeff = SkXfermode::kZero_Coeff; | 
| +    } | 
| +    fsBuilder->codeAppendf("%s = ", outColor); | 
| +    // append src blend | 
| +    bool didAppend = append_porterduff_term(fsBuilder, srcCoeff, srcColor, srcColor, dstColor, | 
| +                                            false); | 
| +    // append dst blend | 
| +    if(!append_porterduff_term(fsBuilder, dstCoeff, dstColor, srcColor, dstColor, didAppend)) { | 
| +        fsBuilder->codeAppend("vec4(0, 0, 0, 0)"); | 
| +    } | 
| +    fsBuilder->codeAppend(";"); | 
| +} | 
| + | 
|  |