// Name: src/common/imaggif.cpp
// Purpose: wxGIFHandler
// Author: Vaclav Slavik, Guillermo Rodriguez Garcia, Gershon Elber, Troels K
-// RCS-ID: $Id$
// Copyright: (c) 1999-2011 Vaclav Slavik, Guillermo Rodriguez Garcia, Gershon Elber, Troels K
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
wxUint32 HTable[HT_SIZE];
};
-/*static*/ wxString wxGIFHandler::ms_comment;
-
IMPLEMENT_DYNAMIC_CLASS(wxGIFHandler,wxImageHandler)
//----------------------------------------------------------------------------
static bool wxGIFHandler_WriteByte(wxOutputStream *, wxUint8);
static bool wxGIFHandler_WriteWord(wxOutputStream *, wxUint16);
static bool wxGIFHandler_WriteHeader(wxOutputStream *, int width, int height,
- bool loop, const wxRGB *pal, int palCount,
- const wxString& comment = wxEmptyString);
+ bool loop, const wxRGB *pal, int palCount);
static bool wxGIFHandler_WriteRect(wxOutputStream *, int width, int height);
#if wxUSE_PALETTE
static bool wxGIFHandler_WriteTerm(wxOutputStream *);
return wxGIFHandler_GetPalette(*image, pal, &palCount, &maskIndex)
&& DoSaveFile(*image, &stream, verbose, true /*first?*/, 0,
- false /*loop?*/, pal, palCount, maskIndex, ms_comment)
+ false /*loop?*/, pal, palCount, maskIndex)
&& wxGIFHandler_WriteTerm(&stream);
#else
wxUnusedVar(image);
bool wxGIFHandler::DoSaveFile(const wxImage& image, wxOutputStream *stream,
bool WXUNUSED(verbose), bool first, int delayMilliSecs, bool loop,
- const wxRGB *pal, int palCount, int maskIndex, const wxString& comment)
+ const wxRGB *pal, int palCount, int maskIndex)
{
const unsigned long colorcount = image.CountColours(256+1);
bool ok = colorcount && (colorcount <= 256);
if (first)
{
ok = wxGIFHandler_WriteHeader(stream, width, height, loop,
- pal, palCount, comment);
+ pal, palCount);
}
- ok = ok && wxGIFHandler_WriteControl(stream, maskIndex, delayMilliSecs)
+ ok = ok
+ && wxGIFHandler_WriteComment(stream,
+ image.GetOption(wxIMAGE_OPTION_GIF_COMMENT))
+ && wxGIFHandler_WriteControl(stream, maskIndex, delayMilliSecs)
&& wxGIFHandler_WriteByte(stream, GIF_MARKER_SEP)
&& wxGIFHandler_WriteRect(stream, width, height);
}
bool wxGIFHandler::SaveAnimation(const wxImageArray& images,
- wxOutputStream *stream, bool verbose, int delayMilliSecs,
- const wxString& comment)
+ wxOutputStream *stream, bool verbose, int delayMilliSecs)
{
#if wxUSE_PALETTE
bool ok = true;
ok = wxGIFHandler_GetPalette(image, pal, &palCount, &maskIndex)
&& DoSaveFile(image, stream, verbose, i == 0 /*first?*/, delayMilliSecs,
- true /*loop?*/, pal, palCount, maskIndex,
- comment.length() ? comment : ms_comment);
+ true /*loop?*/, pal, palCount, maskIndex);
}
return ok && wxGIFHandler_WriteTerm(stream);
wxUnusedVar(stream);
wxUnusedVar(verbose);
wxUnusedVar(delayMilliSecs);
- wxUnusedVar(comment);
return false;
#endif
buf[0] = word & 0xff;
buf[1] = (word >> 8) & 0xff;
- return wxGIFHandler_Write(stream, &word, sizeof(word));
+ return wxGIFHandler_Write(stream, &buf, sizeof(buf));
}
bool wxGIFHandler_WriteHeader(wxOutputStream *stream, int width, int height,
- bool loop, const wxRGB *pal, int palCount, const wxString& comment)
+ bool loop, const wxRGB *pal, int palCount)
{
const int bpp = wxGIFHandler_BitSize(palCount);
wxUint8 buf[3];
ok = ok && wxGIFHandler_WriteLoop(stream);
}
- if (comment.length())
- {
- ok = ok && wxGIFHandler_WriteComment(stream, comment);
- }
-
return ok;
}
bool wxGIFHandler_WriteComment(wxOutputStream *stream, const wxString& comment)
{
- wxUint8 buf[3];
- wxCharBuffer text(comment.mb_str());
- size_t len = strlen(text.data());
- len = wxMin(len, 255);
+ if ( comment.empty() )
+ {
+ return true;
+ }
+ // Write comment header.
+ wxUint8 buf[2];
buf[0] = GIF_MARKER_EXT;
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)
- && wxGIFHandler_WriteZero(stream);
+ /*
+ If comment is longer than 255 bytes write it in blocks of maximum 255
+ 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)