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
This commit is contained in:
parent
c19a8a9a71
commit
4bc67cc550
@ -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;
|
||||
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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 );
|
||||
};
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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; }
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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 );
|
||||
};
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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; }
|
||||
|
@ -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 );
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
|
@ -21,6 +21,7 @@
|
||||
#include "wx/settings.h"
|
||||
#include "wx/resource.h"
|
||||
#include "wx/module.h"
|
||||
#include "wx/image.h"
|
||||
|
||||
#include "unistd.h"
|
||||
|
||||
|
@ -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_RET( bitmap.Ok(), "invalid bitmap" );
|
||||
|
||||
GdkImage *gdk_image = gdk_image_get( bitmap.GetPixmap(),
|
||||
0, 0,
|
||||
bitmap.GetWidth(), bitmap.GetHeight() );
|
||||
|
||||
wxCHECK_RET( gdk_image, "couldn't create image" );
|
||||
|
||||
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() );
|
||||
|
||||
wxCHECK_MSG( Ok(), image, "invalid bitmap" );
|
||||
SetMaskColour( 16, 16, 16 ); // anything unlikely and dividable
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
image.Create( M_BMPDATA->m_width, M_BMPDATA->m_height );
|
||||
char unsigned *data = image.GetData();
|
||||
|
||||
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;
|
||||
@ -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 );
|
||||
}
|
||||
|
||||
|
||||
|
364
src/gtk/dc.cpp
364
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 );
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
@ -13,6 +13,7 @@
|
||||
|
||||
#include "wx/dcclient.h"
|
||||
#include "wx/dcmemory.h"
|
||||
#include "wx/image.h"
|
||||
#include <math.h>
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
@ -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;
|
||||
|
||||
if (!icon.Ok()) return;
|
||||
|
||||
int xx = XLOG2DEV(x);
|
||||
int yy = YLOG2DEV(y);
|
||||
|
||||
GdkBitmap *mask = (GdkBitmap *) NULL;
|
||||
if (icon.GetMask()) mask = icon.GetMask()->GetBitmap();
|
||||
|
||||
if (mask)
|
||||
{
|
||||
gdk_gc_set_clip_mask( m_penGC, mask );
|
||||
gdk_gc_set_clip_origin( m_penGC, xx, yy );
|
||||
}
|
||||
|
||||
GdkPixmap *pm = icon.GetPixmap();
|
||||
gdk_draw_pixmap( m_window, m_penGC, pm, 0, 0, xx, yy, -1, -1 );
|
||||
|
||||
if (mask)
|
||||
{
|
||||
gdk_gc_set_clip_mask( m_penGC, (GdkBitmap *) NULL );
|
||||
gdk_gc_set_clip_origin( m_penGC, 0, 0 );
|
||||
}
|
||||
|
||||
CalcBoundingBox( x, y );
|
||||
int width = icon.GetWidth();
|
||||
int height = icon.GetHeight();
|
||||
CalcBoundingBox( x + width, y + height );
|
||||
DrawBitmap( icon, x, y, TRUE );
|
||||
}
|
||||
|
||||
void wxWindowDC::DrawBitmap( const wxBitmap &bitmap, long x, long y, bool useMask )
|
||||
{
|
||||
if (!Ok()) return;
|
||||
wxCHECK_RET( Ok(), "invalid window dc" );
|
||||
|
||||
if (!bitmap.Ok()) return;
|
||||
|
||||
int xx = XLOG2DEV(x);
|
||||
int yy = YLOG2DEV(y);
|
||||
|
||||
int w = bitmap.GetWidth();
|
||||
int h = bitmap.GetHeight();
|
||||
|
||||
int ww = XLOG2DEVREL(w);
|
||||
int hh = YLOG2DEVREL(h);
|
||||
|
||||
wxBitmap use_bitmap;
|
||||
|
||||
if ((w != ww) || (h != hh))
|
||||
{
|
||||
wxImage image( bitmap );
|
||||
image = image.Scale( ww, hh );
|
||||
|
||||
use_bitmap = image.ConvertToBitmap();
|
||||
}
|
||||
else
|
||||
{
|
||||
use_bitmap = bitmap;
|
||||
}
|
||||
|
||||
GdkBitmap *mask = (GdkBitmap *) NULL;
|
||||
if (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()
|
||||
{
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
105
src/gtk/dcps.cpp
105
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -21,6 +21,7 @@
|
||||
#include "wx/settings.h"
|
||||
#include "wx/resource.h"
|
||||
#include "wx/module.h"
|
||||
#include "wx/image.h"
|
||||
|
||||
#include "unistd.h"
|
||||
|
||||
|
@ -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_RET( bitmap.Ok(), "invalid bitmap" );
|
||||
|
||||
GdkImage *gdk_image = gdk_image_get( bitmap.GetPixmap(),
|
||||
0, 0,
|
||||
bitmap.GetWidth(), bitmap.GetHeight() );
|
||||
|
||||
wxCHECK_RET( gdk_image, "couldn't create image" );
|
||||
|
||||
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() );
|
||||
|
||||
wxCHECK_MSG( Ok(), image, "invalid bitmap" );
|
||||
SetMaskColour( 16, 16, 16 ); // anything unlikely and dividable
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
image.Create( M_BMPDATA->m_width, M_BMPDATA->m_height );
|
||||
char unsigned *data = image.GetData();
|
||||
|
||||
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;
|
||||
@ -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 );
|
||||
}
|
||||
|
||||
|
||||
|
364
src/gtk1/dc.cpp
364
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 );
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
@ -13,6 +13,7 @@
|
||||
|
||||
#include "wx/dcclient.h"
|
||||
#include "wx/dcmemory.h"
|
||||
#include "wx/image.h"
|
||||
#include <math.h>
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
@ -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;
|
||||
|
||||
if (!icon.Ok()) return;
|
||||
|
||||
int xx = XLOG2DEV(x);
|
||||
int yy = YLOG2DEV(y);
|
||||
|
||||
GdkBitmap *mask = (GdkBitmap *) NULL;
|
||||
if (icon.GetMask()) mask = icon.GetMask()->GetBitmap();
|
||||
|
||||
if (mask)
|
||||
{
|
||||
gdk_gc_set_clip_mask( m_penGC, mask );
|
||||
gdk_gc_set_clip_origin( m_penGC, xx, yy );
|
||||
}
|
||||
|
||||
GdkPixmap *pm = icon.GetPixmap();
|
||||
gdk_draw_pixmap( m_window, m_penGC, pm, 0, 0, xx, yy, -1, -1 );
|
||||
|
||||
if (mask)
|
||||
{
|
||||
gdk_gc_set_clip_mask( m_penGC, (GdkBitmap *) NULL );
|
||||
gdk_gc_set_clip_origin( m_penGC, 0, 0 );
|
||||
}
|
||||
|
||||
CalcBoundingBox( x, y );
|
||||
int width = icon.GetWidth();
|
||||
int height = icon.GetHeight();
|
||||
CalcBoundingBox( x + width, y + height );
|
||||
DrawBitmap( icon, x, y, TRUE );
|
||||
}
|
||||
|
||||
void wxWindowDC::DrawBitmap( const wxBitmap &bitmap, long x, long y, bool useMask )
|
||||
{
|
||||
if (!Ok()) return;
|
||||
wxCHECK_RET( Ok(), "invalid window dc" );
|
||||
|
||||
if (!bitmap.Ok()) return;
|
||||
|
||||
int xx = XLOG2DEV(x);
|
||||
int yy = YLOG2DEV(y);
|
||||
|
||||
int w = bitmap.GetWidth();
|
||||
int h = bitmap.GetHeight();
|
||||
|
||||
int ww = XLOG2DEVREL(w);
|
||||
int hh = YLOG2DEVREL(h);
|
||||
|
||||
wxBitmap use_bitmap;
|
||||
|
||||
if ((w != ww) || (h != hh))
|
||||
{
|
||||
wxImage image( bitmap );
|
||||
image = image.Scale( ww, hh );
|
||||
|
||||
use_bitmap = image.ConvertToBitmap();
|
||||
}
|
||||
else
|
||||
{
|
||||
use_bitmap = bitmap;
|
||||
}
|
||||
|
||||
GdkBitmap *mask = (GdkBitmap *) NULL;
|
||||
if (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()
|
||||
{
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user