]> git.saurik.com Git - wxWidgets.git/blobdiff - contrib/src/canvas/canvas.cpp
implemented (untested) work around for wxScrolledWindow painting bug
[wxWidgets.git] / contrib / src / canvas / canvas.cpp
index bb33ecd1ba3c7d24deccd438afca73f3c76d3546..7a63dc03529c7e47fa479acb7a75afb2a18e444c 100644 (file)
@@ -60,9 +60,9 @@ wxCanvasObject::wxCanvasObject()
     m_isVector = FALSE;
     m_isImage = FALSE;
     m_visible  = TRUE;
     m_isVector = FALSE;
     m_isImage = FALSE;
     m_visible  = TRUE;
-    m_dragmode = DRAG_ONTOP;
+    m_dragmode = wxDRAG_ONTOP;
 //  handy when debugging
 //  handy when debugging
-//  m_dragmode = DRAG_RECTANGLE;
+//  m_dragmode = wxDRAG_RECTANGLE;
     m_dragable = TRUE;
 }
 
     m_dragable = TRUE;
 }
 
@@ -216,7 +216,7 @@ void wxCanvasObject::MoveRelative( double x, double y )
 
 void wxCanvasObject::DragStart()
 {
 
 void wxCanvasObject::DragStart()
 {
-    if (m_dragmode == DRAG_RECTANGLE)
+    if (m_dragmode == wxDRAG_RECTANGLE)
     {
         this->SetVisible(FALSE);
         wxTransformMatrix help;
     {
         this->SetVisible(FALSE);
         wxTransformMatrix help;
@@ -236,7 +236,7 @@ void wxCanvasObject::DragStart()
         dc.SetBrush(wxNullBrush);
         dc.SetPen(wxNullPen);
     }
         dc.SetBrush(wxNullBrush);
         dc.SetPen(wxNullPen);
     }
-    else
+    else if (m_dragmode != wxDRAG_REDRAW)
     {
         this->SetVisible(FALSE);
         wxTransformMatrix help;
     {
         this->SetVisible(FALSE);
         wxTransformMatrix help;
@@ -266,7 +266,7 @@ void wxCanvasObject::DragStart()
 
 void wxCanvasObject::DragRelative( double x, double y)
 {
 
 void wxCanvasObject::DragRelative( double x, double y)
 {
-    if (m_dragmode == DRAG_RECTANGLE)
+    if (m_dragmode == wxDRAG_RECTANGLE)
     {
         wxTransformMatrix help;
 
     {
         wxTransformMatrix help;
 
@@ -285,7 +285,7 @@ void wxCanvasObject::DragRelative( double x, double y)
         dc.SetBrush(wxNullBrush);
         dc.SetPen(wxNullPen);
     }
         dc.SetBrush(wxNullBrush);
         dc.SetPen(wxNullPen);
     }
-    else
+    else if (m_dragmode != wxDRAG_REDRAW)
     {
         wxClientDC dc(m_admin->GetActive());
         wxMemoryDC tmp;
     {
         wxClientDC dc(m_admin->GetActive());
         wxMemoryDC tmp;
@@ -336,6 +336,8 @@ void wxCanvasObject::DragRelative( double x, double y)
         dcm.SelectObject(wxNullBitmap);
         this->SetVisible(FALSE);
     }
         dcm.SelectObject(wxNullBitmap);
         this->SetVisible(FALSE);
     }
+    else
+        MoveRelative(x,y);
 }
 
 
 }
 
 
@@ -676,7 +678,7 @@ wxCanvasObject* wxCanvasObjectGroup::IsHitWorld( double x, double y, double marg
 
         if (!obj->IsControl() )
         {
 
         if (!obj->IsControl() )
         {
-            if (obj->IsHitWorld(x,y,margin))
+            if (obj->IsHitWorld(xh,yh,margin))
             {
                 return obj;
             }
             {
                 return obj;
             }
@@ -1321,6 +1323,13 @@ wxCanvasImage::wxCanvasImage( const wxImage &image, double x, double y, double w
     CalcBoundingBox();
 }
 
     CalcBoundingBox();
 }
 
+void wxCanvasImage::SetPosXY( double x, double y)
+{
+    m_x = x;
+    m_y = y;
+    CalcBoundingBox();
+}
+
 void wxCanvasImage::TransLate( double x, double y )
 {
     m_x += x;
 void wxCanvasImage::TransLate( double x, double y )
 {
     m_x += x;
@@ -1337,7 +1346,7 @@ void wxCanvasImage::CalcBoundingBox()
 void wxCanvasImage::Render(wxTransformMatrix* cworld, int clip_x, int clip_y, int clip_width, int clip_height )
 {
     if (!m_visible) return;
 void wxCanvasImage::Render(wxTransformMatrix* cworld, int clip_x, int clip_y, int clip_width, int clip_height )
 {
     if (!m_visible) return;
-
+    
     wxRect tmparea;
 
     tmparea.x = m_admin->LogicalToDeviceXRel( m_bbox.GetMinX());
     wxRect tmparea;
 
     tmparea.x = m_admin->LogicalToDeviceXRel( m_bbox.GetMinX());
@@ -1352,6 +1361,7 @@ void wxCanvasImage::Render(wxTransformMatrix* cworld, int clip_x, int clip_y, in
     y = m_admin->LogicalToDeviceY(y);
 
 
     y = m_admin->LogicalToDeviceY(y);
 
 
+    // What is this???
     if (  m_orgw*5 < m_admin->LogicalToDeviceXRel( m_bbox.GetWidth()  ) ||
           m_orgw/5 > m_admin->LogicalToDeviceXRel( m_bbox.GetWidth()  ) ||
           m_orgh*5 < m_admin->LogicalToDeviceYRel( m_bbox.GetHeight() ) ||
     if (  m_orgw*5 < m_admin->LogicalToDeviceXRel( m_bbox.GetWidth()  ) ||
           m_orgw/5 > m_admin->LogicalToDeviceXRel( m_bbox.GetWidth()  ) ||
           m_orgh*5 < m_admin->LogicalToDeviceYRel( m_bbox.GetHeight() ) ||
@@ -1375,29 +1385,54 @@ void wxCanvasImage::Render(wxTransformMatrix* cworld, int clip_x, int clip_y, in
         dc->DestroyClippingRegion();
         return;
     }
         dc->DestroyClippingRegion();
         return;
     }
+    
+    wxImage tmp;
+    bool is_cashed = FALSE;
 
 
-    if ((m_admin->LogicalToDeviceXRel( m_bbox.GetWidth() ) == m_image.GetWidth()) &&
-        (m_admin->LogicalToDeviceYRel( m_bbox.GetHeight() ) == m_image.GetHeight()))
+    if (m_cImage.Ok() && (m_cW == m_bbox.GetWidth()) && (m_cH == m_bbox.GetHeight()))
     {
     {
-        m_tmp = m_image;
+        // use cached image
+        tmp = m_cImage;
+        is_cashed = TRUE;
     }
     else
     {
     }
     else
     {
-        m_tmp = m_image.Scale( m_admin->LogicalToDeviceXRel( m_bbox.GetWidth()),
-                               m_admin->LogicalToDeviceYRel( m_bbox.GetHeight()) );
+        if ((m_admin->LogicalToDeviceXRel( m_bbox.GetWidth() ) == m_image.GetWidth()) &&
+            (m_admin->LogicalToDeviceYRel( m_bbox.GetHeight() ) == m_image.GetHeight()))
+        {
+            tmp = m_image;
+        }
+        else
+        {
+            tmp = m_image.Scale( m_admin->LogicalToDeviceXRel( m_bbox.GetWidth()),
+                                 m_admin->LogicalToDeviceYRel( m_bbox.GetHeight()) );
+        }
+        
+        // create cached image
+        m_cImage = tmp;
+        m_cW = tmp.GetWidth();
+        m_cH = tmp.GetHeight();
     }
 
     }
 
-    wxBitmap bmp;
 //    wxPoint centr(m_admin->LogicalToDeviceX(m_x),m_admin->LogicalToDeviceY(m_y));
     wxPoint centr(0,0);
 
 //    wxPoint centr(m_admin->LogicalToDeviceX(m_x),m_admin->LogicalToDeviceY(m_y));
     wxPoint centr(0,0);
 
-    if (cworld->GetRotation())
+    wxBitmap bmp;
+    
+    if (m_cBitmap.Ok() && is_cashed && (m_cR == cworld->GetRotation()))
     {
     {
-        bmp=m_tmp.Rotate(-cworld->GetRotation()/180.0 * pi,centr, TRUE,  NULL).ConvertToBitmap();
+        bmp = m_cBitmap;
     }
     else
     {
     }
     else
     {
-        bmp = m_tmp.ConvertToBitmap();
+        if (cworld->GetRotation())
+            tmp = tmp.Rotate(-cworld->GetRotation()/180.0 * pi, centr, TRUE, NULL );
+            
+        bmp = tmp.ConvertToBitmap();
+        
+        // create cached bitmap
+        m_cBitmap = bmp;
+        m_cR = cworld->GetRotation();
     }
 
     wxDC *dc = m_admin->GetActive()->GetDC();
     }
 
     wxDC *dc = m_admin->GetActive()->GetDC();
@@ -1423,28 +1458,9 @@ void wxCanvasImage::Render(wxTransformMatrix* cworld, int clip_x, int clip_y, in
     }
     else
     {
     }
     else
     {
-        //TODO clipping not right
-//        dc->DrawPoint(centr2);
-//        dc->DrawPoint(x,y);
-
-        if ((clip_x == x) &&
-            (clip_y == y) &&
-            (clip_width == tmparea.width) &&
-            (clip_height == tmparea.height))
-        {
-            dc->DrawBitmap( m_tmp, clip_x, clip_y, TRUE );
-        }
-        else
-        {
-            int start_x = clip_x - (int)x;
-            int start_y = clip_y - (int)y;
-
-            //dc->DrawBitmap( bmp, x, y, TRUE );
-            wxMemoryDC dcm;
-            dcm.SelectObject(bmp);
-            dc->Blit(clip_x, clip_y,clip_width, clip_height,&dcm,start_x,start_y,wxCOPY,TRUE);
-            dcm.SelectObject(wxNullBitmap);
-        }
+        dc->SetClippingRegion( clip_x, clip_y, clip_width, clip_height );
+        dc->DrawBitmap( bmp, x, y, TRUE );
+        dc->DestroyClippingRegion();
     }
 }
 
     }
 }