]> git.saurik.com Git - wxWidgets.git/blobdiff - src/html/htmlcell.cpp
Crash fix under VC++
[wxWidgets.git] / src / html / htmlcell.cpp
index 8064a7c5437ae7940252b0333f04e928c9200c1f..8ea2197716ad12b3b459ca0c2de4f5c1bfd6e009 100644 (file)
@@ -376,7 +376,7 @@ static void SwitchSelState(wxDC& dc, wxHtmlRenderingInfo& info,
 
 
 void wxHtmlWordCell::Draw(wxDC& dc, int x, int y,
-                          int WXUNUSED(view_y1), int view_y2,
+                          int WXUNUSED(view_y1), int WXUNUSED(view_y2),
                           wxHtmlRenderingInfo& info)
 {
 #if 0 // useful for debugging
@@ -384,8 +384,6 @@ void wxHtmlWordCell::Draw(wxDC& dc, int x, int y,
     dc.DrawRectangle(x+m_PosX,y+m_PosY,m_Width /* VZ: +1? */ ,m_Height);
 #endif
 
-    if (y+m_PosY+m_Height > view_y2) return;
-
     bool drawSelectionAfterCell = false;
 
     if ( info.GetState().GetSelectionState() == wxHTML_SEL_CHANGING )
@@ -904,52 +902,60 @@ void wxHtmlContainerCell::Draw(wxDC& dc, int x, int y, int view_y1, int view_y2,
     dc.SetPen(*wxRED_PEN);
     dc.DrawRectangle(x+m_PosX,y+m_PosY,m_Width,m_Height);
 #endif
-    // container visible, draw it:
-    if ((y + m_PosY <= view_y2) && (y + m_PosY + m_Height > view_y1))
+            
+    int xlocal = x + m_PosX;
+    int ylocal = y + m_PosY;
+
+    if (m_UseBkColour)
     {
-        if (m_UseBkColour)
-        {
-            wxBrush myb = wxBrush(m_BkColour, wxSOLID);
+        wxBrush myb = wxBrush(m_BkColour, wxSOLID);
 
-            int real_y1 = mMax(y + m_PosY, view_y1);
-            int real_y2 = mMin(y + m_PosY + m_Height - 1, view_y2);
+        int real_y1 = mMax(ylocal, view_y1);
+        int real_y2 = mMin(ylocal + m_Height - 1, view_y2);
 
-            dc.SetBrush(myb);
-            dc.SetPen(*wxTRANSPARENT_PEN);
-            dc.DrawRectangle(x + m_PosX, real_y1, m_Width, real_y2 - real_y1 + 1);
-        }
+        dc.SetBrush(myb);
+        dc.SetPen(*wxTRANSPARENT_PEN);
+        dc.DrawRectangle(xlocal, real_y1, m_Width, real_y2 - real_y1 + 1);
+    }
 
-        if (m_UseBorder)
-        {
-            wxPen mypen1(m_BorderColour1, 1, wxSOLID);
-            wxPen mypen2(m_BorderColour2, 1, wxSOLID);
-
-            dc.SetPen(mypen1);
-            dc.DrawLine(x + m_PosX, y + m_PosY, x + m_PosX, y + m_PosY + m_Height - 1);
-            dc.DrawLine(x + m_PosX, y + m_PosY, x + m_PosX + m_Width, y + m_PosY);
-            dc.SetPen(mypen2);
-            dc.DrawLine(x + m_PosX + m_Width - 1, y + m_PosY, x + m_PosX +  m_Width - 1, y + m_PosY + m_Height - 1);
-            dc.DrawLine(x + m_PosX, y + m_PosY + m_Height - 1, x + m_PosX + m_Width, y + m_PosY + m_Height - 1);
-        }
+    if (m_UseBorder)
+    {
+        wxPen mypen1(m_BorderColour1, 1, wxSOLID);
+        wxPen mypen2(m_BorderColour2, 1, wxSOLID);
+
+        dc.SetPen(mypen1);
+        dc.DrawLine(xlocal, ylocal, xlocal, ylocal + m_Height - 1);
+        dc.DrawLine(xlocal, ylocal, xlocal + m_Width, ylocal);
+        dc.SetPen(mypen2);
+        dc.DrawLine(xlocal + m_Width - 1, ylocal, xlocal +  m_Width - 1, ylocal + m_Height - 1);
+        dc.DrawLine(xlocal, ylocal + m_Height - 1, xlocal + m_Width, ylocal + m_Height - 1);
+    }
 
-        if (m_Cells)
+    if (m_Cells)
+    {
+        // draw container's contents:
+        for (wxHtmlCell *cell = m_Cells; cell; cell = cell->GetNext())
         {
-            // draw container's contents:
-            for (wxHtmlCell *cell = m_Cells; cell; cell = cell->GetNext())
+            
+            // optimize drawing: don't render off-screen content:
+            if ((ylocal + cell->GetPosY() <= view_y2) &&
+                (ylocal + cell->GetPosY() + cell->GetHeight() > view_y1))
             {
+                // the cell is visible, draw it:
                 UpdateRenderingStatePre(info, cell);
                 cell->Draw(dc,
-                           x + m_PosX, y + m_PosY, view_y1, view_y2,
+                           xlocal, ylocal, view_y1, view_y2,
                            info);
                 UpdateRenderingStatePost(info, cell);
             }
+            else
+            {
+                // the cell is off-screen, proceed with font+color+etc.
+                // changes only:
+                cell->DrawInvisible(dc, xlocal, ylocal, info);
+            }
         }
     }
-    // container invisible, just proceed font+color changing:
-    else
-    {
-        DrawInvisible(dc, x, y, info);
-    }
 }