From: glennrp Date: Tue, 23 Nov 2010 15:48:26 +0000 (+0000) Subject: revised LosslessReduce() to LosslessReduceOK() to simply return a flag X-Git-Tag: 7.0.1-0~8465 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8640fb5e9b1094f35f8beab436f81661b8a99448;p=imagemagick revised LosslessReduce() to LosslessReduceOK() to simply return a flag --- diff --git a/coders/png.c b/coders/png.c index 8ebcb3677..14a59016f 100644 --- a/coders/png.c +++ b/coders/png.c @@ -481,7 +481,7 @@ static MagickBooleanType #if (MAGICKCORE_QUANTUM_DEPTH >= 16) static MagickBooleanType - LosslessReduceDepth(Image *image) + LosslessReduceDepthOK(Image *image) { MagickBooleanType ok_to_reduce=MagickFalse; @@ -507,18 +507,12 @@ static MagickBooleanType ok_to_reduce= (((((size_t) image->background_color.red >> 8) & 0xff) - == ((size_t) image->background_color.red & 0xff)) && + == ((size_t) image->background_color.red & 0xff)) && ((((size_t) image->background_color.green >> 8) & 0xff) - == ((size_t) image->background_color.green & 0xff)) && + == ((size_t) image->background_color.green & 0xff)) && ((((size_t) image->background_color.blue >> 8) & 0xff) - == ((size_t) image->background_color.blue & 0xff)) && - ((((size_t) image->background_color.opacity >> 8) & 0xff) - == ((size_t) image->background_color.opacity & 0xff))) ? - MagickTrue : MagickFalse; - - if (ok_to_reduce != MagickFalse) - (void) LogMagickEvent(CoderEvent,GetMagickModule(), - " OK to reduce background bit depth to 8"); + == ((size_t) image->background_color.blue & 0xff))) ? MagickTrue : + MagickFalse; if (ok_to_reduce != MagickFalse && image->storage_class == PseudoClass) { @@ -526,23 +520,19 @@ static MagickBooleanType for (indx=0; indx < (ssize_t) image->colors; indx++) { - ok_to_reduce= - (((((size_t) image->colormap[indx].red >> 8) & 0xff) - == ((size_t) image->colormap[indx].red & 0xff)) && + ok_to_reduce=(((((size_t) image->colormap[indx].red >> + 8) & 0xff) + == ((size_t) image->colormap[indx].red & 0xff)) && ((((size_t) image->colormap[indx].green >> 8) & 0xff) - == ((size_t) image->colormap[indx].green & 0xff)) && + == ((size_t) image->colormap[indx].green & 0xff)) && ((((size_t) image->colormap[indx].blue >> 8) & 0xff) - == ((size_t) image->colormap[indx].blue & 0xff)) && + == ((size_t) image->colormap[indx].blue & 0xff)) && ((((size_t) image->colormap[indx].opacity >> 8) & 0xff) - == ((size_t) image->colormap[indx].opacity & 0xff))) ? + == ((size_t) image->colormap[indx].opacity & 0xff))) ? MagickTrue : MagickFalse; - if (ok_to_reduce == MagickFalse) break; } - if (ok_to_reduce != MagickFalse) - (void) LogMagickEvent(CoderEvent,GetMagickModule(), - " OK to reduce colormap bit depth to 8"); } if ((ok_to_reduce != MagickFalse) && @@ -566,40 +556,31 @@ static MagickBooleanType for (x=(ssize_t) image->columns-1; x >= 0; x--) { - ok_to_reduce=( - ((((size_t) p->red >> 8) & 0xff) == - ((size_t) p->red & 0xff)) && + ok_to_reduce=(( + (((size_t) p->red >> 8) & 0xff) == + ((size_t) p->red & 0xff)) && ((((size_t) p->green >> 8) & 0xff) == - ((size_t) p->green & 0xff)) && + ((size_t) p->green & 0xff)) && ((((size_t) p->blue >> 8) & 0xff) == - ((size_t) p->blue & 0xff)) && - ((image->matte == MagickFalse || - (((size_t) p->opacity >> 8) & 0xff) == - ((size_t) p->opacity & 0xff)))) ? MagickTrue : MagickFalse; + ((size_t) p->blue & 0xff)) && + (((!image->matte || + (((size_t) p->opacity >> 8) & 0xff) == + ((size_t) p->opacity & 0xff))))) ? MagickTrue : MagickFalse; if (ok_to_reduce == MagickFalse) break; p++; } - - if (ok_to_reduce == MagickFalse) + if (x >= 0) break; } - - if (ok_to_reduce != MagickFalse) - { - (void) LogMagickEvent(CoderEvent,GetMagickModule(), - " OK to reduce all pixels bit depth to 8"); - } } if (ok_to_reduce != MagickFalse) { - image->depth=8; - (void) LogMagickEvent(CoderEvent,GetMagickModule(), - " Reducing PNG bit depth to 8 without loss of info"); + " OK to reduce PNG bit depth to 8 without loss of info"); } } @@ -703,16 +684,13 @@ static MagickBooleanType ImageIsGray(Image *image) for (i=0; i < (ssize_t) image->colors; i++) if (IsGray(image->colormap+i) == MagickFalse) return(MagickFalse); - return(MagickTrue); } for (y=0; y < (ssize_t) image->rows; y++) { p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); - if (p == (const PixelPacket *) NULL) return(MagickFalse); - for (x=(ssize_t) image->columns-1; x >= 0; x--) { if (IsGray(p) == MagickFalse) @@ -5942,10 +5920,10 @@ static Image *ReadMNGImage(const ImageInfo *image_info,ExceptionInfo *exception) } #if (MAGICKCORE_QUANTUM_DEPTH >= 16) - (void) LosslessReduceDepth(image); + if (LosslessReduceDepthOK(image) != MagickFalse) + image->depth = 8; #endif - GetImageException(image,exception); if (image_info->number_scenes != 0) { @@ -7104,10 +7082,17 @@ static MagickBooleanType WriteOnePNGImage(MngInfo *mng_info, ping_have_pHYs=MagickFalse; ping_have_tRNS=MagickFalse; - if (image->colorspace != RGBColorspace) (void) TransformImageColorspace(image,RGBColorspace); +#if (MAGICKCORE_QUANTUM_DEPTH >= 16) + if (mng_info->write_png_colortype != 16) + if (LosslessReduceDepthOK(image) != MagickFalse) + image->depth = 8; +#endif + + image_depth=image->depth; + /* Sometimes we get PseudoClass images whose RGB values don't match the colors in the colormap. This code syncs the RGB values. @@ -7115,18 +7100,13 @@ static MagickBooleanType WriteOnePNGImage(MngInfo *mng_info, if (image->taint && image->storage_class == PseudoClass) (void) SyncImage(image); -#if (MAGICKCORE_QUANTUM_DEPTH >= 16) - (void) LosslessReduceDepth(image); -#endif - quantum_info = (QuantumInfo *) NULL; number_colors=0; image_colors=image->colors; - image_depth=image->depth; image_matte=image->matte; #ifdef PNG_BUILD_PALETTE - + if (((mng_info->write_png_colortype-1) == PNG_COLOR_TYPE_PALETTE) || (mng_info->write_png_colortype == 0 && image->depth <= 8)) { @@ -7236,10 +7216,11 @@ static MagickBooleanType WriteOnePNGImage(MngInfo *mng_info, (void) LogMagickEvent(CoderEvent,GetMagickModule(), " image_matte=%.20g",(double) image->matte); (void) LogMagickEvent(CoderEvent,GetMagickModule(), - " image_depth=%.20g",(double) image->depth); + " image->depth=%.20g",(double) image->depth); (void) LogMagickEvent(CoderEvent,GetMagickModule(), - " requested PNG image_depth=%.20g",(double) image->depth); + " Tentative ping_bit_depth=%.20g",(double) image_depth); } + save_image_depth=image_depth; ping_bit_depth=(png_byte) save_image_depth; @@ -7306,7 +7287,10 @@ static MagickBooleanType WriteOnePNGImage(MngInfo *mng_info, if (logging != MagickFalse) (void) LogMagickEvent(CoderEvent,GetMagickModule(), - " Setting up bKGD chunk"); + " Setting up bKGd chunk"); + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " ping_bit_depth=%d",ping_bit_depth); ping_have_bKGD = MagickTrue; @@ -7493,7 +7477,7 @@ static MagickBooleanType WriteOnePNGImage(MngInfo *mng_info, { if (logging != MagickFalse) (void) LogMagickEvent(CoderEvent,GetMagickModule(), - "Selecting PNG colortype"); + " Selecting PNG colortype"); ping_color_type=(png_byte) ((matte == MagickTrue)? PNG_COLOR_TYPE_RGB_ALPHA:PNG_COLOR_TYPE_RGB); @@ -7530,13 +7514,8 @@ static MagickBooleanType WriteOnePNGImage(MngInfo *mng_info, } if (logging != MagickFalse) - { (void) LogMagickEvent(CoderEvent,GetMagickModule(), - "Selected PNG colortype=%d",ping_color_type); - - (void) LogMagickEvent(CoderEvent,GetMagickModule(), - " image->depth=%d (%d)",(int) image->depth, (int) image_depth); - } + " Selected PNG colortype=%d",ping_color_type); if (ping_bit_depth < 8) { @@ -7559,6 +7538,7 @@ static MagickBooleanType WriteOnePNGImage(MngInfo *mng_info, } } } + if (ping_color_type == PNG_COLOR_TYPE_PALETTE) { size_t one = 1; @@ -7621,6 +7601,9 @@ static MagickBooleanType WriteOnePNGImage(MngInfo *mng_info, (void) LogMagickEvent(CoderEvent,GetMagickModule(), " image_depth: %.20g",(double) image_depth); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " image->depth: %.20g",(double) image->depth); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), " ping_bit_depth: %.20g",(double) ping_bit_depth); } @@ -7665,7 +7648,7 @@ static MagickBooleanType WriteOnePNGImage(MngInfo *mng_info, p++; } - if (x >= 0) + if (x != 0) break; } @@ -7775,6 +7758,7 @@ static MagickBooleanType WriteOnePNGImage(MngInfo *mng_info, } } } + matte=image_matte; if (ping_have_tRNS != MagickFalse) @@ -7846,7 +7830,6 @@ static MagickBooleanType WriteOnePNGImage(MngInfo *mng_info, else if ((intensity & 0x01) != ((intensity & 0x02) >> 1)) depth_1_ok=MagickFalse; } - if (depth_1_ok && mng_info->write_png_depth <= 1) ping_bit_depth=1; @@ -7887,7 +7870,6 @@ static MagickBooleanType WriteOnePNGImage(MngInfo *mng_info, if (CompressColormapTransFirst(image) == MagickFalse) ThrowWriterException(ResourceLimitError, "MemoryAllocationFailed"); - number_colors=image->colors; image_colors=number_colors; @@ -8184,18 +8166,20 @@ static MagickBooleanType WriteOnePNGImage(MngInfo *mng_info, base_filter; if ((quality % 10) > 5) - base_filter=PNG_ALL_FILTERS; + base_filter=PNG_ALL_FILTERS; - else if ((quality % 10) != 5) + else + if ((quality % 10) != 5) base_filter=(int) quality % 10; - else if (((int) ping_color_type == PNG_COLOR_TYPE_GRAY) || + else + if (((int) ping_color_type == PNG_COLOR_TYPE_GRAY) || ((int) ping_color_type == PNG_COLOR_TYPE_PALETTE) || (quality < 50)) - base_filter=PNG_NO_FILTERS; + base_filter=PNG_NO_FILTERS; - else - base_filter=PNG_ALL_FILTERS; + else + base_filter=PNG_ALL_FILTERS; if (logging != MagickFalse) { @@ -8344,7 +8328,7 @@ static MagickBooleanType WriteOnePNGImage(MngInfo *mng_info, "Cannot write image with defined PNG:bit-depth or PNG:color-type."); } - if (image_matte != MagickFalse && image->matte == MagickFalse) + if (image_matte && !image->matte) { /* Add an opaque matte channel */ image->matte = MagickTrue; @@ -8377,7 +8361,7 @@ static MagickBooleanType WriteOnePNGImage(MngInfo *mng_info, if (logging) { - for (i=0; i< number_colors; i++) + for (i=0; i< (ssize_t) number_colors; i++) { if (ping_num_trans != 0) (void) LogMagickEvent(CoderEvent,GetMagickModule(), @@ -8517,7 +8501,6 @@ static MagickBooleanType WriteOnePNGImage(MngInfo *mng_info, (void) LogMagickEvent(CoderEvent,GetMagickModule(), " Allocating %.20g bytes of memory for pixels",(double) rowbytes); } - png_pixels=(unsigned char *) AcquireQuantumMemory(rowbytes, sizeof(*png_pixels)); @@ -8769,10 +8752,15 @@ static MagickBooleanType WriteOnePNGImage(MngInfo *mng_info, (void) ExportQuantumPixels(image,(const CacheView *) NULL, quantum_info,IndexQuantum,png_pixels,&image->exception); - if (logging && y <= 2) - (void) LogMagickEvent(CoderEvent,GetMagickModule(), - " Writing row of pixels (4)"); + if (logging && y <= 2) + { + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Writing row of pixels (4)"); + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " png_pixels[0]=%d,png_pixels[1]=%d", + (int)png_pixels[0],(int)png_pixels[1]); + } png_write_row(ping,png_pixels); } }