OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2000 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 2000 Lars Knoll (knoll@kde.org) |
3 * Copyright (C) 2003, 2004, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All r
ight reserved. | 3 * Copyright (C) 2003, 2004, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All r
ight reserved. |
4 * Copyright (C) 2010 Google Inc. All rights reserved. | 4 * Copyright (C) 2010 Google Inc. All rights reserved. |
5 * | 5 * |
6 * This library is free software; you can redistribute it and/or | 6 * This library is free software; you can redistribute it and/or |
7 * modify it under the terms of the GNU Library General Public | 7 * modify it under the terms of the GNU Library General Public |
8 * License as published by the Free Software Foundation; either | 8 * License as published by the Free Software Foundation; either |
9 * version 2 of the License, or (at your option) any later version. | 9 * version 2 of the License, or (at your option) any later version. |
10 * | 10 * |
11 * This library is distributed in the hope that it will be useful, | 11 * This library is distributed in the hope that it will be useful, |
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
14 * Library General Public License for more details. | 14 * Library General Public License for more details. |
15 * | 15 * |
16 * You should have received a copy of the GNU Library General Public License | 16 * You should have received a copy of the GNU Library General Public License |
17 * along with this library; see the file COPYING.LIB. If not, write to | 17 * along with this library; see the file COPYING.LIB. If not, write to |
18 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | 18 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
19 * Boston, MA 02110-1301, USA. | 19 * Boston, MA 02110-1301, USA. |
20 * | 20 * |
21 */ | 21 */ |
22 | 22 |
23 #include "config.h" | 23 #include "config.h" |
24 | 24 |
25 #include "core/rendering/FastTextAutosizer.h" | 25 #include "core/rendering/FastTextAutosizer.h" |
26 #include "core/rendering/LayoutRectRecorder.h" | 26 #include "core/rendering/LayoutRectRecorder.h" |
27 #include "core/rendering/RenderCounter.h" | 27 #include "core/rendering/RenderCounter.h" |
28 #include "core/rendering/RenderFlowThread.h" | |
29 #include "core/rendering/RenderLayer.h" | 28 #include "core/rendering/RenderLayer.h" |
30 #include "core/rendering/RenderListMarker.h" | 29 #include "core/rendering/RenderListMarker.h" |
31 #include "core/rendering/RenderRegion.h" | |
32 #include "core/rendering/RenderRubyRun.h" | 30 #include "core/rendering/RenderRubyRun.h" |
33 #include "core/rendering/RenderView.h" | 31 #include "core/rendering/RenderView.h" |
34 #include "core/rendering/TrailingFloatsRootInlineBox.h" | 32 #include "core/rendering/TrailingFloatsRootInlineBox.h" |
35 #include "core/rendering/VerticalPositionCache.h" | 33 #include "core/rendering/VerticalPositionCache.h" |
36 #include "core/rendering/line/BreakingContextInlineHeaders.h" | 34 #include "core/rendering/line/BreakingContextInlineHeaders.h" |
37 #include "core/rendering/line/LineLayoutState.h" | 35 #include "core/rendering/line/LineLayoutState.h" |
38 #include "core/rendering/svg/SVGRootInlineBox.h" | 36 #include "core/rendering/svg/SVGRootInlineBox.h" |
39 #include "platform/text/BidiResolver.h" | 37 #include "platform/text/BidiResolver.h" |
40 #include "wtf/RefCountedLeakCounter.h" | 38 #include "wtf/RefCountedLeakCounter.h" |
41 #include "wtf/StdLibExtras.h" | 39 #include "wtf/StdLibExtras.h" |
(...skipping 1055 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1097 shapeInsideInfo->clearSegments(); | 1095 shapeInsideInfo->clearSegments(); |
1098 if (logicalLineBottom <= shapeLogicalBottom || !shapeContainingBlockHeight |
| isOverflowPositionedAlready) | 1096 if (logicalLineBottom <= shapeLogicalBottom || !shapeContainingBlockHeight |
| isOverflowPositionedAlready) |
1099 return; | 1097 return; |
1100 | 1098 |
1101 LayoutUnit newLogicalHeight = block->logicalHeight() + (shapeContainingBlock
Height - (lineTop + shapeInsideInfo->owner()->borderAndPaddingAfter())); | 1099 LayoutUnit newLogicalHeight = block->logicalHeight() + (shapeContainingBlock
Height - (lineTop + shapeInsideInfo->owner()->borderAndPaddingAfter())); |
1102 block->setLogicalHeight(newLogicalHeight); | 1100 block->setLogicalHeight(newLogicalHeight); |
1103 } | 1101 } |
1104 | 1102 |
1105 void RenderBlockFlow::updateShapeAndSegmentsForCurrentLine(ShapeInsideInfo*& sha
peInsideInfo, const LayoutSize& logicalOffsetFromShapeContainer, LineLayoutState
& layoutState) | 1103 void RenderBlockFlow::updateShapeAndSegmentsForCurrentLine(ShapeInsideInfo*& sha
peInsideInfo, const LayoutSize& logicalOffsetFromShapeContainer, LineLayoutState
& layoutState) |
1106 { | 1104 { |
1107 if (layoutState.flowThread()) | |
1108 return updateShapeAndSegmentsForCurrentLineInFlowThread(shapeInsideInfo,
layoutState); | |
1109 | |
1110 if (!shapeInsideInfo) | 1105 if (!shapeInsideInfo) |
1111 return; | 1106 return; |
1112 | 1107 |
1113 LayoutUnit lineTop = logicalHeight() + logicalOffsetFromShapeContainer.heigh
t(); | 1108 LayoutUnit lineTop = logicalHeight() + logicalOffsetFromShapeContainer.heigh
t(); |
1114 LayoutUnit lineLeft = logicalOffsetFromShapeContainer.width(); | 1109 LayoutUnit lineLeft = logicalOffsetFromShapeContainer.width(); |
1115 LayoutUnit lineHeight = this->lineHeight(layoutState.lineInfo().isFirstLine(
), isHorizontalWritingMode() ? HorizontalLine : VerticalLine, PositionOfInterior
LineBoxes); | 1110 LayoutUnit lineHeight = this->lineHeight(layoutState.lineInfo().isFirstLine(
), isHorizontalWritingMode() ? HorizontalLine : VerticalLine, PositionOfInterior
LineBoxes); |
1116 | 1111 |
1117 // FIXME: Bug 95361: It is possible for a line to grow beyond lineHeight, in
which case these segments may be incorrect. | 1112 // FIXME: Bug 95361: It is possible for a line to grow beyond lineHeight, in
which case these segments may be incorrect. |
1118 shapeInsideInfo->updateSegmentsForLine(LayoutSize(lineLeft, lineTop), lineHe
ight); | 1113 shapeInsideInfo->updateSegmentsForLine(LayoutSize(lineLeft, lineTop), lineHe
ight); |
1119 | 1114 |
1120 pushShapeContentOverflowBelowTheContentBox(this, shapeInsideInfo, lineTop, l
ineHeight); | 1115 pushShapeContentOverflowBelowTheContentBox(this, shapeInsideInfo, lineTop, l
ineHeight); |
1121 } | 1116 } |
1122 | 1117 |
1123 void RenderBlockFlow::updateShapeAndSegmentsForCurrentLineInFlowThread(ShapeInsi
deInfo*& shapeInsideInfo, LineLayoutState& layoutState) | |
1124 { | |
1125 ASSERT(layoutState.flowThread()); | |
1126 | |
1127 RenderRegion* currentRegion = regionAtBlockOffset(logicalHeight()); | |
1128 if (!currentRegion || !currentRegion->logicalHeight()) | |
1129 return; | |
1130 | |
1131 shapeInsideInfo = currentRegion->shapeInsideInfo(); | |
1132 | |
1133 RenderRegion* nextRegion = 0; | |
1134 if (!currentRegion->isLastRegion()) { | |
1135 RenderRegionList regionList = layoutState.flowThread()->renderRegionList
(); | |
1136 RenderRegionList::const_iterator it = regionList.find(currentRegion); | |
1137 nextRegion = *(++it); | |
1138 } | |
1139 | |
1140 // We only want to deal regions with shapes, so we check if the next region
has a shape | |
1141 if (!shapeInsideInfo && nextRegion && !nextRegion->shapeInsideInfo()) | |
1142 return; | |
1143 | |
1144 LayoutUnit lineHeight = this->lineHeight(layoutState.lineInfo().isFirstLine(
), isHorizontalWritingMode() ? HorizontalLine : VerticalLine, PositionOfInterior
LineBoxes); | |
1145 LayoutUnit logicalLineTopInFlowThread = logicalHeight() + offsetFromLogicalT
opOfFirstPage(); | |
1146 LayoutUnit logicalLineBottomInFlowThread = logicalLineTopInFlowThread + line
Height; | |
1147 LayoutUnit logicalRegionTopInFlowThread = currentRegion->logicalTopForFlowTh
readContent(); | |
1148 LayoutUnit logicalRegionBottomInFlowThread = logicalRegionTopInFlowThread +
currentRegion->logicalHeight() - currentRegion->borderAndPaddingBefore() - curre
ntRegion->borderAndPaddingAfter(); | |
1149 | |
1150 LayoutUnit shapeBottomInFlowThread = LayoutUnit::max(); | |
1151 if (shapeInsideInfo) | |
1152 shapeBottomInFlowThread = shapeInsideInfo->shapeLogicalBottom() + curren
tRegion->logicalTopForFlowThreadContent(); | |
1153 | |
1154 bool lineOverLapsWithShapeBottom = shapeBottomInFlowThread < logicalLineBott
omInFlowThread; | |
1155 bool lineTopAdjustedIntoNextRegion = layoutState.adjustedLogicalLineTop() >=
currentRegion->logicalHeight(); | |
1156 bool lineOverLapsWithRegionBottom = logicalLineBottomInFlowThread > logicalR
egionBottomInFlowThread || lineTopAdjustedIntoNextRegion; | |
1157 bool overFlowsToNextRegion = nextRegion && (lineOverLapsWithShapeBottom || l
ineOverLapsWithRegionBottom); | |
1158 | |
1159 // If the line is between two shapes/regions we position the line to the top
of the next shape/region | |
1160 if (overFlowsToNextRegion) { | |
1161 ASSERT(currentRegion != nextRegion); | |
1162 LayoutUnit deltaToNextRegion = logicalRegionBottomInFlowThread - logical
LineTopInFlowThread; | |
1163 setLogicalHeight(logicalHeight() + deltaToNextRegion); | |
1164 | |
1165 currentRegion = nextRegion; | |
1166 shapeInsideInfo = currentRegion->shapeInsideInfo(); | |
1167 | |
1168 logicalLineTopInFlowThread = logicalHeight() + offsetFromLogicalTopOfFir
stPage(); | |
1169 logicalLineBottomInFlowThread = logicalLineTopInFlowThread + lineHeight; | |
1170 logicalRegionTopInFlowThread = currentRegion->logicalTopForFlowThreadCon
tent(); | |
1171 logicalRegionBottomInFlowThread = logicalRegionTopInFlowThread + current
Region->logicalHeight() - currentRegion->borderAndPaddingBefore() - currentRegio
n->borderAndPaddingAfter(); | |
1172 | |
1173 if (lineTopAdjustedIntoNextRegion) | |
1174 layoutState.setAdjustedLogicalLineTop(0); | |
1175 } | |
1176 | |
1177 if (!shapeInsideInfo) | |
1178 return; | |
1179 | |
1180 bool isFirstLineInRegion = logicalLineBottomInFlowThread <= (logicalRegionTo
pInFlowThread + lineHeight); | |
1181 bool isFirstLineAdjusted = (logicalLineTopInFlowThread - logicalRegionTopInF
lowThread) < (layoutState.adjustedLogicalLineTop() - currentRegion->borderAndPad
dingBefore()); | |
1182 // We position the first line to the top of the shape in the region or to th
e previously adjusted position in the shape | |
1183 if (isFirstLineInRegion || isFirstLineAdjusted) { | |
1184 LayoutUnit shapeTopOffset = layoutState.adjustedLogicalLineTop(); | |
1185 if (!shapeTopOffset && (shapeInsideInfo->shapeLogicalTop() > 0)) | |
1186 shapeTopOffset = shapeInsideInfo->shapeLogicalTop(); | |
1187 | |
1188 LayoutUnit shapePositionInFlowThread = currentRegion->logicalTopForFlowT
hreadContent() + shapeTopOffset; | |
1189 LayoutUnit shapeTopLineTopDelta = shapePositionInFlowThread - logicalLin
eTopInFlowThread - currentRegion->borderAndPaddingBefore(); | |
1190 | |
1191 setLogicalHeight(logicalHeight() + shapeTopLineTopDelta); | |
1192 logicalLineTopInFlowThread += shapeTopLineTopDelta; | |
1193 layoutState.setAdjustedLogicalLineTop(0); | |
1194 } | |
1195 | |
1196 LayoutUnit lineTop = logicalLineTopInFlowThread - currentRegion->logicalTopF
orFlowThreadContent() + currentRegion->borderAndPaddingBefore(); | |
1197 // FIXME: Shape inside on a region does not yet take into account its paddin
g for nested flow blocks | |
1198 shapeInsideInfo->updateSegmentsForLine(LayoutSize(0, lineTop), lineHeight); | |
1199 | |
1200 if (currentRegion->isLastRegion()) | |
1201 pushShapeContentOverflowBelowTheContentBox(this, shapeInsideInfo, lineTo
p, lineHeight); | |
1202 } | |
1203 | |
1204 bool RenderBlockFlow::adjustLogicalLineTopAndLogicalHeightIfNeeded(ShapeInsideIn
fo* shapeInsideInfo, LayoutUnit absoluteLogicalTop, LineLayoutState& layoutState
, InlineBidiResolver& resolver, FloatingObject* lastFloatFromPreviousLine, Inlin
eIterator& end, WordMeasurements& wordMeasurements) | 1118 bool RenderBlockFlow::adjustLogicalLineTopAndLogicalHeightIfNeeded(ShapeInsideIn
fo* shapeInsideInfo, LayoutUnit absoluteLogicalTop, LineLayoutState& layoutState
, InlineBidiResolver& resolver, FloatingObject* lastFloatFromPreviousLine, Inlin
eIterator& end, WordMeasurements& wordMeasurements) |
1205 { | 1119 { |
1206 LayoutUnit adjustedLogicalLineTop = adjustLogicalLineTop(shapeInsideInfo, re
solver.position(), end, wordMeasurements); | 1120 LayoutUnit adjustedLogicalLineTop = adjustLogicalLineTop(shapeInsideInfo, re
solver.position(), end, wordMeasurements); |
1207 | 1121 |
1208 if (shapeInsideInfo && containsFloats()) { | 1122 if (shapeInsideInfo && containsFloats()) { |
1209 lastFloatFromPreviousLine = m_floatingObjects->set().last(); | 1123 lastFloatFromPreviousLine = m_floatingObjects->set().last(); |
1210 if (!wordMeasurements.size()) { | 1124 if (!wordMeasurements.size()) { |
1211 LayoutUnit floatLogicalTopOffset = shapeInsideInfo->computeFirstFitP
ositionForFloat(logicalSizeForFloat(lastFloatFromPreviousLine)); | 1125 LayoutUnit floatLogicalTopOffset = shapeInsideInfo->computeFirstFitP
ositionForFloat(logicalSizeForFloat(lastFloatFromPreviousLine)); |
1212 if (logicalHeight() < floatLogicalTopOffset) | 1126 if (logicalHeight() < floatLogicalTopOffset) |
1213 adjustedLogicalLineTop = floatLogicalTopOffset; | 1127 adjustedLogicalLineTop = floatLogicalTopOffset; |
1214 } | 1128 } |
1215 } | 1129 } |
1216 | 1130 |
1217 if (!adjustedLogicalLineTop) | 1131 if (!adjustedLogicalLineTop) |
1218 return false; | 1132 return false; |
1219 | 1133 |
1220 LayoutUnit newLogicalHeight = adjustedLogicalLineTop - absoluteLogicalTop; | 1134 LayoutUnit newLogicalHeight = adjustedLogicalLineTop - absoluteLogicalTop; |
1221 | 1135 |
1222 if (layoutState.flowThread()) { | |
1223 layoutState.setAdjustedLogicalLineTop(adjustedLogicalLineTop); | |
1224 newLogicalHeight = logicalHeight(); | |
1225 } | |
1226 | |
1227 end = restartLayoutRunsAndFloatsInRange(logicalHeight(), newLogicalHeight, l
astFloatFromPreviousLine, resolver, end); | 1136 end = restartLayoutRunsAndFloatsInRange(logicalHeight(), newLogicalHeight, l
astFloatFromPreviousLine, resolver, end); |
1228 return true; | 1137 return true; |
1229 } | 1138 } |
1230 | 1139 |
1231 void RenderBlockFlow::layoutRunsAndFloatsInRange(LineLayoutState& layoutState, I
nlineBidiResolver& resolver, const InlineIterator& cleanLineStart, const BidiSta
tus& cleanLineBidiStatus, unsigned consecutiveHyphenatedLines) | 1140 void RenderBlockFlow::layoutRunsAndFloatsInRange(LineLayoutState& layoutState, I
nlineBidiResolver& resolver, const InlineIterator& cleanLineStart, const BidiSta
tus& cleanLineBidiStatus, unsigned consecutiveHyphenatedLines) |
1232 { | 1141 { |
1233 RenderStyle* styleToUse = style(); | 1142 RenderStyle* styleToUse = style(); |
1234 bool paginated = view()->layoutState() && view()->layoutState()->isPaginated
(); | 1143 bool paginated = view()->layoutState() && view()->layoutState()->isPaginated
(); |
1235 LineMidpointState& lineMidpointState = resolver.midpointState(); | 1144 LineMidpointState& lineMidpointState = resolver.midpointState(); |
1236 InlineIterator endOfLine = resolver.position(); | 1145 InlineIterator endOfLine = resolver.position(); |
1237 bool checkForEndLineMatch = layoutState.endLine(); | 1146 bool checkForEndLineMatch = layoutState.endLine(); |
1238 RenderTextInfo renderTextInfo; | 1147 RenderTextInfo renderTextInfo; |
1239 VerticalPositionCache verticalPositionCache; | 1148 VerticalPositionCache verticalPositionCache; |
1240 | 1149 |
1241 LineBreaker lineBreaker(this); | 1150 LineBreaker lineBreaker(this); |
1242 | 1151 |
1243 LayoutSize logicalOffsetFromShapeContainer; | 1152 LayoutSize logicalOffsetFromShapeContainer; |
1244 ShapeInsideInfo* shapeInsideInfo = layoutShapeInsideInfo(); | 1153 ShapeInsideInfo* shapeInsideInfo = layoutShapeInsideInfo(); |
1245 if (shapeInsideInfo) { | 1154 if (shapeInsideInfo) { |
1246 ASSERT(shapeInsideInfo->owner() == this || allowsShapeInsideInfoSharing(
shapeInsideInfo->owner())); | 1155 ASSERT(shapeInsideInfo->owner() == this || allowsShapeInsideInfoSharing(
shapeInsideInfo->owner())); |
1247 if (shapeInsideInfo != this->shapeInsideInfo()) { | 1156 if (shapeInsideInfo != this->shapeInsideInfo()) { |
1248 // FIXME Bug 100284: If subsequent LayoutStates are pushed, we will
have to add | 1157 // FIXME Bug 100284: If subsequent LayoutStates are pushed, we will
have to add |
1249 // their offsets from the original shape-inside container. | 1158 // their offsets from the original shape-inside container. |
1250 logicalOffsetFromShapeContainer = logicalOffsetFromShapeAncestorCont
ainer(shapeInsideInfo->owner()); | 1159 logicalOffsetFromShapeContainer = logicalOffsetFromShapeAncestorCont
ainer(shapeInsideInfo->owner()); |
1251 } | 1160 } |
1252 // Begin layout at the logical top of our shape inside. | 1161 // Begin layout at the logical top of our shape inside. |
1253 if (logicalHeight() + logicalOffsetFromShapeContainer.height() < shapeIn
sideInfo->shapeLogicalTop()) { | 1162 if (logicalHeight() + logicalOffsetFromShapeContainer.height() < shapeIn
sideInfo->shapeLogicalTop()) { |
1254 LayoutUnit logicalHeight = shapeInsideInfo->shapeLogicalTop() - logi
calOffsetFromShapeContainer.height(); | 1163 LayoutUnit logicalHeight = shapeInsideInfo->shapeLogicalTop() - logi
calOffsetFromShapeContainer.height(); |
1255 if (layoutState.flowThread()) | |
1256 logicalHeight -= shapeInsideInfo->owner()->borderAndPaddingBefor
e(); | |
1257 setLogicalHeight(logicalHeight); | 1164 setLogicalHeight(logicalHeight); |
1258 } | 1165 } |
1259 } | 1166 } |
1260 | 1167 |
1261 while (!endOfLine.atEnd()) { | 1168 while (!endOfLine.atEnd()) { |
1262 // FIXME: Is this check necessary before the first iteration or can it b
e moved to the end? | 1169 // FIXME: Is this check necessary before the first iteration or can it b
e moved to the end? |
1263 if (checkForEndLineMatch) { | 1170 if (checkForEndLineMatch) { |
1264 layoutState.setEndLineMatched(matchedEndLine(layoutState, resolver,
cleanLineStart, cleanLineBidiStatus)); | 1171 layoutState.setEndLineMatched(matchedEndLine(layoutState, resolver,
cleanLineStart, cleanLineBidiStatus)); |
1265 if (layoutState.endLineMatched()) { | 1172 if (layoutState.endLineMatched()) { |
1266 resolver.setPosition(InlineIterator(resolver.position().root(),
0, 0), 0); | 1173 resolver.setPosition(InlineIterator(resolver.position().root(),
0, 0), 0); |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1330 bidiRuns.deleteRuns(); | 1237 bidiRuns.deleteRuns(); |
1331 resolver.markCurrentRunEmpty(); // FIXME: This can probably be repla
ced by an ASSERT (or just removed). | 1238 resolver.markCurrentRunEmpty(); // FIXME: This can probably be repla
ced by an ASSERT (or just removed). |
1332 | 1239 |
1333 if (lineBox) { | 1240 if (lineBox) { |
1334 lineBox->setLineBreakInfo(endOfLine.object(), endOfLine.offset()
, resolver.status()); | 1241 lineBox->setLineBreakInfo(endOfLine.object(), endOfLine.offset()
, resolver.status()); |
1335 if (layoutState.usesRepaintBounds()) | 1242 if (layoutState.usesRepaintBounds()) |
1336 layoutState.updateRepaintRangeFromBox(lineBox); | 1243 layoutState.updateRepaintRangeFromBox(lineBox); |
1337 | 1244 |
1338 if (paginated) { | 1245 if (paginated) { |
1339 LayoutUnit adjustment = 0; | 1246 LayoutUnit adjustment = 0; |
1340 adjustLinePositionForPagination(lineBox, adjustment, layoutS
tate.flowThread()); | 1247 adjustLinePositionForPagination(lineBox, adjustment); |
1341 if (adjustment) { | 1248 if (adjustment) { |
1342 LayoutUnit oldLineWidth = availableLogicalWidthForLine(o
ldLogicalHeight, layoutState.lineInfo().isFirstLine()); | 1249 LayoutUnit oldLineWidth = availableLogicalWidthForLine(o
ldLogicalHeight, layoutState.lineInfo().isFirstLine()); |
1343 lineBox->adjustBlockDirectionPosition(adjustment); | 1250 lineBox->adjustBlockDirectionPosition(adjustment); |
1344 if (layoutState.usesRepaintBounds()) | 1251 if (layoutState.usesRepaintBounds()) |
1345 layoutState.updateRepaintRangeFromBox(lineBox); | 1252 layoutState.updateRepaintRangeFromBox(lineBox); |
1346 | 1253 |
1347 if (availableLogicalWidthForLine(oldLogicalHeight + adju
stment, layoutState.lineInfo().isFirstLine()) != oldLineWidth) { | 1254 if (availableLogicalWidthForLine(oldLogicalHeight + adju
stment, layoutState.lineInfo().isFirstLine()) != oldLineWidth) { |
1348 // We have to delete this line, remove all floats th
at got added, and let line layout re-run. | 1255 // We have to delete this line, remove all floats th
at got added, and let line layout re-run. |
1349 lineBox->deleteLine(); | 1256 lineBox->deleteLine(); |
1350 endOfLine = restartLayoutRunsAndFloatsInRange(oldLog
icalHeight, oldLogicalHeight + adjustment, lastFloatFromPreviousLine, resolver,
previousEndofLine); | 1257 endOfLine = restartLayoutRunsAndFloatsInRange(oldLog
icalHeight, oldLogicalHeight + adjustment, lastFloatFromPreviousLine, resolver,
previousEndofLine); |
1351 continue; | 1258 continue; |
1352 } | 1259 } |
1353 | 1260 |
1354 setLogicalHeight(lineBox->lineBottomWithLeading()); | 1261 setLogicalHeight(lineBox->lineBottomWithLeading()); |
1355 } | 1262 } |
1356 | |
1357 if (layoutState.flowThread()) | |
1358 updateRegionForLine(lineBox); | |
1359 } | 1263 } |
1360 } | 1264 } |
1361 } | 1265 } |
1362 | 1266 |
1363 for (size_t i = 0; i < lineBreaker.positionedObjects().size(); ++i) | 1267 for (size_t i = 0; i < lineBreaker.positionedObjects().size(); ++i) |
1364 setStaticPositions(this, lineBreaker.positionedObjects()[i]); | 1268 setStaticPositions(this, lineBreaker.positionedObjects()[i]); |
1365 | 1269 |
1366 if (!layoutState.lineInfo().isEmpty()) { | 1270 if (!layoutState.lineInfo().isEmpty()) { |
1367 layoutState.lineInfo().setFirstLine(false); | 1271 layoutState.lineInfo().setFirstLine(false); |
1368 clearFloats(lineBreaker.clear()); | 1272 clearFloats(lineBreaker.clear()); |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1461 { | 1365 { |
1462 if (layoutState.endLine()) { | 1366 if (layoutState.endLine()) { |
1463 if (layoutState.endLineMatched()) { | 1367 if (layoutState.endLineMatched()) { |
1464 bool paginated = view()->layoutState() && view()->layoutState()->isP
aginated(); | 1368 bool paginated = view()->layoutState() && view()->layoutState()->isP
aginated(); |
1465 // Attach all the remaining lines, and then adjust their y-positions
as needed. | 1369 // Attach all the remaining lines, and then adjust their y-positions
as needed. |
1466 LayoutUnit delta = logicalHeight() - layoutState.endLineLogicalTop()
; | 1370 LayoutUnit delta = logicalHeight() - layoutState.endLineLogicalTop()
; |
1467 for (RootInlineBox* line = layoutState.endLine(); line; line = line-
>nextRootBox()) { | 1371 for (RootInlineBox* line = layoutState.endLine(); line; line = line-
>nextRootBox()) { |
1468 line->attachLine(); | 1372 line->attachLine(); |
1469 if (paginated) { | 1373 if (paginated) { |
1470 delta -= line->paginationStrut(); | 1374 delta -= line->paginationStrut(); |
1471 adjustLinePositionForPagination(line, delta, layoutState.flo
wThread()); | 1375 adjustLinePositionForPagination(line, delta); |
1472 } | 1376 } |
1473 if (delta) { | 1377 if (delta) { |
1474 layoutState.updateRepaintRangeFromBox(line, delta); | 1378 layoutState.updateRepaintRangeFromBox(line, delta); |
1475 line->adjustBlockDirectionPosition(delta); | 1379 line->adjustBlockDirectionPosition(delta); |
1476 } | 1380 } |
1477 if (layoutState.flowThread()) | |
1478 updateRegionForLine(line); | |
1479 if (Vector<RenderBox*>* cleanLineFloats = line->floatsPtr()) { | 1381 if (Vector<RenderBox*>* cleanLineFloats = line->floatsPtr()) { |
1480 Vector<RenderBox*>::iterator end = cleanLineFloats->end(); | 1382 Vector<RenderBox*>::iterator end = cleanLineFloats->end(); |
1481 for (Vector<RenderBox*>::iterator f = cleanLineFloats->begin
(); f != end; ++f) { | 1383 for (Vector<RenderBox*>::iterator f = cleanLineFloats->begin
(); f != end; ++f) { |
1482 FloatingObject* floatingObject = insertFloatingObject(*f
); | 1384 FloatingObject* floatingObject = insertFloatingObject(*f
); |
1483 ASSERT(!floatingObject->originatingLine()); | 1385 ASSERT(!floatingObject->originatingLine()); |
1484 floatingObject->setOriginatingLine(line); | 1386 floatingObject->setOriginatingLine(line); |
1485 setLogicalHeight(logicalTopForChild(*f) - marginBeforeFo
rChild(*f) + delta); | 1387 setLogicalHeight(logicalTopForChild(*f) - marginBeforeFo
rChild(*f) + delta); |
1486 positionNewFloats(); | 1388 positionNewFloats(); |
1487 } | 1389 } |
1488 } | 1390 } |
(...skipping 13 matching lines...) Expand all Loading... |
1502 LayoutUnit bottomVisualOverflow = lastRootBox()->logicalBottomVisual
Overflow(); | 1404 LayoutUnit bottomVisualOverflow = lastRootBox()->logicalBottomVisual
Overflow(); |
1503 LayoutUnit bottomLayoutOverflow = lastRootBox()->logicalBottomLayout
Overflow(); | 1405 LayoutUnit bottomLayoutOverflow = lastRootBox()->logicalBottomLayout
Overflow(); |
1504 TrailingFloatsRootInlineBox* trailingFloatsLineBox = new TrailingFlo
atsRootInlineBox(this); | 1406 TrailingFloatsRootInlineBox* trailingFloatsLineBox = new TrailingFlo
atsRootInlineBox(this); |
1505 m_lineBoxes.appendLineBox(trailingFloatsLineBox); | 1407 m_lineBoxes.appendLineBox(trailingFloatsLineBox); |
1506 trailingFloatsLineBox->setConstructed(); | 1408 trailingFloatsLineBox->setConstructed(); |
1507 GlyphOverflowAndFallbackFontsMap textBoxDataMap; | 1409 GlyphOverflowAndFallbackFontsMap textBoxDataMap; |
1508 VerticalPositionCache verticalPositionCache; | 1410 VerticalPositionCache verticalPositionCache; |
1509 LayoutUnit blockLogicalHeight = logicalHeight(); | 1411 LayoutUnit blockLogicalHeight = logicalHeight(); |
1510 trailingFloatsLineBox->alignBoxesInBlockDirection(blockLogicalHeight
, textBoxDataMap, verticalPositionCache); | 1412 trailingFloatsLineBox->alignBoxesInBlockDirection(blockLogicalHeight
, textBoxDataMap, verticalPositionCache); |
1511 trailingFloatsLineBox->setLineTopBottomPositions(blockLogicalHeight,
blockLogicalHeight, blockLogicalHeight, blockLogicalHeight); | 1413 trailingFloatsLineBox->setLineTopBottomPositions(blockLogicalHeight,
blockLogicalHeight, blockLogicalHeight, blockLogicalHeight); |
1512 trailingFloatsLineBox->setPaginatedLineWidth(availableLogicalWidthFo
rContent(blockLogicalHeight)); | 1414 trailingFloatsLineBox->setPaginatedLineWidth(availableLogicalWidthFo
rContent()); |
1513 LayoutRect logicalLayoutOverflow(0, blockLogicalHeight, 1, bottomLay
outOverflow - blockLogicalHeight); | 1415 LayoutRect logicalLayoutOverflow(0, blockLogicalHeight, 1, bottomLay
outOverflow - blockLogicalHeight); |
1514 LayoutRect logicalVisualOverflow(0, blockLogicalHeight, 1, bottomVis
ualOverflow - blockLogicalHeight); | 1416 LayoutRect logicalVisualOverflow(0, blockLogicalHeight, 1, bottomVis
ualOverflow - blockLogicalHeight); |
1515 trailingFloatsLineBox->setOverflowFromLogicalRects(logicalLayoutOver
flow, logicalVisualOverflow, trailingFloatsLineBox->lineTop(), trailingFloatsLin
eBox->lineBottom()); | 1417 trailingFloatsLineBox->setOverflowFromLogicalRects(logicalLayoutOver
flow, logicalVisualOverflow, trailingFloatsLineBox->lineTop(), trailingFloatsLin
eBox->lineBottom()); |
1516 if (layoutState.flowThread()) | |
1517 updateRegionForLine(trailingFloatsLineBox); | |
1518 } | 1418 } |
1519 | 1419 |
1520 const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set(); | 1420 const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set(); |
1521 FloatingObjectSetIterator it = floatingObjectSet.begin(); | 1421 FloatingObjectSetIterator it = floatingObjectSet.begin(); |
1522 FloatingObjectSetIterator end = floatingObjectSet.end(); | 1422 FloatingObjectSetIterator end = floatingObjectSet.end(); |
1523 if (layoutState.lastFloat()) { | 1423 if (layoutState.lastFloat()) { |
1524 FloatingObjectSetIterator lastFloatIterator = floatingObjectSet.find
(layoutState.lastFloat()); | 1424 FloatingObjectSetIterator lastFloatIterator = floatingObjectSet.find
(layoutState.lastFloat()); |
1525 ASSERT(lastFloatIterator != end); | 1425 ASSERT(lastFloatIterator != end); |
1526 ++lastFloatIterator; | 1426 ++lastFloatIterator; |
1527 it = lastFloatIterator; | 1427 it = lastFloatIterator; |
(...skipping 22 matching lines...) Expand all Loading... |
1550 } | 1450 } |
1551 } | 1451 } |
1552 } | 1452 } |
1553 | 1453 |
1554 void RenderBlockFlow::layoutInlineChildren(bool relayoutChildren, LayoutUnit& re
paintLogicalTop, LayoutUnit& repaintLogicalBottom, LayoutUnit afterEdge) | 1454 void RenderBlockFlow::layoutInlineChildren(bool relayoutChildren, LayoutUnit& re
paintLogicalTop, LayoutUnit& repaintLogicalBottom, LayoutUnit afterEdge) |
1555 { | 1455 { |
1556 // Lay out our hypothetical grid line as though it occurs at the top of the
block. | 1456 // Lay out our hypothetical grid line as though it occurs at the top of the
block. |
1557 if (view()->layoutState() && view()->layoutState()->lineGrid() == this) | 1457 if (view()->layoutState() && view()->layoutState()->lineGrid() == this) |
1558 layoutLineGridBox(); | 1458 layoutLineGridBox(); |
1559 | 1459 |
1560 RenderFlowThread* flowThread = flowThreadContainingBlock(); | |
1561 bool clearLinesForPagination = firstLineBox() && flowThread && !flowThread->
hasRegions(); | |
1562 | |
1563 // Figure out if we should clear out our line boxes. | 1460 // Figure out if we should clear out our line boxes. |
1564 // FIXME: Handle resize eventually! | 1461 // FIXME: Handle resize eventually! |
1565 bool isFullLayout = !firstLineBox() || selfNeedsLayout() || relayoutChildren
|| clearLinesForPagination; | 1462 bool isFullLayout = !firstLineBox() || selfNeedsLayout() || relayoutChildren
; |
1566 LineLayoutState layoutState(isFullLayout, repaintLogicalTop, repaintLogicalB
ottom, flowThread); | 1463 LineLayoutState layoutState(isFullLayout, repaintLogicalTop, repaintLogicalB
ottom); |
1567 | 1464 |
1568 if (isFullLayout) | 1465 if (isFullLayout) |
1569 lineBoxes()->deleteLineBoxes(); | 1466 lineBoxes()->deleteLineBoxes(); |
1570 | 1467 |
1571 // Text truncation kicks in in two cases: | 1468 // Text truncation kicks in in two cases: |
1572 // 1) If your overflow isn't visible and your text-overflow-mode isn't c
lip. | 1469 // 1) If your overflow isn't visible and your text-overflow-mode isn't c
lip. |
1573 // 2) If you're an anonymous block with a block parent that satisfies #1
that was created | 1470 // 2) If you're an anonymous block with a block parent that satisfies #1
that was created |
1574 // to accomodate a block that has inline and block children. This exc
ludes parents where | 1471 // to accomodate a block that has inline and block children. This exc
ludes parents where |
1575 // canCollapseAnonymousBlockChild is false, notabley flex items and g
rid items. | 1472 // canCollapseAnonymousBlockChild is false, notabley flex items and g
rid items. |
1576 // FIXME: CSS3 says that descendants that are clipped must also know how to
truncate. This is insanely | 1473 // FIXME: CSS3 says that descendants that are clipped must also know how to
truncate. This is insanely |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1691 | 1588 |
1692 // FIXME: This entire float-checking block needs to be broken into a new fun
ction. | 1589 // FIXME: This entire float-checking block needs to be broken into a new fun
ction. |
1693 bool dirtiedByFloat = false; | 1590 bool dirtiedByFloat = false; |
1694 if (!layoutState.isFullLayout()) { | 1591 if (!layoutState.isFullLayout()) { |
1695 // Paginate all of the clean lines. | 1592 // Paginate all of the clean lines. |
1696 bool paginated = view()->layoutState() && view()->layoutState()->isPagin
ated(); | 1593 bool paginated = view()->layoutState() && view()->layoutState()->isPagin
ated(); |
1697 LayoutUnit paginationDelta = 0; | 1594 LayoutUnit paginationDelta = 0; |
1698 size_t floatIndex = 0; | 1595 size_t floatIndex = 0; |
1699 for (curr = firstRootBox(); curr && !curr->isDirty(); curr = curr->nextR
ootBox()) { | 1596 for (curr = firstRootBox(); curr && !curr->isDirty(); curr = curr->nextR
ootBox()) { |
1700 if (paginated) { | 1597 if (paginated) { |
1701 if (lineWidthForPaginatedLineChanged(curr, 0, layoutState.flowTh
read())) { | 1598 if (lineWidthForPaginatedLineChanged(curr, 0)) { |
1702 curr->markDirty(); | 1599 curr->markDirty(); |
1703 break; | 1600 break; |
1704 } | 1601 } |
1705 paginationDelta -= curr->paginationStrut(); | 1602 paginationDelta -= curr->paginationStrut(); |
1706 adjustLinePositionForPagination(curr, paginationDelta, layoutSta
te.flowThread()); | 1603 adjustLinePositionForPagination(curr, paginationDelta); |
1707 if (paginationDelta) { | 1604 if (paginationDelta) { |
1708 if (containsFloats() || !layoutState.floats().isEmpty()) { | 1605 if (containsFloats() || !layoutState.floats().isEmpty()) { |
1709 // FIXME: Do better eventually. For now if we ever shif
t because of pagination and floats are present just go to a full layout. | 1606 // FIXME: Do better eventually. For now if we ever shif
t because of pagination and floats are present just go to a full layout. |
1710 layoutState.markForFullLayout(); | 1607 layoutState.markForFullLayout(); |
1711 break; | 1608 break; |
1712 } | 1609 } |
1713 | 1610 |
1714 layoutState.updateRepaintRangeFromBox(curr, paginationDelta)
; | 1611 layoutState.updateRepaintRangeFromBox(curr, paginationDelta)
; |
1715 curr->adjustBlockDirectionPosition(paginationDelta); | 1612 curr->adjustBlockDirectionPosition(paginationDelta); |
1716 } | 1613 } |
1717 if (layoutState.flowThread()) | |
1718 updateRegionForLine(curr); | |
1719 } | 1614 } |
1720 | 1615 |
1721 // If a new float has been inserted before this line or before its l
ast known float, just do a full layout. | 1616 // If a new float has been inserted before this line or before its l
ast known float, just do a full layout. |
1722 bool encounteredNewFloat = false; | 1617 bool encounteredNewFloat = false; |
1723 checkFloatsInCleanLine(curr, layoutState.floats(), floatIndex, encou
nteredNewFloat, dirtiedByFloat); | 1618 checkFloatsInCleanLine(curr, layoutState.floats(), floatIndex, encou
nteredNewFloat, dirtiedByFloat); |
1724 if (encounteredNewFloat) | 1619 if (encounteredNewFloat) |
1725 layoutState.markForFullLayout(); | 1620 layoutState.markForFullLayout(); |
1726 | 1621 |
1727 if (dirtiedByFloat || layoutState.isFullLayout()) | 1622 if (dirtiedByFloat || layoutState.isFullLayout()) |
1728 break; | 1623 break; |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1841 line->extractLine(); // Disconnect all line boxes from their render obje
cts while preserving | 1736 line->extractLine(); // Disconnect all line boxes from their render obje
cts while preserving |
1842 // their connections to one another. | 1737 // their connections to one another. |
1843 | 1738 |
1844 layoutState.setEndLine(last); | 1739 layoutState.setEndLine(last); |
1845 } | 1740 } |
1846 | 1741 |
1847 bool RenderBlockFlow::checkPaginationAndFloatsAtEndLine(LineLayoutState& layoutS
tate) | 1742 bool RenderBlockFlow::checkPaginationAndFloatsAtEndLine(LineLayoutState& layoutS
tate) |
1848 { | 1743 { |
1849 LayoutUnit lineDelta = logicalHeight() - layoutState.endLineLogicalTop(); | 1744 LayoutUnit lineDelta = logicalHeight() - layoutState.endLineLogicalTop(); |
1850 | 1745 |
1851 bool paginated = view()->layoutState() && view()->layoutState()->isPaginated
(); | |
1852 if (paginated && layoutState.flowThread()) { | |
1853 // Check all lines from here to the end, and see if the hypothetical new
position for the lines will result | |
1854 // in a different available line width. | |
1855 for (RootInlineBox* lineBox = layoutState.endLine(); lineBox; lineBox =
lineBox->nextRootBox()) { | |
1856 if (paginated) { | |
1857 // This isn't the real move we're going to do, so don't update t
he line box's pagination | |
1858 // strut yet. | |
1859 LayoutUnit oldPaginationStrut = lineBox->paginationStrut(); | |
1860 lineDelta -= oldPaginationStrut; | |
1861 adjustLinePositionForPagination(lineBox, lineDelta, layoutState.
flowThread()); | |
1862 lineBox->setPaginationStrut(oldPaginationStrut); | |
1863 } | |
1864 if (lineWidthForPaginatedLineChanged(lineBox, lineDelta, layoutState
.flowThread())) | |
1865 return false; | |
1866 } | |
1867 } | |
1868 | |
1869 if (!lineDelta || !m_floatingObjects) | 1746 if (!lineDelta || !m_floatingObjects) |
1870 return true; | 1747 return true; |
1871 | 1748 |
1872 // See if any floats end in the range along which we want to shift the lines
vertically. | 1749 // See if any floats end in the range along which we want to shift the lines
vertically. |
1873 LayoutUnit logicalTop = min(logicalHeight(), layoutState.endLineLogicalTop()
); | 1750 LayoutUnit logicalTop = min(logicalHeight(), layoutState.endLineLogicalTop()
); |
1874 | 1751 |
1875 RootInlineBox* lastLine = layoutState.endLine(); | 1752 RootInlineBox* lastLine = layoutState.endLine(); |
1876 while (RootInlineBox* nextLine = lastLine->nextRootBox()) | 1753 while (RootInlineBox* nextLine = lastLine->nextRootBox()) |
1877 lastLine = nextLine; | 1754 lastLine = nextLine; |
1878 | 1755 |
(...skipping 366 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2245 lineGridBox->alignBoxesInBlockDirection(logicalHeight(), textBoxDataMap, ver
ticalPositionCache); | 2122 lineGridBox->alignBoxesInBlockDirection(logicalHeight(), textBoxDataMap, ver
ticalPositionCache); |
2246 | 2123 |
2247 setLineGridBox(lineGridBox); | 2124 setLineGridBox(lineGridBox); |
2248 | 2125 |
2249 // FIXME: If any of the characteristics of the box change compared to the ol
d one, then we need to do a deep dirtying | 2126 // FIXME: If any of the characteristics of the box change compared to the ol
d one, then we need to do a deep dirtying |
2250 // (similar to what happens when the page height changes). Ideally, though,
we only do this if someone is actually snapping | 2127 // (similar to what happens when the page height changes). Ideally, though,
we only do this if someone is actually snapping |
2251 // to this grid. | 2128 // to this grid. |
2252 } | 2129 } |
2253 | 2130 |
2254 } | 2131 } |
OLD | NEW |