]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/gdicmn.cpp
fixed 3 infinite loops -- the person who tested this code must have had a lot of...
[wxWidgets.git] / src / common / gdicmn.cpp
index 2c62bcefdad4c750685e71b1cc3285fad4896aff..09222b21d40f89b02efd4b7830d2f3f9a57123fd 100644 (file)
 #endif
 #endif
 
+#ifdef __WXX11__
+#include "X11/Xlib.h"
+#endif
+
+#ifdef __WXMAC__
+#include "wx/mac/private.h"
+#include "wx/mac/uma.h"
+#endif
 IMPLEMENT_CLASS(wxColourDatabase, wxList)
 IMPLEMENT_DYNAMIC_CLASS(wxFontList, wxList)
 IMPLEMENT_DYNAMIC_CLASS(wxPenList, wxList)
@@ -113,6 +121,29 @@ wxRect wxRect::operator + (const wxRect& rect) const
     return wxRect(x1, y1, x2-x1, y2-y1);
 }
 
+wxRect& wxRect::Inflate(wxCoord dx, wxCoord dy)
+{
+    x -= dx;
+    y -= dy;
+    width += 2*dx;
+    height += 2*dy;
+
+    // check that we didn't make the rectangle invalid by accident (you almost
+    // never want to have negative coords and never want negative size)
+    if ( x < 0 )
+        x = 0;
+    if ( y < 0 )
+        y = 0;
+
+    // what else can we do?
+    if ( width < 0 )
+        width = 0;
+    if ( height < 0 )
+        height = 0;
+
+    return *this;
+}
+
 bool wxRect::Inside(int cx, int cy) const
 {
     return ( (cx >= x) && (cy >= y)
@@ -121,6 +152,40 @@ bool wxRect::Inside(int cx, int cy) const
           );
 }
 
+wxRect& wxRect::Intersect(const wxRect& rect)
+{
+    int x2 = GetRight(),
+        y2 = GetBottom();
+
+    if ( x < rect.x )
+        x = rect.x;
+    if ( y < rect.y )
+        y = rect.y;
+    if ( x2 > rect.GetRight() )
+        x2 = rect.GetRight();
+    if ( y2 > rect.GetBottom() )
+        y2 = rect.GetBottom();
+
+    width = x2 - x + 1;
+    height = y2 - y + 1;
+
+    if ( width <= 0 || height <= 0 )
+    {
+        width =
+        height = 0;
+    }
+
+    return *this;
+}
+
+bool wxRect::Intersects(const wxRect& rect) const
+{
+    wxRect r = Intersect(rect);
+
+    // if there is no intersection, both width and height are 0
+    return r.width != 0;
+}
+
 wxColourDatabase::wxColourDatabase (int type) : wxList (type)
 {
 }
@@ -283,6 +348,9 @@ wxColour *wxColourDatabase::FindColour(const wxString& colour)
 #ifdef __WXPM__
   return NULL;
 #endif
+#ifdef __WXMGL__
+  return NULL;
+#endif
 
 // TODO for other implementations. This should really go into
 // platform-specific directories.
@@ -296,7 +364,8 @@ wxColour *wxColourDatabase::FindColour(const wxString& colour)
 #ifdef __WXGTK__
   wxColour *col = new wxColour( colour );
 
