OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2014 Google Inc. All rights reserved. | 2 * Copyright (C) 2014 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 17 matching lines...) Expand all Loading... |
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
29 */ | 29 */ |
30 | 30 |
31 #include "platform/fonts/Character.h" | 31 #include "platform/fonts/Character.h" |
32 | 32 |
33 #include "wtf/StdLibExtras.h" | 33 #include "wtf/StdLibExtras.h" |
34 #include "wtf/text/StringBuilder.h" | 34 #include "wtf/text/StringBuilder.h" |
35 #include <algorithm> | 35 #include <algorithm> |
36 #include <unicode/uobject.h> | 36 #include <unicode/uobject.h> |
37 #include <unicode/uscript.h> | 37 #include <unicode/uscript.h> |
| 38 |
| 39 #if defined(USING_SYSTEM_ICU) |
| 40 #include "CharacterData.h" |
| 41 #include <unicode/uniset.h> |
| 42 #else |
38 #define MUTEX_H // Prevent compile failure of utrie2.h on Windows | 43 #define MUTEX_H // Prevent compile failure of utrie2.h on Windows |
39 #include <utrie2.h> | 44 #include <utrie2.h> |
| 45 #endif |
40 | 46 |
41 using namespace WTF; | 47 using namespace WTF; |
42 using namespace Unicode; | 48 using namespace Unicode; |
43 | 49 |
44 namespace blink { | 50 namespace blink { |
45 | 51 |
| 52 #if defined(USING_SYSTEM_ICU) |
| 53 static icu::UnicodeSet* createUnicodeSet( |
| 54 const UChar32* characters, size_t charactersCount, |
| 55 const UChar32* ranges, size_t rangesCount) |
| 56 { |
| 57 icu::UnicodeSet* unicodeSet = new icu::UnicodeSet(); |
| 58 for (size_t i = 0; i < charactersCount; i++) |
| 59 unicodeSet->add(characters[i]); |
| 60 for (size_t i = 0; i < rangesCount; i += 2) |
| 61 unicodeSet->add(ranges[i], ranges[i + 1]); |
| 62 unicodeSet->freeze(); |
| 63 return unicodeSet; |
| 64 } |
| 65 |
| 66 #define CREATE_UNICODE_SET(name) \ |
| 67 createUnicodeSet( \ |
| 68 name##Array, WTF_ARRAY_LENGTH(name##Array), \ |
| 69 name##Ranges, WTF_ARRAY_LENGTH(name##Ranges)) |
| 70 |
| 71 #define RETURN_HAS_PROPERTY(c, name) \ |
| 72 static icu::UnicodeSet* unicodeSet = nullptr; \ |
| 73 if (!unicodeSet) \ |
| 74 unicodeSet = CREATE_UNICODE_SET(name); \ |
| 75 return unicodeSet->contains(c); |
| 76 #else |
46 // Freezed trie tree, see CharacterDataGenerator.cpp. | 77 // Freezed trie tree, see CharacterDataGenerator.cpp. |
47 extern int32_t serializedCharacterDataSize; | 78 extern int32_t serializedCharacterDataSize; |
48 extern uint8_t serializedCharacterData[]; | 79 extern uint8_t serializedCharacterData[]; |
49 | 80 |
50 static UTrie2* createTrie() | 81 static UTrie2* createTrie() |
51 { | 82 { |
52 // Create a Trie from the value array. | 83 // Create a Trie from the value array. |
53 UErrorCode error = U_ZERO_ERROR; | 84 UErrorCode error = U_ZERO_ERROR; |
54 UTrie2* trie = utrie2_openFromSerialized( | 85 UTrie2* trie = utrie2_openFromSerialized( |
55 UTrie2ValueBits::UTRIE2_16_VALUE_BITS, | 86 UTrie2ValueBits::UTRIE2_16_VALUE_BITS, |
56 serializedCharacterData, serializedCharacterDataSize, | 87 serializedCharacterData, serializedCharacterDataSize, |
57 nullptr, &error); | 88 nullptr, &error); |
58 ASSERT(error == U_ZERO_ERROR); | 89 ASSERT(error == U_ZERO_ERROR); |
59 return trie; | 90 return trie; |
60 } | 91 } |
61 | 92 |
62 bool Character::hasProperty(UChar32 c, CharacterProperty property) | 93 static bool hasProperty(UChar32 c, CharacterProperty property) |
63 { | 94 { |
64 static UTrie2* trie = nullptr; | 95 static UTrie2* trie = nullptr; |
65 if (!trie) | 96 if (!trie) |
66 trie = createTrie(); | 97 trie = createTrie(); |
67 return UTRIE2_GET16(trie, c) | 98 return UTRIE2_GET16(trie, c) |
68 & static_cast<CharacterPropertyType>(property); | 99 & static_cast<CharacterPropertyType>(property); |
69 } | 100 } |
70 | 101 |
| 102 #define RETURN_HAS_PROPERTY(c, name) \ |
| 103 return hasProperty(c, CharacterProperty::name); |
| 104 #endif |
| 105 |
71 // Takes a flattened list of closed intervals | 106 // Takes a flattened list of closed intervals |
72 template <class T, size_t size> | 107 template <class T, size_t size> |
73 bool valueInIntervalList(const T (&intervalList)[size], const T& value) | 108 bool valueInIntervalList(const T (&intervalList)[size], const T& value) |
74 { | 109 { |
75 const T* bound = std::upper_bound(&intervalList[0], &intervalList[size], val
ue); | 110 const T* bound = std::upper_bound(&intervalList[0], &intervalList[size], val
ue); |
76 if ((bound - intervalList) % 2 == 1) | 111 if ((bound - intervalList) % 2 == 1) |
77 return true; | 112 return true; |
78 return bound > intervalList && *(bound - 1) == value; | 113 return bound > intervalList && *(bound - 1) == value; |
79 } | 114 } |
80 | 115 |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
177 // Search for other Complex cases | 212 // Search for other Complex cases |
178 if (valueInIntervalList(complexCodePathRanges, c)) | 213 if (valueInIntervalList(complexCodePathRanges, c)) |
179 return ComplexPath; | 214 return ComplexPath; |
180 } | 215 } |
181 | 216 |
182 return result; | 217 return result; |
183 } | 218 } |
184 | 219 |
185 bool Character::isUprightInMixedVertical(UChar32 character) | 220 bool Character::isUprightInMixedVertical(UChar32 character) |
186 { | 221 { |
187 return hasProperty(character, CharacterProperty::isUprightInMixedVertical); | 222 RETURN_HAS_PROPERTY(character, isUprightInMixedVertical) |
188 } | 223 } |
189 | 224 |
190 bool Character::isCJKIdeographOrSymbol(UChar32 c) | 225 bool Character::isCJKIdeographOrSymbol(UChar32 c) |
191 { | 226 { |
192 // Likely common case | 227 // Likely common case |
193 if (c < 0x2C7) | 228 if (c < 0x2C7) |
194 return false; | 229 return false; |
195 | 230 |
196 return hasProperty(c, CharacterProperty::isCJKIdeographOrSymbol); | 231 RETURN_HAS_PROPERTY(c, isCJKIdeographOrSymbol) |
197 } | 232 } |
198 | 233 |
199 unsigned Character::expansionOpportunityCount(const LChar* characters, size_t le
ngth, TextDirection direction, bool& isAfterExpansion, const TextJustify textJus
tify) | 234 unsigned Character::expansionOpportunityCount(const LChar* characters, size_t le
ngth, TextDirection direction, bool& isAfterExpansion, const TextJustify textJus
tify) |
200 { | 235 { |
201 unsigned count = 0; | 236 unsigned count = 0; |
202 if (textJustify == TextJustifyDistribute) { | 237 if (textJustify == TextJustifyDistribute) { |
203 isAfterExpansion = true; | 238 isAfterExpansion = true; |
204 return length; | 239 return length; |
205 } | 240 } |
206 | 241 |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
313 } | 348 } |
314 | 349 |
315 bool Character::isCommonOrInheritedScript(UChar32 character) | 350 bool Character::isCommonOrInheritedScript(UChar32 character) |
316 { | 351 { |
317 UErrorCode status = U_ZERO_ERROR; | 352 UErrorCode status = U_ZERO_ERROR; |
318 UScriptCode script = uscript_getScript(character, &status); | 353 UScriptCode script = uscript_getScript(character, &status); |
319 return U_SUCCESS(status) && (script == USCRIPT_COMMON || script == USCRIPT_I
NHERITED); | 354 return U_SUCCESS(status) && (script == USCRIPT_COMMON || script == USCRIPT_I
NHERITED); |
320 } | 355 } |
321 | 356 |
322 } // namespace blink | 357 } // namespace blink |
OLD | NEW |