From a8fd009d52512500e0b8e09dbde5b5cbdbd71917 Mon Sep 17 00:00:00 2001 From: "dbaron@dbaron.org" Date: Thu, 20 Mar 2008 18:18:30 -0700 Subject: [PATCH] Don't do translation during table border painting. b=421069 Patch by Robert O'Callahan . r+sr=dbaron approval1.9b5=damon --- layout/tables/nsTableFrame.cpp | 15 +++++------ layout/tables/nsTablePainter.cpp | 35 +++++++++++++++----------- layout/tables/nsTablePainter.h | 9 +++++-- layout/tables/nsTableRowFrame.cpp | 3 +-- layout/tables/nsTableRowGroupFrame.cpp | 3 +-- 5 files changed, 37 insertions(+), 28 deletions(-) diff --git a/layout/tables/nsTableFrame.cpp b/layout/tables/nsTableFrame.cpp index 6ad92fbfb01d..0d3bafc418f3 100644 --- a/layout/tables/nsTableFrame.cpp +++ b/layout/tables/nsTableFrame.cpp @@ -1396,12 +1396,10 @@ nsTableFrame::PaintTableBorderBackground(nsIRenderingContext& aRenderingContext, nsPoint aPt) { nsPresContext* presContext = PresContext(); - nsRect dirtyRect = aDirtyRect - aPt; - nsIRenderingContext::AutoPushTranslation - translate(&aRenderingContext, aPt.x, aPt.y); TableBackgroundPainter painter(this, TableBackgroundPainter::eOrigin_Table, - presContext, aRenderingContext, dirtyRect); + presContext, aRenderingContext, + aDirtyRect, aPt); nsresult rv; if (eCompatibility_NavQuirks == presContext->CompatibilityMode()) { @@ -1429,15 +1427,18 @@ nsTableFrame::PaintTableBorderBackground(nsIRenderingContext& aRenderingContext, if (GetStyleVisibility()->IsVisible()) { const nsStyleBorder* border = GetStyleBorder(); - nsRect rect(0, 0, mRect.width, mRect.height); if (!IsBorderCollapse()) { PRIntn skipSides = GetSkipSides(); + nsRect rect(aPt, mRect.Size()); nsCSSRendering::PaintBorder(presContext, aRenderingContext, this, - dirtyRect, rect, *border, mStyleContext, + aDirtyRect, rect, *border, mStyleContext, skipSides); } else { - PaintBCBorders(aRenderingContext, dirtyRect); + // XXX we should probably get rid of this translation at some stage + // But that would mean modifying PaintBCBorders, ugh + nsIRenderingContext::AutoPushTranslation translate(&aRenderingContext, aPt.x, aPt.y); + PaintBCBorders(aRenderingContext, aDirtyRect - aPt); } } } diff --git a/layout/tables/nsTablePainter.cpp b/layout/tables/nsTablePainter.cpp index c0dbec762037..13742633197f 100644 --- a/layout/tables/nsTablePainter.cpp +++ b/layout/tables/nsTablePainter.cpp @@ -223,9 +223,11 @@ TableBackgroundPainter::TableBackgroundPainter(nsTableFrame* aTableFrame, Origin aOrigin, nsPresContext* aPresContext, nsIRenderingContext& aRenderingContext, - const nsRect& aDirtyRect) + const nsRect& aDirtyRect, + const nsPoint& aRenderPt) : mPresContext(aPresContext), mRenderingContext(aRenderingContext), + mRenderPt(aRenderPt), mDirtyRect(aDirtyRect), mOrigin(aOrigin), mCols(nsnull), @@ -315,7 +317,7 @@ TableBackgroundPainter::PaintTableFrame(nsTableFrame* aTableFrame, if (tableData.IsVisible()) { nsCSSRendering::PaintBackgroundWithSC(mPresContext, mRenderingContext, tableData.mFrame, mDirtyRect, - tableData.mRect, + tableData.mRect + mRenderPt, *tableData.mBackground, *tableData.mBorder, mZeroPadding, PR_TRUE); @@ -328,8 +330,7 @@ void TableBackgroundPainter::TranslateContext(nscoord aDX, nscoord aDY) { - mRenderingContext.Translate(aDX, aDY); - mDirtyRect.MoveBy(-aDX, -aDY); + mRenderPt += nsPoint(aDX, aDY); if (mCols) { TableBackgroundData* lastColGroup = nsnull; for (PRUint32 i = 0; i < mNumCols; i++) { @@ -441,7 +442,7 @@ TableBackgroundPainter::PaintTable(nsTableFrame* aTableFrame, // Need to compute the right rect via GetOffsetTo, since the row // group may not be a child of the table. mRowGroup.mRect.MoveTo(rg->GetOffsetTo(aTableFrame)); - if (mRowGroup.mRect.Intersects(mDirtyRect)) { + if (mRowGroup.mRect.Intersects(mDirtyRect - mRenderPt)) { nsresult rv = PaintRowGroup(rg, rg->IsPseudoStackingContextFromStyle()); if (NS_FAILED(rv)) return rv; } @@ -495,9 +496,10 @@ TableBackgroundPainter::PaintRowGroup(nsTableRowGroupFrame* aFrame, // their originating row. We do care about overflow below, // however, since that can be due to rowspans. - // Note that mDirtyRect is guaranteed to be in the row group's coordinate - // system here, so passing its .y to GetFirstRowContaining is ok. - nsIFrame* cursor = aFrame->GetFirstRowContaining(mDirtyRect.y, &ignored); + // Note that mDirtyRect - mRenderPt is guaranteed to be in the row + // group's coordinate system here, so passing its .y to + // GetFirstRowContaining is ok. + nsIFrame* cursor = aFrame->GetFirstRowContaining(mDirtyRect.y - mRenderPt.y, &ignored); // Sadly, it seems like there may be non-row frames in there... or something? // There are certainly null-checks in GetFirstRow() and GetNextRow(). :( @@ -518,7 +520,7 @@ TableBackgroundPainter::PaintRowGroup(nsTableRowGroupFrame* aFrame, /* Finally paint */ for (; row; row = row->GetNextRow()) { mRow.SetFrame(row); - if (mDirtyRect.YMost() < mRow.mRect.y) { // Intersect wouldn't handle + if (mDirtyRect.YMost() - mRenderPt.y < mRow.mRect.y) { // Intersect wouldn't handle // rowspans. // All done; cells originating in later rows can't intersect mDirtyRect. @@ -585,7 +587,7 @@ TableBackgroundPainter::PaintRow(nsTableRowFrame* aFrame, mCellRect = cell->GetRect(); //Translate to use the same coord system as mRow. mCellRect.MoveBy(mRow.mRect.x, mRow.mRect.y); - if (mCellRect.Intersects(mDirtyRect)) { + if (mCellRect.Intersects(mDirtyRect - mRenderPt)) { nsresult rv = PaintCell(cell, aPassThrough || cell->IsPseudoStackingContextFromStyle()); if (NS_FAILED(rv)) return rv; } @@ -617,7 +619,7 @@ TableBackgroundPainter::PaintCell(nsTableCellFrame* aCell, if (mCols && mCols[colIndex].mColGroup && mCols[colIndex].mColGroup->IsVisible()) { nsCSSRendering::PaintBackgroundWithSC(mPresContext, mRenderingContext, mCols[colIndex].mColGroup->mFrame, mDirtyRect, - mCols[colIndex].mColGroup->mRect, + mCols[colIndex].mColGroup->mRect + mRenderPt, *mCols[colIndex].mColGroup->mBackground, *mCols[colIndex].mColGroup->mBorder, mZeroPadding, PR_TRUE, &mCellRect); @@ -627,7 +629,7 @@ TableBackgroundPainter::PaintCell(nsTableCellFrame* aCell, if (mCols && mCols[colIndex].mCol.IsVisible()) { nsCSSRendering::PaintBackgroundWithSC(mPresContext, mRenderingContext, mCols[colIndex].mCol.mFrame, mDirtyRect, - mCols[colIndex].mCol.mRect, + mCols[colIndex].mCol.mRect + mRenderPt, *mCols[colIndex].mCol.mBackground, *mCols[colIndex].mCol.mBorder, mZeroPadding, PR_TRUE, &mCellRect); @@ -636,7 +638,8 @@ TableBackgroundPainter::PaintCell(nsTableCellFrame* aCell, //Paint row group background if (mRowGroup.IsVisible()) { nsCSSRendering::PaintBackgroundWithSC(mPresContext, mRenderingContext, - mRowGroup.mFrame, mDirtyRect, mRowGroup.mRect, + mRowGroup.mFrame, mDirtyRect, + mRowGroup.mRect + mRenderPt, *mRowGroup.mBackground, *mRowGroup.mBorder, mZeroPadding, PR_TRUE, &mCellRect); } @@ -644,14 +647,16 @@ TableBackgroundPainter::PaintCell(nsTableCellFrame* aCell, //Paint row background if (mRow.IsVisible()) { nsCSSRendering::PaintBackgroundWithSC(mPresContext, mRenderingContext, - mRow.mFrame, mDirtyRect, mRow.mRect, + mRow.mFrame, mDirtyRect, + mRow.mRect + mRenderPt, *mRow.mBackground, *mRow.mBorder, mZeroPadding, PR_TRUE, &mCellRect); } //Paint cell background in border-collapse unless we're just passing if (mIsBorderCollapse && !aPassSelf) { - aCell->PaintCellBackground(mRenderingContext, mDirtyRect, mCellRect.TopLeft()); + aCell->PaintCellBackground(mRenderingContext, mDirtyRect, + mRenderPt + mCellRect.TopLeft()); } return NS_OK; diff --git a/layout/tables/nsTablePainter.h b/layout/tables/nsTablePainter.h index fd3a8e47d024..30eb69d0ffbd 100644 --- a/layout/tables/nsTablePainter.h +++ b/layout/tables/nsTablePainter.h @@ -68,13 +68,17 @@ class TableBackgroundPainter * @param aOrigin - what type of table frame is creating this instance * @param aPresContext - the presentation context * @param aRenderingContext - the rendering context - * @param aDirtyRect - the area that needs to be painted + * @param aDirtyRect - the area that needs to be painted, + * relative to aRenderingContext + * @param aPt - offset of the table frame relative to + * aRenderingContext */ TableBackgroundPainter(nsTableFrame* aTableFrame, Origin aOrigin, nsPresContext* aPresContext, nsIRenderingContext& aRenderingContext, - const nsRect& aDirtyRect); + const nsRect& aDirtyRect, + const nsPoint& aPt); /** Destructor */ ~TableBackgroundPainter(); @@ -223,6 +227,7 @@ class TableBackgroundPainter nsPresContext* mPresContext; nsIRenderingContext& mRenderingContext; + nsPoint mRenderPt; nsRect mDirtyRect; #ifdef DEBUG nsCompatibility mCompatMode; diff --git a/layout/tables/nsTableRowFrame.cpp b/layout/tables/nsTableRowFrame.cpp index ad042b9df260..19674d97fd5d 100644 --- a/layout/tables/nsTableRowFrame.cpp +++ b/layout/tables/nsTableRowFrame.cpp @@ -574,11 +574,10 @@ nsDisplayTableRowBackground::Paint(nsDisplayListBuilder* aBuilder, nsTableFrame* tableFrame = nsTableFrame::GetTableFrame(mFrame); nsPoint pt = aBuilder->ToReferenceFrame(mFrame); - nsIRenderingContext::AutoPushTranslation translate(aCtx, pt.x, pt.y); TableBackgroundPainter painter(tableFrame, TableBackgroundPainter::eOrigin_TableRow, mFrame->PresContext(), *aCtx, - aDirtyRect - pt); + aDirtyRect, pt); painter.PaintRow(static_cast(mFrame)); } diff --git a/layout/tables/nsTableRowGroupFrame.cpp b/layout/tables/nsTableRowGroupFrame.cpp index 20ece5a5bec4..13eae1b5f267 100644 --- a/layout/tables/nsTableRowGroupFrame.cpp +++ b/layout/tables/nsTableRowGroupFrame.cpp @@ -193,11 +193,10 @@ PaintRowGroupBackground(nsIFrame* aFrame, nsIRenderingContext* aCtx, { nsTableFrame* tableFrame = nsTableFrame::GetTableFrame(aFrame); - nsIRenderingContext::AutoPushTranslation translate(aCtx, aPt.x, aPt.y); TableBackgroundPainter painter(tableFrame, TableBackgroundPainter::eOrigin_TableRowGroup, aFrame->PresContext(), *aCtx, - aDirtyRect - aPt); + aDirtyRect, aPt); painter.PaintRowGroup(static_cast(aFrame)); }