X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f234c60c4aac2e077b16b8fbb3009ad45a84c73b..c127177f8dc31dbe99764852b8dbcc047d3ad826:/src/gtk/dcclient.cpp diff --git a/src/gtk/dcclient.cpp b/src/gtk/dcclient.cpp index f03ce148a9..918e0a52db 100644 --- a/src/gtk/dcclient.cpp +++ b/src/gtk/dcclient.cpp @@ -109,10 +109,23 @@ wxWindowDC::wxWindowDC( wxWindow *window ) m_owner = (wxWindow *)NULL; if (!window) return; + GtkWidget *widget = window->m_wxwindow; if (!widget) return; + m_window = widget->window; + + /* not realized ? */ + if (!m_window) + { + /* force realization */ + gtk_widget_realize( widget ); + m_window = widget->window; + } + + /* still not realized ? */ if (!m_window) return; + if (window->m_wxwindow) m_cmap = gtk_widget_get_colormap( window->m_wxwindow ); else @@ -140,18 +153,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 +178,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 +194,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 +244,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 +269,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 +279,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 +300,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 +327,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 +361,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 +402,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 +428,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 +497,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 +530,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 +608,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; @@ -666,8 +679,6 @@ 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 ); @@ -783,7 +794,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 ); @@ -793,20 +804,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); @@ -827,13 +838,11 @@ 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" ); - 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; // ?? @@ -841,23 +850,19 @@ void wxWindowDC::GetTextExtent( const wxString &string, long *width, long *heigh long wxWindowDC::GetCharWidth() { - wxCHECK_MSG( Ok(), 0, "invalid window dc" ); - GdkFont *font = m_font.GetInternalFont( m_scaleY ); return long(gdk_string_width( font, "H" ) / m_scaleX); } long wxWindowDC::GetCharHeight() { - wxCHECK_MSG( Ok(), 0, "invalid window dc" ); - GdkFont *font = m_font.GetInternalFont( m_scaleY ); return long((font->ascent + font->descent) / m_scaleY); } void wxWindowDC::Clear() { - wxCHECK_RET( Ok(), "invalid window dc" ); + wxCHECK_RET( Ok(), _T("invalid window dc") ); /* - we either are a memory dc or have a window as the owner. anything else shouldn't happen. @@ -885,14 +890,12 @@ void wxWindowDC::Clear() void wxWindowDC::SetFont( const wxFont &font ) { - wxCHECK_RET( Ok(), "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; @@ -948,7 +951,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; @@ -971,9 +974,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())) @@ -988,7 +994,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; @@ -1028,15 +1034,28 @@ 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; GdkFunction mode = GDK_COPY; switch (function) { - case wxXOR: mode = GDK_INVERT; break; - case wxINVERT: mode = GDK_INVERT; break; + case wxXOR: mode = GDK_INVERT; break; + case wxINVERT: mode = GDK_INVERT; break; +#if (GDK_MINOR_VERSION > 0) + case wxOR_REVERSE: mode = GDK_OR_REVERSE; break; + case wxAND_REVERSE: mode = GDK_AND_REVERSE; break; + case wxCLEAR: mode = GDK_CLEAR; break; + case wxSET: mode = GDK_SET; break; + case wxOR_INVERT: mode = GDK_OR_INVERT; break; + case wxAND: mode = GDK_AND; break; + case wxOR: mode = GDK_OR; break; + case wxEQUIV: mode = GDK_EQUIV; break; + case wxNAND: mode = GDK_NAND; break; + case wxAND_INVERT: mode = GDK_AND_INVERT; break; +/* ? wxSRC_INVERT GDK_AND_REVERSE, GDK_OR_REVERSE, GDK_OR_INVERT */ +#endif default: break; } @@ -1048,7 +1067,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; @@ -1061,7 +1080,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; @@ -1074,7 +1093,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; @@ -1090,12 +1109,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 ); @@ -1112,7 +1131,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()) { @@ -1128,7 +1147,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(); @@ -1317,7 +1336,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; @@ -1367,6 +1386,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