Modified: trunk/Source/WebCore/rendering/RenderTableCell.cpp (153509 => 153510)
--- trunk/Source/WebCore/rendering/RenderTableCell.cpp 2013-07-31 04:55:02 UTC (rev 153509)
+++ trunk/Source/WebCore/rendering/RenderTableCell.cpp 2013-07-31 04:59:52 UTC (rev 153510)
@@ -1101,6 +1101,31 @@
compareBorderValuesForQSort);
}
+bool RenderTableCell::alignLeftRightBorderPaintRect(int& leftXOffset, int& rightXOffset)
+{
+ const RenderStyle* styleForTopCell = styleForCellFlow();
+ int left = cachedCollapsedLeftBorder(styleForTopCell).width();
+ int right = cachedCollapsedRightBorder(styleForTopCell).width();
+ leftXOffset = max<int>(leftXOffset, left);
+ rightXOffset = max<int>(rightXOffset, right);
+ if (colSpan() > 1)
+ return false;
+ return true;
+}
+
+bool RenderTableCell::alignTopBottomBorderPaintRect(int& topYOffset, int& bottomYOffset)
+{
+ const RenderStyle* styleForBottomCell = styleForCellFlow();
+ int top = cachedCollapsedTopBorder(styleForBottomCell).width();
+ int bottom = cachedCollapsedBottomBorder(styleForBottomCell).width();
+ topYOffset = max<int>(topYOffset, top);
+ bottomYOffset = max<int>(bottomYOffset, bottom);
+ if (rowSpan() > 1)
+ return false;
+ return true;
+}
+
+
void RenderTableCell::paintCollapsedBorders(PaintInfo& paintInfo, const LayoutPoint& paintOffset)
{
ASSERT(paintInfo.phase == PaintPhaseCollapsedTableBorders);
@@ -1134,35 +1159,80 @@
int leftWidth = leftVal.width();
int rightWidth = rightVal.width();
+ int leftXOffsetTop = leftWidth;
+ int leftXOffsetBottom = leftWidth;
+ int rightXOffsetTop = rightWidth;
+ int rightXOffsetBottom = rightWidth;
+ int topYOffsetLeft = topWidth;
+ int topYOffsetRight = topWidth;
+ int bottomYOffsetLeft = bottomWidth;
+ int bottomYOffsetRight = bottomWidth;
+
+ bool shouldDrawTopBorder = true;
+ bool shouldDrawLeftBorder = true;
+ bool shouldDrawRightBorder = true;
+
+ if (RenderTableCell* top = table()->cellAbove(this)) {
+ shouldDrawTopBorder = top->alignLeftRightBorderPaintRect(leftXOffsetTop, rightXOffsetTop);
+ if (this->colSpan() > 1)
+ shouldDrawTopBorder = false;
+ }
+
+ if (RenderTableCell* bottom = table()->cellBelow(this))
+ bottom->alignLeftRightBorderPaintRect(leftXOffsetBottom, rightXOffsetBottom);
+
+ if (RenderTableCell* left = table()->cellBefore(this))
+ shouldDrawLeftBorder = left->alignTopBottomBorderPaintRect(topYOffsetLeft, bottomYOffsetLeft);
+
+ if (RenderTableCell* right = table()->cellAfter(this))
+ shouldDrawRightBorder = right->alignTopBottomBorderPaintRect(topYOffsetRight, bottomYOffsetRight);
+
+ IntRect cellRect = pixelSnappedIntRect(paintRect.x(), paintRect.y(), paintRect.width(), paintRect.height());
+
IntRect borderRect = pixelSnappedIntRect(paintRect.x() - leftWidth / 2,
- paintRect.y() - topWidth / 2,
- paintRect.width() + leftWidth / 2 + (rightWidth + 1) / 2,
- paintRect.height() + topWidth / 2 + (bottomWidth + 1) / 2);
+ paintRect.y() - topWidth / 2,
+ paintRect.width() + leftWidth / 2 + (rightWidth + 1) / 2,
+ paintRect.height() + topWidth / 2 + (bottomWidth + 1) / 2);
EBorderStyle topStyle = collapsedBorderStyle(topVal.style());
EBorderStyle bottomStyle = collapsedBorderStyle(bottomVal.style());
EBorderStyle leftStyle = collapsedBorderStyle(leftVal.style());
EBorderStyle rightStyle = collapsedBorderStyle(rightVal.style());
- bool renderTop = topStyle > BHIDDEN && !topVal.isTransparent();
+ bool renderTop = topStyle > BHIDDEN && !topVal.isTransparent() && shouldDrawTopBorder;
bool renderBottom = bottomStyle > BHIDDEN && !bottomVal.isTransparent();
- bool renderLeft = leftStyle > BHIDDEN && !leftVal.isTransparent();
- bool renderRight = rightStyle > BHIDDEN && !rightVal.isTransparent();
+ bool renderLeft = leftStyle > BHIDDEN && !leftVal.isTransparent() && shouldDrawLeftBorder;
+ bool renderRight = rightStyle > BHIDDEN && !rightVal.isTransparent() && shouldDrawRightBorder;
// We never paint diagonals at the joins. We simply let the border with the highest
// precedence paint on top of borders with lower precedence.
CollapsedBorders borders;
- borders.addBorder(topVal, BSTop, renderTop, borderRect.x(), borderRect.y(), borderRect.maxX(), borderRect.y() + topWidth, topStyle);
- borders.addBorder(bottomVal, BSBottom, renderBottom, borderRect.x(), borderRect.maxY() - bottomWidth, borderRect.maxX(), borderRect.maxY(), bottomStyle);
- borders.addBorder(leftVal, BSLeft, renderLeft, borderRect.x(), borderRect.y(), borderRect.x() + leftWidth, borderRect.maxY(), leftStyle);
- borders.addBorder(rightVal, BSRight, renderRight, borderRect.maxX() - rightWidth, borderRect.y(), borderRect.maxX(), borderRect.maxY(), rightStyle);
+ if (topVal.style() == DOTTED)
+ borders.addBorder(topVal, BSTop, renderTop, cellRect.x() - leftXOffsetTop / 2, cellRect.y() - topWidth / 2, cellRect.maxX() + rightXOffsetTop / 2, cellRect.y() + topWidth / 2 + topWidth % 2, topStyle);
+ else
+ borders.addBorder(topVal, BSTop, renderTop, borderRect.x(), borderRect.y(), borderRect.maxX(), borderRect.y() + topWidth, topStyle);
+ if (bottomVal.style() == DOTTED)
+ borders.addBorder(bottomVal, BSBottom, renderBottom, cellRect.x() - leftXOffsetBottom / 2, cellRect.maxY() - bottomWidth / 2, cellRect.maxX() + rightXOffsetBottom / 2, cellRect.maxY() + bottomWidth / 2 + bottomWidth % 2, bottomStyle);
+ else
+ borders.addBorder(bottomVal, BSBottom, renderBottom, borderRect.x(), borderRect.maxY() - bottomWidth, borderRect.maxX(), borderRect.maxY(), bottomStyle);
+
+ if (leftVal.style() == DOTTED)
+ borders.addBorder(leftVal, BSLeft, renderLeft, cellRect.x() - leftWidth / 2, cellRect.y() - topYOffsetLeft / 2, cellRect.x() + leftWidth / 2 + leftWidth % 2, cellRect.maxY() + bottomYOffsetLeft / 2 + bottomYOffsetLeft % 2, leftStyle);
+ else
+ borders.addBorder(leftVal, BSLeft, renderLeft, borderRect.x(), borderRect.y(), borderRect.x() + leftWidth, borderRect.maxY(), leftStyle);
+
+ if (rightVal.style() == DOTTED)
+ borders.addBorder(rightVal, BSRight, renderRight, cellRect.maxX() - rightWidth / 2, cellRect.y() - topYOffsetRight / 2, cellRect.maxX() + rightWidth / 2 + rightWidth % 2, cellRect.maxY() + bottomYOffsetRight / 2 + bottomYOffsetRight % 2, rightStyle);
+ else
+ borders.addBorder(rightVal, BSRight, renderRight, borderRect.maxX() - rightWidth, borderRect.y(), borderRect.maxX(), borderRect.maxY(), rightStyle);
+
bool antialias = shouldAntialiasLines(graphicsContext);
for (CollapsedBorder* border = borders.nextBorder(); border; border = borders.nextBorder()) {
if (border->borderValue.isSameIgnoringColor(*table()->currentBorderValue()))
drawLineForBoxSide(graphicsContext, border->x1, border->y1, border->x2, border->y2, border->side,
- border->borderValue.color(), border->style, 0, 0, antialias);
+ border->borderValue.color(), border->style, 0, 0, antialias);
}
}