Make XaraLX compile with libpng 1.5. Author: SÅ‚awomir Nizio 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_ 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;