| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 1997 Martin Jones (mjones@kde.org) | 2 * Copyright (C) 1997 Martin Jones (mjones@kde.org) |
| 3 * (C) 1997 Torben Weis (weis@kde.org) | 3 * (C) 1997 Torben Weis (weis@kde.org) |
| 4 * (C) 1998 Waldo Bastian (bastian@kde.org) | 4 * (C) 1998 Waldo Bastian (bastian@kde.org) |
| 5 * (C) 1999 Lars Knoll (knoll@kde.org) | 5 * (C) 1999 Lars Knoll (knoll@kde.org) |
| 6 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 6 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
| 7 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. | 7 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. |
| 8 * All rights reserved. | 8 * All rights reserved. |
| 9 * | 9 * |
| 10 * This library is free software; you can redistribute it and/or | 10 * This library is free software; you can redistribute it and/or |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 60 m_absoluteColumnIndex(unsetColumnIndex), | 60 m_absoluteColumnIndex(unsetColumnIndex), |
| 61 m_cellWidthChanged(false), | 61 m_cellWidthChanged(false), |
| 62 m_intrinsicPaddingBefore(0), | 62 m_intrinsicPaddingBefore(0), |
| 63 m_intrinsicPaddingAfter(0) { | 63 m_intrinsicPaddingAfter(0) { |
| 64 // We only update the flags when notified of DOM changes in | 64 // We only update the flags when notified of DOM changes in |
| 65 // colSpanOrRowSpanChanged() so we need to set their initial values here in | 65 // colSpanOrRowSpanChanged() so we need to set their initial values here in |
| 66 // case something asks for colSpan()/rowSpan() before then. | 66 // case something asks for colSpan()/rowSpan() before then. |
| 67 updateColAndRowSpanFlags(); | 67 updateColAndRowSpanFlags(); |
| 68 } | 68 } |
| 69 | 69 |
| 70 LayoutTableCell::CollapsedBorderValues::CollapsedBorderValues( | |
| 71 const LayoutTable& layoutTable, | |
| 72 const CollapsedBorderValue& startBorder, | |
| 73 const CollapsedBorderValue& endBorder, | |
| 74 const CollapsedBorderValue& beforeBorder, | |
| 75 const CollapsedBorderValue& afterBorder) | |
| 76 : m_layoutTable(layoutTable), | |
| 77 m_startBorder(startBorder), | |
| 78 m_endBorder(endBorder), | |
| 79 m_beforeBorder(beforeBorder), | |
| 80 m_afterBorder(afterBorder) {} | |
| 81 | |
| 82 void LayoutTableCell::CollapsedBorderValues::setCollapsedBorderValues( | |
| 83 const CollapsedBorderValues& other) { | |
| 84 m_startBorder = other.startBorder(); | |
| 85 m_endBorder = other.endBorder(); | |
| 86 m_beforeBorder = other.beforeBorder(); | |
| 87 m_afterBorder = other.afterBorder(); | |
| 88 } | |
| 89 | |
| 90 String LayoutTableCell::CollapsedBorderValues::debugName() const { | |
| 91 return "CollapsedBorderValues"; | |
| 92 } | |
| 93 | |
| 94 LayoutRect LayoutTableCell::CollapsedBorderValues::visualRect() const { | |
| 95 return m_layoutTable.visualRect(); | |
| 96 } | |
| 97 | |
| 98 void LayoutTableCell::willBeRemovedFromTree() { | 70 void LayoutTableCell::willBeRemovedFromTree() { |
| 99 LayoutBlockFlow::willBeRemovedFromTree(); | 71 LayoutBlockFlow::willBeRemovedFromTree(); |
| 100 | 72 |
| 101 section()->setNeedsCellRecalc(); | 73 section()->setNeedsCellRecalc(); |
| 102 | 74 |
| 103 // When borders collapse, removing a cell can affect the the width of | 75 // When borders collapse, removing a cell can affect the the width of |
| 104 // neighboring cells. | 76 // neighboring cells. |
| 105 LayoutTable* enclosingTable = table(); | 77 LayoutTable* enclosingTable = table(); |
| 106 DCHECK(enclosingTable); | 78 DCHECK(enclosingTable); |
| 107 if (!enclosingTable->collapseBorders()) | 79 if (!enclosingTable->collapseBorders()) |
| (...skipping 385 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 493 clearIntrinsicPadding(); | 465 clearIntrinsicPadding(); |
| 494 | 466 |
| 495 // If border was changed, notify table. | 467 // If border was changed, notify table. |
| 496 if (!parent()) | 468 if (!parent()) |
| 497 return; | 469 return; |
| 498 LayoutTable* table = this->table(); | 470 LayoutTable* table = this->table(); |
| 499 if (!table) | 471 if (!table) |
| 500 return; | 472 return; |
| 501 if (!table->selfNeedsLayout() && !table->normalChildNeedsLayout() && | 473 if (!table->selfNeedsLayout() && !table->normalChildNeedsLayout() && |
| 502 oldStyle && oldStyle->border() != style()->border()) | 474 oldStyle && oldStyle->border() != style()->border()) |
| 503 table->invalidateCollapsedBorders(); | 475 table->invalidateCollapsedBorders(PaintInvalidationStyleChange); |
| 504 | 476 |
| 505 if (LayoutTableBoxComponent::doCellsHaveDirtyWidth(*this, *table, diff, | 477 if (LayoutTableBoxComponent::doCellsHaveDirtyWidth(*this, *table, diff, |
| 506 *oldStyle)) { | 478 *oldStyle)) { |
| 507 if (previousCell()) { | 479 if (previousCell()) { |
| 508 // TODO(dgrogan) Add a layout test showing that setChildNeedsLayout is | 480 // TODO(dgrogan) Add a layout test showing that setChildNeedsLayout is |
| 509 // needed instead of setNeedsLayout. | 481 // needed instead of setNeedsLayout. |
| 510 previousCell()->setChildNeedsLayout(); | 482 previousCell()->setChildNeedsLayout(); |
| 511 previousCell()->setPreferredLogicalWidthsDirty(MarkOnlyThis); | 483 previousCell()->setPreferredLogicalWidthsDirty(MarkOnlyThis); |
| 512 } | 484 } |
| 513 if (nextCell()) { | 485 if (nextCell()) { |
| (...skipping 782 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1296 : 0)) / | 1268 : 0)) / |
| 1297 2; | 1269 2; |
| 1298 return 0; | 1270 return 0; |
| 1299 } | 1271 } |
| 1300 | 1272 |
| 1301 void LayoutTableCell::paint(const PaintInfo& paintInfo, | 1273 void LayoutTableCell::paint(const PaintInfo& paintInfo, |
| 1302 const LayoutPoint& paintOffset) const { | 1274 const LayoutPoint& paintOffset) const { |
| 1303 TableCellPainter(*this).paint(paintInfo, paintOffset); | 1275 TableCellPainter(*this).paint(paintInfo, paintOffset); |
| 1304 } | 1276 } |
| 1305 | 1277 |
| 1306 static void addBorderStyle(LayoutTable::CollapsedBorderValues& borderValues, | 1278 static void addBorderStyle(Vector<CollapsedBorderValue>& borderValues, |
| 1307 CollapsedBorderValue borderValue) { | 1279 CollapsedBorderValue borderValue) { |
| 1308 if (!borderValue.isVisible()) | 1280 if (!borderValue.isVisible()) |
| 1309 return; | 1281 return; |
| 1310 size_t count = borderValues.size(); | 1282 size_t count = borderValues.size(); |
| 1311 for (size_t i = 0; i < count; ++i) { | 1283 for (size_t i = 0; i < count; ++i) { |
| 1312 if (borderValues[i].isSameIgnoringColor(borderValue)) | 1284 if (borderValues[i].isSameIgnoringColor(borderValue)) |
| 1313 return; | 1285 return; |
| 1314 } | 1286 } |
| 1315 borderValues.append(borderValue); | 1287 borderValues.append(borderValue); |
| 1316 } | 1288 } |
| 1317 | 1289 |
| 1318 void LayoutTableCell::collectBorderValues( | 1290 bool LayoutTableCell::collectBorderValues( |
| 1319 LayoutTable::CollapsedBorderValues& borderValues) { | 1291 Vector<CollapsedBorderValue>& borderValues) { |
| 1320 CollapsedBorderValues newValues( | 1292 CollapsedBorderValues newValues = { |
| 1321 *table(), computeCollapsedStartBorder(), computeCollapsedEndBorder(), | 1293 computeCollapsedStartBorder(), computeCollapsedEndBorder(), |
| 1322 computeCollapsedBeforeBorder(), computeCollapsedAfterBorder()); | 1294 computeCollapsedBeforeBorder(), computeCollapsedAfterBorder()}; |
| 1323 | 1295 |
| 1324 bool changed = false; | 1296 bool changed = false; |
| 1325 if (!newValues.startBorder().isVisible() && | 1297 if (newValues.allBordersAreInvisible()) { |
| 1326 !newValues.endBorder().isVisible() && | |
| 1327 !newValues.beforeBorder().isVisible() && | |
| 1328 !newValues.afterBorder().isVisible()) { | |
| 1329 changed = !!m_collapsedBorderValues; | 1298 changed = !!m_collapsedBorderValues; |
| 1330 m_collapsedBorderValues = nullptr; | 1299 m_collapsedBorderValues = nullptr; |
| 1331 } else if (!m_collapsedBorderValues) { | 1300 } else if (!m_collapsedBorderValues) { |
| 1332 changed = true; | 1301 changed = true; |
| 1333 m_collapsedBorderValues = wrapUnique(new CollapsedBorderValues( | 1302 m_collapsedBorderValues = wrapUnique(new CollapsedBorderValues(newValues)); |
| 1334 *table(), newValues.startBorder(), newValues.endBorder(), | |
| 1335 newValues.beforeBorder(), newValues.afterBorder())); | |
| 1336 } else { | 1303 } else { |
| 1337 // We check visuallyEquals so that the table cell is invalidated only if a | 1304 changed = !m_collapsedBorderValues->bordersVisuallyEqual(newValues); |
| 1338 // changed collapsed border is visible in the first place. | |
| 1339 changed = !m_collapsedBorderValues->startBorder().visuallyEquals( | |
| 1340 newValues.startBorder()) || | |
| 1341 !m_collapsedBorderValues->endBorder().visuallyEquals( | |
| 1342 newValues.endBorder()) || | |
| 1343 !m_collapsedBorderValues->beforeBorder().visuallyEquals( | |
| 1344 newValues.beforeBorder()) || | |
| 1345 !m_collapsedBorderValues->afterBorder().visuallyEquals( | |
| 1346 newValues.afterBorder()); | |
| 1347 if (changed) | 1305 if (changed) |
| 1348 m_collapsedBorderValues->setCollapsedBorderValues(newValues); | 1306 *m_collapsedBorderValues = newValues; |
| 1349 } | 1307 } |
| 1350 | 1308 |
| 1351 // If collapsed borders changed, invalidate the cell's display item client on | 1309 addBorderStyle(borderValues, newValues.startBorder); |
| 1352 // the table's backing. | 1310 addBorderStyle(borderValues, newValues.endBorder); |
| 1353 // TODO(crbug.com/451090#c5): Need a way to invalidate/repaint the borders | 1311 addBorderStyle(borderValues, newValues.beforeBorder); |
| 1354 // only. | 1312 addBorderStyle(borderValues, newValues.afterBorder); |
| 1355 if (changed) | 1313 return changed; |
| 1356 ObjectPaintInvalidator(*table()) | |
| 1357 .slowSetPaintingLayerNeedsRepaintAndInvalidateDisplayItemClient( | |
| 1358 *this, PaintInvalidationStyleChange); | |
| 1359 | |
| 1360 addBorderStyle(borderValues, newValues.startBorder()); | |
| 1361 addBorderStyle(borderValues, newValues.endBorder()); | |
| 1362 addBorderStyle(borderValues, newValues.beforeBorder()); | |
| 1363 addBorderStyle(borderValues, newValues.afterBorder()); | |
| 1364 } | 1314 } |
| 1365 | 1315 |
| 1366 void LayoutTableCell::sortBorderValues( | 1316 void LayoutTableCell::sortBorderValues( |
| 1367 LayoutTable::CollapsedBorderValues& borderValues) { | 1317 Vector<CollapsedBorderValue>& borderValues) { |
| 1368 std::sort(borderValues.begin(), borderValues.end(), compareBorders); | 1318 std::sort(borderValues.begin(), borderValues.end(), compareBorders); |
| 1369 } | 1319 } |
| 1370 | 1320 |
| 1371 void LayoutTableCell::paintBoxDecorationBackground( | 1321 void LayoutTableCell::paintBoxDecorationBackground( |
| 1372 const PaintInfo& paintInfo, | 1322 const PaintInfo& paintInfo, |
| 1373 const LayoutPoint& paintOffset) const { | 1323 const LayoutPoint& paintOffset) const { |
| 1374 TableCellPainter(*this).paintBoxDecorationBackground(paintInfo, paintOffset); | 1324 TableCellPainter(*this).paintBoxDecorationBackground(paintInfo, paintOffset); |
| 1375 } | 1325 } |
| 1376 | 1326 |
| 1377 void LayoutTableCell::paintMask(const PaintInfo& paintInfo, | 1327 void LayoutTableCell::paintMask(const PaintInfo& paintInfo, |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1452 } | 1402 } |
| 1453 | 1403 |
| 1454 void LayoutTableCell::invalidateDisplayItemClients( | 1404 void LayoutTableCell::invalidateDisplayItemClients( |
| 1455 PaintInvalidationReason reason) const { | 1405 PaintInvalidationReason reason) const { |
| 1456 LayoutBlockFlow::invalidateDisplayItemClients(reason); | 1406 LayoutBlockFlow::invalidateDisplayItemClients(reason); |
| 1457 | 1407 |
| 1458 if (!usesCompositedCellDisplayItemClients()) | 1408 if (!usesCompositedCellDisplayItemClients()) |
| 1459 return; | 1409 return; |
| 1460 | 1410 |
| 1461 ObjectPaintInvalidator invalidator(*this); | 1411 ObjectPaintInvalidator invalidator(*this); |
| 1462 if (m_collapsedBorderValues) | |
| 1463 invalidator.invalidateDisplayItemClient(*m_collapsedBorderValues, reason); | |
| 1464 if (m_rowBackgroundDisplayItemClient) { | 1412 if (m_rowBackgroundDisplayItemClient) { |
| 1465 invalidator.invalidateDisplayItemClient(*m_rowBackgroundDisplayItemClient, | 1413 invalidator.invalidateDisplayItemClient(*m_rowBackgroundDisplayItemClient, |
| 1466 reason); | 1414 reason); |
| 1467 } | 1415 } |
| 1468 } | 1416 } |
| 1469 | 1417 |
| 1470 // TODO(lunalu): Deliberately dump the "inner" box of table cells, since that | 1418 // TODO(lunalu): Deliberately dump the "inner" box of table cells, since that |
| 1471 // is what current results reflect. We'd like to clean up the results to dump | 1419 // is what current results reflect. We'd like to clean up the results to dump |
| 1472 // both the outer box and the intrinsic padding so that both bits of information | 1420 // both the outer box and the intrinsic padding so that both bits of information |
| 1473 // are captured by the results. | 1421 // are captured by the results. |
| 1474 LayoutRect LayoutTableCell::debugRect() const { | 1422 LayoutRect LayoutTableCell::debugRect() const { |
| 1475 LayoutRect rect = LayoutRect( | 1423 LayoutRect rect = LayoutRect( |
| 1476 location().x(), location().y() + intrinsicPaddingBefore(), size().width(), | 1424 location().x(), location().y() + intrinsicPaddingBefore(), size().width(), |
| 1477 size().height() - intrinsicPaddingBefore() - intrinsicPaddingAfter()); | 1425 size().height() - intrinsicPaddingBefore() - intrinsicPaddingAfter()); |
| 1478 | 1426 |
| 1479 LayoutBlock* cb = containingBlock(); | 1427 LayoutBlock* cb = containingBlock(); |
| 1480 if (cb) | 1428 if (cb) |
| 1481 cb->adjustChildDebugRect(rect); | 1429 cb->adjustChildDebugRect(rect); |
| 1482 | 1430 |
| 1483 return rect; | 1431 return rect; |
| 1484 } | 1432 } |
| 1485 | 1433 |
| 1486 void LayoutTableCell::adjustChildDebugRect(LayoutRect& r) const { | 1434 void LayoutTableCell::adjustChildDebugRect(LayoutRect& r) const { |
| 1487 r.move(0, -intrinsicPaddingBefore()); | 1435 r.move(0, -intrinsicPaddingBefore()); |
| 1488 } | 1436 } |
| 1489 | 1437 |
| 1490 } // namespace blink | 1438 } // namespace blink |
| OLD | NEW |