Suppose that ImageMagic attempts to load a PNG image that has a color
palette and a tRNS chunk, such as
http://www.cultinfo.ru/cultura/2005-09/dekabr.png
It fills the palette, loads the index data, sets image->matte to
MagickFalse, and then processes the tRNS chunk. At this point, it
decides to convert the image to DirectClass, set image->matte to
MagickTrue, and fill the opacity as needed. But it only sets the
opacity of the leftmost column, leaving uninitialized junk elsewhere.
The patch below fixes it.
--- png.c
+++ png.c
@@ -2599,50 +2599,55 @@
for (y=0; y < (long) image->rows; y++)
{
image->storage_class=storage_class;
q=GetImagePixels(image,0,y,image->columns,1);
if (q == (PixelPacket *) NULL)
break;
indexes=GetIndexes(image);
- q->opacity=OpaqueOpacity;
if (storage_class == PseudoClass)
{
IndexPacket
index;
if ((int) ping_info->color_type == PNG_COLOR_TYPE_PALETTE)
for (x=0; x < (long) image->columns; x++)
{
index=indexes[x];
if (index < ping_info->num_trans)
q->opacity=ScaleCharToQuantum((unsigned char)
(255-ping_info->trans[(long) index]));
+ else
+ q->opacity=OpaqueOpacity;
q++;
}
else if (ping_info->color_type == PNG_COLOR_TYPE_GRAY)
for (x=0; x < (long) image->columns; x++)
{
index=indexes[x];
q->red=image->colormap[(long) index].red;
q->green=q->red;
q->blue=q->red;
if (q->red == transparent_color.opacity)
q->opacity=(Quantum) TransparentOpacity;
+ else
+ q->opacity=OpaqueOpacity;
q++;
}
}
else
for (x=(long) image->columns-1; x >= 0; x--)
{
if (ScaleQuantumToChar(q->red) == transparent_color.red &&
ScaleQuantumToChar(q->green) == transparent_color.green &&
ScaleQuantumToChar(q->blue) == transparent_color.blue)
q->opacity=(Quantum) TransparentOpacity;
+ else
+ q->opacity=OpaqueOpacity;
q++;
}
if (SyncImagePixels(image) == MagickFalse)
break;
}
image->storage_class=DirectClass;
}
#if (MAGICKCORE_QUANTUM_DEPTH == 8)
--
Alexander E. Patrakov
_______________________________________________
Magick-developers mailing list
[email protected]
http://studio.imagemagick.org/mailman/listinfo/magick-developers