Remove all legacy 565 blitters

These are actually faster than RP in some cases, but it's 565, so I
don't care. Saves about 1.4K of code locally.

Change-Id: I08867b9ff7ad6ce28d5ee7c69d10ecea270128f0
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/579098
Commit-Queue: Brian Osman <brianosman@google.com>
Reviewed-by: Ben Wagner <bungeman@google.com>
diff --git a/gn/core.gni b/gn/core.gni
index 45f2816..e2d7078 100644
--- a/gn/core.gni
+++ b/gn/core.gni
@@ -141,7 +141,6 @@
   "$_src/core/SkBlitter.h",
   "$_src/core/SkBlitter_A8.cpp",
   "$_src/core/SkBlitter_ARGB32.cpp",
-  "$_src/core/SkBlitter_RGB565.cpp",
   "$_src/core/SkBlitter_Sprite.cpp",
   "$_src/core/SkBlockAllocator.cpp",
   "$_src/core/SkBlockAllocator.h",
diff --git a/include/private/SkColorData.h b/include/private/SkColorData.h
index 2b27785..5761df2 100644
--- a/include/private/SkColorData.h
+++ b/include/private/SkColorData.h
@@ -330,27 +330,6 @@
 
 /////////////////////////////////////////////////////////////////////////////////////////
 
-/*  SrcOver the 32bit src color with the 16bit dst, returning a 16bit value
-    (with dirt in the high 16bits, so caller beware).
-*/
-static inline U16CPU SkSrcOver32To16(SkPMColor src, uint16_t dst) {
-    unsigned sr = SkGetPackedR32(src);
-    unsigned sg = SkGetPackedG32(src);
-    unsigned sb = SkGetPackedB32(src);
-
-    unsigned dr = SkGetPackedR16(dst);
-    unsigned dg = SkGetPackedG16(dst);
-    unsigned db = SkGetPackedB16(dst);
-
-    unsigned isa = 255 - SkGetPackedA32(src);
-
-    dr = (sr + SkMul16ShiftRound(dr, isa, SK_R16_BITS)) >> (8 - SK_R16_BITS);
-    dg = (sg + SkMul16ShiftRound(dg, isa, SK_G16_BITS)) >> (8 - SK_G16_BITS);
-    db = (sb + SkMul16ShiftRound(db, isa, SK_B16_BITS)) >> (8 - SK_B16_BITS);
-
-    return SkPackRGB16(dr, dg, db);
-}
-
 static inline SkColor SkPixel16ToColor(U16CPU src) {
     SkASSERT(src == SkToU16(src));
 
diff --git a/public.bzl b/public.bzl
index d4cf522..5132021 100644
--- a/public.bzl
+++ b/public.bzl
@@ -331,7 +331,6 @@
     "src/core/SkBlitter.h",
     "src/core/SkBlitter_A8.cpp",
     "src/core/SkBlitter_ARGB32.cpp",
-    "src/core/SkBlitter_RGB565.cpp",
     "src/core/SkBlitter_Sprite.cpp",
     "src/core/SkBlockAllocator.cpp",
     "src/core/SkBlockAllocator.h",
diff --git a/src/core/BUILD.bazel b/src/core/BUILD.bazel
index c4b1997..ef95284 100644
--- a/src/core/BUILD.bazel
+++ b/src/core/BUILD.bazel
@@ -76,7 +76,6 @@
     "SkBlitter.h",
     "SkBlitter_A8.cpp",
     "SkBlitter_ARGB32.cpp",
-    "SkBlitter_RGB565.cpp",
     "SkBlitter_Sprite.cpp",
     "SkBlurMF.cpp",
     "SkBlurMask.cpp",
diff --git a/src/core/SkBlitter.cpp b/src/core/SkBlitter.cpp
index a6bfcaa..5d11f34 100644
--- a/src/core/SkBlitter.cpp
+++ b/src/core/SkBlitter.cpp
@@ -687,9 +687,8 @@
         }
     }
 
