| Index: src/core/SkXfermodeInterpretation.cpp | 
| diff --git a/src/core/SkXfermodeInterpretation.cpp b/src/core/SkXfermodeInterpretation.cpp | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..1b2c8e32e6315cef7ceefafd9f11379585f8a6ec | 
| --- /dev/null | 
| +++ b/src/core/SkXfermodeInterpretation.cpp | 
| @@ -0,0 +1,51 @@ | 
| +/* | 
| + * Copyright 2015 Google Inc. | 
| + * | 
| + * Use of this source code is governed by a BSD-style license that can be | 
| + * found in the LICENSE file. | 
| + */ | 
| + | 
| +#include "SkXfermodeInterpretation.h" | 
| +#include "SkPaint.h" | 
| + | 
| +static bool just_solid_color(const SkPaint& p) { | 
| +    return SK_AlphaOPAQUE == p.getAlpha() | 
| +        && !p.getColorFilter() && !p.getShader(); | 
| +} | 
| + | 
| +SkXfermodeInterpretation SkInterpretXfermode(const SkPaint& paint, | 
| +                                             bool dstIsOpaque) { | 
| +    const SkXfermode* xfer = paint.getXfermode(); | 
| +    SkXfermode::Mode mode; | 
| +    if (!SkXfermode::AsMode(xfer, &mode)) { | 
| +        return kNormal_SkXfermodeInterpretation; | 
| +    } | 
| +    switch (mode) { | 
| +        case SkXfermode::kSrcOver_Mode: | 
| +            return kSrcOver_SkXfermodeInterpretation; | 
| +        case SkXfermode::kSrc_Mode: | 
| +            if (just_solid_color(paint)) { | 
| +                return kSrcOver_SkXfermodeInterpretation; | 
| +            } | 
| +            return kNormal_SkXfermodeInterpretation; | 
| +        case SkXfermode::kDst_Mode: | 
| +            return kSkipDrawing_SkXfermodeInterpretation; | 
| +        case SkXfermode::kDstOver_Mode: | 
| +            if (dstIsOpaque) { | 
| +                return kSkipDrawing_SkXfermodeInterpretation; | 
| +            } | 
| +            return kNormal_SkXfermodeInterpretation; | 
| +        case SkXfermode::kSrcIn_Mode: | 
| +            if (dstIsOpaque && just_solid_color(paint)) { | 
| +                return kSrcOver_SkXfermodeInterpretation; | 
| +            } | 
| +            return kNormal_SkXfermodeInterpretation; | 
| +        case SkXfermode::kDstIn_Mode: | 
| +            if (just_solid_color(paint)) { | 
| +                return kSkipDrawing_SkXfermodeInterpretation; | 
| +            } | 
| +            return kNormal_SkXfermodeInterpretation; | 
| +        default: | 
| +            return kNormal_SkXfermodeInterpretation; | 
| +    } | 
| +} | 
|  |