///////////////////////////////////////////////////////////////////////////// // 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include "sergdi.h" IMPLEMENT_SERIAL_CLASS(wxBitmap, wxObject) IMPLEMENT_SERIAL_CLASS(wxGDIObject, wxObject) 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(wxFontList, 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;ySetWidth(w); bitmap->SetHeight(h); dc.SelectObject(*bitmap); for (y=0;yGetVisible(); wxDataOutputStream data_s(s); data_s.Write8(visible); } void WXSERIAL(wxGDIObject)::LoadObject(wxObjectInputStream& s) { wxDataInputStream data_s(s); ((wxGDIObject *)Object())->SetVisible( data_s.Read8() ); } // ---------------------------------------------------------------------------- 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) { wxDataInputStream data_s(s); wxColour *colour = (wxColour *)Object(); int r, g, b; r = data_s.Read8(); g = data_s.Read8(); b = data_s.Read8(); colour->Set(r, g, b); } // ---------------------------------------------------------------------------- void WXSERIAL(wxPen)::StoreObject(wxObjectOutputStream& s) { wxPen *pen = (wxPen *)Object(); WXSERIAL(wxGDIObject)::StoreObject(s); if (s.FirstStage()) { s.AddChild(& (pen->GetColour()) ); return; } wxDataOutputStream data_s(s); data_s.Write8( pen->GetCap() ); data_s.Write8( pen->GetJoin() ); data_s.Write8( pen->GetStyle() ); data_s.Write8( pen->GetWidth() ); } void WXSERIAL(wxPen)::LoadObject(wxObjectInputStream& s) { wxPen *pen = (wxPen *)Object(); wxColour *col = (wxColour *) s.GetChild(); WXSERIAL(wxGDIObject)::LoadObject(s); wxDataInputStream data_s(s); pen->SetColour(*col); pen->SetCap( data_s.Read8() ); pen->SetJoin( data_s.Read8() ); pen->SetStyle( data_s.Read8() ); pen->SetWidth( data_s.Read8() ); } // ---------------------------------------------------------------------------- void WXSERIAL(wxBrush)::StoreObject(wxObjectOutputStream& s) { wxBrush *brush = (wxBrush *)Object(); WXSERIAL(wxGDIObject)::StoreObject(s); if (s.FirstStage()) { s.AddChild( &(brush->GetColour()) ); s.AddChild( brush->GetStipple() ); return; } wxDataOutputStream data_s(s); data_s.Write8( brush->GetStyle() ); } void WXSERIAL(wxBrush)::LoadObject(wxObjectInputStream& s) { wxBrush *brush = (wxBrush *)Object(); wxColour *col = (wxColour *)s.GetChild(); wxBitmap *bmap = (wxBitmap *)s.GetChild(); WXSERIAL(wxGDIObject)::LoadObject(s); wxDataInputStream data_s(s); if (bmap) *brush = wxBrush(*col, data_s.Read8()); else *brush = wxBrush(bmap); } // ---------------------------------------------------------------------------- void WXSERIAL(wxFont)::StoreObject(wxObjectOutputStream& s) { wxFont *font = (wxFont *)Object(); WXSERIAL(wxGDIObject)::StoreObject(s); if (s.FirstStage()) return; wxDataOutputStream data_s(s); data_s.Write8( font->GetPointSize() ); data_s.WriteString( font->GetFaceName() ); data_s.Write8( font->GetFamily() ); data_s.Write8( font->GetStyle() ); data_s.Write8( font->GetWeight() ); data_s.Write8( font->GetUnderlined() ); } void WXSERIAL(wxFont)::LoadObject(wxObjectInputStream& s) { wxFont *font = (wxFont *)Object(); WXSERIAL(wxGDIObject)::LoadObject(s); wxDataInputStream data_s(s); int psize, family, style, weight; bool underlined; wxString face_name; psize = data_s.Read8(); face_name = data_s.ReadString(); family = data_s.Read8(); style = data_s.Read8(); weight = data_s.Read8(); underlined = data_s.Read8(); *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;iGetImageCount();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;iAdd(*((wxBitmap *)s.GetChild())); }