| 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 |