|
Lines 71-83
static void determineDirectionality(TextDirection& dir, InlineIterator iter)
a/Source/WebCore/rendering/RenderBlockLineLayout.cpp_sec1
|
| 71 |
} |
71 |
} |
| 72 |
} |
72 |
} |
| 73 |
|
73 |
|
| 74 |
inline BidiRun* createRun(int start, int end, RenderObject* obj, InlineBidiResolver& resolver) |
74 |
inline BidiRun* createRun(int start, int end, RenderObject& obj, InlineBidiResolver& resolver) |
| 75 |
{ |
75 |
{ |
| 76 |
ASSERT(obj); |
76 |
return new BidiRun(start, end, obj, resolver.context(), resolver.dir()); |
| 77 |
return new BidiRun(start, end, *obj, resolver.context(), resolver.dir()); |
|
|
| 78 |
} |
77 |
} |
| 79 |
|
78 |
|
| 80 |
void RenderBlockFlow::appendRunsForObject(BidiRunList<BidiRun>& runs, int start, int end, RenderObject* obj, InlineBidiResolver& resolver) |
79 |
void RenderBlockFlow::appendRunsForObject(RenderObject& obj, int start, int end, InlineBidiResolver& resolver, BidiRunList<BidiRun>* runs) |
| 81 |
{ |
80 |
{ |
| 82 |
if (start > end || shouldSkipCreatingRunsForObject(obj)) |
81 |
if (start > end || shouldSkipCreatingRunsForObject(obj)) |
| 83 |
return; |
82 |
return; |
|
Lines 88-120
void RenderBlockFlow::appendRunsForObject(BidiRunList<BidiRun>& runs, int start,
a/Source/WebCore/rendering/RenderBlockLineLayout.cpp_sec2
|
| 88 |
if (haveNextMidpoint) |
87 |
if (haveNextMidpoint) |
| 89 |
nextMidpoint = lineMidpointState.midpoints()[lineMidpointState.currentMidpoint()]; |
88 |
nextMidpoint = lineMidpointState.midpoints()[lineMidpointState.currentMidpoint()]; |
| 90 |
if (lineMidpointState.betweenMidpoints()) { |
89 |
if (lineMidpointState.betweenMidpoints()) { |
| 91 |
if (!(haveNextMidpoint && nextMidpoint.renderer() == obj)) |
90 |
if (!haveNextMidpoint || (&obj != nextMidpoint.renderer())) |
| 92 |
return; |
91 |
return; |
| 93 |
// This is a new start point. Stop ignoring objects and |
92 |
// This is a new start point. Stop ignoring objects and |
| 94 |
// adjust our start. |
93 |
// adjust our start. |
| 95 |
lineMidpointState.setBetweenMidpoints(false); |
|
|
| 96 |
start = nextMidpoint.offset(); |
94 |
start = nextMidpoint.offset(); |
| 97 |
lineMidpointState.incrementCurrentMidpoint(); |
95 |
lineMidpointState.incrementCurrentMidpoint(); |
| 98 |
if (start < end) |
96 |
if (start < end) { |
| 99 |
return appendRunsForObject(runs, start, end, obj, resolver); |
97 |
appendRunsForObject(obj, start, end, resolver, runs); |
|
|
98 |
return; |
| 99 |
} |
| 100 |
} else { |
100 |
} else { |
| 101 |
if (!haveNextMidpoint || (obj != nextMidpoint.renderer())) { |
101 |
if (!haveNextMidpoint || (&obj != nextMidpoint.renderer())) { |
| 102 |
runs.addRun(createRun(start, end, obj, resolver)); |
102 |
if (runs) |
|
|
103 |
runs->addRun(createRun(start, end, obj, resolver)); |
| 103 |
return; |
104 |
return; |
| 104 |
} |
105 |
} |
| 105 |
|
106 |
|
| 106 |
// An end midpoint has been encountered within our object. We need to append a run with our endpoint. |
107 |
// An end midpoint has been encountered within our object. We need to append a run with our endpoint. |
| 107 |
if (static_cast<int>(nextMidpoint.offset() + 1) <= end) { |
108 |
if (static_cast<int>(nextMidpoint.offset() + 1) <= end) { |
| 108 |
lineMidpointState.setBetweenMidpoints(true); |
|
|
| 109 |
lineMidpointState.incrementCurrentMidpoint(); |
109 |
lineMidpointState.incrementCurrentMidpoint(); |
| 110 |
// The end of the line is before the object we're inspecting. Skip everything and return |
110 |
// The end of the line is before the object we're inspecting. Skip everything and return |
| 111 |
if (nextMidpoint.refersToEndOfPreviousNode()) |
111 |
if (nextMidpoint.refersToEndOfPreviousNode()) |
| 112 |
return; |
112 |
return; |
| 113 |
if (static_cast<int>(nextMidpoint.offset() + 1) > start) |
113 |
if (static_cast<int>(nextMidpoint.offset() + 1) > start && runs) |
| 114 |
runs.addRun(createRun(start, nextMidpoint.offset() + 1, obj, resolver)); |
114 |
runs->addRun(createRun(start, nextMidpoint.offset() + 1, obj, resolver)); |
| 115 |
appendRunsForObject(runs, nextMidpoint.offset() + 1, end, obj, resolver); |
115 |
appendRunsForObject(obj, nextMidpoint.offset() + 1, end, resolver, runs); |
| 116 |
} else |
116 |
} else if (runs) |
| 117 |
runs.addRun(createRun(start, end, obj, resolver)); |
117 |
runs->addRun(createRun(start, end, obj, resolver)); |
| 118 |
} |
118 |
} |
| 119 |
} |
119 |
} |
| 120 |
|
120 |
|
|
Lines 1011-1025
void RenderBlockFlow::appendFloatingObjectToLastLine(FloatingObject* floatingObj
a/Source/WebCore/rendering/RenderBlockLineLayout.cpp_sec3
|
| 1011 |
lastRootBox()->appendFloat(floatingObject->renderer()); |
1011 |
lastRootBox()->appendFloat(floatingObject->renderer()); |
| 1012 |
} |
1012 |
} |
| 1013 |
|
1013 |
|
| 1014 |
static inline void setUpResolverToResumeInIsolate(InlineBidiResolver& resolver, RenderObject* root, RenderObject* startObject) |
1014 |
static inline void notifyResolverToResumeInIsolate(InlineBidiResolver& resolver, RenderObject* root, RenderObject* startObject) |
| 1015 |
{ |
1015 |
{ |
| 1016 |
if (root != startObject) { |
1016 |
if (root != startObject) { |
| 1017 |
RenderObject* parent = startObject->parent(); |
1017 |
RenderObject* parent = startObject->parent(); |
| 1018 |
setUpResolverToResumeInIsolate(resolver, root, parent); |
1018 |
notifyResolverToResumeInIsolate(resolver, root, parent); |
| 1019 |
notifyObserverEnteredObject(&resolver, startObject); |
1019 |
notifyObserverEnteredObject(&resolver, startObject); |
| 1020 |
} |
1020 |
} |
| 1021 |
} |
1021 |
} |
| 1022 |
|
1022 |
|
|
|
1023 |
static inline Optional<LineMidpointState> isolatedResolversMidpointState(InlineBidiResolver& topResolver, RenderObject* root) |
| 1024 |
{ |
| 1025 |
LineMidpointState midpoints = topResolver.midpointState(); |
| 1026 |
for (unsigned i = 0; i < midpoints.numMidpoints(); ++i) { |
| 1027 |
InlineIterator iter = midpoints.midpoints()[i]; |
| 1028 |
for (RenderObject* renderer = iter.renderer(); renderer && renderer != topResolver.position().root(); renderer = renderer->parent()) { |
| 1029 |
if (renderer == root) { |
| 1030 |
midpoints.setCurrentMidpoint(i); |
| 1031 |
return midpoints; |
| 1032 |
} |
| 1033 |
} |
| 1034 |
} |
| 1035 |
return Optional<LineMidpointState>(Nullopt); |
| 1036 |
} |
| 1037 |
|
| 1038 |
static inline void setUpResolverToResumeInIsolate(InlineBidiResolver& resolver, InlineBidiResolver& topResolver, RenderObject* root, RenderObject* startObject) |
| 1039 |
{ |
| 1040 |
// Set up m_midpointState |
| 1041 |
if (Optional<LineMidpointState> midpoints = isolatedResolversMidpointState(topResolver, root)) |
| 1042 |
resolver.midpointState() = WTF::move(midpoints.value()); |
| 1043 |
|
| 1044 |
// Set up m_nestedIsolateCount |
| 1045 |
notifyResolverToResumeInIsolate(resolver, root, startObject); |
| 1046 |
} |
| 1047 |
|
| 1023 |
// FIXME: BidiResolver should have this logic. |
1048 |
// FIXME: BidiResolver should have this logic. |
| 1024 |
static inline void constructBidiRunsForSegment(InlineBidiResolver& topResolver, BidiRunList<BidiRun>& bidiRuns, const InlineIterator& endOfRuns, VisualDirectionOverride override, bool previousLineBrokeCleanly) |
1049 |
static inline void constructBidiRunsForSegment(InlineBidiResolver& topResolver, BidiRunList<BidiRun>& bidiRuns, const InlineIterator& endOfRuns, VisualDirectionOverride override, bool previousLineBrokeCleanly) |
| 1025 |
{ |
1050 |
{ |
|
Lines 1056-1062
static inline void constructBidiRunsForSegment(InlineBidiResolver& topResolver,
a/Source/WebCore/rendering/RenderBlockLineLayout.cpp_sec4
|
| 1056 |
} |
1081 |
} |
| 1057 |
isolatedResolver.setStatus(BidiStatus(direction, isOverride(unicodeBidi))); |
1082 |
isolatedResolver.setStatus(BidiStatus(direction, isOverride(unicodeBidi))); |
| 1058 |
|
1083 |
|
| 1059 |
setUpResolverToResumeInIsolate(isolatedResolver, isolatedInline, &startObject); |
1084 |
setUpResolverToResumeInIsolate(isolatedResolver, topResolver, isolatedInline, &startObject); |
| 1060 |
|
1085 |
|
| 1061 |
// The starting position is the beginning of the first run within the isolate that was identified |
1086 |
// The starting position is the beginning of the first run within the isolate that was identified |
| 1062 |
// during the earlier call to createBidiRunsForLine. This can be but is not necessarily the |
1087 |
// during the earlier call to createBidiRunsForLine. This can be but is not necessarily the |