fix to previous patch: don't crash when saving in 16bpp
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@32416 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -717,6 +717,9 @@ bool wxPNGHandler::SaveFile( wxImage *image, wxOutputStream& stream, bool verbos
|
|||||||
iElements++;
|
iElements++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ( iBitDepth == 16 )
|
||||||
|
iElements *= 2;
|
||||||
|
|
||||||
png_set_sBIT( png_ptr, info_ptr, &sig_bit );
|
png_set_sBIT( png_ptr, info_ptr, &sig_bit );
|
||||||
png_write_info( png_ptr, info_ptr );
|
png_write_info( png_ptr, info_ptr );
|
||||||
png_set_shift( png_ptr, &sig_bit );
|
png_set_shift( png_ptr, &sig_bit );
|
||||||
@@ -757,36 +760,34 @@ bool wxPNGHandler::SaveFile( wxImage *image, wxOutputStream& stream, bool verbos
|
|||||||
|
|
||||||
case wxPNG_TYPE_COLOUR:
|
case wxPNG_TYPE_COLOUR:
|
||||||
*pData++ = uchRed;
|
*pData++ = uchRed;
|
||||||
if (iBitDepth > 8)
|
if ( iBitDepth == 16 )
|
||||||
*pData++ = 0;
|
*pData++ = 0;
|
||||||
*pData++ = uchGreen;
|
*pData++ = uchGreen;
|
||||||
if (iBitDepth > 8)
|
if ( iBitDepth == 16 )
|
||||||
*pData++ = 0;
|
*pData++ = 0;
|
||||||
*pData++ = uchBlue;
|
*pData++ = uchBlue;
|
||||||
if (iBitDepth > 8)
|
if ( iBitDepth == 16 )
|
||||||
*pData++ = 0;
|
*pData++ = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case wxPNG_TYPE_GREY:
|
case wxPNG_TYPE_GREY:
|
||||||
{
|
{
|
||||||
|
// where do these coefficients come from? maybe we
|
||||||
|
// should have image options for them as well?
|
||||||
unsigned uiColor =
|
unsigned uiColor =
|
||||||
(unsigned) (76.544*(unsigned)uchRed +
|
(unsigned) (76.544*(unsigned)uchRed +
|
||||||
150.272*(unsigned)uchGreen +
|
150.272*(unsigned)uchGreen +
|
||||||
36.864*(unsigned)uchBlue);
|
36.864*(unsigned)uchBlue);
|
||||||
uiColor >>= (16 - iBitDepth);
|
|
||||||
if (iBitDepth > 8)
|
*pData++ = (unsigned char)((uiColor >> 8) & 0xFF);
|
||||||
{
|
if ( iBitDepth == 16 )
|
||||||
*pData++ = (unsigned char)((uiColor >> 8) & 0xFF);
|
|
||||||
*pData++ = (unsigned char)(uiColor & 0xFF);
|
*pData++ = (unsigned char)(uiColor & 0xFF);
|
||||||
} else {
|
|
||||||
*pData++ = (unsigned char)(uiColor & 0xFF);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case wxPNG_TYPE_GREY_RED:
|
case wxPNG_TYPE_GREY_RED:
|
||||||
*pData++ = uchRed;
|
*pData++ = uchRed;
|
||||||
if (iBitDepth > 8)
|
if ( iBitDepth == 16 )
|
||||||
*pData++ = 0;
|
*pData++ = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -806,7 +807,7 @@ bool wxPNGHandler::SaveFile( wxImage *image, wxOutputStream& stream, bool verbos
|
|||||||
}
|
}
|
||||||
|
|
||||||
*pData++ = uchAlpha;
|
*pData++ = uchAlpha;
|
||||||
if (iBitDepth > 8)
|
if ( iBitDepth == 16 )
|
||||||
*pData++ = 0;
|
*pData++ = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user