#include "wx/object.h"
#include "wx/string.h"
#include "wx/palette.h"
-#include "wx/image.h"
//-----------------------------------------------------------------------------
// classes
class wxMask;
class wxBitmap;
+//-----------------------------------------------------------------------------
+// also implemented here from wxImage
+//-----------------------------------------------------------------------------
+
+/*
+class wxImage : wxGDIObject
+{
+ wxImage( const wxBitmap &bitmap );
+ wxBitmap ConvertToBitmap() const;
+}
+*/
+
//-----------------------------------------------------------------------------
// wxMask
//-----------------------------------------------------------------------------
wxBitmap();
wxBitmap( int width, int height, int depth = -1 );
wxBitmap( const char bits[], int width, int height, int depth = 1 );
- wxBitmap( const wxImage &image );
wxBitmap( const char **bits );
wxBitmap( char **bits );
wxBitmap( const wxBitmap& bmp );
bool operator != ( const wxBitmap& bmp );
bool Ok() const;
- wxImage ConvertToImage() const;
-
int GetHeight() const;
int GetWidth() const;
int GetDepth() const;
- void SetHeight( int height );
- void SetWidth( int width );
- void SetDepth( int depth );
wxMask *GetMask() const;
void SetMask( wxMask *mask );
// implementation
+ void SetHeight( int height );
+ void SetWidth( int width );
+ void SetDepth( int depth );
+ void SetPixmap( GdkPixmap *pixmap );
+
GdkPixmap *GetPixmap() const;
GdkBitmap *GetBitmap() const;
public:
- wxDC(void);
- ~wxDC(void);
+ wxDC();
+ ~wxDC();
- void BeginDrawing(void) {};
- void EndDrawing(void) {};
+ virtual void BeginDrawing() {}
+ virtual void EndDrawing() {}
- virtual bool Ok(void) const;
+ virtual bool Ok() const;
virtual void FloodFill( long x, long y, const wxColour& col, int style=wxFLOOD_SURFACE ) = 0;
inline void FloodFill(const wxPoint& pt, const wxColour& col, int style=wxFLOOD_SURFACE)
virtual long GetCharWidth(void) = 0;
virtual long GetCharHeight(void) = 0;
- virtual void Clear(void) = 0;
+ virtual void Clear() = 0;
virtual void SetFont( const wxFont &font ) = 0;
- virtual wxFont *GetFont(void) { return &m_font; };
+ virtual wxFont *GetFont() { return &m_font; };
virtual void SetPen( const wxPen &pen ) = 0;
- virtual wxPen *GetPen(void) { return &m_pen; };
+ virtual wxPen *GetPen() { return &m_pen; };
virtual void SetBrush( const wxBrush &brush ) = 0;
- virtual wxBrush *GetBrush(void) { return &m_brush; };
+ virtual wxBrush *GetBrush() { return &m_brush; };
virtual void SetBackground( const wxBrush &brush ) = 0;
- virtual wxBrush *GetBackground(void) { return &m_backgroundBrush; };
+ virtual wxBrush *GetBackground() { return &m_backgroundBrush; };
virtual void SetLogicalFunction( int function ) = 0;
- virtual int GetLogicalFunction(void) { return m_logicalFunction; };
+ virtual int GetLogicalFunction() { return m_logicalFunction; };
virtual void SetTextForeground( const wxColour &col );
virtual void SetTextBackground( const wxColour &col );
- virtual wxColour& GetTextBackground(void) const { return (wxColour&)m_textBackgroundColour; };
- virtual wxColour& GetTextForeground(void) const { return (wxColour&)m_textForegroundColour; };
+ virtual wxColour& GetTextBackground() const { return (wxColour&)m_textBackgroundColour; };
+ virtual wxColour& GetTextForeground() const { return (wxColour&)m_textForegroundColour; };
virtual void SetBackgroundMode( int mode ) = 0;
- virtual int GetBackgroundMode(void) { return m_backgroundMode; };
+ virtual int GetBackgroundMode() { return m_backgroundMode; };
virtual void SetPalette( const wxPalette& palette ) = 0;
void SetColourMap( const wxPalette& palette ) { SetPalette(palette); };
virtual void GetClippingBox( long *x, long *y, long *width, long *height ) const;
virtual void SetClippingRegion( const wxRegion ®ion ) = 0;
- virtual inline long MinX(void) const { return m_minX; }
- virtual inline long MaxX(void) const { return m_maxX; }
- virtual inline long MinY(void) const { return m_minY; }
- virtual inline long MaxY(void) const { return m_maxY; }
+ virtual long MinX() const { return m_minX; }
+ virtual long MaxX() const { return m_maxX; }
+ virtual long MinY() const { return m_minY; }
+ virtual long MaxY() const { return m_maxY; }
virtual void GetSize( int* width, int* height ) const;
inline wxSize GetSize(void) const { int w, h; GetSize(&w, &h); return wxSize(w, h); }
virtual void GetSizeMM( long* width, long* height ) const;
- virtual bool StartDoc( const wxString& WXUNUSED(message) ) { return TRUE; };
- virtual void EndDoc(void) {};
- virtual void StartPage(void) {};
- virtual void EndPage(void) {};
+ virtual bool StartDoc( const wxString& WXUNUSED(message) ) { return TRUE; }
+ virtual void EndDoc() {}
+ virtual void StartPage() {}
+ virtual void EndPage() {}
virtual void SetMapMode( int mode );
virtual int GetMapMode(void) const { return m_mappingMode; };
virtual void SetAxisOrientation( bool xLeftRight, bool yBottomUp );
- virtual void SetOptimization( bool WXUNUSED(optimize) ) {};
- virtual bool GetOptimization(void) { return m_optimize; };
+ virtual void SetOptimization( bool WXUNUSED(optimize) ) {}
+ virtual bool GetOptimization() { return m_optimize; }
virtual long DeviceToLogicalX(long x) const;
virtual long DeviceToLogicalY(long y) const;
// implementation
void CalcBoundingBox( long x, long y );
- void ComputeScaleAndOrigin(void);
+ void ComputeScaleAndOrigin();
long XDEV2LOG(long x) const
{
DECLARE_DYNAMIC_CLASS(wxWindowDC)
public:
- wxWindowDC(void);
+ wxWindowDC();
wxWindowDC( wxWindow *win );
- ~wxWindowDC(void);
+ ~wxWindowDC();
virtual void FloodFill( long x, long y, const wxColour& col, int style=wxFLOOD_SURFACE );
virtual bool GetPixel( long x1, long y1, wxColour *col ) const;
virtual void DrawRoundedRectangle( long x, long y, long width, long height, double radius = 20.0 );
virtual void DrawEllipse( long x, long y, long width, long height );
- virtual bool CanDrawBitmap(void) const;
+ virtual bool CanDrawBitmap() const;
virtual void DrawIcon( const wxIcon &icon, long x, long y );
virtual void DrawBitmap( const wxBitmap &bitmap, long x, long y, bool useMask=FALSE );
virtual bool Blit( long xdest, long ydest, long width, long height,
wxDC *source, long xsrc, long ysrc, int logical_func = wxCOPY, bool useMask=FALSE );
virtual void DrawText( const wxString &text, long x, long y, bool use16 = FALSE );
- virtual bool CanGetTextExtent(void) const;
+ virtual bool CanGetTextExtent() const;
virtual void GetTextExtent( const wxString &string, long *width, long *height,
long *descent = (long *) NULL, long *externalLeading = (long *) NULL,
wxFont *theFont = (wxFont *) NULL, bool use16 = FALSE );
- virtual long GetCharWidth(void);
- virtual long GetCharHeight(void);
+ virtual long GetCharWidth();
+ virtual long GetCharHeight();
- virtual void Clear(void);
+ virtual void Clear();
virtual void SetFont( const wxFont &font );
virtual void SetPen( const wxPen &pen );
virtual void SetPalette( const wxPalette& palette );
virtual void SetClippingRegion( long x, long y, long width, long height );
- virtual void DestroyClippingRegion(void);
+ virtual void DestroyClippingRegion();
virtual void SetClippingRegion( const wxRegion ®ion );
virtual void DrawSpline( wxList *points );
GdkColormap *m_cmap;
bool m_isMemDC;
- void SetUpDC(void);
- void Destroy(void);
- GdkWindow *GetWindow(void);
+ void SetUpDC();
+ void Destroy();
+ GdkWindow *GetWindow();
};
//-----------------------------------------------------------------------------
DECLARE_DYNAMIC_CLASS(wxPaintDC)
public:
- wxPaintDC(void);
+ wxPaintDC();
wxPaintDC( wxWindow *win );
};
DECLARE_DYNAMIC_CLASS(wxClientDC)
public:
- wxClientDC(void);
+ wxClientDC();
wxClientDC( wxWindow *win );
};
DECLARE_DYNAMIC_CLASS(wxMemoryDC)
public:
- wxMemoryDC(void);
+ wxMemoryDC();
wxMemoryDC( wxDC *dc ); // Create compatible DC
- ~wxMemoryDC(void);
+ ~wxMemoryDC();
virtual void SelectObject( const wxBitmap& bitmap );
void GetSize( int *width, int *height ) const;
bool Create(const wxString& output, bool interactive = TRUE, wxWindow *parent = (wxWindow *) NULL);
+ virtual bool Ok() const;
+
virtual bool PrinterDialog(wxWindow *parent = (wxWindow *) NULL);
- inline virtual void BeginDrawing(void) {} ;
- inline virtual void EndDrawing(void) {} ;
+ virtual void BeginDrawing() {}
+ virtual void EndDrawing() {}
void FloodFill(long x1, long y1, const wxColour &col, int style=wxFLOOD_SURFACE) ;
bool GetPixel(long x1, long y1, wxColour *col) const;
void DrawIcon( const wxIcon& icon, long x, long y );
void DrawBitmap( const wxBitmap& bitmap, long x, long y, bool useMask=FALSE );
-
void DrawText(const wxString& text, long x, long y, bool use16 = FALSE);
void Clear();
void SetAxisOrientation( bool xLeftRight, bool yBottomUp );
void SetDeviceOrigin( long x, long y );
- inline void SetBackgroundMode(int WXUNUSED(mode)) {};
+ inline void SetBackgroundMode(int WXUNUSED(mode)) {}
inline void SetPalette(const wxPalette& WXUNUSED(palette)) {}
inline ofstream *GetStream(void) const { return m_pstream; }
#include "wx/object.h"
#include "wx/string.h"
#include "wx/palette.h"
-#include "wx/image.h"
//-----------------------------------------------------------------------------
// classes
class wxMask;
class wxBitmap;
+//-----------------------------------------------------------------------------
+// also implemented here from wxImage
+//-----------------------------------------------------------------------------
+
+/*
+class wxImage : wxGDIObject
+{
+ wxImage( const wxBitmap &bitmap );
+ wxBitmap ConvertToBitmap() const;
+}
+*/
+
//-----------------------------------------------------------------------------
// wxMask
//-----------------------------------------------------------------------------
wxBitmap();
wxBitmap( int width, int height, int depth = -1 );
wxBitmap( const char bits[], int width, int height, int depth = 1 );
- wxBitmap( const wxImage &image );
wxBitmap( const char **bits );
wxBitmap( char **bits );
wxBitmap( const wxBitmap& bmp );
bool operator != ( const wxBitmap& bmp );
bool Ok() const;
- wxImage ConvertToImage() const;
-
int GetHeight() const;
int GetWidth() const;
int GetDepth() const;
- void SetHeight( int height );
- void SetWidth( int width );
- void SetDepth( int depth );
wxMask *GetMask() const;
void SetMask( wxMask *mask );
// implementation
+ void SetHeight( int height );
+ void SetWidth( int width );
+ void SetDepth( int depth );
+ void SetPixmap( GdkPixmap *pixmap );
+
GdkPixmap *GetPixmap() const;
GdkBitmap *GetBitmap() const;
public:
- wxDC(void);
- ~wxDC(void);
+ wxDC();
+ ~wxDC();
- void BeginDrawing(void) {};
- void EndDrawing(void) {};
+ virtual void BeginDrawing() {}
+ virtual void EndDrawing() {}
- virtual bool Ok(void) const;
+ virtual bool Ok() const;
virtual void FloodFill( long x, long y, const wxColour& col, int style=wxFLOOD_SURFACE ) = 0;
inline void FloodFill(const wxPoint& pt, const wxColour& col, int style=wxFLOOD_SURFACE)
virtual long GetCharWidth(void) = 0;
virtual long GetCharHeight(void) = 0;
- virtual void Clear(void) = 0;
+ virtual void Clear() = 0;
virtual void SetFont( const wxFont &font ) = 0;
- virtual wxFont *GetFont(void) { return &m_font; };
+ virtual wxFont *GetFont() { return &m_font; };
virtual void SetPen( const wxPen &pen ) = 0;
- virtual wxPen *GetPen(void) { return &m_pen; };
+ virtual wxPen *GetPen() { return &m_pen; };
virtual void SetBrush( const wxBrush &brush ) = 0;
- virtual wxBrush *GetBrush(void) { return &m_brush; };
+ virtual wxBrush *GetBrush() { return &m_brush; };
virtual void SetBackground( const wxBrush &brush ) = 0;
- virtual wxBrush *GetBackground(void) { return &m_backgroundBrush; };
+ virtual wxBrush *GetBackground() { return &m_backgroundBrush; };
virtual void SetLogicalFunction( int function ) = 0;
- virtual int GetLogicalFunction(void) { return m_logicalFunction; };
+ virtual int GetLogicalFunction() { return m_logicalFunction; };
virtual void SetTextForeground( const wxColour &col );
virtual void SetTextBackground( const wxColour &col );
- virtual wxColour& GetTextBackground(void) const { return (wxColour&)m_textBackgroundColour; };
- virtual wxColour& GetTextForeground(void) const { return (wxColour&)m_textForegroundColour; };
+ virtual wxColour& GetTextBackground() const { return (wxColour&)m_textBackgroundColour; };
+ virtual wxColour& GetTextForeground() const { return (wxColour&)m_textForegroundColour; };
virtual void SetBackgroundMode( int mode ) = 0;
- virtual int GetBackgroundMode(void) { return m_backgroundMode; };
+ virtual int GetBackgroundMode() { return m_backgroundMode; };
virtual void SetPalette( const wxPalette& palette ) = 0;
void SetColourMap( const wxPalette& palette ) { SetPalette(palette); };
virtual void GetClippingBox( long *x, long *y, long *width, long *height ) const;
virtual void SetClippingRegion( const wxRegion ®ion ) = 0;
- virtual inline long MinX(void) const { return m_minX; }
- virtual inline long MaxX(void) const { return m_maxX; }
- virtual inline long MinY(void) const { return m_minY; }
- virtual inline long MaxY(void) const { return m_maxY; }
+ virtual long MinX() const { return m_minX; }
+ virtual long MaxX() const { return m_maxX; }
+ virtual long MinY() const { return m_minY; }
+ virtual long MaxY() const { return m_maxY; }
virtual void GetSize( int* width, int* height ) const;
inline wxSize GetSize(void) const { int w, h; GetSize(&w, &h); return wxSize(w, h); }
virtual void GetSizeMM( long* width, long* height ) const;
- virtual bool StartDoc( const wxString& WXUNUSED(message) ) { return TRUE; };
- virtual void EndDoc(void) {};
- virtual void StartPage(void) {};
- virtual void EndPage(void) {};
+ virtual bool StartDoc( const wxString& WXUNUSED(message) ) { return TRUE; }
+ virtual void EndDoc() {}
+ virtual void StartPage() {}
+ virtual void EndPage() {}
virtual void SetMapMode( int mode );
virtual int GetMapMode(void) const { return m_mappingMode; };
virtual void SetAxisOrientation( bool xLeftRight, bool yBottomUp );
- virtual void SetOptimization( bool WXUNUSED(optimize) ) {};
- virtual bool GetOptimization(void) { return m_optimize; };
+ virtual void SetOptimization( bool WXUNUSED(optimize) ) {}
+ virtual bool GetOptimization() { return m_optimize; }
virtual long DeviceToLogicalX(long x) const;
virtual long DeviceToLogicalY(long y) const;
// implementation
void CalcBoundingBox( long x, long y );
- void ComputeScaleAndOrigin(void);
+ void ComputeScaleAndOrigin();
long XDEV2LOG(long x) const
{
DECLARE_DYNAMIC_CLASS(wxWindowDC)
public:
- wxWindowDC(void);
+ wxWindowDC();
wxWindowDC( wxWindow *win );
- ~wxWindowDC(void);
+ ~wxWindowDC();
virtual void FloodFill( long x, long y, const wxColour& col, int style=wxFLOOD_SURFACE );
virtual bool GetPixel( long x1, long y1, wxColour *col ) const;
virtual void DrawRoundedRectangle( long x, long y, long width, long height, double radius = 20.0 );
virtual void DrawEllipse( long x, long y, long width, long height );
- virtual bool CanDrawBitmap(void) const;
+ virtual bool CanDrawBitmap() const;
virtual void DrawIcon( const wxIcon &icon, long x, long y );
virtual void DrawBitmap( const wxBitmap &bitmap, long x, long y, bool useMask=FALSE );
virtual bool Blit( long xdest, long ydest, long width, long height,
wxDC *source, long xsrc, long ysrc, int logical_func = wxCOPY, bool useMask=FALSE );
virtual void DrawText( const wxString &text, long x, long y, bool use16 = FALSE );
- virtual bool CanGetTextExtent(void) const;
+ virtual bool CanGetTextExtent() const;
virtual void GetTextExtent( const wxString &string, long *width, long *height,
long *descent = (long *) NULL, long *externalLeading = (long *) NULL,
wxFont *theFont = (wxFont *) NULL, bool use16 = FALSE );
- virtual long GetCharWidth(void);
- virtual long GetCharHeight(void);
+ virtual long GetCharWidth();
+ virtual long GetCharHeight();
- virtual void Clear(void);
+ virtual void Clear();
virtual void SetFont( const wxFont &font );
virtual void SetPen( const wxPen &pen );
virtual void SetPalette( const wxPalette& palette );
virtual void SetClippingRegion( long x, long y, long width, long height );
- virtual void DestroyClippingRegion(void);
+ virtual void DestroyClippingRegion();
virtual void SetClippingRegion( const wxRegion ®ion );
virtual void DrawSpline( wxList *points );
GdkColormap *m_cmap;
bool m_isMemDC;
- void SetUpDC(void);
- void Destroy(void);
- GdkWindow *GetWindow(void);
+ void SetUpDC();
+ void Destroy();
+ GdkWindow *GetWindow();
};
//-----------------------------------------------------------------------------
DECLARE_DYNAMIC_CLASS(wxPaintDC)
public:
- wxPaintDC(void);
+ wxPaintDC();
wxPaintDC( wxWindow *win );
};
DECLARE_DYNAMIC_CLASS(wxClientDC)
public:
- wxClientDC(void);
+ wxClientDC();
wxClientDC( wxWindow *win );
};
DECLARE_DYNAMIC_CLASS(wxMemoryDC)
public:
- wxMemoryDC(void);
+ wxMemoryDC();
wxMemoryDC( wxDC *dc ); // Create compatible DC
- ~wxMemoryDC(void);
+ ~wxMemoryDC();
virtual void SelectObject( const wxBitmap& bitmap );
void GetSize( int *width, int *height ) const;
bool Create(const wxString& output, bool interactive = TRUE, wxWindow *parent = (wxWindow *) NULL);
+ virtual bool Ok() const;
+
virtual bool PrinterDialog(wxWindow *parent = (wxWindow *) NULL);
- inline virtual void BeginDrawing(void) {} ;
- inline virtual void EndDrawing(void) {} ;
+ virtual void BeginDrawing() {}
+ virtual void EndDrawing() {}
void FloodFill(long x1, long y1, const wxColour &col, int style=wxFLOOD_SURFACE) ;
bool GetPixel(long x1, long y1, wxColour *col) const;
void DrawIcon( const wxIcon& icon, long x, long y );
void DrawBitmap( const wxBitmap& bitmap, long x, long y, bool useMask=FALSE );
-
void DrawText(const wxString& text, long x, long y, bool use16 = FALSE);
void Clear();
void SetAxisOrientation( bool xLeftRight, bool yBottomUp );
void SetDeviceOrigin( long x, long y );
- inline void SetBackgroundMode(int WXUNUSED(mode)) {};
+ inline void SetBackgroundMode(int WXUNUSED(mode)) {}
inline void SetPalette(const wxPalette& WXUNUSED(palette)) {}
inline ofstream *GetStream(void) const { return m_pstream; }
class WXDLLEXPORT wxBMPHandler;
class WXDLLEXPORT wxImage;
+class WXDLLEXPORT wxBitmap;
+
//-----------------------------------------------------------------------------
// wxImageHandler
//-----------------------------------------------------------------------------
wxImage( const wxImage& image );
wxImage( const wxImage* image );
+
+ // these functions get implemented in /src/(platform)/bitmap.cpp
+ wxImage( const wxBitmap &bitmap );
+ wxBitmap ConvertToBitmap() const;
void Create( int width, int height );
void Destroy();
+ wxImage Scale( int width, int height );
+
virtual bool LoadFile( const wxString& name, long type = wxBITMAP_TYPE_PNG );
virtual bool SaveFile( const wxString& name, int type );
#include "printing.h"
+#ifndef __WXMSW__
+#include "mondrian.xpm"
+#endif
+
// Declare a frame
MyFrame *frame = (MyFrame *) NULL;
int orientation = wxPORTRAIT;
// Main proc
IMPLEMENT_APP(MyApp)
-#if defined(__WXGTK__) || defined(__WXMOTIF__)
-#include "folder.xpm"
-#endif
-
// Writes a header on a page. Margin units are in millimetres.
bool WritePageHeader(wxPrintout *printout, wxDC *dc, char *text, float mmToLogical);
frame->CreateStatusBar(2);
// Load icon and bitmap
-#ifdef __WXMSW__
- frame->SetIcon(wxIcon("mondrian"));
-#endif
-#ifdef __X__
-// frame->SetIcon(wxIcon(mondrian_bits, mondrian_width, mondrian_height));
-#endif
+ frame->SetIcon( wxICON( mondrian) );
// Make a menubar
wxMenu *file_menu = new wxMenu;
dc.DrawLine(0, 0, 200, 200);
dc.DrawLine(200, 0, 0, 200);
-#if defined(__WXGTK__) || defined(__WXMOTIF__)
- wxIcon my_icon( folder_xpm );
-#elif defined(__WXMSW__)
- wxIcon my_icon( "mondrian" );
-#elif
-#error "Platform not supported."
-#endif
+ wxIcon my_icon( wxICON(mondrian) );
dc.DrawIcon( my_icon, 100, 100);
}
UnRef();
}
+wxImage wxImage::Scale( int width, int height )
+{
+ wxImage image;
+
+ wxCHECK_MSG( Ok(), image, "invlaid image" );
+
+ wxCHECK_MSG( (width > 0) && (height > 0), image, "invalid image size" );
+
+ image.Create( width, height );
+
+ char unsigned *data = image.GetData();
+
+ wxCHECK_MSG( data, image, "unable to create image" );
+
+ if (M_IMGDATA->m_hasMask)
+ image.SetMaskColour( M_IMGDATA->m_maskRed, M_IMGDATA->m_maskGreen, M_IMGDATA->m_maskBlue );
+
+ double xscale = (double)width / (double)M_IMGDATA->m_width;
+ double yscale = (double)height / (double)M_IMGDATA->m_height;
+
+ for (int j = 0; j < height; j++)
+ {
+ for (int i = 0; i < width; i++)
+ {
+ int new_pos = 3*(j*width + i);
+ int old_pos = 3*((long)(j/yscale)*M_IMGDATA->m_width + (long)(i/xscale));
+ data[ new_pos ] = M_IMGDATA->m_data[ old_pos ];
+ data[ new_pos+1 ] = M_IMGDATA->m_data[ old_pos+1 ];
+ data[ new_pos+2 ] = M_IMGDATA->m_data[ old_pos+2 ];
+ }
+ }
+
+ return image;
+}
+
bool wxImage::Ok() const
{
return (M_IMGDATA && M_IMGDATA->m_ok);
char unsigned *wxImage::GetData() const
{
- if (!Ok()) return (char unsigned *)NULL;
+ wxCHECK_MSG( Ok(), (char unsigned *)NULL, "invalid image" );
return M_IMGDATA->m_data;
}
void wxImage::SetData( char unsigned *WXUNUSED(data) )
{
+ wxCHECK_RET( Ok(), "invalid image" );
}
void wxImage::SetMaskColour( unsigned char r, unsigned char g, unsigned char b )
{
- if (!Ok()) return;
+ wxCHECK_RET( Ok(), "invalid image" );
M_IMGDATA->m_maskRed = r;
M_IMGDATA->m_maskGreen = g;
unsigned char wxImage::GetMaskRed() const
{
- if (!Ok()) return 0;
+ wxCHECK_MSG( Ok(), 0, "invalid image" );
return M_IMGDATA->m_maskRed;
}
unsigned char wxImage::GetMaskGreen() const
{
- if (!Ok()) return 0;
+ wxCHECK_MSG( Ok(), 0, "invalid image" );
return M_IMGDATA->m_maskGreen;
}
unsigned char wxImage::GetMaskBlue() const
{
- if (!Ok()) return 0;
+ wxCHECK_MSG( Ok(), 0, "invalid image" );
return M_IMGDATA->m_maskBlue;
}
void wxImage::SetMask( bool mask )
{
- if (!Ok()) return;
+ wxCHECK_RET( Ok(), "invalid image" );
M_IMGDATA->m_hasMask = mask;
}
bool wxImage::HasMask() const
{
- if (!Ok()) return FALSE;
+ wxCHECK_MSG( Ok(), FALSE, "invalid image" );
return M_IMGDATA->m_hasMask;
}
int wxImage::GetWidth() const
{
- return (M_IMGDATA ? M_IMGDATA->m_width : 0);
+ wxCHECK_MSG( Ok(), 0, "invalid image" );
+
+ return M_IMGDATA->m_width;
}
int wxImage::GetHeight() const
{
- return (M_IMGDATA ? M_IMGDATA->m_height : 0);
+ wxCHECK_MSG( Ok(), 0, "invalid image" );
+
+ return M_IMGDATA->m_height;
}
bool wxImage::LoadFile( const wxString& filename, long type )
bool wxImage::SaveFile( const wxString& filename, int type )
{
+ wxCHECK_MSG( Ok(), FALSE, "invalid image" );
+
wxImageHandler *handler = FindHandler(type);
if (handler == NULL)
void wxListMainWindow::DeleteColumn( int col )
{
- wxCHECK_RET( col < m_columns.GetCount(),
+ wxCHECK_RET( col < (int)m_columns.GetCount(),
"attempting to delete inexistent column in wxListView" );
m_dirty = TRUE;
#include "wx/settings.h"
#include "wx/resource.h"
#include "wx/module.h"
+#include "wx/image.h"
#include "unistd.h"
#include "wx/filefn.h"
#include "gdk/gdkprivate.h"
#include "gdk/gdkx.h"
+#include "wx/image.h"
//-----------------------------------------------------------------------------
// wxMask
M_BMPDATA->m_pixmap = gdk_pixmap_create_from_xpm_d( parent, &mask, NULL, (gchar **) bits );
+ wxCHECK_RET( M_BMPDATA->m_pixmap, "couldn't create pixmap" );
+
if (mask)
{
M_BMPDATA->m_mask = new wxMask();
M_BMPDATA->m_height = height;
M_BMPDATA->m_bpp = 1;
+ wxCHECK_RET( M_BMPDATA->m_bitmap, "couldn't create bitmap" );
+
if (wxTheBitmapList) wxTheBitmapList->AddBitmap(this);
}
return M_BMPDATA->m_bpp;
}
-void wxBitmap::SetHeight( int height )
-{
- if (!Ok()) return;
-
- wxFAIL_MSG( "wxBitmap::SetHeight not implemented" );
-
- M_BMPDATA->m_height = height;
-}
-
-void wxBitmap::SetWidth( int width )
-{
- if (!Ok()) return;
-
- wxFAIL_MSG( "wxBitmap::SetWidth not implemented" );
-
- M_BMPDATA->m_width = width;
-}
-
-void wxBitmap::SetDepth( int depth )
-{
- if (!Ok()) return;
-
- wxFAIL_MSG( "wxBitmap::SetDepth not implemented" );
-
- M_BMPDATA->m_bpp = depth;
-}
-
wxMask *wxBitmap::GetMask(void) const
{
wxCHECK_MSG( Ok(), (wxMask *) NULL, "invalid bitmap" );
if (type == wxBITMAP_TYPE_PNG)
{
- wxImage image = ConvertToImage();
+ wxImage image( *this );
if (image.Ok()) return image.SaveFile( name, type );
}
{
wxImage image;
image.LoadFile( name, type );
- if (image.Ok()) *this = wxBitmap( image );
+ if (image.Ok()) *this = image.ConvertToBitmap();
}
else if (type == wxBITMAP_TYPE_BMP)
{
wxImage image;
image.LoadFile( name, type );
- if (image.Ok()) *this = wxBitmap( image );
+ if (image.Ok()) *this = image.ConvertToBitmap();
}
else
return FALSE;
return M_BMPDATA->m_palette;
}
+void wxBitmap::SetHeight( int height )
+{
+ if (!m_refData) m_refData = new wxBitmapRefData();
+
+ M_BMPDATA->m_height = height;
+}
+
+void wxBitmap::SetWidth( int width )
+{
+ if (!m_refData) m_refData = new wxBitmapRefData();
+
+ M_BMPDATA->m_width = width;
+}
+
+void wxBitmap::SetDepth( int depth )
+{
+ if (!m_refData) m_refData = new wxBitmapRefData();
+
+ M_BMPDATA->m_bpp = depth;
+}
+
+void wxBitmap::SetPixmap( GdkPixmap *pixmap )
+{
+ if (!m_refData) m_refData = new wxBitmapRefData();
+
+ M_BMPDATA->m_pixmap = pixmap;
+}
+
GdkPixmap *wxBitmap::GetPixmap(void) const
{
wxCHECK_MSG( Ok(), (GdkPixmap *) NULL, "invalid bitmap" );
return M_BMPDATA->m_bitmap;
}
-wxBitmap::wxBitmap( const wxImage &image )
+//-----------------------------------------------------------------------------
+// wxImage
+//-----------------------------------------------------------------------------
+
+wxBitmap wxImage::ConvertToBitmap() const
{
- if (wxTheBitmapList) wxTheBitmapList->AddBitmap(this);
-
- if (!image.Ok()) return;
+ wxBitmap bitmap;
- m_refData = new wxBitmapRefData();
+ wxCHECK_MSG( Ok(), bitmap, "invalid image" );
- M_BMPDATA->m_height = image.GetHeight();
- M_BMPDATA->m_width = image.GetWidth();
- int width = image.GetWidth();
- int height = image.GetHeight();
+ int width = GetWidth();
+ int height = GetHeight();
+ bitmap.SetHeight( height );
+ bitmap.SetWidth( width );
+
// Create picture
GdkImage *data_image =
gdk_image_new( GDK_IMAGE_FASTEST, gdk_visual_get_system(), width, height );
- M_BMPDATA->m_pixmap =
- gdk_pixmap_new( (GdkWindow*)&gdk_root_parent, width, height, -1 );
+ bitmap.SetPixmap( gdk_pixmap_new( (GdkWindow*)&gdk_root_parent, width, height, -1 ) );
// Create mask
GdkImage *mask_image = (GdkImage*) NULL;
- if (image.HasMask())
+ if (HasMask())
{
unsigned char *mask_data = (unsigned char*)malloc( ((width >> 3)+8) * height );
mask_image = gdk_image_new_bitmap( gdk_visual_get_system(), mask_data, width, height );
- M_BMPDATA->m_mask = new wxMask();
- M_BMPDATA->m_mask->m_bitmap = gdk_pixmap_new( (GdkWindow*)&gdk_root_parent, width, height, 1 );
+ wxMask *mask = new wxMask();
+ mask->m_bitmap = gdk_pixmap_new( (GdkWindow*)&gdk_root_parent, width, height, 1 );
+
+ bitmap.SetMask( mask );
}
// Retrieve depth
- GdkVisual *visual = gdk_window_get_visual( M_BMPDATA->m_pixmap );
+ GdkVisual *visual = gdk_window_get_visual( bitmap.GetPixmap() );
if (visual == NULL) visual = gdk_window_get_visual( (GdkWindow*) &gdk_root_parent );
int bpp = visual->depth;
if ((bpp == 16) && (visual->red_mask != 0xf800)) bpp = 15;
else if ((visual->green_mask > visual->blue_mask) && (visual->blue_mask > visual->red_mask)) b_o = GBR;
}
- int r_mask = image.GetMaskRed();
- int g_mask = image.GetMaskGreen();
- int b_mask = image.GetMaskBlue();
+ int r_mask = GetMaskRed();
+ int g_mask = GetMaskGreen();
+ int b_mask = GetMaskBlue();
- unsigned char* data = image.GetData();
+ unsigned char* data = GetData();
int index = 0;
for (int y = 0; y < height; y++)
int b = data[index];
index++;
- if (image.HasMask())
+ if (HasMask())
{
if ((r == r_mask) && (b == b_mask) && (g == g_mask))
gdk_image_put_pixel( mask_image, x, y, 1 );
// Blit picture
- GdkGC *data_gc = gdk_gc_new( M_BMPDATA->m_pixmap );
+ GdkGC *data_gc = gdk_gc_new( bitmap.GetPixmap() );
- gdk_draw_image( M_BMPDATA->m_pixmap, data_gc, data_image, 0, 0, 0, 0, width, height );
+ gdk_draw_image( bitmap.GetPixmap(), data_gc, data_image, 0, 0, 0, 0, width, height );
gdk_image_destroy( data_image );
gdk_gc_unref( data_gc );
// Blit mask
- if (image.HasMask())
+ if (HasMask())
{
- GdkGC *mask_gc = gdk_gc_new( M_BMPDATA->m_mask->m_bitmap );
+ GdkGC *mask_gc = gdk_gc_new( bitmap.GetMask()->GetBitmap() );
- gdk_draw_image( M_BMPDATA->m_mask->m_bitmap, mask_gc, mask_image, 0, 0, 0, 0, width, height );
+ gdk_draw_image( bitmap.GetMask()->GetBitmap(), mask_gc, mask_image, 0, 0, 0, 0, width, height );
gdk_image_destroy( mask_image );
gdk_gc_unref( mask_gc );
}
+
+ return bitmap;
}
-wxImage wxBitmap::ConvertToImage() const
+wxImage::wxImage( const wxBitmap &bitmap )
{
- wxImage image;
-
- wxCHECK_MSG( Ok(), image, "invalid bitmap" );
+ wxCHECK_RET( bitmap.Ok(), "invalid bitmap" );
- GdkImage *gdk_image = gdk_image_get( M_BMPDATA->m_pixmap, 0, 0, M_BMPDATA->m_width, M_BMPDATA->m_height );
-
- if (!gdk_image) return image;
+ GdkImage *gdk_image = gdk_image_get( bitmap.GetPixmap(),
+ 0, 0,
+ bitmap.GetWidth(), bitmap.GetHeight() );
+
+ wxCHECK_RET( gdk_image, "couldn't create image" );
- image.Create( M_BMPDATA->m_width, M_BMPDATA->m_height );
- char unsigned *data = image.GetData();
+ Create( bitmap.GetWidth(), bitmap.GetHeight() );
+ char unsigned *data = GetData();
+
+ if (!data)
+ {
+ gdk_image_destroy( gdk_image );
+ wxFAIL_MSG( "couldn't create image" );
+ return;
+ }
+
+ GdkImage *gdk_image_mask = (GdkImage*) NULL;
+ if (bitmap.GetMask())
+ {
+ gdk_image_mask = gdk_image_get( bitmap.GetMask()->GetBitmap(),
+ 0, 0,
+ bitmap.GetWidth(), bitmap.GetHeight() );
- GdkVisual *visual = gdk_window_get_visual( M_BMPDATA->m_pixmap );
+ SetMaskColour( 16, 16, 16 ); // anything unlikely and dividable
+ }
+
+ GdkVisual *visual = gdk_window_get_visual( bitmap.GetPixmap() );
if (visual == NULL) visual = gdk_window_get_visual( (GdkWindow*) &gdk_root_parent );
int bpp = visual->depth;
if ((bpp == 16) && (visual->red_mask != 0xf800)) bpp = 15;
GdkColormap *cmap = gtk_widget_get_default_colormap();
long pos = 0;
- for (int j = 0; j < M_BMPDATA->m_height; j++)
+ for (int j = 0; j < bitmap.GetHeight(); j++)
{
- for (int i = 0; i < M_BMPDATA->m_width; i++)
+ for (int i = 0; i < bitmap.GetWidth(); i++)
{
int pixel = gdk_image_get_pixel( gdk_image, i, j );
if (bpp <= 8)
data[pos+2] = pixel & 0xff;
}
+ if (gdk_image_mask)
+ {
+ int mask_pixel = gdk_image_get_pixel( gdk_image_mask, i, j );
+ if (mask_pixel == 0)
+ {
+ data[pos] = 16;
+ data[pos+1] = 16;
+ data[pos+2] = 16;
+ }
+ }
+
pos += 3;
}
}
gdk_image_destroy( gdk_image );
-
- return image;
+ if (gdk_image_mask) gdk_image_destroy( gdk_image_mask );
}
IMPLEMENT_ABSTRACT_CLASS(wxDC,wxObject)
-wxDC::wxDC(void)
+wxDC::wxDC()
{
- m_ok = FALSE;
- m_optimize = FALSE;
- m_autoSetting = FALSE;
- m_colour = TRUE;
- m_clipping = FALSE;
+ m_ok = FALSE;
+ m_optimize = FALSE;
+ m_autoSetting = FALSE;
+ m_colour = TRUE;
+ m_clipping = FALSE;
- m_mm_to_pix_x = 1.0;
- m_mm_to_pix_y = 1.0;
+ m_mm_to_pix_x = 1.0;
+ m_mm_to_pix_y = 1.0;
- m_logicalOriginX = 0;
- m_logicalOriginY = 0;
- m_deviceOriginX = 0;
- m_deviceOriginY = 0;
+ m_logicalOriginX = 0;
+ m_logicalOriginY = 0;
+ m_deviceOriginX = 0;
+ m_deviceOriginY = 0;
- m_logicalScaleX = 1.0;
- m_logicalScaleY = 1.0;
- m_userScaleX = 1.0;
- m_userScaleY = 1.0;
- m_scaleX = 1.0;
- m_scaleY = 1.0;
+ m_logicalScaleX = 1.0;
+ m_logicalScaleY = 1.0;
+ m_userScaleX = 1.0;
+ m_userScaleY = 1.0;
+ m_scaleX = 1.0;
+ m_scaleY = 1.0;
- m_mappingMode = MM_TEXT;
- m_needComputeScaleX = FALSE;
- m_needComputeScaleY = FALSE;
+ m_mappingMode = MM_TEXT;
+ m_needComputeScaleX = FALSE;
+ m_needComputeScaleY = FALSE;
- m_signX = 1; // default x-axis left to right
- m_signY = 1; // default y-axis top down
+ m_signX = 1; // default x-axis left to right
+ m_signY = 1; // default y-axis top down
- m_maxX = m_maxY = -100000;
- m_minY = m_minY = 100000;
+ m_maxX = m_maxY = -100000;
+ m_minY = m_minY = 100000;
- m_logicalFunction = wxCOPY;
+ m_logicalFunction = wxCOPY;
// m_textAlignment = wxALIGN_TOP_LEFT;
- m_backgroundMode = wxTRANSPARENT;
+ m_backgroundMode = wxTRANSPARENT;
- m_textForegroundColour = *wxBLACK;
- m_textBackgroundColour = *wxWHITE;
- m_pen = *wxBLACK_PEN;
- m_font = *wxNORMAL_FONT;
- m_brush = *wxTRANSPARENT_BRUSH;
- m_backgroundBrush = *wxWHITE_BRUSH;
+ m_textForegroundColour = *wxBLACK;
+ m_textBackgroundColour = *wxWHITE;
+ m_pen = *wxBLACK_PEN;
+ m_font = *wxNORMAL_FONT;
+ m_brush = *wxTRANSPARENT_BRUSH;
+ m_backgroundBrush = *wxWHITE_BRUSH;
// m_palette = wxAPP_COLOURMAP;
}
-wxDC::~wxDC(void)
+wxDC::~wxDC()
{
}
-bool wxDC::Ok(void) const
+bool wxDC::Ok() const
{
- wxASSERT_MSG( m_ok, "invalid display context" );
- return m_ok;
+ return m_ok;
}
void wxDC::DrawArc( long WXUNUSED(x1), long WXUNUSED(y1), long WXUNUSED(x2), long WXUNUSED(y2),
void wxDC::DrawPoint( wxPoint& point )
{
- DrawPoint( point.x, point.y );
+ DrawPoint( point.x, point.y );
}
void wxDC::DrawPolygon( wxList *list, long xoffset, long yoffset, int fillStyle )
{
- int n = list->Number();
- wxPoint *points = new wxPoint[n];
+ int n = list->Number();
+ wxPoint *points = new wxPoint[n];
- int i = 0;
- for( wxNode *node = list->First(); node; node = node->Next() )
- {
- wxPoint *point = (wxPoint *)node->Data();
- points[i].x = point->x;
- points[i++].y = point->y;
- }
- DrawPolygon( n, points, xoffset, yoffset, fillStyle );
- delete[] points;
+ int i = 0;
+ for( wxNode *node = list->First(); node; node = node->Next() )
+ {
+ wxPoint *point = (wxPoint *)node->Data();
+ points[i].x = point->x;
+ points[i++].y = point->y;
+ }
+
+ DrawPolygon( n, points, xoffset, yoffset, fillStyle );
+ delete[] points;
}
void wxDC::DrawLines( wxList *list, long xoffset, long yoffset )
{
- int n = list->Number();
- wxPoint *points = new wxPoint[n];
+ int n = list->Number();
+ wxPoint *points = new wxPoint[n];
- int i = 0;
- for( wxNode *node = list->First(); node; node = node->Next() )
- {
- wxPoint *point = (wxPoint *)node->Data();
- points[i].x = point->x;
- points[i++].y = point->y;
- }
- DrawLines( n, points, xoffset, yoffset );
- delete []points;
+ int i = 0;
+ for( wxNode *node = list->First(); node; node = node->Next() )
+ {
+ wxPoint *point = (wxPoint *)node->Data();
+ points[i].x = point->x;
+ points[i++].y = point->y;
+ }
+
+ DrawLines( n, points, xoffset, yoffset );
+ delete []points;
}
void wxDC::DrawSpline( long x1, long y1, long x2, long y2, long x3, long y3 )
{
- wxList list;
- list.Append( (wxObject*)new wxPoint(x1, y1) );
- list.Append( (wxObject*)new wxPoint(x2, y2) );
- list.Append( (wxObject*)new wxPoint(x3, y3) );
- DrawSpline(&list);
- wxNode *node = list.First();
- while (node)
- {
- wxPoint *p = (wxPoint*)node->Data();
- delete p;
- node = node->Next();
- }
+ wxList list;
+ list.Append( (wxObject*)new wxPoint(x1, y1) );
+ list.Append( (wxObject*)new wxPoint(x2, y2) );
+ list.Append( (wxObject*)new wxPoint(x3, y3) );
+ DrawSpline(&list);
+ wxNode *node = list.First();
+ while (node)
+ {
+ wxPoint *p = (wxPoint*)node->Data();
+ delete p;
+ node = node->Next();
+ }
}
void wxDC::DrawSpline( int n, wxPoint points[] )
{
- wxList list;
- for (int i = 0; i < n; i++) list.Append( (wxObject*)&points[i] );
- DrawSpline( &list );
+ wxList list;
+ for (int i = 0; i < n; i++) list.Append( (wxObject*)&points[i] );
+ DrawSpline( &list );
}
void wxDC::SetClippingRegion( long x, long y, long width, long height )
{
- m_clipping = TRUE;
- m_clipX1 = x;
- m_clipY1 = y;
- m_clipX2 = x + width;
- m_clipY2 = y + height;
+ m_clipping = TRUE;
+ m_clipX1 = x;
+ m_clipY1 = y;
+ m_clipX2 = x + width;
+ m_clipY2 = y + height;
}
-void wxDC::DestroyClippingRegion(void)
+void wxDC::DestroyClippingRegion()
{
- m_clipping = FALSE;
+ m_clipping = FALSE;
}
void wxDC::GetClippingBox( long *x, long *y, long *width, long *height ) const
{
- if (m_clipping)
- {
- if (x) *x = m_clipX1;
- if (y) *y = m_clipY1;
- if (width) *width = (m_clipX2 - m_clipX1);
- if (height) *height = (m_clipY2 - m_clipY1);
- }
- else
- *x = *y = *width = *height = 0;
+ if (m_clipping)
+ {
+ if (x) *x = m_clipX1;
+ if (y) *y = m_clipY1;
+ if (width) *width = (m_clipX2 - m_clipX1);
+ if (height) *height = (m_clipY2 - m_clipY1);
+ }
+ else
+ {
+ *x = *y = *width = *height = 0;
+ }
}
void wxDC::GetSize( int* width, int* height ) const
{
- *width = m_maxX-m_minX;
- *height = m_maxY-m_minY;
+ if (width) *width = m_maxX-m_minX;
+ if (height) *height = m_maxY-m_minY;
}
void wxDC::GetSizeMM( long* width, long* height ) const
{
- int w = 0;
- int h = 0;
- GetSize( &w, &h );
- *width = long( double(w) / (m_scaleX*m_mm_to_pix_x) );
- *height = long( double(h) / (m_scaleY*m_mm_to_pix_y) );
+ int w = 0;
+ int h = 0;
+ GetSize( &w, &h );
+ if (width) *width = long( double(w) / (m_scaleX*m_mm_to_pix_x) );
+ if (height) *height = long( double(h) / (m_scaleY*m_mm_to_pix_y) );
}
void wxDC::SetTextForeground( const wxColour &col )
{
- if (!Ok()) return;
- m_textForegroundColour = col;
+ m_textForegroundColour = col;
}
void wxDC::SetTextBackground( const wxColour &col )
{
- if (!Ok()) return;
- m_textBackgroundColour = col;
+ m_textBackgroundColour = col;
}
void wxDC::SetMapMode( int mode )
{
- switch (mode)
- {
- case MM_TWIPS:
- SetLogicalScale( twips2mm*m_mm_to_pix_x, twips2mm*m_mm_to_pix_y );
- break;
- case MM_POINTS:
- SetLogicalScale( pt2mm*m_mm_to_pix_x, pt2mm*m_mm_to_pix_y );
- break;
- case MM_METRIC:
- SetLogicalScale( m_mm_to_pix_x, m_mm_to_pix_y );
- break;
- case MM_LOMETRIC:
- SetLogicalScale( m_mm_to_pix_x/10.0, m_mm_to_pix_y/10.0 );
- break;
- default:
- case MM_TEXT:
- SetLogicalScale( 1.0, 1.0 );
- break;
- }
- if (mode != MM_TEXT)
- {
- m_needComputeScaleX = TRUE;
- m_needComputeScaleY = TRUE;
- }
+ switch (mode)
+ {
+ case MM_TWIPS:
+ SetLogicalScale( twips2mm*m_mm_to_pix_x, twips2mm*m_mm_to_pix_y );
+ break;
+ case MM_POINTS:
+ SetLogicalScale( pt2mm*m_mm_to_pix_x, pt2mm*m_mm_to_pix_y );
+ break;
+ case MM_METRIC:
+ SetLogicalScale( m_mm_to_pix_x, m_mm_to_pix_y );
+ break;
+ case MM_LOMETRIC:
+ SetLogicalScale( m_mm_to_pix_x/10.0, m_mm_to_pix_y/10.0 );
+ break;
+ default:
+ case MM_TEXT:
+ SetLogicalScale( 1.0, 1.0 );
+ break;
+ }
+/* we don't do this mega optimisation
+ if (mode != MM_TEXT)
+ {
+ m_needComputeScaleX = TRUE;
+ m_needComputeScaleY = TRUE;
+ }
+*/
}
void wxDC::SetUserScale( double x, double y )
{
- // allow negative ? -> no
- m_userScaleX = x;
- m_userScaleY = y;
- ComputeScaleAndOrigin();
+ // allow negative ? -> no
+ m_userScaleX = x;
+ m_userScaleY = y;
+ ComputeScaleAndOrigin();
}
void wxDC::GetUserScale( double *x, double *y )
{
- if (x) *x = m_userScaleX;
- if (y) *y = m_userScaleY;
+ if (x) *x = m_userScaleX;
+ if (y) *y = m_userScaleY;
}
void wxDC::SetLogicalScale( double x, double y )
{
- // allow negative ?
- m_logicalScaleX = x;
- m_logicalScaleY = y;
- ComputeScaleAndOrigin();
+ // allow negative ?
+ m_logicalScaleX = x;
+ m_logicalScaleY = y;
+ ComputeScaleAndOrigin();
}
void wxDC::GetLogicalScale( double *x, double *y )
{
- if (x) *x = m_logicalScaleX;
- if (y) *y = m_logicalScaleY;
+ if (x) *x = m_logicalScaleX;
+ if (y) *y = m_logicalScaleY;
}
void wxDC::SetLogicalOrigin( long x, long y )
{
- m_logicalOriginX = x * m_signX; // is this still correct ?
- m_logicalOriginY = y * m_signY;
- ComputeScaleAndOrigin();
+ m_logicalOriginX = x * m_signX; // is this still correct ?
+ m_logicalOriginY = y * m_signY;
+ ComputeScaleAndOrigin();
}
void wxDC::GetLogicalOrigin( long *x, long *y )
{
- if (x) *x = m_logicalOriginX;
- if (y) *y = m_logicalOriginY;
+ if (x) *x = m_logicalOriginX;
+ if (y) *y = m_logicalOriginY;
}
void wxDC::SetDeviceOrigin( long x, long y )
{
- m_deviceOriginX = x;
- m_deviceOriginY = y;
- ComputeScaleAndOrigin();
+ // only wxPostScripDC has m_signX = -1, we override SetDeviceOrigin there
+ m_deviceOriginX = x;
+ m_deviceOriginY = y;
+ ComputeScaleAndOrigin();
}
void wxDC::GetDeviceOrigin( long *x, long *y )
{
- if (x) *x = m_deviceOriginX;
- if (y) *y = m_deviceOriginY;
+ if (x) *x = m_deviceOriginX;
+ if (y) *y = m_deviceOriginY;
}
void wxDC::SetAxisOrientation( bool xLeftRight, bool yBottomUp )
{
- m_signX = (xLeftRight ? 1 : -1);
- m_signY = (yBottomUp ? -1 : 1);
- ComputeScaleAndOrigin();
+ // only wxPostScripDC has m_signX = -1, we override SetAxisOrientation there
+ m_signX = (xLeftRight ? 1 : -1);
+ m_signY = (yBottomUp ? -1 : 1);
+ ComputeScaleAndOrigin();
}
long wxDC::DeviceToLogicalX(long x) const
{
- return XDEV2LOG(x);
+ return XDEV2LOG(x);
}
long wxDC::DeviceToLogicalY(long y) const
{
- return YDEV2LOG(y);
+ return YDEV2LOG(y);
}
long wxDC::DeviceToLogicalXRel(long x) const
{
- return XDEV2LOGREL(x);
+ return XDEV2LOGREL(x);
}
long wxDC::DeviceToLogicalYRel(long y) const
{
- return YDEV2LOGREL(y);
+ return YDEV2LOGREL(y);
}
long wxDC::LogicalToDeviceX(long x) const
{
- return XLOG2DEV(x);
+ return XLOG2DEV(x);
}
long wxDC::LogicalToDeviceY(long y) const
{
- return YLOG2DEV(y);
+ return YLOG2DEV(y);
}
long wxDC::LogicalToDeviceXRel(long x) const
{
- return XLOG2DEVREL(x);
+ return XLOG2DEVREL(x);
}
long wxDC::LogicalToDeviceYRel(long y) const
{
- return YLOG2DEVREL(y);
+ return YLOG2DEVREL(y);
}
void wxDC::CalcBoundingBox( long x, long y )
{
- if (x < m_minX) m_minX = x;
- if (y < m_minY) m_minY = y;
- if (x > m_maxX) m_maxX = x;
- if (y > m_maxY) m_maxY = y;
+ if (x < m_minX) m_minX = x;
+ if (y < m_minY) m_minY = y;
+ if (x > m_maxX) m_maxX = x;
+ if (y > m_maxY) m_maxY = y;
}
-void wxDC::ComputeScaleAndOrigin(void)
+void wxDC::ComputeScaleAndOrigin()
{
- // CMB: copy scale to see if it changes
- double origScaleX = m_scaleX;
- double origScaleY = m_scaleY;
+ // CMB: copy scale to see if it changes
+ double origScaleX = m_scaleX;
+ double origScaleY = m_scaleY;
- m_scaleX = m_logicalScaleX * m_userScaleX;
- m_scaleY = m_logicalScaleY * m_userScaleY;
+ m_scaleX = m_logicalScaleX * m_userScaleX;
+ m_scaleY = m_logicalScaleY * m_userScaleY;
- // CMB: if scale has changed call SetPen to recalulate the line width
- if (m_scaleX != origScaleX || m_scaleY != origScaleY)
- {
- // this is a bit artificial, but we need to force wxDC to think
- // the pen has changed
- // Using this code, wxDC will ignore the new settings
- // so it's complete non-sense, Robert Roebling TODO!!
- // It even gives an Assert, Robert Roebling
+ // CMB: if scale has changed call SetPen to recalulate the line width
+ if (m_scaleX != origScaleX || m_scaleY != origScaleY)
+ {
+ // this is a bit artificial, but we need to force wxDC to think
+ // the pen has changed
+ // It gives an Assert, Robert Roebling
/*
- wxPen* pen = GetPen();
- wxPen tempPen;
- m_pen = tempPen;
- SetPen(pen);
+ wxPen pen = m_pen;
+ m_pen = wxNullPen;
+ SetPen( pen );
*/
}
}
#include "wx/dcclient.h"
#include "wx/dcmemory.h"
+#include "wx/image.h"
#include <math.h>
//-----------------------------------------------------------------------------
IMPLEMENT_DYNAMIC_CLASS(wxWindowDC,wxDC)
-wxWindowDC::wxWindowDC(void)
+wxWindowDC::wxWindowDC()
{
m_penGC = (GdkGC *) NULL;
m_brushGC = (GdkGC *) NULL;
}
-wxWindowDC::~wxWindowDC(void)
+wxWindowDC::~wxWindowDC()
{
Destroy();
}
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)
{
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);
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 )
{
- if (!Ok()) return;
+ DrawBitmap( icon, x, y, TRUE );
+}
+
+void wxWindowDC::DrawBitmap( const wxBitmap &bitmap, long x, long y, bool useMask )
+{
+ wxCHECK_RET( Ok(), "invalid window dc" );
- if (!icon.Ok()) return;
+ if (!bitmap.Ok()) return;
int xx = XLOG2DEV(x);
int yy = YLOG2DEV(y);
- GdkBitmap *mask = (GdkBitmap *) NULL;
- if (icon.GetMask()) mask = icon.GetMask()->GetBitmap();
+ int w = bitmap.GetWidth();
+ int h = bitmap.GetHeight();
- if (mask)
+ int ww = XLOG2DEVREL(w);
+ int hh = YLOG2DEVREL(h);
+
+ wxBitmap use_bitmap;
+
+ if ((w != ww) || (h != hh))
{
- gdk_gc_set_clip_mask( m_penGC, mask );
- gdk_gc_set_clip_origin( m_penGC, xx, yy );
+ wxImage image( bitmap );
+ image = image.Scale( ww, hh );
+
+ use_bitmap = image.ConvertToBitmap();
}
-
- GdkPixmap *pm = icon.GetPixmap();
- gdk_draw_pixmap( m_window, m_penGC, pm, 0, 0, xx, yy, -1, -1 );
-
- if (mask)
+ else
{
- gdk_gc_set_clip_mask( m_penGC, (GdkBitmap *) NULL );
- gdk_gc_set_clip_origin( m_penGC, 0, 0 );
+ use_bitmap = bitmap;
}
- CalcBoundingBox( x, y );
- int width = icon.GetWidth();
- int height = icon.GetHeight();
- CalcBoundingBox( x + width, y + height );
-}
-
-void wxWindowDC::DrawBitmap( const wxBitmap &bitmap, long x, long y, bool useMask )
-{
- if (!Ok()) return;
-
- if (!bitmap.Ok()) return;
-
- int xx = XLOG2DEV(x);
- int yy = YLOG2DEV(y);
-
GdkBitmap *mask = (GdkBitmap *) NULL;
- if (bitmap.GetMask()) mask = bitmap.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 = bitmap.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 = bitmap.GetWidth();
- int height = bitmap.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;
void wxWindowDC::SetClippingRegion( const wxRegion ®ion )
{
+ wxCHECK_RET( Ok(), "invalid window dc" );
+
if (region.Empty())
{
DestroyClippingRegion();
gdk_gc_set_clip_region( m_bgGC, region.GetRegion() );
}
-void wxWindowDC::DestroyClippingRegion(void)
+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()
{
}
IMPLEMENT_DYNAMIC_CLASS(wxMemoryDC,wxWindowDC)
-wxMemoryDC::wxMemoryDC(void) : wxWindowDC()
+wxMemoryDC::wxMemoryDC() : wxWindowDC()
{
- m_ok = FALSE;
+ m_ok = FALSE;
- m_cmap = gtk_widget_get_default_colormap();
+ m_cmap = gtk_widget_get_default_colormap();
}
wxMemoryDC::wxMemoryDC( wxDC *WXUNUSED(dc) )
: wxWindowDC()
{
- m_ok = FALSE;
+ m_ok = FALSE;
- m_cmap = gtk_widget_get_default_colormap();
+ m_cmap = gtk_widget_get_default_colormap();
}
-wxMemoryDC::~wxMemoryDC(void)
+wxMemoryDC::~wxMemoryDC()
{
}
void wxMemoryDC::SelectObject( const wxBitmap& bitmap )
{
- m_selected = bitmap;
- if (m_selected.Ok())
- {
- if (m_selected.GetPixmap())
+ m_selected = bitmap;
+ if (m_selected.Ok())
{
- m_window = m_selected.GetPixmap();
+ if (m_selected.GetPixmap())
+ {
+ m_window = m_selected.GetPixmap();
+ }
+ else
+ {
+ m_window = m_selected.GetBitmap();
+ }
+
+ SetUpDC();
+
+ m_isMemDC = TRUE;
}
else
- {
- m_window = m_selected.GetBitmap();
+ {
+ m_ok = FALSE;
+ m_window = (GdkWindow *) NULL;
}
-
- SetUpDC();
-
- m_isMemDC = TRUE;
- }
- else
- {
- m_ok = FALSE;
- m_window = (GdkWindow *) NULL;
- }
}
void wxMemoryDC::GetSize( int *width, int *height ) const
{
- if (m_selected.Ok())
- {
- if (width) (*width) = m_selected.GetWidth();
- if (height) (*height) = m_selected.GetHeight();
- }
- else
- {
- if (width) (*width) = 0;
- if (height) (*height) = 0;
- }
+ if (m_selected.Ok())
+ {
+ if (width) (*width) = m_selected.GetWidth();
+ if (height) (*height) = m_selected.GetHeight();
+ }
+ else
+ {
+ if (width) (*width) = 0;
+ if (height) (*height) = 0;
+ }
}
if (m_pstream) delete m_pstream;
}
+bool wxPostScriptDC::Ok() const
+{
+ return (m_ok && m_pstream);
+}
+
bool wxPostScriptDC::PrinterDialog(wxWindow *parent)
{
wxPostScriptPrintDialog dialog( parent, _("Printer Settings"), wxPoint(150, 150), wxSize(400, 400),
m_ok = TRUE;
}
- return m_ok;
+ return m_ok;
}
void wxPostScriptDC::SetClippingRegion (long x, long y, long w, long h)
{
- if (m_clipping) return;
+ wxCHECK_RET( Ok(), "invalid postscript dc" );
- if (!m_pstream) return;
+ if (m_clipping) return;
wxDC::SetClippingRegion( x, y, w, h );
void wxPostScriptDC::DestroyClippingRegion()
{
- if (!m_pstream) return;
+ wxCHECK_RET( Ok(), "invalid postscript dc" );
wxDC::DestroyClippingRegion();
void wxPostScriptDC::DrawLine (long x1, long y1, long x2, long y2)
{
- if (!m_pstream) return;
+ wxCHECK_RET( Ok(), "invalid postscript dc" );
if (m_pen.GetStyle() == wxTRANSPARENT) return;
void wxPostScriptDC::DrawArc (long x1, long y1, long x2, long y2, long xc, long yc)
{
- if (!m_pstream) return;
-
+ wxCHECK_RET( Ok(), "invalid postscript dc" );
+
long dx = x1 - xc;
long dy = y1 - yc;
long radius = (long) sqrt(dx*dx+dy*dy);
void wxPostScriptDC::DrawEllipticArc(long x,long y,long w,long h,double sa,double ea)
{
- if (!m_pstream) return;
-
+ wxCHECK_RET( Ok(), "invalid postscript dc" );
+
if (sa>=360 || sa<=-360) sa=sa-int(sa/360)*360;
if (ea>=360 || ea<=-360) ea=ea-int(ea/360)*360;
if (sa<0) sa+=360;
void wxPostScriptDC::DrawPoint (long x, long y)
{
- if (!m_pstream) return;
+ wxCHECK_RET( Ok(), "invalid postscript dc" );
if (m_pen.GetStyle() == wxTRANSPARENT) return;
void wxPostScriptDC::DrawPolygon (int n, wxPoint points[], long xoffset, long yoffset, int WXUNUSED(fillStyle))
{
- if (!m_pstream) return;
-
+ wxCHECK_RET( Ok(), "invalid postscript dc" );
+
if (n <= 0) return;
if (m_brush.GetStyle () != wxTRANSPARENT)
void wxPostScriptDC::DrawLines (int n, wxPoint points[], long xoffset, long yoffset)
{
- if (!m_pstream) return;
-
+ wxCHECK_RET( Ok(), "invalid postscript dc" );
+
if (m_pen.GetStyle() == wxTRANSPARENT) return;
if (n <= 0) return;
void wxPostScriptDC::DrawRectangle (long x, long y, long width, long height)
{
- if (!m_pstream) return;
+ wxCHECK_RET( Ok(), "invalid postscript dc" );
if (m_brush.GetStyle () != wxTRANSPARENT)
{
void wxPostScriptDC::DrawRoundedRectangle (long x, long y, long width, long height, double radius)
{
- if (!m_pstream) return;
-
+ wxCHECK_RET( Ok(), "invalid postscript dc" );
+
if (radius < 0.0)
{
// Now, a negative radius is interpreted to mean
void wxPostScriptDC::DrawEllipse (long x, long y, long width, long height)
{
- if (!m_pstream) return;
-
+ wxCHECK_RET( Ok(), "invalid postscript dc" );
+
if (m_brush.GetStyle () != wxTRANSPARENT)
{
SetBrush (m_brush);
void wxPostScriptDC::DrawIcon (const wxIcon& icon, long x, long y)
{
+ wxCHECK_RET( Ok(), "invalid postscript dc" );
+
wxMemoryDC memDC;
memDC.SelectObject( icon );
Blit(x, y, icon.GetWidth(), icon.GetHeight(), &memDC, 0, 0);
void wxPostScriptDC::DrawBitmap( const wxBitmap& bitmap, long x, long y, bool useMask )
{
+ wxCHECK_RET( Ok(), "invalid postscript dc" );
+
wxMemoryDC memDC;
memDC.SelectObject( bitmap );
Blit( x, y, bitmap.GetWidth(), bitmap.GetHeight(), &memDC, 0, 0, useMask );
void wxPostScriptDC::SetFont (const wxFont& font)
{
- if (!m_pstream) return;
-
+ wxCHECK_RET( Ok(), "invalid postscript dc" );
+
if (!font.Ok()) return;
m_font = font;
void wxPostScriptDC::SetPen( const wxPen& pen )
{
- if (!m_pstream) return;
-
+ wxCHECK_RET( Ok(), "invalid postscript dc" );
+
if (!pen.Ok()) return;
int oldStyle = m_pen.GetStyle();
void wxPostScriptDC::SetBrush( const wxBrush& brush )
{
- if (!m_pstream) return;
-
+ wxCHECK_RET( Ok(), "invalid postscript dc" );
+
if (!brush.Ok()) return;
m_brush = brush;
void wxPostScriptDC::DrawText( const wxString& text, long x, long y, bool WXUNUSED(use16bit) )
{
- if (!m_pstream) return;
-
+ wxCHECK_RET( Ok(), "invalid postscript dc" );
+
SetFont( m_font );
if (m_textForegroundColour.Ok ())
void wxPostScriptDC::DrawSpline( wxList *points )
{
- if (!m_pstream) return;
+ wxCHECK_RET( Ok(), "invalid postscript dc" );
SetPen( m_pen );
void wxPostScriptDC::SetAxisOrientation( bool xLeftRight, bool yBottomUp )
{
+ wxCHECK_RET( Ok(), "invalid postscript dc" );
+
m_signX = (xLeftRight ? 1 : -1);
m_signY = (yBottomUp ? 1 : -1);
void wxPostScriptDC::SetDeviceOrigin( long x, long y )
{
- int h = 0;
- int w = 0;
- GetSize( &w, &h );
+ wxCHECK_RET( Ok(), "invalid postscript dc" );
+
+ int h = 0;
+ int w = 0;
+ GetSize( &w, &h );
- wxDC::SetDeviceOrigin( x, h-y );
+ wxDC::SetDeviceOrigin( x, h-y );
}
void wxPostScriptDC::GetSize(int* width, int* height) const
{
+ wxCHECK_RET( Ok(), "invalid postscript dc" );
+
const char *paperType = wxThePrintSetupData->GetPaperName();
if (!paperType) paperType = _("A4 210 x 297 mm");
if (paper)
{
- *width = paper->widthPixels;
- *height = paper->heightPixels;
+ if (width) *width = paper->widthPixels;
+ if (height) *height = paper->heightPixels;
}
else
{
- *width = 595;
- *height = 842;
+ if (width) *width = 595;
+ if (height) *height = 842;
}
}
bool wxPostScriptDC::StartDoc (const wxString& message)
{
+ wxCHECK_MSG( Ok(), FALSE, "invalid postscript dc" );
+
if (m_filename == "")
{
m_filename = wxGetTempFileName("ps");
void wxPostScriptDC::EndDoc ()
{
- if (!m_pstream) return;
+ wxCHECK_RET( Ok(), "invalid postscript dc" );
if (m_clipping)
{
void wxPostScriptDC::StartPage ()
{
- if (!m_pstream) return;
+ wxCHECK_RET( Ok(), "invalid postscript dc" );
*m_pstream << "%%Page: " << (wxPageNumber++) << "\n";
void wxPostScriptDC::EndPage ()
{
- if (!m_pstream) return;
+ wxCHECK_RET( Ok(), "invalid postscript dc" );
*m_pstream << "showpage\n";
}
bool wxPostScriptDC::Blit (long xdest, long ydest, long fwidth, long fheight,
wxDC *source, long xsrc, long ysrc, int WXUNUSED(rop), bool WXUNUSED(useMask))
{
+ wxCHECK_MSG( Ok(), FALSE, "invalid postscript dc" );
+
return TRUE;
}
if (paper)
{
- *width = paper->widthMM;
- *height = paper->heightMM;
+ if (width) *width = paper->widthMM;
+ if (height) *height = paper->heightMM;
}
else
{
- *width = 210;
- *height = 297;
+ if (width) *width = 210;
+ if (height) *height = 297;
}
}
wxScreenDC::wxScreenDC(void)
{
- m_ok = FALSE;
- m_window = (GdkWindow *) NULL;
- m_cmap = gdk_colormap_get_system();
+ m_ok = FALSE;
+ m_window = (GdkWindow *) NULL;
+ m_cmap = gdk_colormap_get_system();
- if (sm_overlayWindow)
- {
- m_window = sm_overlayWindow;
- m_deviceOriginX = - sm_overlayWindowX;
- m_deviceOriginY = - sm_overlayWindowY;
- }
- else
- m_window = GDK_ROOT_PARENT();
+ if (sm_overlayWindow)
+ {
+ m_window = sm_overlayWindow;
+ m_deviceOriginX = - sm_overlayWindowX;
+ m_deviceOriginY = - sm_overlayWindowY;
+ }
+ else
+ {
+ m_window = GDK_ROOT_PARENT();
+ }
- SetUpDC();
+ SetUpDC();
- gdk_gc_set_subwindow( m_penGC, GDK_INCLUDE_INFERIORS );
- gdk_gc_set_subwindow( m_brushGC, GDK_INCLUDE_INFERIORS );
- gdk_gc_set_subwindow( m_textGC, GDK_INCLUDE_INFERIORS );
- gdk_gc_set_subwindow( m_bgGC, GDK_INCLUDE_INFERIORS );
+ gdk_gc_set_subwindow( m_penGC, GDK_INCLUDE_INFERIORS );
+ gdk_gc_set_subwindow( m_brushGC, GDK_INCLUDE_INFERIORS );
+ gdk_gc_set_subwindow( m_textGC, GDK_INCLUDE_INFERIORS );
+ gdk_gc_set_subwindow( m_bgGC, GDK_INCLUDE_INFERIORS );
}
wxScreenDC::~wxScreenDC(void)
{
- EndDrawingOnTop();
+ EndDrawingOnTop();
}
bool wxScreenDC::StartDrawingOnTop( wxWindow *window )
{
- if (!window) return StartDrawingOnTop();
+ if (!window) return StartDrawingOnTop();
- int x = 0;
- int y = 0;
- window->GetPosition( &x, &y );
- int w = 0;
- int h = 0;
- window->GetSize( &w, &h );
- window->ClientToScreen( &x, &y );
+ int x = 0;
+ int y = 0;
+ window->GetPosition( &x, &y );
+ int w = 0;
+ int h = 0;
+ window->GetSize( &w, &h );
+ window->ClientToScreen( &x, &y );
- wxRect rect;
- rect.x = x;
- rect.y = y;
- rect.width = 0;
- rect.height = 0;
+ wxRect rect;
+ rect.x = x;
+ rect.y = y;
+ rect.width = 0;
+ rect.height = 0;
- return StartDrawingOnTop( &rect );
+ return StartDrawingOnTop( &rect );
}
bool wxScreenDC::StartDrawingOnTop( wxRect *rect )
bool wxScreenDC::EndDrawingOnTop(void)
{
- if (sm_overlayWindow) gdk_window_destroy( sm_overlayWindow );
+ if (sm_overlayWindow) gdk_window_destroy( sm_overlayWindow );
- sm_overlayWindow = NULL;
- sm_overlayWindowX = 0;
- sm_overlayWindowY = 0;
+ sm_overlayWindow = NULL;
+ sm_overlayWindowX = 0;
+ sm_overlayWindowY = 0;
- return TRUE;
+ return TRUE;
}
#include "wx/settings.h"
#include "wx/resource.h"
#include "wx/module.h"
+#include "wx/image.h"
#include "unistd.h"
#include "wx/filefn.h"
#include "gdk/gdkprivate.h"
#include "gdk/gdkx.h"
+#include "wx/image.h"
//-----------------------------------------------------------------------------
// wxMask
M_BMPDATA->m_pixmap = gdk_pixmap_create_from_xpm_d( parent, &mask, NULL, (gchar **) bits );
+ wxCHECK_RET( M_BMPDATA->m_pixmap, "couldn't create pixmap" );
+
if (mask)
{
M_BMPDATA->m_mask = new wxMask();
M_BMPDATA->m_height = height;
M_BMPDATA->m_bpp = 1;
+ wxCHECK_RET( M_BMPDATA->m_bitmap, "couldn't create bitmap" );
+
if (wxTheBitmapList) wxTheBitmapList->AddBitmap(this);
}
return M_BMPDATA->m_bpp;
}
-void wxBitmap::SetHeight( int height )
-{
- if (!Ok()) return;
-
- wxFAIL_MSG( "wxBitmap::SetHeight not implemented" );
-
- M_BMPDATA->m_height = height;
-}
-
-void wxBitmap::SetWidth( int width )
-{
- if (!Ok()) return;
-
- wxFAIL_MSG( "wxBitmap::SetWidth not implemented" );
-
- M_BMPDATA->m_width = width;
-}
-
-void wxBitmap::SetDepth( int depth )
-{
- if (!Ok()) return;
-
- wxFAIL_MSG( "wxBitmap::SetDepth not implemented" );
-
- M_BMPDATA->m_bpp = depth;
-}
-
wxMask *wxBitmap::GetMask(void) const
{
wxCHECK_MSG( Ok(), (wxMask *) NULL, "invalid bitmap" );
if (type == wxBITMAP_TYPE_PNG)
{
- wxImage image = ConvertToImage();
+ wxImage image( *this );
if (image.Ok()) return image.SaveFile( name, type );
}
{
wxImage image;
image.LoadFile( name, type );
- if (image.Ok()) *this = wxBitmap( image );
+ if (image.Ok()) *this = image.ConvertToBitmap();
}
else if (type == wxBITMAP_TYPE_BMP)
{
wxImage image;
image.LoadFile( name, type );
- if (image.Ok()) *this = wxBitmap( image );
+ if (image.Ok()) *this = image.ConvertToBitmap();
}
else
return FALSE;
return M_BMPDATA->m_palette;
}
+void wxBitmap::SetHeight( int height )
+{
+ if (!m_refData) m_refData = new wxBitmapRefData();
+
+ M_BMPDATA->m_height = height;
+}
+
+void wxBitmap::SetWidth( int width )
+{
+ if (!m_refData) m_refData = new wxBitmapRefData();
+
+ M_BMPDATA->m_width = width;
+}
+
+void wxBitmap::SetDepth( int depth )
+{
+ if (!m_refData) m_refData = new wxBitmapRefData();
+
+ M_BMPDATA->m_bpp = depth;
+}
+
+void wxBitmap::SetPixmap( GdkPixmap *pixmap )
+{
+ if (!m_refData) m_refData = new wxBitmapRefData();
+
+ M_BMPDATA->m_pixmap = pixmap;
+}
+
GdkPixmap *wxBitmap::GetPixmap(void) const
{
wxCHECK_MSG( Ok(), (GdkPixmap *) NULL, "invalid bitmap" );
return M_BMPDATA->m_bitmap;
}
-wxBitmap::wxBitmap( const wxImage &image )
+//-----------------------------------------------------------------------------
+// wxImage
+//-----------------------------------------------------------------------------
+
+wxBitmap wxImage::ConvertToBitmap() const
{
- if (wxTheBitmapList) wxTheBitmapList->AddBitmap(this);
-
- if (!image.Ok()) return;
+ wxBitmap bitmap;
- m_refData = new wxBitmapRefData();
+ wxCHECK_MSG( Ok(), bitmap, "invalid image" );
- M_BMPDATA->m_height = image.GetHeight();
- M_BMPDATA->m_width = image.GetWidth();
- int width = image.GetWidth();
- int height = image.GetHeight();
+ int width = GetWidth();
+ int height = GetHeight();
+ bitmap.SetHeight( height );
+ bitmap.SetWidth( width );
+
// Create picture
GdkImage *data_image =
gdk_image_new( GDK_IMAGE_FASTEST, gdk_visual_get_system(), width, height );
- M_BMPDATA->m_pixmap =
- gdk_pixmap_new( (GdkWindow*)&gdk_root_parent, width, height, -1 );
+ bitmap.SetPixmap( gdk_pixmap_new( (GdkWindow*)&gdk_root_parent, width, height, -1 ) );
// Create mask
GdkImage *mask_image = (GdkImage*) NULL;
- if (image.HasMask())
+ if (HasMask())
{
unsigned char *mask_data = (unsigned char*)malloc( ((width >> 3)+8) * height );
mask_image = gdk_image_new_bitmap( gdk_visual_get_system(), mask_data, width, height );
- M_BMPDATA->m_mask = new wxMask();
- M_BMPDATA->m_mask->m_bitmap = gdk_pixmap_new( (GdkWindow*)&gdk_root_parent, width, height, 1 );
+ wxMask *mask = new wxMask();
+ mask->m_bitmap = gdk_pixmap_new( (GdkWindow*)&gdk_root_parent, width, height, 1 );
+
+ bitmap.SetMask( mask );
}
// Retrieve depth
- GdkVisual *visual = gdk_window_get_visual( M_BMPDATA->m_pixmap );
+ GdkVisual *visual = gdk_window_get_visual( bitmap.GetPixmap() );
if (visual == NULL) visual = gdk_window_get_visual( (GdkWindow*) &gdk_root_parent );
int bpp = visual->depth;
if ((bpp == 16) && (visual->red_mask != 0xf800)) bpp = 15;
else if ((visual->green_mask > visual->blue_mask) && (visual->blue_mask > visual->red_mask)) b_o = GBR;
}
- int r_mask = image.GetMaskRed();
- int g_mask = image.GetMaskGreen();
- int b_mask = image.GetMaskBlue();
+ int r_mask = GetMaskRed();
+ int g_mask = GetMaskGreen();
+ int b_mask = GetMaskBlue();
- unsigned char* data = image.GetData();
+ unsigned char* data = GetData();
int index = 0;
for (int y = 0; y < height; y++)
int b = data[index];
index++;
- if (image.HasMask())
+ if (HasMask())
{
if ((r == r_mask) && (b == b_mask) && (g == g_mask))
gdk_image_put_pixel( mask_image, x, y, 1 );
// Blit picture
- GdkGC *data_gc = gdk_gc_new( M_BMPDATA->m_pixmap );
+ GdkGC *data_gc = gdk_gc_new( bitmap.GetPixmap() );
- gdk_draw_image( M_BMPDATA->m_pixmap, data_gc, data_image, 0, 0, 0, 0, width, height );
+ gdk_draw_image( bitmap.GetPixmap(), data_gc, data_image, 0, 0, 0, 0, width, height );
gdk_image_destroy( data_image );
gdk_gc_unref( data_gc );
// Blit mask
- if (image.HasMask())
+ if (HasMask())
{
- GdkGC *mask_gc = gdk_gc_new( M_BMPDATA->m_mask->m_bitmap );
+ GdkGC *mask_gc = gdk_gc_new( bitmap.GetMask()->GetBitmap() );
- gdk_draw_image( M_BMPDATA->m_mask->m_bitmap, mask_gc, mask_image, 0, 0, 0, 0, width, height );
+ gdk_draw_image( bitmap.GetMask()->GetBitmap(), mask_gc, mask_image, 0, 0, 0, 0, width, height );
gdk_image_destroy( mask_image );
gdk_gc_unref( mask_gc );
}
+
+ return bitmap;
}
-wxImage wxBitmap::ConvertToImage() const
+wxImage::wxImage( const wxBitmap &bitmap )
{
- wxImage image;
-
- wxCHECK_MSG( Ok(), image, "invalid bitmap" );
+ wxCHECK_RET( bitmap.Ok(), "invalid bitmap" );
- GdkImage *gdk_image = gdk_image_get( M_BMPDATA->m_pixmap, 0, 0, M_BMPDATA->m_width, M_BMPDATA->m_height );
-
- if (!gdk_image) return image;
+ GdkImage *gdk_image = gdk_image_get( bitmap.GetPixmap(),
+ 0, 0,
+ bitmap.GetWidth(), bitmap.GetHeight() );
+
+ wxCHECK_RET( gdk_image, "couldn't create image" );
- image.Create( M_BMPDATA->m_width, M_BMPDATA->m_height );
- char unsigned *data = image.GetData();
+ Create( bitmap.GetWidth(), bitmap.GetHeight() );
+ char unsigned *data = GetData();
+
+ if (!data)
+ {
+ gdk_image_destroy( gdk_image );
+ wxFAIL_MSG( "couldn't create image" );
+ return;
+ }
+
+ GdkImage *gdk_image_mask = (GdkImage*) NULL;
+ if (bitmap.GetMask())
+ {
+ gdk_image_mask = gdk_image_get( bitmap.GetMask()->GetBitmap(),
+ 0, 0,
+ bitmap.GetWidth(), bitmap.GetHeight() );
- GdkVisual *visual = gdk_window_get_visual( M_BMPDATA->m_pixmap );
+ SetMaskColour( 16, 16, 16 ); // anything unlikely and dividable
+ }
+
+ GdkVisual *visual = gdk_window_get_visual( bitmap.GetPixmap() );
if (visual == NULL) visual = gdk_window_get_visual( (GdkWindow*) &gdk_root_parent );
int bpp = visual->depth;
if ((bpp == 16) && (visual->red_mask != 0xf800)) bpp = 15;
GdkColormap *cmap = gtk_widget_get_default_colormap();
long pos = 0;
- for (int j = 0; j < M_BMPDATA->m_height; j++)
+ for (int j = 0; j < bitmap.GetHeight(); j++)
{
- for (int i = 0; i < M_BMPDATA->m_width; i++)
+ for (int i = 0; i < bitmap.GetWidth(); i++)
{
int pixel = gdk_image_get_pixel( gdk_image, i, j );
if (bpp <= 8)
data[pos+2] = pixel & 0xff;
}
+ if (gdk_image_mask)
+ {
+ int mask_pixel = gdk_image_get_pixel( gdk_image_mask, i, j );
+ if (mask_pixel == 0)
+ {
+ data[pos] = 16;
+ data[pos+1] = 16;
+ data[pos+2] = 16;
+ }
+ }
+
pos += 3;
}
}
gdk_image_destroy( gdk_image );
-
- return image;
+ if (gdk_image_mask) gdk_image_destroy( gdk_image_mask );
}
IMPLEMENT_ABSTRACT_CLASS(wxDC,wxObject)
-wxDC::wxDC(void)
+wxDC::wxDC()
{
- m_ok = FALSE;
- m_optimize = FALSE;
- m_autoSetting = FALSE;
- m_colour = TRUE;
- m_clipping = FALSE;
+ m_ok = FALSE;
+ m_optimize = FALSE;
+ m_autoSetting = FALSE;
+ m_colour = TRUE;
+ m_clipping = FALSE;
- m_mm_to_pix_x = 1.0;
- m_mm_to_pix_y = 1.0;
+ m_mm_to_pix_x = 1.0;
+ m_mm_to_pix_y = 1.0;
- m_logicalOriginX = 0;
- m_logicalOriginY = 0;
- m_deviceOriginX = 0;
- m_deviceOriginY = 0;
+ m_logicalOriginX = 0;
+ m_logicalOriginY = 0;
+ m_deviceOriginX = 0;
+ m_deviceOriginY = 0;
- m_logicalScaleX = 1.0;
- m_logicalScaleY = 1.0;
- m_userScaleX = 1.0;
- m_userScaleY = 1.0;
- m_scaleX = 1.0;
- m_scaleY = 1.0;
+ m_logicalScaleX = 1.0;
+ m_logicalScaleY = 1.0;
+ m_userScaleX = 1.0;
+ m_userScaleY = 1.0;
+ m_scaleX = 1.0;
+ m_scaleY = 1.0;
- m_mappingMode = MM_TEXT;
- m_needComputeScaleX = FALSE;
- m_needComputeScaleY = FALSE;
+ m_mappingMode = MM_TEXT;
+ m_needComputeScaleX = FALSE;
+ m_needComputeScaleY = FALSE;
- m_signX = 1; // default x-axis left to right
- m_signY = 1; // default y-axis top down
+ m_signX = 1; // default x-axis left to right
+ m_signY = 1; // default y-axis top down
- m_maxX = m_maxY = -100000;
- m_minY = m_minY = 100000;
+ m_maxX = m_maxY = -100000;
+ m_minY = m_minY = 100000;
- m_logicalFunction = wxCOPY;
+ m_logicalFunction = wxCOPY;
// m_textAlignment = wxALIGN_TOP_LEFT;
- m_backgroundMode = wxTRANSPARENT;
+ m_backgroundMode = wxTRANSPARENT;
- m_textForegroundColour = *wxBLACK;
- m_textBackgroundColour = *wxWHITE;
- m_pen = *wxBLACK_PEN;
- m_font = *wxNORMAL_FONT;
- m_brush = *wxTRANSPARENT_BRUSH;
- m_backgroundBrush = *wxWHITE_BRUSH;
+ m_textForegroundColour = *wxBLACK;
+ m_textBackgroundColour = *wxWHITE;
+ m_pen = *wxBLACK_PEN;
+ m_font = *wxNORMAL_FONT;
+ m_brush = *wxTRANSPARENT_BRUSH;
+ m_backgroundBrush = *wxWHITE_BRUSH;
// m_palette = wxAPP_COLOURMAP;
}
-wxDC::~wxDC(void)
+wxDC::~wxDC()
{
}
-bool wxDC::Ok(void) const
+bool wxDC::Ok() const
{
- wxASSERT_MSG( m_ok, "invalid display context" );
- return m_ok;
+ return m_ok;
}
void wxDC::DrawArc( long WXUNUSED(x1), long WXUNUSED(y1), long WXUNUSED(x2), long WXUNUSED(y2),
void wxDC::DrawPoint( wxPoint& point )
{
- DrawPoint( point.x, point.y );
+ DrawPoint( point.x, point.y );
}
void wxDC::DrawPolygon( wxList *list, long xoffset, long yoffset, int fillStyle )
{
- int n = list->Number();
- wxPoint *points = new wxPoint[n];
+ int n = list->Number();
+ wxPoint *points = new wxPoint[n];
- int i = 0;
- for( wxNode *node = list->First(); node; node = node->Next() )
- {
- wxPoint *point = (wxPoint *)node->Data();
- points[i].x = point->x;
- points[i++].y = point->y;
- }
- DrawPolygon( n, points, xoffset, yoffset, fillStyle );
- delete[] points;
+ int i = 0;
+ for( wxNode *node = list->First(); node; node = node->Next() )
+ {
+ wxPoint *point = (wxPoint *)node->Data();
+ points[i].x = point->x;
+ points[i++].y = point->y;
+ }
+
+ DrawPolygon( n, points, xoffset, yoffset, fillStyle );
+ delete[] points;
}
void wxDC::DrawLines( wxList *list, long xoffset, long yoffset )
{
- int n = list->Number();
- wxPoint *points = new wxPoint[n];
+ int n = list->Number();
+ wxPoint *points = new wxPoint[n];
- int i = 0;
- for( wxNode *node = list->First(); node; node = node->Next() )
- {
- wxPoint *point = (wxPoint *)node->Data();
- points[i].x = point->x;
- points[i++].y = point->y;
- }
- DrawLines( n, points, xoffset, yoffset );
- delete []points;
+ int i = 0;
+ for( wxNode *node = list->First(); node; node = node->Next() )
+ {
+ wxPoint *point = (wxPoint *)node->Data();
+ points[i].x = point->x;
+ points[i++].y = point->y;
+ }
+
+ DrawLines( n, points, xoffset, yoffset );
+ delete []points;
}
void wxDC::DrawSpline( long x1, long y1, long x2, long y2, long x3, long y3 )
{
- wxList list;
- list.Append( (wxObject*)new wxPoint(x1, y1) );
- list.Append( (wxObject*)new wxPoint(x2, y2) );
- list.Append( (wxObject*)new wxPoint(x3, y3) );
- DrawSpline(&list);
- wxNode *node = list.First();
- while (node)
- {
- wxPoint *p = (wxPoint*)node->Data();
- delete p;
- node = node->Next();
- }
+ wxList list;
+ list.Append( (wxObject*)new wxPoint(x1, y1) );
+ list.Append( (wxObject*)new wxPoint(x2, y2) );
+ list.Append( (wxObject*)new wxPoint(x3, y3) );
+ DrawSpline(&list);
+ wxNode *node = list.First();
+ while (node)
+ {
+ wxPoint *p = (wxPoint*)node->Data();
+ delete p;
+ node = node->Next();
+ }
}
void wxDC::DrawSpline( int n, wxPoint points[] )
{
- wxList list;
- for (int i = 0; i < n; i++) list.Append( (wxObject*)&points[i] );
- DrawSpline( &list );
+ wxList list;
+ for (int i = 0; i < n; i++) list.Append( (wxObject*)&points[i] );
+ DrawSpline( &list );
}
void wxDC::SetClippingRegion( long x, long y, long width, long height )
{
- m_clipping = TRUE;
- m_clipX1 = x;
- m_clipY1 = y;
- m_clipX2 = x + width;
- m_clipY2 = y + height;
+ m_clipping = TRUE;
+ m_clipX1 = x;
+ m_clipY1 = y;
+ m_clipX2 = x + width;
+ m_clipY2 = y + height;
}
-void wxDC::DestroyClippingRegion(void)
+void wxDC::DestroyClippingRegion()
{
- m_clipping = FALSE;
+ m_clipping = FALSE;
}
void wxDC::GetClippingBox( long *x, long *y, long *width, long *height ) const
{
- if (m_clipping)
- {
- if (x) *x = m_clipX1;
- if (y) *y = m_clipY1;
- if (width) *width = (m_clipX2 - m_clipX1);
- if (height) *height = (m_clipY2 - m_clipY1);
- }
- else
- *x = *y = *width = *height = 0;
+ if (m_clipping)
+ {
+ if (x) *x = m_clipX1;
+ if (y) *y = m_clipY1;
+ if (width) *width = (m_clipX2 - m_clipX1);
+ if (height) *height = (m_clipY2 - m_clipY1);
+ }
+ else
+ {
+ *x = *y = *width = *height = 0;
+ }
}
void wxDC::GetSize( int* width, int* height ) const
{
- *width = m_maxX-m_minX;
- *height = m_maxY-m_minY;
+ if (width) *width = m_maxX-m_minX;
+ if (height) *height = m_maxY-m_minY;
}
void wxDC::GetSizeMM( long* width, long* height ) const
{
- int w = 0;
- int h = 0;
- GetSize( &w, &h );
- *width = long( double(w) / (m_scaleX*m_mm_to_pix_x) );
- *height = long( double(h) / (m_scaleY*m_mm_to_pix_y) );
+ int w = 0;
+ int h = 0;
+ GetSize( &w, &h );
+ if (width) *width = long( double(w) / (m_scaleX*m_mm_to_pix_x) );
+ if (height) *height = long( double(h) / (m_scaleY*m_mm_to_pix_y) );
}
void wxDC::SetTextForeground( const wxColour &col )
{
- if (!Ok()) return;
- m_textForegroundColour = col;
+ m_textForegroundColour = col;
}
void wxDC::SetTextBackground( const wxColour &col )
{
- if (!Ok()) return;
- m_textBackgroundColour = col;
+ m_textBackgroundColour = col;
}
void wxDC::SetMapMode( int mode )
{
- switch (mode)
- {
- case MM_TWIPS:
- SetLogicalScale( twips2mm*m_mm_to_pix_x, twips2mm*m_mm_to_pix_y );
- break;
- case MM_POINTS:
- SetLogicalScale( pt2mm*m_mm_to_pix_x, pt2mm*m_mm_to_pix_y );
- break;
- case MM_METRIC:
- SetLogicalScale( m_mm_to_pix_x, m_mm_to_pix_y );
- break;
- case MM_LOMETRIC:
- SetLogicalScale( m_mm_to_pix_x/10.0, m_mm_to_pix_y/10.0 );
- break;
- default:
- case MM_TEXT:
- SetLogicalScale( 1.0, 1.0 );
- break;
- }
- if (mode != MM_TEXT)
- {
- m_needComputeScaleX = TRUE;
- m_needComputeScaleY = TRUE;
- }
+ switch (mode)
+ {
+ case MM_TWIPS:
+ SetLogicalScale( twips2mm*m_mm_to_pix_x, twips2mm*m_mm_to_pix_y );
+ break;
+ case MM_POINTS:
+ SetLogicalScale( pt2mm*m_mm_to_pix_x, pt2mm*m_mm_to_pix_y );
+ break;
+ case MM_METRIC:
+ SetLogicalScale( m_mm_to_pix_x, m_mm_to_pix_y );
+ break;
+ case MM_LOMETRIC:
+ SetLogicalScale( m_mm_to_pix_x/10.0, m_mm_to_pix_y/10.0 );
+ break;
+ default:
+ case MM_TEXT:
+ SetLogicalScale( 1.0, 1.0 );
+ break;
+ }
+/* we don't do this mega optimisation
+ if (mode != MM_TEXT)
+ {
+ m_needComputeScaleX = TRUE;
+ m_needComputeScaleY = TRUE;
+ }
+*/
}
void wxDC::SetUserScale( double x, double y )
{
- // allow negative ? -> no
- m_userScaleX = x;
- m_userScaleY = y;
- ComputeScaleAndOrigin();
+ // allow negative ? -> no
+ m_userScaleX = x;
+ m_userScaleY = y;
+ ComputeScaleAndOrigin();
}
void wxDC::GetUserScale( double *x, double *y )
{
- if (x) *x = m_userScaleX;
- if (y) *y = m_userScaleY;
+ if (x) *x = m_userScaleX;
+ if (y) *y = m_userScaleY;
}
void wxDC::SetLogicalScale( double x, double y )
{
- // allow negative ?
- m_logicalScaleX = x;
- m_logicalScaleY = y;
- ComputeScaleAndOrigin();
+ // allow negative ?
+ m_logicalScaleX = x;
+ m_logicalScaleY = y;
+ ComputeScaleAndOrigin();
}
void wxDC::GetLogicalScale( double *x, double *y )
{
- if (x) *x = m_logicalScaleX;
- if (y) *y = m_logicalScaleY;
+ if (x) *x = m_logicalScaleX;
+ if (y) *y = m_logicalScaleY;
}
void wxDC::SetLogicalOrigin( long x, long y )
{
- m_logicalOriginX = x * m_signX; // is this still correct ?
- m_logicalOriginY = y * m_signY;
- ComputeScaleAndOrigin();
+ m_logicalOriginX = x * m_signX; // is this still correct ?
+ m_logicalOriginY = y * m_signY;
+ ComputeScaleAndOrigin();
}
void wxDC::GetLogicalOrigin( long *x, long *y )
{
- if (x) *x = m_logicalOriginX;
- if (y) *y = m_logicalOriginY;
+ if (x) *x = m_logicalOriginX;
+ if (y) *y = m_logicalOriginY;
}
void wxDC::SetDeviceOrigin( long x, long y )
{
- m_deviceOriginX = x;
- m_deviceOriginY = y;
- ComputeScaleAndOrigin();
+ // only wxPostScripDC has m_signX = -1, we override SetDeviceOrigin there
+ m_deviceOriginX = x;
+ m_deviceOriginY = y;
+ ComputeScaleAndOrigin();
}
void wxDC::GetDeviceOrigin( long *x, long *y )
{
- if (x) *x = m_deviceOriginX;
- if (y) *y = m_deviceOriginY;
+ if (x) *x = m_deviceOriginX;
+ if (y) *y = m_deviceOriginY;
}
void wxDC::SetAxisOrientation( bool xLeftRight, bool yBottomUp )
{
- m_signX = (xLeftRight ? 1 : -1);
- m_signY = (yBottomUp ? -1 : 1);
- ComputeScaleAndOrigin();
+ // only wxPostScripDC has m_signX = -1, we override SetAxisOrientation there
+ m_signX = (xLeftRight ? 1 : -1);
+ m_signY = (yBottomUp ? -1 : 1);
+ ComputeScaleAndOrigin();
}
long wxDC::DeviceToLogicalX(long x) const
{
- return XDEV2LOG(x);
+ return XDEV2LOG(x);
}
long wxDC::DeviceToLogicalY(long y) const
{
- return YDEV2LOG(y);
+ return YDEV2LOG(y);
}
long wxDC::DeviceToLogicalXRel(long x) const
{
- return XDEV2LOGREL(x);
+ return XDEV2LOGREL(x);
}
long wxDC::DeviceToLogicalYRel(long y) const
{
- return YDEV2LOGREL(y);
+ return YDEV2LOGREL(y);
}
long wxDC::LogicalToDeviceX(long x) const
{
- return XLOG2DEV(x);
+ return XLOG2DEV(x);
}
long wxDC::LogicalToDeviceY(long y) const
{
- return YLOG2DEV(y);
+ return YLOG2DEV(y);
}
long wxDC::LogicalToDeviceXRel(long x) const
{
- return XLOG2DEVREL(x);
+ return XLOG2DEVREL(x);
}
long wxDC::LogicalToDeviceYRel(long y) const
{
- return YLOG2DEVREL(y);
+ return YLOG2DEVREL(y);
}
void wxDC::CalcBoundingBox( long x, long y )
{
- if (x < m_minX) m_minX = x;
- if (y < m_minY) m_minY = y;
- if (x > m_maxX) m_maxX = x;
- if (y > m_maxY) m_maxY = y;
+ if (x < m_minX) m_minX = x;
+ if (y < m_minY) m_minY = y;
+ if (x > m_maxX) m_maxX = x;
+ if (y > m_maxY) m_maxY = y;
}
-void wxDC::ComputeScaleAndOrigin(void)
+void wxDC::ComputeScaleAndOrigin()
{
- // CMB: copy scale to see if it changes
- double origScaleX = m_scaleX;
- double origScaleY = m_scaleY;
+ // CMB: copy scale to see if it changes
+ double origScaleX = m_scaleX;
+ double origScaleY = m_scaleY;
- m_scaleX = m_logicalScaleX * m_userScaleX;
- m_scaleY = m_logicalScaleY * m_userScaleY;
+ m_scaleX = m_logicalScaleX * m_userScaleX;
+ m_scaleY = m_logicalScaleY * m_userScaleY;
- // CMB: if scale has changed call SetPen to recalulate the line width
- if (m_scaleX != origScaleX || m_scaleY != origScaleY)
- {
- // this is a bit artificial, but we need to force wxDC to think
- // the pen has changed
- // Using this code, wxDC will ignore the new settings
- // so it's complete non-sense, Robert Roebling TODO!!
- // It even gives an Assert, Robert Roebling
+ // CMB: if scale has changed call SetPen to recalulate the line width
+ if (m_scaleX != origScaleX || m_scaleY != origScaleY)
+ {
+ // this is a bit artificial, but we need to force wxDC to think
+ // the pen has changed
+ // It gives an Assert, Robert Roebling
/*
- wxPen* pen = GetPen();
- wxPen tempPen;
- m_pen = tempPen;
- SetPen(pen);
+ wxPen pen = m_pen;
+ m_pen = wxNullPen;
+ SetPen( pen );
*/
}
}
#include "wx/dcclient.h"
#include "wx/dcmemory.h"
+#include "wx/image.h"
#include <math.h>
//-----------------------------------------------------------------------------
IMPLEMENT_DYNAMIC_CLASS(wxWindowDC,wxDC)
-wxWindowDC::wxWindowDC(void)
+wxWindowDC::wxWindowDC()
{
m_penGC = (GdkGC *) NULL;
m_brushGC = (GdkGC *) NULL;
}
-wxWindowDC::~wxWindowDC(void)
+wxWindowDC::~wxWindowDC()
{
Destroy();
}
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)
{
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);
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 )
{
- if (!Ok()) return;
+ DrawBitmap( icon, x, y, TRUE );
+}
+
+void wxWindowDC::DrawBitmap( const wxBitmap &bitmap, long x, long y, bool useMask )
+{
+ wxCHECK_RET( Ok(), "invalid window dc" );
- if (!icon.Ok()) return;
+ if (!bitmap.Ok()) return;
int xx = XLOG2DEV(x);
int yy = YLOG2DEV(y);
- GdkBitmap *mask = (GdkBitmap *) NULL;
- if (icon.GetMask()) mask = icon.GetMask()->GetBitmap();
+ int w = bitmap.GetWidth();
+ int h = bitmap.GetHeight();
- if (mask)
+ int ww = XLOG2DEVREL(w);
+ int hh = YLOG2DEVREL(h);
+
+ wxBitmap use_bitmap;
+
+ if ((w != ww) || (h != hh))
{
- gdk_gc_set_clip_mask( m_penGC, mask );
- gdk_gc_set_clip_origin( m_penGC, xx, yy );
+ wxImage image( bitmap );
+ image = image.Scale( ww, hh );
+
+ use_bitmap = image.ConvertToBitmap();
}
-
- GdkPixmap *pm = icon.GetPixmap();
- gdk_draw_pixmap( m_window, m_penGC, pm, 0, 0, xx, yy, -1, -1 );
-
- if (mask)
+ else
{
- gdk_gc_set_clip_mask( m_penGC, (GdkBitmap *) NULL );
- gdk_gc_set_clip_origin( m_penGC, 0, 0 );
+ use_bitmap = bitmap;
}
- CalcBoundingBox( x, y );
- int width = icon.GetWidth();
- int height = icon.GetHeight();
- CalcBoundingBox( x + width, y + height );
-}
-
-void wxWindowDC::DrawBitmap( const wxBitmap &bitmap, long x, long y, bool useMask )
-{
- if (!Ok()) return;
-
- if (!bitmap.Ok()) return;
-
- int xx = XLOG2DEV(x);
- int yy = YLOG2DEV(y);
-
GdkBitmap *mask = (GdkBitmap *) NULL;
- if (bitmap.GetMask()) mask = bitmap.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 = bitmap.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 = bitmap.GetWidth();
- int height = bitmap.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;
void wxWindowDC::SetClippingRegion( const wxRegion ®ion )
{
+ wxCHECK_RET( Ok(), "invalid window dc" );
+
if (region.Empty())
{
DestroyClippingRegion();
gdk_gc_set_clip_region( m_bgGC, region.GetRegion() );
}
-void wxWindowDC::DestroyClippingRegion(void)
+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()
{
}
IMPLEMENT_DYNAMIC_CLASS(wxMemoryDC,wxWindowDC)
-wxMemoryDC::wxMemoryDC(void) : wxWindowDC()
+wxMemoryDC::wxMemoryDC() : wxWindowDC()
{
- m_ok = FALSE;
+ m_ok = FALSE;
- m_cmap = gtk_widget_get_default_colormap();
+ m_cmap = gtk_widget_get_default_colormap();
}
wxMemoryDC::wxMemoryDC( wxDC *WXUNUSED(dc) )
: wxWindowDC()
{
- m_ok = FALSE;
+ m_ok = FALSE;
- m_cmap = gtk_widget_get_default_colormap();
+ m_cmap = gtk_widget_get_default_colormap();
}
-wxMemoryDC::~wxMemoryDC(void)
+wxMemoryDC::~wxMemoryDC()
{
}
void wxMemoryDC::SelectObject( const wxBitmap& bitmap )
{
- m_selected = bitmap;
- if (m_selected.Ok())
- {
- if (m_selected.GetPixmap())
+ m_selected = bitmap;
+ if (m_selected.Ok())
{
- m_window = m_selected.GetPixmap();
+ if (m_selected.GetPixmap())
+ {
+ m_window = m_selected.GetPixmap();
+ }
+ else
+ {
+ m_window = m_selected.GetBitmap();
+ }
+
+ SetUpDC();
+
+ m_isMemDC = TRUE;
}
else
- {
- m_window = m_selected.GetBitmap();
+ {
+ m_ok = FALSE;
+ m_window = (GdkWindow *) NULL;
}
-
- SetUpDC();
-
- m_isMemDC = TRUE;
- }
- else
- {
- m_ok = FALSE;
- m_window = (GdkWindow *) NULL;
- }
}
void wxMemoryDC::GetSize( int *width, int *height ) const
{
- if (m_selected.Ok())
- {
- if (width) (*width) = m_selected.GetWidth();
- if (height) (*height) = m_selected.GetHeight();
- }
- else
- {
- if (width) (*width) = 0;
- if (height) (*height) = 0;
- }
+ if (m_selected.Ok())
+ {
+ if (width) (*width) = m_selected.GetWidth();
+ if (height) (*height) = m_selected.GetHeight();
+ }
+ else
+ {
+ if (width) (*width) = 0;
+ if (height) (*height) = 0;
+ }
}
if (m_pstream) delete m_pstream;
}
+bool wxPostScriptDC::Ok() const
+{
+ return (m_ok && m_pstream);
+}
+
bool wxPostScriptDC::PrinterDialog(wxWindow *parent)
{
wxPostScriptPrintDialog dialog( parent, _("Printer Settings"), wxPoint(150, 150), wxSize(400, 400),
m_ok = TRUE;
}
- return m_ok;
+ return m_ok;
}
void wxPostScriptDC::SetClippingRegion (long x, long y, long w, long h)
{
- if (m_clipping) return;
+ wxCHECK_RET( Ok(), "invalid postscript dc" );
- if (!m_pstream) return;
+ if (m_clipping) return;
wxDC::SetClippingRegion( x, y, w, h );
void wxPostScriptDC::DestroyClippingRegion()
{
- if (!m_pstream) return;
+ wxCHECK_RET( Ok(), "invalid postscript dc" );
wxDC::DestroyClippingRegion();
void wxPostScriptDC::DrawLine (long x1, long y1, long x2, long y2)
{
- if (!m_pstream) return;
+ wxCHECK_RET( Ok(), "invalid postscript dc" );
if (m_pen.GetStyle() == wxTRANSPARENT) return;
void wxPostScriptDC::DrawArc (long x1, long y1, long x2, long y2, long xc, long yc)
{
- if (!m_pstream) return;
-
+ wxCHECK_RET( Ok(), "invalid postscript dc" );
+
long dx = x1 - xc;
long dy = y1 - yc;
long radius = (long) sqrt(dx*dx+dy*dy);
void wxPostScriptDC::DrawEllipticArc(long x,long y,long w,long h,double sa,double ea)
{
- if (!m_pstream) return;
-
+ wxCHECK_RET( Ok(), "invalid postscript dc" );
+
if (sa>=360 || sa<=-360) sa=sa-int(sa/360)*360;
if (ea>=360 || ea<=-360) ea=ea-int(ea/360)*360;
if (sa<0) sa+=360;
void wxPostScriptDC::DrawPoint (long x, long y)
{
- if (!m_pstream) return;
+ wxCHECK_RET( Ok(), "invalid postscript dc" );
if (m_pen.GetStyle() == wxTRANSPARENT) return;
void wxPostScriptDC::DrawPolygon (int n, wxPoint points[], long xoffset, long yoffset, int WXUNUSED(fillStyle))
{
- if (!m_pstream) return;
-
+ wxCHECK_RET( Ok(), "invalid postscript dc" );
+
if (n <= 0) return;
if (m_brush.GetStyle () != wxTRANSPARENT)
void wxPostScriptDC::DrawLines (int n, wxPoint points[], long xoffset, long yoffset)
{
- if (!m_pstream) return;
-
+ wxCHECK_RET( Ok(), "invalid postscript dc" );
+
if (m_pen.GetStyle() == wxTRANSPARENT) return;
if (n <= 0) return;
void wxPostScriptDC::DrawRectangle (long x, long y, long width, long height)
{
- if (!m_pstream) return;
+ wxCHECK_RET( Ok(), "invalid postscript dc" );
if (m_brush.GetStyle () != wxTRANSPARENT)
{
void wxPostScriptDC::DrawRoundedRectangle (long x, long y, long width, long height, double radius)
{
- if (!m_pstream) return;
-
+ wxCHECK_RET( Ok(), "invalid postscript dc" );
+
if (radius < 0.0)
{
// Now, a negative radius is interpreted to mean
void wxPostScriptDC::DrawEllipse (long x, long y, long width, long height)
{
- if (!m_pstream) return;
-
+ wxCHECK_RET( Ok(), "invalid postscript dc" );
+
if (m_brush.GetStyle () != wxTRANSPARENT)
{
SetBrush (m_brush);
void wxPostScriptDC::DrawIcon (const wxIcon& icon, long x, long y)
{
+ wxCHECK_RET( Ok(), "invalid postscript dc" );
+
wxMemoryDC memDC;
memDC.SelectObject( icon );
Blit(x, y, icon.GetWidth(), icon.GetHeight(), &memDC, 0, 0);
void wxPostScriptDC::DrawBitmap( const wxBitmap& bitmap, long x, long y, bool useMask )
{
+ wxCHECK_RET( Ok(), "invalid postscript dc" );
+
wxMemoryDC memDC;
memDC.SelectObject( bitmap );
Blit( x, y, bitmap.GetWidth(), bitmap.GetHeight(), &memDC, 0, 0, useMask );
void wxPostScriptDC::SetFont (const wxFont& font)
{
- if (!m_pstream) return;
-
+ wxCHECK_RET( Ok(), "invalid postscript dc" );
+
if (!font.Ok()) return;
m_font = font;
void wxPostScriptDC::SetPen( const wxPen& pen )
{
- if (!m_pstream) return;
-
+ wxCHECK_RET( Ok(), "invalid postscript dc" );
+
if (!pen.Ok()) return;
int oldStyle = m_pen.GetStyle();
void wxPostScriptDC::SetBrush( const wxBrush& brush )
{
- if (!m_pstream) return;
-
+ wxCHECK_RET( Ok(), "invalid postscript dc" );
+
if (!brush.Ok()) return;
m_brush = brush;
void wxPostScriptDC::DrawText( const wxString& text, long x, long y, bool WXUNUSED(use16bit) )
{
- if (!m_pstream) return;
-
+ wxCHECK_RET( Ok(), "invalid postscript dc" );
+
SetFont( m_font );
if (m_textForegroundColour.Ok ())
void wxPostScriptDC::DrawSpline( wxList *points )
{
- if (!m_pstream) return;
+ wxCHECK_RET( Ok(), "invalid postscript dc" );
SetPen( m_pen );
void wxPostScriptDC::SetAxisOrientation( bool xLeftRight, bool yBottomUp )
{
+ wxCHECK_RET( Ok(), "invalid postscript dc" );
+
m_signX = (xLeftRight ? 1 : -1);
m_signY = (yBottomUp ? 1 : -1);
void wxPostScriptDC::SetDeviceOrigin( long x, long y )
{
- int h = 0;
- int w = 0;
- GetSize( &w, &h );
+ wxCHECK_RET( Ok(), "invalid postscript dc" );
+
+ int h = 0;
+ int w = 0;
+ GetSize( &w, &h );
- wxDC::SetDeviceOrigin( x, h-y );
+ wxDC::SetDeviceOrigin( x, h-y );
}
void wxPostScriptDC::GetSize(int* width, int* height) const
{
+ wxCHECK_RET( Ok(), "invalid postscript dc" );
+
const char *paperType = wxThePrintSetupData->GetPaperName();
if (!paperType) paperType = _("A4 210 x 297 mm");
if (paper)
{
- *width = paper->widthPixels;
- *height = paper->heightPixels;
+ if (width) *width = paper->widthPixels;
+ if (height) *height = paper->heightPixels;
}
else
{
- *width = 595;
- *height = 842;
+ if (width) *width = 595;
+ if (height) *height = 842;
}
}
bool wxPostScriptDC::StartDoc (const wxString& message)
{
+ wxCHECK_MSG( Ok(), FALSE, "invalid postscript dc" );
+
if (m_filename == "")
{
m_filename = wxGetTempFileName("ps");
void wxPostScriptDC::EndDoc ()
{
- if (!m_pstream) return;
+ wxCHECK_RET( Ok(), "invalid postscript dc" );
if (m_clipping)
{
void wxPostScriptDC::StartPage ()
{
- if (!m_pstream) return;
+ wxCHECK_RET( Ok(), "invalid postscript dc" );
*m_pstream << "%%Page: " << (wxPageNumber++) << "\n";
void wxPostScriptDC::EndPage ()
{
- if (!m_pstream) return;
+ wxCHECK_RET( Ok(), "invalid postscript dc" );
*m_pstream << "showpage\n";
}
bool wxPostScriptDC::Blit (long xdest, long ydest, long fwidth, long fheight,
wxDC *source, long xsrc, long ysrc, int WXUNUSED(rop), bool WXUNUSED(useMask))
{
+ wxCHECK_MSG( Ok(), FALSE, "invalid postscript dc" );
+
return TRUE;
}
if (paper)
{
- *width = paper->widthMM;
- *height = paper->heightMM;
+ if (width) *width = paper->widthMM;
+ if (height) *height = paper->heightMM;
}
else
{
- *width = 210;
- *height = 297;
+ if (width) *width = 210;
+ if (height) *height = 297;
}
}
wxScreenDC::wxScreenDC(void)
{
- m_ok = FALSE;
- m_window = (GdkWindow *) NULL;
- m_cmap = gdk_colormap_get_system();
+ m_ok = FALSE;
+ m_window = (GdkWindow *) NULL;
+ m_cmap = gdk_colormap_get_system();
- if (sm_overlayWindow)
- {
- m_window = sm_overlayWindow;
- m_deviceOriginX = - sm_overlayWindowX;
- m_deviceOriginY = - sm_overlayWindowY;
- }
- else
- m_window = GDK_ROOT_PARENT();
+ if (sm_overlayWindow)
+ {
+ m_window = sm_overlayWindow;
+ m_deviceOriginX = - sm_overlayWindowX;
+ m_deviceOriginY = - sm_overlayWindowY;
+ }
+ else
+ {
+ m_window = GDK_ROOT_PARENT();
+ }
- SetUpDC();
+ SetUpDC();
- gdk_gc_set_subwindow( m_penGC, GDK_INCLUDE_INFERIORS );
- gdk_gc_set_subwindow( m_brushGC, GDK_INCLUDE_INFERIORS );
- gdk_gc_set_subwindow( m_textGC, GDK_INCLUDE_INFERIORS );
- gdk_gc_set_subwindow( m_bgGC, GDK_INCLUDE_INFERIORS );
+ gdk_gc_set_subwindow( m_penGC, GDK_INCLUDE_INFERIORS );
+ gdk_gc_set_subwindow( m_brushGC, GDK_INCLUDE_INFERIORS );
+ gdk_gc_set_subwindow( m_textGC, GDK_INCLUDE_INFERIORS );
+ gdk_gc_set_subwindow( m_bgGC, GDK_INCLUDE_INFERIORS );
}
wxScreenDC::~wxScreenDC(void)
{
- EndDrawingOnTop();
+ EndDrawingOnTop();
}
bool wxScreenDC::StartDrawingOnTop( wxWindow *window )
{
- if (!window) return StartDrawingOnTop();
+ if (!window) return StartDrawingOnTop();
- int x = 0;
- int y = 0;
- window->GetPosition( &x, &y );
- int w = 0;
- int h = 0;
- window->GetSize( &w, &h );
- window->ClientToScreen( &x, &y );
+ int x = 0;
+ int y = 0;
+ window->GetPosition( &x, &y );
+ int w = 0;
+ int h = 0;
+ window->GetSize( &w, &h );
+ window->ClientToScreen( &x, &y );
- wxRect rect;
- rect.x = x;
- rect.y = y;
- rect.width = 0;
- rect.height = 0;
+ wxRect rect;
+ rect.x = x;
+ rect.y = y;
+ rect.width = 0;
+ rect.height = 0;
- return StartDrawingOnTop( &rect );
+ return StartDrawingOnTop( &rect );
}
bool wxScreenDC::StartDrawingOnTop( wxRect *rect )
bool wxScreenDC::EndDrawingOnTop(void)
{
- if (sm_overlayWindow) gdk_window_destroy( sm_overlayWindow );
+ if (sm_overlayWindow) gdk_window_destroy( sm_overlayWindow );
- sm_overlayWindow = NULL;
- sm_overlayWindowX = 0;
- sm_overlayWindowY = 0;
+ sm_overlayWindow = NULL;
+ sm_overlayWindowX = 0;
+ sm_overlayWindowY = 0;
- return TRUE;
+ return TRUE;
}