-    // Only kN32 and 565 are handled by legacy blitters now, 565 mostly just for Android.
-    return device.colorType() == kN32_SkColorType
-        || device.colorType() == kRGB_565_SkColorType;
+    // Only kN32 is handled by legacy blitters now
+    return device.colorType() == kN32_SkColorType;
 #endif
 }
 
@@ -782,9 +781,8 @@
         return create_SkRP_or_SkVMBlitter();
     }
 
-    // Everything but legacy kN32_SkColorType and kRGB_565_SkColorType should already be handled.
-    SkASSERT(device.colorType() == kN32_SkColorType ||
-             device.colorType() == kRGB_565_SkColorType);
+    // Everything but legacy kN32_SkColorType should already be handled.
+    SkASSERT(device.colorType() == kN32_SkColorType);
 
     // And we should either have a shader, be blending with SrcOver, or both.
     SkASSERT(paint->getShader() || paint->asBlendMode() == SkBlendMode::kSrcOver);
@@ -814,13 +812,6 @@
                 return alloc->make<SkARGB32_Blitter>(device, *paint);
             }
 
-        case kRGB_565_SkColorType:
-            if (shaderContext && SkRGB565_Shader_Blitter::Supports(device, *paint)) {
-                return alloc->make<SkRGB565_Shader_Blitter>(device, *paint, shaderContext);
-            } else {
-                return create_SkRP_or_SkVMBlitter();
-            }
-
         default:
             SkASSERT(false);
             return alloc->make<SkNullBlitter>();
