X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4dbd4ee6042dd8da797a790e53abcfe32b27bb7b..fb20fa43a07ce52feb43a4b26514fc7a6a11a6f5:/contrib/include/wx/canvas/canvas.h diff --git a/contrib/include/wx/canvas/canvas.h b/contrib/include/wx/canvas/canvas.h index 47f2fb563b..f1255760b3 100644 --- a/contrib/include/wx/canvas/canvas.h +++ b/contrib/include/wx/canvas/canvas.h @@ -19,10 +19,16 @@ #include "wx/image.h" #include "wx/txtstrm.h" - -class wxCanvas; +#include "wx/geometry.h" + + +//---------------------------------------------------------------------------- +// decls +//---------------------------------------------------------------------------- -// WDR: class declarations +#define IMAGE_CANVAS 0 + +class wxCanvas; //---------------------------------------------------------------------------- // wxCanvasObject @@ -32,20 +38,20 @@ class wxCanvasObject: public wxEvtHandler { public: wxCanvasObject(); - + // Area occupied by object. Used for clipping, intersection, // mouse enter etc. Screen coordinates void SetArea( int x, int y, int width, int height ); void SetArea( wxRect rect ); - + // These are for screen output only therefore use // int as coordinates. virtual bool IsHit( int x, int y, int margin = 0 ); - virtual void Render( int clip_x, int clip_y, int clip_width, int clip_height ); - + virtual void Render(int xabs, int yabs, int clip_x, int clip_y, int clip_width, int clip_height ); + // use doubles later virtual void Move( int x, int y ); - + // Once we have world coordinates in doubles, this will get // called for every object if the world coordinate system // changes (zooming). @@ -53,10 +59,10 @@ public: // Later... virtual void WriteSVG( wxTextOutputStream &stream ); - - wxCanvas *GetOwner() { return m_owner; } - void SetOwner( wxCanvas *owner ) { m_owner = owner; } - + + wxCanvas *GetOwner() { return m_owner; } + virtual void SetOwner( wxCanvas *owner ) { m_owner = owner; } + bool IsControl() { return m_isControl; } bool IsVector() { return m_isVector; } bool IsImage() { return m_isImage; } @@ -65,16 +71,179 @@ public: inline int GetWidth() { return m_area.width; } inline int GetHeight() { return m_area.height; } + void CaptureMouse(); + void ReleaseMouse(); + bool IsCapturedMouse(); + protected: wxCanvas *m_owner; bool m_isControl; bool m_isVector; bool m_isImage; + + //relative boundingbox in parent in pixels wxRect m_area; - + + friend class wxCanvas; +}; + +//---------------------------------------------------------------------------- +// wxCanvasObjectGroup +//---------------------------------------------------------------------------- + +class wxCanvasObjectGroup +{ +public: + wxCanvasObjectGroup(); + virtual ~wxCanvasObjectGroup(); + + void SetOwner(wxCanvas* canvas); + wxCanvas *GetOwner() { return m_owner; } + + virtual void Prepend( wxCanvasObject* obj ); + virtual void Append( wxCanvasObject* obj ); + virtual void Insert( size_t before, wxCanvasObject* obj ); + virtual void Remove( wxCanvasObject* obj ); + + virtual void Recreate(); + void DeleteContents( bool ); + virtual void Render(int xabs, int yabs,int x, int y, int width, int height ); + virtual void WriteSVG( wxTextOutputStream &stream ); + virtual bool IsHit( int x, int y, int margin ); + virtual wxCanvasObject* IsHitObject( int x, int y, int margin ); + + void ExtendArea(double x, double y); + + inline double GetXMin() { return m_minx; } + inline double GetYMin() { return m_miny; } + inline double GetXMax() { return m_maxx; } + inline double GetYMax() { return m_maxy; } + +protected: + wxCanvas *m_owner; + + //bounding box + double m_minx; + double m_miny; + double m_maxx; + double m_maxy; + bool m_validbounds; + + wxList m_objects; + friend class wxCanvas; }; +//---------------------------------------------------------------------------- +// wxCanvasObjectGroupRef +//---------------------------------------------------------------------------- + +class wxCanvasObjectGroupRef: public wxCanvasObject +{ +public: + wxCanvasObjectGroupRef(double x, double y,wxCanvasObjectGroup* group); + + void SetOwner(wxCanvas* canvas); + + virtual void Recreate(); + virtual void Render(int xabs, int yabs,int x, int y, int width, int height ); + virtual void WriteSVG( wxTextOutputStream &stream ); + virtual bool IsHit( int x, int y, int margin ); + void Move( int x, int y ); + + inline double GetPosX() { return m_x; } + inline double GetPosY() { return m_y; } + + void ExtendArea(double x, double y); + virtual wxCanvasObject* IsHitObject( int x, int y, int margin ); + +protected: + //position of the group + double m_x; + double m_y; + + //reference to the group + wxCanvasObjectGroup* m_group; + + //bounding box + double m_minx; + double m_miny; + double m_maxx; + double m_maxy; + bool m_validbounds; + +}; + +//---------------------------------------------------------------------------- +// wxCanvasPolygon +//---------------------------------------------------------------------------- + +class wxCanvasPolygon: public wxCanvasObject +{ +public: + wxCanvasPolygon( int n, wxPoint2DDouble points[] ); + ~wxCanvasPolygon(); + void SetBrush(wxBrush& brush) { m_brush = brush; }; + void SetPen(wxPen& pen) { m_pen = pen; }; + + virtual void Recreate(); + + virtual void Render(int xabs, int yabs, int clip_x, int clip_y, int clip_width, int clip_height ); + virtual void WriteSVG( wxTextOutputStream &stream ); + +private: + void ExtendArea(double x, double y); + + wxBrush m_brush; + wxPen m_pen; + + int m_n; + wxPoint2DDouble* m_points; + + //bounding box + double m_minx; + double m_miny; + double m_maxx; + double m_maxy; + bool m_validbounds; + +}; + +//---------------------------------------------------------------------------- +// wxCanvasPolyline +//---------------------------------------------------------------------------- + +class wxCanvasPolyline: public wxCanvasObject +{ +public: + wxCanvasPolyline(int n, wxPoint2DDouble points[]); + ~wxCanvasPolyline(); + void SetPen(wxPen& pen) { m_pen = pen; }; + + virtual void Recreate(); + + virtual void Render(int xabs, int yabs, int clip_x, int clip_y, int clip_width, int clip_height ); + virtual void WriteSVG( wxTextOutputStream &stream ); + +private: + void ExtendArea(double x, double y); + + wxPen m_pen; + + int m_n; + wxPoint2DDouble* m_points; + + //bounding box + double m_minx; + double m_miny; + double m_maxx; + double m_maxy; + bool m_validbounds; + +}; + + + //---------------------------------------------------------------------------- // wxCanvasRect //---------------------------------------------------------------------------- @@ -82,23 +251,23 @@ protected: class wxCanvasRect: public wxCanvasObject { public: - wxCanvasRect( double x, double y, double w, double h, - unsigned char red, unsigned char green, unsigned char blue ); - + wxCanvasRect( double x, double y, double w, double h ); + void SetBrush(wxBrush& brush) { m_brush = brush; }; + void SetPen(wxPen& pen) { m_pen = pen; }; + virtual void Recreate(); - - virtual void Render( int clip_x, int clip_y, int clip_width, int clip_height ); + + virtual void Render(int xabs, int yabs, int clip_x, int clip_y, int clip_width, int clip_height ); virtual void WriteSVG( wxTextOutputStream &stream ); - + private: + wxPen m_pen; + wxBrush m_brush; + double m_x; double m_y; double m_width; - double m_height; - - unsigned char m_red; - unsigned char m_green; - unsigned char m_blue; + double m_height; }; //---------------------------------------------------------------------------- @@ -108,23 +277,21 @@ private: class wxCanvasLine: public wxCanvasObject { public: - wxCanvasLine( double x1, double y1, double x1, double y1, - unsigned char red, unsigned char green, unsigned char blue ); - + wxCanvasLine( double x1, double y1, double x2, double y2 ); + void SetPen(wxPen& pen) { m_pen = pen; }; + virtual void Recreate(); - - virtual void Render( int clip_x, int clip_y, int clip_width, int clip_height ); + + virtual void Render(int xabs, int yabs, int clip_x, int clip_y, int clip_width, int clip_height ); virtual void WriteSVG( wxTextOutputStream &stream ); private: + wxPen m_pen; + double m_x1; double m_y1; double m_x2; double m_y2; - - unsigned char m_red; - unsigned char m_green; - unsigned char m_blue; }; //---------------------------------------------------------------------------- @@ -138,7 +305,7 @@ public: virtual void Recreate(); - virtual void Render( int clip_x, int clip_y, int clip_width, int clip_height ); + virtual void Render(int xabs, int yabs, int clip_x, int clip_y, int clip_width, int clip_height ); virtual void WriteSVG( wxTextOutputStream &stream ); private: @@ -148,7 +315,11 @@ private: double m_height; wxImage m_image; +#if IMAGE_CANVAS wxImage m_tmp; +#else + wxBitmap m_tmp; +#endif }; //---------------------------------------------------------------------------- @@ -178,16 +349,16 @@ class wxCanvasText: public wxCanvasObject public: wxCanvasText( const wxString &text, double x, double y, const wxString &foneFile, int size ); ~wxCanvasText(); - + void Recreate(); - - virtual void Render( int clip_x, int clip_y, int clip_width, int clip_height ); + + virtual void Render(int xabs, int yabs, int clip_x, int clip_y, int clip_width, int clip_height ); virtual void WriteSVG( wxTextOutputStream &stream ); void SetRGB( unsigned char red, unsigned char green, unsigned char blue ); void SetFlag( int flag ); int GetFlag() { return m_flag; } - + private: wxString m_text; double m_x; @@ -215,50 +386,72 @@ public: const wxSize& size = wxDefaultSize, long style = wxScrolledWindowStyle ); virtual ~wxCanvas(); - + virtual void SetArea( int width, int height ); virtual void SetColour( unsigned char red, unsigned char green, unsigned char blue ); - virtual void Update( int x, int y, int width, int height ); + virtual void Update( int x, int y, int width, int height, bool blit = TRUE ); virtual void UpdateNow(); - + virtual void Freeze(); virtual void Thaw(); - + virtual void Prepend( wxCanvasObject* obj ); virtual void Append( wxCanvasObject* obj ); virtual void Insert( size_t before, wxCanvasObject* obj ); virtual void Remove( wxCanvasObject* obj ); - + // override these to change your coordiate system ... virtual int GetDeviceX( double x ); virtual int GetDeviceY( double y ); virtual int GetDeviceWidth( double width ); virtual int GetDeviceHeight( double height ); - + // ... and call this to tell all objets to recreate then virtual void Recreate(); - void CaptureMouse( wxCanvasObject *obj ); - void ReleaseMouse(); +#if IMAGE_CANVAS + inline wxImage *GetBuffer() { return &m_buffer; } +#else + inline wxBitmap *GetBuffer() { return &m_buffer; } + inline wxMemoryDC *GetDC() { return m_renderDC; } +#endif + inline int GetBufferX() { return m_bufferX; } + inline int GetBufferY() { return m_bufferY; } + inline int GetBufferWidth() { return m_buffer.GetWidth(); } + inline int GetBufferHeight() { return m_buffer.GetHeight(); } - wxImage *GetBuffer() { return &m_buffer; } bool NeedUpdate() { return m_needUpdate; } bool IsFrozen() { return m_frozen; } - + void BlitBuffer( wxDC &dc ); - + + void SetCaptureMouse( wxCanvasObject *obj ); + + virtual void ScrollWindow( int dx, int dy, + const wxRect* rect = (wxRect *) NULL ); + private: +#if IMAGE_CANVAS wxImage m_buffer; +#else + wxBitmap m_buffer; + wxMemoryDC *m_renderDC; +#endif + int m_bufferX; + int m_bufferY; bool m_needUpdate; wxList m_updateRects; - wxList m_objects; + wxCanvasObjectGroup* m_root; + unsigned char m_green,m_red,m_blue; bool m_frozen; wxCanvasObject *m_lastMouse; wxCanvasObject *m_captureMouse; + int m_oldDeviceX,m_oldDeviceY; + friend class wxCanvasObject; - + private: void OnChar( wxKeyEvent &event ); void OnPaint( wxPaintEvent &event ); @@ -267,6 +460,7 @@ private: void OnIdle( wxIdleEvent &event ); void OnSetFocus( wxFocusEvent &event ); void OnKillFocus( wxFocusEvent &event ); + void OnEraseBackground( wxEraseEvent &event ); private: DECLARE_CLASS(wxCanvas)