YUV scale fix

There was a scaling mistake visible in some JPEG images because the ratio between Y, U and V planes were assumed to be the same ratios as the ratio between texture sizes, which was wrong because texture have a minimum size of 16 and are rounded up to the next POT. Since the ratios between Y and UV planes are generally 1, 2 or 4, rounding up to the next POT would generally preserve this ratio, so that this bug was not very visible, apart from very small jpeg images of 8 or less pixels in either width or height.

BUG=457954

Committed: https://skia.googlesource.com/skia/+/e6eddf7dd85add7da41f22f2643bdd573ad1f1cf

Review URL: https://codereview.chromium.org/922273002
diff --git a/gm/yuvtorgbeffect.cpp b/gm/yuvtorgbeffect.cpp
index fb0c67d..37af5e6 100644
--- a/gm/yuvtorgbeffect.cpp
+++ b/gm/yuvtorgbeffect.cpp
@@ -19,6 +19,10 @@
 #include "SkGr.h"
 #include "SkGradientShader.h"
 
+#define YSIZE 8
+#define USIZE 4
+#define VSIZE 4
+
 namespace skiagm {
 /**
  * This GM directly exercises GrYUVtoRGBEffect.
@@ -35,14 +39,16 @@
     }
 
     SkISize onISize() SK_OVERRIDE {
-        return SkISize::Make(334, 128);
+        return SkISize::Make(238, 84);
     }
 
     void onOnceBeforeDraw() SK_OVERRIDE {
-        SkImageInfo info = SkImageInfo::MakeA8(24, 24);
-        fBmp[0].allocPixels(info);
-        fBmp[1].allocPixels(info);
-        fBmp[2].allocPixels(info);
+        SkImageInfo yinfo = SkImageInfo::MakeA8(YSIZE, YSIZE);
+        fBmp[0].allocPixels(yinfo);
+        SkImageInfo uinfo = SkImageInfo::MakeA8(USIZE, USIZE);
+        fBmp[1].allocPixels(uinfo);
+        SkImageInfo vinfo = SkImageInfo::MakeA8(VSIZE, VSIZE);
+        fBmp[2].allocPixels(vinfo);
         unsigned char* pixels[3];
         for (int i = 0; i < 3; ++i) {
             pixels[i] = (unsigned char*)fBmp[i].getPixels();
@@ -51,8 +57,9 @@
         const int limit[] = {255, 0, 255};
         const int invl[]  = {0, 255, 0};
         const int inc[]   = {1, -1, 1};
-        for (int j = 0; j < 576; ++j) {
-            for (int i = 0; i < 3; ++i) {
+        for (int i = 0; i < 3; ++i) {
+            const size_t nbBytes = fBmp[i].rowBytes() * fBmp[i].height();
+            for (size_t j = 0; j < nbBytes; ++j) {
                 pixels[i][j] = (unsigned char)color[i];
                 color[i] = (color[i] == limit[i]) ? invl[i] : color[i] + inc[i];
             }
@@ -88,7 +95,8 @@
 
         static const SkScalar kDrawPad = 10.f;
         static const SkScalar kTestPad = 10.f;
-        static const SkScalar kColorSpaceOffset = 64.f;
+        static const SkScalar kColorSpaceOffset = 36.f;
+        SkISize sizes[3] = {{YSIZE, YSIZE}, {USIZE, USIZE}, {VSIZE, VSIZE}};
 
         for (int space = kJPEG_SkYUVColorSpace; space <= kLastEnum_SkYUVColorSpace;
              ++space) {
@@ -105,9 +113,10 @@
             for (int i = 0; i < 6; ++i) {
                 SkAutoTUnref<GrFragmentProcessor> fp(
                             GrYUVtoRGBEffect::Create(texture[indices[i][0]],
-                                                    texture[indices[i][1]],
-                                                    texture[indices[i][2]],
-                                                    static_cast<SkYUVColorSpace>(space)));
+                                                     texture[indices[i][1]],
+                                                     texture[indices[i][2]],
+                                                     sizes,
+                                                     static_cast<SkYUVColorSpace>(space)));
                 if (fp) {
                     SkMatrix viewMatrix;
                     viewMatrix.setTranslate(x, y);