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:
Vadim Zeitlin
2005-02-27 15:36:21 +00:00
parent 5a566d89be
commit dc683654a1

View File

@@ -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;
} }
} }