| 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 15 matching lines...) Expand all Loading... |
| 26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | 26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
| 27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 28 */ | 28 */ |
| 29 | 29 |
| 30 #include "platform/fonts/SimpleFontData.h" | 30 #include "platform/fonts/SimpleFontData.h" |
| 31 | 31 |
| 32 #include "SkPath.h" | 32 #include "SkPath.h" |
| 33 #include "SkTypeface.h" | 33 #include "SkTypeface.h" |
| 34 #include "SkTypes.h" | 34 #include "SkTypes.h" |
| 35 #include "platform/fonts/FontDescription.h" | 35 #include "platform/fonts/FontDescription.h" |
| 36 #include "platform/fonts/GlyphPage.h" | |
| 37 #include "platform/fonts/VDMXParser.h" | 36 #include "platform/fonts/VDMXParser.h" |
| 38 #include "platform/fonts/skia/SkiaTextMetrics.h" | 37 #include "platform/fonts/skia/SkiaTextMetrics.h" |
| 39 #include "platform/geometry/FloatRect.h" | 38 #include "platform/geometry/FloatRect.h" |
| 40 #include "wtf/MathExtras.h" | 39 #include "wtf/MathExtras.h" |
| 41 #include "wtf/PtrUtil.h" | 40 #include "wtf/PtrUtil.h" |
| 42 #include "wtf/allocator/Partitions.h" | 41 #include "wtf/allocator/Partitions.h" |
| 43 #include "wtf/text/CharacterNames.h" | 42 #include "wtf/text/CharacterNames.h" |
| 44 #include "wtf/text/Unicode.h" | 43 #include "wtf/text/Unicode.h" |
| 45 #include <memory> | 44 #include <memory> |
| 46 #include <unicode/unorm.h> | 45 #include <unicode/unorm.h> |
| (...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 280 m_spaceGlyph = glyphForCharacter(' '); | 279 m_spaceGlyph = glyphForCharacter(' '); |
| 281 float width = widthForGlyph(m_spaceGlyph); | 280 float width = widthForGlyph(m_spaceGlyph); |
| 282 m_spaceWidth = width; | 281 m_spaceWidth = width; |
| 283 m_zeroGlyph = glyphForCharacter('0'); | 282 m_zeroGlyph = glyphForCharacter('0'); |
| 284 m_fontMetrics.setZeroWidth(widthForGlyph(m_zeroGlyph)); | 283 m_fontMetrics.setZeroWidth(widthForGlyph(m_zeroGlyph)); |
| 285 | 284 |
| 286 m_missingGlyphData.fontData = this; | 285 m_missingGlyphData.fontData = this; |
| 287 m_missingGlyphData.glyph = 0; | 286 m_missingGlyphData.glyph = 0; |
| 288 } | 287 } |
| 289 | 288 |
| 290 SimpleFontData::~SimpleFontData() { | |
| 291 if (isCustomFont()) | |
| 292 GlyphPageTreeNode::pruneTreeCustomFontData(this); | |
| 293 else | |
| 294 GlyphPageTreeNode::pruneTreeFontData(this); | |
| 295 } | |
| 296 | |
| 297 const SimpleFontData* SimpleFontData::fontDataForCharacter(UChar32) const { | 289 const SimpleFontData* SimpleFontData::fontDataForCharacter(UChar32) const { |
| 298 return this; | 290 return this; |
| 299 } | 291 } |
| 300 | 292 |
| 301 Glyph SimpleFontData::glyphForCharacter(UChar32 codepoint) const { | 293 Glyph SimpleFontData::glyphForCharacter(UChar32 codepoint) const { |
| 302 uint16_t glyph; | 294 uint16_t glyph; |
| 303 SkTypeface* typeface = platformData().typeface(); | 295 SkTypeface* typeface = platformData().typeface(); |
| 304 RELEASE_ASSERT(typeface); | 296 RELEASE_ASSERT(typeface); |
| 305 typeface->charsToGlyphs(&codepoint, SkTypeface::kUTF32_Encoding, &glyph, 1); | 297 typeface->charsToGlyphs(&codepoint, SkTypeface::kUTF32_Encoding, &glyph, 1); |
| 306 return glyph; | 298 return glyph; |
| 307 } | 299 } |
| 308 | 300 |
| 309 bool SimpleFontData::isSegmented() const { | 301 bool SimpleFontData::isSegmented() const { |
| 310 return false; | 302 return false; |
| 311 } | 303 } |
| 312 | 304 |
| 313 PassRefPtr<SimpleFontData> SimpleFontData::verticalRightOrientationFontData() | 305 PassRefPtr<SimpleFontData> SimpleFontData::verticalRightOrientationFontData() |
| 314 const { | 306 const { |
| 315 if (!m_derivedFontData) | 307 if (!m_derivedFontData) |
| 316 m_derivedFontData = DerivedFontData::create(isCustomFont()); | 308 m_derivedFontData = DerivedFontData::create(); |
| 317 if (!m_derivedFontData->verticalRightOrientation) { | 309 if (!m_derivedFontData->verticalRightOrientation) { |
| 318 FontPlatformData verticalRightPlatformData(m_platformData); | 310 FontPlatformData verticalRightPlatformData(m_platformData); |
| 319 verticalRightPlatformData.setOrientation(FontOrientation::Horizontal); | 311 verticalRightPlatformData.setOrientation(FontOrientation::Horizontal); |
| 320 m_derivedFontData->verticalRightOrientation = | 312 m_derivedFontData->verticalRightOrientation = |
| 321 create(verticalRightPlatformData, | 313 create(verticalRightPlatformData, |
| 322 isCustomFont() ? CustomFontData::create() : nullptr, true); | 314 isCustomFont() ? CustomFontData::create() : nullptr, true); |
| 323 } | 315 } |
| 324 return m_derivedFontData->verticalRightOrientation; | 316 return m_derivedFontData->verticalRightOrientation; |
| 325 } | 317 } |
| 326 | 318 |
| 327 PassRefPtr<SimpleFontData> SimpleFontData::uprightOrientationFontData() const { | 319 PassRefPtr<SimpleFontData> SimpleFontData::uprightOrientationFontData() const { |
| 328 if (!m_derivedFontData) | 320 if (!m_derivedFontData) |
| 329 m_derivedFontData = DerivedFontData::create(isCustomFont()); | 321 m_derivedFontData = DerivedFontData::create(); |
| 330 if (!m_derivedFontData->uprightOrientation) | 322 if (!m_derivedFontData->uprightOrientation) |
| 331 m_derivedFontData->uprightOrientation = | 323 m_derivedFontData->uprightOrientation = |
| 332 create(m_platformData, | 324 create(m_platformData, |
| 333 isCustomFont() ? CustomFontData::create() : nullptr, true); | 325 isCustomFont() ? CustomFontData::create() : nullptr, true); |
| 334 return m_derivedFontData->uprightOrientation; | 326 return m_derivedFontData->uprightOrientation; |
| 335 } | 327 } |
| 336 | 328 |
| 337 PassRefPtr<SimpleFontData> SimpleFontData::smallCapsFontData( | 329 PassRefPtr<SimpleFontData> SimpleFontData::smallCapsFontData( |
| 338 const FontDescription& fontDescription) const { | 330 const FontDescription& fontDescription) const { |
| 339 if (!m_derivedFontData) | 331 if (!m_derivedFontData) |
| 340 m_derivedFontData = DerivedFontData::create(isCustomFont()); | 332 m_derivedFontData = DerivedFontData::create(); |
| 341 if (!m_derivedFontData->smallCaps) | 333 if (!m_derivedFontData->smallCaps) |
| 342 m_derivedFontData->smallCaps = | 334 m_derivedFontData->smallCaps = |
| 343 createScaledFontData(fontDescription, smallCapsFontSizeMultiplier); | 335 createScaledFontData(fontDescription, smallCapsFontSizeMultiplier); |
| 344 | 336 |
| 345 return m_derivedFontData->smallCaps; | 337 return m_derivedFontData->smallCaps; |
| 346 } | 338 } |
| 347 | 339 |
| 348 PassRefPtr<SimpleFontData> SimpleFontData::emphasisMarkFontData( | 340 PassRefPtr<SimpleFontData> SimpleFontData::emphasisMarkFontData( |
| 349 const FontDescription& fontDescription) const { | 341 const FontDescription& fontDescription) const { |
| 350 if (!m_derivedFontData) | 342 if (!m_derivedFontData) |
| 351 m_derivedFontData = DerivedFontData::create(isCustomFont()); | 343 m_derivedFontData = DerivedFontData::create(); |
| 352 if (!m_derivedFontData->emphasisMark) | 344 if (!m_derivedFontData->emphasisMark) |
| 353 m_derivedFontData->emphasisMark = | 345 m_derivedFontData->emphasisMark = |
| 354 createScaledFontData(fontDescription, emphasisMarkFontSizeMultiplier); | 346 createScaledFontData(fontDescription, emphasisMarkFontSizeMultiplier); |
| 355 | 347 |
| 356 return m_derivedFontData->emphasisMark; | 348 return m_derivedFontData->emphasisMark; |
| 357 } | 349 } |
| 358 | 350 |
| 359 bool SimpleFontData::isTextOrientationFallbackOf( | 351 bool SimpleFontData::isTextOrientationFallbackOf( |
| 360 const SimpleFontData* fontData) const { | 352 const SimpleFontData* fontData) const { |
| 361 if (!isTextOrientationFallback() || !fontData->m_derivedFontData) | 353 if (!isTextOrientationFallback() || !fontData->m_derivedFontData) |
| 362 return false; | 354 return false; |
| 363 return fontData->m_derivedFontData->uprightOrientation == this || | 355 return fontData->m_derivedFontData->uprightOrientation == this || |
| 364 fontData->m_derivedFontData->verticalRightOrientation == this; | 356 fontData->m_derivedFontData->verticalRightOrientation == this; |
| 365 } | 357 } |
| 366 | 358 |
| 367 std::unique_ptr<SimpleFontData::DerivedFontData> | 359 std::unique_ptr<SimpleFontData::DerivedFontData> |
| 368 SimpleFontData::DerivedFontData::create(bool forCustomFont) { | 360 SimpleFontData::DerivedFontData::create() { |
| 369 return wrapUnique(new DerivedFontData(forCustomFont)); | 361 return wrapUnique(new DerivedFontData()); |
| 370 } | |
| 371 | |
| 372 SimpleFontData::DerivedFontData::~DerivedFontData() { | |
| 373 if (!forCustomFont) | |
| 374 return; | |
| 375 | |
| 376 if (smallCaps) | |
| 377 GlyphPageTreeNode::pruneTreeCustomFontData(smallCaps.get()); | |
| 378 if (emphasisMark) | |
| 379 GlyphPageTreeNode::pruneTreeCustomFontData(emphasisMark.get()); | |
| 380 if (verticalRightOrientation) | |
| 381 GlyphPageTreeNode::pruneTreeCustomFontData(verticalRightOrientation.get()); | |
| 382 if (uprightOrientation) | |
| 383 GlyphPageTreeNode::pruneTreeCustomFontData(uprightOrientation.get()); | |
| 384 } | 362 } |
| 385 | 363 |
| 386 PassRefPtr<SimpleFontData> SimpleFontData::createScaledFontData( | 364 PassRefPtr<SimpleFontData> SimpleFontData::createScaledFontData( |
| 387 const FontDescription& fontDescription, | 365 const FontDescription& fontDescription, |
| 388 float scaleFactor) const { | 366 float scaleFactor) const { |
| 389 const float scaledSize = | 367 const float scaledSize = |
| 390 lroundf(fontDescription.computedSize() * scaleFactor); | 368 lroundf(fontDescription.computedSize() * scaleFactor); |
| 391 return SimpleFontData::create( | 369 return SimpleFontData::create( |
| 392 FontPlatformData(m_platformData, scaledSize), | 370 FontPlatformData(m_platformData, scaledSize), |
| 393 isCustomFont() ? CustomFontData::create() : nullptr); | 371 isCustomFont() ? CustomFontData::create() : nullptr); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 406 | 384 |
| 407 float SimpleFontData::platformWidthForGlyph(Glyph glyph) const { | 385 float SimpleFontData::platformWidthForGlyph(Glyph glyph) const { |
| 408 if (!m_platformData.size()) | 386 if (!m_platformData.size()) |
| 409 return 0; | 387 return 0; |
| 410 | 388 |
| 411 static_assert(sizeof(glyph) == 2, "Glyph id should not be truncated."); | 389 static_assert(sizeof(glyph) == 2, "Glyph id should not be truncated."); |
| 412 | 390 |
| 413 return SkiaTextMetrics(&m_paint).getSkiaWidthForGlyph(glyph); | 391 return SkiaTextMetrics(&m_paint).getSkiaWidthForGlyph(glyph); |
| 414 } | 392 } |
| 415 | 393 |
| 416 bool SimpleFontData::fillGlyphPage(GlyphPage* pageToFill, | |
| 417 unsigned offset, | |
| 418 unsigned length, | |
| 419 UChar* buffer, | |
| 420 unsigned bufferLength) const { | |
| 421 if (U16_IS_LEAD(buffer[bufferLength - 1])) { | |
| 422 DLOG(ERROR) << "Last UTF-16 code unit is high-surrogate."; | |
| 423 return false; | |
| 424 } | |
| 425 | |
| 426 SkTypeface* typeface = platformData().typeface(); | |
| 427 if (!typeface) { | |
| 428 DLOG(ERROR) << "fillGlyphPage called on an empty Skia typeface."; | |
| 429 return false; | |
| 430 } | |
| 431 | |
| 432 SkAutoSTMalloc<GlyphPage::size, uint16_t> glyphStorage(length); | |
| 433 uint16_t* glyphs = glyphStorage.get(); | |
| 434 typeface->charsToGlyphs(buffer, SkTypeface::kUTF16_Encoding, glyphs, length); | |
| 435 | |
| 436 bool haveGlyphs = false; | |
| 437 for (unsigned i = 0; i < length; i++) { | |
| 438 if (glyphs[i]) { | |
| 439 pageToFill->setGlyphDataForIndex(offset + i, glyphs[i], this); | |
| 440 haveGlyphs = true; | |
| 441 } | |
| 442 } | |
| 443 | |
| 444 return haveGlyphs; | |
| 445 } | |
| 446 | |
| 447 } // namespace blink | 394 } // namespace blink |
| OLD | NEW |