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, 2008, 2009, 2010 Apple Inc. All rights reserved. | 7 * Copyright (C) 2003, 2004, 2005, 2006, 2008, 2009, 2010 Apple Inc. All rights reserved. |
8 * Copyright (C) 2006 Alexey Proskuryakov (ap@nypop.com) | 8 * Copyright (C) 2006 Alexey Proskuryakov (ap@nypop.com) |
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 1047 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1058 // The slow path does not make any use of the overflowing ce lls info, don't hold on to the memory. | 1058 // The slow path does not make any use of the overflowing ce lls info, don't hold on to the memory. |
1059 m_overflowingCells.clear(); | 1059 m_overflowingCells.clear(); |
1060 } | 1060 } |
1061 } | 1061 } |
1062 } | 1062 } |
1063 } | 1063 } |
1064 | 1064 |
1065 ASSERT(hasOverflowingCell == this->hasOverflowingCell()); | 1065 ASSERT(hasOverflowingCell == this->hasOverflowingCell()); |
1066 } | 1066 } |
1067 | 1067 |
1068 int RenderTableSection::calcOuterBorderBefore() const | 1068 int RenderTableSection::calcOuterBorder(BorderSide side) const |
1069 { | 1069 { |
1070 if (side == BorderBefore || side == BorderAfter) { | |
ojan
2014/01/24 01:35:13
I'd use a separate function for before/after and s
| |
1071 unsigned totalCols = table()->numEffCols(); | |
1072 if (!m_grid.size() || !totalCols) | |
1073 return 0; | |
1074 | |
1075 unsigned borderWidth = 0; | |
1076 | |
1077 const BorderValue& sb = side == BorderBefore ? style()->borderBefore() : style()->borderAfter(); | |
1078 if (sb.style() == BHIDDEN) | |
1079 return -1; | |
1080 if (sb.style() > BHIDDEN) | |
1081 borderWidth = sb.width(); | |
1082 | |
1083 const BorderValue& rb = side == BorderBefore ? firstChild()->style()->bo rderBefore() : lastChild()->style()->borderAfter(); | |
1084 if (rb.style() == BHIDDEN) | |
1085 return -1; | |
1086 if (rb.style() > BHIDDEN && rb.width() > borderWidth) | |
1087 borderWidth = rb.width(); | |
1088 | |
1089 bool allHidden = true; | |
1090 for (unsigned c = 0; c < totalCols; c++) { | |
1091 const CellStruct& current = cellAt(side == BorderBefore ? 0 : m_grid .size() - 1, c); | |
1092 if (current.inColSpan || !current.hasCells()) | |
1093 continue; | |
1094 const RenderStyle* primaryCellStyle = current.primaryCell()->style() ; | |
1095 const BorderValue& cb = side == BorderBefore ? primaryCellStyle->bor derBefore() : primaryCellStyle->borderAfter(); // FIXME: Make this work with per pendicular and flipped cells. | |
1096 // FIXME: Don't repeat for the same col group | |
1097 RenderTableCol* colGroup = table()->colElement(c); | |
1098 if (colGroup) { | |
1099 const BorderValue& gb = side == BorderBefore ? colGroup->style() ->borderBefore() : colGroup->style()->borderAfter(); | |
1100 if (gb.style() == BHIDDEN || cb.style() == BHIDDEN) | |
1101 continue; | |
1102 allHidden = false; | |
1103 if (gb.style() > BHIDDEN && gb.width() > borderWidth) | |
1104 borderWidth = gb.width(); | |
1105 if (cb.style() > BHIDDEN && cb.width() > borderWidth) | |
1106 borderWidth = cb.width(); | |
1107 } else { | |
1108 if (cb.style() == BHIDDEN) | |
1109 continue; | |
1110 allHidden = false; | |
1111 if (cb.style() > BHIDDEN && cb.width() > borderWidth) | |
1112 borderWidth = cb.width(); | |
1113 } | |
1114 } | |
1115 if (allHidden) | |
1116 return -1; | |
1117 | |
1118 if (side == BorderAfter) | |
1119 borderWidth++; // Distribute rounding error | |
1120 return borderWidth / 2; | |
1121 } | |
1122 | |
1123 ASSERT(side == BorderStart || side == BorderEnd); | |
1070 unsigned totalCols = table()->numEffCols(); | 1124 unsigned totalCols = table()->numEffCols(); |
1071 if (!m_grid.size() || !totalCols) | 1125 if (!m_grid.size() || !totalCols) |
1072 return 0; | 1126 return 0; |
1127 unsigned colIndex = side == BorderStart ? 0 : totalCols - 1; | |
1073 | 1128 |
1074 unsigned borderWidth = 0; | 1129 unsigned borderWidth = 0; |
1075 | 1130 |
1076 const BorderValue& sb = style()->borderBefore(); | 1131 const BorderValue& sb = side == BorderStart ? style()->borderStart() : style ()->borderEnd(); |
1077 if (sb.style() == BHIDDEN) | 1132 if (sb.style() == BHIDDEN) |
1078 return -1; | 1133 return -1; |
1079 if (sb.style() > BHIDDEN) | 1134 if (sb.style() > BHIDDEN) |
1080 borderWidth = sb.width(); | 1135 borderWidth = sb.width(); |
1081 | 1136 |
1082 const BorderValue& rb = firstChild()->style()->borderBefore(); | 1137 if (RenderTableCol* colGroup = table()->colElement(colIndex)) { |
1083 if (rb.style() == BHIDDEN) | 1138 const BorderValue& gb = side == BorderStart ? colGroup->style()->borderS tart() : colGroup->style()->borderEnd(); |
1084 return -1; | |
1085 if (rb.style() > BHIDDEN && rb.width() > borderWidth) | |
1086 borderWidth = rb.width(); | |
1087 | |
1088 bool allHidden = true; | |
1089 for (unsigned c = 0; c < totalCols; c++) { | |
1090 const CellStruct& current = cellAt(0, c); | |
1091 if (current.inColSpan || !current.hasCells()) | |
1092 continue; | |
1093 const BorderValue& cb = current.primaryCell()->style()->borderBefore(); // FIXME: Make this work with perpendicular and flipped cells. | |
1094 // FIXME: Don't repeat for the same col group | |
1095 RenderTableCol* colGroup = table()->colElement(c); | |
1096 if (colGroup) { | |
1097 const BorderValue& gb = colGroup->style()->borderBefore(); | |
1098 if (gb.style() == BHIDDEN || cb.style() == BHIDDEN) | |
1099 continue; | |
1100 allHidden = false; | |
1101 if (gb.style() > BHIDDEN && gb.width() > borderWidth) | |
1102 borderWidth = gb.width(); | |
1103 if (cb.style() > BHIDDEN && cb.width() > borderWidth) | |
1104 borderWidth = cb.width(); | |
1105 } else { | |
1106 if (cb.style() == BHIDDEN) | |
1107 continue; | |
1108 allHidden = false; | |
1109 if (cb.style() > BHIDDEN && cb.width() > borderWidth) | |
1110 borderWidth = cb.width(); | |
1111 } | |
1112 } | |
1113 if (allHidden) | |
1114 return -1; | |
1115 | |
1116 return borderWidth / 2; | |
1117 } | |
1118 | |
1119 int RenderTableSection::calcOuterBorderAfter() const | |
1120 { | |
1121 unsigned totalCols = table()->numEffCols(); | |
1122 if (!m_grid.size() || !totalCols) | |
1123 return 0; | |
1124 | |
1125 unsigned borderWidth = 0; | |
1126 | |
1127 const BorderValue& sb = style()->borderAfter(); | |
1128 if (sb.style() == BHIDDEN) | |
1129 return -1; | |
1130 if (sb.style() > BHIDDEN) | |
1131 borderWidth = sb.width(); | |
1132 | |
1133 const BorderValue& rb = lastChild()->style()->borderAfter(); | |
1134 if (rb.style() == BHIDDEN) | |
1135 return -1; | |
1136 if (rb.style() > BHIDDEN && rb.width() > borderWidth) | |
1137 borderWidth = rb.width(); | |
1138 | |
1139 bool allHidden = true; | |
1140 for (unsigned c = 0; c < totalCols; c++) { | |
1141 const CellStruct& current = cellAt(m_grid.size() - 1, c); | |
1142 if (current.inColSpan || !current.hasCells()) | |
1143 continue; | |
1144 const BorderValue& cb = current.primaryCell()->style()->borderAfter(); / / FIXME: Make this work with perpendicular and flipped cells. | |
1145 // FIXME: Don't repeat for the same col group | |
1146 RenderTableCol* colGroup = table()->colElement(c); | |
1147 if (colGroup) { | |
1148 const BorderValue& gb = colGroup->style()->borderAfter(); | |
1149 if (gb.style() == BHIDDEN || cb.style() == BHIDDEN) | |
1150 continue; | |
1151 allHidden = false; | |
1152 if (gb.style() > BHIDDEN && gb.width() > borderWidth) | |
1153 borderWidth = gb.width(); | |
1154 if (cb.style() > BHIDDEN && cb.width() > borderWidth) | |
1155 borderWidth = cb.width(); | |
1156 } else { | |
1157 if (cb.style() == BHIDDEN) | |
1158 continue; | |
1159 allHidden = false; | |
1160 if (cb.style() > BHIDDEN && cb.width() > borderWidth) | |
1161 borderWidth = cb.width(); | |
1162 } | |
1163 } | |
1164 if (allHidden) | |
1165 return -1; | |
1166 | |
1167 return (borderWidth + 1) / 2; | |
1168 } | |
1169 | |
1170 int RenderTableSection::calcOuterBorderStart() const | |
1171 { | |
1172 unsigned totalCols = table()->numEffCols(); | |
1173 if (!m_grid.size() || !totalCols) | |
1174 return 0; | |
1175 | |
1176 unsigned borderWidth = 0; | |
1177 | |
1178 const BorderValue& sb = style()->borderStart(); | |
1179 if (sb.style() == BHIDDEN) | |
1180 return -1; | |
1181 if (sb.style() > BHIDDEN) | |
1182 borderWidth = sb.width(); | |
1183 | |
1184 if (RenderTableCol* colGroup = table()->colElement(0)) { | |
1185 const BorderValue& gb = colGroup->style()->borderStart(); | |
1186 if (gb.style() == BHIDDEN) | 1139 if (gb.style() == BHIDDEN) |
1187 return -1; | 1140 return -1; |
1188 if (gb.style() > BHIDDEN && gb.width() > borderWidth) | 1141 if (gb.style() > BHIDDEN && gb.width() > borderWidth) |
1189 borderWidth = gb.width(); | |
1190 } | |
1191 | |
1192 bool allHidden = true; | |
1193 for (unsigned r = 0; r < m_grid.size(); r++) { | |
1194 const CellStruct& current = cellAt(r, 0); | |
1195 if (!current.hasCells()) | |
1196 continue; | |
1197 // FIXME: Don't repeat for the same cell | |
1198 const BorderValue& cb = current.primaryCell()->style()->borderStart(); / / FIXME: Make this work with perpendicular and flipped cells. | |
1199 const BorderValue& rb = current.primaryCell()->parent()->style()->border Start(); | |
1200 if (cb.style() == BHIDDEN || rb.style() == BHIDDEN) | |
1201 continue; | |
1202 allHidden = false; | |
1203 if (cb.style() > BHIDDEN && cb.width() > borderWidth) | |
1204 borderWidth = cb.width(); | |
1205 if (rb.style() > BHIDDEN && rb.width() > borderWidth) | |
1206 borderWidth = rb.width(); | |
1207 } | |
1208 if (allHidden) | |
1209 return -1; | |
1210 | |
1211 return (borderWidth + (table()->style()->isLeftToRightDirection() ? 0 : 1)) / 2; | |
1212 } | |
1213 | |
1214 int RenderTableSection::calcOuterBorderEnd() const | |
1215 { | |
1216 unsigned totalCols = table()->numEffCols(); | |
1217 if (!m_grid.size() || !totalCols) | |
1218 return 0; | |
1219 | |
1220 unsigned borderWidth = 0; | |
1221 | |
1222 const BorderValue& sb = style()->borderEnd(); | |
1223 if (sb.style() == BHIDDEN) | |
1224 return -1; | |
1225 if (sb.style() > BHIDDEN) | |
1226 borderWidth = sb.width(); | |
1227 | |
1228 if (RenderTableCol* colGroup = table()->colElement(totalCols - 1)) { | |
1229 const BorderValue& gb = colGroup->style()->borderEnd(); | |
1230 if (gb.style() == BHIDDEN) | |
1231 return -1; | |
1232 if (gb.style() > BHIDDEN && gb.width() > borderWidth) | |
1233 borderWidth = gb.width(); | 1142 borderWidth = gb.width(); |
1234 } | 1143 } |
1235 | 1144 |
1236 bool allHidden = true; | 1145 bool allHidden = true; |
1237 for (unsigned r = 0; r < m_grid.size(); r++) { | 1146 for (unsigned r = 0; r < m_grid.size(); r++) { |
1238 const CellStruct& current = cellAt(r, totalCols - 1); | 1147 const CellStruct& current = cellAt(r, colIndex); |
1239 if (!current.hasCells()) | 1148 if (!current.hasCells()) |
1240 continue; | 1149 continue; |
1241 // FIXME: Don't repeat for the same cell | 1150 // FIXME: Don't repeat for the same cell |
1242 const BorderValue& cb = current.primaryCell()->style()->borderEnd(); // FIXME: Make this work with perpendicular and flipped cells. | 1151 const RenderStyle* primaryCellStyle = current.primaryCell()->style(); |
1243 const BorderValue& rb = current.primaryCell()->parent()->style()->border End(); | 1152 const RenderStyle* primaryCellParentStyle = current.primaryCell()->paren t()->style(); |
1153 const BorderValue& cb = side == BorderStart ? primaryCellStyle->borderSt art() : primaryCellStyle->borderEnd(); // FIXME: Make this work with perpendicul ar and flipped cells. | |
1154 const BorderValue& rb = side == BorderStart ? primaryCellParentStyle->bo rderStart() : primaryCellParentStyle->borderEnd(); | |
1244 if (cb.style() == BHIDDEN || rb.style() == BHIDDEN) | 1155 if (cb.style() == BHIDDEN || rb.style() == BHIDDEN) |
1245 continue; | 1156 continue; |
1246 allHidden = false; | 1157 allHidden = false; |
1247 if (cb.style() > BHIDDEN && cb.width() > borderWidth) | 1158 if (cb.style() > BHIDDEN && cb.width() > borderWidth) |
1248 borderWidth = cb.width(); | 1159 borderWidth = cb.width(); |
1249 if (rb.style() > BHIDDEN && rb.width() > borderWidth) | 1160 if (rb.style() > BHIDDEN && rb.width() > borderWidth) |
1250 borderWidth = rb.width(); | 1161 borderWidth = rb.width(); |
1251 } | 1162 } |
1252 if (allHidden) | 1163 if (allHidden) |
1253 return -1; | 1164 return -1; |
1254 | 1165 |
1255 return (borderWidth + (table()->style()->isLeftToRightDirection() ? 1 : 0)) / 2; | 1166 if ((side == BorderStart) != table()->style()->isLeftToRightDirection()) |
1167 borderWidth++; // Distribute rounding error | |
1168 return borderWidth / 2; | |
1256 } | 1169 } |
1257 | 1170 |
1258 void RenderTableSection::recalcOuterBorder() | 1171 void RenderTableSection::recalcOuterBorder() |
1259 { | 1172 { |
1260 m_outerBorderBefore = calcOuterBorderBefore(); | 1173 m_outerBorderBefore = calcOuterBorder(BorderBefore); |
1261 m_outerBorderAfter = calcOuterBorderAfter(); | 1174 m_outerBorderAfter = calcOuterBorder(BorderAfter); |
1262 m_outerBorderStart = calcOuterBorderStart(); | 1175 m_outerBorderStart = calcOuterBorder(BorderStart); |
1263 m_outerBorderEnd = calcOuterBorderEnd(); | 1176 m_outerBorderEnd = calcOuterBorder(BorderEnd); |
1264 } | 1177 } |
1265 | 1178 |
1266 int RenderTableSection::firstLineBoxBaseline() const | 1179 int RenderTableSection::firstLineBoxBaseline() const |
1267 { | 1180 { |
1268 if (!m_grid.size()) | 1181 if (!m_grid.size()) |
1269 return -1; | 1182 return -1; |
1270 | 1183 |
1271 int firstLineBaseline = m_grid[0].baseline; | 1184 int firstLineBaseline = m_grid[0].baseline; |
1272 if (firstLineBaseline) | 1185 if (firstLineBaseline) |
1273 return firstLineBaseline + m_rowPos[0]; | 1186 return firstLineBaseline + m_rowPos[0]; |
(...skipping 540 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1814 if (!style()->isLeftToRightDirection()) | 1727 if (!style()->isLeftToRightDirection()) |
1815 cellLocation.setX(table()->columnPositions()[table()->numEffCols()] - ta ble()->columnPositions()[table()->colToEffCol(cell->col() + cell->colSpan())] + horizontalBorderSpacing); | 1728 cellLocation.setX(table()->columnPositions()[table()->numEffCols()] - ta ble()->columnPositions()[table()->colToEffCol(cell->col() + cell->colSpan())] + horizontalBorderSpacing); |
1816 else | 1729 else |
1817 cellLocation.setX(table()->columnPositions()[effectiveColumn] + horizont alBorderSpacing); | 1730 cellLocation.setX(table()->columnPositions()[effectiveColumn] + horizont alBorderSpacing); |
1818 | 1731 |
1819 cell->setLogicalLocation(cellLocation); | 1732 cell->setLogicalLocation(cellLocation); |
1820 view()->addLayoutDelta(oldCellLocation - cell->location()); | 1733 view()->addLayoutDelta(oldCellLocation - cell->location()); |
1821 } | 1734 } |
1822 | 1735 |
1823 } // namespace WebCore | 1736 } // namespace WebCore |
OLD | NEW |