SkXfermodeInterpretation.cpp 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. /*
  2. * Copyright 2015 Google Inc.
  3. *
  4. * Use of this source code is governed by a BSD-style license that can be
  5. * found in the LICENSE file.
  6. */
  7. #include "include/core/SkPaint.h"
  8. #include "src/core/SkXfermodeInterpretation.h"
  9. static bool just_solid_color(const SkPaint& p) {
  10. return SK_AlphaOPAQUE == p.getAlpha() && !p.getColorFilter() && !p.getShader();
  11. }
  12. SkXfermodeInterpretation SkInterpretXfermode(const SkPaint& paint, bool dstIsOpaque) {
  13. switch (paint.getBlendMode()) {
  14. case SkBlendMode::kSrcOver:
  15. return kSrcOver_SkXfermodeInterpretation;
  16. case SkBlendMode::kSrc:
  17. if (just_solid_color(paint)) {
  18. return kSrcOver_SkXfermodeInterpretation;
  19. }
  20. return kNormal_SkXfermodeInterpretation;
  21. case SkBlendMode::kDst:
  22. return kSkipDrawing_SkXfermodeInterpretation;
  23. case SkBlendMode::kDstOver:
  24. if (dstIsOpaque) {
  25. return kSkipDrawing_SkXfermodeInterpretation;
  26. }
  27. return kNormal_SkXfermodeInterpretation;
  28. case SkBlendMode::kSrcIn:
  29. if (dstIsOpaque && just_solid_color(paint)) {
  30. return kSrcOver_SkXfermodeInterpretation;
  31. }
  32. return kNormal_SkXfermodeInterpretation;
  33. case SkBlendMode::kDstIn:
  34. if (just_solid_color(paint)) {
  35. return kSkipDrawing_SkXfermodeInterpretation;
  36. }
  37. return kNormal_SkXfermodeInterpretation;
  38. default:
  39. return kNormal_SkXfermodeInterpretation;
  40. }
  41. }