2
* Copyright (C) 2000 Lars Knoll (knoll@kde.org)
3
* Copyright (C) 2003, 2004, 2006, 2007, 2009, 2010 Apple Inc. All right reserved.
5
* This library is free software; you can redistribute it and/or
6
* modify it under the terms of the GNU Library General Public
7
* License as published by the Free Software Foundation; either
8
* version 2 of the License, or (at your option) any later version.
10
* This library is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
* Library General Public License for more details.
15
* You should have received a copy of the GNU Library General Public License
16
* along with this library; see the file COPYING.LIB. If not, write to
17
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18
* Boston, MA 02110-1301, USA.
23
#include "BidiContext.h"
24
#include <wtf/Vector.h>
28
using namespace WTF::Unicode;
30
struct SameSizeAsBidiContext : public RefCounted<SameSizeAsBidiContext> {
31
uint32_t bitfields : 16;
35
COMPILE_ASSERT(sizeof(BidiContext) == sizeof(SameSizeAsBidiContext), BidiContext_should_stay_small);
37
inline PassRefPtr<BidiContext> BidiContext::createUncached(unsigned char level, Direction direction, bool override, BidiEmbeddingSource source, BidiContext* parent)
39
return adoptRef(new BidiContext(level, direction, override, source, parent));
42
PassRefPtr<BidiContext> BidiContext::create(unsigned char level, Direction direction, bool override, BidiEmbeddingSource source, BidiContext* parent)
44
ASSERT(direction == (level % 2 ? RightToLeft : LeftToRight));
47
return createUncached(level, direction, override, source, parent);
52
static BidiContext* ltrContext = createUncached(0, LeftToRight, false, FromStyleOrDOM, 0).leakRef();
56
static BidiContext* ltrOverrideContext = createUncached(0, LeftToRight, true, FromStyleOrDOM, 0).leakRef();
57
return ltrOverrideContext;
61
static BidiContext* rtlContext = createUncached(1, RightToLeft, false, FromStyleOrDOM, 0).leakRef();
65
static BidiContext* rtlOverrideContext = createUncached(1, RightToLeft, true, FromStyleOrDOM, 0).leakRef();
66
return rtlOverrideContext;
69
static inline PassRefPtr<BidiContext> copyContextAndRebaselineLevel(BidiContext* context, BidiContext* parent)
72
unsigned char newLevel = parent ? parent->level() : 0;
73
if (context->dir() == RightToLeft)
74
newLevel = nextGreaterOddLevel(newLevel);
76
newLevel = nextGreaterEvenLevel(newLevel);
78
return BidiContext::create(newLevel, context->dir(), context->override(), context->source(), parent);
81
// The BidiContext stack must be immutable -- they're re-used for re-layout after
82
// DOM modification/editing -- so we copy all the non-unicode contexts, and
83
// recalculate their levels.
84
PassRefPtr<BidiContext> BidiContext::copyStackRemovingUnicodeEmbeddingContexts()
86
Vector<BidiContext*, 64> contexts;
87
for (BidiContext* iter = this; iter; iter = iter->parent()) {
88
if (iter->source() != FromUnicode)
89
contexts.append(iter);
91
ASSERT(contexts.size());
93
RefPtr<BidiContext> topContext = copyContextAndRebaselineLevel(contexts.last(), 0);
94
for (int i = contexts.size() - 1; i > 0; --i)
95
topContext = copyContextAndRebaselineLevel(contexts[i - 1], topContext.get());
97
return topContext.release();
100
bool operator==(const BidiContext& c1, const BidiContext& c2)
104
if (c1.level() != c2.level() || c1.override() != c2.override() || c1.dir() != c2.dir() || c1.source() != c2.source())
108
return c2.parent() && *c1.parent() == *c2.parent();
111
} // namespace WebCore