-  if (!(col->Ok())) {
+  if (!(col->Ok()))
+  {
       delete col;
       return (wxColour *) NULL;
   }
@@ -310,19 +379,22 @@ wxColour *wxColourDatabase::FindColour(const wxString& colour)
 #ifdef __WXMOTIF__
     Display *display = XtDisplay((Widget) wxTheApp->GetTopLevelWidget()) ;
 #endif
-#ifdef __XVIEW__
-    Xv_Screen screen = xv_get(xview_server, SERVER_NTH_SCREEN, 0);
-    Xv_opaque root_window = xv_get(screen, XV_ROOT);
-    Display *display = (Display *)xv_get(root_window, XV_DISPLAY);
+#ifdef __WXX11__
+    Display* display = (Display*) wxGetDisplay();
 #endif
-
     /* MATTHEW: [4] Use wxGetMainColormap */
-    if (!XParseColor(display, (Colormap) wxTheApp->GetMainColormap((WXDisplay*) display), colour,&xcolour))
+    if (!XParseColor(display, (Colormap) wxTheApp->GetMainColormap((WXDisplay*) display), colour.ToAscii() ,&xcolour))
       return NULL;
 
+#if wxUSE_NANOX
+    unsigned char r = (unsigned char)(xcolour.red);
+    unsigned char g = (unsigned char)(xcolour.green);
+    unsigned char b = (unsigned char)(xcolour.blue);
+#else
     unsigned char r = (unsigned char)(xcolour.red >> 8);
     unsigned char g = (unsigned char)(xcolour.green >> 8);
     unsigned char b = (unsigned char)(xcolour.blue >> 8);
+#endif
 
     wxColour *col = new wxColour(r, g, b);
     Append(colour, col);
@@ -358,7 +430,8 @@ wxString wxColourDatabase::FindName (const wxColour& colour) const
     return name;
 }
 
-void wxInitializeStockLists () {
+void wxInitializeStockLists()
+{
   wxTheBrushList = new wxBrushList;
   wxThePenList = new wxPenList;
   wxTheFontList = new wxFontList;
@@ -381,47 +454,74 @@ void wxInitializeStockObjects ()
 #else
 #endif
 */
-#if defined(__WXPM__) || defined(__WXMAC__)
+#if defined(__WXMAC__)
+    int sizeFont = 12;
+
+    Str255 fontName ;
+    SInt16 fontSize ;
+    Style fontStyle ;
+
+       GetThemeFont(kThemeSystemFont , GetApplicationScript() , fontName , &fontSize , &fontStyle ) ;
+       sizeFont = fontSize ;
+    p2cstrcpy( (char*) fontName , fontName ) ;
+    wxSWISS_FONT = new wxFont (fontSize, wxSWISS, wxNORMAL, wxNORMAL , false , fontName );
+#elif defined(__WXPM__)
   static const int sizeFont = 12;
-  wxNORMAL_FONT = new wxFont (sizeFont, wxMODERN, wxNORMAL, wxNORMAL);
 #else
-  wxNORMAL_FONT = new wxFont(wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT));
+  wxNORMAL_FONT = new wxFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT));
   static const int sizeFont = wxNORMAL_FONT->GetPointSize();
 #endif
 
+#if defined(__WXPM__)
+  /*
+  // Basic OS/2 has a fairly limited number of fonts and these are as good
+  // as I can do to get something that looks halfway "wx" normal
+  */
+  wxNORMAL_FONT = new wxFont (sizeFont, wxMODERN, wxNORMAL, wxBOLD);
+  wxSMALL_FONT = new wxFont (sizeFont - 4, wxSWISS, wxNORMAL, wxNORMAL); /* Helv */
+  wxITALIC_FONT = new wxFont (sizeFont, wxROMAN, wxITALIC, wxNORMAL);
+  wxSWISS_FONT = new wxFont (sizeFont, wxSWISS, wxNORMAL, wxNORMAL); /* Helv */
+#elif defined(__WXMAC__)
+    wxNORMAL_FONT = new wxFont (sizeFont, wxMODERN, wxNORMAL, wxNORMAL);
+    wxITALIC_FONT = new wxFont (sizeFont, wxROMAN, wxITALIC, wxNORMAL);
+       GetThemeFont(kThemeSmallSystemFont , GetApplicationScript() , fontName , &fontSize , &fontStyle ) ;
+    p2cstrcpy( (char*) fontName , fontName ) ;
+    wxSMALL_FONT = new wxFont (fontSize, wxSWISS, wxNORMAL, wxNORMAL , false , fontName );
+#else
   wxSMALL_FONT = new wxFont (sizeFont - 2, wxSWISS, wxNORMAL, wxNORMAL);
   wxITALIC_FONT = new wxFont (sizeFont, wxROMAN, wxITALIC, wxNORMAL);
   wxSWISS_FONT = new wxFont (sizeFont, wxSWISS, wxNORMAL, wxNORMAL);
