OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2000 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 2000 Lars Knoll (knoll@kde.org) |
3 * Copyright (C) 2003, 2004, 2006, 2007, 2008 Apple Inc. All right reserved. | 3 * Copyright (C) 2003, 2004, 2006, 2007, 2008 Apple Inc. All right reserved. |
4 * | 4 * |
5 * This library is free software; you can redistribute it and/or | 5 * This library is free software; you can redistribute it and/or |
6 * modify it under the terms of the GNU Library General Public | 6 * modify it under the terms of the GNU Library General Public |
7 * License as published by the Free Software Foundation; either | 7 * License as published by the Free Software Foundation; either |
8 * version 2 of the License, or (at your option) any later version. | 8 * version 2 of the License, or (at your option) any later version. |
9 * | 9 * |
10 * This library is distributed in the hope that it will be useful, | 10 * This library is distributed in the hope that it will be useful, |
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
13 * Library General Public License for more details. | 13 * Library General Public License for more details. |
14 * | 14 * |
15 * You should have received a copy of the GNU Library General Public License | 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 | 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, | 17 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
18 * Boston, MA 02110-1301, USA. | 18 * Boston, MA 02110-1301, USA. |
19 * | 19 * |
20 */ | 20 */ |
21 | 21 |
22 #ifndef BidiResolver_h | 22 #ifndef BidiResolver_h |
23 #define BidiResolver_h | 23 #define BidiResolver_h |
24 | 24 |
25 #include "platform/text/BidiContext.h" | 25 #include "platform/text/BidiContext.h" |
26 #include "platform/text/BidiRunList.h" | 26 #include "platform/text/BidiRunList.h" |
27 #include "platform/text/TextDirection.h" | 27 #include "platform/text/TextDirection.h" |
| 28 #include "wtf/HashMap.h" |
28 #include "wtf/Noncopyable.h" | 29 #include "wtf/Noncopyable.h" |
29 #include "wtf/PassRefPtr.h" | 30 #include "wtf/PassRefPtr.h" |
30 #include "wtf/Vector.h" | 31 #include "wtf/Vector.h" |
31 | 32 |
32 namespace WebCore { | 33 namespace WebCore { |
33 | 34 |
34 template <class Iterator> struct MidpointState { | 35 template <class Iterator> struct MidpointState { |
35 MidpointState() | 36 MidpointState() |
36 { | 37 { |
37 reset(); | 38 reset(); |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
218 // FIXME: This used to be part of deleteRuns() but was a layering violation. | 219 // FIXME: This used to be part of deleteRuns() but was a layering violation. |
219 // It's unclear if this is still needed. | 220 // It's unclear if this is still needed. |
220 void markCurrentRunEmpty() { m_emptyRun = true; } | 221 void markCurrentRunEmpty() { m_emptyRun = true; } |
221 | 222 |
222 Vector<Run*>& isolatedRuns() { return m_isolatedRuns; } | 223 Vector<Run*>& isolatedRuns() { return m_isolatedRuns; } |
223 | 224 |
224 bool isEndOfParagraph(const Iterator& end) { return m_current == end || m_cu
rrent.atEnd(); } | 225 bool isEndOfParagraph(const Iterator& end) { return m_current == end || m_cu
rrent.atEnd(); } |
225 | 226 |
226 TextDirection determineParagraphDirectionality(bool* hasStrongDirectionality
= 0); | 227 TextDirection determineParagraphDirectionality(bool* hasStrongDirectionality
= 0); |
227 | 228 |
| 229 void setMidpointStateForIsolatedRun(Run*, const MidpointState<Iterator>&); |
| 230 MidpointState<Iterator> midpointStateForIsolatedRun(Run*); |
| 231 |
228 protected: | 232 protected: |
229 void increment() { m_current.increment(); } | 233 void increment() { m_current.increment(); } |
230 // FIXME: Instead of InlineBidiResolvers subclassing this method, we should | 234 // FIXME: Instead of InlineBidiResolvers subclassing this method, we should |
231 // pass in some sort of Traits object which knows how to create runs for app
ending. | 235 // pass in some sort of Traits object which knows how to create runs for app
ending. |
232 void appendRun(); | 236 void appendRun(); |
233 | 237 |
234 Iterator m_current; | 238 Iterator m_current; |
235 // sor and eor are "start of run" and "end of run" respectively and correpon
d | 239 // sor and eor are "start of run" and "end of run" respectively and correpon
d |
236 // to abreviations used in UBA spec: http://unicode.org/reports/tr9/#BD7 | 240 // to abreviations used in UBA spec: http://unicode.org/reports/tr9/#BD7 |
237 Iterator m_sor; // Points to the first character in the current run. | 241 Iterator m_sor; // Points to the first character in the current run. |
(...skipping 17 matching lines...) Expand all Loading... |
255 | 259 |
256 private: | 260 private: |
257 void raiseExplicitEmbeddingLevel(WTF::Unicode::Direction from, WTF::Unicode:
:Direction to); | 261 void raiseExplicitEmbeddingLevel(WTF::Unicode::Direction from, WTF::Unicode:
:Direction to); |
258 void lowerExplicitEmbeddingLevel(WTF::Unicode::Direction from); | 262 void lowerExplicitEmbeddingLevel(WTF::Unicode::Direction from); |
259 void checkDirectionInLowerRaiseEmbeddingLevel(); | 263 void checkDirectionInLowerRaiseEmbeddingLevel(); |
260 | 264 |
261 void updateStatusLastFromCurrentDirection(WTF::Unicode::Direction); | 265 void updateStatusLastFromCurrentDirection(WTF::Unicode::Direction); |
262 void reorderRunsFromLevels(); | 266 void reorderRunsFromLevels(); |
263 | 267 |
264 Vector<BidiEmbedding, 8> m_currentExplicitEmbeddingSequence; | 268 Vector<BidiEmbedding, 8> m_currentExplicitEmbeddingSequence; |
| 269 HashMap<Run *, MidpointState<Iterator> > m_midpointStateForIsolatedRun; |
265 }; | 270 }; |
266 | 271 |
267 #ifndef NDEBUG | 272 #ifndef NDEBUG |
268 template <class Iterator, class Run> | 273 template <class Iterator, class Run> |
269 BidiResolver<Iterator, Run>::~BidiResolver() | 274 BidiResolver<Iterator, Run>::~BidiResolver() |
270 { | 275 { |
271 // The owner of this resolver should have handled the isolated runs. | 276 // The owner of this resolver should have handled the isolated runs. |
272 ASSERT(m_isolatedRuns.isEmpty()); | 277 ASSERT(m_isolatedRuns.isEmpty()); |
273 } | 278 } |
274 #endif | 279 #endif |
(...skipping 675 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
950 break; | 955 break; |
951 } | 956 } |
952 } | 957 } |
953 } | 958 } |
954 | 959 |
955 m_runs.setLogicallyLastRun(m_runs.lastRun()); | 960 m_runs.setLogicallyLastRun(m_runs.lastRun()); |
956 reorderRunsFromLevels(); | 961 reorderRunsFromLevels(); |
957 endOfLine = Iterator(); | 962 endOfLine = Iterator(); |
958 } | 963 } |
959 | 964 |
| 965 template <class Iterator, class Run> |
| 966 void BidiResolver<Iterator, Run>::setMidpointStateForIsolatedRun(Run* run, const
MidpointState<Iterator>& midpoint) |
| 967 { |
| 968 ASSERT(!m_midpointStateForIsolatedRun.contains(run)); |
| 969 m_midpointStateForIsolatedRun.add(run, midpoint); |
| 970 } |
| 971 |
| 972 template<class Iterator, class Run> |
| 973 MidpointState<Iterator> BidiResolver<Iterator, Run>::midpointStateForIsolatedRun
(Run* run) |
| 974 { |
| 975 return m_midpointStateForIsolatedRun.take(run); |
| 976 } |
| 977 |
| 978 |
960 } // namespace WebCore | 979 } // namespace WebCore |
961 | 980 |
962 #endif // BidiResolver_h | 981 #endif // BidiResolver_h |
OLD | NEW |