Index: Source/core/rendering/RenderBlockLineLayout.cpp |
diff --git a/Source/core/rendering/RenderBlockLineLayout.cpp b/Source/core/rendering/RenderBlockLineLayout.cpp |
index 73393dd89e6edb4458ee9b71249c3dae3788d0e2..18e0767006b1d911cfa524f735703156f1e4cd8c 100644 |
--- a/Source/core/rendering/RenderBlockLineLayout.cpp |
+++ b/Source/core/rendering/RenderBlockLineLayout.cpp |
@@ -949,8 +949,14 @@ static inline void computeExpansionForJustifiedText(BidiRun* firstRun, BidiRun* |
} |
} |
-void RenderBlock::updateLogicalWidthForAlignment(const ETextAlign& textAlign, BidiRun* trailingSpaceRun, float& logicalLeft, float& totalLogicalWidth, float& availableLogicalWidth, int expansionOpportunityCount) |
+void RenderBlock::updateLogicalWidthForAlignment(const ETextAlign& textAlign, const RootInlineBox* rootInlineBox, BidiRun* trailingSpaceRun, float& logicalLeft, float& totalLogicalWidth, float& availableLogicalWidth, int expansionOpportunityCount) |
{ |
+ TextDirection direction; |
+ if (rootInlineBox && rootInlineBox->renderer()->style()->unicodeBidi() == Plaintext) |
+ direction = rootInlineBox->direction(); |
+ else |
+ direction = style()->direction(); |
+ |
// Armed with the total width of the line (without justification), |
// we now examine our text-align property in order to determine where to position the |
// objects horizontally. The total width of the line can be increased if we end up |
@@ -979,13 +985,13 @@ void RenderBlock::updateLogicalWidthForAlignment(const ETextAlign& textAlign, Bi |
} |
// Fall through |
case TASTART: |
- if (style()->isLeftToRightDirection()) |
+ if (direction == LTR) |
updateLogicalWidthForLeftAlignedBlock(style()->isLeftToRightDirection(), trailingSpaceRun, logicalLeft, totalLogicalWidth, availableLogicalWidth); |
else |
updateLogicalWidthForRightAlignedBlock(style()->isLeftToRightDirection(), trailingSpaceRun, logicalLeft, totalLogicalWidth, availableLogicalWidth); |
break; |
case TAEND: |
- if (style()->isLeftToRightDirection()) |
+ if (direction == LTR) |
updateLogicalWidthForRightAlignedBlock(style()->isLeftToRightDirection(), trailingSpaceRun, logicalLeft, totalLogicalWidth, availableLogicalWidth); |
else |
updateLogicalWidthForLeftAlignedBlock(style()->isLeftToRightDirection(), trailingSpaceRun, logicalLeft, totalLogicalWidth, availableLogicalWidth); |
@@ -1132,7 +1138,7 @@ BidiRun* RenderBlock::computeInlineDirectionPositionsForSegment(RootInlineBox* l |
expansionOpportunityCount--; |
} |
- updateLogicalWidthForAlignment(textAlign, trailingSpaceRun, logicalLeft, totalLogicalWidth, availableLogicalWidth, expansionOpportunityCount); |
+ updateLogicalWidthForAlignment(textAlign, lineBox, trailingSpaceRun, logicalLeft, totalLogicalWidth, availableLogicalWidth, expansionOpportunityCount); |
computeExpansionForJustifiedText(firstRun, trailingSpaceRun, expansionOpportunities, expansionOpportunityCount, totalLogicalWidth, availableLogicalWidth); |
@@ -1386,7 +1392,7 @@ static inline void constructBidiRunsForLine(const RenderBlock* block, InlineBidi |
} |
// This function constructs line boxes for all of the text runs in the resolver and computes their position. |
-RootInlineBox* RenderBlock::createLineBoxesFromBidiRuns(BidiRunList<BidiRun>& bidiRuns, const InlineIterator& end, LineInfo& lineInfo, VerticalPositionCache& verticalPositionCache, BidiRun* trailingSpaceRun, WordMeasurements& wordMeasurements) |
+RootInlineBox* RenderBlock::createLineBoxesFromBidiRuns(unsigned bidiLevel, BidiRunList<BidiRun>& bidiRuns, const InlineIterator& end, LineInfo& lineInfo, VerticalPositionCache& verticalPositionCache, BidiRun* trailingSpaceRun, WordMeasurements& wordMeasurements) |
{ |
if (!bidiRuns.runCount()) |
return 0; |
@@ -1398,6 +1404,7 @@ RootInlineBox* RenderBlock::createLineBoxesFromBidiRuns(BidiRunList<BidiRun>& bi |
if (!lineBox) |
return 0; |
+ lineBox->setBidiLevel(bidiLevel); |
lineBox->setEndsWithBreak(lineInfo.previousLineBrokeCleanly()); |
bool isSVGRootInlineBox = lineBox->isSVGRootInlineBox(); |
@@ -1860,7 +1867,7 @@ void RenderBlock::layoutRunsAndFloatsInRange(LineLayoutState& layoutState, Inlin |
// inline flow boxes. |
LayoutUnit oldLogicalHeight = logicalHeight(); |
- RootInlineBox* lineBox = createLineBoxesFromBidiRuns(bidiRuns, end, layoutState.lineInfo(), verticalPositionCache, trailingSpaceRun, wordMeasurements); |
+ RootInlineBox* lineBox = createLineBoxesFromBidiRuns(resolver.status().context->level(), bidiRuns, end, layoutState.lineInfo(), verticalPositionCache, trailingSpaceRun, wordMeasurements); |
bidiRuns.deleteRuns(); |
resolver.markCurrentRunEmpty(); // FIXME: This can probably be replaced by an ASSERT (or just removed). |
@@ -3367,7 +3374,7 @@ void RenderBlock::deleteEllipsisLineBoxes() |
float logicalLeft = pixelSnappedLogicalLeftOffsetForLine(curr->lineTop(), firstLine); |
float availableLogicalWidth = logicalRightOffsetForLine(curr->lineTop(), false) - logicalLeft; |
float totalLogicalWidth = curr->logicalWidth(); |
- updateLogicalWidthForAlignment(textAlign, 0, logicalLeft, totalLogicalWidth, availableLogicalWidth, 0); |
+ updateLogicalWidthForAlignment(textAlign, curr, 0, logicalLeft, totalLogicalWidth, availableLogicalWidth, 0); |
if (ltr) |
curr->adjustLogicalPosition((logicalLeft - curr->logicalLeft()), 0); |
@@ -3414,7 +3421,7 @@ void RenderBlock::checkLinesForTextOverflow() |
float logicalLeft = 0; // We are only intersted in the delta from the base position. |
float truncatedWidth = pixelSnappedLogicalRightOffsetForLine(curr->lineTop(), firstLine); |
- updateLogicalWidthForAlignment(textAlign, 0, logicalLeft, totalLogicalWidth, truncatedWidth, 0); |
+ updateLogicalWidthForAlignment(textAlign, curr, 0, logicalLeft, totalLogicalWidth, truncatedWidth, 0); |
if (ltr) |
curr->adjustLogicalPosition(logicalLeft, 0); |
else |
@@ -3489,7 +3496,7 @@ LayoutUnit RenderBlock::startAlignedOffsetForLine(LayoutUnit position, bool firs |
float totalLogicalWidth = 0; |
float logicalLeft = logicalLeftOffsetForLine(logicalHeight(), false); |
float availableLogicalWidth = logicalRightOffsetForLine(logicalHeight(), false) - logicalLeft; |
- updateLogicalWidthForAlignment(textAlign, 0, logicalLeft, totalLogicalWidth, availableLogicalWidth, 0); |
+ updateLogicalWidthForAlignment(textAlign, 0, 0, logicalLeft, totalLogicalWidth, availableLogicalWidth, 0); |
if (!style()->isLeftToRightDirection()) |
return logicalWidth() - logicalLeft; |