+#endif
 
-  wxRED_PEN = new wxPen ("RED", 1, wxSOLID);
-  wxCYAN_PEN = new wxPen ("CYAN", 1, wxSOLID);
-  wxGREEN_PEN = new wxPen ("GREEN", 1, wxSOLID);
-  wxBLACK_PEN = new wxPen ("BLACK", 1, wxSOLID);
-  wxWHITE_PEN = new wxPen ("WHITE", 1, wxSOLID);
-  wxTRANSPARENT_PEN = new wxPen ("BLACK", 1, wxTRANSPARENT);
-  wxBLACK_DASHED_PEN = new wxPen ("BLACK", 1, wxSHORT_DASH);
-  wxGREY_PEN = new wxPen ("GREY", 1, wxSOLID);
-  wxMEDIUM_GREY_PEN = new wxPen ("MEDIUM GREY", 1, wxSOLID);
-  wxLIGHT_GREY_PEN = new wxPen ("LIGHT GREY", 1, wxSOLID);
-
-  wxBLUE_BRUSH = new wxBrush ("BLUE", wxSOLID);
-  wxGREEN_BRUSH = new wxBrush ("GREEN", wxSOLID);
-  wxWHITE_BRUSH = new wxBrush ("WHITE", wxSOLID);
-  wxBLACK_BRUSH = new wxBrush ("BLACK", wxSOLID);
-  wxTRANSPARENT_BRUSH = new wxBrush ("BLACK", wxTRANSPARENT);
-  wxCYAN_BRUSH = new wxBrush ("CYAN", wxSOLID);
-  wxRED_BRUSH = new wxBrush ("RED", wxSOLID);
-  wxGREY_BRUSH = new wxBrush ("GREY", wxSOLID);
-  wxMEDIUM_GREY_BRUSH = new wxBrush ("MEDIUM GREY", wxSOLID);
-  wxLIGHT_GREY_BRUSH = new wxBrush ("LIGHT GREY", wxSOLID);
-
-  wxBLACK = new wxColour ("BLACK");
-  wxWHITE = new wxColour ("WHITE");
-  wxRED = new wxColour ("RED");
-  wxBLUE = new wxColour ("BLUE");
-  wxGREEN = new wxColour ("GREEN");
-  wxCYAN = new wxColour ("CYAN");
-  wxLIGHT_GREY = new wxColour ("LIGHT GREY");
+  wxRED_PEN = new wxPen (wxT("RED"), 1, wxSOLID);
+  wxCYAN_PEN = new wxPen (wxT("CYAN"), 1, wxSOLID);
+  wxGREEN_PEN = new wxPen (wxT("GREEN"), 1, wxSOLID);
+  wxBLACK_PEN = new wxPen (wxT("BLACK"), 1, wxSOLID);
+  wxWHITE_PEN = new wxPen (wxT("WHITE"), 1, wxSOLID);
+  wxTRANSPARENT_PEN = new wxPen (wxT("BLACK"), 1, wxTRANSPARENT);
+  wxBLACK_DASHED_PEN = new wxPen (wxT("BLACK"), 1, wxSHORT_DASH);
+  wxGREY_PEN = new wxPen (wxT("GREY"), 1, wxSOLID);
+  wxMEDIUM_GREY_PEN = new wxPen (wxT("MEDIUM GREY"), 1, wxSOLID);
+  wxLIGHT_GREY_PEN = new wxPen (wxT("LIGHT GREY"), 1, wxSOLID);
+
+  wxBLUE_BRUSH = new wxBrush (wxT("BLUE"), wxSOLID);
+  wxGREEN_BRUSH = new wxBrush (wxT("GREEN"), wxSOLID);
+  wxWHITE_BRUSH = new wxBrush (wxT("WHITE"), wxSOLID);
+  wxBLACK_BRUSH = new wxBrush (wxT("BLACK"), wxSOLID);
+  wxTRANSPARENT_BRUSH = new wxBrush (wxT("BLACK"), wxTRANSPARENT);
+  wxCYAN_BRUSH = new wxBrush (wxT("CYAN"), wxSOLID);
+  wxRED_BRUSH = new wxBrush (wxT("RED"), wxSOLID);
+  wxGREY_BRUSH = new wxBrush (wxT("GREY"), wxSOLID);
+  wxMEDIUM_GREY_BRUSH = new wxBrush (wxT("MEDIUM GREY"), wxSOLID);
+  wxLIGHT_GREY_BRUSH = new wxBrush (wxT("LIGHT GREY"), wxSOLID);
+
+  wxBLACK = new wxColour (wxT("BLACK"));
+  wxWHITE = new wxColour (wxT("WHITE"));
+  wxRED = new wxColour (wxT("RED"));
+  wxBLUE = new wxColour (wxT("BLUE"));
+  wxGREEN = new wxColour (wxT("GREEN"));
+  wxCYAN = new wxColour (wxT("CYAN"));
+  wxLIGHT_GREY = new wxColour (wxT("LIGHT GREY"));
 
   wxSTANDARD_CURSOR = new wxCursor (wxCURSOR_ARROW);
   wxHOURGLASS_CURSOR = new wxCursor (wxCURSOR_WAIT);
