#include "wx/dcclient.h"
#include "wx/dcmemory.h"
+#include "wx/image.h"
#include <math.h>
+#include "gdk/gdk.h"
+#include "gtk/gtk.h"
+
//-----------------------------------------------------------------------------
// local data
//-----------------------------------------------------------------------------
IMPLEMENT_DYNAMIC_CLASS(wxWindowDC,wxDC)
-wxWindowDC::wxWindowDC(void)
+wxWindowDC::wxWindowDC()
{
m_penGC = (GdkGC *) NULL;
m_brushGC = (GdkGC *) NULL;
SetUpDC();
- wxRegion update = window->GetUpdateRegion();
- if (update.Empty()) return;
-
- gdk_gc_set_clip_region( m_penGC, update.GetRegion() );
- gdk_gc_set_clip_region( m_brushGC, update.GetRegion() );
- gdk_gc_set_clip_region( m_textGC, update.GetRegion() );
- gdk_gc_set_clip_region( m_bgGC, update.GetRegion() );
}
-wxWindowDC::~wxWindowDC(void)
+wxWindowDC::~wxWindowDC()
{
Destroy();
}
-void wxWindowDC::FloodFill( long WXUNUSED(x1), long WXUNUSED(y1),
- wxColour *WXUNUSED(col), int WXUNUSED(style) )
+void wxWindowDC::FloodFill( long WXUNUSED(x), long WXUNUSED(y),
+ const wxColour &WXUNUSED(col), int WXUNUSED(style) )
{
wxFAIL_MSG( "wxWindowDC::FloodFill not implemented" );
}
void wxWindowDC::DrawLine( long x1, long y1, long x2, long y2 )
{
- if (!Ok()) return;
+ wxCHECK_RET( Ok(), "invalid window dc" );
if (m_pen.GetStyle() != wxTRANSPARENT)
{
gdk_draw_line( m_window, m_penGC,
XLOG2DEV(x1), YLOG2DEV(y1), XLOG2DEV(x2), YLOG2DEV(y2) );
+
+ CalcBoundingBox(x1, y1);
+ CalcBoundingBox(x2, y2);
}
-
- CalcBoundingBox(x1, y1);
- CalcBoundingBox(x2, y2);
}
void wxWindowDC::CrossHair( long x, long y )
{
- if (!Ok()) return;
+ wxCHECK_RET( Ok(), "invalid window dc" );
if (m_pen.GetStyle() != wxTRANSPARENT)
{
void wxWindowDC::DrawArc( long x1, long y1, long x2, long y2, double xc, double yc )
{
- if (!Ok()) return;
+ wxCHECK_RET( Ok(), "invalid window dc" );
long xx1 = XLOG2DEV(x1);
long yy1 = YLOG2DEV(y1);
void wxWindowDC::DrawEllipticArc( long x, long y, long width, long height, double sa, double ea )
{
- if (!Ok()) return;
+ wxCHECK_RET( Ok(), "invalid window dc" );
long xx = XLOG2DEV(x);
long yy = YLOG2DEV(y);
void wxWindowDC::DrawPoint( long x, long y )
{
- if (!Ok()) return;
+ wxCHECK_RET( Ok(), "invalid window dc" );
if (m_pen.GetStyle() != wxTRANSPARENT)
gdk_draw_point( m_window, m_penGC, XLOG2DEV(x), YLOG2DEV(y) );
void wxWindowDC::DrawLines( int n, wxPoint points[], long xoffset, long yoffset )
{
- if (!Ok()) return;
+ wxCHECK_RET( Ok(), "invalid window dc" );
if (m_pen.GetStyle() == wxTRANSPARENT) return;
if (n <= 0) return;
void wxWindowDC::DrawLines( wxList *points, long xoffset, long yoffset )
{
- if (!Ok()) return;
+ wxCHECK_RET( Ok(), "invalid window dc" );
if (m_pen.GetStyle() == wxTRANSPARENT) return;
void wxWindowDC::DrawPolygon( int n, wxPoint points[], long xoffset, long yoffset, int WXUNUSED(fillStyle) )
{
- if (!Ok()) return;
+ wxCHECK_RET( Ok(), "invalid window dc" );
- if (!n) return;
+ if (n <= 0) return;
GdkPoint *gdkpoints = new GdkPoint[n+1];
int i;
void wxWindowDC::DrawPolygon( wxList *lines, long xoffset, long yoffset, int WXUNUSED(fillStyle))
{
- if (!Ok()) return;
+ wxCHECK_RET( Ok(), "invalid window dc" );
int n = lines->Number();
- if (!n) return;
+ if (n <= 0) return;
GdkPoint *gdkpoints = new GdkPoint[n];
wxNode *node = lines->First();
void wxWindowDC::DrawRectangle( long x, long y, long width, long height )
{
- if (!Ok()) return;
+ wxCHECK_RET( Ok(), "invalid window dc" );
long xx = XLOG2DEV(x);
long yy = YLOG2DEV(y);
void wxWindowDC::DrawRoundedRectangle( long x, long y, long width, long height, double radius )
{
- if (!Ok()) return;
+ wxCHECK_RET( Ok(), "invalid window dc" );
if (radius < 0.0) radius = - radius * ((width < height) ? width : height);
void wxWindowDC::DrawEllipse( long x, long y, long width, long height )
{
- if (!Ok()) return;
+ wxCHECK_RET( Ok(), "invalid window dc" );
long xx = XLOG2DEV(x);
long yy = YLOG2DEV(y);
if (m_pen.GetStyle() != wxTRANSPARENT)
gdk_draw_arc( m_window, m_penGC, FALSE, xx, yy, ww, hh, 0, 360*64 );
- CalcBoundingBox( x, y );
+ CalcBoundingBox( x - width, y - height );
CalcBoundingBox( x + width, y + height );
}
-bool wxWindowDC::CanDrawBitmap(void) const
+bool wxWindowDC::CanDrawBitmap() const
{
- return TRUE;
+ return TRUE;
+}
+
+void wxWindowDC::DrawIcon( const wxIcon &icon, long x, long y )
+{
+ DrawBitmap( icon, x, y, TRUE );
}
-void wxWindowDC::DrawIcon( const wxIcon &icon, long x, long y, bool useMask )
+void wxWindowDC::DrawBitmap( const wxBitmap &bitmap, long x, long y, bool useMask )
{
- if (!Ok()) return;
+ wxCHECK_RET( Ok(), "invalid window dc" );
- if (!icon.Ok()) return;
+ if (!bitmap.Ok()) return;
int xx = XLOG2DEV(x);
int yy = YLOG2DEV(y);
+ int w = bitmap.GetWidth();
+ int h = bitmap.GetHeight();
+
+ int ww = XLOG2DEVREL(w);
+ int hh = YLOG2DEVREL(h);
+
+ wxBitmap use_bitmap;
+
+ if ((w != ww) || (h != hh))
+ {
+ wxImage image( bitmap );
+ image = image.Scale( ww, hh );
+
+ use_bitmap = image.ConvertToBitmap();
+ }
+ else
+ {
+ use_bitmap = bitmap;
+ }
+
GdkBitmap *mask = (GdkBitmap *) NULL;
- if (icon.GetMask()) mask = icon.GetMask()->GetBitmap();
+ if (use_bitmap.GetMask()) mask = use_bitmap.GetMask()->GetBitmap();
if (useMask && mask)
{
gdk_gc_set_clip_origin( m_penGC, xx, yy );
}
- GdkPixmap *pm = icon.GetPixmap();
+ GdkPixmap *pm = use_bitmap.GetPixmap();
gdk_draw_pixmap( m_window, m_penGC, pm, 0, 0, xx, yy, -1, -1 );
if (useMask && mask)
}
CalcBoundingBox( x, y );
- int width = icon.GetWidth();
- int height = icon.GetHeight();
- CalcBoundingBox( x + width, y + height );
+ CalcBoundingBox( x + w, y + h );
}
bool wxWindowDC::Blit( long xdest, long ydest, long width, long height,
- wxDC *source, long xsrc, long ysrc, int WXUNUSED(logical_func), bool useMask )
+ wxDC *source, long xsrc, long ysrc, int logical_func, bool useMask )
{
- if (!Ok()) return FALSE;
+ wxCHECK_MSG( Ok(), FALSE, "invalid window dc" );
CalcBoundingBox( xdest, ydest );
CalcBoundingBox( xdest + width, ydest + height );
+ int old_logical_func = m_logicalFunction;
+ SetLogicalFunction( logical_func );
+
wxClientDC *csrc = (wxClientDC*)source;
if (csrc->m_isMemDC)
if (useMask && mask)
{
- gdk_gc_set_clip_mask( m_textGC, mask );
- gdk_gc_set_clip_origin( m_textGC, xx, yy );
+ gdk_gc_set_clip_mask( m_penGC, mask );
+ gdk_gc_set_clip_origin( m_penGC, xx, yy );
}
- gdk_draw_pixmap( m_window, m_textGC, pmap,
+ gdk_draw_pixmap( m_window, m_penGC, pmap,
source->DeviceToLogicalX(xsrc),
source->DeviceToLogicalY(ysrc),
xx,
if (useMask && mask)
{
- gdk_gc_set_clip_mask( m_textGC, (GdkBitmap *) NULL );
- gdk_gc_set_clip_origin( m_textGC, 0, 0 );
+ gdk_gc_set_clip_mask( m_penGC, (GdkBitmap *) NULL );
+ gdk_gc_set_clip_origin( m_penGC, 0, 0 );
}
+ SetLogicalFunction( old_logical_func );
return TRUE;
}
if (useMask && mask)
{
- gdk_gc_set_clip_mask( m_textGC, mask );
- gdk_gc_set_clip_origin( m_textGC, xx, yy );
+ gdk_gc_set_clip_mask( m_penGC, mask );
+ gdk_gc_set_clip_origin( m_penGC, xx, yy );
}
gdk_draw_bitmap( m_window, m_textGC, bmap,
if (useMask && mask)
{
- gdk_gc_set_clip_mask( m_textGC, (GdkBitmap *) NULL );
- gdk_gc_set_clip_origin( m_textGC, 0, 0 );
+ gdk_gc_set_clip_mask( m_penGC, (GdkBitmap *) NULL );
+ gdk_gc_set_clip_origin( m_penGC, 0, 0 );
}
+ SetLogicalFunction( old_logical_func );
return TRUE;
}
}
- gdk_window_copy_area ( m_window, m_textGC,
+ gdk_window_copy_area ( m_window, m_penGC,
XLOG2DEV(xdest), YLOG2DEV(ydest),
csrc->GetWindow(),
source->DeviceToLogicalX(xsrc),
source->DeviceToLogicalXRel(width),
source->DeviceToLogicalYRel(height) );
-/*
- gdk_window_copy_area ( m_window, m_textGC,
- XLOG2DEV(xdest), YLOG2DEV(ydest),
- csrc->GetWindow(),
- xsrc, ysrc,
- width, height );
-*/
-
- return TRUE;
+ SetLogicalFunction( old_logical_func );
+ return TRUE;
}
void wxWindowDC::DrawText( const wxString &text, long x, long y, bool WXUNUSED(use16) )
{
- if (!Ok()) return;
+ wxCHECK_RET( Ok(), "invalid window dc" );
GdkFont *font = m_font.GetInternalFont( m_scaleY );
CalcBoundingBox (x, y);
}
-bool wxWindowDC::CanGetTextExtent(void) const
+bool wxWindowDC::CanGetTextExtent() const
{
return TRUE;
}
long *descent, long *externalLeading,
wxFont *theFont, bool WXUNUSED(use16) )
{
- if (!Ok()) return;
+ wxCHECK_RET( Ok(), "invalid window dc" );
wxFont fontToUse = m_font;
if (theFont) fontToUse = *theFont;
if (externalLeading) (*externalLeading) = 0; // ??
}
-long wxWindowDC::GetCharWidth(void)
+long wxWindowDC::GetCharWidth()
{
- if (!Ok()) return 0;
+ 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(void)
+long wxWindowDC::GetCharHeight()
{
- if (!Ok()) return 0;
+ 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(void)
+void wxWindowDC::Clear()
{
- if (!Ok()) return;
+ wxCHECK_RET( Ok(), "invalid window dc" );
if (!m_isMemDC)
{
void wxWindowDC::SetFont( const wxFont &font )
{
- if (!Ok()) return;
+ wxCHECK_RET( Ok(), "invalid window dc" );
m_font = font;
}
void wxWindowDC::SetPen( const wxPen &pen )
{
- if (!Ok()) return;
-
+ wxCHECK_RET( Ok(), "invalid window dc" );
+
if (m_pen == pen) return;
m_pen = pen;
void wxWindowDC::SetBrush( const wxBrush &brush )
{
- if (!Ok()) return;
+ wxCHECK_RET( Ok(), "invalid window dc" );
if (m_brush == brush) return;
}
}
-// CMB 21/7/98: Added SetBackground. Sets background brush
-// for Clear() and bg colour for shapes filled with cross-hatch brush
void wxWindowDC::SetBackground( const wxBrush &brush )
{
- if (!Ok()) return;
+ // 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" );
if (m_backgroundBrush == brush) return;
void wxWindowDC::SetLogicalFunction( int function )
{
+ wxCHECK_RET( Ok(), "invalid window dc" );
+
if (m_logicalFunction == function) return;
+
GdkFunction mode = GDK_COPY;
switch (function)
{
case wxINVERT: mode = GDK_INVERT; break;
default: break;
}
+
m_logicalFunction = function;
gdk_gc_set_function( m_penGC, mode );
gdk_gc_set_function( m_brushGC, mode );
void wxWindowDC::SetTextForeground( const wxColour &col )
{
- if (!Ok()) return;
+ wxCHECK_RET( Ok(), "invalid window dc" );
if (m_textForegroundColour == col) return;
void wxWindowDC::SetTextBackground( const wxColour &col )
{
- if (!Ok()) return;
+ wxCHECK_RET( Ok(), "invalid window dc" );
if (m_textBackgroundColour == col) return;
void wxWindowDC::SetBackgroundMode( int mode )
{
+ wxCHECK_RET( Ok(), "invalid window dc" );
+
m_backgroundMode = mode;
// CMB 21/7/98: fill style of cross-hatch brushes is affected by
// transparent/solid background mode
+
if (m_brush.GetStyle() != wxSOLID && m_brush.GetStyle() != wxTRANSPARENT)
{
gdk_gc_set_fill( m_brushGC,
void wxWindowDC::SetPalette( const wxPalette& WXUNUSED(palette) )
{
+ wxFAIL_MSG( "wxWindowDC::SetPalette not implemented" );
}
void wxWindowDC::SetClippingRegion( long x, long y, long width, long height )
{
+ wxCHECK_RET( Ok(), "invalid window dc" );
+
wxDC::SetClippingRegion( x, y, width, height );
GdkRectangle rect;
gdk_gc_set_clip_rectangle( m_bgGC, &rect );
}
-void wxWindowDC::DestroyClippingRegion(void)
+void wxWindowDC::SetClippingRegion( const wxRegion ®ion )
{
+ wxCHECK_RET( Ok(), "invalid window dc" );
+
+ if (region.Empty())
+ {
+ DestroyClippingRegion();
+ return;
+ }
+
+ gdk_gc_set_clip_region( m_penGC, region.GetRegion() );
+ gdk_gc_set_clip_region( m_brushGC, region.GetRegion() );
+ gdk_gc_set_clip_region( m_textGC, region.GetRegion() );
+ gdk_gc_set_clip_region( m_bgGC, region.GetRegion() );
+}
+
+void wxWindowDC::DestroyClippingRegion()
+{
+ wxCHECK_RET( Ok(), "invalid window dc" );
+
wxDC::DestroyClippingRegion();
gdk_gc_set_clip_rectangle( m_penGC, (GdkRectangle *) NULL );
gdk_gc_set_clip_rectangle( m_bgGC, (GdkRectangle *) NULL );
}
-void wxWindowDC::SetUpDC(void)
+void wxWindowDC::SetUpDC()
{
Destroy();
m_ok = TRUE;
}
}
-void wxWindowDC::Destroy(void)
+void wxWindowDC::Destroy()
{
if (m_penGC) gdk_gc_unref( m_penGC );
m_penGC = (GdkGC*) NULL;
m_bgGC = (GdkGC*) NULL;
}
-GdkWindow *wxWindowDC::GetWindow(void)
+GdkWindow *wxWindowDC::GetWindow()
{
return m_window;
}
void wx_quadratic_spline(double a1, double b1, double a2, double b2,
double a3, double b3, double a4, double b4);
-void wx_clear_stack(void);
+void wx_clear_stack();
int wx_spline_pop(double *x1, double *y1, double *x2, double *y2, double *x3,
double *y3, double *x4, double *y4);
void wx_spline_push(double x1, double y1, double x2, double y2, double x3, double y3,
static Stack *wx_stack_top;
static int wx_stack_count;
-void wx_clear_stack(void)
+void wx_clear_stack()
{
wx_stack_top = wx_spline_stack;
wx_stack_count = 0;
void wxWindowDC::DrawSpline( wxList *points )
{
+ wxCHECK_RET( Ok(), "invalid window dc" );
+
wxPoint *p;
double cx1, cy1, cx2, cy2, cx3, cy3, cx4, cy4;
double x1, y1, x2, y2;
IMPLEMENT_DYNAMIC_CLASS(wxPaintDC,wxWindowDC)
-wxPaintDC::wxPaintDC(void)
+wxPaintDC::wxPaintDC()
: wxWindowDC()
{
}
IMPLEMENT_DYNAMIC_CLASS(wxClientDC,wxWindowDC)
-wxClientDC::wxClientDC(void)
+wxClientDC::wxClientDC()
: wxWindowDC()
{
}