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 397 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
408 LayoutRect LayoutTableCell::localVisualRect() const { | 408 LayoutRect LayoutTableCell::localVisualRect() const { |
409 // If the table grid is dirty, we cannot get reliable information about | 409 // If the table grid is dirty, we cannot get reliable information about |
410 // adjoining cells, so we ignore outside borders. This should not be a problem | 410 // adjoining cells, so we ignore outside borders. This should not be a problem |
411 // because it means that the table is going to recalculate the grid, relayout | 411 // because it means that the table is going to recalculate the grid, relayout |
412 // and issue a paint invalidation of its current rect, which includes any | 412 // and issue a paint invalidation of its current rect, which includes any |
413 // outside borders of this cell. | 413 // outside borders of this cell. |
414 if (!table()->collapseBorders() || table()->needsSectionRecalc()) | 414 if (!table()->collapseBorders() || table()->needsSectionRecalc()) |
415 return LayoutBlockFlow::localVisualRect(); | 415 return LayoutBlockFlow::localVisualRect(); |
416 | 416 |
417 bool rtl = !styleForCellFlow().isLeftToRightDirection(); | 417 bool rtl = !styleForCellFlow().isLeftToRightDirection(); |
418 int outlineOutset = style()->outlineOutsetExtent(); | 418 LayoutUnit outlineOutset(style()->outlineOutsetExtent()); |
419 int left = std::max(borderHalfLeft(true), outlineOutset); | 419 LayoutUnit left(std::max(borderHalfLeft(true), outlineOutset)); |
420 int right = std::max(borderHalfRight(true), outlineOutset); | 420 LayoutUnit right(std::max(borderHalfRight(true), outlineOutset)); |
421 int top = std::max(borderHalfTop(true), outlineOutset); | 421 LayoutUnit top(std::max(borderHalfTop(true), outlineOutset)); |
422 int bottom = std::max(borderHalfBottom(true), outlineOutset); | 422 LayoutUnit bottom(std::max(borderHalfBottom(true), outlineOutset)); |
423 if ((left && !rtl) || (right && rtl)) { | 423 if ((left && !rtl) || (right && rtl)) { |
424 if (LayoutTableCell* before = table()->cellBefore(this)) { | 424 if (LayoutTableCell* before = table()->cellBefore(this)) { |
425 top = std::max(top, before->borderHalfTop(true)); | 425 top = std::max(top, before->borderHalfTop(true)); |
426 bottom = std::max(bottom, before->borderHalfBottom(true)); | 426 bottom = std::max(bottom, before->borderHalfBottom(true)); |
427 } | 427 } |
428 } | 428 } |
429 if ((left && rtl) || (right && !rtl)) { | 429 if ((left && rtl) || (right && !rtl)) { |
430 if (LayoutTableCell* after = table()->cellAfter(this)) { | 430 if (LayoutTableCell* after = table()->cellAfter(this)) { |
431 top = std::max(top, after->borderHalfTop(true)); | 431 top = std::max(top, after->borderHalfTop(true)); |
432 bottom = std::max(bottom, after->borderHalfBottom(true)); | 432 bottom = std::max(bottom, after->borderHalfBottom(true)); |
(...skipping 737 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1170 table->style()->borderAfter(), | 1170 table->style()->borderAfter(), |
1171 includeColor ? table->resolveColor(afterColorProperty) : Color(), | 1171 includeColor ? table->resolveColor(afterColorProperty) : Color(), |
1172 BorderPrecedenceTable)); | 1172 BorderPrecedenceTable)); |
1173 if (!result.exists()) | 1173 if (!result.exists()) |
1174 return result; | 1174 return result; |
1175 } | 1175 } |
1176 | 1176 |
1177 return result; | 1177 return result; |
1178 } | 1178 } |
1179 | 1179 |
1180 int LayoutTableCell::borderLeft() const { | 1180 LayoutUnit LayoutTableCell::borderLeft() const { |
1181 return table()->collapseBorders() ? borderHalfLeft(false) | 1181 return table()->collapseBorders() ? borderHalfLeft(false) |
1182 : LayoutBlockFlow::borderLeft(); | 1182 : LayoutBlockFlow::borderLeft(); |
1183 } | 1183 } |
1184 | 1184 |
1185 int LayoutTableCell::borderRight() const { | 1185 LayoutUnit LayoutTableCell::borderRight() const { |
1186 return table()->collapseBorders() ? borderHalfRight(false) | 1186 return table()->collapseBorders() ? borderHalfRight(false) |
1187 : LayoutBlockFlow::borderRight(); | 1187 : LayoutBlockFlow::borderRight(); |
1188 } | 1188 } |
1189 | 1189 |
1190 int LayoutTableCell::borderTop() const { | 1190 LayoutUnit LayoutTableCell::borderTop() const { |
1191 return table()->collapseBorders() ? borderHalfTop(false) | 1191 return table()->collapseBorders() ? borderHalfTop(false) |
1192 : LayoutBlockFlow::borderTop(); | 1192 : LayoutBlockFlow::borderTop(); |
1193 } | 1193 } |
1194 | 1194 |
1195 int LayoutTableCell::borderBottom() const { | 1195 LayoutUnit LayoutTableCell::borderBottom() const { |
1196 return table()->collapseBorders() ? borderHalfBottom(false) | 1196 return table()->collapseBorders() ? borderHalfBottom(false) |
1197 : LayoutBlockFlow::borderBottom(); | 1197 : LayoutBlockFlow::borderBottom(); |
1198 } | 1198 } |
1199 | 1199 |
1200 // FIXME: https://bugs.webkit.org/show_bug.cgi?id=46191, make the collapsed | 1200 // FIXME: https://bugs.webkit.org/show_bug.cgi?id=46191, make the collapsed |
1201 // border drawing work with different block flow values instead of being | 1201 // border drawing work with different block flow values instead of being |
1202 // hard-coded to top-to-bottom. | 1202 // hard-coded to top-to-bottom. |
1203 int LayoutTableCell::borderStart() const { | 1203 LayoutUnit LayoutTableCell::borderStart() const { |
1204 return table()->collapseBorders() ? borderHalfStart(false) | 1204 return table()->collapseBorders() ? borderHalfStart(false) |
1205 : LayoutBlockFlow::borderStart(); | 1205 : LayoutBlockFlow::borderStart(); |
1206 } | 1206 } |
1207 | 1207 |
1208 int LayoutTableCell::borderEnd() const { | 1208 LayoutUnit LayoutTableCell::borderEnd() const { |
1209 return table()->collapseBorders() ? borderHalfEnd(false) | 1209 return table()->collapseBorders() ? borderHalfEnd(false) |
1210 : LayoutBlockFlow::borderEnd(); | 1210 : LayoutBlockFlow::borderEnd(); |
1211 } | 1211 } |
1212 | 1212 |
1213 int LayoutTableCell::borderBefore() const { | 1213 LayoutUnit LayoutTableCell::borderBefore() const { |
1214 return table()->collapseBorders() ? borderHalfBefore(false) | 1214 return table()->collapseBorders() ? borderHalfBefore(false) |
1215 : LayoutBlockFlow::borderBefore(); | 1215 : LayoutBlockFlow::borderBefore(); |
1216 } | 1216 } |
1217 | 1217 |
1218 int LayoutTableCell::borderAfter() const { | 1218 LayoutUnit LayoutTableCell::borderAfter() const { |
1219 return table()->collapseBorders() ? borderHalfAfter(false) | 1219 return table()->collapseBorders() ? borderHalfAfter(false) |
1220 : LayoutBlockFlow::borderAfter(); | 1220 : LayoutBlockFlow::borderAfter(); |
1221 } | 1221 } |
1222 | 1222 |
1223 int LayoutTableCell::borderHalfLeft(bool outer) const { | 1223 LayoutUnit LayoutTableCell::borderHalfLeft(bool outer) const { |
1224 const ComputedStyle& styleForCellFlow = this->styleForCellFlow(); | 1224 const ComputedStyle& styleForCellFlow = this->styleForCellFlow(); |
1225 if (styleForCellFlow.isHorizontalWritingMode()) | 1225 if (styleForCellFlow.isHorizontalWritingMode()) |
1226 return styleForCellFlow.isLeftToRightDirection() ? borderHalfStart(outer) | 1226 return styleForCellFlow.isLeftToRightDirection() ? borderHalfStart(outer) |
1227 : borderHalfEnd(outer); | 1227 : borderHalfEnd(outer); |
1228 return styleForCellFlow.isFlippedBlocksWritingMode() | 1228 return styleForCellFlow.isFlippedBlocksWritingMode() |
1229 ? borderHalfAfter(outer) | 1229 ? borderHalfAfter(outer) |
1230 : borderHalfBefore(outer); | 1230 : borderHalfBefore(outer); |
1231 } | 1231 } |
1232 | 1232 |
1233 int LayoutTableCell::borderHalfRight(bool outer) const { | 1233 LayoutUnit LayoutTableCell::borderHalfRight(bool outer) const { |
1234 const ComputedStyle& styleForCellFlow = this->styleForCellFlow(); | 1234 const ComputedStyle& styleForCellFlow = this->styleForCellFlow(); |
1235 if (styleForCellFlow.isHorizontalWritingMode()) | 1235 if (styleForCellFlow.isHorizontalWritingMode()) |
1236 return styleForCellFlow.isLeftToRightDirection() ? borderHalfEnd(outer) | 1236 return styleForCellFlow.isLeftToRightDirection() ? borderHalfEnd(outer) |
1237 : borderHalfStart(outer); | 1237 : borderHalfStart(outer); |
1238 return styleForCellFlow.isFlippedBlocksWritingMode() ? borderHalfBefore(outer) | 1238 return styleForCellFlow.isFlippedBlocksWritingMode() ? borderHalfBefore(outer) |
1239 : borderHalfAfter(outer); | 1239 : borderHalfAfter(outer); |
1240 } | 1240 } |
1241 | 1241 |
1242 int LayoutTableCell::borderHalfTop(bool outer) const { | 1242 LayoutUnit LayoutTableCell::borderHalfTop(bool outer) const { |
1243 const ComputedStyle& styleForCellFlow = this->styleForCellFlow(); | 1243 const ComputedStyle& styleForCellFlow = this->styleForCellFlow(); |
1244 if (styleForCellFlow.isHorizontalWritingMode()) | 1244 if (styleForCellFlow.isHorizontalWritingMode()) |
1245 return styleForCellFlow.isFlippedBlocksWritingMode() | 1245 return styleForCellFlow.isFlippedBlocksWritingMode() |
1246 ? borderHalfAfter(outer) | 1246 ? borderHalfAfter(outer) |
1247 : borderHalfBefore(outer); | 1247 : borderHalfBefore(outer); |
1248 return styleForCellFlow.isLeftToRightDirection() ? borderHalfStart(outer) | 1248 return styleForCellFlow.isLeftToRightDirection() ? borderHalfStart(outer) |
1249 : borderHalfEnd(outer); | 1249 : borderHalfEnd(outer); |
1250 } | 1250 } |
1251 | 1251 |
1252 int LayoutTableCell::borderHalfBottom(bool outer) const { | 1252 LayoutUnit LayoutTableCell::borderHalfBottom(bool outer) const { |
1253 const ComputedStyle& styleForCellFlow = this->styleForCellFlow(); | 1253 const ComputedStyle& styleForCellFlow = this->styleForCellFlow(); |
1254 if (styleForCellFlow.isHorizontalWritingMode()) | 1254 if (styleForCellFlow.isHorizontalWritingMode()) |
1255 return styleForCellFlow.isFlippedBlocksWritingMode() | 1255 return styleForCellFlow.isFlippedBlocksWritingMode() |
1256 ? borderHalfBefore(outer) | 1256 ? borderHalfBefore(outer) |
1257 : borderHalfAfter(outer); | 1257 : borderHalfAfter(outer); |
1258 return styleForCellFlow.isLeftToRightDirection() ? borderHalfEnd(outer) | 1258 return styleForCellFlow.isLeftToRightDirection() ? borderHalfEnd(outer) |
1259 : borderHalfStart(outer); | 1259 : borderHalfStart(outer); |
1260 } | 1260 } |
1261 | 1261 |
1262 int LayoutTableCell::borderHalfStart(bool outer) const { | 1262 LayoutUnit LayoutTableCell::borderHalfStart(bool outer) const { |
1263 CollapsedBorderValue border = | 1263 CollapsedBorderValue border = |
1264 computeCollapsedStartBorder(DoNotIncludeBorderColor); | 1264 computeCollapsedStartBorder(DoNotIncludeBorderColor); |
1265 if (border.exists()) | 1265 if (border.exists()) { |
1266 return (border.width() + | 1266 return LayoutUnit( |
1267 ((styleForCellFlow().isLeftToRightDirection() ^ outer) ? 1 : 0)) / | 1267 (border.width() + |
1268 2; // Give the extra pixel to top and left. | 1268 ((styleForCellFlow().isLeftToRightDirection() ^ outer) ? 1 : 0)) / |
1269 return 0; | 1269 2); // Give the extra pixel to top and left. |
| 1270 } |
| 1271 return LayoutUnit(); |
1270 } | 1272 } |
1271 | 1273 |
1272 int LayoutTableCell::borderHalfEnd(bool outer) const { | 1274 LayoutUnit LayoutTableCell::borderHalfEnd(bool outer) const { |
1273 CollapsedBorderValue border = | 1275 CollapsedBorderValue border = |
1274 computeCollapsedEndBorder(DoNotIncludeBorderColor); | 1276 computeCollapsedEndBorder(DoNotIncludeBorderColor); |
1275 if (border.exists()) | 1277 if (border.exists()) { |
1276 return (border.width() + | 1278 return LayoutUnit( |
1277 ((styleForCellFlow().isLeftToRightDirection() ^ outer) ? 0 : 1)) / | 1279 (border.width() + |
1278 2; | 1280 ((styleForCellFlow().isLeftToRightDirection() ^ outer) ? 0 : 1)) / |
1279 return 0; | 1281 2); |
| 1282 } |
| 1283 return LayoutUnit(); |
1280 } | 1284 } |
1281 | 1285 |
1282 int LayoutTableCell::borderHalfBefore(bool outer) const { | 1286 LayoutUnit LayoutTableCell::borderHalfBefore(bool outer) const { |
1283 CollapsedBorderValue border = | 1287 CollapsedBorderValue border = |
1284 computeCollapsedBeforeBorder(DoNotIncludeBorderColor); | 1288 computeCollapsedBeforeBorder(DoNotIncludeBorderColor); |
1285 if (border.exists()) | 1289 if (border.exists()) { |
1286 return (border.width() + | 1290 return LayoutUnit( |
1287 ((styleForCellFlow().isFlippedBlocksWritingMode() ^ outer) ? 0 | 1291 (border.width() + |
1288 : 1)) / | 1292 ((styleForCellFlow().isFlippedBlocksWritingMode() ^ outer) ? 0 : 1)) / |
1289 2; // Give the extra pixel to top and left. | 1293 2); // Give the extra pixel to top and left. |
1290 return 0; | 1294 } |
| 1295 return LayoutUnit(); |
1291 } | 1296 } |
1292 | 1297 |
1293 int LayoutTableCell::borderHalfAfter(bool outer) const { | 1298 LayoutUnit LayoutTableCell::borderHalfAfter(bool outer) const { |
1294 CollapsedBorderValue border = | 1299 CollapsedBorderValue border = |
1295 computeCollapsedAfterBorder(DoNotIncludeBorderColor); | 1300 computeCollapsedAfterBorder(DoNotIncludeBorderColor); |
1296 if (border.exists()) | 1301 if (border.exists()) { |
1297 return (border.width() + | 1302 return LayoutUnit( |
1298 ((styleForCellFlow().isFlippedBlocksWritingMode() ^ outer) ? 1 | 1303 (border.width() + |
1299 : 0)) / | 1304 ((styleForCellFlow().isFlippedBlocksWritingMode() ^ outer) ? 1 : 0)) / |
1300 2; | 1305 2); |
1301 return 0; | 1306 } |
| 1307 return LayoutUnit(); |
1302 } | 1308 } |
1303 | 1309 |
1304 void LayoutTableCell::paint(const PaintInfo& paintInfo, | 1310 void LayoutTableCell::paint(const PaintInfo& paintInfo, |
1305 const LayoutPoint& paintOffset) const { | 1311 const LayoutPoint& paintOffset) const { |
1306 TableCellPainter(*this).paint(paintInfo, paintOffset); | 1312 TableCellPainter(*this).paint(paintInfo, paintOffset); |
1307 } | 1313 } |
1308 | 1314 |
1309 static void addBorderStyle(LayoutTable::CollapsedBorderValues& borderValues, | 1315 static void addBorderStyle(LayoutTable::CollapsedBorderValues& borderValues, |
1310 CollapsedBorderValue borderValue) { | 1316 CollapsedBorderValue borderValue) { |
1311 if (!borderValue.isVisible()) | 1317 if (!borderValue.isVisible()) |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1492 } | 1498 } |
1493 | 1499 |
1494 bool LayoutTableCell::hasLineIfEmpty() const { | 1500 bool LayoutTableCell::hasLineIfEmpty() const { |
1495 if (node() && hasEditableStyle(*node())) | 1501 if (node() && hasEditableStyle(*node())) |
1496 return true; | 1502 return true; |
1497 | 1503 |
1498 return LayoutBlock::hasLineIfEmpty(); | 1504 return LayoutBlock::hasLineIfEmpty(); |
1499 } | 1505 } |
1500 | 1506 |
1501 } // namespace blink | 1507 } // namespace blink |
OLD | NEW |