@@ -470,14 +570,19 @@ void wxDeleteStockObjects ()
   wxDELETE(wxCROSS_CURSOR);
 }
 
-void wxDeleteStockLists() {
+void wxDeleteStockLists()
+{
   wxDELETE(wxTheBrushList);
   wxDELETE(wxThePenList);
   wxDELETE(wxTheFontList);
   wxDELETE(wxTheBitmapList);
 }
 
-wxBitmapList::wxBitmapList ()
+// ============================================================================
+// wxTheXXXList stuff (semi-obsolete)
+// ============================================================================
+
+wxBitmapList::wxBitmapList()
 {
 }
 
@@ -542,10 +647,9 @@ wxPen *wxPenList::FindOrCreatePen (const wxColour& colour, int width, int style)
         return NULL;
     }
 
-    // Yes, we can return a pointer to this in a later FindOrCreatePen call,
-    // because we created it within FindOrCreatePen. Safeguards against
-    // returning a pointer to an automatic variable and hanging on to it
-    // (dangling pointer).
+    AddPen(pen);
+
+    // we'll delete it ourselves later
     pen->SetVisible(TRUE);
 
     return pen;
@@ -558,7 +662,7 @@ wxBrushList::~wxBrushList ()
     {
       wxBrush *brush = (wxBrush *) node->Data ();
       wxNode *next = node->Next ();
-      if (brush->GetVisible())
+      if (brush && brush->GetVisible())
         delete brush;
       node = next;
     }
@@ -593,12 +697,11 @@ wxBrush *wxBrushList::FindOrCreateBrush (const wxColour& colour, int style)
         return NULL;
     }
 
+    AddBrush(brush);
+
+    // we'll delete it ourselves later
     brush->SetVisible(TRUE);
 
-    // Yes, we can return a pointer to this in a later FindOrCreateBrush call,
-    // because we created it within FindOrCreateBrush. Safeguards against
-    // returning a pointer to an automatic variable and hanging on to it
-    // (dangling pointer).
     return brush;
 }
 
@@ -699,6 +802,8 @@ wxFont *wxFontList::FindOrCreateFont(int pointSize,
         font = new wxFont(pointSize, family, style, weight,
                           underline, facename, encoding);
 
+        AddFont(font);
+
         // and mark it as being cacheable
         font->SetVisible(TRUE);
     }
@@ -723,6 +828,13 @@ wxSize wxGetDisplaySize()
     return wxSize(x, y);
 }
 
+wxRect wxGetClientDisplayRect()
+{
+    int x, y, width, height;
+    wxClientDisplayRect(&x, &y, &width, &height);  // call plat-specific version
+    return wxRect(x, y, width, height);
+}
+
 wxSize wxGetDisplaySizeMM()
 {
     int x, y;