| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2012 Google Inc. All rights reserved. | 2 * Copyright (c) 2012 Google Inc. All rights reserved. |
| 3 * Copyright (C) 2013 BlackBerry Limited. All rights reserved. | 3 * Copyright (C) 2013 BlackBerry Limited. All rights reserved. |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions are | 6 * modification, are permitted provided that the following conditions are |
| 7 * met: | 7 * met: |
| 8 * | 8 * |
| 9 * * Redistributions of source code must retain the above copyright | 9 * * Redistributions of source code must retain the above copyright |
| 10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
| (...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 352 bool error = false; | 352 bool error = false; |
| 353 const UChar* source; | 353 const UChar* source; |
| 354 String stringFor8BitRun; | 354 String stringFor8BitRun; |
| 355 if (run.is8Bit()) { | 355 if (run.is8Bit()) { |
| 356 stringFor8BitRun = String::make16BitFrom8BitSource(run.characters8(), ru
n.length()); | 356 stringFor8BitRun = String::make16BitFrom8BitSource(run.characters8(), ru
n.length()); |
| 357 source = stringFor8BitRun.characters16(); | 357 source = stringFor8BitRun.characters16(); |
| 358 } else { | 358 } else { |
| 359 source = run.characters16(); | 359 source = run.characters16(); |
| 360 } | 360 } |
| 361 | 361 |
| 362 // Convert to NFC form if the text has diacritical marks. In most of the fon
t, OTF rules |
| 363 // for diacritical marks are missing. Using ICU calls to convert to final fo
rm and then pass |
| 364 // updated Unicode string to Harfbuzz. |
| 365 icu::UnicodeString normalizedString; |
| 366 UErrorCode errorICU = U_ZERO_ERROR; |
| 367 bool isDiacriticalMarkPresent = false; |
| 368 |
| 362 *destinationLength = 0; | 369 *destinationLength = 0; |
| 363 while (position < length) { | 370 while (position < length) { |
| 364 UChar32 character; | 371 UChar32 character; |
| 365 U16_NEXT(source, position, length, character); | 372 U16_NEXT(source, position, length, character); |
| 366 // Don't normalize tabs as they are not treated as spaces for word-end. | 373 // Don't normalize tabs as they are not treated as spaces for word-end. |
| 367 if (run.normalizeSpace() && Character::isNormalizedCanvasSpaceCharacter(
character)) | 374 if (run.normalizeSpace() && Character::isNormalizedCanvasSpaceCharacter(
character)) { |
| 368 character = spaceCharacter; | 375 character = spaceCharacter; |
| 369 else if (Character::treatAsSpace(character) && character != tabulationCh
aracter) | 376 } else if (Character::treatAsSpace(character) && character != tabulation
Character) { |
| 370 character = spaceCharacter; | 377 character = spaceCharacter; |
| 371 else if (Character::treatAsZeroWidthSpaceInComplexScript(character)) | 378 } else if (Character::treatAsZeroWidthSpaceInComplexScript(character)) { |
| 372 character = zeroWidthSpaceCharacter; | 379 character = zeroWidthSpaceCharacter; |
| 380 } else if (!isDiacriticalMarkPresent && ::ublock_getCode(character) == U
BLOCK_COMBINING_DIACRITICAL_MARKS) { |
| 381 isDiacriticalMarkPresent = true; |
| 382 icu::Normalizer::normalize(icu::UnicodeString(source, length), UNORM
_NFC, 0 , normalizedString, errorICU); |
| 383 if (U_FAILURE(errorICU)) { |
| 384 normalizedString.remove(); |
| 385 } else if (!normalizedString.isEmpty()) { |
| 386 *destinationLength = 0; |
| 387 position = 0; |
| 388 length = static_cast<int>(normalizedString.length()); |
| 389 source = normalizedString.getBuffer(); |
| 390 continue; |
| 391 } |
| 392 } |
| 373 | 393 |
| 374 U16_APPEND(destination, *destinationLength, length, character, error); | 394 U16_APPEND(destination, *destinationLength, length, character, error); |
| 375 ASSERT_UNUSED(error, !error); | 395 ASSERT_UNUSED(error, !error); |
| 376 } | 396 } |
| 377 } | 397 } |
| 378 | 398 |
| 379 HarfBuzzShaper::HarfBuzzShaper(const Font* font, const TextRun& run, const Glyph
Data* emphasisData, | 399 HarfBuzzShaper::HarfBuzzShaper(const Font* font, const TextRun& run, const Glyph
Data* emphasisData, |
| 380 HashSet<const SimpleFontData*>* fallbackFonts, FloatRect* bounds) | 400 HashSet<const SimpleFontData*>* fallbackFonts, FloatRect* bounds) |
| 381 : Shaper(font, run, emphasisData, fallbackFonts, bounds) | 401 : Shaper(font, run, emphasisData, fallbackFonts, bounds) |
| 382 , m_normalizedBufferLength(0) | 402 , m_normalizedBufferLength(0) |
| (...skipping 824 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1207 // possibly invalid from, to arguments. | 1227 // possibly invalid from, to arguments. |
| 1208 if (!foundToX && !foundFromX) | 1228 if (!foundToX && !foundFromX) |
| 1209 fromX = toX = 0; | 1229 fromX = toX = 0; |
| 1210 | 1230 |
| 1211 if (fromX < toX) | 1231 if (fromX < toX) |
| 1212 return FloatRect(point.x() + fromX, point.y(), toX - fromX, height); | 1232 return FloatRect(point.x() + fromX, point.y(), toX - fromX, height); |
| 1213 return FloatRect(point.x() + toX, point.y(), fromX - toX, height); | 1233 return FloatRect(point.x() + toX, point.y(), fromX - toX, height); |
| 1214 } | 1234 } |
| 1215 | 1235 |
| 1216 } // namespace blink | 1236 } // namespace blink |
| OLD | NEW |