diff options
| author | Steve Block <steveblock@google.com> | 2011-06-08 08:26:01 -0700 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2011-06-08 08:26:01 -0700 |
| commit | 3742ac093d35d923c81693096ab6671e9b147700 (patch) | |
| tree | c2add9100f789dad45ef1ec5328bddde02c47a4c /Source/WebCore/platform/text/BidiContext.cpp | |
| parent | 901401d90459bc22580842455d4588b9a697514d (diff) | |
| parent | e5926f4a0d6adc9ad4a75824129f117181953560 (diff) | |
| download | external_webkit-3742ac093d35d923c81693096ab6671e9b147700.zip external_webkit-3742ac093d35d923c81693096ab6671e9b147700.tar.gz external_webkit-3742ac093d35d923c81693096ab6671e9b147700.tar.bz2 | |
Merge changes I55c6d71a,Ifb3277d4,Ia1b847a2,I7ba9cf3f,Ida2b2a8a,I1280ec90,I72f818d5,I2e3b588b,I9a4e6289,Ia724c78b,Icd8612c8,Ie31b15d7,Ie125edae,I77941a88,I89dae78b,I3516e5ca,I1a4c17b5,I2c4ecc1a,I9c8e6537,Ifac13115,Ie1f80e09,Ia541ed77,I60ce9d78
* changes:
Merge WebKit at r82507: Update ThirdPartyProject.prop
Merge WebKit at r82507: Cherry-pick change r88166 to add INSPECTOR guards to ScriptProfiler
Merge WebKit at r82507: Work around a V8 bug
Merge WebKit at r82507: JNIType renamed to JavaType
Merge WebKit at r82507: IconDatabaseClient interface expanded
Merge WebKit at r82507: Don't use new loss-free code path in HTMLCanvasElement::toDataURL()
Merge WebKit at r82507: IcondDatabaseBase::iconForPageURL() renamed
Merge WebKit at r82507: IconDatabaseBase::Open() signature changed
Merge WebKit at r82507: Node::isContentEditable() renamed
Merge WebKit at r82507: Use icon database through IconDatabaseBase
Merge WebKit at r82507: toInputElement() is now a member of Node
Merge WebKit at r82507: FrameLoaderClient::objectContentType() signature changed
Merge WebKit at r82507: StringImpl::computeHash() removed
Merge WebKit at r82507: Stub out FontPlatformData::setOrientation()
Merge WebKit at r82507: Path::strokeBoundingRect() is now const
Merge WebKit at r82507: Add missing UnusedParam.h include in ApplicationCacheGroup.cpp
Merge WebKit at r82507: Continue to use Android's version of FontPlatformData.h
Merge WebKit at r82507: Update signature of FontCustomPlatformData::fontPlatformData()
Merge WebKit at r82507: Fix conflicts due to JNI refactoring
Merge WebKit at r82507: Fix conflicts due to new StorageTracker
Merge WebKit at r82507: Fix conflicts
Merge WebKit at r82507: Fix makefiles
Merge WebKit at r82507: Initial merge by git
Diffstat (limited to 'Source/WebCore/platform/text/BidiContext.cpp')
| -rw-r--r-- | Source/WebCore/platform/text/BidiContext.cpp | 50 |
1 files changed, 41 insertions, 9 deletions
diff --git a/Source/WebCore/platform/text/BidiContext.cpp b/Source/WebCore/platform/text/BidiContext.cpp index fb6b8cf..f507514 100644 --- a/Source/WebCore/platform/text/BidiContext.cpp +++ b/Source/WebCore/platform/text/BidiContext.cpp @@ -21,48 +21,80 @@ #include "config.h" #include "BidiContext.h" +#include <wtf/Vector.h> namespace WebCore { using namespace WTF::Unicode; -inline PassRefPtr<BidiContext> BidiContext::createUncached(unsigned char level, Direction direction, bool override, BidiContext* parent) +inline PassRefPtr<BidiContext> BidiContext::createUncached(unsigned char level, Direction direction, bool override, BidiEmbeddingSource source, BidiContext* parent) { - return adoptRef(new BidiContext(level, direction, override, parent)); + return adoptRef(new BidiContext(level, direction, override, source, parent)); } -PassRefPtr<BidiContext> BidiContext::create(unsigned char level, Direction direction, bool override, BidiContext* parent) +PassRefPtr<BidiContext> BidiContext::create(unsigned char level, Direction direction, bool override, BidiEmbeddingSource source, BidiContext* parent) { ASSERT(direction == (level % 2 ? RightToLeft : LeftToRight)); if (parent) - return createUncached(level, direction, override, parent); + return createUncached(level, direction, override, source, parent); ASSERT(level <= 1); if (!level) { if (!override) { - static BidiContext* ltrContext = createUncached(0, LeftToRight, false, 0).releaseRef(); + static BidiContext* ltrContext = createUncached(0, LeftToRight, false, FromStyleOrDOM, 0).releaseRef(); return ltrContext; } - static BidiContext* ltrOverrideContext = createUncached(0, LeftToRight, true, 0).releaseRef(); + static BidiContext* ltrOverrideContext = createUncached(0, LeftToRight, true, FromStyleOrDOM, 0).releaseRef(); return ltrOverrideContext; } if (!override) { - static BidiContext* rtlContext = createUncached(1, RightToLeft, false, 0).releaseRef(); + static BidiContext* rtlContext = createUncached(1, RightToLeft, false, FromStyleOrDOM, 0).releaseRef(); return rtlContext; } - static BidiContext* rtlOverrideContext = createUncached(1, RightToLeft, true, 0).releaseRef(); + static BidiContext* rtlOverrideContext = createUncached(1, RightToLeft, true, FromStyleOrDOM, 0).releaseRef(); return rtlOverrideContext; } +static inline PassRefPtr<BidiContext> copyContextAndRebaselineLevel(BidiContext* context, BidiContext* parent) +{ + ASSERT(context); + unsigned char newLevel = parent ? parent->level() : 0; + if (context->dir() == RightToLeft) + newLevel = nextGreaterOddLevel(newLevel); + else if (parent) + newLevel = nextGreaterEvenLevel(newLevel); + + return BidiContext::create(newLevel, context->dir(), context->override(), context->source(), parent); +} + +// The BidiContext stack must be immutable -- they're re-used for re-layout after +// DOM modification/editing -- so we copy all the non-unicode contexts, and +// recalculate their levels. +PassRefPtr<BidiContext> BidiContext::copyStackRemovingUnicodeEmbeddingContexts() +{ + Vector<BidiContext*, 64> contexts; + for (BidiContext* iter = this; iter; iter = iter->parent()) { + if (iter->source() != FromUnicode) + contexts.append(iter); + } + ASSERT(contexts.size()); + + RefPtr<BidiContext> topContext = copyContextAndRebaselineLevel(contexts.last(), 0); + for (int i = contexts.size() - 1; i > 0; --i) + topContext = copyContextAndRebaselineLevel(contexts[i - 1], topContext.get()); + + return topContext.release(); +} + bool operator==(const BidiContext& c1, const BidiContext& c2) { if (&c1 == &c2) return true; - if (c1.level() != c2.level() || c1.override() != c2.override() || c1.dir() != c2.dir()) + if (c1.level() != c2.level() || c1.override() != c2.override() || c1.dir() != c2.dir() || c1.source() != c2.source()) return false; if (!c1.parent()) return !c2.parent(); |
