| 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 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 102 // rectified by using RefPtrs for Fonts themselves. | 102 // rectified by using RefPtrs for Fonts themselves. |
| 103 if (!m_fontFallbackList) | 103 if (!m_fontFallbackList) |
| 104 m_fontFallbackList = FontFallbackList::create(); | 104 m_fontFallbackList = FontFallbackList::create(); |
| 105 m_fontFallbackList->invalidate(fontSelector); | 105 m_fontFallbackList->invalidate(fontSelector); |
| 106 } | 106 } |
| 107 | 107 |
| 108 float Font::buildGlyphBuffer(const TextRunPaintInfo& runInfo, | 108 float Font::buildGlyphBuffer(const TextRunPaintInfo& runInfo, |
| 109 GlyphBuffer& glyphBuffer, | 109 GlyphBuffer& glyphBuffer, |
| 110 const GlyphData* emphasisData) const { | 110 const GlyphData* emphasisData) const { |
| 111 float width; | 111 float width; |
| 112 CachingWordShaper shaper(m_fontFallbackList->shapeCache(m_fontDescription)); | 112 CachingWordShaper shaper(*this); |
| 113 if (emphasisData) { | 113 if (emphasisData) { |
| 114 width = shaper.fillGlyphBufferForTextEmphasis(this, runInfo.run, | 114 width = shaper.fillGlyphBufferForTextEmphasis(runInfo.run, |
| 115 emphasisData, &glyphBuffer, | 115 emphasisData, &glyphBuffer, |
| 116 runInfo.from, runInfo.to); | 116 runInfo.from, runInfo.to); |
| 117 } else { | 117 } else { |
| 118 width = shaper.fillGlyphBuffer(this, runInfo.run, nullptr, &glyphBuffer, | 118 width = shaper.fillGlyphBuffer(runInfo.run, &glyphBuffer, |
| 119 runInfo.from, runInfo.to); | 119 runInfo.from, runInfo.to); |
| 120 } | 120 } |
| 121 return width; | 121 return width; |
| 122 } | 122 } |
| 123 | 123 |
| 124 bool Font::drawText(PaintCanvas* canvas, | 124 bool Font::drawText(PaintCanvas* canvas, |
| 125 const TextRunPaintInfo& runInfo, | 125 const TextRunPaintInfo& runInfo, |
| 126 const FloatPoint& point, | 126 const FloatPoint& point, |
| 127 float deviceScaleFactor, | 127 float deviceScaleFactor, |
| 128 const PaintFlags& flags) const { | 128 const PaintFlags& flags) const { |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 217 if (glyphBuffer.isEmpty()) | 217 if (glyphBuffer.isEmpty()) |
| 218 return; | 218 return; |
| 219 | 219 |
| 220 drawGlyphBuffer(canvas, flags, glyphBuffer, point, deviceScaleFactor); | 220 drawGlyphBuffer(canvas, flags, glyphBuffer, point, deviceScaleFactor); |
| 221 } | 221 } |
| 222 | 222 |
| 223 float Font::width(const TextRun& run, | 223 float Font::width(const TextRun& run, |
| 224 HashSet<const SimpleFontData*>* fallbackFonts, | 224 HashSet<const SimpleFontData*>* fallbackFonts, |
| 225 FloatRect* glyphBounds) const { | 225 FloatRect* glyphBounds) const { |
| 226 FontCachePurgePreventer purgePreventer; | 226 FontCachePurgePreventer purgePreventer; |
| 227 CachingWordShaper shaper(m_fontFallbackList->shapeCache(m_fontDescription)); | 227 CachingWordShaper shaper(*this); |
| 228 float width = shaper.width(this, run, fallbackFonts, glyphBounds); | 228 return shaper.width(run, fallbackFonts, glyphBounds); |
| 229 return width; | |
| 230 } | 229 } |
| 231 | 230 |
| 232 namespace { | 231 namespace { |
| 233 | 232 |
| 234 enum BlobRotation { | 233 enum BlobRotation { |
| 235 NoRotation, | 234 NoRotation, |
| 236 CCWRotation, | 235 CCWRotation, |
| 237 }; | 236 }; |
| 238 | 237 |
| 239 class GlyphBufferBloberizer { | 238 class GlyphBufferBloberizer { |
| (...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 431 int to, | 430 int to, |
| 432 bool accountForGlyphBounds) const { | 431 bool accountForGlyphBounds) const { |
| 433 to = (to == -1 ? run.length() : to); | 432 to = (to == -1 ? run.length() : to); |
| 434 | 433 |
| 435 TextRunPaintInfo runInfo(run); | 434 TextRunPaintInfo runInfo(run); |
| 436 runInfo.from = from; | 435 runInfo.from = from; |
| 437 runInfo.to = to; | 436 runInfo.to = to; |
| 438 | 437 |
| 439 FontCachePurgePreventer purgePreventer; | 438 FontCachePurgePreventer purgePreventer; |
| 440 | 439 |
| 441 CachingWordShaper shaper(m_fontFallbackList->shapeCache(m_fontDescription)); | 440 CachingWordShaper shaper(*this); |
| 442 CharacterRange range = shaper.getCharacterRange(this, run, from, to); | 441 CharacterRange range = shaper.getCharacterRange(run, from, to); |
| 443 | 442 |
| 444 return pixelSnappedSelectionRect( | 443 return pixelSnappedSelectionRect( |
| 445 FloatRect(point.x() + range.start, point.y(), range.width(), height)); | 444 FloatRect(point.x() + range.start, point.y(), range.width(), height)); |
| 446 } | 445 } |
| 447 | 446 |
| 448 int Font::offsetForPosition(const TextRun& run, | 447 int Font::offsetForPosition(const TextRun& run, |
| 449 float xFloat, | 448 float xFloat, |
| 450 bool includePartialGlyphs) const { | 449 bool includePartialGlyphs) const { |
| 451 FontCachePurgePreventer purgePreventer; | 450 FontCachePurgePreventer purgePreventer; |
| 452 CachingWordShaper shaper(m_fontFallbackList->shapeCache(m_fontDescription)); | 451 CachingWordShaper shaper(*this); |
| 453 return shaper.offsetForPosition(this, run, xFloat, includePartialGlyphs); | 452 return shaper.offsetForPosition(run, xFloat, includePartialGlyphs); |
| 454 } | 453 } |
| 455 | 454 |
| 456 ShapeCache* Font::shapeCache() const { | 455 ShapeCache* Font::shapeCache() const { |
| 457 return m_fontFallbackList->shapeCache(m_fontDescription); | 456 return m_fontFallbackList->shapeCache(m_fontDescription); |
| 458 } | 457 } |
| 459 | 458 |
| 460 bool Font::canShapeWordByWord() const { | 459 bool Font::canShapeWordByWord() const { |
| 461 if (!m_shapeWordByWordComputed) { | 460 if (!m_shapeWordByWordComputed) { |
| 462 m_canShapeWordByWord = computeCanShapeWordByWord(); | 461 m_canShapeWordByWord = computeCanShapeWordByWord(); |
| 463 m_shapeWordByWordComputed = true; | 462 m_shapeWordByWordComputed = true; |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 554 if (!markFontData) | 553 if (!markFontData) |
| 555 return 0; | 554 return 0; |
| 556 | 555 |
| 557 return markFontData->getFontMetrics().height(); | 556 return markFontData->getFontMetrics().height(); |
| 558 } | 557 } |
| 559 | 558 |
| 560 CharacterRange Font::getCharacterRange(const TextRun& run, | 559 CharacterRange Font::getCharacterRange(const TextRun& run, |
| 561 unsigned from, | 560 unsigned from, |
| 562 unsigned to) const { | 561 unsigned to) const { |
| 563 FontCachePurgePreventer purgePreventer; | 562 FontCachePurgePreventer purgePreventer; |
| 564 CachingWordShaper shaper(m_fontFallbackList->shapeCache(m_fontDescription)); | 563 CachingWordShaper shaper(*this); |
| 565 return shaper.getCharacterRange(this, run, from, to); | 564 return shaper.getCharacterRange(run, from, to); |
| 566 } | 565 } |
| 567 | 566 |
| 568 Vector<CharacterRange> Font::individualCharacterRanges( | 567 Vector<CharacterRange> Font::individualCharacterRanges( |
| 569 const TextRun& run) const { | 568 const TextRun& run) const { |
| 570 FontCachePurgePreventer purgePreventer; | 569 FontCachePurgePreventer purgePreventer; |
| 571 CachingWordShaper shaper(m_fontFallbackList->shapeCache(m_fontDescription)); | 570 CachingWordShaper shaper(*this); |
| 572 auto ranges = shaper.individualCharacterRanges(this, run); | 571 auto ranges = shaper.individualCharacterRanges(run); |
| 573 // The shaper should return ranges.size == run.length but on some platforms | 572 // The shaper should return ranges.size == run.length but on some platforms |
| 574 // (OSX10.9.5) we are seeing cases in the upper end of the unicode range | 573 // (OSX10.9.5) we are seeing cases in the upper end of the unicode range |
| 575 // where this is not true (see: crbug.com/620952). To catch these cases on | 574 // where this is not true (see: crbug.com/620952). To catch these cases on |
| 576 // more popular platforms, and to protect users, we are using a CHECK here. | 575 // more popular platforms, and to protect users, we are using a CHECK here. |
| 577 CHECK_EQ(ranges.size(), run.length()); | 576 CHECK_EQ(ranges.size(), run.length()); |
| 578 return ranges; | 577 return ranges; |
| 579 } | 578 } |
| 580 | 579 |
| 581 bool Font::loadingCustomFonts() const { | 580 bool Font::loadingCustomFonts() const { |
| 582 return m_fontFallbackList && m_fontFallbackList->loadingCustomFonts(); | 581 return m_fontFallbackList && m_fontFallbackList->loadingCustomFonts(); |
| 583 } | 582 } |
| 584 | 583 |
| 585 bool Font::isFallbackValid() const { | 584 bool Font::isFallbackValid() const { |
| 586 return !m_fontFallbackList || m_fontFallbackList->isValid(); | 585 return !m_fontFallbackList || m_fontFallbackList->isValid(); |
| 587 } | 586 } |
| 588 | 587 |
| 589 } // namespace blink | 588 } // namespace blink |
| OLD | NEW |