Chromium Code Reviews| 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, mockScriptData, | 33 DEFINE_THREAD_SAFE_STATIC_LOCAL(const MockScriptData, mockScriptData, |
| 34 (new MockScriptData())); | 34 (new MockScriptData())); |
| 35 | 35 |
| 36 return &mockScriptData; | 36 return &mockScriptData; |
| 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::BracketTypeClose: | 80 case PairedBracketType::BracketTypeClose: |
| 81 return ch - kBracketDelta; | 81 return ch - kBracketDelta; |
| 82 case PairedBracketType::BracketTypeOpen: | 82 case PairedBracketType::BracketTypeOpen: |
| 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(ch >= kMockCharMin && ch < kMockCharLimit); |
|
tkent
2017/04/09 23:13:23
Split this into two DCHECKs
Hwanseung Lee
2017/04/11 22:25:09
Done.
| |
| 91 int code = ch - kMockCharMin; | 91 int code = ch - kMockCharMin; |
| 92 if ((code & kCodeBracketBit) == 0) { | 92 if ((code & kCodeBracketBit) == 0) { |
| 93 return PairedBracketType::BracketTypeNone; | 93 return PairedBracketType::BracketTypeNone; |
| 94 } | 94 } |
| 95 if (code & kCodeBracketCloseBit) { | 95 if (code & kCodeBracketCloseBit) { |
| 96 return PairedBracketType::BracketTypeClose; | 96 return PairedBracketType::BracketTypeClose; |
| 97 } | 97 } |
| 98 return PairedBracketType::BracketTypeOpen; | 98 return PairedBracketType::BracketTypeOpen; |
| 99 } | 99 } |
| 100 | 100 |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 112 String result(emptyString16Bit); | 112 String result(emptyString16Bit); |
| 113 bool inSet = false; | 113 bool inSet = false; |
| 114 int seen = 0; | 114 int seen = 0; |
| 115 int code = 0; | 115 int code = 0; |
| 116 int list = 0; | 116 int list = 0; |
| 117 int currentShift = 0; | 117 int currentShift = 0; |
| 118 for (char c : input) { | 118 for (char c : input) { |
| 119 if (inSet) { | 119 if (inSet) { |
| 120 switch (c) { | 120 switch (c) { |
| 121 case '(': | 121 case '(': |
| 122 ASSERT(seen == 0); | 122 DCHECK_EQ(seen, 0); |
| 123 seen |= kSawBracket; | 123 seen |= kSawBracket; |
| 124 code |= kCodeBracketBit; | 124 code |= kCodeBracketBit; |
| 125 break; | 125 break; |
| 126 case '[': | 126 case '[': |
| 127 ASSERT(seen == 0); | 127 DCHECK_EQ(seen, 0); |
| 128 seen |= kSawBracket; | 128 seen |= kSawBracket; |
| 129 code |= kCodeBracketBit | kCodeSquareBracketBit; | 129 code |= kCodeBracketBit | kCodeSquareBracketBit; |
| 130 break; | 130 break; |
| 131 case ')': | 131 case ')': |
| 132 ASSERT(seen == 0); | 132 DCHECK_EQ(seen, 0); |
| 133 seen |= kSawBracket; | 133 seen |= kSawBracket; |
| 134 code |= kCodeBracketBit | kCodeBracketCloseBit; | 134 code |= kCodeBracketBit | kCodeBracketCloseBit; |
| 135 break; | 135 break; |
| 136 case ']': | 136 case ']': |
| 137 ASSERT(seen == 0); | 137 DCHECK_EQ(seen, 0); |
| 138 seen |= kSawBracket; | 138 seen |= kSawBracket; |
| 139 code |= | 139 code |= |
| 140 kCodeBracketBit | kCodeSquareBracketBit | kCodeBracketCloseBit; | 140 kCodeBracketBit | kCodeSquareBracketBit | kCodeBracketCloseBit; |
| 141 break; | 141 break; |
| 142 case 'i': | 142 case 'i': |
| 143 ASSERT(seen == 0); // brackets can't be inherited | 143 DCHECK_EQ(seen, 0); // brackets can't be inherited |
| 144 seen |= kSawSpecial; | 144 seen |= kSawSpecial; |
| 145 code |= kCodeSpecialInherited; | 145 code |= kCodeSpecialInherited; |
| 146 break; | 146 break; |
| 147 case 'c': | 147 case 'c': |
| 148 ASSERT((seen & ~kSawBracket) == 0); | 148 DCHECK_EQ((seen & ~kSawBracket), 0); |
| 149 seen |= kSawSpecial; | 149 seen |= kSawSpecial; |
| 150 code |= kCodeSpecialCommon; | 150 code |= kCodeSpecialCommon; |
| 151 break; | 151 break; |
| 152 case 'l': | 152 case 'l': |
| 153 ASSERT((seen & kSawLatin) == 0); | 153 DCHECK_EQ((seen & kSawLatin), 0); |
| 154 ASSERT(currentShift < 3); | 154 DCHECK_LT(currentShift, 3); |
| 155 seen |= kSawLatin; | 155 seen |= kSawLatin; |
| 156 list |= kLatin << (2 * currentShift++); | 156 list |= kLatin << (2 * currentShift++); |
| 157 break; | 157 break; |
| 158 case 'h': | 158 case 'h': |
| 159 ASSERT((seen & kSawHan) == 0); | 159 DCHECK_EQ((seen & kSawHan), 0); |
| 160 ASSERT(currentShift < 3); | 160 DCHECK_LT(currentShift, 3); |
| 161 seen |= kSawHan; | 161 seen |= kSawHan; |
| 162 list |= kHan << (2 * currentShift++); | 162 list |= kHan << (2 * currentShift++); |
| 163 break; | 163 break; |
| 164 case 'g': | 164 case 'g': |
| 165 ASSERT((seen & kSawGreek) == 0); | 165 DCHECK_EQ((seen & kSawGreek), 0); |
| 166 ASSERT(currentShift < 3); | 166 DCHECK_LT(currentShift, 3); |
| 167 seen |= kSawGreek; | 167 seen |= kSawGreek; |
| 168 list |= kGreek << (2 * currentShift++); | 168 list |= kGreek << (2 * currentShift++); |
| 169 break; | 169 break; |
| 170 case '>': | 170 case '>': |
| 171 ASSERT(seen != 0); | 171 DCHECK_NE(seen, 0); |
| 172 code |= TableLookup(list); | 172 code |= TableLookup(list); |
| 173 result.append(static_cast<UChar>(kMockCharMin + code)); | 173 result.append(static_cast<UChar>(kMockCharMin + code)); |
| 174 inSet = false; | 174 inSet = false; |
| 175 break; | 175 break; |
| 176 default: | 176 default: |
| 177 DLOG(ERROR) << "Illegal mock string set char: '" << c << "'"; | 177 DLOG(ERROR) << "Illegal mock string set char: '" << c << "'"; |
| 178 break; | 178 break; |
| 179 } | 179 } |
| 180 continue; | 180 continue; |
| 181 } | 181 } |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 326 } | 326 } |
| 327 ASSERT_EQ(expect.size(), runCount); | 327 ASSERT_EQ(expect.size(), runCount); |
| 328 } | 328 } |
| 329 }; | 329 }; |
| 330 | 330 |
| 331 TEST_F(ScriptRunIteratorTest, Empty) { | 331 TEST_F(ScriptRunIteratorTest, Empty) { |
| 332 String empty(emptyString16Bit); | 332 String empty(emptyString16Bit); |
| 333 ScriptRunIterator scriptRunIterator(empty.characters16(), empty.length()); | 333 ScriptRunIterator scriptRunIterator(empty.characters16(), empty.length()); |
| 334 unsigned limit = 0; | 334 unsigned limit = 0; |
| 335 UScriptCode code = USCRIPT_INVALID_CODE; | 335 UScriptCode code = USCRIPT_INVALID_CODE; |
| 336 ASSERT(!scriptRunIterator.consume(limit, code)); | 336 DCHECK(!scriptRunIterator.consume(limit, code)); |
| 337 ASSERT_EQ(limit, 0u); | 337 ASSERT_EQ(limit, 0u); |
| 338 ASSERT_EQ(code, USCRIPT_INVALID_CODE); | 338 ASSERT_EQ(code, USCRIPT_INVALID_CODE); |
| 339 } | 339 } |
| 340 | 340 |
| 341 // Some of our compilers cannot initialize a vector from an array yet. | 341 // Some of our compilers cannot initialize a vector from an array yet. |
| 342 #define DECLARE_RUNSVECTOR(...) \ | 342 #define DECLARE_RUNSVECTOR(...) \ |
| 343 static const TestRun runsArray[] = __VA_ARGS__; \ | 343 static const TestRun runsArray[] = __VA_ARGS__; \ |
| 344 Vector<TestRun> runs; \ | 344 Vector<TestRun> runs; \ |
| 345 runs.append(runsArray, sizeof(runsArray) / sizeof(*runsArray)); | 345 runs.append(runsArray, sizeof(runsArray) / sizeof(*runsArray)); |
| 346 | 346 |
| (...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 679 } | 679 } |
| 680 } | 680 } |
| 681 } | 681 } |
| 682 | 682 |
| 683 // ZWJ is \u200D Cf (Format, other) and its script is inherited. I'm going to | 683 // 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 | 684 // 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 | 685 // 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. | 686 // neighboring character appropriately no matter what run it got assigned to. |
| 687 | 687 |
| 688 } // namespace blink | 688 } // namespace blink |
| OLD | NEW |