SkRasterPipelineBlitter: support A8
authorMike Klein <mtklein@chromium.org>
Wed, 4 Jan 2017 21:32:17 +0000 (16:32 -0500)
committerSkia Commit-Bot <skia-commit-bot@chromium.org>
Thu, 5 Jan 2017 20:07:12 +0000 (20:07 +0000)
This adds support for loading and storing A8, then uses it in SkRasterPipelineBlitter.

I think this handles all dst formats now: A8, 565, 8888 (by policy, sRGB only) and F16.

CQ_INCLUDE_TRYBOTS=master.tryserver.blink:linux_trusty_blink_rel;skia.primary:Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Release-SKNX_NO_SIMD

Change-Id: Id207f6e6c56b6bfcc301d77dd23e0959bb7afba8
Reviewed-on: https://skia-review.googlesource.com/6554
Reviewed-by: Mike Reed <reed@google.com>
Commit-Queue: Mike Klein <mtklein@chromium.org>

src/core/SkRasterPipeline.h
src/core/SkRasterPipelineBlitter.cpp
src/opts/SkNx_sse.h
src/opts/SkRasterPipeline_opts.h

index 3b18b73..4d8e9ab 100644 (file)
@@ -65,6 +65,7 @@
     M(from_srgb) M(from_srgb_d) M(to_srgb)                       \
     M(from_2dot2) M(to_2dot2)                                    \
     M(constant_color) M(store_f32)                               \
+    M(load_a8)   M(load_a8_d)   M(store_a8)                      \
     M(load_565)  M(load_565_d)  M(store_565)                     \
     M(load_f16)  M(load_f16_d)  M(store_f16)                     \
     M(load_8888) M(load_8888_d) M(store_8888)                    \
index cbdb09f..19e00de 100644 (file)
@@ -79,9 +79,10 @@ SkBlitter* SkCreateRasterPipelineBlitter(const SkPixmap& dst,
 
 static bool supported(const SkImageInfo& info) {
     switch (info.colorType()) {
+        case kAlpha_8_SkColorType:  return true;
+        case kRGB_565_SkColorType:  return true;
         case kN32_SkColorType:      return info.gammaCloseToSRGB();
         case kRGBA_F16_SkColorType: return true;
-        case kRGB_565_SkColorType:  return true;
         default:                    return false;
     }
 }
@@ -187,6 +188,7 @@ void SkRasterPipelineBlitter::append_load_d(SkRasterPipeline* p) const {
     SkASSERT(supported(fDst.info()));
 
     switch (fDst.info().colorType()) {
+        case kAlpha_8_SkColorType:   p->append(SkRasterPipeline::load_a8_d,   &fDstPtr); break;
         case kRGB_565_SkColorType:   p->append(SkRasterPipeline::load_565_d,  &fDstPtr); break;
         case kBGRA_8888_SkColorType:
         case kRGBA_8888_SkColorType: p->append(SkRasterPipeline::load_8888_d, &fDstPtr); break;
@@ -211,6 +213,7 @@ void SkRasterPipelineBlitter::append_store(SkRasterPipeline* p) const {
 
     SkASSERT(supported(fDst.info()));
     switch (fDst.info().colorType()) {
+        case kAlpha_8_SkColorType:   p->append(SkRasterPipeline::store_a8,   &fDstPtr); break;
         case kRGB_565_SkColorType:   p->append(SkRasterPipeline::store_565,  &fDstPtr); break;
         case kBGRA_8888_SkColorType:
         case kRGBA_8888_SkColorType: p->append(SkRasterPipeline::store_8888, &fDstPtr); break;
index 3941156..d52509a 100644 (file)
@@ -650,6 +650,10 @@ public:
                 hi = _mm256_extractf128_si256(src.fVec, 1);
         return _mm_packus_epi32(lo, hi);
     }
+    template<> AI /*static*/ Sk8b SkNx_cast<uint8_t>(const Sk8i& src) {
+        auto _16 = SkNx_cast<uint16_t>(src);
+        return _mm_packus_epi16(_16.fVec, _16.fVec);
+    }
 
 #endif
 
index 3b877ce..b055c87 100644 (file)
@@ -503,6 +503,16 @@ STAGE_CTX(lerp_565, const uint16_t**) {
     a = 1.0f;
 }
 
+STAGE_CTX(load_a8, const uint8_t**) {
+    auto ptr = *ctx + x;
+    r = g = b = 0.0f;
+    a = SkNf_from_byte(load(tail, ptr));
+}
+STAGE_CTX(store_a8, uint8_t**) {
+    auto ptr = *ctx + x;
+    store(tail, SkNx_cast<uint8_t>(SkNf_round(255.0f, a)), ptr);
+}
+
 STAGE_CTX(load_565, const uint16_t**) {
     auto ptr = *ctx + x;
     from_565(load(tail, ptr), &r,&g,&b);