X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/bbbbe360a81bab2ce9bc83aed4719765fd46d297..07fa75bc31fd49da3e4bd4a8bf056a96493bf26b:/src/gtk/dcclient.cpp diff --git a/src/gtk/dcclient.cpp b/src/gtk/dcclient.cpp index 2dec4c304d..3a4c1a9a74 100644 --- a/src/gtk/dcclient.cpp +++ b/src/gtk/dcclient.cpp @@ -140,18 +140,18 @@ wxWindowDC::~wxWindowDC() void wxWindowDC::FloodFill( long WXUNUSED(x), long WXUNUSED(y), const wxColour &WXUNUSED(col), int WXUNUSED(style) ) { - wxFAIL_MSG( "wxWindowDC::FloodFill not implemented" ); + wxFAIL_MSG( _T("wxWindowDC::FloodFill not implemented") ); } bool wxWindowDC::GetPixel( long WXUNUSED(x1), long WXUNUSED(y1), wxColour *WXUNUSED(col) ) const { - wxFAIL_MSG( "wxWindowDC::GetPixel not implemented" ); + wxFAIL_MSG( _T("wxWindowDC::GetPixel not implemented") ); return FALSE; } void wxWindowDC::DrawLine( long x1, long y1, long x2, long y2 ) { - wxCHECK_RET( Ok(), "invalid window dc" ); + wxCHECK_RET( Ok(), _T("invalid window dc") ); if (m_pen.GetStyle() != wxTRANSPARENT) { @@ -165,7 +165,7 @@ void wxWindowDC::DrawLine( long x1, long y1, long x2, long y2 ) void wxWindowDC::CrossHair( long x, long y ) { - wxCHECK_RET( Ok(), "invalid window dc" ); + wxCHECK_RET( Ok(), _T("invalid window dc") ); if (m_pen.GetStyle() != wxTRANSPARENT) { @@ -181,7 +181,7 @@ void wxWindowDC::CrossHair( long x, long y ) void wxWindowDC::DrawArc( long x1, long y1, long x2, long y2, double xc, double yc ) { - wxCHECK_RET( Ok(), "invalid window dc" ); + wxCHECK_RET( Ok(), _T("invalid window dc") ); long xx1 = XLOG2DEV(x1); long yy1 = YLOG2DEV(y1); @@ -231,7 +231,7 @@ void wxWindowDC::DrawArc( long x1, long y1, long x2, long y2, double xc, double void wxWindowDC::DrawEllipticArc( long x, long y, long width, long height, double sa, double ea ) { - wxCHECK_RET( Ok(), "invalid window dc" ); + wxCHECK_RET( Ok(), _T("invalid window dc") ); long xx = XLOG2DEV(x); long yy = YLOG2DEV(y); @@ -256,7 +256,7 @@ void wxWindowDC::DrawEllipticArc( long x, long y, long width, long height, doubl void wxWindowDC::DrawPoint( long x, long y ) { - wxCHECK_RET( Ok(), "invalid window dc" ); + wxCHECK_RET( Ok(), _T("invalid window dc") ); if (m_pen.GetStyle() != wxTRANSPARENT) gdk_draw_point( m_window, m_penGC, XLOG2DEV(x), YLOG2DEV(y) ); @@ -266,7 +266,7 @@ void wxWindowDC::DrawPoint( long x, long y ) void wxWindowDC::DrawLines( int n, wxPoint points[], long xoffset, long yoffset ) { - wxCHECK_RET( Ok(), "invalid window dc" ); + wxCHECK_RET( Ok(), _T("invalid window dc") ); if (m_pen.GetStyle() == wxTRANSPARENT) return; if (n <= 0) return; @@ -287,7 +287,7 @@ void wxWindowDC::DrawLines( int n, wxPoint points[], long xoffset, long yoffset void wxWindowDC::DrawLines( wxList *points, long xoffset, long yoffset ) { - wxCHECK_RET( Ok(), "invalid window dc" ); + wxCHECK_RET( Ok(), _T("invalid window dc") ); if (m_pen.GetStyle() == wxTRANSPARENT) return; @@ -314,7 +314,7 @@ void wxWindowDC::DrawLines( wxList *points, long xoffset, long yoffset ) void wxWindowDC::DrawPolygon( int n, wxPoint points[], long xoffset, long yoffset, int WXUNUSED(fillStyle) ) { - wxCHECK_RET( Ok(), "invalid window dc" ); + wxCHECK_RET( Ok(), _T("invalid window dc") ); if (n <= 0) return; @@ -348,7 +348,7 @@ void wxWindowDC::DrawPolygon( int n, wxPoint points[], long xoffset, long yoffse void wxWindowDC::DrawPolygon( wxList *lines, long xoffset, long yoffset, int WXUNUSED(fillStyle)) { - wxCHECK_RET( Ok(), "invalid window dc" ); + wxCHECK_RET( Ok(), _T("invalid window dc") ); int n = lines->Number(); if (n <= 0) return; @@ -389,7 +389,7 @@ void wxWindowDC::DrawPolygon( wxList *lines, long xoffset, long yoffset, int WXU void wxWindowDC::DrawRectangle( long x, long y, long width, long height ) { - wxCHECK_RET( Ok(), "invalid window dc" ); + wxCHECK_RET( Ok(), _T("invalid window dc") ); long xx = XLOG2DEV(x); long yy = YLOG2DEV(y); @@ -415,7 +415,7 @@ void wxWindowDC::DrawRectangle( long x, long y, long width, long height ) void wxWindowDC::DrawRoundedRectangle( long x, long y, long width, long height, double radius ) { - wxCHECK_RET( Ok(), "invalid window dc" ); + wxCHECK_RET( Ok(), _T("invalid window dc") ); if (radius < 0.0) radius = - radius * ((width < height) ? width : height); @@ -484,7 +484,7 @@ void wxWindowDC::DrawRoundedRectangle( long x, long y, long width, long height, void wxWindowDC::DrawEllipse( long x, long y, long width, long height ) { - wxCHECK_RET( Ok(), "invalid window dc" ); + wxCHECK_RET( Ok(), _T("invalid window dc") ); long xx = XLOG2DEV(x); long yy = YLOG2DEV(y); @@ -517,7 +517,7 @@ void wxWindowDC::DrawIcon( const wxIcon &icon, long x, long y ) void wxWindowDC::DrawBitmap( const wxBitmap &bitmap, long x, long y, bool useMask ) { - wxCHECK_RET( Ok(), "invalid window dc" ); + wxCHECK_RET( Ok(), _T("invalid window dc") ); if (!bitmap.Ok()) return; @@ -595,9 +595,9 @@ bool wxWindowDC::Blit( long xdest, long ydest, long width, long height, of the source dc, but scales correctly on the target dc and knows about possible mask information in a memory dc. */ - wxCHECK_MSG( Ok(), FALSE, "invalid window dc" ); + wxCHECK_MSG( Ok(), FALSE, _T("invalid window dc") ); - wxCHECK_MSG( source, FALSE, "invalid source dc" ); + wxCHECK_MSG( source, FALSE, _T("invalid source dc") ); wxClientDC *srcDC = (wxClientDC*)source; wxMemoryDC *memDC = (wxMemoryDC*)source; @@ -611,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 ); @@ -682,14 +700,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 ); } } @@ -761,7 +781,7 @@ bool wxWindowDC::Blit( long xdest, long ydest, long width, long height, void wxWindowDC::DrawText( const wxString &text, long x, long y, bool WXUNUSED(use16) ) { - wxCHECK_RET( Ok(), "invalid window dc" ); + wxCHECK_RET( Ok(), _T("invalid window dc") ); GdkFont *font = m_font.GetInternalFont( m_scaleY ); @@ -771,20 +791,20 @@ void wxWindowDC::DrawText( const wxString &text, long x, long y, bool WXUNUSED(u /* CMB 21/5/98: draw text background if mode is wxSOLID */ if (m_backgroundMode == wxSOLID) { - long width = gdk_string_width( font, text ); + long width = gdk_string_width( font, text.mbc_str() ); long height = font->ascent + font->descent; gdk_gc_set_foreground( m_textGC, m_textBackgroundColour.GetColor() ); gdk_draw_rectangle( m_window, m_textGC, TRUE, x, y, width, height ); gdk_gc_set_foreground( m_textGC, m_textForegroundColour.GetColor() ); } - gdk_draw_string( m_window, font, m_textGC, x, y + font->ascent, text ); + gdk_draw_string( m_window, font, m_textGC, x, y + font->ascent, text.mbc_str() ); /* 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 ); + long width = gdk_string_width( font, text.mbc_str() ); long ul_y = y + font->ascent; if (font->descent > 0) ul_y++; gdk_draw_line( m_window, m_textGC, x, ul_y, x + width, ul_y); @@ -805,13 +825,13 @@ void wxWindowDC::GetTextExtent( const wxString &string, long *width, long *heigh long *descent, long *externalLeading, wxFont *theFont, bool WXUNUSED(use16) ) { - wxCHECK_RET( Ok(), "invalid window dc" ); + wxCHECK_RET( Ok(), _T("invalid window dc") ); wxFont fontToUse = m_font; if (theFont) fontToUse = *theFont; GdkFont *font = fontToUse.GetInternalFont( m_scaleY ); - if (width) (*width) = long(gdk_string_width( font, string ) / m_scaleX); + if (width) (*width) = long(gdk_string_width( font, string.mbc_str() ) / m_scaleX); if (height) (*height) = long((font->ascent + font->descent) / m_scaleY); if (descent) (*descent) = long(font->descent / m_scaleY); if (externalLeading) (*externalLeading) = 0; // ?? @@ -819,7 +839,7 @@ void wxWindowDC::GetTextExtent( const wxString &string, long *width, long *heigh long wxWindowDC::GetCharWidth() { - wxCHECK_MSG( Ok(), 0, "invalid window dc" ); + wxCHECK_MSG( Ok(), 0, _T("invalid window dc") ); GdkFont *font = m_font.GetInternalFont( m_scaleY ); return long(gdk_string_width( font, "H" ) / m_scaleX); @@ -827,7 +847,7 @@ long wxWindowDC::GetCharWidth() long wxWindowDC::GetCharHeight() { - wxCHECK_MSG( Ok(), 0, "invalid window dc" ); + wxCHECK_MSG( Ok(), 0, _T("invalid window dc") ); GdkFont *font = m_font.GetInternalFont( m_scaleY ); return long((font->ascent + font->descent) / m_scaleY); @@ -835,30 +855,42 @@ long wxWindowDC::GetCharHeight() void wxWindowDC::Clear() { - wxCHECK_RET( Ok(), "invalid window dc" ); + wxCHECK_RET( Ok(), _T("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; } } void wxWindowDC::SetFont( const wxFont &font ) { - wxCHECK_RET( Ok(), "invalid window dc" ); + wxCHECK_RET( Ok(), _T("invalid window dc") ); m_font = font; } void wxWindowDC::SetPen( const wxPen &pen ) { - wxCHECK_RET( Ok(), "invalid window dc" ); + wxCHECK_RET( Ok(), _T("invalid window dc") ); if (m_pen == pen) return; @@ -914,7 +946,7 @@ void wxWindowDC::SetPen( const wxPen &pen ) void wxWindowDC::SetBrush( const wxBrush &brush ) { - wxCHECK_RET( Ok(), "invalid window dc" ); + wxCHECK_RET( Ok(), _T("invalid window dc") ); if (m_brush == brush) return; @@ -937,9 +969,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())) @@ -954,7 +989,7 @@ 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 */ - wxCHECK_RET( Ok(), "invalid window dc" ); + wxCHECK_RET( Ok(), _T("invalid window dc") ); if (m_backgroundBrush == brush) return; @@ -962,11 +997,6 @@ void wxWindowDC::SetBackground( const wxBrush &brush ) if (!m_backgroundBrush.Ok()) return; - if (m_owner) - { - m_owner->SetBackgroundColour( m_backgroundBrush.GetColour() ); - } - m_backgroundBrush.GetColour().CalcPixel( m_cmap ); gdk_gc_set_background( m_brushGC, m_backgroundBrush.GetColour().GetColor() ); gdk_gc_set_background( m_penGC, m_backgroundBrush.GetColour().GetColor() ); @@ -999,7 +1029,7 @@ void wxWindowDC::SetBackground( const wxBrush &brush ) void wxWindowDC::SetLogicalFunction( int function ) { - wxCHECK_RET( Ok(), "invalid window dc" ); + wxCHECK_RET( Ok(), _T("invalid window dc") ); if (m_logicalFunction == function) return; @@ -1019,7 +1049,7 @@ void wxWindowDC::SetLogicalFunction( int function ) void wxWindowDC::SetTextForeground( const wxColour &col ) { - wxCHECK_RET( Ok(), "invalid window dc" ); + wxCHECK_RET( Ok(), _T("invalid window dc") ); if (m_textForegroundColour == col) return; @@ -1032,7 +1062,7 @@ void wxWindowDC::SetTextForeground( const wxColour &col ) void wxWindowDC::SetTextBackground( const wxColour &col ) { - wxCHECK_RET( Ok(), "invalid window dc" ); + wxCHECK_RET( Ok(), _T("invalid window dc") ); if (m_textBackgroundColour == col) return; @@ -1045,7 +1075,7 @@ void wxWindowDC::SetTextBackground( const wxColour &col ) void wxWindowDC::SetBackgroundMode( int mode ) { - wxCHECK_RET( Ok(), "invalid window dc" ); + wxCHECK_RET( Ok(), _T("invalid window dc") ); m_backgroundMode = mode; @@ -1061,12 +1091,12 @@ void wxWindowDC::SetBackgroundMode( int mode ) void wxWindowDC::SetPalette( const wxPalette& WXUNUSED(palette) ) { - wxFAIL_MSG( "wxWindowDC::SetPalette not implemented" ); + wxFAIL_MSG( _T("wxWindowDC::SetPalette not implemented") ); } void wxWindowDC::SetClippingRegion( long x, long y, long width, long height ) { - wxCHECK_RET( Ok(), "invalid window dc" ); + wxCHECK_RET( Ok(), _T("invalid window dc") ); wxDC::SetClippingRegion( x, y, width, height ); @@ -1083,7 +1113,7 @@ void wxWindowDC::SetClippingRegion( long x, long y, long width, long height ) void wxWindowDC::SetClippingRegion( const wxRegion ®ion ) { - wxCHECK_RET( Ok(), "invalid window dc" ); + wxCHECK_RET( Ok(), _T("invalid window dc") ); if (region.Empty()) { @@ -1099,7 +1129,7 @@ void wxWindowDC::SetClippingRegion( const wxRegion ®ion ) void wxWindowDC::DestroyClippingRegion() { - wxCHECK_RET( Ok(), "invalid window dc" ); + wxCHECK_RET( Ok(), _T("invalid window dc") ); wxDC::DestroyClippingRegion(); @@ -1288,7 +1318,7 @@ static void wx_spline_draw_point_array(wxDC *dc) void wxWindowDC::DrawSpline( wxList *points ) { - wxCHECK_RET( Ok(), "invalid window dc" ); + wxCHECK_RET( Ok(), _T("invalid window dc") ); wxPoint *p; double cx1, cy1, cx2, cy2, cx3, cy3, cx4, cy4; @@ -1338,6 +1368,11 @@ void wxWindowDC::DrawSpline( wxList *points ) wx_spline_draw_point_array( this ); } +// Resolution in pixels per logical inch +wxSize wxWindowDC::GetPPI(void) const +{ + return wxSize(100, 100); +} //----------------------------------------------------------------------------- // wxPaintDC