OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
4 * (C) 2000 Dirk Mueller (mueller@kde.org) | 4 * (C) 2000 Dirk Mueller (mueller@kde.org) |
5 * Copyright (C) 2003, 2006, 2010, 2011 Apple Inc. All rights reserved. | 5 * Copyright (C) 2003, 2006, 2010, 2011 Apple Inc. All rights reserved. |
6 * Copyright (c) 2007, 2008, 2010 Google Inc. All rights reserved. | 6 * Copyright (c) 2007, 2008, 2010 Google Inc. All rights reserved. |
7 * | 7 * |
8 * This library is free software; you can redistribute it and/or | 8 * This library is free software; you can redistribute it and/or |
9 * modify it under the terms of the GNU Library General Public | 9 * modify it under the terms of the GNU Library General Public |
10 * License as published by the Free Software Foundation; either | 10 * License as published by the Free Software Foundation; either |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
80 { | 80 { |
81 m_fontDescription = other.m_fontDescription; | 81 m_fontDescription = other.m_fontDescription; |
82 m_fontFallbackList = other.m_fontFallbackList; | 82 m_fontFallbackList = other.m_fontFallbackList; |
83 m_canShapeWordByWord = other.m_canShapeWordByWord; | 83 m_canShapeWordByWord = other.m_canShapeWordByWord; |
84 m_shapeWordByWordComputed = other.m_shapeWordByWordComputed; | 84 m_shapeWordByWordComputed = other.m_shapeWordByWordComputed; |
85 return *this; | 85 return *this; |
86 } | 86 } |
87 | 87 |
88 bool Font::operator==(const Font& other) const | 88 bool Font::operator==(const Font& other) const |
89 { | 89 { |
90 FontSelector* first = m_fontFallbackList ? m_fontFallbackList->fontSelector(
) : 0; | 90 FontSelector* first = m_fontFallbackList ? m_fontFallbackList->getFontSelect
or() : 0; |
91 FontSelector* second = other.m_fontFallbackList ? other.m_fontFallbackList->
fontSelector() : 0; | 91 FontSelector* second = other.m_fontFallbackList ? other.m_fontFallbackList->
getFontSelector() : 0; |
92 | 92 |
93 return first == second | 93 return first == second |
94 && m_fontDescription == other.m_fontDescription | 94 && m_fontDescription == other.m_fontDescription |
95 && (m_fontFallbackList ? m_fontFallbackList->fontSelectorVersion() : 0)
== (other.m_fontFallbackList ? other.m_fontFallbackList->fontSelectorVersion() :
0) | 95 && (m_fontFallbackList ? m_fontFallbackList->fontSelectorVersion() : 0)
== (other.m_fontFallbackList ? other.m_fontFallbackList->fontSelectorVersion() :
0) |
96 && (m_fontFallbackList ? m_fontFallbackList->generation() : 0) == (other
.m_fontFallbackList ? other.m_fontFallbackList->generation() : 0); | 96 && (m_fontFallbackList ? m_fontFallbackList->generation() : 0) == (other
.m_fontFallbackList ? other.m_fontFallbackList->generation() : 0); |
97 } | 97 } |
98 | 98 |
99 void Font::update(PassRefPtrWillBeRawPtr<FontSelector> fontSelector) const | 99 void Font::update(PassRefPtrWillBeRawPtr<FontSelector> fontSelector) const |
100 { | 100 { |
101 // FIXME: It is pretty crazy that we are willing to just poke into a RefPtr,
but it ends up | 101 // FIXME: It is pretty crazy that we are willing to just poke into a RefPtr,
but it ends up |
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
311 | 311 |
312 const uint16_t* glyphs = m_buffer.glyphs(start); | 312 const uint16_t* glyphs = m_buffer.glyphs(start); |
313 const float* offsets = m_buffer.offsets(start); | 313 const float* offsets = m_buffer.offsets(start); |
314 std::copy(glyphs, glyphs + count, buffer.glyphs); | 314 std::copy(glyphs, glyphs + count, buffer.glyphs); |
315 | 315 |
316 if (m_rotation == NoRotation) { | 316 if (m_rotation == NoRotation) { |
317 std::copy(offsets, offsets + (m_hasVerticalOffsets ? 2 * count : cou
nt), buffer.pos); | 317 std::copy(offsets, offsets + (m_hasVerticalOffsets ? 2 * count : cou
nt), buffer.pos); |
318 } else { | 318 } else { |
319 ASSERT(m_hasVerticalOffsets); | 319 ASSERT(m_hasVerticalOffsets); |
320 | 320 |
321 const float verticalBaselineXOffset = fontData->fontMetrics().floatA
scent() | 321 const float verticalBaselineXOffset = fontData->getFontMetrics().flo
atAscent() |
322 - fontData->fontMetrics().floatAscent(IdeographicBaseline); | 322 - fontData->getFontMetrics().floatAscent(IdeographicBaseline); |
323 | 323 |
324 // TODO(fmalita): why don't we apply this adjustment when building t
he glyph buffer? | 324 // TODO(fmalita): why don't we apply this adjustment when building t
he glyph buffer? |
325 for (unsigned i = 0; i < 2 * count; i += 2) { | 325 for (unsigned i = 0; i < 2 * count; i += 2) { |
326 buffer.pos[i] = SkFloatToScalar(offsets[i] + verticalBaselineXOf
fset); | 326 buffer.pos[i] = SkFloatToScalar(offsets[i] + verticalBaselineXOf
fset); |
327 buffer.pos[i + 1] = SkFloatToScalar(offsets[i + 1]); | 327 buffer.pos[i + 1] = SkFloatToScalar(offsets[i + 1]); |
328 } | 328 } |
329 } | 329 } |
330 } | 330 } |
331 | 331 |
332 const GlyphBuffer& m_buffer; | 332 const GlyphBuffer& m_buffer; |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
395 | 395 |
396 if (codePath(runInfo) != ComplexPath) | 396 if (codePath(runInfo) != ComplexPath) |
397 return pixelSnappedSelectionRect(selectionRectForSimpleText(run, point,
h, from, to, accountForGlyphBounds)); | 397 return pixelSnappedSelectionRect(selectionRectForSimpleText(run, point,
h, from, to, accountForGlyphBounds)); |
398 return pixelSnappedSelectionRect(selectionRectForComplexText(run, point, h,
from, to)); | 398 return pixelSnappedSelectionRect(selectionRectForComplexText(run, point, h,
from, to)); |
399 } | 399 } |
400 | 400 |
401 int Font::offsetForPosition(const TextRun& run, float x, bool includePartialGlyp
hs) const | 401 int Font::offsetForPosition(const TextRun& run, float x, bool includePartialGlyp
hs) const |
402 { | 402 { |
403 FontCachePurgePreventer purgePreventer; | 403 FontCachePurgePreventer purgePreventer; |
404 | 404 |
405 if (codePath(TextRunPaintInfo(run)) != ComplexPath && !fontDescription().get
TypesettingFeatures()) | 405 if (codePath(TextRunPaintInfo(run)) != ComplexPath && !getFontDescription().
getTypesettingFeatures()) |
406 return offsetForPositionForSimpleText(run, x, includePartialGlyphs); | 406 return offsetForPositionForSimpleText(run, x, includePartialGlyphs); |
407 | 407 |
408 return offsetForPositionForComplexText(run, x, includePartialGlyphs); | 408 return offsetForPositionForComplexText(run, x, includePartialGlyphs); |
409 } | 409 } |
410 | 410 |
411 CodePath Font::codePath(const TextRunPaintInfo& runInfo) const | 411 CodePath Font::codePath(const TextRunPaintInfo& runInfo) const |
412 { | 412 { |
413 // TODO(eae): Disable the always use complex text feature on Android for now as | 413 // TODO(eae): Disable the always use complex text feature on Android for now as |
414 // it caused a memory regression for webview. crbug.com/577306 | 414 // it caused a memory regression for webview. crbug.com/577306 |
415 #if !OS(ANDROID) | 415 #if !OS(ANDROID) |
416 if (RuntimeEnabledFeatures::alwaysUseComplexTextEnabled() | 416 if (RuntimeEnabledFeatures::alwaysUseComplexTextEnabled() |
417 || LayoutTestSupport::alwaysUseComplexTextForTest()) { | 417 || LayoutTestSupport::alwaysUseComplexTextForTest()) { |
418 return ComplexPath; | 418 return ComplexPath; |
419 } | 419 } |
420 #endif | 420 #endif |
421 | 421 |
422 const TextRun& run = runInfo.run; | 422 const TextRun& run = runInfo.run; |
423 | 423 |
424 if (fontDescription().getTypesettingFeatures() && (runInfo.from || runInfo.t
o != run.length())) | 424 if (getFontDescription().getTypesettingFeatures() && (runInfo.from || runInf
o.to != run.length())) |
425 return ComplexPath; | 425 return ComplexPath; |
426 | 426 |
427 if (m_fontDescription.featureSettings() && m_fontDescription.featureSettings
()->size() > 0) | 427 if (m_fontDescription.featureSettings() && m_fontDescription.featureSettings
()->size() > 0) |
428 return ComplexPath; | 428 return ComplexPath; |
429 | 429 |
430 if (m_fontDescription.isVerticalBaseline()) | 430 if (m_fontDescription.isVerticalBaseline()) |
431 return ComplexPath; | 431 return ComplexPath; |
432 | 432 |
433 if (m_fontDescription.widthVariant() != RegularWidth) | 433 if (m_fontDescription.widthVariant() != RegularWidth) |
434 return ComplexPath; | 434 return ComplexPath; |
435 | 435 |
436 if (run.length() > 1 && fontDescription().getTypesettingFeatures()) | 436 if (run.length() > 1 && getFontDescription().getTypesettingFeatures()) |
437 return ComplexPath; | 437 return ComplexPath; |
438 | 438 |
439 // FIXME: This really shouldn't be needed but for some reason the | 439 // FIXME: This really shouldn't be needed but for some reason the |
440 // TextRendering setting doesn't propagate to typesettingFeatures in time | 440 // TextRendering setting doesn't propagate to typesettingFeatures in time |
441 // for the prefs width calculation. | 441 // for the prefs width calculation. |
442 if (fontDescription().textRendering() == OptimizeLegibility || fontDescripti
on().textRendering() == GeometricPrecision) | 442 if (getFontDescription().textRendering() == OptimizeLegibility || getFontDes
cription().textRendering() == GeometricPrecision) |
443 return ComplexPath; | 443 return ComplexPath; |
444 | 444 |
445 if (run.is8Bit()) | 445 if (run.is8Bit()) |
446 return SimplePath; | 446 return SimplePath; |
447 | 447 |
448 // Start from 0 since drawing and highlighting also measure the characters b
efore run->from. | 448 // Start from 0 since drawing and highlighting also measure the characters b
efore run->from. |
449 return Character::characterRangeCodePath(run.characters16(), run.length()); | 449 return Character::characterRangeCodePath(run.characters16(), run.length()); |
450 } | 450 } |
451 | 451 |
452 bool Font::canShapeWordByWord() const | 452 bool Font::canShapeWordByWord() const |
453 { | 453 { |
454 if (!m_shapeWordByWordComputed) { | 454 if (!m_shapeWordByWordComputed) { |
455 m_canShapeWordByWord = computeCanShapeWordByWord(); | 455 m_canShapeWordByWord = computeCanShapeWordByWord(); |
456 m_shapeWordByWordComputed = true; | 456 m_shapeWordByWordComputed = true; |
457 } | 457 } |
458 return m_canShapeWordByWord; | 458 return m_canShapeWordByWord; |
459 }; | 459 }; |
460 | 460 |
461 bool Font::computeCanShapeWordByWord() const | 461 bool Font::computeCanShapeWordByWord() const |
462 { | 462 { |
463 if (!fontDescription().getTypesettingFeatures()) | 463 if (!getFontDescription().getTypesettingFeatures()) |
464 return true; | 464 return true; |
465 | 465 |
466 const FontPlatformData& platformData = primaryFont()->platformData(); | 466 const FontPlatformData& platformData = primaryFont()->platformData(); |
467 TypesettingFeatures features = fontDescription().getTypesettingFeatures(); | 467 TypesettingFeatures features = getFontDescription().getTypesettingFeatures()
; |
468 return !platformData.hasSpaceInLigaturesOrKerning(features); | 468 return !platformData.hasSpaceInLigaturesOrKerning(features); |
469 }; | 469 }; |
470 | 470 |
471 void Font::willUseFontData(UChar32 character) const | 471 void Font::willUseFontData(UChar32 character) const |
472 { | 472 { |
473 const FontFamily& family = fontDescription().family(); | 473 const FontFamily& family = getFontDescription().family(); |
474 if (m_fontFallbackList && m_fontFallbackList->fontSelector() && !family.fami
lyIsEmpty()) | 474 if (m_fontFallbackList && m_fontFallbackList->getFontSelector() && !family.f
amilyIsEmpty()) |
475 m_fontFallbackList->fontSelector()->willUseFontData(fontDescription(), f
amily.family(), character); | 475 m_fontFallbackList->getFontSelector()->willUseFontData(getFontDescriptio
n(), family.family(), character); |
476 } | 476 } |
477 | 477 |
478 static inline GlyphData glyphDataForNonCJKCharacterWithGlyphOrientation(UChar32
character, bool isUpright, GlyphData& data, unsigned pageNumber) | 478 static inline GlyphData glyphDataForNonCJKCharacterWithGlyphOrientation(UChar32
character, bool isUpright, GlyphData& data, unsigned pageNumber) |
479 { | 479 { |
480 if (isUpright) { | 480 if (isUpright) { |
481 RefPtr<SimpleFontData> uprightFontData = data.fontData->uprightOrientati
onFontData(); | 481 RefPtr<SimpleFontData> uprightFontData = data.fontData->uprightOrientati
onFontData(); |
482 GlyphPageTreeNode* uprightNode = GlyphPageTreeNode::getNormalRootChild(u
prightFontData.get(), pageNumber); | 482 GlyphPageTreeNode* uprightNode = GlyphPageTreeNode::getNormalRootChild(u
prightFontData.get(), pageNumber); |
483 GlyphPage* uprightPage = uprightNode->page(); | 483 GlyphPage* uprightPage = uprightNode->page(); |
484 if (uprightPage) { | 484 if (uprightPage) { |
485 GlyphData uprightData = uprightPage->glyphDataForCharacter(character
); | 485 GlyphData uprightData = uprightPage->glyphDataForCharacter(character
); |
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
686 | 686 |
687 GlyphData markGlyphData; | 687 GlyphData markGlyphData; |
688 if (!getEmphasisMarkGlyphData(mark, markGlyphData)) | 688 if (!getEmphasisMarkGlyphData(mark, markGlyphData)) |
689 return 0; | 689 return 0; |
690 | 690 |
691 const SimpleFontData* markFontData = markGlyphData.fontData; | 691 const SimpleFontData* markFontData = markGlyphData.fontData; |
692 ASSERT(markFontData); | 692 ASSERT(markFontData); |
693 if (!markFontData) | 693 if (!markFontData) |
694 return 0; | 694 return 0; |
695 | 695 |
696 return markFontData->fontMetrics().ascent(); | 696 return markFontData->getFontMetrics().ascent(); |
697 } | 697 } |
698 | 698 |
699 int Font::emphasisMarkDescent(const AtomicString& mark) const | 699 int Font::emphasisMarkDescent(const AtomicString& mark) const |
700 { | 700 { |
701 FontCachePurgePreventer purgePreventer; | 701 FontCachePurgePreventer purgePreventer; |
702 | 702 |
703 GlyphData markGlyphData; | 703 GlyphData markGlyphData; |
704 if (!getEmphasisMarkGlyphData(mark, markGlyphData)) | 704 if (!getEmphasisMarkGlyphData(mark, markGlyphData)) |
705 return 0; | 705 return 0; |
706 | 706 |
707 const SimpleFontData* markFontData = markGlyphData.fontData; | 707 const SimpleFontData* markFontData = markGlyphData.fontData; |
708 ASSERT(markFontData); | 708 ASSERT(markFontData); |
709 if (!markFontData) | 709 if (!markFontData) |
710 return 0; | 710 return 0; |
711 | 711 |
712 return markFontData->fontMetrics().descent(); | 712 return markFontData->getFontMetrics().descent(); |
713 } | 713 } |
714 | 714 |
715 int Font::emphasisMarkHeight(const AtomicString& mark) const | 715 int Font::emphasisMarkHeight(const AtomicString& mark) const |
716 { | 716 { |
717 FontCachePurgePreventer purgePreventer; | 717 FontCachePurgePreventer purgePreventer; |
718 | 718 |
719 GlyphData markGlyphData; | 719 GlyphData markGlyphData; |
720 if (!getEmphasisMarkGlyphData(mark, markGlyphData)) | 720 if (!getEmphasisMarkGlyphData(mark, markGlyphData)) |
721 return 0; | 721 return 0; |
722 | 722 |
723 const SimpleFontData* markFontData = markGlyphData.fontData; | 723 const SimpleFontData* markFontData = markGlyphData.fontData; |
724 ASSERT(markFontData); | 724 ASSERT(markFontData); |
725 if (!markFontData) | 725 if (!markFontData) |
726 return 0; | 726 return 0; |
727 | 727 |
728 return markFontData->fontMetrics().height(); | 728 return markFontData->getFontMetrics().height(); |
729 } | 729 } |
730 | 730 |
731 float Font::floatWidthForComplexText(const TextRun& run, HashSet<const SimpleFon
tData*>* fallbackFonts, FloatRect* glyphBounds) const | 731 float Font::floatWidthForComplexText(const TextRun& run, HashSet<const SimpleFon
tData*>* fallbackFonts, FloatRect* glyphBounds) const |
732 { | 732 { |
733 CachingWordShaper shaper(m_fontFallbackList->shapeCache(m_fontDescription)); | 733 CachingWordShaper shaper(m_fontFallbackList->shapeCache(m_fontDescription)); |
734 float width = shaper.width(this, run, fallbackFonts, glyphBounds); | 734 float width = shaper.width(this, run, fallbackFonts, glyphBounds); |
735 return width; | 735 return width; |
736 } | 736 } |
737 | 737 |
738 // Return the code point index for the given |x| offset into the text run. | 738 // Return the code point index for the given |x| offset into the text run. |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
829 { | 829 { |
830 return m_fontFallbackList && m_fontFallbackList->loadingCustomFonts(); | 830 return m_fontFallbackList && m_fontFallbackList->loadingCustomFonts(); |
831 } | 831 } |
832 | 832 |
833 bool Font::isFallbackValid() const | 833 bool Font::isFallbackValid() const |
834 { | 834 { |
835 return !m_fontFallbackList || m_fontFallbackList->isValid(); | 835 return !m_fontFallbackList || m_fontFallbackList->isValid(); |
836 } | 836 } |
837 | 837 |
838 } // namespace blink | 838 } // namespace blink |
OLD | NEW |