+/////////////////////////////////////////////////////////////////////////////
+// Name: sergdi.cpp
+// Purpose: Serialization: GDI classes
+// Author: Guilhem Lavaux
+// Modified by:
+// Created: July 1998
+// RCS-ID: $Id$
+// Copyright: (c) 1998 Guilhem Lavaux
+// Licence: wxWindows license
+/////////////////////////////////////////////////////////////////////////////
+
#ifdef __GNUG__
#pragma implementation "sergdi.h"
#endif
#include <wx/pen.h>
#include <wx/brush.h>
#include <wx/serbase.h>
+#include <wx/imaglist.h>
+#include <wx/region.h>
+#include <wx/colour.h>
+#include <wx/palette.h>
+#include <wx/dcmemory.h>
+#include <wx/log.h>
#include "sergdi.h"
IMPLEMENT_SERIAL_CLASS(wxBitmap, wxObject)
IMPLEMENT_SERIAL_CLASS(wxGDIObject, wxObject)
-IMPLEMENT_SERIAL_CLASS(wxColour, wxGDIObject)
+IMPLEMENT_SERIAL_CLASS(wxRegion, wxGDIObject)
+IMPLEMENT_SERIAL_CLASS(wxColour, wxObject)
IMPLEMENT_SERIAL_CLASS(wxFont, wxGDIObject)
IMPLEMENT_SERIAL_CLASS(wxPen, wxGDIObject)
IMPLEMENT_SERIAL_CLASS(wxBrush, wxGDIObject)
+IMPLEMENT_SERIAL_CLASS(wxImageList, wxObject)
IMPLEMENT_ALIAS_SERIAL_CLASS(wxPenList, wxList)
IMPLEMENT_ALIAS_SERIAL_CLASS(wxBrushList, wxList)
IMPLEMENT_ALIAS_SERIAL_CLASS(wxColourDatabase, wxList)
IMPLEMENT_ALIAS_SERIAL_CLASS(wxBitmapList, wxList)
+// ----------------------------------------------------------------------------
+
void WXSERIAL(wxBitmap)::StoreObject(wxObjectOutputStream& s)
{
// TODO
+ // I implemented a basic image saving (maybe I'll need to improve wxWin API).
+
+ int x, y, w, h;
+ wxDataOutputStream data_s(s);
+ wxBitmap *bitmap = (wxBitmap *)Object();
+ wxColour col;
+ wxMemoryDC dc;
+
+ w = bitmap->GetWidth();
+ h = bitmap->GetHeight();
+
+ if (s.FirstStage()) {
+ s.AddChild(bitmap->GetMask());
+ }
+
+ dc.SelectObject(*bitmap);
+
+ data_s.Write16(w);
+ data_s.Write16(h);
+ for (y=0;y<h;y++)
+ for (x=0;x<w;x++) {
+ dc.GetPixel(x, y, &col);
+ data_s.Write8( col.Red() );
+ data_s.Write8( col.Green() );
+ data_s.Write8( col.Blue() );
+ }
}
void WXSERIAL(wxBitmap)::LoadObject(wxObjectInputStream& s)
{
// TODO
+ // I implemented a basic image loading (maybe I'll need to improve wxWin API).
+ wxDataInputStream data_s(s);
+ wxBitmap *bitmap = (wxBitmap *)Object();
+ wxMemoryDC dc;
+ wxPen pen;
+ int x, y, w, h;
+ int r, g, b;
+
+ w = data_s.Read16();
+ h = data_s.Read16();
+
+ bitmap->SetWidth(w);
+ bitmap->SetHeight(h);
+ dc.SelectObject(*bitmap);
+
+ for (y=0;y<h;y++)
+ for (x=0;x<w;x++) {
+ r = data_s.Read8();
+ g = data_s.Read8();
+ b = data_s.Read8();
+ pen.SetColour(r, g, b);
+ dc.SetPen(pen);
+ dc.DrawPoint(x,y);
+ }
}
+// ----------------------------------------------------------------------------
+
void WXSERIAL(wxGDIObject)::StoreObject(wxObjectOutputStream& s)
{
if (s.FirstStage())
((wxGDIObject *)Object())->SetVisible( data_s.Read8() );
}
-void WXSERIAL(wxColour)::StoreObject(wxObjectOutputStream& s)
+// ----------------------------------------------------------------------------
+
+void WXSERIAL(wxRegion)::StoreObject(wxObjectOutputStream& s)
{
WXSERIAL(wxGDIObject)::StoreObject(s);
+ if (s.FirstStage())
+ return;
+
+ wxDataOutputStream data_s(s);
+ wxRect rect = ((wxRegion *)Object())->GetBox();
+
+ data_s.Write16( rect.GetX() );
+ data_s.Write16( rect.GetY() );
+ data_s.Write16( rect.GetWidth() );
+ data_s.Write16( rect.GetHeight() );
+}
+
+void WXSERIAL(wxRegion)::LoadObject(wxObjectInputStream& s)
+{
+ WXSERIAL(wxGDIObject)::LoadObject(s);
+
+ wxDataInputStream data_s(s);
+ wxRegion *region = (wxRegion *)Object();
+ wxRect rect;
+
+ rect.SetX( data_s.Read16() );
+ rect.SetY( data_s.Read16() );
+ rect.SetWidth( data_s.Read16() );
+ rect.SetHeight( data_s.Read16() );
+
+ *region = wxRegion(rect);
+}
+
+// ----------------------------------------------------------------------------
+
+void WXSERIAL(wxColour)::StoreObject(wxObjectOutputStream& s)
+{
if (s.FirstStage())
return;
wxDataOutputStream data_s(s);
wxColour *colour = (wxColour *)Object();
+ if (!colour->Ok()) {
+ data_s.Write8(0);
+ data_s.Write8(0);
+ data_s.Write8(0);
+ wxLogDebug("wxColour (0x%x) isn't ready.\n", colour);
+ return;
+ }
+
data_s.Write8(colour->Red());
data_s.Write8(colour->Green());
data_s.Write8(colour->Blue());
void WXSERIAL(wxColour)::LoadObject(wxObjectInputStream& s)
{
- WXSERIAL(wxGDIObject)::LoadObject(s);
-
wxDataInputStream data_s(s);
wxColour *colour = (wxColour *)Object();
int r, g, b;
colour->Set(r, g, b);
}
+// ----------------------------------------------------------------------------
+
void WXSERIAL(wxPen)::StoreObject(wxObjectOutputStream& s)
{
wxPen *pen = (wxPen *)Object();
void WXSERIAL(wxPen)::LoadObject(wxObjectInputStream& s)
{
wxPen *pen = (wxPen *)Object();
- wxColour *col = (wxColour *) s.GetChild(0);
-
- s.RemoveChildren(1);
+ wxColour *col = (wxColour *) s.GetChild();
WXSERIAL(wxGDIObject)::LoadObject(s);
pen->SetWidth( data_s.Read8() );
}
+// ----------------------------------------------------------------------------
void WXSERIAL(wxBrush)::StoreObject(wxObjectOutputStream& s)
{
wxBrush *brush = (wxBrush *)Object();
void WXSERIAL(wxBrush)::LoadObject(wxObjectInputStream& s)
{
wxBrush *brush = (wxBrush *)Object();
- wxColour *col = (wxColour *)s.GetChild(0);
- wxBitmap *bmap = (wxBitmap *)s.GetChild(1);
-
- s.RemoveChildren(2);
+ wxColour *col = (wxColour *)s.GetChild();
+ wxBitmap *bmap = (wxBitmap *)s.GetChild();
WXSERIAL(wxGDIObject)::LoadObject(s);
*brush = wxBrush(bmap);
}
+// ----------------------------------------------------------------------------
void WXSERIAL(wxFont)::StoreObject(wxObjectOutputStream& s)
{
wxFont *font = (wxFont *)Object();
*font = wxFont(psize, face_name, family, style, weight, underlined);
}
+
+// ----------------------------------------------------------------------------
+
+void WXSERIAL(wxImageList)::StoreObject(wxObjectOutputStream& s)
+{
+ wxImageList *list = (wxImageList *)Object();
+ int i;
+
+ if (s.FirstStage()) {
+#ifdef __WXGTK__
+ for (i=0;i<list->GetImageCount();i++)
+ s.AddChild(list->GetBitmap(i));
+#endif
+ }
+
+ wxDataOutputStream data_s(s);
+
+ data_s.Write32(list->GetImageCount());
+}
+
+void WXSERIAL(wxImageList)::LoadObject(wxObjectInputStream& s)
+{
+ int i, count;
+ wxImageList *list = (wxImageList *)Object();
+ wxDataInputStream data_s(s);
+
+ count = data_s.Read32();
+ for (i=0;i<count;i++)
+ list->Add(*((wxBitmap *)s.GetChild()));
+}