X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a4efa72179eeb3a99fa90c7d4bc6762eac0342fb..b9efe021b554fa3967d1442cf758435c5cd5ae8f:/src/common/imagpng.cpp diff --git a/src/common/imagpng.cpp b/src/common/imagpng.cpp index 501f901e6b..007bfadaf0 100644 --- a/src/common/imagpng.cpp +++ b/src/common/imagpng.cpp @@ -717,6 +717,9 @@ bool wxPNGHandler::SaveFile( wxImage *image, wxOutputStream& stream, bool verbos iElements++; } + if ( iBitDepth == 16 ) + iElements *= 2; + png_set_sBIT( png_ptr, info_ptr, &sig_bit ); png_write_info( png_ptr, info_ptr ); png_set_shift( png_ptr, &sig_bit ); @@ -735,9 +738,15 @@ bool wxPNGHandler::SaveFile( wxImage *image, wxOutputStream& stream, bool verbos int iHeight = image->GetHeight(); int iWidth = image->GetWidth(); - unsigned char uchMaskRed = bHasMask ? image->GetMaskRed() : 0; - unsigned char uchMaskGreen = bHasMask ? image->GetMaskGreen() : 0; - unsigned char uchMaskBlue = bHasMask ? image->GetMaskBlue() : 0; + unsigned char uchMaskRed = 0, uchMaskGreen = 0, uchMaskBlue = 0; + + if ( bHasMask ) + { + uchMaskRed = image->GetMaskRed(); + uchMaskGreen = image->GetMaskGreen(); + uchMaskBlue = image->GetMaskBlue(); + } + unsigned char *pColors = image->GetData(); for (int y = 0; y != iHeight; ++y) @@ -757,36 +766,34 @@ bool wxPNGHandler::SaveFile( wxImage *image, wxOutputStream& stream, bool verbos case wxPNG_TYPE_COLOUR: *pData++ = uchRed; - if (iBitDepth > 8) + if ( iBitDepth == 16 ) *pData++ = 0; *pData++ = uchGreen; - if (iBitDepth > 8) + if ( iBitDepth == 16 ) *pData++ = 0; *pData++ = uchBlue; - if (iBitDepth > 8) + if ( iBitDepth == 16 ) *pData++ = 0; break; case wxPNG_TYPE_GREY: { + // where do these coefficients come from? maybe we + // should have image options for them as well? unsigned uiColor = (unsigned) (76.544*(unsigned)uchRed + 150.272*(unsigned)uchGreen + 36.864*(unsigned)uchBlue); - uiColor >>= (16 - iBitDepth); - if (iBitDepth > 8) - { - *pData++ = (unsigned char)((uiColor >> 8) & 0xFF); - *pData++ = (unsigned char)(uiColor & 0xFF); - } else { + + *pData++ = (unsigned char)((uiColor >> 8) & 0xFF); + if ( iBitDepth == 16 ) *pData++ = (unsigned char)(uiColor & 0xFF); - } } break; case wxPNG_TYPE_GREY_RED: *pData++ = uchRed; - if (iBitDepth > 8) + if ( iBitDepth == 16 ) *pData++ = 0; break; } @@ -806,7 +813,7 @@ bool wxPNGHandler::SaveFile( wxImage *image, wxOutputStream& stream, bool verbos } *pData++ = uchAlpha; - if (iBitDepth > 8) + if ( iBitDepth == 16 ) *pData++ = 0; } }