aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/SkRasterPipeline.h27
-rw-r--r--src/effects/SkLumaColorFilter.cpp6
-rw-r--r--src/opts/SkRasterPipeline_opts.h6
3 files changed, 26 insertions, 13 deletions
diff --git a/src/core/SkRasterPipeline.h b/src/core/SkRasterPipeline.h
index ccfdeb5949..6d8fef299e 100644
--- a/src/core/SkRasterPipeline.h
+++ b/src/core/SkRasterPipeline.h
@@ -54,19 +54,20 @@
// TODO: There may be a better place to stuff tail, e.g. in the bottom alignment bits of
// the Stage*. This mostly matters on 64-bit Windows where every register is precious.
-#define SK_RASTER_PIPELINE_STAGES(M) \
- M(swap_src_dst) M(constant_color) M(clamp_1) \
- M(load_s_565) M(load_d_565) M(store_565) \
- M(load_s_srgb) M(load_d_srgb) M(store_srgb) \
- M(load_s_f16) M(load_d_f16) M(store_f16) \
- M(scale_u8) \
- M(lerp_u8) M(lerp_565) M(lerp_constant_float) \
- M(dst) \
- M(dstatop) M(dstin) M(dstout) M(dstover) \
- M(srcatop) M(srcin) M(srcout) M(srcover) \
- M(clear) M(modulate) M(multiply) M(plus_) M(screen) M(xor_) \
- M(colorburn) M(colordodge) M(darken) M(difference) \
- M(exclusion) M(hardlight) M(lighten) M(overlay) M(softlight)
+#define SK_RASTER_PIPELINE_STAGES(M) \
+ M(swap_src_dst) M(constant_color) M(clamp_1) \
+ M(load_s_565) M(load_d_565) M(store_565) \
+ M(load_s_srgb) M(load_d_srgb) M(store_srgb) \
+ M(load_s_f16) M(load_d_f16) M(store_f16) \
+ M(scale_u8) \
+ M(lerp_u8) M(lerp_565) M(lerp_constant_float) \
+ M(dst) \
+ M(dstatop) M(dstin) M(dstout) M(dstover) \
+ M(srcatop) M(srcin) M(srcout) M(srcover) \
+ M(clear) M(modulate) M(multiply) M(plus_) M(screen) M(xor_) \
+ M(colorburn) M(colordodge) M(darken) M(difference) \
+ M(exclusion) M(hardlight) M(lighten) M(overlay) M(softlight) \
+ M(luminance_to_alpha)
class SkRasterPipeline {
public:
diff --git a/src/effects/SkLumaColorFilter.cpp b/src/effects/SkLumaColorFilter.cpp
index 19b2c72956..e3c4f379ad 100644
--- a/src/effects/SkLumaColorFilter.cpp
+++ b/src/effects/SkLumaColorFilter.cpp
@@ -8,6 +8,7 @@
#include "SkLumaColorFilter.h"
#include "SkColorPriv.h"
+#include "SkRasterPipeline.h"
#include "SkString.h"
#if SK_SUPPORT_GPU
@@ -37,6 +38,11 @@ void SkLumaColorFilter::filterSpan(const SkPMColor src[], int count,
}
}
+bool SkLumaColorFilter::onAppendStages(SkRasterPipeline* p) const {
+ p->append(SkRasterPipeline::luminance_to_alpha);
+ return true;
+}
+
sk_sp<SkColorFilter> SkLumaColorFilter::Make() {
return sk_sp<SkColorFilter>(new SkLumaColorFilter);
}
diff --git a/src/opts/SkRasterPipeline_opts.h b/src/opts/SkRasterPipeline_opts.h
index b22c9fc176..845fe40e41 100644
--- a/src/opts/SkRasterPipeline_opts.h
+++ b/src/opts/SkRasterPipeline_opts.h
@@ -8,6 +8,7 @@
#ifndef SkRasterPipeline_opts_DEFINED
#define SkRasterPipeline_opts_DEFINED
+#include "SkColorPriv.h"
#include "SkHalf.h"
#include "SkPM4f.h"
#include "SkRasterPipeline.h"
@@ -444,6 +445,11 @@ RGB_XFERMODE(softlight) {
return s*inv(da) + d*inv(sa) + (s2 <= sa).thenElse(darkSrc, liteSrc); // 1 or (2 or 3)?
}
+STAGE(luminance_to_alpha, true) {
+ a = SK_LUM_COEFF_R*r + SK_LUM_COEFF_G*g + SK_LUM_COEFF_B*b;
+ r = g = b = 0;
+}
+
template <typename Fn>
SI Fn enum_to_Fn(SkRasterPipeline::StockStage st) {