Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(503)

Unified Diff: third_party/WebKit/Source/core/layout/line/InlineIterator.h

Issue 1468103002: Add context information to BidiResolver.isolatedRuns() (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/layout/line/InlineIterator.h
diff --git a/third_party/WebKit/Source/core/layout/line/InlineIterator.h b/third_party/WebKit/Source/core/layout/line/InlineIterator.h
index 07108abaf65100eddf81d77fcd2ecdd46d54b50a..bb4549de590e1ee6a690c6cc5adf6d7a2eff7892 100644
--- a/third_party/WebKit/Source/core/layout/line/InlineIterator.h
+++ b/third_party/WebKit/Source/core/layout/line/InlineIterator.h
@@ -33,6 +33,22 @@
namespace blink {
+struct BidiIsolatedRun {
+ BidiIsolatedRun(LayoutObject& object, unsigned position, LayoutObject& root, BidiRun& runToReplace)
+ : object(object)
+ , root(root)
+ , runToReplace(runToReplace)
+ , position(position)
+ {
+ }
+
+ LayoutObject& object;
+ LayoutObject& root;
+ BidiRun& runToReplace;
+ unsigned position;
+};
+
+
// This class is used to LayoutInline subtrees, stepping by character within the
// text children. InlineIterator will use bidiNext to find the next LayoutText
// optionally notifying a BidiResolver every time it steps into/out of a LayoutInline.
@@ -565,14 +581,14 @@ static inline unsigned numberOfIsolateAncestors(const InlineIterator& iter)
// FIXME: This belongs on InlineBidiResolver, except it's a template specialization
// of BidiResolver which knows nothing about LayoutObjects.
-static inline BidiRun* addPlaceholderRunForIsolatedInline(InlineBidiResolver& resolver, LineLayoutItem obj, unsigned pos)
+static inline BidiRun* addPlaceholderRunForIsolatedInline(InlineBidiResolver& resolver, LineLayoutItem obj, unsigned pos, LineLayoutItem root)
{
ASSERT(obj);
BidiRun* isolatedRun = new BidiRun(pos, pos, obj, resolver.context(), resolver.dir());
resolver.runs().addRun(isolatedRun);
// FIXME: isolatedRuns() could be a hash of object->run and then we could cheaply
// ASSERT here that we didn't create multiple objects for the same inline.
- resolver.isolatedRuns().append(isolatedRun);
+ resolver.isolatedRuns().append(BidiIsolatedRun(*obj, pos, *root, *isolatedRun));
return isolatedRun;
}
@@ -616,7 +632,7 @@ public:
void commitExplicitEmbedding(BidiRunList<BidiRun>&) { }
BidiRunList<BidiRun>& runs() { return m_runs; }
- void addFakeRunIfNecessary(LineLayoutItem obj, unsigned pos, unsigned end, InlineBidiResolver& resolver)
+ void addFakeRunIfNecessary(LineLayoutItem obj, unsigned pos, unsigned end, LineLayoutItem root, InlineBidiResolver& resolver)
{
// We only need to add a fake run for a given isolated span once during each call to createBidiRunsForLine.
// We'll be called for every span inside the isolated span so we just ignore subsequent calls.
@@ -624,8 +640,8 @@ public:
if (LayoutBlockFlow::shouldSkipCreatingRunsForObject(obj))
return;
if (!m_haveAddedFakeRunForRootIsolate) {
- BidiRun* run = addPlaceholderRunForIsolatedInline(resolver, obj, pos);
- resolver.setMidpointStateForIsolatedRun(run, m_midpointStateForRootIsolate);
+ BidiRun* run = addPlaceholderRunForIsolatedInline(resolver, obj, pos, root);
+ resolver.setMidpointStateForIsolatedRun(*run, m_midpointStateForRootIsolate);
m_haveAddedFakeRunForRootIsolate = true;
}
// obj and pos together denote a single position in the inline, from which the parsing of the isolate will start.
@@ -640,7 +656,7 @@ private:
BidiRunList<BidiRun>& m_runs;
};
-static void inline appendRunObjectIfNecessary(LineLayoutItem obj, unsigned start, unsigned end, InlineBidiResolver& resolver, AppendRunBehavior behavior, IsolateTracker& tracker)
+static void inline appendRunObjectIfNecessary(LineLayoutItem obj, unsigned start, unsigned end, LineLayoutItem root, InlineBidiResolver& resolver, AppendRunBehavior behavior, IsolateTracker& tracker)
{
// Trailing space code creates empty BidiRun objects, start == end, so
// that case needs to be handled specifically.
@@ -655,14 +671,14 @@ static void inline appendRunObjectIfNecessary(LineLayoutItem obj, unsigned start
if (end - start > limit)
limitedEnd = start + limit;
if (behavior == AppendingFakeRun)
- tracker.addFakeRunIfNecessary(obj, start, limitedEnd, resolver);
+ tracker.addFakeRunIfNecessary(obj, start, limitedEnd, root, resolver);
else
resolver.runs().addRun(createRun(start, limitedEnd, obj, resolver));
start = limitedEnd;
}
}
-static void adjustMidpointsAndAppendRunsForObjectIfNeeded(LineLayoutItem obj, unsigned start, unsigned end, InlineBidiResolver& resolver, AppendRunBehavior behavior, IsolateTracker& tracker)
+static void adjustMidpointsAndAppendRunsForObjectIfNeeded(LineLayoutItem obj, unsigned start, unsigned end, LineLayoutItem root, InlineBidiResolver& resolver, AppendRunBehavior behavior, IsolateTracker& tracker)
{
if (start > end || LayoutBlockFlow::shouldSkipCreatingRunsForObject(obj))
return;
@@ -681,10 +697,10 @@ static void adjustMidpointsAndAppendRunsForObjectIfNeeded(LineLayoutItem obj, un
start = nextMidpoint.offset();
lineMidpointState.incrementCurrentMidpoint();
if (start < end)
- return adjustMidpointsAndAppendRunsForObjectIfNeeded(obj, start, end, resolver, behavior, tracker);
+ return adjustMidpointsAndAppendRunsForObjectIfNeeded(obj, start, end, root, resolver, behavior, tracker);
} else {
if (!haveNextMidpoint || (obj != nextMidpoint.object())) {
- appendRunObjectIfNecessary(obj, start, end, resolver, behavior, tracker);
+ appendRunObjectIfNecessary(obj, start, end, root, resolver, behavior, tracker);
return;
}
@@ -695,19 +711,19 @@ static void adjustMidpointsAndAppendRunsForObjectIfNeeded(LineLayoutItem obj, un
lineMidpointState.incrementCurrentMidpoint();
if (nextMidpoint.offset() != UINT_MAX) { // UINT_MAX means stop at the object and don't nclude any of it.
if (nextMidpoint.offset() + 1 > start)
- appendRunObjectIfNecessary(obj, start, nextMidpoint.offset() + 1, resolver, behavior, tracker);
- return adjustMidpointsAndAppendRunsForObjectIfNeeded(obj, nextMidpoint.offset() + 1, end, resolver, behavior, tracker);
+ appendRunObjectIfNecessary(obj, start, nextMidpoint.offset() + 1, root, resolver, behavior, tracker);
+ return adjustMidpointsAndAppendRunsForObjectIfNeeded(obj, nextMidpoint.offset() + 1, end, root, resolver, behavior, tracker);
}
} else {
- appendRunObjectIfNecessary(obj, start, end, resolver, behavior, tracker);
+ appendRunObjectIfNecessary(obj, start, end, root, resolver, behavior, tracker);
}
}
}
-static inline void addFakeRunIfNecessary(LineLayoutItem obj, unsigned start, unsigned end, InlineBidiResolver& resolver, IsolateTracker& tracker)
+static inline void addFakeRunIfNecessary(LineLayoutItem obj, unsigned start, unsigned end, LineLayoutItem root, InlineBidiResolver& resolver, IsolateTracker& tracker)
{
tracker.setMidpointStateForRootIsolate(resolver.midpointState());
- adjustMidpointsAndAppendRunsForObjectIfNeeded(obj, start, obj.length(), resolver, AppendingFakeRun, tracker);
+ adjustMidpointsAndAppendRunsForObjectIfNeeded(obj, start, obj.length(), root, resolver, AppendingFakeRun, tracker);
}
template <>
@@ -722,9 +738,9 @@ inline void InlineBidiResolver::appendRun(BidiRunList<BidiRun>& runs)
LineLayoutItem obj = m_sor.object();
while (obj && obj != m_eor.object() && obj != m_endOfRunAtEndOfLine.object()) {
if (isolateTracker.inIsolate())
- addFakeRunIfNecessary(obj, start, obj.length(), *this, isolateTracker);
+ addFakeRunIfNecessary(obj, start, obj.length(), m_sor.root(), *this, isolateTracker);
else
- adjustMidpointsAndAppendRunsForObjectIfNeeded(obj, start, obj.length(), *this, AppendingRunsForObject, isolateTracker);
+ adjustMidpointsAndAppendRunsForObjectIfNeeded(obj, start, obj.length(), m_sor.root(), *this, AppendingRunsForObject, isolateTracker);
// FIXME: start/obj should be an InlineIterator instead of two separate variables.
start = 0;
obj = bidiNextSkippingEmptyInlines(m_sor.root(), obj, &isolateTracker);
@@ -739,9 +755,9 @@ inline void InlineBidiResolver::appendRun(BidiRunList<BidiRun>& runs)
// It's OK to add runs for zero-length LayoutObjects, just don't make the run larger than it should be
int end = obj.length() ? pos + 1 : 0;
if (isolateTracker.inIsolate())
- addFakeRunIfNecessary(obj, start, end, *this, isolateTracker);
+ addFakeRunIfNecessary(obj, start, end, m_sor.root(), *this, isolateTracker);
else
- adjustMidpointsAndAppendRunsForObjectIfNeeded(obj, start, end, *this, AppendingRunsForObject, isolateTracker);
+ adjustMidpointsAndAppendRunsForObjectIfNeeded(obj, start, end, m_sor.root(), *this, AppendingRunsForObject, isolateTracker);
}
if (isEndOfLine)
« no previous file with comments | « third_party/WebKit/Source/core/layout/BidiRunForLine.cpp ('k') | third_party/WebKit/Source/core/layout/line/TrailingObjects.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698