aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkBlendMode.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/SkBlendMode.cpp')
-rw-r--r--src/core/SkBlendMode.cpp17
1 files changed, 9 insertions, 8 deletions
diff --git a/src/core/SkBlendMode.cpp b/src/core/SkBlendMode.cpp
index 81ba69ad26..c3a904d5f2 100644
--- a/src/core/SkBlendMode.cpp
+++ b/src/core/SkBlendMode.cpp
@@ -8,10 +8,6 @@
#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:
@@ -65,7 +61,7 @@ bool SkBlendMode_AsCoeff(SkBlendMode mode, SkBlendModeCoeff* src, SkBlendModeCoe
return true;
}
-void SkBlendMode_AppendStages(SkBlendMode mode, SkRasterPipeline* p) {
+void SkBlendMode_AppendStagesNoClamp(SkBlendMode mode, SkRasterPipeline* p) {
auto stage = SkRasterPipeline::srcover;
switch (mode) {
case SkBlendMode::kClear: stage = SkRasterPipeline::clear; break;
@@ -103,6 +99,14 @@ void SkBlendMode_AppendStages(SkBlendMode mode, SkRasterPipeline* p) {
p->append(stage);
}
+void SkBlendMode_AppendClampIfNeeded(SkBlendMode mode, SkRasterPipeline* p) {
+ if (mode == SkBlendMode::kPlus) {
+ // Both clamp_a and clamp_1 would preserve premultiplication invariants here,
+ // so we pick clamp_1 for being a smidge faster.
+ p->append(SkRasterPipeline::clamp_1);
+ }
+}
+
SkPM4f SkBlendMode_Apply(SkBlendMode mode, SkPM4f src, SkPM4f dst) {
// special-case simple/common modes...
switch (mode) {
@@ -123,9 +127,6 @@ SkPM4f SkBlendMode_Apply(SkBlendMode mode, SkPM4f src, SkPM4f dst) {
p.append(SkRasterPipeline::move_src_dst);
p.append(SkRasterPipeline::load_f32, &src_ctx);
SkBlendMode_AppendStages(mode, &p);
- if (SkBlendMode_CanOverflow(mode)) {
- p.append(SkRasterPipeline::clamp_1);
- }
p.append(SkRasterPipeline::store_f32, &dst_ctx);
p.run(0, 0, 1);
return dst;