aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkBlendMode.cpp
diff options
context:
space:
mode:
authorGravatar Mike Reed <reed@google.com>2017-06-06 10:41:18 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-06-06 15:07:00 +0000
commit6b3542aeb0780e7e3dd1a1e0493164f27add9827 (patch)
tree172eb63f3f0c05596106ab0402738d8218278ca6 /src/core/SkBlendMode.cpp
parent3928ff8e0b617c3a00eee1963bc31ce5470fba6d (diff)
move Coeff into blendmode
Bug: skia: Change-Id: Ib4f3398b0cdc6b0f575f6db80d2ce0bf9666f077 Reviewed-on: https://skia-review.googlesource.com/18843 Reviewed-by: Mike Reed <reed@google.com> Commit-Queue: Mike Reed <reed@google.com>
Diffstat (limited to 'src/core/SkBlendMode.cpp')
-rw-r--r--src/core/SkBlendMode.cpp104
1 files changed, 104 insertions, 0 deletions
diff --git a/src/core/SkBlendMode.cpp b/src/core/SkBlendMode.cpp
new file mode 100644
index 0000000000..d7ebfb8f8e
--- /dev/null
+++ b/src/core/SkBlendMode.cpp
@@ -0,0 +1,104 @@
+/*
+ * Copyright 2017 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "SkBlendModePriv.h"
+#include "SkRasterPipeline.h"
+
+bool SkBlendMode_CanOverflow(SkBlendMode mode) {
+ return mode == SkBlendMode::kPlus;
+}
+
+bool SkBlendMode_SupportsCoverageAsAlpha(SkBlendMode mode) {
+ switch (mode) {
+ case SkBlendMode::kDst:
+ case SkBlendMode::kSrcOver:
+ case SkBlendMode::kDstOver:
+ case SkBlendMode::kDstOut:
+ case SkBlendMode::kSrcATop:
+ case SkBlendMode::kXor:
+ case SkBlendMode::kPlus:
+ return true;
+ default:
+ break;
+ }
+ return false;
+}
+
+struct CoeffRec {
+ SkBlendModeCoeff fSrc;
+ SkBlendModeCoeff fDst;
+};
+
+const CoeffRec gCoeffs[] = {
+ { SkBlendModeCoeff::kZero, SkBlendModeCoeff::kZero },
+ { SkBlendModeCoeff::kOne, SkBlendModeCoeff::kZero },
+ { SkBlendModeCoeff::kZero, SkBlendModeCoeff::kOne },
+ { SkBlendModeCoeff::kOne, SkBlendModeCoeff::kISA },
+ { SkBlendModeCoeff::kIDA, SkBlendModeCoeff::kOne },
+ { SkBlendModeCoeff::kDA, SkBlendModeCoeff::kZero },
+ { SkBlendModeCoeff::kZero, SkBlendModeCoeff::kSA },
+ { SkBlendModeCoeff::kIDA, SkBlendModeCoeff::kZero },
+ { SkBlendModeCoeff::kZero, SkBlendModeCoeff::kISA },
+ { SkBlendModeCoeff::kDA, SkBlendModeCoeff::kISA },
+ { SkBlendModeCoeff::kIDA, SkBlendModeCoeff::kSA },
+ { SkBlendModeCoeff::kIDA, SkBlendModeCoeff::kISA },
+
+ { SkBlendModeCoeff::kOne, SkBlendModeCoeff::kOne },
+ { SkBlendModeCoeff::kZero, SkBlendModeCoeff::kSC },
+ { SkBlendModeCoeff::kOne, SkBlendModeCoeff::kISC }, // screen
+};
+
+bool SkBlendMode_AsCoeff(SkBlendMode mode, SkBlendModeCoeff* src, SkBlendModeCoeff* dst) {
+ if (mode > SkBlendMode::kScreen) {
+ return false;
+ }
+ if (src) {
+ *src = gCoeffs[static_cast<int>(mode)].fSrc;
+ }
+ if (dst) {
+ *dst = gCoeffs[static_cast<int>(mode)].fDst;
+ }
+ return true;
+}
+
+void SkBlendMode_AppendStages(SkBlendMode mode, SkRasterPipeline* p) {
+ auto stage = SkRasterPipeline::srcover;
+ switch (mode) {
+ case SkBlendMode::kClear: stage = SkRasterPipeline::clear; break;
+ case SkBlendMode::kSrc: return; // This stage is a no-op.
+ case SkBlendMode::kDst: stage = SkRasterPipeline::move_dst_src; break;
+ case SkBlendMode::kSrcOver: stage = SkRasterPipeline::srcover; break;
+ case SkBlendMode::kDstOver: stage = SkRasterPipeline::dstover; break;
+ case SkBlendMode::kSrcIn: stage = SkRasterPipeline::srcin; break;
+ case SkBlendMode::kDstIn: stage = SkRasterPipeline::dstin; break;
+ case SkBlendMode::kSrcOut: stage = SkRasterPipeline::srcout; break;
+ case SkBlendMode::kDstOut: stage = SkRasterPipeline::dstout; break;
+ case SkBlendMode::kSrcATop: stage = SkRasterPipeline::srcatop; break;
+ case SkBlendMode::kDstATop: stage = SkRasterPipeline::dstatop; break;
+ case SkBlendMode::kXor: stage = SkRasterPipeline::xor_; break;
+ case SkBlendMode::kPlus: stage = SkRasterPipeline::plus_; break;
+ case SkBlendMode::kModulate: stage = SkRasterPipeline::modulate; break;
+
+ case SkBlendMode::kScreen: stage = SkRasterPipeline::screen; break;
+ case SkBlendMode::kOverlay: stage = SkRasterPipeline::overlay; break;
+ case SkBlendMode::kDarken: stage = SkRasterPipeline::darken; break;
+ case SkBlendMode::kLighten: stage = SkRasterPipeline::lighten; break;
+ case SkBlendMode::kColorDodge: stage = SkRasterPipeline::colordodge; break;
+ case SkBlendMode::kColorBurn: stage = SkRasterPipeline::colorburn; break;
+ case SkBlendMode::kHardLight: stage = SkRasterPipeline::hardlight; break;
+ case SkBlendMode::kSoftLight: stage = SkRasterPipeline::softlight; break;
+ case SkBlendMode::kDifference: stage = SkRasterPipeline::difference; break;
+ case SkBlendMode::kExclusion: stage = SkRasterPipeline::exclusion; break;
+ case SkBlendMode::kMultiply: stage = SkRasterPipeline::multiply; break;
+
+ case SkBlendMode::kHue: stage = SkRasterPipeline::hue; break;
+ case SkBlendMode::kSaturation: stage = SkRasterPipeline::saturation; break;
+ case SkBlendMode::kColor: stage = SkRasterPipeline::color; break;
+ case SkBlendMode::kLuminosity: stage = SkRasterPipeline::luminosity; break;
+ }
+ p->append(stage);
+}