/* * 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) { switch (paint.getBlendMode()) { case SkBlendMode::kSrcOver: return kSrcOver_SkXfermodeInterpretation; case SkBlendMode::kSrc: if (just_solid_color(paint)) { return kSrcOver_SkXfermodeInterpretation; } return kNormal_SkXfermodeInterpretation; case SkBlendMode::kDst: return kSkipDrawing_SkXfermodeInterpretation; case SkBlendMode::kDstOver: if (dstIsOpaque) { return kSkipDrawing_SkXfermodeInterpretation; } return kNormal_SkXfermodeInterpretation; case SkBlendMode::kSrcIn: if (dstIsOpaque && just_solid_color(paint)) { return kSrcOver_SkXfermodeInterpretation; } return kNormal_SkXfermodeInterpretation; case SkBlendMode::kDstIn: if (just_solid_color(paint)) { return kSkipDrawing_SkXfermodeInterpretation; } return kNormal_SkXfermodeInterpretation; default: return kNormal_SkXfermodeInterpretation; } }