changeset 21767:f00204dae6ee stable

Round quantized pixel values before writing uintN images (bug #47746) * __magick_read__.cc (encode_uint_image): Round quantized pixel values to prevent round-off error when GraphicsMagick quantum depth is greater than 8.
author Mike Miller <mtmiller@octave.org>
date Mon, 23 May 2016 10:44:52 -0700
parents 212783dc8c9a
children 7190a26977cb 7496bd7265d9
files libinterp/corefcn/__magick_read__.cc
diffstat 1 files changed, 19 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/corefcn/__magick_read__.cc	Fri May 20 11:53:15 2016 -0700
+++ b/libinterp/corefcn/__magick_read__.cc	Mon May 23 10:44:52 2016 -0700
@@ -1109,7 +1109,7 @@
               {
                 for (octave_idx_type row = 0; row < nRows; row++)
                   {
-                    const double grey = double (*img_fvec) / divisor;
+                    const double grey = xround (double (*img_fvec) / divisor);
                     Magick::Color c (grey, grey, grey);
                     pix[GM_idx] = c;
                     img_fvec++;
@@ -1139,9 +1139,9 @@
               {
                 for (octave_idx_type row = 0; row < nRows; row++)
                   {
-                    double grey = double (*img_fvec) / divisor;
+                    double grey = xround (double (*img_fvec) / divisor);
                     Magick::Color c (grey, grey, grey,
-                                     MaxRGB - (double (*a_fvec) / divisor));
+                                     MaxRGB - xround (double (*a_fvec) / divisor));
                     pix[GM_idx] = c;
                     img_fvec++;
                     a_fvec++;
@@ -1174,9 +1174,9 @@
               {
                 for (octave_idx_type row = 0; row < nRows; row++)
                   {
-                    Magick::Color c (double (*img_fvec)          / divisor,
-                                     double (img_fvec[G_offset]) / divisor,
-                                     double (img_fvec[B_offset]) / divisor);
+                    Magick::Color c (xround (double (*img_fvec)          / divisor),
+                                     xround (double (img_fvec[G_offset]) / divisor),
+                                     xround (double (img_fvec[B_offset]) / divisor));
                     pix[GM_idx] = c;
                     img_fvec++;
                     GM_idx += nCols;
@@ -1209,10 +1209,10 @@
               {
                 for (octave_idx_type row = 0; row < nRows; row++)
                   {
-                    Magick::Color c (double (*img_fvec)          / divisor,
-                                     double (img_fvec[G_offset]) / divisor,
-                                     double (img_fvec[B_offset]) / divisor,
-                                     MaxRGB - (double (*a_fvec) / divisor));
+                    Magick::Color c (xround (double (*img_fvec)          / divisor),
+                                     xround (double (img_fvec[G_offset]) / divisor),
+                                     xround (double (img_fvec[B_offset]) / divisor),
+                                     MaxRGB - xround (double (*a_fvec) / divisor));
                     pix[GM_idx] = c;
                     img_fvec++;
                     a_fvec++;
@@ -1247,10 +1247,10 @@
               {
                 for (octave_idx_type row = 0; row < nRows; row++)
                   {
-                    Magick::Color c (double (*img_fvec)          / divisor,
-                                     double (img_fvec[M_offset]) / divisor,
-                                     double (img_fvec[Y_offset]) / divisor,
-                                     double (img_fvec[K_offset]) / divisor);
+                    Magick::Color c (xround (double (*img_fvec)          / divisor),
+                                     xround (double (img_fvec[M_offset]) / divisor),
+                                     xround (double (img_fvec[Y_offset]) / divisor),
+                                     xround (double (img_fvec[K_offset]) / divisor));
                     pix[GM_idx] = c;
                     img_fvec++;
                     GM_idx += nCols;
@@ -1285,12 +1285,12 @@
               {
                 for (octave_idx_type row = 0; row < nRows; row++)
                   {
-                    Magick::Color c (double (*img_fvec)          / divisor,
-                                     double (img_fvec[M_offset]) / divisor,
-                                     double (img_fvec[Y_offset]) / divisor,
-                                     double (img_fvec[K_offset]) / divisor);
+                    Magick::Color c (xround (double (*img_fvec)          / divisor),
+                                     xround (double (img_fvec[M_offset]) / divisor),
+                                     xround (double (img_fvec[Y_offset]) / divisor),
+                                     xround (double (img_fvec[K_offset]) / divisor));
                     pix[GM_idx] = c;
-                    ind[GM_idx] = MaxRGB - (double (*a_fvec) / divisor);
+                    ind[GM_idx] = MaxRGB - xround (double (*a_fvec) / divisor);
                     img_fvec++;
                     a_fvec++;
                     GM_idx += nCols;