diff --git a/src/core/SkBlitter_RGB565.cpp b/src/core/SkBlitter_RGB565.cpp
deleted file mode 100644
index c804f31..0000000
--- a/src/core/SkBlitter_RGB565.cpp
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * 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 "include/core/SkShader.h"
-#include "include/private/SkColorData.h"
-#include "include/private/SkColorData.h"
-#include "src/core/SkCoreBlitters.h"
-#include "src/core/SkXfermodePriv.h"
-
-static void D16_S32X_src(uint16_t dst[], const SkPMColor src[], int count, uint8_t coverage) {
-    SkASSERT(coverage == 0xFF);
-    for (int i = 0; i < count; ++i) {
-        dst[i] = SkPixel32ToPixel16(src[i]);
-    }
-}
-
-static void D16_S32X_src_coverage(uint16_t dst[], const SkPMColor src[], int count,
-                                  uint8_t coverage) {
-    switch (coverage) {
-        case 0: break;
-        case 0xFF:
-            for (int i = 0; i < count; ++i) {
-                dst[i] = SkPixel32ToPixel16(src[i]);
-            }
-            break;
-        default:
-            unsigned scale = coverage + (coverage >> 7);
-            for (int i = 0; i < count; ++i) {
-                dst[i] = SkSrcOver32To16(SkAlphaMulQ(src[i], scale), dst[i]);
-            }
-            break;
-    }
-}
-
-static void D16_S32A_srcover(uint16_t dst[], const SkPMColor src[], int count, uint8_t coverage) {
-    SkASSERT(coverage == 0xFF);
-    for (int i = 0; i < count; ++i) {
-        dst[i] = SkSrcOver32To16(src[i], dst[i]);
-    }
-}
-
-static void D16_S32A_srcover_coverage(uint16_t dst[], const SkPMColor src[], int count,
-                                      uint8_t coverage) {
-    switch (coverage) {
-        case 0: break;
-        case 0xFF:
-            for (int i = 0; i < count; ++i) {
-                dst[i] = SkSrcOver32To16(src[i], dst[i]);
-            }
-            break;
-        default:
-            unsigned scale = coverage + (coverage >> 7);
-            for (int i = 0; i < count; ++i) {
-                dst[i] = SkSrcOver32To16(SkAlphaMulQ(src[i], scale), dst[i]);
-            }
-            break;
-    }
-}
-
-bool SkRGB565_Shader_Blitter::Supports(const SkPixmap& device, const SkPaint& paint) {
-    if (device.colorType() != kRGB_565_SkColorType) {
-        return false;
-    }
-    if (device.colorSpace()) {
-        return false;
-    }
-    const auto bm = paint.asBlendMode();
-    if (bm != SkBlendMode::kSrcOver && bm != SkBlendMode::kSrc) {
-        return false;
-    }
-    if (paint.isDither()) {
-        return false;
-    }
-    return true;
-}
-
-SkRGB565_Shader_Blitter::SkRGB565_Shader_Blitter(const SkPixmap& device,
-        const SkPaint& paint, SkShaderBase::Context* shaderContext)
-    : INHERITED(device, paint, shaderContext)
-{
-    SkASSERT(shaderContext);
-    SkASSERT(Supports(device, paint));
-
-    fBuffer = (SkPMColor*)sk_malloc_throw(device.width() * (sizeof(SkPMColor)));
-
-    bool isOpaque = SkToBool(shaderContext->getFlags() & SkShaderBase::kOpaqueAlpha_Flag);
-
-    if (paint.asBlendMode() == SkBlendMode::kSrc || isOpaque) {
-        fBlend = D16_S32X_src;
-        fBlendCoverage = D16_S32X_src_coverage;
-    } else {    // srcover
-        fBlend = isOpaque ? D16_S32X_src : D16_S32A_srcover;
-        fBlendCoverage = isOpaque ? D16_S32X_src_coverage : D16_S32A_srcover_coverage;
-    }
-}
-
-SkRGB565_Shader_Blitter::~SkRGB565_Shader_Blitter() {
-    sk_free(fBuffer);
-}
-
-void SkRGB565_Shader_Blitter::blitH(int x, int y, int width) {
-    SkASSERT(x >= 0 && y >= 0 && x + width <= fDevice.width());
-
-    uint16_t* device = fDevice.writable_addr16(x, y);
-
-    SkPMColor*  span = fBuffer;
-    fShaderContext->shadeSpan(x, y, span, width);
-    fBlend(device, span, width, 0xFF);
-}
-
-void SkRGB565_Shader_Blitter::blitAntiH(int x, int y, const SkAlpha coverage[],
-                                        const int16_t runs[]) {
-    SkPMColor* span = fBuffer;
-    uint16_t*  device = fDevice.writable_addr16(x, y);
-    auto*      shaderContext = fShaderContext;
-
-    for (;;) {
-        int count = *runs;
-        if (count <= 0) {
-            break;
-        }
-        int aa = *coverage;
-        if (aa) {
-            shaderContext->shadeSpan(x, y, span, count);
-            fBlendCoverage(device, span, count, aa);
-        }
-        device += count;
-        runs += count;
-        coverage += count;
-        x += count;
-    }
-}
diff --git a/src/core/SkCoreBlitters.h b/src/core/SkCoreBlitters.h
index 89c5dd9..75d3d27 100644
--- a/src/core/SkCoreBlitters.h
+++ b/src/core/SkCoreBlitters.h
@@ -145,27 +145,6 @@
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-typedef void (*SkS32D16BlendProc)(uint16_t*, const SkPMColor*, int, uint8_t);
-
-class SkRGB565_Shader_Blitter : public SkShaderBlitter {
-public:
-    SkRGB565_Shader_Blitter(const SkPixmap& device, const SkPaint&, SkShaderBase::Context*);
-    ~SkRGB565_Shader_Blitter() override;
-    void blitH(int x, int y, int width) override;
-    void blitAntiH(int x, int y, const SkAlpha[], const int16_t[]) override;
-
-    static bool Supports(const SkPixmap& device, const SkPaint&);
-
-private:
-    SkPMColor*          fBuffer;
-    SkS32D16BlendProc   fBlend;
-    SkS32D16BlendProc   fBlendCoverage;
-
-    using INHERITED = SkShaderBlitter;
-};
-
-///////////////////////////////////////////////////////////////////////////////
-
 SkBlitter* SkCreateRasterPipelineBlitter(const SkPixmap&, const SkPaint&,
                                          const SkMatrixProvider& matrixProvider, SkArenaAlloc*,
                                          sk_sp<SkShader> clipShader, const SkSurfaceProps& props);