More fixes in sycc422_to_rgb and sycc420_to_rgb when image width is odd
authorBo Xu <bo_xu@foxitsoftware.com>
Tue, 21 Oct 2014 19:17:39 +0000 (12:17 -0700)
committerBo Xu <bo_xu@foxitsoftware.com>
Tue, 21 Oct 2014 19:17:39 +0000 (12:17 -0700)
This patch is supplementary to issue 418881

R=tsepez@chromium.org

Review URL: https://codereview.chromium.org/645793007

core/src/fxcodec/codec/fx_codec_jpx_opj.cpp

index 1180bfc..8dcecf9 100644 (file)
@@ -166,13 +166,19 @@ static void sycc422_to_rgb(opj_image_t *img)
     d0 = r = FX_Alloc(int, (size_t)max);
     d1 = g = FX_Alloc(int, (size_t)max);
     d2 = b = FX_Alloc(int, (size_t)max);
-    for(i = 0; i < maxh; ++i) {
-        for (j = 0; j < maxw; ++j, ++y, ++r, ++g, ++b) {
-            sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
-            if (j % 2){
-                ++cb;
-                ++cr;
-            }
+    for(i = 0; i < maxh; ++i)
+    {
+        for (j = 0; (OPJ_UINT32)j < (maxw & ~(OPJ_UINT32)1); j += 2)\r
+        {\r
+            sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);\r
+            ++y; ++r; ++g; ++b;\r
+            sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);\r
+            ++y; ++r; ++g; ++b; ++cb; ++cr;\r
+        }\r
+        if (j < maxw)\r
+        {\r
+            sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);\r
+            ++y; ++r; ++g; ++b; ++cb; ++cr;\r
         }
     }
     FX_Free(img->comps[0].data);
@@ -212,40 +218,47 @@ static void sycc420_to_rgb(opj_image_t *img)
     d0 = r = FX_Alloc(int, (size_t)max);
     d1 = g = FX_Alloc(int, (size_t)max);
     d2 = b = FX_Alloc(int, (size_t)max);
-    for(i = 0; i < maxh; i += 2) {
-        ny = y + maxw;
-        nr = r + maxw;
-        ng = g + maxw;
-        nb = b + maxw;
-        for(j = 0; j < maxw;  j += 2) {
-            sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
-            ++y;
-            ++r;
-            ++g;
-            ++b;
-            sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
-            ++y;
-            ++r;
-            ++g;
-            ++b;
-            sycc_to_rgb(offset, upb, *ny, *cb, *cr, nr, ng, nb);
-            ++ny;
-            ++nr;
-            ++ng;
-            ++nb;
-            sycc_to_rgb(offset, upb, *ny, *cb, *cr, nr, ng, nb);
-            ++ny;
-            ++nr;
-            ++ng;
-            ++nb;
-            ++cb;
-            ++cr;
-        }
-        y += maxw;
-        r += maxw;
-        g += maxw;
-        b += maxw;
-    }
+    for (i = 0; (OPJ_UINT32)i < (maxh & ~(OPJ_UINT32)1); i += 2)\r
+    {\r
+        ny = y + maxw;\r
+        nr = r + maxw;\r
+        ng = g + maxw;\r
+        nb = b + maxw;\r
+        for (j = 0; (OPJ_UINT32)j < (maxw & ~(OPJ_UINT32)1); j += 2)\r
+        {\r
+            sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);\r
+            ++y; ++r; ++g; ++b;\r
+            sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);\r
+            ++y; ++r; ++g; ++b;\r
+            sycc_to_rgb(offset, upb, *ny, *cb, *cr, nr, ng, nb);\r
+            ++ny; ++nr; ++ng; ++nb;\r
+            sycc_to_rgb(offset, upb, *ny, *cb, *cr, nr, ng, nb);\r
+            ++ny; ++nr; ++ng; ++nb; ++cb; ++cr;\r
+        }\r
+        if (j < maxw)\r
+        {\r
+            sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);\r
+            ++y; ++r; ++g; ++b;\r
+            sycc_to_rgb(offset, upb, *ny, *cb, *cr, nr, ng, nb);\r
+            ++ny; ++nr; ++ng; ++nb; ++cb; ++cr;\r
+        }\r
+        y += maxw; r += maxw; g += maxw; b += maxw;\r
+    }\r
+    if (i < maxh)\r
+    {\r
+        for (j = 0; (OPJ_UINT32)j < (maxw & ~(OPJ_UINT32)1); j += 2)\r
+        {\r
+            sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);\r
+            ++y; ++r; ++g; ++b;\r
+            sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);\r
+            ++y; ++r; ++g; ++b; ++cb; ++cr;\r
+        }\r
+        if (j < maxw)\r
+        {\r
+            sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);\r
+        }\r
+    }\r
+
     FX_Free(img->comps[0].data);
     img->comps[0].data = d0;
     FX_Free(img->comps[1].data);