Added support for writing a long comment to a GIF image.

Instead of limiting a comment to a maximum length of 255 bytes write multiple comment data blocks (each a Pascal string) followed by the block terminator.



git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@66802 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Dimitri Schoolwerth
2011-01-28 08:10:01 +00:00
parent 7279a306bb
commit da60600bc9

View File

@@ -667,12 +667,7 @@ bool wxGIFHandler_WriteHeader(wxOutputStream *stream, int width, int height,
ok = ok && wxGIFHandler_WriteLoop(stream); ok = ok && wxGIFHandler_WriteLoop(stream);
} }
if ( !comment.empty() ) return ok && wxGIFHandler_WriteComment(stream, comment);
{
ok = ok && wxGIFHandler_WriteComment(stream, comment);
}
return ok;
} }
bool wxGIFHandler_WriteRect(wxOutputStream *stream, int width, int height) bool wxGIFHandler_WriteRect(wxOutputStream *stream, int width, int height)
@@ -739,18 +734,44 @@ bool wxGIFHandler_WriteControl(wxOutputStream *stream,
bool wxGIFHandler_WriteComment(wxOutputStream *stream, const wxString& comment) bool wxGIFHandler_WriteComment(wxOutputStream *stream, const wxString& comment)
{ {
wxUint8 buf[3]; if ( comment.empty() )
wxCharBuffer text(comment.mb_str()); {
size_t len = strlen(text.data()); return true;
len = wxMin(len, 255); }
// Write comment header.
wxUint8 buf[2];
buf[0] = GIF_MARKER_EXT; buf[0] = GIF_MARKER_EXT;
buf[1] = GIF_MARKER_EXT_COMMENT; buf[1] = GIF_MARKER_EXT_COMMENT;
buf[2] = (wxUint8)len; if ( !wxGIFHandler_Write(stream, buf, sizeof(buf)) )
{
return false;
}
return wxGIFHandler_Write(stream, buf, sizeof(buf)) /*
&& wxGIFHandler_Write(stream, text.data(), len) If comment is longer than 255 bytes write it in blocks of maximum 255
&& wxGIFHandler_WriteZero(stream); bytes each.
*/
wxCharBuffer text( comment.mb_str() );
size_t pos = 0, fullLength = text.length();
do
{
size_t blockLength = wxMin(fullLength - pos, 255);
if ( !wxGIFHandler_WriteByte(stream, (wxUint8) blockLength)
|| !wxGIFHandler_Write(stream, &text.data()[pos], blockLength) )
{
return false;
}
pos += blockLength;
}while (pos < fullLength);
// Write comment footer.
return wxGIFHandler_WriteZero(stream);
} }
bool wxGIFHandler_WriteLoop(wxOutputStream *stream) bool wxGIFHandler_WriteLoop(wxOutputStream *stream)