From 4bc67cc550bcd9d5f93f88ae22a4f6ac7fafb5f7 Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Sun, 6 Dec 1998 17:33:01 +0000 Subject: [PATCH] Update for bitmap, image on scaling, transparancy, wxCHECKs and no more dependance of wxBitmap on wxImage in its API git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1117 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/gtk/bitmap.h | 24 ++- include/wx/gtk/dc.h | 50 ++--- include/wx/gtk/dcclient.h | 26 +-- include/wx/gtk/dcmemory.h | 4 +- include/wx/gtk/dcps.h | 9 +- include/wx/gtk1/bitmap.h | 24 ++- include/wx/gtk1/dc.h | 50 ++--- include/wx/gtk1/dcclient.h | 26 +-- include/wx/gtk1/dcmemory.h | 4 +- include/wx/gtk1/dcps.h | 9 +- include/wx/image.h | 8 + samples/printing/printing.cpp | 23 +-- src/common/image.cpp | 60 +++++- src/generic/listctrl.cpp | 2 +- src/gtk/app.cpp | 1 + src/gtk/bitmap.cpp | 177 ++++++++++------- src/gtk/dc.cpp | 364 +++++++++++++++++----------------- src/gtk/dcclient.cpp | 204 ++++++++++--------- src/gtk/dcmemory.cpp | 66 +++--- src/gtk/dcps.cpp | 105 ++++++---- src/gtk/dcscreen.cpp | 74 +++---- src/gtk1/app.cpp | 1 + src/gtk1/bitmap.cpp | 177 ++++++++++------- src/gtk1/dc.cpp | 364 +++++++++++++++++----------------- src/gtk1/dcclient.cpp | 204 ++++++++++--------- src/gtk1/dcmemory.cpp | 66 +++--- src/gtk1/dcps.cpp | 105 ++++++---- src/gtk1/dcscreen.cpp | 74 +++---- 28 files changed, 1250 insertions(+), 1051 deletions(-) diff --git a/include/wx/gtk/bitmap.h b/include/wx/gtk/bitmap.h index 35d5c3008a..45258f067b 100644 --- a/include/wx/gtk/bitmap.h +++ b/include/wx/gtk/bitmap.h @@ -19,7 +19,6 @@ #include "wx/object.h" #include "wx/string.h" #include "wx/palette.h" -#include "wx/image.h" //----------------------------------------------------------------------------- // classes @@ -28,6 +27,18 @@ class wxMask; class wxBitmap; +//----------------------------------------------------------------------------- +// also implemented here from wxImage +//----------------------------------------------------------------------------- + +/* +class wxImage : wxGDIObject +{ + wxImage( const wxBitmap &bitmap ); + wxBitmap ConvertToBitmap() const; +} +*/ + //----------------------------------------------------------------------------- // wxMask //----------------------------------------------------------------------------- @@ -61,7 +72,6 @@ public: 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 ); @@ -73,14 +83,9 @@ public: 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 ); @@ -94,6 +99,11 @@ public: // implementation + void SetHeight( int height ); + void SetWidth( int width ); + void SetDepth( int depth ); + void SetPixmap( GdkPixmap *pixmap ); + GdkPixmap *GetPixmap() const; GdkBitmap *GetBitmap() const; diff --git a/include/wx/gtk/dc.h b/include/wx/gtk/dc.h index 7870f30bd5..e1ca5b0b91 100644 --- a/include/wx/gtk/dc.h +++ b/include/wx/gtk/dc.h @@ -59,13 +59,13 @@ class wxDC: public wxObject 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) @@ -186,30 +186,30 @@ public: 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); }; @@ -220,19 +220,19 @@ public: 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; }; @@ -249,8 +249,8 @@ public: 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; @@ -264,7 +264,7 @@ public: // implementation void CalcBoundingBox( long x, long y ); - void ComputeScaleAndOrigin(void); + void ComputeScaleAndOrigin(); long XDEV2LOG(long x) const { diff --git a/include/wx/gtk/dcclient.h b/include/wx/gtk/dcclient.h index c39315f143..9a46663029 100644 --- a/include/wx/gtk/dcclient.h +++ b/include/wx/gtk/dcclient.h @@ -35,10 +35,10 @@ class wxWindowDC: public wxDC 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; @@ -60,21 +60,21 @@ public: 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 ); @@ -87,7 +87,7 @@ public: 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 ); @@ -102,9 +102,9 @@ public: GdkColormap *m_cmap; bool m_isMemDC; - void SetUpDC(void); - void Destroy(void); - GdkWindow *GetWindow(void); + void SetUpDC(); + void Destroy(); + GdkWindow *GetWindow(); }; //----------------------------------------------------------------------------- @@ -116,7 +116,7 @@ class wxPaintDC : public wxWindowDC DECLARE_DYNAMIC_CLASS(wxPaintDC) public: - wxPaintDC(void); + wxPaintDC(); wxPaintDC( wxWindow *win ); }; @@ -129,7 +129,7 @@ class wxClientDC : public wxWindowDC DECLARE_DYNAMIC_CLASS(wxClientDC) public: - wxClientDC(void); + wxClientDC(); wxClientDC( wxWindow *win ); }; diff --git a/include/wx/gtk/dcmemory.h b/include/wx/gtk/dcmemory.h index 632afa38ec..10d0f2905f 100644 --- a/include/wx/gtk/dcmemory.h +++ b/include/wx/gtk/dcmemory.h @@ -33,9 +33,9 @@ class wxMemoryDC: public wxWindowDC 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; diff --git a/include/wx/gtk/dcps.h b/include/wx/gtk/dcps.h index 33c03a2f0d..8d0ccedc11 100644 --- a/include/wx/gtk/dcps.h +++ b/include/wx/gtk/dcps.h @@ -45,10 +45,12 @@ public: 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; @@ -81,7 +83,6 @@ public: 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(); @@ -114,7 +115,7 @@ public: 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; } diff --git a/include/wx/gtk1/bitmap.h b/include/wx/gtk1/bitmap.h index 35d5c3008a..45258f067b 100644 --- a/include/wx/gtk1/bitmap.h +++ b/include/wx/gtk1/bitmap.h @@ -19,7 +19,6 @@ #include "wx/object.h" #include "wx/string.h" #include "wx/palette.h" -#include "wx/image.h" //----------------------------------------------------------------------------- // classes @@ -28,6 +27,18 @@ class wxMask; class wxBitmap; +//----------------------------------------------------------------------------- +// also implemented here from wxImage +//----------------------------------------------------------------------------- + +/* +class wxImage : wxGDIObject +{ + wxImage( const wxBitmap &bitmap ); + wxBitmap ConvertToBitmap() const; +} +*/ + //----------------------------------------------------------------------------- // wxMask //----------------------------------------------------------------------------- @@ -61,7 +72,6 @@ public: 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 ); @@ -73,14 +83,9 @@ public: 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 ); @@ -94,6 +99,11 @@ public: // implementation + void SetHeight( int height ); + void SetWidth( int width ); + void SetDepth( int depth ); + void SetPixmap( GdkPixmap *pixmap ); + GdkPixmap *GetPixmap() const; GdkBitmap *GetBitmap() const; diff --git a/include/wx/gtk1/dc.h b/include/wx/gtk1/dc.h index 7870f30bd5..e1ca5b0b91 100644 --- a/include/wx/gtk1/dc.h +++ b/include/wx/gtk1/dc.h @@ -59,13 +59,13 @@ class wxDC: public wxObject 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) @@ -186,30 +186,30 @@ public: 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); }; @@ -220,19 +220,19 @@ public: 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; }; @@ -249,8 +249,8 @@ public: 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; @@ -264,7 +264,7 @@ public: // implementation void CalcBoundingBox( long x, long y ); - void ComputeScaleAndOrigin(void); + void ComputeScaleAndOrigin(); long XDEV2LOG(long x) const { diff --git a/include/wx/gtk1/dcclient.h b/include/wx/gtk1/dcclient.h index c39315f143..9a46663029 100644 --- a/include/wx/gtk1/dcclient.h +++ b/include/wx/gtk1/dcclient.h @@ -35,10 +35,10 @@ class wxWindowDC: public wxDC 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; @@ -60,21 +60,21 @@ public: 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 ); @@ -87,7 +87,7 @@ public: 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 ); @@ -102,9 +102,9 @@ public: GdkColormap *m_cmap; bool m_isMemDC; - void SetUpDC(void); - void Destroy(void); - GdkWindow *GetWindow(void); + void SetUpDC(); + void Destroy(); + GdkWindow *GetWindow(); }; //----------------------------------------------------------------------------- @@ -116,7 +116,7 @@ class wxPaintDC : public wxWindowDC DECLARE_DYNAMIC_CLASS(wxPaintDC) public: - wxPaintDC(void); + wxPaintDC(); wxPaintDC( wxWindow *win ); }; @@ -129,7 +129,7 @@ class wxClientDC : public wxWindowDC DECLARE_DYNAMIC_CLASS(wxClientDC) public: - wxClientDC(void); + wxClientDC(); wxClientDC( wxWindow *win ); }; diff --git a/include/wx/gtk1/dcmemory.h b/include/wx/gtk1/dcmemory.h index 632afa38ec..10d0f2905f 100644 --- a/include/wx/gtk1/dcmemory.h +++ b/include/wx/gtk1/dcmemory.h @@ -33,9 +33,9 @@ class wxMemoryDC: public wxWindowDC 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; diff --git a/include/wx/gtk1/dcps.h b/include/wx/gtk1/dcps.h index 33c03a2f0d..8d0ccedc11 100644 --- a/include/wx/gtk1/dcps.h +++ b/include/wx/gtk1/dcps.h @@ -45,10 +45,12 @@ public: 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; @@ -81,7 +83,6 @@ public: 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(); @@ -114,7 +115,7 @@ public: 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; } diff --git a/include/wx/image.h b/include/wx/image.h index a8cf85145d..dc93c603c6 100644 --- a/include/wx/image.h +++ b/include/wx/image.h @@ -28,6 +28,8 @@ class WXDLLEXPORT wxPNGHandler; class WXDLLEXPORT wxBMPHandler; class WXDLLEXPORT wxImage; +class WXDLLEXPORT wxBitmap; + //----------------------------------------------------------------------------- // wxImageHandler //----------------------------------------------------------------------------- @@ -115,10 +117,16 @@ public: 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 ); diff --git a/samples/printing/printing.cpp b/samples/printing/printing.cpp index 782e17de3d..598d0876fe 100644 --- a/samples/printing/printing.cpp +++ b/samples/printing/printing.cpp @@ -47,6 +47,10 @@ #include "printing.h" +#ifndef __WXMSW__ +#include "mondrian.xpm" +#endif + // Declare a frame MyFrame *frame = (MyFrame *) NULL; int orientation = wxPORTRAIT; @@ -54,10 +58,6 @@ 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); @@ -78,12 +78,7 @@ bool MyApp::OnInit(void) 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; @@ -324,13 +319,7 @@ void MyFrame::Draw(wxDC& dc) 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); } diff --git a/src/common/image.cpp b/src/common/image.cpp index e838d1cfc5..1e47bc22c7 100644 --- a/src/common/image.cpp +++ b/src/common/image.cpp @@ -118,6 +118,41 @@ void wxImage::Destroy() 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); @@ -125,18 +160,19 @@ bool wxImage::Ok() const 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; @@ -146,47 +182,51 @@ void wxImage::SetMaskColour( unsigned char r, unsigned char g, unsigned char b ) 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 ) @@ -216,6 +256,8 @@ 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) diff --git a/src/generic/listctrl.cpp b/src/generic/listctrl.cpp index a75bf69fb8..8cb3082a06 100644 --- a/src/generic/listctrl.cpp +++ b/src/generic/listctrl.cpp @@ -2004,7 +2004,7 @@ void wxListMainWindow::DeleteItem( long index ) 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; diff --git a/src/gtk/app.cpp b/src/gtk/app.cpp index 631a12eff8..0e7eec9b1b 100644 --- a/src/gtk/app.cpp +++ b/src/gtk/app.cpp @@ -21,6 +21,7 @@ #include "wx/settings.h" #include "wx/resource.h" #include "wx/module.h" +#include "wx/image.h" #include "unistd.h" diff --git a/src/gtk/bitmap.cpp b/src/gtk/bitmap.cpp index 476a09919f..f92b146377 100644 --- a/src/gtk/bitmap.cpp +++ b/src/gtk/bitmap.cpp @@ -16,6 +16,7 @@ #include "wx/filefn.h" #include "gdk/gdkprivate.h" #include "gdk/gdkx.h" +#include "wx/image.h" //----------------------------------------------------------------------------- // wxMask @@ -151,6 +152,8 @@ wxBitmap::wxBitmap( char **bits ) 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(); @@ -195,6 +198,8 @@ wxBitmap::wxBitmap( const char bits[], int width, int height, int WXUNUSED(depth 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); } @@ -246,33 +251,6 @@ int wxBitmap::GetDepth(void) const 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" ); @@ -295,7 +273,7 @@ bool wxBitmap::SaveFile( const wxString &name, int type, wxPalette *WXUNUSED(pal if (type == wxBITMAP_TYPE_PNG) { - wxImage image = ConvertToImage(); + wxImage image( *this ); if (image.Ok()) return image.SaveFile( name, type ); } @@ -330,13 +308,13 @@ bool wxBitmap::LoadFile( const wxString &name, int 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; @@ -351,6 +329,34 @@ wxPalette *wxBitmap::GetPalette(void) const 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" ); @@ -365,44 +371,48 @@ GdkBitmap *wxBitmap::GetBitmap(void) const 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; @@ -424,11 +434,11 @@ wxBitmap::wxBitmap( const wxImage &image ) 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++) @@ -442,7 +452,7 @@ wxBitmap::wxBitmap( const wxImage &image ) 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 ); @@ -506,40 +516,59 @@ wxBitmap::wxBitmap( const wxImage &image ) // 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; @@ -547,9 +576,9 @@ wxImage wxBitmap::ConvertToImage() const 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) @@ -574,13 +603,23 @@ wxImage wxBitmap::ConvertToImage() const 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 ); } diff --git a/src/gtk/dc.cpp b/src/gtk/dc.cpp index d782330da8..44fe792814 100644 --- a/src/gtk/dc.cpp +++ b/src/gtk/dc.cpp @@ -31,61 +31,60 @@ 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), @@ -95,277 +94,280 @@ void wxDC::DrawArc( long WXUNUSED(x1), long WXUNUSED(y1), long WXUNUSED(x2), lon 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 ); */ } } diff --git a/src/gtk/dcclient.cpp b/src/gtk/dcclient.cpp index 3bf445ef64..0b2a1391cd 100644 --- a/src/gtk/dcclient.cpp +++ b/src/gtk/dcclient.cpp @@ -13,6 +13,7 @@ #include "wx/dcclient.h" #include "wx/dcmemory.h" +#include "wx/image.h" #include //----------------------------------------------------------------------------- @@ -84,7 +85,7 @@ void gdk_draw_bitmap (GdkDrawable *drawable, IMPLEMENT_DYNAMIC_CLASS(wxWindowDC,wxDC) -wxWindowDC::wxWindowDC(void) +wxWindowDC::wxWindowDC() { m_penGC = (GdkGC *) NULL; m_brushGC = (GdkGC *) NULL; @@ -118,7 +119,7 @@ wxWindowDC::wxWindowDC( wxWindow *window ) } -wxWindowDC::~wxWindowDC(void) +wxWindowDC::~wxWindowDC() { Destroy(); } @@ -137,7 +138,7 @@ bool wxWindowDC::GetPixel( long WXUNUSED(x1), long WXUNUSED(y1), wxColour *WXUNU 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) { @@ -151,7 +152,7 @@ void wxWindowDC::DrawLine( long x1, long y1, long x2, long y2 ) void wxWindowDC::CrossHair( long x, long y ) { - if (!Ok()) return; + wxCHECK_RET( Ok(), "invalid window dc" ); if (m_pen.GetStyle() != wxTRANSPARENT) { @@ -167,7 +168,7 @@ void wxWindowDC::CrossHair( long x, long y ) 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); @@ -217,7 +218,7 @@ void wxWindowDC::DrawArc( long x1, long y1, long x2, long y2, double xc, double void wxWindowDC::DrawEllipticArc( long x, long y, long width, long height, double sa, double ea ) { - if (!Ok()) return; + wxCHECK_RET( Ok(), "invalid window dc" ); long xx = XLOG2DEV(x); long yy = YLOG2DEV(y); @@ -242,7 +243,7 @@ void wxWindowDC::DrawEllipticArc( long x, long y, long width, long height, doubl 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) ); @@ -252,7 +253,7 @@ void wxWindowDC::DrawPoint( long x, long 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; @@ -273,7 +274,7 @@ void wxWindowDC::DrawLines( int n, wxPoint points[], long xoffset, long yoffset void wxWindowDC::DrawLines( wxList *points, long xoffset, long yoffset ) { - if (!Ok()) return; + wxCHECK_RET( Ok(), "invalid window dc" ); if (m_pen.GetStyle() == wxTRANSPARENT) return; @@ -300,9 +301,9 @@ void wxWindowDC::DrawLines( wxList *points, long xoffset, long yoffset ) 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; @@ -334,10 +335,10 @@ void wxWindowDC::DrawPolygon( int n, wxPoint points[], long xoffset, long yoffse 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(); @@ -375,7 +376,7 @@ void wxWindowDC::DrawPolygon( wxList *lines, long xoffset, long yoffset, int WXU 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); @@ -401,7 +402,7 @@ void wxWindowDC::DrawRectangle( long x, long y, long width, long height ) void wxWindowDC::DrawRoundedRectangle( long x, long y, long width, long height, double radius ) { - if (!Ok()) return; + wxCHECK_RET( Ok(), "invalid window dc" ); if (radius < 0.0) radius = - radius * ((width < height) ? width : height); @@ -470,7 +471,7 @@ void wxWindowDC::DrawRoundedRectangle( long x, long y, long width, long 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); @@ -491,55 +492,47 @@ void wxWindowDC::DrawEllipse( long x, long y, long width, long height ) CalcBoundingBox( x + width, y + height ); } -bool wxWindowDC::CanDrawBitmap(void) const +bool wxWindowDC::CanDrawBitmap() const { - return TRUE; + return TRUE; } void wxWindowDC::DrawIcon( const wxIcon &icon, long x, long y ) { - 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) { @@ -547,7 +540,7 @@ void wxWindowDC::DrawBitmap( const wxBitmap &bitmap, long x, long y, bool useMas 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) @@ -557,19 +550,20 @@ void wxWindowDC::DrawBitmap( const wxBitmap &bitmap, long x, long y, bool useMas } 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) @@ -586,11 +580,11 @@ bool wxWindowDC::Blit( long xdest, long ydest, long width, long height, 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, @@ -600,10 +594,11 @@ bool wxWindowDC::Blit( long xdest, long ydest, long width, long height, 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; } @@ -618,8 +613,8 @@ bool wxWindowDC::Blit( long xdest, long ydest, long width, long height, 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, @@ -632,15 +627,16 @@ bool wxWindowDC::Blit( long xdest, long ydest, long width, long height, 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), @@ -648,20 +644,13 @@ bool wxWindowDC::Blit( long xdest, long ydest, long width, long height, 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 ); @@ -696,7 +685,7 @@ void wxWindowDC::DrawText( const wxString &text, long x, long y, bool WXUNUSED(u CalcBoundingBox (x, y); } -bool wxWindowDC::CanGetTextExtent(void) const +bool wxWindowDC::CanGetTextExtent() const { return TRUE; } @@ -705,7 +694,7 @@ void wxWindowDC::GetTextExtent( const wxString &string, long *width, long *heigh 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; @@ -717,25 +706,25 @@ void wxWindowDC::GetTextExtent( const wxString &string, long *width, long *heigh 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) { @@ -751,15 +740,15 @@ void wxWindowDC::Clear(void) 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; @@ -814,7 +803,7 @@ void wxWindowDC::SetPen( const wxPen &pen ) void wxWindowDC::SetBrush( const wxBrush &brush ) { - if (!Ok()) return; + wxCHECK_RET( Ok(), "invalid window dc" ); if (m_brush == brush) return; @@ -849,11 +838,12 @@ void wxWindowDC::SetBrush( const wxBrush &brush ) } } -// 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; @@ -893,7 +883,10 @@ void wxWindowDC::SetBackground( const wxBrush &brush ) void wxWindowDC::SetLogicalFunction( int function ) { + wxCHECK_RET( Ok(), "invalid window dc" ); + if (m_logicalFunction == function) return; + GdkFunction mode = GDK_COPY; switch (function) { @@ -901,6 +894,7 @@ void wxWindowDC::SetLogicalFunction( int 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 ); @@ -909,7 +903,7 @@ void wxWindowDC::SetLogicalFunction( int function ) void wxWindowDC::SetTextForeground( const wxColour &col ) { - if (!Ok()) return; + wxCHECK_RET( Ok(), "invalid window dc" ); if (m_textForegroundColour == col) return; @@ -922,7 +916,7 @@ void wxWindowDC::SetTextForeground( const wxColour &col ) void wxWindowDC::SetTextBackground( const wxColour &col ) { - if (!Ok()) return; + wxCHECK_RET( Ok(), "invalid window dc" ); if (m_textBackgroundColour == col) return; @@ -935,10 +929,13 @@ void wxWindowDC::SetTextBackground( const wxColour &col ) 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, @@ -948,10 +945,13 @@ void wxWindowDC::SetBackgroundMode( int mode ) 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; @@ -967,6 +967,8 @@ void wxWindowDC::SetClippingRegion( long x, long y, long width, long height ) void wxWindowDC::SetClippingRegion( const wxRegion ®ion ) { + wxCHECK_RET( Ok(), "invalid window dc" ); + if (region.Empty()) { DestroyClippingRegion(); @@ -979,8 +981,10 @@ void wxWindowDC::SetClippingRegion( const wxRegion ®ion ) 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 ); @@ -989,7 +993,7 @@ void wxWindowDC::DestroyClippingRegion(void) gdk_gc_set_clip_rectangle( m_bgGC, (GdkRectangle *) NULL ); } -void wxWindowDC::SetUpDC(void) +void wxWindowDC::SetUpDC() { Destroy(); m_ok = TRUE; @@ -1034,7 +1038,7 @@ void wxWindowDC::SetUpDC(void) } } -void wxWindowDC::Destroy(void) +void wxWindowDC::Destroy() { if (m_penGC) gdk_gc_unref( m_penGC ); m_penGC = (GdkGC*) NULL; @@ -1046,7 +1050,7 @@ void wxWindowDC::Destroy(void) m_bgGC = (GdkGC*) NULL; } -GdkWindow *wxWindowDC::GetWindow(void) +GdkWindow *wxWindowDC::GetWindow() { return m_window; } @@ -1055,7 +1059,7 @@ GdkWindow *wxWindowDC::GetWindow(void) 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, @@ -1106,7 +1110,7 @@ static Stack wx_spline_stack[SPLINE_STACK_DEPTH]; 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; @@ -1168,6 +1172,8 @@ static void wx_spline_draw_point_array(wxDC *dc) 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; @@ -1223,7 +1229,7 @@ void wxWindowDC::DrawSpline( wxList *points ) IMPLEMENT_DYNAMIC_CLASS(wxPaintDC,wxWindowDC) -wxPaintDC::wxPaintDC(void) +wxPaintDC::wxPaintDC() : wxWindowDC() { } @@ -1239,7 +1245,7 @@ wxPaintDC::wxPaintDC( wxWindow *win ) IMPLEMENT_DYNAMIC_CLASS(wxClientDC,wxWindowDC) -wxClientDC::wxClientDC(void) +wxClientDC::wxClientDC() : wxWindowDC() { } diff --git a/src/gtk/dcmemory.cpp b/src/gtk/dcmemory.cpp index c41cb02348..e996334c00 100644 --- a/src/gtk/dcmemory.cpp +++ b/src/gtk/dcmemory.cpp @@ -19,62 +19,62 @@ 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; + } } diff --git a/src/gtk/dcps.cpp b/src/gtk/dcps.cpp index 5530fdaeab..d4362ef4a4 100644 --- a/src/gtk/dcps.cpp +++ b/src/gtk/dcps.cpp @@ -254,6 +254,11 @@ wxPostScriptDC::~wxPostScriptDC () 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), @@ -299,14 +304,14 @@ bool wxPostScriptDC::PrinterDialog(wxWindow *parent) 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 ); @@ -326,7 +331,7 @@ void wxPostScriptDC::SetClippingRegion( const wxRegion &WXUNUSED(region) ) void wxPostScriptDC::DestroyClippingRegion() { - if (!m_pstream) return; + wxCHECK_RET( Ok(), "invalid postscript dc" ); wxDC::DestroyClippingRegion(); @@ -360,7 +365,7 @@ void wxPostScriptDC::CrossHair (long WXUNUSED(x), long WXUNUSED(y)) 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; @@ -379,8 +384,8 @@ void wxPostScriptDC::DrawLine (long x1, long y1, long x2, long y2) 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); @@ -442,8 +447,8 @@ void wxPostScriptDC::DrawArc (long x1, long y1, long x2, long y2, long xc, long 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; @@ -484,7 +489,7 @@ void wxPostScriptDC::DrawEllipticArc(long x,long y,long w,long h,double sa,doubl void wxPostScriptDC::DrawPoint (long x, long y) { - if (!m_pstream) return; + wxCHECK_RET( Ok(), "invalid postscript dc" ); if (m_pen.GetStyle() == wxTRANSPARENT) return; @@ -500,8 +505,8 @@ void wxPostScriptDC::DrawPoint (long x, long y) 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) @@ -550,8 +555,8 @@ void wxPostScriptDC::DrawPolygon (int n, wxPoint points[], long xoffset, long yo 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; @@ -577,7 +582,7 @@ void wxPostScriptDC::DrawLines (int n, wxPoint points[], long xoffset, long yoff 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) { @@ -614,8 +619,8 @@ void wxPostScriptDC::DrawRectangle (long x, long y, long width, long height) 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 @@ -675,8 +680,8 @@ void wxPostScriptDC::DrawRoundedRectangle (long x, long y, long width, long heig 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); @@ -706,6 +711,8 @@ void wxPostScriptDC::DrawEllipse (long x, long y, long width, long height) 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); @@ -713,6 +720,8 @@ void wxPostScriptDC::DrawIcon (const wxIcon& icon, long x, long y) 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 ); @@ -720,8 +729,8 @@ void wxPostScriptDC::DrawBitmap( const wxBitmap& bitmap, long x, long y, bool us void wxPostScriptDC::SetFont (const wxFont& font) { - if (!m_pstream) return; - + wxCHECK_RET( Ok(), "invalid postscript dc" ); + if (!font.Ok()) return; m_font = font; @@ -739,8 +748,8 @@ void wxPostScriptDC::SetFont (const wxFont& 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(); @@ -818,8 +827,8 @@ void wxPostScriptDC::SetPen( const wxPen& pen ) void wxPostScriptDC::SetBrush( const wxBrush& brush ) { - if (!m_pstream) return; - + wxCHECK_RET( Ok(), "invalid postscript dc" ); + if (!brush.Ok()) return; m_brush = brush; @@ -857,8 +866,8 @@ void wxPostScriptDC::SetBrush( const wxBrush& 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 ()) @@ -952,7 +961,7 @@ void wxPostScriptDC::SetLogicalFunction (int WXUNUSED(function)) void wxPostScriptDC::DrawSpline( wxList *points ) { - if (!m_pstream) return; + wxCHECK_RET( Ok(), "invalid postscript dc" ); SetPen( m_pen ); @@ -1015,6 +1024,8 @@ long wxPostScriptDC::GetCharWidth () void wxPostScriptDC::SetAxisOrientation( bool xLeftRight, bool yBottomUp ) { + wxCHECK_RET( Ok(), "invalid postscript dc" ); + m_signX = (xLeftRight ? 1 : -1); m_signY = (yBottomUp ? 1 : -1); @@ -1023,15 +1034,19 @@ void wxPostScriptDC::SetAxisOrientation( bool xLeftRight, bool yBottomUp ) 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"); @@ -1042,18 +1057,20 @@ void wxPostScriptDC::GetSize(int* width, int* height) const 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"); @@ -1092,7 +1109,7 @@ bool wxPostScriptDC::StartDoc (const wxString& message) void wxPostScriptDC::EndDoc () { - if (!m_pstream) return; + wxCHECK_RET( Ok(), "invalid postscript dc" ); if (m_clipping) { @@ -1249,7 +1266,7 @@ void wxPostScriptDC::EndDoc () void wxPostScriptDC::StartPage () { - if (!m_pstream) return; + wxCHECK_RET( Ok(), "invalid postscript dc" ); *m_pstream << "%%Page: " << (wxPageNumber++) << "\n"; @@ -1285,7 +1302,7 @@ void wxPostScriptDC::StartPage () void wxPostScriptDC::EndPage () { - if (!m_pstream) return; + wxCHECK_RET( Ok(), "invalid postscript dc" ); *m_pstream << "showpage\n"; } @@ -1293,6 +1310,8 @@ void wxPostScriptDC::EndPage () 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; } @@ -1586,13 +1605,13 @@ void wxPostScriptDC::GetSizeMM(long *width, long *height) const 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; } } diff --git a/src/gtk/dcscreen.cpp b/src/gtk/dcscreen.cpp index 4bab18b379..bdb29ad1bd 100644 --- a/src/gtk/dcscreen.cpp +++ b/src/gtk/dcscreen.cpp @@ -245,51 +245,53 @@ IMPLEMENT_DYNAMIC_CLASS(wxScreenDC,wxPaintDC) 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 ) @@ -329,12 +331,12 @@ 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; } diff --git a/src/gtk1/app.cpp b/src/gtk1/app.cpp index 631a12eff8..0e7eec9b1b 100644 --- a/src/gtk1/app.cpp +++ b/src/gtk1/app.cpp @@ -21,6 +21,7 @@ #include "wx/settings.h" #include "wx/resource.h" #include "wx/module.h" +#include "wx/image.h" #include "unistd.h" diff --git a/src/gtk1/bitmap.cpp b/src/gtk1/bitmap.cpp index 476a09919f..f92b146377 100644 --- a/src/gtk1/bitmap.cpp +++ b/src/gtk1/bitmap.cpp @@ -16,6 +16,7 @@ #include "wx/filefn.h" #include "gdk/gdkprivate.h" #include "gdk/gdkx.h" +#include "wx/image.h" //----------------------------------------------------------------------------- // wxMask @@ -151,6 +152,8 @@ wxBitmap::wxBitmap( char **bits ) 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(); @@ -195,6 +198,8 @@ wxBitmap::wxBitmap( const char bits[], int width, int height, int WXUNUSED(depth 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); } @@ -246,33 +251,6 @@ int wxBitmap::GetDepth(void) const 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" ); @@ -295,7 +273,7 @@ bool wxBitmap::SaveFile( const wxString &name, int type, wxPalette *WXUNUSED(pal if (type == wxBITMAP_TYPE_PNG) { - wxImage image = ConvertToImage(); + wxImage image( *this ); if (image.Ok()) return image.SaveFile( name, type ); } @@ -330,13 +308,13 @@ bool wxBitmap::LoadFile( const wxString &name, int 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; @@ -351,6 +329,34 @@ wxPalette *wxBitmap::GetPalette(void) const 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" ); @@ -365,44 +371,48 @@ GdkBitmap *wxBitmap::GetBitmap(void) const 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; @@ -424,11 +434,11 @@ wxBitmap::wxBitmap( const wxImage &image ) 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++) @@ -442,7 +452,7 @@ wxBitmap::wxBitmap( const wxImage &image ) 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 ); @@ -506,40 +516,59 @@ wxBitmap::wxBitmap( const wxImage &image ) // 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; @@ -547,9 +576,9 @@ wxImage wxBitmap::ConvertToImage() const 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) @@ -574,13 +603,23 @@ wxImage wxBitmap::ConvertToImage() const 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 ); } diff --git a/src/gtk1/dc.cpp b/src/gtk1/dc.cpp index d782330da8..44fe792814 100644 --- a/src/gtk1/dc.cpp +++ b/src/gtk1/dc.cpp @@ -31,61 +31,60 @@ 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), @@ -95,277 +94,280 @@ void wxDC::DrawArc( long WXUNUSED(x1), long WXUNUSED(y1), long WXUNUSED(x2), lon 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 ); */ } } diff --git a/src/gtk1/dcclient.cpp b/src/gtk1/dcclient.cpp index 3bf445ef64..0b2a1391cd 100644 --- a/src/gtk1/dcclient.cpp +++ b/src/gtk1/dcclient.cpp @@ -13,6 +13,7 @@ #include "wx/dcclient.h" #include "wx/dcmemory.h" +#include "wx/image.h" #include //----------------------------------------------------------------------------- @@ -84,7 +85,7 @@ void gdk_draw_bitmap (GdkDrawable *drawable, IMPLEMENT_DYNAMIC_CLASS(wxWindowDC,wxDC) -wxWindowDC::wxWindowDC(void) +wxWindowDC::wxWindowDC() { m_penGC = (GdkGC *) NULL; m_brushGC = (GdkGC *) NULL; @@ -118,7 +119,7 @@ wxWindowDC::wxWindowDC( wxWindow *window ) } -wxWindowDC::~wxWindowDC(void) +wxWindowDC::~wxWindowDC() { Destroy(); } @@ -137,7 +138,7 @@ bool wxWindowDC::GetPixel( long WXUNUSED(x1), long WXUNUSED(y1), wxColour *WXUNU 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) { @@ -151,7 +152,7 @@ void wxWindowDC::DrawLine( long x1, long y1, long x2, long y2 ) void wxWindowDC::CrossHair( long x, long y ) { - if (!Ok()) return; + wxCHECK_RET( Ok(), "invalid window dc" ); if (m_pen.GetStyle() != wxTRANSPARENT) { @@ -167,7 +168,7 @@ void wxWindowDC::CrossHair( long x, long y ) 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); @@ -217,7 +218,7 @@ void wxWindowDC::DrawArc( long x1, long y1, long x2, long y2, double xc, double void wxWindowDC::DrawEllipticArc( long x, long y, long width, long height, double sa, double ea ) { - if (!Ok()) return; + wxCHECK_RET( Ok(), "invalid window dc" ); long xx = XLOG2DEV(x); long yy = YLOG2DEV(y); @@ -242,7 +243,7 @@ void wxWindowDC::DrawEllipticArc( long x, long y, long width, long height, doubl 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) ); @@ -252,7 +253,7 @@ void wxWindowDC::DrawPoint( long x, long 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; @@ -273,7 +274,7 @@ void wxWindowDC::DrawLines( int n, wxPoint points[], long xoffset, long yoffset void wxWindowDC::DrawLines( wxList *points, long xoffset, long yoffset ) { - if (!Ok()) return; + wxCHECK_RET( Ok(), "invalid window dc" ); if (m_pen.GetStyle() == wxTRANSPARENT) return; @@ -300,9 +301,9 @@ void wxWindowDC::DrawLines( wxList *points, long xoffset, long yoffset ) 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; @@ -334,10 +335,10 @@ void wxWindowDC::DrawPolygon( int n, wxPoint points[], long xoffset, long yoffse 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(); @@ -375,7 +376,7 @@ void wxWindowDC::DrawPolygon( wxList *lines, long xoffset, long yoffset, int WXU 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); @@ -401,7 +402,7 @@ void wxWindowDC::DrawRectangle( long x, long y, long width, long height ) void wxWindowDC::DrawRoundedRectangle( long x, long y, long width, long height, double radius ) { - if (!Ok()) return; + wxCHECK_RET( Ok(), "invalid window dc" ); if (radius < 0.0) radius = - radius * ((width < height) ? width : height); @@ -470,7 +471,7 @@ void wxWindowDC::DrawRoundedRectangle( long x, long y, long width, long 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); @@ -491,55 +492,47 @@ void wxWindowDC::DrawEllipse( long x, long y, long width, long height ) CalcBoundingBox( x + width, y + height ); } -bool wxWindowDC::CanDrawBitmap(void) const +bool wxWindowDC::CanDrawBitmap() const { - return TRUE; + return TRUE; } void wxWindowDC::DrawIcon( const wxIcon &icon, long x, long y ) { - 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) { @@ -547,7 +540,7 @@ void wxWindowDC::DrawBitmap( const wxBitmap &bitmap, long x, long y, bool useMas 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) @@ -557,19 +550,20 @@ void wxWindowDC::DrawBitmap( const wxBitmap &bitmap, long x, long y, bool useMas } 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) @@ -586,11 +580,11 @@ bool wxWindowDC::Blit( long xdest, long ydest, long width, long height, 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, @@ -600,10 +594,11 @@ bool wxWindowDC::Blit( long xdest, long ydest, long width, long height, 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; } @@ -618,8 +613,8 @@ bool wxWindowDC::Blit( long xdest, long ydest, long width, long height, 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, @@ -632,15 +627,16 @@ bool wxWindowDC::Blit( long xdest, long ydest, long width, long height, 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), @@ -648,20 +644,13 @@ bool wxWindowDC::Blit( long xdest, long ydest, long width, long height, 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 ); @@ -696,7 +685,7 @@ void wxWindowDC::DrawText( const wxString &text, long x, long y, bool WXUNUSED(u CalcBoundingBox (x, y); } -bool wxWindowDC::CanGetTextExtent(void) const +bool wxWindowDC::CanGetTextExtent() const { return TRUE; } @@ -705,7 +694,7 @@ void wxWindowDC::GetTextExtent( const wxString &string, long *width, long *heigh 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; @@ -717,25 +706,25 @@ void wxWindowDC::GetTextExtent( const wxString &string, long *width, long *heigh 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) { @@ -751,15 +740,15 @@ void wxWindowDC::Clear(void) 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; @@ -814,7 +803,7 @@ void wxWindowDC::SetPen( const wxPen &pen ) void wxWindowDC::SetBrush( const wxBrush &brush ) { - if (!Ok()) return; + wxCHECK_RET( Ok(), "invalid window dc" ); if (m_brush == brush) return; @@ -849,11 +838,12 @@ void wxWindowDC::SetBrush( const wxBrush &brush ) } } -// 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; @@ -893,7 +883,10 @@ void wxWindowDC::SetBackground( const wxBrush &brush ) void wxWindowDC::SetLogicalFunction( int function ) { + wxCHECK_RET( Ok(), "invalid window dc" ); + if (m_logicalFunction == function) return; + GdkFunction mode = GDK_COPY; switch (function) { @@ -901,6 +894,7 @@ void wxWindowDC::SetLogicalFunction( int 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 ); @@ -909,7 +903,7 @@ void wxWindowDC::SetLogicalFunction( int function ) void wxWindowDC::SetTextForeground( const wxColour &col ) { - if (!Ok()) return; + wxCHECK_RET( Ok(), "invalid window dc" ); if (m_textForegroundColour == col) return; @@ -922,7 +916,7 @@ void wxWindowDC::SetTextForeground( const wxColour &col ) void wxWindowDC::SetTextBackground( const wxColour &col ) { - if (!Ok()) return; + wxCHECK_RET( Ok(), "invalid window dc" ); if (m_textBackgroundColour == col) return; @@ -935,10 +929,13 @@ void wxWindowDC::SetTextBackground( const wxColour &col ) 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, @@ -948,10 +945,13 @@ void wxWindowDC::SetBackgroundMode( int mode ) 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; @@ -967,6 +967,8 @@ void wxWindowDC::SetClippingRegion( long x, long y, long width, long height ) void wxWindowDC::SetClippingRegion( const wxRegion ®ion ) { + wxCHECK_RET( Ok(), "invalid window dc" ); + if (region.Empty()) { DestroyClippingRegion(); @@ -979,8 +981,10 @@ void wxWindowDC::SetClippingRegion( const wxRegion ®ion ) 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 ); @@ -989,7 +993,7 @@ void wxWindowDC::DestroyClippingRegion(void) gdk_gc_set_clip_rectangle( m_bgGC, (GdkRectangle *) NULL ); } -void wxWindowDC::SetUpDC(void) +void wxWindowDC::SetUpDC() { Destroy(); m_ok = TRUE; @@ -1034,7 +1038,7 @@ void wxWindowDC::SetUpDC(void) } } -void wxWindowDC::Destroy(void) +void wxWindowDC::Destroy() { if (m_penGC) gdk_gc_unref( m_penGC ); m_penGC = (GdkGC*) NULL; @@ -1046,7 +1050,7 @@ void wxWindowDC::Destroy(void) m_bgGC = (GdkGC*) NULL; } -GdkWindow *wxWindowDC::GetWindow(void) +GdkWindow *wxWindowDC::GetWindow() { return m_window; } @@ -1055,7 +1059,7 @@ GdkWindow *wxWindowDC::GetWindow(void) 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, @@ -1106,7 +1110,7 @@ static Stack wx_spline_stack[SPLINE_STACK_DEPTH]; 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; @@ -1168,6 +1172,8 @@ static void wx_spline_draw_point_array(wxDC *dc) 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; @@ -1223,7 +1229,7 @@ void wxWindowDC::DrawSpline( wxList *points ) IMPLEMENT_DYNAMIC_CLASS(wxPaintDC,wxWindowDC) -wxPaintDC::wxPaintDC(void) +wxPaintDC::wxPaintDC() : wxWindowDC() { } @@ -1239,7 +1245,7 @@ wxPaintDC::wxPaintDC( wxWindow *win ) IMPLEMENT_DYNAMIC_CLASS(wxClientDC,wxWindowDC) -wxClientDC::wxClientDC(void) +wxClientDC::wxClientDC() : wxWindowDC() { } diff --git a/src/gtk1/dcmemory.cpp b/src/gtk1/dcmemory.cpp index c41cb02348..e996334c00 100644 --- a/src/gtk1/dcmemory.cpp +++ b/src/gtk1/dcmemory.cpp @@ -19,62 +19,62 @@ 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; + } } diff --git a/src/gtk1/dcps.cpp b/src/gtk1/dcps.cpp index 5530fdaeab..d4362ef4a4 100644 --- a/src/gtk1/dcps.cpp +++ b/src/gtk1/dcps.cpp @@ -254,6 +254,11 @@ wxPostScriptDC::~wxPostScriptDC () 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), @@ -299,14 +304,14 @@ bool wxPostScriptDC::PrinterDialog(wxWindow *parent) 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 ); @@ -326,7 +331,7 @@ void wxPostScriptDC::SetClippingRegion( const wxRegion &WXUNUSED(region) ) void wxPostScriptDC::DestroyClippingRegion() { - if (!m_pstream) return; + wxCHECK_RET( Ok(), "invalid postscript dc" ); wxDC::DestroyClippingRegion(); @@ -360,7 +365,7 @@ void wxPostScriptDC::CrossHair (long WXUNUSED(x), long WXUNUSED(y)) 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; @@ -379,8 +384,8 @@ void wxPostScriptDC::DrawLine (long x1, long y1, long x2, long y2) 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); @@ -442,8 +447,8 @@ void wxPostScriptDC::DrawArc (long x1, long y1, long x2, long y2, long xc, long 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; @@ -484,7 +489,7 @@ void wxPostScriptDC::DrawEllipticArc(long x,long y,long w,long h,double sa,doubl void wxPostScriptDC::DrawPoint (long x, long y) { - if (!m_pstream) return; + wxCHECK_RET( Ok(), "invalid postscript dc" ); if (m_pen.GetStyle() == wxTRANSPARENT) return; @@ -500,8 +505,8 @@ void wxPostScriptDC::DrawPoint (long x, long y) 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) @@ -550,8 +555,8 @@ void wxPostScriptDC::DrawPolygon (int n, wxPoint points[], long xoffset, long yo 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; @@ -577,7 +582,7 @@ void wxPostScriptDC::DrawLines (int n, wxPoint points[], long xoffset, long yoff 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) { @@ -614,8 +619,8 @@ void wxPostScriptDC::DrawRectangle (long x, long y, long width, long height) 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 @@ -675,8 +680,8 @@ void wxPostScriptDC::DrawRoundedRectangle (long x, long y, long width, long heig 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); @@ -706,6 +711,8 @@ void wxPostScriptDC::DrawEllipse (long x, long y, long width, long height) 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); @@ -713,6 +720,8 @@ void wxPostScriptDC::DrawIcon (const wxIcon& icon, long x, long y) 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 ); @@ -720,8 +729,8 @@ void wxPostScriptDC::DrawBitmap( const wxBitmap& bitmap, long x, long y, bool us void wxPostScriptDC::SetFont (const wxFont& font) { - if (!m_pstream) return; - + wxCHECK_RET( Ok(), "invalid postscript dc" ); + if (!font.Ok()) return; m_font = font; @@ -739,8 +748,8 @@ void wxPostScriptDC::SetFont (const wxFont& 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(); @@ -818,8 +827,8 @@ void wxPostScriptDC::SetPen( const wxPen& pen ) void wxPostScriptDC::SetBrush( const wxBrush& brush ) { - if (!m_pstream) return; - + wxCHECK_RET( Ok(), "invalid postscript dc" ); + if (!brush.Ok()) return; m_brush = brush; @@ -857,8 +866,8 @@ void wxPostScriptDC::SetBrush( const wxBrush& 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 ()) @@ -952,7 +961,7 @@ void wxPostScriptDC::SetLogicalFunction (int WXUNUSED(function)) void wxPostScriptDC::DrawSpline( wxList *points ) { - if (!m_pstream) return; + wxCHECK_RET( Ok(), "invalid postscript dc" ); SetPen( m_pen ); @@ -1015,6 +1024,8 @@ long wxPostScriptDC::GetCharWidth () void wxPostScriptDC::SetAxisOrientation( bool xLeftRight, bool yBottomUp ) { + wxCHECK_RET( Ok(), "invalid postscript dc" ); + m_signX = (xLeftRight ? 1 : -1); m_signY = (yBottomUp ? 1 : -1); @@ -1023,15 +1034,19 @@ void wxPostScriptDC::SetAxisOrientation( bool xLeftRight, bool yBottomUp ) 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"); @@ -1042,18 +1057,20 @@ void wxPostScriptDC::GetSize(int* width, int* height) const 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"); @@ -1092,7 +1109,7 @@ bool wxPostScriptDC::StartDoc (const wxString& message) void wxPostScriptDC::EndDoc () { - if (!m_pstream) return; + wxCHECK_RET( Ok(), "invalid postscript dc" ); if (m_clipping) { @@ -1249,7 +1266,7 @@ void wxPostScriptDC::EndDoc () void wxPostScriptDC::StartPage () { - if (!m_pstream) return; + wxCHECK_RET( Ok(), "invalid postscript dc" ); *m_pstream << "%%Page: " << (wxPageNumber++) << "\n"; @@ -1285,7 +1302,7 @@ void wxPostScriptDC::StartPage () void wxPostScriptDC::EndPage () { - if (!m_pstream) return; + wxCHECK_RET( Ok(), "invalid postscript dc" ); *m_pstream << "showpage\n"; } @@ -1293,6 +1310,8 @@ void wxPostScriptDC::EndPage () 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; } @@ -1586,13 +1605,13 @@ void wxPostScriptDC::GetSizeMM(long *width, long *height) const 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; } } diff --git a/src/gtk1/dcscreen.cpp b/src/gtk1/dcscreen.cpp index 4bab18b379..bdb29ad1bd 100644 --- a/src/gtk1/dcscreen.cpp +++ b/src/gtk1/dcscreen.cpp @@ -245,51 +245,53 @@ IMPLEMENT_DYNAMIC_CLASS(wxScreenDC,wxPaintDC) 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 ) @@ -329,12 +331,12 @@ 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; } -- 2.45.2