]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/dcclient.cpp
removed big-ass manual.html file from src dir.
[wxWidgets.git] / src / gtk / dcclient.cpp
index 244ab12552b4c1bc68905141bb450e89aad354e4..7f5e5e5a8dd3b56a65d347afef0880ce55076ef8 100644 (file)
@@ -96,6 +96,7 @@ wxWindowDC::wxWindowDC()
     m_bgGC = (GdkGC *) NULL;
     m_cmap = (GdkColormap *) NULL;
     m_isMemDC = FALSE;
+    m_owner = (wxWindow *)NULL;
 }
 
 wxWindowDC::wxWindowDC( wxWindow *window )
@@ -105,6 +106,7 @@ wxWindowDC::wxWindowDC( wxWindow *window )
     m_textGC = (GdkGC *) NULL;
     m_bgGC = (GdkGC *) NULL;
     m_cmap = (GdkColormap *) NULL;
+    m_owner = (wxWindow *)NULL;
   
     if (!window) return;
     GtkWidget *widget = window->m_wxwindow;
@@ -119,7 +121,15 @@ wxWindowDC::wxWindowDC( wxWindow *window )
     m_isMemDC = FALSE;
         
     SetUpDC();
+
+    /* this must be done after SetUpDC, bacause SetUpDC calls the
+       repective SetBrush, SetPen, SetBackground etc functions
+       to set up the DC. SetBackground call m_owner->SetBackground
+       and this might not be desired as the standard dc background
+       is white whereas a window might assume gray to be the
+       standard (as e.g. wxStatusBar) */
     
+    m_owner = window;
 }
 
 wxWindowDC::~wxWindowDC()
@@ -601,19 +611,37 @@ bool wxWindowDC::Blit( long xdest, long ydest, long width, long height,
         /* we use the "XCopyArea" way to copy a memory dc into
           y different window if the memory dc BOTH
           a) doesn't have any mask or its mask isn't used
-          b) it is clipped.
-          we HAVE TO use the direct way for memory dcs
-          that have mask since the XCopyArea doesn't know
-          about masks and we SHOULD use the direct way if
-          all of the bitmap in the memory dc is copied in
-          which case XCopyArea wouldn't be able able to
-          boost performace by reducing the area to be scaled */
+          b) it is clipped
+          c) is not 1-bit */
     
-       use_bitmap_method = ( (useMask && (memDC->m_selected.GetMask())) ||
-                              ((xsrc == 0) && (ysrc == 0) &&
-                               (width == memDC->m_selected.GetWidth()) &&
-                               (height == memDC->m_selected.GetHeight()) )
-                           );
+        if (useMask && (memDC->m_selected.GetMask()))
+       {
+          /* we HAVE TO use the direct way for memory dcs
+             that have mask since the XCopyArea doesn't know
+             about masks and */
+           use_bitmap_method = TRUE;
+       }
+       else if (memDC->m_selected.GetDepth() == 1)
+       {
+          /* we HAVE TO use the direct way for memory dcs
+             that are bitmaps because XCopyArea doesn't copy
+             with different bit depths */
+           use_bitmap_method = TRUE;
+       }
+       else if ((xsrc == 0) && (ysrc == 0) &&
+                (width == memDC->m_selected.GetWidth()) &&
+                (height == memDC->m_selected.GetHeight()))
+       {
+          /* we SHOULD use the direct way if all of the bitmap 
+             in the memory dc is copied in which case XCopyArea 
+             wouldn't be able able to boost performace by reducing 
+             the area to be scaled */
+           use_bitmap_method = TRUE;
+       }
+       else
+       {
+           use_bitmap_method = FALSE;
+       }
     }
     
     CalcBoundingBox( xdest, ydest );
