Remove use of colorTypes from SkYUVSizeInfo

Bug: skia:7903
Change-Id: I7301d943b679a4670511b6cf60c594baf615834a
Reviewed-on: https://skia-review.googlesource.com/c/164261
Commit-Queue: Jim Van Verth <jvanverth@google.com>
Reviewed-by: Brian Salomon <bsalomon@google.com>
diff --git a/gm/wacky_yuv_formats.cpp b/gm/wacky_yuv_formats.cpp
index fe8a8d3..22cd120 100644
--- a/gm/wacky_yuv_formats.cpp
+++ b/gm/wacky_yuv_formats.cpp
@@ -576,13 +576,11 @@
 
         int i = 0;
         for ( ; i < fNumBitmaps; ++i) {
-            size->fColorTypes[i] = fYUVBitmaps[i].colorType();
             size->fSizes[i].fWidth = fYUVBitmaps[i].width();
             size->fSizes[i].fHeight = fYUVBitmaps[i].height();
             size->fWidthBytes[i] = fYUVBitmaps[i].rowBytes();
         }
         for ( ; i < SkYUVSizeInfo::kMaxCount; ++i) {
-            size->fColorTypes[i] = kUnknown_SkColorType;
             size->fSizes[i].fWidth = 0;
             size->fSizes[i].fHeight = 0;
             size->fWidthBytes[i] = 0;
diff --git a/include/codec/SkCodec.h b/include/codec/SkCodec.h
index 7f81399..40d2d08 100644
--- a/include/codec/SkCodec.h
+++ b/include/codec/SkCodec.h
@@ -365,11 +365,9 @@
         bool result = this->onQueryYUV8(sizeInfo, colorSpace);
         if (result) {
             for (int i = 0; i <= 2; ++i) {
-                SkASSERT(kAlpha_8_SkColorType == sizeInfo->fColorTypes[i]);
                 SkASSERT(sizeInfo->fSizes[i].fWidth > 0 && sizeInfo->fSizes[i].fHeight > 0 &&
                          sizeInfo->fWidthBytes[i] > 0);
             }
-            SkASSERT(kUnknown_SkColorType == sizeInfo->fColorTypes[3]);
             SkASSERT(!sizeInfo->fSizes[3].fWidth &&
                      !sizeInfo->fSizes[3].fHeight &&
                      !sizeInfo->fWidthBytes[3]);
@@ -391,7 +389,6 @@
         if (!planes || !planes[0] || !planes[1] || !planes[2]) {
             return kInvalidInput;
         }
-        SkASSERT(kUnknown_SkColorType == sizeInfo.fColorTypes[3]);
         SkASSERT(!planes[3]); // TODO: is this a fair assumption?
 
         if (!this->rewindIfNeeded()) {
diff --git a/include/core/SkYUVSizeInfo.h b/include/core/SkYUVSizeInfo.h
index a882e2d..ddfb0c8 100644
--- a/include/core/SkYUVSizeInfo.h
+++ b/include/core/SkYUVSizeInfo.h
@@ -15,7 +15,6 @@
 struct SkYUVSizeInfo {
     static constexpr auto kMaxCount = 4;
 
-    SkColorType fColorTypes[kMaxCount];
     SkISize     fSizes[kMaxCount];
 
     /**
@@ -34,17 +33,8 @@
 
     bool operator==(const SkYUVSizeInfo& that) const {
         for (int i = 0; i < kMaxCount; ++i) {
-            if (fColorTypes[i] != that.fColorTypes[i]) {
-                return false;
-            }
-
-            if (kUnknown_SkColorType == fColorTypes[i]) {
-                SkASSERT(!fSizes[i].fWidth && !fSizes[i].fHeight && !fWidthBytes[i]);
-                SkASSERT(!that.fSizes[i].fWidth && !that.fSizes[i].fHeight && !that.fWidthBytes[i]);
-                continue;
-            }
-
-            SkASSERT(fSizes[i].fWidth && fSizes[i].fHeight && fWidthBytes[i]);
+            SkASSERT((!fSizes[i].isEmpty() && fWidthBytes[i]) ||
+                     (fSizes[i].isEmpty() && !fWidthBytes[i]));
             if (fSizes[i] != that.fSizes[i] || fWidthBytes[i] != that.fWidthBytes[i]) {
                 return false;
             }
@@ -57,9 +47,8 @@
         size_t totalBytes = 0;
 
         for (int i = 0; i < kMaxCount; ++i) {
-            SkASSERT(kUnknown_SkColorType != fColorTypes[i] ||
-                        (!fSizes[i].fWidth && !fSizes[i].fHeight && !fWidthBytes[i]));
-
+            SkASSERT((!fSizes[i].isEmpty() && fWidthBytes[i]) ||
+                     (fSizes[i].isEmpty() && !fWidthBytes[i]));
             totalBytes += fWidthBytes[i] * fSizes[i].height();
         }
 
diff --git a/src/codec/SkJpegCodec.cpp b/src/codec/SkJpegCodec.cpp
index f5c23a2..c883b3e 100644
--- a/src/codec/SkJpegCodec.cpp
+++ b/src/codec/SkJpegCodec.cpp
@@ -832,13 +832,11 @@
 
     jpeg_component_info * comp_info = dinfo->comp_info;
     for (auto i : { SkYUVAIndex::kY_Index, SkYUVAIndex::kU_Index, SkYUVAIndex::kV_Index }) {
-        sizeInfo->fColorTypes[i] = kAlpha_8_SkColorType;
         sizeInfo->fSizes[i].set(comp_info[i].downsampled_width, comp_info[i].downsampled_height);
         sizeInfo->fWidthBytes[i] = comp_info[i].width_in_blocks * DCTSIZE;
     }
 
     // JPEG never has an alpha channel
-    sizeInfo->fColorTypes[SkYUVAIndex::kA_Index] = kUnknown_SkColorType;
     sizeInfo->fSizes[SkYUVAIndex::kA_Index].fHeight =
         sizeInfo->fSizes[SkYUVAIndex::kA_Index].fWidth =
         sizeInfo->fWidthBytes[SkYUVAIndex::kA_Index] = 0;
@@ -857,9 +855,6 @@
     // This will check is_yuv_supported(), so we don't need to here.
     bool supportsYUV = this->onQueryYUV8(&defaultInfo, nullptr);
     if (!supportsYUV ||
-            kAlpha_8_SkColorType != sizeInfo.fColorTypes[0] ||
-            kAlpha_8_SkColorType != sizeInfo.fColorTypes[1] ||
-            kAlpha_8_SkColorType != sizeInfo.fColorTypes[2] ||
             sizeInfo.fSizes[0] != defaultInfo.fSizes[0] ||
             sizeInfo.fSizes[1] != defaultInfo.fSizes[1] ||
             sizeInfo.fSizes[2] != defaultInfo.fSizes[2] ||
diff --git a/src/core/SkImageGenerator.cpp b/src/core/SkImageGenerator.cpp
index c437494..2c59c9a 100644
--- a/src/core/SkImageGenerator.cpp
+++ b/src/core/SkImageGenerator.cpp
@@ -52,10 +52,6 @@
             switch (numPlanes) {
                 case 1:
                     // Assume 3 interleaved planes
-                    sizeInfo->fColorTypes[0] = kRGBA_8888_SkColorType;
-                    sizeInfo->fColorTypes[1] = kUnknown_SkColorType;
-                    sizeInfo->fColorTypes[2] = kUnknown_SkColorType;
-                    sizeInfo->fColorTypes[3] = kUnknown_SkColorType;
                     yuvaIndices[SkYUVAIndex::kY_Index].fIndex = 0;
                     yuvaIndices[SkYUVAIndex::kY_Index].fChannel = SkColorChannel::kR;
                     yuvaIndices[SkYUVAIndex::kU_Index].fIndex = 0;
@@ -67,10 +63,6 @@
                     break;
                 case 2:
                     // Assume 1 Y plane and interleaved UV planes (NV12)
-                    sizeInfo->fColorTypes[0] = kAlpha_8_SkColorType;
-                    sizeInfo->fColorTypes[1] = kRGBA_8888_SkColorType;
-                    sizeInfo->fColorTypes[2] = kUnknown_SkColorType;
-                    sizeInfo->fColorTypes[3] = kUnknown_SkColorType;
                     yuvaIndices[SkYUVAIndex::kY_Index].fIndex = 0;
                     yuvaIndices[SkYUVAIndex::kY_Index].fChannel = SkColorChannel::kR;
                     yuvaIndices[SkYUVAIndex::kU_Index].fIndex = 1;
@@ -83,10 +75,6 @@
                 case 3:
                 default:
                     // Assume 3 separate non-interleaved planes
-                    sizeInfo->fColorTypes[0] = kAlpha_8_SkColorType;
-                    sizeInfo->fColorTypes[1] = kAlpha_8_SkColorType;
-                    sizeInfo->fColorTypes[2] = kAlpha_8_SkColorType;
-                    sizeInfo->fColorTypes[3] = kUnknown_SkColorType;
                     yuvaIndices[SkYUVAIndex::kY_Index].fIndex = 0;
                     yuvaIndices[SkYUVAIndex::kY_Index].fChannel = SkColorChannel::kR;
                     yuvaIndices[SkYUVAIndex::kU_Index].fIndex = 1;
diff --git a/src/gpu/GrCaps.h b/src/gpu/GrCaps.h
index 918ac14..3047148 100644
--- a/src/gpu/GrCaps.h
+++ b/src/gpu/GrCaps.h
@@ -287,6 +287,14 @@
     virtual bool getConfigFromBackendFormat(const GrBackendFormat& format, SkColorType ct,
                                             GrPixelConfig*) const = 0;
 
+    /**
+     * Special method only for YUVA images. Returns true if the format can be used for a
+     * YUVA plane, and the passed in GrPixelConfig will be set to a config that matches
+     * the backend format.
+     */
+    virtual bool getYUVAConfigFromBackendFormat(const GrBackendFormat& format,
+                                                GrPixelConfig*) const = 0;
+
 #ifdef GR_TEST_UTILS
     /**
      * Creates a GrBackendFormat which matches the backend texture. If the backend texture is
diff --git a/src/gpu/GrYUVProvider.cpp b/src/gpu/GrYUVProvider.cpp
index beccd7d..c85d294 100644
--- a/src/gpu/GrYUVProvider.cpp
+++ b/src/gpu/GrYUVProvider.cpp
@@ -36,8 +36,7 @@
 
         for (int i = 1; i < SkYUVSizeInfo::kMaxCount; ++i) {
             if (!yuvInfo.fSizeInfo.fWidthBytes[i]) {
-                SkASSERT(kUnknown_SkColorType == yuvInfo.fSizeInfo.fColorTypes[i] &&
-                         !yuvInfo.fSizeInfo.fWidthBytes[i] &&
+                SkASSERT(!yuvInfo.fSizeInfo.fWidthBytes[i] &&
                          !yuvInfo.fSizeInfo.fSizes[i].fHeight);
                 planes[i] = nullptr;
                 continue;
@@ -55,7 +54,7 @@
         // Allocate the memory for YUVA
         size_t totalSize(0);
         for (int i = 0; i < SkYUVSizeInfo::kMaxCount; i++) {
-            SkASSERT(kUnknown_SkColorType != yuvInfo.fSizeInfo.fColorTypes[i] ||
+            SkASSERT((yuvInfo.fSizeInfo.fWidthBytes[i] && yuvInfo.fSizeInfo.fSizes[i].fHeight) ||
                      (!yuvInfo.fSizeInfo.fWidthBytes[i] && !yuvInfo.fSizeInfo.fSizes[i].fHeight));
 
             totalSize += yuvInfo.fSizeInfo.fWidthBytes[i] * yuvInfo.fSizeInfo.fSizes[i].fHeight;
@@ -67,8 +66,7 @@
 
         for (int i = 1; i < SkYUVSizeInfo::kMaxCount; ++i) {
             if (!yuvInfo.fSizeInfo.fWidthBytes[i]) {
-                SkASSERT(kUnknown_SkColorType == yuvInfo.fSizeInfo.fColorTypes[i] &&
-                         !yuvInfo.fSizeInfo.fWidthBytes[i] &&
+                SkASSERT(!yuvInfo.fSizeInfo.fWidthBytes[i] &&
                          !yuvInfo.fSizeInfo.fSizes[i].fHeight);
                 planes[i] = nullptr;
                 continue;
@@ -119,10 +117,8 @@
 
     sk_sp<GrTextureProxy> yuvTextureProxies[SkYUVSizeInfo::kMaxCount];
     for (int i = 0; i < SkYUVSizeInfo::kMaxCount; ++i) {
-        if (kUnknown_SkColorType == yuvSizeInfo.fColorTypes[i]) {
-            SkASSERT(!yuvSizeInfo.fSizes[i].fWidth ||
-                     !yuvSizeInfo.fSizes[i].fHeight ||
-                     !yuvSizeInfo.fWidthBytes[i]);
+        if (yuvSizeInfo.fSizes[i].isEmpty()) {
+            SkASSERT(!yuvSizeInfo.fWidthBytes[i]);
             continue;
         }
 
diff --git a/src/gpu/gl/GrGLCaps.cpp b/src/gpu/gl/GrGLCaps.cpp
index 03df575..c16dc40 100644
--- a/src/gpu/gl/GrGLCaps.cpp
+++ b/src/gpu/gl/GrGLCaps.cpp
@@ -2927,6 +2927,37 @@
     return validate_sized_format(*glFormat, ct, config, fStandard);
 }
 
+bool GrGLCaps::getYUVAConfigFromBackendFormat(const GrBackendFormat& format,
+                                              GrPixelConfig* config) const {
+    const GrGLenum* glFormat = format.getGLFormat();
+    if (!glFormat) {
+        return false;
+    }
+
+    switch (*glFormat) {
+    case GR_GL_ALPHA8:
+        *config = kAlpha_8_as_Alpha_GrPixelConfig;
+        break;
+    case GR_GL_R8:
+        *config = kAlpha_8_as_Red_GrPixelConfig;
+        break;
+    case GR_GL_RGBA8:
+        *config = kRGBA_8888_GrPixelConfig;
+        break;
+    case GR_GL_RGB8:
+        *config = kRGB_888_GrPixelConfig;
+        break;
+    case GR_GL_BGRA8:
+        *config = kBGRA_8888_GrPixelConfig;
+        break;
+    default:
+        return false;
+    }
+
+    return true;
+}
+
+
 #ifdef GR_TEST_UTILS
 GrBackendFormat GrGLCaps::onCreateFormatFromBackendTexture(
         const GrBackendTexture& backendTex) const {
diff --git a/src/gpu/gl/GrGLCaps.h b/src/gpu/gl/GrGLCaps.h
index 45acc75..f8b8134 100644
--- a/src/gpu/gl/GrGLCaps.h
+++ b/src/gpu/gl/GrGLCaps.h
@@ -436,6 +436,8 @@
 
     bool getConfigFromBackendFormat(const GrBackendFormat&, SkColorType,
                                     GrPixelConfig*) const override;
+    bool getYUVAConfigFromBackendFormat(const GrBackendFormat&,
+                                        GrPixelConfig*) const override;
 
 #if GR_TEST_UTILS
     GrGLStandard standard() const { return fStandard; }
diff --git a/src/gpu/mock/GrMockCaps.h b/src/gpu/mock/GrMockCaps.h
index 278dea3..2e6e8d9 100644
--- a/src/gpu/mock/GrMockCaps.h
+++ b/src/gpu/mock/GrMockCaps.h
@@ -104,6 +104,16 @@
         return true;
     }
 
+    bool getYUVAConfigFromBackendFormat(const GrBackendFormat& format,
+                                        GrPixelConfig* config) const override {
+        const GrPixelConfig* mockFormat = format.getMockFormat();
+        if (!mockFormat) {
+            return false;
+        }
+        *config = *mockFormat;
+        return true;
+    }
+
 private:
 #ifdef GR_TEST_UTILS
     GrBackendFormat onCreateFormatFromBackendTexture(
diff --git a/src/gpu/mtl/GrMtlCaps.h b/src/gpu/mtl/GrMtlCaps.h
index e72ea83..6de830d 100644
--- a/src/gpu/mtl/GrMtlCaps.h
+++ b/src/gpu/mtl/GrMtlCaps.h
@@ -80,6 +80,11 @@
         return false;
     }
 
+    bool getYUVAConfigFromBackendFormat(const GrBackendFormat&,
+                                        GrPixelConfig*) const override {
+        return false;
+    }
+
     bool performPartialClearsAsDraws() const override {
         return true;
     }
diff --git a/src/gpu/vk/GrVkCaps.cpp b/src/gpu/vk/GrVkCaps.cpp
index 2f38d39..54693d9 100644
--- a/src/gpu/vk/GrVkCaps.cpp
+++ b/src/gpu/vk/GrVkCaps.cpp
@@ -782,6 +782,33 @@
     return validate_image_info(*vkFormat, ct, config);
 }
 
+bool GrVkCaps::getYUVAConfigFromBackendFormat(const GrBackendFormat& format,
+                                              GrPixelConfig* config) const {
+    const VkFormat* vkFormat = format.getVkFormat();
+    if (!vkFormat) {
+        return false;
+    }
+
+    switch (*vkFormat) {
+    case VK_FORMAT_R8_UNORM:
+        *config = kAlpha_8_as_Red_GrPixelConfig;
+        break;
+    case VK_FORMAT_R8G8B8A8_UNORM:
+        *config = kRGBA_8888_GrPixelConfig;
+        break;
+    case VK_FORMAT_R8G8B8_UNORM:
+        *config = kRGB_888_GrPixelConfig;
+        break;
+    case VK_FORMAT_B8G8R8A8_UNORM:
+        *config = kBGRA_8888_GrPixelConfig;
+        break;
+    default:
+        return false;
+    }
+
+    return true;
+}
+
 #ifdef GR_TEST_UTILS
 GrBackendFormat GrVkCaps::onCreateFormatFromBackendTexture(
         const GrBackendTexture& backendTex) const {
diff --git a/src/gpu/vk/GrVkCaps.h b/src/gpu/vk/GrVkCaps.h
index fb269dc..19cdc1d 100644
--- a/src/gpu/vk/GrVkCaps.h
+++ b/src/gpu/vk/GrVkCaps.h
@@ -160,6 +160,8 @@
 
     bool getConfigFromBackendFormat(const GrBackendFormat&, SkColorType,
                                     GrPixelConfig*) const override;
+    bool getYUVAConfigFromBackendFormat(const GrBackendFormat&,
+                                        GrPixelConfig*) const override;
 
 private:
     enum VkVendor {
diff --git a/src/image/SkImage_GpuYUVA.cpp b/src/image/SkImage_GpuYUVA.cpp
index f246508..019131c 100644
--- a/src/image/SkImage_GpuYUVA.cpp
+++ b/src/image/SkImage_GpuYUVA.cpp
@@ -235,15 +235,13 @@
 
     // verify sizeInfo with expected texture count
     for (int i = 0; i < numTextures; ++i) {
-        if (kUnknown_SkColorType == yuvaSizeInfo.fColorTypes[i] ||
-            yuvaSizeInfo.fSizes[i].isEmpty() ||
+        if (yuvaSizeInfo.fSizes[i].isEmpty() ||
             !yuvaSizeInfo.fWidthBytes[i]) {
             return nullptr;
         }
     }
     for (int i = numTextures; i < SkYUVSizeInfo::kMaxCount; ++i) {
-        if (kUnknown_SkColorType != yuvaSizeInfo.fColorTypes[i] ||
-            !yuvaSizeInfo.fSizes[i].isEmpty() ||
+        if (!yuvaSizeInfo.fSizes[i].isEmpty() ||
             yuvaSizeInfo.fWidthBytes[i]) {
             return nullptr;
         }
@@ -258,9 +256,8 @@
             GrPixelConfig fConfig;
             SkPromiseImageHelper fPromiseHelper;
         } params;
-        bool res = context->contextPriv().caps()->getConfigFromBackendFormat(
+        bool res = context->contextPriv().caps()->getYUVAConfigFromBackendFormat(
                        yuvaFormats[texIdx],
-                       yuvaSizeInfo.fColorTypes[texIdx],
                        &params.fConfig);
         if (!res) {
             return nullptr;
diff --git a/tests/YUVCacheTest.cpp b/tests/YUVCacheTest.cpp
index 0410fdb..f4d9292 100644
--- a/tests/YUVCacheTest.cpp
+++ b/tests/YUVCacheTest.cpp
@@ -33,7 +33,6 @@
 
     SkYUVPlanesCache::Info yuvInfo;
     for (int i = 0; i < SkYUVSizeInfo::kMaxCount; i++) {
-        yuvInfo.fSizeInfo.fColorTypes[i] = kAlpha_8_SkColorType;
         yuvInfo.fSizeInfo.fSizes[i].fWidth = 20 * (i + 1);
         yuvInfo.fSizeInfo.fSizes[i].fHeight = 10 * (i + 1);
         yuvInfo.fSizeInfo.fWidthBytes[i] = 80 * (i + 1);
diff --git a/tools/DDLPromiseImageHelper.cpp b/tools/DDLPromiseImageHelper.cpp
index f582cee..accdebd 100644
--- a/tools/DDLPromiseImageHelper.cpp
+++ b/tools/DDLPromiseImageHelper.cpp
@@ -154,12 +154,10 @@
 
             contexts[i] = curImage.refCallbackContext(i).release();
             sizeInfo.fSizes[i].set(curImage.yuvPixmap(i).width(), curImage.yuvPixmap(i).height());
-            sizeInfo.fColorTypes[i] = curImage.yuvPixmap(i).colorType();
             sizeInfo.fWidthBytes[i] = curImage.yuvPixmap(i).rowBytes();
         }
         for (int i = textureCount; i < SkYUVSizeInfo::kMaxCount; ++i) {
             sizeInfo.fSizes[i] = SkISize::MakeEmpty();
-            sizeInfo.fColorTypes[i] = kUnknown_SkColorType;
             sizeInfo.fWidthBytes[i] = 0;
         }
 
@@ -231,17 +229,34 @@
     if (yuvData) {
         newImageInfo.setYUVData(std::move(yuvData), yuvaIndices, yuvColorSpace);
 
+        // determine colortypes from index data
+        // for testing we only ever use A8 or RGBA8888
+        SkColorType colorTypes[SkYUVSizeInfo::kMaxCount] = {
+            kUnknown_SkColorType, kUnknown_SkColorType,
+            kUnknown_SkColorType, kUnknown_SkColorType
+        };
+        for (int yuvIndex = 0; yuvIndex < SkYUVAIndex::kIndexCount; ++yuvIndex) {
+            int texIdx = yuvaIndices[yuvIndex].fIndex;
+            if (texIdx < 0) {
+                SkASSERT(SkYUVAIndex::kA_Index == yuvIndex);
+                continue;
+            }
+            if (kUnknown_SkColorType == colorTypes[texIdx]) {
+                colorTypes[texIdx] = kAlpha_8_SkColorType;
+            } else {
+                colorTypes[texIdx] = kRGBA_8888_SkColorType;
+            }
+        }
+
         for (int i = 0; i < SkYUVSizeInfo::kMaxCount; ++i) {
-            if (kUnknown_SkColorType == yuvaSizeInfo.fColorTypes[i]) {
-                SkASSERT(!yuvaSizeInfo.fSizes[i].fWidth &&
-                         !yuvaSizeInfo.fSizes[i].fHeight &&
-                         !yuvaSizeInfo.fWidthBytes[i]);
+            if (yuvaSizeInfo.fSizes[i].isEmpty()) {
+                SkASSERT(!yuvaSizeInfo.fWidthBytes[i] && kUnknown_SkColorType == colorTypes[i]);
                 continue;
             }
 
             SkImageInfo planeII = SkImageInfo::Make(yuvaSizeInfo.fSizes[i].fWidth,
                                                     yuvaSizeInfo.fSizes[i].fHeight,
-                                                    yuvaSizeInfo.fColorTypes[i],
+                                                    colorTypes[i],
                                                     kUnpremul_SkAlphaType);
             newImageInfo.addYUVPlane(i, planeII, planes[i], yuvaSizeInfo.fWidthBytes[i]);
         }