]> git.saurik.com Git - wxWidgets.git/blobdiff - utils/serialize/sergdi.cpp
Added sys/types.h needed for Solaris.
[wxWidgets.git] / utils / serialize / sergdi.cpp
index bedaddf300492f9765443a74c80d2fee541edf9f..f53ef6acc927aefe5880ce4c211e9f32a5a8cd80 100644 (file)
 #include <wx/brush.h>
 #include <wx/serbase.h>
 #include <wx/imaglist.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)
 #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(wxFont, wxGDIObject)
 IMPLEMENT_SERIAL_CLASS(wxPen, wxGDIObject)
 IMPLEMENT_SERIAL_CLASS(wxBrush, wxGDIObject)
@@ -37,16 +43,73 @@ IMPLEMENT_ALIAS_SERIAL_CLASS(wxFontList, wxList)
 IMPLEMENT_ALIAS_SERIAL_CLASS(wxColourDatabase, wxList)
 IMPLEMENT_ALIAS_SERIAL_CLASS(wxBitmapList, wxList)
 
 IMPLEMENT_ALIAS_SERIAL_CLASS(wxColourDatabase, wxList)
 IMPLEMENT_ALIAS_SERIAL_CLASS(wxBitmapList, wxList)
 
+// ----------------------------------------------------------------------------
+
 void WXSERIAL(wxBitmap)::StoreObject(wxObjectOutputStream& s)
 {
   // TODO
 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
 }
 
 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();
+
+#ifdef __WXGTK__
+  bitmap->Resize(w, h);
+#else
+  bitmap->Create(w, h);
+#endif
+  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())
 void WXSERIAL(wxGDIObject)::StoreObject(wxObjectOutputStream& s)
 {
   if (s.FirstStage())
@@ -65,16 +128,58 @@ void WXSERIAL(wxGDIObject)::LoadObject(wxObjectInputStream& s)
   ((wxGDIObject *)Object())->SetVisible( data_s.Read8() );
 }
 
   ((wxGDIObject *)Object())->SetVisible( data_s.Read8() );
 }
 
-void WXSERIAL(wxColour)::StoreObject(wxObjectOutputStream& s)
+// ----------------------------------------------------------------------------
+
+void WXSERIAL(wxRegion)::StoreObject(wxObjectOutputStream& s)
 {
   WXSERIAL(wxGDIObject)::StoreObject(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 (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());
   data_s.Write8(colour->Red());
   data_s.Write8(colour->Green());
   data_s.Write8(colour->Blue());
@@ -82,8 +187,6 @@ void WXSERIAL(wxColour)::StoreObject(wxObjectOutputStream& s)
 
 void WXSERIAL(wxColour)::LoadObject(wxObjectInputStream& s)
 {
 
 void WXSERIAL(wxColour)::LoadObject(wxObjectInputStream& s)
 {
-  WXSERIAL(wxGDIObject)::LoadObject(s);
-  
   wxDataInputStream data_s(s);
   wxColour *colour = (wxColour *)Object();
   int r, g, b;
   wxDataInputStream data_s(s);
   wxColour *colour = (wxColour *)Object();
   int r, g, b;
@@ -95,6 +198,8 @@ void WXSERIAL(wxColour)::LoadObject(wxObjectInputStream& s)
   colour->Set(r, g, b);
 }
 
   colour->Set(r, g, b);
 }
 
+// ----------------------------------------------------------------------------
+
 void WXSERIAL(wxPen)::StoreObject(wxObjectOutputStream& s)
 {
   wxPen *pen = (wxPen *)Object();
 void WXSERIAL(wxPen)::StoreObject(wxObjectOutputStream& s)
 {
   wxPen *pen = (wxPen *)Object();
@@ -129,6 +234,7 @@ void WXSERIAL(wxPen)::LoadObject(wxObjectInputStream& s)
   pen->SetWidth( data_s.Read8() );
 }
 
   pen->SetWidth( data_s.Read8() );
 }
 
+// ----------------------------------------------------------------------------
 void WXSERIAL(wxBrush)::StoreObject(wxObjectOutputStream& s)
 {
   wxBrush *brush = (wxBrush *)Object();
 void WXSERIAL(wxBrush)::StoreObject(wxObjectOutputStream& s)
 {
   wxBrush *brush = (wxBrush *)Object();
@@ -159,6 +265,7 @@ void WXSERIAL(wxBrush)::LoadObject(wxObjectInputStream& s)
     *brush = wxBrush(bmap);
 }
 
     *brush = wxBrush(bmap);
 }
 
+// ----------------------------------------------------------------------------
 void WXSERIAL(wxFont)::StoreObject(wxObjectOutputStream& s)
 {
   wxFont *font = (wxFont *)Object();
 void WXSERIAL(wxFont)::StoreObject(wxObjectOutputStream& s)
 {
   wxFont *font = (wxFont *)Object();
@@ -199,14 +306,18 @@ void WXSERIAL(wxFont)::LoadObject(wxObjectInputStream& s)
   *font = wxFont(psize, face_name, family, style, weight, underlined);
 }
 
   *font = wxFont(psize, face_name, family, style, weight, underlined);
 }
 
+// ----------------------------------------------------------------------------
+
 void WXSERIAL(wxImageList)::StoreObject(wxObjectOutputStream& s)
 {
   wxImageList *list = (wxImageList *)Object();
   int i;
 
   if (s.FirstStage()) {
 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));
     for (i=0;i<list->GetImageCount();i++)
       s.AddChild(list->GetBitmap(i));
+#endif
   }
 
   wxDataOutputStream data_s(s);
   }
 
   wxDataOutputStream data_s(s);