@@ -638,6 +666,8 @@ bool wxWindowDC::Blit( long xdest, long ydest, long width, long height,
     
         if ((bm_width != bm_ww) || (bm_height != bm_hh))
         {
+           printf( "scaling.\n" );
+       
             wxImage image( memDC->m_selected );
            image = image.Scale( bm_ww, bm_hh );
        
@@ -672,14 +702,16 @@ bool wxWindowDC::Blit( long xdest, long ydest, long width, long height,
         GdkPixmap *pm = use_bitmap.GetPixmap();
         if (pm)
         {
-            gdk_draw_pixmap( m_window, m_penGC, pm, 0, 0, xx, yy, ww, hh );
+            gdk_draw_pixmap( m_window, m_penGC, pm, xsrc, ysrc, xx, yy, ww, hh );
         }
         else
         {
             GdkBitmap *bm = use_bitmap.GetBitmap();
             if (bm)
             {
-                gdk_draw_bitmap( m_window, m_penGC, bm, 0, 0, xx, yy, ww, hh );
+               /* we use the textGC here because blitting a bitmap is done
+                  using the current text colour */
+                gdk_draw_bitmap( m_window, m_textGC, bm, xsrc, ysrc, xx, yy, ww, hh );
            }
         }
     
@@ -758,7 +790,7 @@ void wxWindowDC::DrawText( const wxString &text, long x, long y, bool WXUNUSED(u
     x = XLOG2DEV(x);
     y = YLOG2DEV(y);
 
-    // CMB 21/5/98: draw text background if mode is wxSOLID
+    /* CMB 21/5/98: draw text background if mode is wxSOLID */
     if (m_backgroundMode == wxSOLID)
     {
         long width = gdk_string_width( font, text );
@@ -769,9 +801,9 @@ void wxWindowDC::DrawText( const wxString &text, long x, long y, bool WXUNUSED(u
     }
     gdk_draw_string( m_window, font, m_textGC, x, y + font->ascent, text );
 
-    // CMB 17/7/98: simple underline: ignores scaling and underlying
-    // X font's XA_UNDERLINE_POSITION and XA_UNDERLINE_THICKNESS
-    // properties (see wxXt implementation)
+    /* CMB 17/7/98: simple underline: ignores scaling and underlying
+       X font's XA_UNDERLINE_POSITION and XA_UNDERLINE_THICKNESS
+       properties (see wxXt implementation) */
     if (m_font.GetUnderlined())
     {
         long width = gdk_string_width( font, text );
@@ -827,15 +859,27 @@ void wxWindowDC::Clear()
 {
     wxCHECK_RET( Ok(), "invalid window dc" );
   
-    if (!m_isMemDC)
+    /* - we either are a memory dc or have a window as the
+       owner. anything else shouldn't happen.
+       - we don't use gdk_window_clear() as we don't set
+       the window's background colour anymore. it is too
+       much pain to keep the DC's and the window's back-
+       ground colour in synch. */
+  
+    if (m_owner)
     {
-        gdk_window_clear( m_window );
+        int width,height;
+        m_owner->GetSize( &width, &height );
+        gdk_draw_rectangle( m_window, m_bgGC, TRUE, 0, 0, width, height );
+       return;
     }
-    else
+
+    if (m_isMemDC)
     {
         int width,height;
         GetSize( &width, &height );
         gdk_draw_rectangle( m_window, m_bgGC, TRUE, 0, 0, width, height );
+       return;
     }
 }
 
@@ -927,9 +971,12 @@ void wxWindowDC::SetBrush( const wxBrush &brush )
   
     gdk_gc_set_fill( m_brushGC, fillStyle );
   
-    if (m_brush.GetStyle() == wxSTIPPLE)
+    if ((m_brush.GetStyle() == wxSTIPPLE) && (m_brush.GetStipple()->Ok()))
     {
-        gdk_gc_set_stipple( m_brushGC, m_brush.GetStipple()->GetPixmap() );
+        if (m_brush.GetStipple()->GetPixmap())
+            gdk_gc_set_stipple( m_brushGC, m_brush.GetStipple()->GetPixmap() );
+       else
+            gdk_gc_set_stipple( m_brushGC, m_brush.GetStipple()->GetBitmap() );
     }
   
     if (IS_HATCH(m_brush.GetStyle()))
@@ -941,8 +988,8 @@ void wxWindowDC::SetBrush( const wxBrush &brush )
 
 void wxWindowDC::SetBackground( const wxBrush &brush )
 {
-   // CMB 21/7/98: Added SetBackground. Sets background brush
-   // for Clear() and bg colour for shapes filled with cross-hatch brush
+   /* CMB 21/7/98: Added SetBackground. Sets background brush
+    * for Clear() and bg colour for shapes filled with cross-hatch brush */
    
     wxCHECK_RET( Ok(), "invalid window dc" );
   
@@ -961,11 +1008,11 @@ void wxWindowDC::SetBackground( const wxBrush &brush )
     GdkFill fillStyle = GDK_SOLID;
     switch (m_backgroundBrush.GetStyle())
     {
-      case wxSOLID:
-      case wxTRANSPARENT:
-        break;
-      default:
-        fillStyle = GDK_STIPPLED;
+        case wxSOLID:
+        case wxTRANSPARENT:
+            break;
+        default:
+            fillStyle = GDK_STIPPLED;
     }
  
     gdk_gc_set_fill( m_bgGC, fillStyle );
@@ -979,7 +1026,7 @@ void wxWindowDC::SetBackground( const wxBrush &brush )
     {
         int num = m_backgroundBrush.GetStyle() - wxBDIAGONAL_HATCH;
         gdk_gc_set_stipple( m_bgGC, hatches[num] );
-     }
+    }
 }
 
 void wxWindowDC::SetLogicalFunction( int function )