]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk1/dcclient.cpp
Committing in .
[wxWidgets.git] / src / gtk1 / dcclient.cpp
index 7ae955a594b45084acb5ee60ebd700eecb00b222..5dabb7b244441dc3c79e0d2c89f41f8479700ed5 100644 (file)
@@ -7,10 +7,6 @@
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-#pragma implementation "dcclient.h"
-#endif
-
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
@@ -92,9 +88,9 @@ void gdk_wx_draw_bitmap(GdkDrawable  *drawable,
                         gint         width,
                         gint         height)
 {
-    g_return_if_fail (drawable != NULL);
-    g_return_if_fail (src != NULL);
-    g_return_if_fail (gc != NULL);
+    wxCHECK_RET( drawable, _T("NULL drawable in gdk_wx_draw_bitmap") );
+    wxCHECK_RET( src, _T("NULL src in gdk_wx_draw_bitmap") );
+    wxCHECK_RET( gc, _T("NULL gc in gdk_wx_draw_bitmap") );
 
 #ifdef __WXGTK20__
     gint src_width, src_height;
@@ -143,8 +139,6 @@ void gdk_wx_draw_bitmap(GdkDrawable  *drawable,
 // Implement Pool of Graphic contexts. Creating them takes too much time.
 //-----------------------------------------------------------------------------
 
-#define GC_POOL_SIZE 200
-
 enum wxPoolGCType
 {
    wxGC_ERROR = 0,
@@ -544,10 +538,10 @@ void wxWindowDC::DoDrawArc( wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2,
         radius1 = 0.0;
         radius2 = 360.0;
     }
-    else
-    if (radius == 0.0)
+    else if ( wxIsNullDouble(radius) )
     {
-        radius1 = radius2 = 0.0;
+        radius1 =
+        radius2 = 0.0;
     }
     else
     {
@@ -1139,15 +1133,15 @@ void wxWindowDC::DoDrawBitmap( const wxBitmap &bitmap,
     if (is_mono)
     {
 #ifdef __WXGTK20__
-        GdkPixmap *bitmap = gdk_pixmap_new( wxGetRootWindow()->window, ww, hh, -1 );
-        GdkGC *gc = gdk_gc_new( bitmap );
+        GdkPixmap *bitmap2 = gdk_pixmap_new( wxGetRootWindow()->window, ww, hh, -1 );
+        GdkGC *gc = gdk_gc_new( bitmap2 );
         gdk_gc_set_foreground( gc, m_textForegroundColour.GetColor() );
         gdk_gc_set_background( gc, m_textBackgroundColour.GetColor() );
-        gdk_wx_draw_bitmap( bitmap, gc, use_bitmap.GetBitmap(), 0, 0, 0, 0, -1, -1 );
+        gdk_wx_draw_bitmap( bitmap2, gc, use_bitmap.GetBitmap(), 0, 0, 0, 0, -1, -1 );
 
-        gdk_draw_drawable( m_window, m_textGC, bitmap, 0, 0, xx, yy, -1, -1 );
+        gdk_draw_drawable( m_window, m_textGC, bitmap2, 0, 0, xx, yy, -1, -1 );
 
-        gdk_bitmap_unref( bitmap );
+        gdk_bitmap_unref( bitmap2 );
         gdk_gc_unref( gc );
 #else
         gdk_wx_draw_bitmap( m_window, m_textGC, use_bitmap.GetBitmap(), 0, 0, xx, yy, -1, -1 );
@@ -1156,7 +1150,7 @@ void wxWindowDC::DoDrawBitmap( const wxBitmap &bitmap,
     else
     {
 #if GTK_CHECK_VERSION(2,2,0)
-        if (use_bitmap.HasPixbuf())
+        if (!gtk_check_version(2,2,0) && use_bitmap.HasPixbuf())
         {
             gdk_draw_pixbuf(m_window, m_penGC,
                             use_bitmap.GetPixbuf(),
@@ -1219,7 +1213,6 @@ bool wxWindowDC::DoBlit( wxCoord xdest, wxCoord ydest,
     bool use_bitmap_method = false;
     bool is_mono = false;
 
-    // TODO: use the mask origin when drawing transparently
     if (xsrcMask == -1 && ysrcMask == -1)
     {
         xsrcMask = xsrc;
@@ -1349,6 +1342,7 @@ bool wxWindowDC::DoBlit( wxCoord xdest, wxCoord ydest,
                 GdkGC *gc = gdk_gc_new( new_mask );
                 col.pixel = 0;
                 gdk_gc_set_foreground( gc, &col );
+                gdk_gc_set_ts_origin( gc, -xsrcMask, -ysrcMask);
                 gdk_draw_rectangle( new_mask, gc, TRUE, 0, 0, bm_ww, bm_hh );
                 col.pixel = 0;
                 gdk_gc_set_background( gc, &col );
@@ -1366,20 +1360,28 @@ bool wxWindowDC::DoBlit( wxCoord xdest, wxCoord ydest,
             if (is_mono)
             {
                 if (new_mask)
+                {
                     gdk_gc_set_clip_mask( m_textGC, new_mask );
+                    gdk_gc_set_clip_origin( m_textGC, cx, cy );
+                }
                 else
+                {
                     gdk_gc_set_clip_mask( m_textGC, mask );
-                // was: gdk_gc_set_clip_origin( m_textGC, xx, yy );
-                gdk_gc_set_clip_origin( m_textGC, cx, cy );
+                    gdk_gc_set_clip_origin( m_textGC, cx-xsrcMask, cy-ysrcMask );
+                }
             }
             else
             {
                 if (new_mask)
+                {
                     gdk_gc_set_clip_mask( m_penGC, new_mask );
+                    gdk_gc_set_clip_origin( m_penGC, cx, cy );
+                }
                 else
+                {
                     gdk_gc_set_clip_mask( m_penGC, mask );
-                // was: gdk_gc_set_clip_origin( m_penGC, xx, yy );
-                gdk_gc_set_clip_origin( m_penGC, cx, cy );
+                    gdk_gc_set_clip_origin( m_penGC, cx-xsrcMask, cy-ysrcMask );
+                }
             }
         }
 
@@ -1604,7 +1606,7 @@ void wxWindowDC::DoDrawText( const wxString &text, wxCoord x, wxCoord y )
 
 void wxWindowDC::DoDrawRotatedText( const wxString &text, wxCoord x, wxCoord y, double angle )
 {
-    if (angle == 0.0)
+    if ( wxIsNullDouble(angle) )
     {
         DrawText(text, x, y);
         return;
@@ -1672,6 +1674,8 @@ void wxWindowDC::DoDrawRotatedText( const wxString &text, wxCoord x, wxCoord y,
 
     int i_angle = (int) angle;
     i_angle = i_angle % 360;
+    if (i_angle < 0)
+        i_angle += 360;
     int xoffset = 0;
     if ((i_angle >= 90.0) && (i_angle < 270.0))
         xoffset = image.GetWidth();
@@ -1742,11 +1746,8 @@ void wxWindowDC::DoGetTextExtent(const wxString &string,
 #else
     const wxWCharBuffer wdata = wxConvLocal.cMB2WC( string );
     if ( !wdata )
-    {
-        if (width) (*width) = 0;
-        if (height) (*height) = 0;
         return;
-    }
+
     const wxCharBuffer data = wxConvUTF8.cWC2MB( wdata );
     const char *dataUTF8 = (const char *)data;
 #endif
@@ -1759,19 +1760,21 @@ void wxWindowDC::DoGetTextExtent(const wxString &string,
 
     pango_layout_set_text( m_layout, dataUTF8, strlen(dataUTF8) );
 
-    int w,h;
-    pango_layout_get_pixel_size( m_layout, &w, &h );
-
-    if (width)
-        *width = (wxCoord) w;
-    if (height)
-        *height = (wxCoord) h;
     if (descent)
     {
+        int h;
+        pango_layout_get_pixel_size( m_layout, width, &h );
         PangoLayoutIter *iter = pango_layout_get_iter(m_layout);
         int baseline = pango_layout_iter_get_baseline(iter);
         pango_layout_iter_free(iter);
         *descent = h - PANGO_PIXELS(baseline);
+
+        if (height)
+            *height = (wxCoord) h;
+    }
+    else
+    {
+        pango_layout_get_pixel_size( m_layout, width, height );
     }
 
     // Reset old font description
@@ -1799,8 +1802,8 @@ wxCoord wxWindowDC::GetCharWidth() const
 {
 #ifdef __WXGTK20__
     pango_layout_set_text( m_layout, "H", 1 );
-    int w,h;
-    pango_layout_get_pixel_size( m_layout, &w, &h );
+    int w;
+    pango_layout_get_pixel_size( m_layout, &w, NULL );
     return w;
 #else
     GdkFont *font = m_font.GetInternalFont( m_scaleY );
@@ -1814,8 +1817,8 @@ wxCoord wxWindowDC::GetCharHeight() const
 {
 #ifdef __WXGTK20__
     pango_layout_set_text( m_layout, "H", 1 );
-    int w,h;
-    pango_layout_get_pixel_size( m_layout, &w, &h );
+    int h;
+    pango_layout_get_pixel_size( m_layout, NULL, &h );
     return h;
 #else
     GdkFont *font = m_font.GetInternalFont( m_scaleY );
@@ -1880,12 +1883,7 @@ void wxWindowDC::SetFont( const wxFont &font )
         {
             PangoContext *oldContext = m_context;
 
-            // We might want to use the X11 context for faster
-            // rendering on screen
-            if (m_font.GetNoAntiAliasing())
-                m_context = m_owner->GtkGetPangoX11Context();
-            else
-                m_context = m_owner->GtkGetPangoDefaultContext();
+            m_context = m_owner->GtkGetPangoDefaultContext();
 
             // If we switch back/forth between different contexts
             // we also have to create a new layout. I think so,
@@ -2001,7 +1999,6 @@ void wxWindowDC::SetPen( const wxPen &pen )
         }
     }
 
-#if (GTK_MINOR_VERSION > 0) || (GTK_MAJOR_VERSION > 1)
     if (req_dash && req_nb_dash)
     {
         wxGTKDash *real_req_dash = new wxGTKDash[req_nb_dash];
@@ -2018,7 +2015,6 @@ void wxWindowDC::SetPen( const wxPen &pen )
             gdk_gc_set_dashes( m_penGC, 0, (wxGTKDash*)req_dash, req_nb_dash );
         }
     }
-#endif // GTK+ > 1.0
 
     GdkCapStyle capStyle = GDK_CAP_ROUND;
     switch (m_pen.GetCap())
@@ -2162,7 +2158,6 @@ void wxWindowDC::SetLogicalFunction( int function )
     {
         case wxXOR:          mode = GDK_XOR;           break;
         case wxINVERT:       mode = GDK_INVERT;        break;
-#if (GTK_MINOR_VERSION > 0) || (GTK_MAJOR_VERSION > 1)
         case wxOR_REVERSE:   mode = GDK_OR_REVERSE;    break;
         case wxAND_REVERSE:  mode = GDK_AND_REVERSE;   break;
         case wxCLEAR:        mode = GDK_CLEAR;         break;
@@ -2179,7 +2174,6 @@ void wxWindowDC::SetLogicalFunction( int function )
 
         // unsupported by GTK
         case wxNOR:          mode = GDK_COPY;          break;
-#endif // GTK+ > 1.0
         default:
            wxFAIL_MSG( wxT("unsupported logical function") );
            mode = GDK_COPY;
@@ -2364,22 +2358,19 @@ void wxWindowDC::Destroy()
 
 void wxWindowDC::ComputeScaleAndOrigin()
 {
-    /* CMB: copy scale to see if it changes */
-    double origScaleX = m_scaleX;
-    double origScaleY = m_scaleY;
+    const wxRealPoint origScale(m_scaleX, m_scaleY);
 
     wxDC::ComputeScaleAndOrigin();
 
-    /* CMB: if scale has changed call SetPen to recalulate the line width */
-    if ((m_scaleX != origScaleX || m_scaleY != origScaleY) &&
-        (m_pen.Ok()))
+    // if scale has changed call SetPen to recalulate the line width
+    if ( wxRealPoint(m_scaleX, m_scaleY) != origScale && m_pen.Ok() )
     {
-      /* this is a bit artificial, but we need to force wxDC to think
-         the pen has changed */
-      wxPen pen = m_pen;
-      m_pen = wxNullPen;
-      SetPen( pen );
-  }
+        // this is a bit artificial, but we need to force wxDC to think the pen
+        // has changed
+        wxPen pen = m_pen;
+        m_pen = wxNullPen;
+        SetPen( pen );
+    }
 }
 
 // Resolution in pixels per logical inch
@@ -2390,9 +2381,13 @@ wxSize wxWindowDC::GetPPI() const
 
 int wxWindowDC::GetDepth() const
 {
+#ifdef __WXGTK20__
+    return gdk_drawable_get_depth(m_window);
+#else
     wxFAIL_MSG(wxT("not implemented"));
 
     return -1;
+#endif
 }