Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2005, 2008, 2010 Apple Inc. All rights reserved. | 2 * Copyright (C) 2005, 2008, 2010 Apple Inc. All rights reserved. |
| 3 * Copyright (C) 2006 Alexey Proskuryakov | 3 * Copyright (C) 2006 Alexey Proskuryakov |
| 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 | 6 * modification, are permitted provided that the following conditions |
| 7 * are met: | 7 * are met: |
| 8 * | 8 * |
| 9 * 1. Redistributions of source code must retain the above copyright | 9 * 1. 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 434 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 445 | 445 |
| 446 m_platformData.setupPaint(&paint); | 446 m_platformData.setupPaint(&paint); |
| 447 | 447 |
| 448 paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding); | 448 paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding); |
| 449 SkScalar width = paint.measureText(&glyph, 2); | 449 SkScalar width = paint.measureText(&glyph, 2); |
| 450 if (!paint.isSubpixelText()) | 450 if (!paint.isSubpixelText()) |
| 451 width = SkScalarRoundToInt(width); | 451 width = SkScalarRoundToInt(width); |
| 452 return SkScalarToFloat(width); | 452 return SkScalarToFloat(width); |
| 453 } | 453 } |
| 454 | 454 |
| 455 bool SimpleFontData::canRenderCombiningCharacterSequence(const UChar* characters , size_t length) const | |
| 456 { | |
| 457 if (!m_combiningCharacterSequenceSupport) | |
|
eae
2015/10/14 08:12:00
This also means we can remove m_combiningCharacter
| |
| 458 m_combiningCharacterSequenceSupport = adoptPtr(new HashMap<String, bool> ); | |
| 459 | |
| 460 WTF::HashMap<String, bool>::AddResult addResult = m_combiningCharacterSequen ceSupport->add(String(characters, length), false); | |
| 461 if (!addResult.isNewEntry) | |
| 462 return addResult.storedValue->value; | |
| 463 | |
| 464 UErrorCode error = U_ZERO_ERROR; | |
| 465 Vector<UChar, 4> normalizedCharacters(length); | |
| 466 size_t normalizedLength = unorm_normalize(characters, length, UNORM_NFC, UNO RM_UNICODE_3_2, &normalizedCharacters[0], length, &error); | |
| 467 // Can't render if we have an error or no composition occurred. | |
| 468 if (U_FAILURE(error) || normalizedLength == length) | |
| 469 return false; | |
| 470 | |
| 471 for (size_t offset = 0; offset < normalizedLength;) { | |
| 472 UChar32 character; | |
| 473 U16_NEXT(normalizedCharacters, offset, normalizedLength, character); | |
| 474 if (!glyphForCharacter(character)) | |
| 475 return false; | |
| 476 } | |
| 477 | |
| 478 addResult.storedValue->value = true; | |
| 479 return true; | |
| 480 } | |
| 481 | |
| 482 bool SimpleFontData::fillGlyphPage(GlyphPage* pageToFill, unsigned offset, unsig ned length, UChar* buffer, unsigned bufferLength) const | 455 bool SimpleFontData::fillGlyphPage(GlyphPage* pageToFill, unsigned offset, unsig ned length, UChar* buffer, unsigned bufferLength) const |
| 483 { | 456 { |
| 484 if (SkUTF16_IsHighSurrogate(buffer[bufferLength-1])) { | 457 if (SkUTF16_IsHighSurrogate(buffer[bufferLength-1])) { |
| 485 SkDebugf("%s last char is high-surrogate", __FUNCTION__); | 458 SkDebugf("%s last char is high-surrogate", __FUNCTION__); |
| 486 return false; | 459 return false; |
| 487 } | 460 } |
| 488 | 461 |
| 489 SkTypeface* typeface = platformData().typeface(); | 462 SkTypeface* typeface = platformData().typeface(); |
| 490 if (!typeface) { | 463 if (!typeface) { |
| 491 WTF_LOG_ERROR("fillGlyphPage called on an empty Skia typeface."); | 464 WTF_LOG_ERROR("fillGlyphPage called on an empty Skia typeface."); |
| 492 return false; | 465 return false; |
| 493 } | 466 } |
| 494 | 467 |
| 495 SkAutoSTMalloc<GlyphPage::size, uint16_t> glyphStorage(length); | 468 SkAutoSTMalloc<GlyphPage::size, uint16_t> glyphStorage(length); |
| 496 uint16_t* glyphs = glyphStorage.get(); | 469 uint16_t* glyphs = glyphStorage.get(); |
| 497 typeface->charsToGlyphs(buffer, SkTypeface::kUTF16_Encoding, glyphs, length) ; | 470 typeface->charsToGlyphs(buffer, SkTypeface::kUTF16_Encoding, glyphs, length) ; |
| 498 | 471 |
| 499 bool haveGlyphs = false; | 472 bool haveGlyphs = false; |
| 500 for (unsigned i = 0; i < length; i++) { | 473 for (unsigned i = 0; i < length; i++) { |
| 501 if (glyphs[i]) { | 474 if (glyphs[i]) { |
| 502 pageToFill->setGlyphDataForIndex(offset + i, glyphs[i], this); | 475 pageToFill->setGlyphDataForIndex(offset + i, glyphs[i], this); |
| 503 haveGlyphs = true; | 476 haveGlyphs = true; |
| 504 } | 477 } |
| 505 } | 478 } |
| 506 | 479 |
| 507 return haveGlyphs; | 480 return haveGlyphs; |
| 508 } | 481 } |
| 509 | 482 |
| 510 } // namespace blink | 483 } // namespace blink |
| OLD | NEW |