OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "platform/fonts/ScriptRunIterator.h" | 5 #include "platform/fonts/ScriptRunIterator.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 #include "platform/wtf/Assertions.h" | 8 #include "platform/wtf/Assertions.h" |
9 #include "platform/wtf/Threading.h" | 9 #include "platform/wtf/Threading.h" |
10 #include "platform/wtf/text/WTFString.h" | 10 #include "platform/wtf/text/WTFString.h" |
(...skipping 19 matching lines...) Expand all Loading... |
30 ~MockScriptData() override {} | 30 ~MockScriptData() override {} |
31 | 31 |
32 static const MockScriptData* Instance() { | 32 static const MockScriptData* Instance() { |
33 DEFINE_THREAD_SAFE_STATIC_LOCAL(const MockScriptData, mock_script_data, | 33 DEFINE_THREAD_SAFE_STATIC_LOCAL(const MockScriptData, mock_script_data, |
34 (new MockScriptData())); | 34 (new MockScriptData())); |
35 | 35 |
36 return &mock_script_data; | 36 return &mock_script_data; |
37 } | 37 } |
38 | 38 |
39 void GetScripts(UChar32 ch, Vector<UScriptCode>& dst) const override { | 39 void GetScripts(UChar32 ch, Vector<UScriptCode>& dst) const override { |
40 ASSERT(ch >= kMockCharMin); | 40 DCHECK_GE(ch, kMockCharMin); |
41 ASSERT(ch < kMockCharLimit); | 41 DCHECK_LT(ch, kMockCharLimit); |
42 | 42 |
43 int code = ch - kMockCharMin; | 43 int code = ch - kMockCharMin; |
44 dst.Clear(); | 44 dst.Clear(); |
45 switch (code & kCodeSpecialMask) { | 45 switch (code & kCodeSpecialMask) { |
46 case kCodeSpecialCommon: | 46 case kCodeSpecialCommon: |
47 dst.push_back(USCRIPT_COMMON); | 47 dst.push_back(USCRIPT_COMMON); |
48 break; | 48 break; |
49 case kCodeSpecialInherited: | 49 case kCodeSpecialInherited: |
50 dst.push_back(USCRIPT_INHERITED); | 50 dst.push_back(USCRIPT_INHERITED); |
51 break; | 51 break; |
(...skipping 28 matching lines...) Expand all Loading... |
80 case PairedBracketType::kBracketTypeClose: | 80 case PairedBracketType::kBracketTypeClose: |
81 return ch - kBracketDelta; | 81 return ch - kBracketDelta; |
82 case PairedBracketType::kBracketTypeOpen: | 82 case PairedBracketType::kBracketTypeOpen: |
83 return ch + kBracketDelta; | 83 return ch + kBracketDelta; |
84 default: | 84 default: |
85 return ch; | 85 return ch; |
86 } | 86 } |
87 } | 87 } |
88 | 88 |
89 PairedBracketType GetPairedBracketType(UChar32 ch) const override { | 89 PairedBracketType GetPairedBracketType(UChar32 ch) const override { |
90 ASSERT(ch >= kMockCharMin && ch < kMockCharLimit); | 90 DCHECK_GE(ch, kMockCharMin); |
| 91 DCHECK_LT(ch, kMockCharLimit); |
91 int code = ch - kMockCharMin; | 92 int code = ch - kMockCharMin; |
92 if ((code & kCodeBracketBit) == 0) { | 93 if ((code & kCodeBracketBit) == 0) { |
93 return PairedBracketType::kBracketTypeNone; | 94 return PairedBracketType::kBracketTypeNone; |
94 } | 95 } |
95 if (code & kCodeBracketCloseBit) { | 96 if (code & kCodeBracketCloseBit) { |
96 return PairedBracketType::kBracketTypeClose; | 97 return PairedBracketType::kBracketTypeClose; |
97 } | 98 } |
98 return PairedBracketType::kBracketTypeOpen; | 99 return PairedBracketType::kBracketTypeOpen; |
99 } | 100 } |
100 | 101 |
(...skipping 11 matching lines...) Expand all Loading... |
112 String result(g_empty_string16_bit); | 113 String result(g_empty_string16_bit); |
113 bool in_set = false; | 114 bool in_set = false; |
114 int seen = 0; | 115 int seen = 0; |
115 int code = 0; | 116 int code = 0; |
116 int list = 0; | 117 int list = 0; |
117 int current_shift = 0; | 118 int current_shift = 0; |
118 for (char c : input) { | 119 for (char c : input) { |
119 if (in_set) { | 120 if (in_set) { |
120 switch (c) { | 121 switch (c) { |
121 case '(': | 122 case '(': |
122 ASSERT(seen == 0); | 123 DCHECK_EQ(seen, 0); |
123 seen |= kSawBracket; | 124 seen |= kSawBracket; |
124 code |= kCodeBracketBit; | 125 code |= kCodeBracketBit; |
125 break; | 126 break; |
126 case '[': | 127 case '[': |
127 ASSERT(seen == 0); | 128 DCHECK_EQ(seen, 0); |
128 seen |= kSawBracket; | 129 seen |= kSawBracket; |
129 code |= kCodeBracketBit | kCodeSquareBracketBit; | 130 code |= kCodeBracketBit | kCodeSquareBracketBit; |
130 break; | 131 break; |
131 case ')': | 132 case ')': |
132 ASSERT(seen == 0); | 133 DCHECK_EQ(seen, 0); |
133 seen |= kSawBracket; | 134 seen |= kSawBracket; |
134 code |= kCodeBracketBit | kCodeBracketCloseBit; | 135 code |= kCodeBracketBit | kCodeBracketCloseBit; |
135 break; | 136 break; |
136 case ']': | 137 case ']': |
137 ASSERT(seen == 0); | 138 DCHECK_EQ(seen, 0); |
138 seen |= kSawBracket; | 139 seen |= kSawBracket; |
139 code |= | 140 code |= |
140 kCodeBracketBit | kCodeSquareBracketBit | kCodeBracketCloseBit; | 141 kCodeBracketBit | kCodeSquareBracketBit | kCodeBracketCloseBit; |
141 break; | 142 break; |
142 case 'i': | 143 case 'i': |
143 ASSERT(seen == 0); // brackets can't be inherited | 144 DCHECK_EQ(seen, 0); // brackets can't be inherited |
144 seen |= kSawSpecial; | 145 seen |= kSawSpecial; |
145 code |= kCodeSpecialInherited; | 146 code |= kCodeSpecialInherited; |
146 break; | 147 break; |
147 case 'c': | 148 case 'c': |
148 ASSERT((seen & ~kSawBracket) == 0); | 149 DCHECK_EQ((seen & ~kSawBracket), 0); |
149 seen |= kSawSpecial; | 150 seen |= kSawSpecial; |
150 code |= kCodeSpecialCommon; | 151 code |= kCodeSpecialCommon; |
151 break; | 152 break; |
152 case 'l': | 153 case 'l': |
153 ASSERT((seen & kSawLatin) == 0); | 154 DCHECK_EQ((seen & kSawLatin), 0); |
154 ASSERT(current_shift < 3); | 155 DCHECK_LT(current_shift, 3); |
155 seen |= kSawLatin; | 156 seen |= kSawLatin; |
156 list |= kLatin << (2 * current_shift++); | 157 list |= kLatin << (2 * current_shift++); |
157 break; | 158 break; |
158 case 'h': | 159 case 'h': |
159 ASSERT((seen & kSawHan) == 0); | 160 DCHECK_EQ((seen & kSawHan), 0); |
160 ASSERT(current_shift < 3); | 161 DCHECK_LT(current_shift, 3); |
161 seen |= kSawHan; | 162 seen |= kSawHan; |
162 list |= kHan << (2 * current_shift++); | 163 list |= kHan << (2 * current_shift++); |
163 break; | 164 break; |
164 case 'g': | 165 case 'g': |
165 ASSERT((seen & kSawGreek) == 0); | 166 DCHECK_EQ((seen & kSawGreek), 0); |
166 ASSERT(current_shift < 3); | 167 DCHECK_LT(current_shift, 3); |
167 seen |= kSawGreek; | 168 seen |= kSawGreek; |
168 list |= kGreek << (2 * current_shift++); | 169 list |= kGreek << (2 * current_shift++); |
169 break; | 170 break; |
170 case '>': | 171 case '>': |
171 ASSERT(seen != 0); | 172 DCHECK_NE(seen, 0); |
172 code |= TableLookup(list); | 173 code |= TableLookup(list); |
173 result.Append(static_cast<UChar>(kMockCharMin + code)); | 174 result.Append(static_cast<UChar>(kMockCharMin + code)); |
174 in_set = false; | 175 in_set = false; |
175 break; | 176 break; |
176 default: | 177 default: |
177 DLOG(ERROR) << "Illegal mock string set char: '" << c << "'"; | 178 DLOG(ERROR) << "Illegal mock string set char: '" << c << "'"; |
178 break; | 179 break; |
179 } | 180 } |
180 continue; | 181 continue; |
181 } | 182 } |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
326 } | 327 } |
327 ASSERT_EQ(expect.size(), run_count); | 328 ASSERT_EQ(expect.size(), run_count); |
328 } | 329 } |
329 }; | 330 }; |
330 | 331 |
331 TEST_F(ScriptRunIteratorTest, Empty) { | 332 TEST_F(ScriptRunIteratorTest, Empty) { |
332 String empty(g_empty_string16_bit); | 333 String empty(g_empty_string16_bit); |
333 ScriptRunIterator script_run_iterator(empty.Characters16(), empty.length()); | 334 ScriptRunIterator script_run_iterator(empty.Characters16(), empty.length()); |
334 unsigned limit = 0; | 335 unsigned limit = 0; |
335 UScriptCode code = USCRIPT_INVALID_CODE; | 336 UScriptCode code = USCRIPT_INVALID_CODE; |
336 ASSERT(!script_run_iterator.Consume(limit, code)); | 337 DCHECK(!script_run_iterator.Consume(limit, code)); |
337 ASSERT_EQ(limit, 0u); | 338 ASSERT_EQ(limit, 0u); |
338 ASSERT_EQ(code, USCRIPT_INVALID_CODE); | 339 ASSERT_EQ(code, USCRIPT_INVALID_CODE); |
339 } | 340 } |
340 | 341 |
341 // Some of our compilers cannot initialize a vector from an array yet. | 342 // Some of our compilers cannot initialize a vector from an array yet. |
342 #define DECLARE_RUNSVECTOR(...) \ | 343 #define DECLARE_RUNSVECTOR(...) \ |
343 static const TestRun kRunsArray[] = __VA_ARGS__; \ | 344 static const TestRun kRunsArray[] = __VA_ARGS__; \ |
344 Vector<TestRun> runs; \ | 345 Vector<TestRun> runs; \ |
345 runs.Append(kRunsArray, sizeof(kRunsArray) / sizeof(*kRunsArray)); | 346 runs.Append(kRunsArray, sizeof(kRunsArray) / sizeof(*kRunsArray)); |
346 | 347 |
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
679 } | 680 } |
680 } | 681 } |
681 } | 682 } |
682 | 683 |
683 // ZWJ is \u200D Cf (Format, other) and its script is inherited. I'm going to | 684 // ZWJ is \u200D Cf (Format, other) and its script is inherited. I'm going to |
684 // ignore this for now, as I think it shouldn't matter which run it ends up | 685 // ignore this for now, as I think it shouldn't matter which run it ends up |
685 // in. HarfBuzz needs to be able to use it as context and shape each | 686 // in. HarfBuzz needs to be able to use it as context and shape each |
686 // neighboring character appropriately no matter what run it got assigned to. | 687 // neighboring character appropriately no matter what run it got assigned to. |
687 | 688 |
688 } // namespace blink | 689 } // namespace blink |
OLD | NEW |