#include "wx/image.h"
#include "wx/txtstrm.h"
+#include "wx/geometry.h"
+
//----------------------------------------------------------------------------
// decls
virtual bool IsHit( int x, int y, int margin );
virtual wxCanvasObject* IsHitObject( int x, int y, int margin );
- void ExtendArea(int x, int y);
+ void ExtendArea(double x, double y);
inline int GetXMin() { return m_minx; }
inline int GetYMin() { return m_miny; }
inline int GetPosX() { return m_x; }
inline int GetPosY() { return m_y; }
- void ExtendArea(int x, int y);
+ void ExtendArea(double x, double y);
virtual wxCanvasObject* IsHitObject( int x, int y, int margin );
protected:
};
+//----------------------------------------------------------------------------
+// wxCanvasPolygon
+//----------------------------------------------------------------------------
+
+class wxCanvasPolygon: public wxCanvasObject
+{
+public:
+ wxCanvasPolygon(int n, wxPoint2DDouble points[]);
+ ~wxCanvasPolygon();
+ SetBrush(wxBrush& brush){m_brush = brush;};
+ 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();
+ 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
//----------------------------------------------------------------------------
{
int old_x = m_area.x;
int old_y = m_area.y;
-
+
m_area.x = x;
m_area.y = y;
}
}
-void wxCanvasObjectGroup::ExtendArea(int x, int y)
+void wxCanvasObjectGroup::ExtendArea(double x, double y)
{
if (m_validbounds)
{
}
node = node->Previous();
}
-
+
return (wxCanvasObject*) NULL;
}
m_group->SetOwner(canvas);
}
-void wxCanvasObjectGroupRef::ExtendArea(int x, int y)
+void wxCanvasObjectGroupRef::ExtendArea(double x, double y)
{
if (m_validbounds)
{
void wxCanvasObjectGroupRef::Render(int xabs, int yabs, int x, int y, int width, int height )
{
- xabs += m_owner->GetDeviceX(GetPosX());
- yabs += m_owner->GetDeviceY(GetPosY());
+ xabs += m_owner->GetDeviceX(m_x);
+ yabs += m_owner->GetDeviceY(m_y);
int clip_x = xabs + m_group->GetXMin();
int clip_width = m_group->GetXMax()-m_group->GetXMin();
m_x = x;
m_y = y;
- if (!m_isControl)
+ int old_area_x = m_area.x;
+ int old_area_y = m_area.y;
+
+ m_area.x=m_owner->GetDeviceX( m_x + m_minx );
+ m_area.y=m_owner->GetDeviceY( m_y + m_miny );
+
+ int leftu,rightu,bottomu,topu ;
+ leftu = wxMin (m_area.x, old_area_x ) ;
+ rightu = wxMax (old_area_x + m_area.width, m_area.x + m_area.width) ;
+ topu = wxMin (m_area.y,old_area_y) ;
+ bottomu = wxMax (old_area_y + m_area.height, m_area.y + m_area.height) ;
+
+ if ( rightu - leftu < 2*m_area.width && bottomu - topu < 2*m_area.height )
{
- // TODO: sometimes faster to merge into 1 Update or
- // to break up into four
- m_owner->Update(m_area.x, m_area.y, m_area.width, m_area.height );
- //calculate the new area in pixels relative to the parent
- SetArea( m_owner->GetDeviceX( m_x + m_minx ),
- m_owner->GetDeviceY( m_y + m_miny ),
- m_owner->GetDeviceWidth( m_maxx-m_minx ),
- m_owner->GetDeviceHeight( m_maxy-m_miny ) );
+ m_owner->Update(leftu,topu,rightu - leftu,bottomu - topu);
+ }
+ else
+ {
+ m_owner->Update(old_area_x, old_area_y, m_area.width, m_area.height );
m_owner->Update( m_area.x, m_area.y, m_area.width, m_area.height );
}
}
+//----------------------------------------------------------------------------
+// wxCanvasPolyline
+//----------------------------------------------------------------------------
+
+wxCanvasPolyline::wxCanvasPolyline( int n, wxPoint2DDouble points[])
+ : wxCanvasObject()
+{
+ m_n = n;
+ m_points = points;
+ m_pen = wxPen(wxColour(0,0,0),1,wxSOLID);
+}
+
+wxCanvasPolyline::~wxCanvasPolyline()
+{
+ delete m_points;
+}
+
+void wxCanvasPolyline::ExtendArea(double x, double y)
+{
+ if (m_validbounds)
+ {
+ 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;
+ }
+ else
+ {
+ m_validbounds = TRUE;
+
+ m_minx = x;
+ m_miny = y;
+ m_maxx = x;
+ m_maxy = y;
+ }
+}
+
+void wxCanvasPolyline::Recreate()
+{
+
+ m_validbounds=FALSE;
+ int i;
+ for (i=0; i < m_n;i++)
+ {
+ ExtendArea(m_points[i].m_x,m_points[i].m_y);
+ }
+
+ //include the pen width also
+ ExtendArea(m_minx -m_pen.GetWidth(),m_miny-m_pen.GetWidth());
+ ExtendArea(m_maxx+m_pen.GetWidth()*2,m_maxy+m_pen.GetWidth()*2);
+
+ //set the area in pixels relative to the parent
+ SetArea( m_owner->GetDeviceX(m_minx ),
+ m_owner->GetDeviceY(m_miny ),
+ m_owner->GetDeviceWidth( m_maxx-m_minx ),
+ m_owner->GetDeviceHeight( m_maxy-m_miny ) );
+}
+
+void wxCanvasPolyline::Render(int xabs, int yabs, int clip_x, int clip_y, int clip_width, int clip_height )
+{
+ int buffer_x = m_owner->GetBufferX();
+ int buffer_y = m_owner->GetBufferY();
+
+ int start_y = clip_y - buffer_y;
+ int end_y = clip_y+clip_height - buffer_y;
+
+ int start_x = clip_x - buffer_x;
+ int end_x = clip_x+clip_width - buffer_x;
+
+#if IMAGE_CANVAS
+#else
+ wxPoint *cpoints = new wxPoint[m_n];
+ int i;
+ for (i = 0; i < m_n; i++)
+ {
+ cpoints[i].x = m_owner->GetDeviceX(m_points[i].m_x+xabs);
+ cpoints[i].y = m_owner->GetDeviceY(m_points[i].m_y+yabs);
+ }
+ wxMemoryDC *dc = m_owner->GetDC();
+ dc->SetClippingRegion(start_x,start_y,end_x-start_x,end_y-start_y);
+ dc->SetPen(m_pen);
+ dc->DrawLines(m_n, cpoints, 0,0);
+ delete [] cpoints;
+ dc->SetPen(wxNullPen);
+ dc->DestroyClippingRegion();
+#endif
+}
+
+void wxCanvasPolyline::WriteSVG( wxTextOutputStream &stream )
+{
+}
+
+//----------------------------------------------------------------------------
+// wxCanvasPolygon
+//----------------------------------------------------------------------------
+
+wxCanvasPolygon::wxCanvasPolygon( int n, wxPoint2DDouble points[])
+ : wxCanvasObject()
+{
+ m_n = n;
+ m_points = points;
+ m_brush = wxBrush(wxColour(0,0,0),wxSOLID);
+ m_pen = wxPen(wxColour(0,0,0),1,wxSOLID);
+}
+
+wxCanvasPolygon::~wxCanvasPolygon()
+{
+ delete m_points;
+}
+
+void wxCanvasPolygon::ExtendArea(double x, double y)
+{
+ if (m_validbounds)
+ {
+ 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;
+ }
+ else
+ {
+ m_validbounds = TRUE;
+
+ m_minx = x;
+ m_miny = y;
+ m_maxx = x;
+ m_maxy = y;
+ }
+}
+
+void wxCanvasPolygon::Recreate()
+{
+
+ m_validbounds=FALSE;
+ int i;
+ for (i=0; i < m_n;i++)
+ {
+ ExtendArea(m_points[i].m_x,m_points[i].m_y);
+ }
+
+ //include the pen width also
+ ExtendArea(m_minx -m_pen.GetWidth(),m_miny-m_pen.GetWidth());
+ ExtendArea(m_maxx+m_pen.GetWidth()*2,m_maxy+m_pen.GetWidth()*2);
+
+ //set the area in pixels relative to the parent
+ SetArea( m_owner->GetDeviceX( m_minx ),
+ m_owner->GetDeviceY( m_miny ),
+ m_owner->GetDeviceWidth( m_maxx-m_minx ),
+ m_owner->GetDeviceHeight( m_maxy-m_miny ) );
+}
+
+void wxCanvasPolygon::Render(int xabs, int yabs, int clip_x, int clip_y, int clip_width, int clip_height )
+{
+ int buffer_x = m_owner->GetBufferX();
+ int buffer_y = m_owner->GetBufferY();
+
+ int start_y = clip_y - buffer_y;
+ int end_y = clip_y+clip_height - buffer_y;
+
+ int start_x = clip_x - buffer_x;
+ int end_x = clip_x+clip_width - buffer_x;
+
+#if IMAGE_CANVAS
+#else
+ wxPoint *cpoints = new wxPoint[m_n];
+ int i;
+ for (i = 0; i < m_n; i++)
+ {
+ cpoints[i].x = m_owner->GetDeviceX(m_points[i].m_x+xabs);
+ cpoints[i].y = m_owner->GetDeviceY(m_points[i].m_y+yabs);
+ }
+ wxMemoryDC *dc = m_owner->GetDC();
+ dc->SetClippingRegion(start_x,start_y,end_x-start_x,end_y-start_y);
+ dc->SetBrush(m_brush);
+ dc->SetPen(m_pen);
+ dc->DrawPolygon(m_n, cpoints, 0,0,wxWINDING_RULE);
+ delete [] cpoints;
+ dc->SetBrush(wxNullBrush);
+ dc->SetPen(wxNullPen);
+ dc->DestroyClippingRegion();
+#endif
+}
+
+void wxCanvasPolygon::WriteSVG( wxTextOutputStream &stream )
+{
+}
+
+
//----------------------------------------------------------------------------
// wxCanvasRect
dc->SetPen( *wxTRANSPARENT_PEN );
wxBrush brush( wxColour( m_red,m_green,m_blue), wxSOLID );
dc->SetBrush( brush );
-
+
dc->DrawRectangle( clip_x-buffer_x, clip_y-buffer_y, clip_width, clip_height );
#endif
}
int y1 = yabs + m_owner->GetDeviceY( m_y1 );
int x2 = xabs + m_owner->GetDeviceX( m_x2 );
int y2 = yabs + m_owner->GetDeviceY( m_y2 );
-
+
#if IMAGE_CANVAS
wxImage *image = m_owner->GetBuffer();
if ((m_area.width == 0) && (m_area.height == 0))
#else
wxMemoryDC *dc = m_owner->GetDC();
dc->SetClippingRegion( clip_x-buffer_x, clip_y-buffer_y, clip_width, clip_height );
-
+
wxPen pen( wxColour(m_red,m_green,m_blue), 0, wxSOLID );
dc->SetPen( pen );
dc->DrawLine( x1-buffer_x, y1-buffer_y, x2-buffer_x, y2-buffer_y );
-
+
dc->DestroyClippingRegion();
#endif
}
}
#else
wxMemoryDC *dc = m_owner->GetDC();
-
+
if ((clip_x == xabs + m_area.x) &&
(clip_y == yabs + m_area.y) &&
(clip_width == m_area.width) &&
// local coordinates
int start_x = clip_x - (xabs + m_area.x);
int start_y = clip_y - (yabs + m_area.y);
-
+
// Clipping region faster ?
wxRect rect( start_x, start_y, clip_width, clip_height );
wxBitmap sub_bitmap( m_tmp.GetSubBitmap( rect ) );
m_fontFileName,
0,
&(data->m_face) );
-
+
error = FT_Set_Char_Size( data->m_face,
0,
m_size*64,
for (int yy = start_y; yy < end_y; yy++)
for (int xx = start_x; xx < end_x; xx++)
m_buffer.SetRGB( xx, yy, m_red, m_green, m_blue );
-
+
m_root->Render(0,0, x, y, width, height );
#else
wxMemoryDC dc;
m_renderDC = &dc;
m_root->Render(0,0, x, y, width, height );
-
+
dc.SelectObject( wxNullBitmap );
#endif
}
// getting the subrect first and drawing it then?
wxBitmap sub_bitmap( m_buffer.GetSubBitmap( sub_rect ) );
dc.DrawBitmap( sub_bitmap, rect->x, rect->y );
-
+
#endif
delete rect;
m_updateRects.DeleteNode( node );