From: glennrp Date: Tue, 25 Jan 2011 19:56:36 +0000 (+0000) Subject: Removed a costly call to GetNumberColors() from the PNG encoder. X-Git-Tag: 7.0.1-0~8265 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0fd86dc7362aa7f35dd4b3a68d3bac5214a2a322;p=imagemagick Removed a costly call to GetNumberColors() from the PNG encoder. --- diff --git a/ChangeLog b/ChangeLog index c9909697e..10e19ce37 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ +2011-01-24 6.6.7-3 Glenn Randers-Pehrson + * Removed a call to GetNumberColors() from the PNG encoder that was + only there for debugging purposes and was consuming a huge amount + of CPU time. + 2011-01-24 6.6.7-3 Cristy - * Remove memory leack from ThrowFileException() macro (reference + * Remove memory leak from ThrowFileException() macro (reference http://www.imagemagick.org/discourse-server/viewtopic.php?f=3&t=17908). 2011-01-22 6.6.7-2 Cristy diff --git a/coders/png.c b/coders/png.c index 006588321..2545e3922 100644 --- a/coders/png.c +++ b/coders/png.c @@ -7042,9 +7042,6 @@ static MagickBooleanType WriteOnePNGImage(MngInfo *mng_info, (void) LogMagickEvent(CoderEvent,GetMagickModule(), " Enter BUILD_PALETTE:"); - image->colors=GetNumberColors(image,(FILE *) NULL,&image->exception); - image_colors=(int) image->colors; - if (logging != MagickFalse) { (void) LogMagickEvent(CoderEvent,GetMagickModule(), @@ -7063,9 +7060,20 @@ static MagickBooleanType WriteOnePNGImage(MngInfo *mng_info, (void) LogMagickEvent(CoderEvent,GetMagickModule(), " i (red,green,blue,opacity)"); - for (i=0; i < (ssize_t) image->colors; i++) + for (i=0; i < 256; i++) { - if (i < 300 || i >= image->colors - 10) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " %d (%d,%d,%d,%d)", + (int) i, + (int) image->colormap[i].red, + (int) image->colormap[i].green, + (int) image->colormap[i].blue, + (int) image->colormap[i].opacity); + } + + for (i=image->colors - 10; i < (ssize_t) image->colors; i++) + { + if (i > 255) { (void) LogMagickEvent(CoderEvent,GetMagickModule(), " %d (%d,%d,%d,%d)", @@ -7108,72 +7116,82 @@ static MagickBooleanType WriteOnePNGImage(MngInfo *mng_info, if (q->opacity == OpaqueOpacity) { - if (number_opaque == 0) + if (number_opaque < 259) { - opaque[0]=*q; - opaque[0].opacity=OpaqueOpacity; - number_opaque=1; - } - - for (i=0; i< (ssize_t) number_opaque; i++) - { - if (IsColorEqual(opaque+i, (PixelPacket *) q)) - break; - } - - if (i == (ssize_t) number_opaque && number_opaque < 259) - { - number_opaque++; - opaque[i] = *q; - opaque[i].opacity = OpaqueOpacity; + if (number_opaque == 0) + { + opaque[0]=*q; + opaque[0].opacity=OpaqueOpacity; + number_opaque=1; + } + + for (i=0; i< (ssize_t) number_opaque; i++) + { + if (IsColorEqual(opaque+i, (PixelPacket *) q)) + break; + } + + if (i == (ssize_t) number_opaque && + number_opaque < 259) + { + number_opaque++; + opaque[i] = *q; + opaque[i].opacity = OpaqueOpacity; + } } } else if (q->opacity == TransparentOpacity) { - if (number_transparent == 0) - { - transparent[0]=*q; - ping_trans_color.red=(unsigned short)(q->red); - ping_trans_color.green=(unsigned short) (q->green); - ping_trans_color.blue=(unsigned short) (q->blue); - ping_trans_color.gray=(unsigned short) (q->blue); - number_transparent = 1; - } - - for (i=0; i< (ssize_t) number_transparent; i++) - { - if (IsColorEqual(transparent+i, (PixelPacket *) q)) - break; - } - - if (i == (ssize_t) number_transparent && - number_transparent < 259) + if (number_transparent < 259) { - number_transparent++; - transparent[i] = *q; + if (number_transparent == 0) + { + transparent[0]=*q; + ping_trans_color.red=(unsigned short)(q->red); + ping_trans_color.green=(unsigned short) (q->green); + ping_trans_color.blue=(unsigned short) (q->blue); + ping_trans_color.gray=(unsigned short) (q->blue); + number_transparent = 1; + } + + for (i=0; i< (ssize_t) number_transparent; i++) + { + if (IsColorEqual(transparent+i, (PixelPacket *) q)) + break; + } + + if (i == (ssize_t) number_transparent && + number_transparent < 259) + { + number_transparent++; + transparent[i] = *q; + } } } else { - if (number_semitransparent == 0) - { - semitransparent[0]=*q; - number_semitransparent = 1; - } - - for (i=0; i< (ssize_t) number_semitransparent; i++) - { - if (IsColorEqual(semitransparent+i, - (PixelPacket *) q) && - q->opacity == semitransparent[i].opacity) - break; - } - - if (i == (ssize_t) number_semitransparent && - number_semitransparent < 259) + if (number_semitransparent < 259) { - number_semitransparent++; - semitransparent[i] = *q; + if (number_semitransparent == 0) + { + semitransparent[0]=*q; + number_semitransparent = 1; + } + + for (i=0; i< (ssize_t) number_semitransparent; i++) + { + if (IsColorEqual(semitransparent+i, + (PixelPacket *) q) && + q->opacity == semitransparent[i].opacity) + break; + } + + if (i == (ssize_t) number_semitransparent && + number_semitransparent < 259) + { + number_semitransparent++; + semitransparent[i] = *q; + } } } q++;