diff --git a/layout/html/table/src/nsTableFrame.cpp b/layout/html/table/src/nsTableFrame.cpp
index dc89afa710cd..810fa2c64fce 100644
--- a/layout/html/table/src/nsTableFrame.cpp
+++ b/layout/html/table/src/nsTableFrame.cpp
@@ -4785,7 +4785,7 @@ private:
nsCellMap* aCellMap = nsnull);
PRBool SetNewRow(nsTableRowFrame* row = nsnull);
- PRBool SetNewRowGroup();
+ PRBool SetNewRowGroup(PRBool aFindFirstDamagedRow);
nsTableFrame& mTableFrame;
nsTableCellMap* mTableCellMap;
@@ -4920,6 +4920,7 @@ BCMapCellIterator::SetInfo(nsTableRowFrame* aRow,
PRBool
BCMapCellIterator::SetNewRow(nsTableRowFrame* aRow)
{
+ mAtEnd = PR_TRUE;
mPrevRow = mRow;
if (aRow) {
mRow = aRow;
@@ -4944,56 +4945,71 @@ BCMapCellIterator::SetNewRow(nsTableRowFrame* aRow)
}
}
mIsNewRow = PR_TRUE;
+ mAtEnd = PR_FALSE;
}
- else {
- NS_ASSERTION(PR_FALSE, "program error");
- mAtEnd = PR_TRUE;
- }
+ else ABORT1(PR_FALSE);
+
return !mAtEnd;
}
PRBool
-BCMapCellIterator::SetNewRowGroup()
+BCMapCellIterator::SetNewRowGroup(PRBool aFindFirstDamagedRow)
{
+ mAtEnd = PR_TRUE;
mRowGroupIndex++;
PRInt32 numRowGroups = mRowGroups.Count();
- for (PRInt32 rgX = mRowGroupIndex; (rgX < numRowGroups) && !mAtEnd; rgX++) {
+ for (PRInt32 rgX = mRowGroupIndex; rgX < numRowGroups; rgX++) {
nsIFrame* frame = (nsTableRowGroupFrame*)mRowGroups.ElementAt(mRowGroupIndex); if (!frame) ABORT1(PR_FALSE);
mRowGroup = mTableFrame.GetRowGroupFrame(frame); if (!mRowGroup) ABORT1(PR_FALSE);
mRowGroupStart = mRowGroup->GetStartRowIndex();
mRowGroupEnd = mRowGroupStart + mRowGroup->GetRowCount() - 1;
if (mRowGroupEnd >= 0) {
- mCellMap = mTableCellMap->GetMapFor(*mRowGroup);
- if (SetNewRow(mRowGroup->GetFirstRow())) {
- return PR_TRUE;
+ mCellMap = mTableCellMap->GetMapFor(*mRowGroup);
+ nsTableRowFrame* firstRow = mRowGroup->GetFirstRow();
+ if (aFindFirstDamagedRow) {
+ if ((mAreaStart.y >= mRowGroupStart) && (mAreaStart.y <= mRowGroupEnd)) {
+ // the damage area starts in the row group
+ if (aFindFirstDamagedRow) {
+ // find the correct first damaged row
+ PRInt32 numRows = mAreaStart.y - mRowGroupStart;
+ for (PRInt32 i = 0; i < numRows; i++) {
+ firstRow = firstRow->GetNextRow(); if (!frame) ABORT1(PR_FALSE);
+ }
+ }
+ }
+ else {
+ mRowGroupIndex++;
+ continue;
+ }
+ }
+ if (SetNewRow(firstRow)) { // sets mAtEnd
+ break;
}
- else mAtEnd = PR_TRUE;
}
}
- mAtEnd = PR_TRUE;
+
return !mAtEnd;
}
void
BCMapCellIterator::First(BCMapCellInfo& aMapInfo)
{
- mAtEnd = PR_FALSE;
aMapInfo.Reset();
- SetNewRowGroup(); // could set mAtEnd
+ SetNewRowGroup(PR_TRUE); // sets mAtEnd
while (!mAtEnd) {
if ((mAreaStart.y >= mRowGroupStart) && (mAreaStart.y <= mRowGroupEnd)) {
CellData* cellData = mCellMap->GetDataAt(*mTableCellMap, mAreaStart.y - mRowGroupStart, mAreaStart.x, PR_FALSE);
if (cellData && cellData->IsOrig()) {
SetInfo(mRow, mAreaStart.x, cellData, aMapInfo);
- break;
}
else {
NS_ASSERTION(PR_FALSE, "damage area expanded incorrectly");
mAtEnd = PR_TRUE;
}
+ break;
}
- SetNewRowGroup(); // could set mAtEnd
+ SetNewRowGroup(PR_TRUE); // sets mAtEnd
}
}
@@ -5019,7 +5035,7 @@ BCMapCellIterator::Next(BCMapCellInfo& aMapInfo)
}
}
if (mRowIndex >= mRowGroupEnd) {
- SetNewRowGroup(); // could set mAtEnd
+ SetNewRowGroup(PR_FALSE); // could set mAtEnd
}
else {
SetNewRow(); // could set mAtEnd
@@ -5481,7 +5497,7 @@ struct BCCorners
BCCornerInfo& operator [](PRInt32 i) const
{ NS_ASSERTION((i >= startIndex) && (i <= endIndex), "program error");
- return corners[i - startIndex]; }
+ return corners[PR_MAX(PR_MIN(i, endIndex), startIndex) - startIndex]; }
PRInt32 startIndex;
PRInt32 endIndex;
@@ -5526,7 +5542,7 @@ struct BCCellBorders
BCCellBorder& operator [](PRInt32 i) const
{ NS_ASSERTION((i >= startIndex) && (i <= endIndex), "program error");
- return borders[i - startIndex]; }
+ return borders[PR_MAX(PR_MIN(i, endIndex), startIndex) - startIndex]; }
PRInt32 startIndex;
PRInt32 endIndex;
@@ -5734,8 +5750,8 @@ LimitBorderWidth(PRUint16 aWidth)
*/
#define TOP_DAMAGED(aRowIndex) ((aRowIndex) >= propData->mDamageArea.y)
-#define RIGHT_DAMAGED(aColIndex) ((aColIndex) <= propData->mDamageArea.XMost())
-#define BOTTOM_DAMAGED(aRowIndex) ((aRowIndex) <= propData->mDamageArea.YMost())
+#define RIGHT_DAMAGED(aColIndex) ((aColIndex) < propData->mDamageArea.XMost())
+#define BOTTOM_DAMAGED(aRowIndex) ((aRowIndex) < propData->mDamageArea.YMost())
#define LEFT_DAMAGED(aColIndex) ((aColIndex) >= propData->mDamageArea.x)
// Calc the dominate border at every cell edge and corner within the current damage area
diff --git a/layout/tables/nsTableFrame.cpp b/layout/tables/nsTableFrame.cpp
index dc89afa710cd..810fa2c64fce 100644
--- a/layout/tables/nsTableFrame.cpp
+++ b/layout/tables/nsTableFrame.cpp
@@ -4785,7 +4785,7 @@ private:
nsCellMap* aCellMap = nsnull);
PRBool SetNewRow(nsTableRowFrame* row = nsnull);
- PRBool SetNewRowGroup();
+ PRBool SetNewRowGroup(PRBool aFindFirstDamagedRow);
nsTableFrame& mTableFrame;
nsTableCellMap* mTableCellMap;
@@ -4920,6 +4920,7 @@ BCMapCellIterator::SetInfo(nsTableRowFrame* aRow,
PRBool
BCMapCellIterator::SetNewRow(nsTableRowFrame* aRow)
{
+ mAtEnd = PR_TRUE;
mPrevRow = mRow;
if (aRow) {
mRow = aRow;
@@ -4944,56 +4945,71 @@ BCMapCellIterator::SetNewRow(nsTableRowFrame* aRow)
}
}
mIsNewRow = PR_TRUE;
+ mAtEnd = PR_FALSE;
}
- else {
- NS_ASSERTION(PR_FALSE, "program error");
- mAtEnd = PR_TRUE;
- }
+ else ABORT1(PR_FALSE);
+
return !mAtEnd;
}
PRBool
-BCMapCellIterator::SetNewRowGroup()
+BCMapCellIterator::SetNewRowGroup(PRBool aFindFirstDamagedRow)
{
+ mAtEnd = PR_TRUE;
mRowGroupIndex++;
PRInt32 numRowGroups = mRowGroups.Count();
- for (PRInt32 rgX = mRowGroupIndex; (rgX < numRowGroups) && !mAtEnd; rgX++) {
+ for (PRInt32 rgX = mRowGroupIndex; rgX < numRowGroups; rgX++) {
nsIFrame* frame = (nsTableRowGroupFrame*)mRowGroups.ElementAt(mRowGroupIndex); if (!frame) ABORT1(PR_FALSE);
mRowGroup = mTableFrame.GetRowGroupFrame(frame); if (!mRowGroup) ABORT1(PR_FALSE);
mRowGroupStart = mRowGroup->GetStartRowIndex();
mRowGroupEnd = mRowGroupStart + mRowGroup->GetRowCount() - 1;
if (mRowGroupEnd >= 0) {
- mCellMap = mTableCellMap->GetMapFor(*mRowGroup);
- if (SetNewRow(mRowGroup->GetFirstRow())) {
- return PR_TRUE;
+ mCellMap = mTableCellMap->GetMapFor(*mRowGroup);
+ nsTableRowFrame* firstRow = mRowGroup->GetFirstRow();
+ if (aFindFirstDamagedRow) {
+ if ((mAreaStart.y >= mRowGroupStart) && (mAreaStart.y <= mRowGroupEnd)) {
+ // the damage area starts in the row group
+ if (aFindFirstDamagedRow) {
+ // find the correct first damaged row
+ PRInt32 numRows = mAreaStart.y - mRowGroupStart;
+ for (PRInt32 i = 0; i < numRows; i++) {
+ firstRow = firstRow->GetNextRow(); if (!frame) ABORT1(PR_FALSE);
+ }
+ }
+ }
+ else {
+ mRowGroupIndex++;
+ continue;
+ }
+ }
+ if (SetNewRow(firstRow)) { // sets mAtEnd
+ break;
}
- else mAtEnd = PR_TRUE;
}
}
- mAtEnd = PR_TRUE;
+
return !mAtEnd;
}
void
BCMapCellIterator::First(BCMapCellInfo& aMapInfo)
{
- mAtEnd = PR_FALSE;
aMapInfo.Reset();
- SetNewRowGroup(); // could set mAtEnd
+ SetNewRowGroup(PR_TRUE); // sets mAtEnd
while (!mAtEnd) {
if ((mAreaStart.y >= mRowGroupStart) && (mAreaStart.y <= mRowGroupEnd)) {
CellData* cellData = mCellMap->GetDataAt(*mTableCellMap, mAreaStart.y - mRowGroupStart, mAreaStart.x, PR_FALSE);
if (cellData && cellData->IsOrig()) {
SetInfo(mRow, mAreaStart.x, cellData, aMapInfo);
- break;
}
else {
NS_ASSERTION(PR_FALSE, "damage area expanded incorrectly");
mAtEnd = PR_TRUE;
}
+ break;
}
- SetNewRowGroup(); // could set mAtEnd
+ SetNewRowGroup(PR_TRUE); // sets mAtEnd
}
}
@@ -5019,7 +5035,7 @@ BCMapCellIterator::Next(BCMapCellInfo& aMapInfo)
}
}
if (mRowIndex >= mRowGroupEnd) {
- SetNewRowGroup(); // could set mAtEnd
+ SetNewRowGroup(PR_FALSE); // could set mAtEnd
}
else {
SetNewRow(); // could set mAtEnd
@@ -5481,7 +5497,7 @@ struct BCCorners
BCCornerInfo& operator [](PRInt32 i) const
{ NS_ASSERTION((i >= startIndex) && (i <= endIndex), "program error");
- return corners[i - startIndex]; }
+ return corners[PR_MAX(PR_MIN(i, endIndex), startIndex) - startIndex]; }
PRInt32 startIndex;
PRInt32 endIndex;
@@ -5526,7 +5542,7 @@ struct BCCellBorders
BCCellBorder& operator [](PRInt32 i) const
{ NS_ASSERTION((i >= startIndex) && (i <= endIndex), "program error");
- return borders[i - startIndex]; }
+ return borders[PR_MAX(PR_MIN(i, endIndex), startIndex) - startIndex]; }
PRInt32 startIndex;
PRInt32 endIndex;
@@ -5734,8 +5750,8 @@ LimitBorderWidth(PRUint16 aWidth)
*/
#define TOP_DAMAGED(aRowIndex) ((aRowIndex) >= propData->mDamageArea.y)
-#define RIGHT_DAMAGED(aColIndex) ((aColIndex) <= propData->mDamageArea.XMost())
-#define BOTTOM_DAMAGED(aRowIndex) ((aRowIndex) <= propData->mDamageArea.YMost())
+#define RIGHT_DAMAGED(aColIndex) ((aColIndex) < propData->mDamageArea.XMost())
+#define BOTTOM_DAMAGED(aRowIndex) ((aRowIndex) < propData->mDamageArea.YMost())
#define LEFT_DAMAGED(aColIndex) ((aColIndex) >= propData->mDamageArea.x)
// Calc the dominate border at every cell edge and corner within the current damage area