X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c2cb80c865778f940f254544a42dbb4bb2e9cae0..a8d2fb31cbf09dcc4683c9566ff4bc89580f268c:/src/gtk1/dcclient.cpp diff --git a/src/gtk1/dcclient.cpp b/src/gtk1/dcclient.cpp index d77ba5460c..bf324de310 100644 --- a/src/gtk1/dcclient.cpp +++ b/src/gtk1/dcclient.cpp @@ -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; @@ -1744,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 @@ -1761,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 @@ -1801,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 ); @@ -1816,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 ); @@ -1883,11 +1884,14 @@ void wxWindowDC::SetFont( const wxFont &font ) PangoContext *oldContext = m_context; // We might want to use the X11 context for faster - // rendering on screen + // rendering on screen. + // MR: Lets not want to do this, as this introduces libpangox dependancy. +#if 0 if (m_font.GetNoAntiAliasing()) m_context = m_owner->GtkGetPangoX11Context(); else - m_context = m_owner->GtkGetPangoDefaultContext(); +#endif + m_context = m_owner->GtkGetPangoDefaultContext(); // If we switch back/forth between different contexts // we also have to create a new layout. I think so, @@ -2003,7 +2007,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]; @@ -2020,7 +2023,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()) @@ -2164,7 +2166,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; @@ -2181,7 +2182,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; @@ -2366,22 +2366,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 @@ -2392,9 +2389,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 }