]> granicus.if.org Git - imagemagick/commitdiff
Removed a costly call to GetNumberColors() from the PNG encoder.
authorglennrp <glennrp@git.imagemagick.org>
Tue, 25 Jan 2011 19:56:36 +0000 (19:56 +0000)
committerglennrp <glennrp@git.imagemagick.org>
Tue, 25 Jan 2011 19:56:36 +0000 (19:56 +0000)
ChangeLog
coders/png.c

index c9909697eca822c2f58f33583d96c7b62fdfb807..10e19ce37e0d01972cc1de725dd65c15f7002ba4 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
+2011-01-24  6.6.7-3 Glenn Randers-Pehrson <glennrp@image...>
+  * 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  <quetzlzacatenango@image...>
-  * 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  <quetzlzacatenango@image...>
index 006588321f551786d30cac36115a6c5a151d6bc4..2545e39221fbe5a4d621a4a6fd70f27046840609 100644 (file)
@@ -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++;