# HG changeset patch # User Mike Miller # Date 1464025492 25200 # Node ID f00204dae6ee2cc9e112e68ab1663b1ab5cc0a6e # Parent 212783dc8c9a7c5c666d6fdafb67edccadd5dc92 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. diff -r 212783dc8c9a -r f00204dae6ee libinterp/corefcn/__magick_read__.cc --- 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;