File xaralx-0.7r1785-libpng15.patch of Package xaralx
Make XaraLX compile with libpng 1.5.
Author: SÅ‚awomir Nizio <slawomir.nizio at sabayon.org>
diff --git a/wxOil/outptpng.cpp b/wxOil/outptpng.cpp
index 8c5268d..34c4791 100755
--- a/wxOil/outptpng.cpp
+++ b/wxOil/outptpng.cpp
@@ -555,49 +555,54 @@ TRACEUSER( "Jonathan", _T("PNG write: Width = %d Height = %d\n"),Width,Height);
//png_set_compression_window_bits(png_ptr, 15);
//png_set_compression_method(png_ptr, 8);
- info_ptr->valid = 0; // - this describes which optional chunks to write to the
+ // - this describes which optional chunks to write to the
// file. Note that if you are writing a
// PNG_COLOR_TYPE_PALETTE file, the PLTE chunk is not
// optional, but must still be marked for writing. To
// mark chunks for writing, OR valid with the
// appropriate PNG_INFO_<chunk name> define.
// Set the file information here
- info_ptr->width = Width; // - holds the width of the file
- info_ptr->height = Height; // - holds the height of the file
+
+ png_uint_32 _width, _height;
+ int _bit_depth, _color_type, _interlace_type, _unit_type;
+
+ _width = Width;
+ _height = Height;
// resolution of image
- info_ptr->valid |= PNG_INFO_pHYs;
- info_ptr->x_pixels_per_unit = pInfo->biXPelsPerMeter;
- info_ptr->y_pixels_per_unit = pInfo->biYPelsPerMeter;
- info_ptr->phys_unit_type = 1; // meter
-TRACEUSER( "Jonathan", _T("PNG write: X,y dpi = %d %d\n"),info_ptr->x_pixels_per_unit, info_ptr->y_pixels_per_unit);
+ _unit_type = 1; // meter
+
+TRACEUSER( "Jonathan", _T("PNG write: X,y dpi = %d %d\n"), pInfo->biXPelsPerMeter, pInfo->biYPelsPerMeter);
if (InterlaceState)
- info_ptr->interlace_type = 1; // - currently 0 for none, 1 for interlaced
+ _interlace_type = 1; // - currently 0 for none, 1 for interlaced
else
- info_ptr->interlace_type = 0; // - currently 0 for none, 1 for interlaced
+ _interlace_type = 0; // - currently 0 for none, 1 for interlaced
BitsPerPixel = pInfo->biBitCount;
TRACEUSER( "Jonathan", _T("PNG write: Bitdepth = %d\n"),BitsPerPixel);
- info_ptr->palette = NULL;
- info_ptr->num_palette = 0;
+ png_colorp _palette = NULL;
+ int _num_palette = 0;
//info_ptr->trans_values = 0; // - transparent pixel for non-paletted images
- info_ptr->trans = NULL; // - array of transparent entries for paletted images
- info_ptr->num_trans = 0; // - number of transparent entries
+ png_bytep _trans_alpha = 0;
+ int _num_trans = 0;
TRACEUSER( "Jonathan", _T("PNG write: TransColour = %d\n"),TransparentColour);
if ( BitsPerPixel <= 8 )
{
- info_ptr->bit_depth = BitsPerPixel; // - holds the bit depth of one of the image channels
- info_ptr->color_type = PNG_COLOR_TYPE_PALETTE; // - describes the channels and what they mean
+ _bit_depth = BitsPerPixel;
+ _color_type = PNG_COLOR_TYPE_PALETTE; // - describes the channels and what they mean
// see the PNG_COLOR_TYPE_ defines for more information
// set the palette if there is one
- info_ptr->valid |= PNG_INFO_PLTE;
INT32 PaletteEntries = pInfo->biClrUsed;
- info_ptr->palette = (png_color_struct *)CCMalloc(PaletteEntries * sizeof (png_color));
- if (info_ptr->palette == NULL)
+ _palette = (png_color_struct *)CCMalloc(PaletteEntries * sizeof (png_color));
+ if (_palette == NULL)
File->GotError( _R(IDS_OUT_OF_MEMORY) );
- info_ptr->num_palette = PaletteEntries;
- png_color_struct * pPNGPalette = info_ptr->palette;
+ _num_palette = PaletteEntries;
+ png_color_struct * pPNGPalette = _palette;
+
+ png_set_IHDR (png_ptr, info_ptr, _width, _height, _bit_depth, _color_type,
+ _interlace_type, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
+
// ... set palette colors ...
if (pQuadPalette && PaletteEntries > 0)
{
@@ -625,7 +630,15 @@ TRACEUSER( "Jonathan", _T("PNG write: TransColour = %d\n"),TransparentColour);
}
else
File->GotError(_R(IDS_PNG_ERR_WRITE_PALETTE));
-
+
+ png_set_PLTE(png_ptr, info_ptr, _palette, _num_palette);
+ /*
+ * Although documentation says otherwise, I can free palette
+ * memory here since libpng-1.0.9beta7...
+ */
+ CCFree(_palette);
+ _palette = NULL;
+
// Now check to see if transparency is present or not
if (TransparentColour >= 0 && TransparentColour <= PaletteEntries )
{
@@ -634,13 +647,12 @@ TRACEUSER( "Jonathan", _T("PNG write: TransColour = %d\n"),TransparentColour);
// We will only create as many as we require, i.e. up to the transparent colour entry
// rather a full palettes worth
INT32 NumEntries = TransparentColour + 1;
- info_ptr->trans = (png_byte *)CCMalloc(NumEntries * sizeof (png_byte));
- if (info_ptr->trans)
+ _trans_alpha = (png_byte *)CCMalloc(NumEntries * sizeof (png_byte));
+ if (_trans_alpha)
{
// Set the number of transparent entries
- info_ptr->num_trans = NumEntries;
- png_byte * pTransEntry = info_ptr->trans;
- info_ptr->valid |= PNG_INFO_tRNS;
+ _num_trans = NumEntries;
+ png_byte * pTransEntry = _trans_alpha;
for (INT32 i = 0; i < TransparentColour; i++)
{
*pTransEntry = 255; // set it fully opaque
@@ -648,14 +660,23 @@ TRACEUSER( "Jonathan", _T("PNG write: TransColour = %d\n"),TransparentColour);
}
// We should now be at the transparent entry so set it fully transparent
*pTransEntry = 0;
+
+ png_set_tRNS(png_ptr, info_ptr, _trans_alpha, _num_trans, NULL);
+ CCFree(_trans_alpha);
+ _trans_alpha = NULL;
}
+
}
}
else if (BitsPerPixel == 24)
{
// We must be 24 bpp
- info_ptr->bit_depth = BitsPerPixel/3; // - holds the bit depth of one of the image channels
- info_ptr->color_type = PNG_COLOR_TYPE_RGB; // - describes the channels and what they mean
+ _bit_depth = BitsPerPixel/3;
+ _color_type = PNG_COLOR_TYPE_RGB;
+
+ png_set_IHDR (png_ptr, info_ptr, _width, _height, _bit_depth, _color_type,
+ _interlace_type, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
+
// optional significant bit chunk
//info_ptr->valid |= PNG_INFO_sBIT;
// otherwise, if we are dealing with a color image then
@@ -668,8 +689,11 @@ TRACEUSER( "Jonathan", _T("PNG write: TransColour = %d\n"),TransparentColour);
else if (BitsPerPixel == 32)
{
// We must be a 32 bpp
- info_ptr->bit_depth = BitsPerPixel/4; // - holds the bit depth of one of the image channels
- info_ptr->color_type = PNG_COLOR_TYPE_RGB_ALPHA; // - describes the channels and what they mean
+ _bit_depth = BitsPerPixel/4; // - holds the bit depth of one of the image channels
+ _color_type = PNG_COLOR_TYPE_RGB_ALPHA; // - describes the channels and what they mean
+
+ png_set_IHDR (png_ptr, info_ptr, _width, _height, _bit_depth, _color_type,
+ _interlace_type, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
// optional significant bit chunk
//info_ptr->valid |= PNG_INFO_sBIT;
// otherwise, if we are dealing with a color image then
@@ -687,16 +711,17 @@ TRACEUSER( "Jonathan", _T("PNG write: TransColour = %d\n"),TransparentColour);
else
ERROR2(FALSE,"OutputPNG::OutputPNGHeader Unknown bit depth");
-TRACEUSER( "Jonathan", _T("PNG write: bit_depth = %d color_type = %d\n"),info_ptr->bit_depth,info_ptr->color_type);
+TRACEUSER( "Jonathan", _T("PNG write: bit_depth = %d color_type = %d\n"),_bit_depth,_color_type);
+ png_set_pHYs(png_ptr, info_ptr, pInfo->biXPelsPerMeter, pInfo->biYPelsPerMeter, _unit_type);
// Could use:-
// if we are dealing with a grayscale image then
//info_ptr->sig_bit.gray = true_bit_depth;
// gamma - the gamma the file is written at
- info_ptr->hist = NULL; // - histogram of palette
- info_ptr->text = NULL; // - text comments in the file.
- info_ptr->num_text = 0; // - number of comments
+ //info_ptr->hist = NULL; // - histogram of palette
+ //info_ptr->text = NULL; // - text comments in the file.
+ //info_ptr->num_text = 0; // - number of comments
// optional gamma chunk is strongly suggested if you have any guess
// as to the correct gamma of the image
@@ -708,8 +733,10 @@ TRACEUSER( "Jonathan", _T("PNG write: bit_depth = %d color_type = %d\n"),info_pt
// write the file information
png_write_info(png_ptr, info_ptr);
-TRACEUSER( "Jonathan", _T("PNG write: pixel_depth %d channels %d\n"),png_ptr->pixel_depth, png_ptr->channels);
-TRACEUSER( "Jonathan", _T("PNG write: rowbytes %d color_type %d\n"),png_ptr->rowbytes, png_ptr->color_type);
+ int _channels = png_get_channels (png_ptr, info_ptr);
+ int _pixel_depth = _channels * _bit_depth;
+TRACEUSER( "Jonathan", _T("PNG write: pixel_depth %d channels %d\n"),_pixel_depth, _channels);
+TRACEUSER( "Jonathan", _T("PNG write: rowbytes %d color_type %d\n"),png_get_rowbytes(png_ptr,info_ptr), _color_type);
// Set up the transformations you want.
// Note: that these are all optional. Only call them if you want them
@@ -775,21 +802,6 @@ BOOL OutputPNG::CleanUpPngStructures()
// If our structures are present then clean them out
if (png_ptr)
{
- if (info_ptr)
- {
- // They do not seem to have catered for the palette and transparency structures
- if (info_ptr->palette)
- {
- CCFree(info_ptr->palette);
- info_ptr->palette = NULL;
- }
- if (info_ptr->trans)
- {
- CCFree(info_ptr->trans);
- info_ptr->trans = NULL;
- }
- }
-
// clean up after the write, and free any memory allocated
png_destroy_write_struct(&png_ptr, &info_ptr);
png_ptr = NULL;
diff --git a/wxOil/pngutil.cpp b/wxOil/pngutil.cpp
index 080aba5..e851a8e 100644
--- a/wxOil/pngutil.cpp
+++ b/wxOil/pngutil.cpp
@@ -477,7 +477,7 @@ BOOL PNGUtil::ReadFromFile( CCLexFile *File, LPBITMAPINFO *Info, LPBYTE *Bits,
)
{
// Palette is at info_ptr->palette
- INT32 PaletteSize = 1 << info_ptr->bit_depth;
+ INT32 PaletteSize = 1 << png_get_bit_depth(png_ptr, info_ptr);
// Read in palette into the palette of the DIB
LPRGBQUAD lpPalette = (*Info)->bmiColors;
TRACEUSER( "Jonathan", _T("PNG read: allocate palette and copy size %d\n"),PaletteSize);
@@ -497,7 +497,7 @@ BOOL PNGUtil::ReadFromFile( CCLexFile *File, LPBITMAPINFO *Info, LPBYTE *Bits,
{
// We have a greyscale image and so generate a greyscale palette
// Palette is at info_ptr->palette
- INT32 PaletteSize = 1 << info_ptr->bit_depth;
+ INT32 PaletteSize = 1 << png_get_bit_depth(png_ptr, info_ptr);
TRACEUSER( "Jonathan", _T("PNG read: Greyscale, so set up a greyscale palette for the DIB size %d\n"),PaletteSize);
// Read in palette into the palette of the DIB
LPRGBQUAD lpPalette = (*Info)->bmiColors;