Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1097)

Unified Diff: third_party/WebKit/Source/platform/fonts/shaping/SimpleShaper.cpp

Issue 1479003002: Remove Simple Text Path (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebased Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/platform/fonts/shaping/SimpleShaper.cpp
diff --git a/third_party/WebKit/Source/platform/fonts/shaping/SimpleShaper.cpp b/third_party/WebKit/Source/platform/fonts/shaping/SimpleShaper.cpp
deleted file mode 100644
index 5d32c5421a53cec6a162d42b829072bab128da9c..0000000000000000000000000000000000000000
--- a/third_party/WebKit/Source/platform/fonts/shaping/SimpleShaper.cpp
+++ /dev/null
@@ -1,254 +0,0 @@
-/*
- * Copyright (C) 2003, 2006, 2008, 2009, 2010, 2011 Apple Inc. All rights
- * reserved.
- * Copyright (C) 2008 Holger Hans Peter Freyther
- * Copyright (C) 2014 Google Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB. If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- *
- */
-
-#include "platform/fonts/shaping/SimpleShaper.h"
-
-#include "platform/fonts/Font.h"
-#include "platform/fonts/GlyphBuffer.h"
-#include "platform/fonts/Latin1TextIterator.h"
-#include "platform/fonts/SimpleFontData.h"
-#include "platform/fonts/UTF16TextIterator.h"
-#include "platform/text/Character.h"
-#include "wtf/MathExtras.h"
-#include "wtf/text/CharacterNames.h"
-
-using namespace WTF;
-using namespace Unicode;
-
-namespace blink {
-
-SimpleShaper::SimpleShaper(const Font* font,
- const TextRun& run,
- const GlyphData* emphasisData,
- HashSet<const SimpleFontData*>* fallbackFonts,
- FloatRect* bounds)
- : Shaper(font, run, emphasisData, fallbackFonts, bounds),
- m_currentCharacter(0),
- m_runWidthSoFar(0) {
- // If the padding is non-zero, count the number of spaces in the run
- // and divide that by the padding for per space addition.
- m_expansion = m_textRun.expansion();
- if (!m_expansion) {
- m_expansionPerOpportunity = 0;
- } else {
- bool isAfterExpansion = m_isAfterExpansion;
- unsigned expansionOpportunityCount =
- m_textRun.is8Bit() ? Character::expansionOpportunityCount(
- m_textRun.characters8(), m_textRun.length(),
- m_textRun.direction(), isAfterExpansion,
- m_textRun.getTextJustify())
- : Character::expansionOpportunityCount(
- m_textRun.characters16(), m_textRun.length(),
- m_textRun.direction(), isAfterExpansion,
- m_textRun.getTextJustify());
- if (isAfterExpansion && !m_textRun.allowsTrailingExpansion())
- expansionOpportunityCount--;
-
- if (!expansionOpportunityCount)
- m_expansionPerOpportunity = 0;
- else
- m_expansionPerOpportunity = m_expansion / expansionOpportunityCount;
- }
-}
-
-GlyphData SimpleShaper::glyphDataForCharacter(CharacterData& charData,
- bool normalizeSpace) {
- ASSERT(m_font);
- return m_font->glyphDataForCharacter(charData.character, m_textRun.rtl(),
- normalizeSpace);
-}
-
-float SimpleShaper::characterWidth(UChar32 character,
- const GlyphData& glyphData) const {
- const SimpleFontData* fontData = glyphData.fontData;
- ASSERT(fontData);
-
- if (UNLIKELY(character == tabulationCharacter && m_textRun.allowTabs()))
- return m_font->tabWidth(fontData, m_textRun.getTabSize(),
- m_textRun.xPos() + m_runWidthSoFar);
-
- float width = fontData->widthForGlyph(glyphData.glyph);
-
- // SVG uses horizontalGlyphStretch(), when textLength is used to
- // stretch/squeeze text.
- if (UNLIKELY(m_textRun.horizontalGlyphStretch() != 1))
- width *= m_textRun.horizontalGlyphStretch();
-
- return width;
-}
-
-float SimpleShaper::adjustSpacing(float width, const CharacterData& charData) {
- // Account for letter-spacing.
- if (width)
- width += m_font->getFontDescription().letterSpacing();
-
- bool isExpansionOpportunity =
- Character::treatAsSpace(charData.character) ||
- (m_textRun.getTextJustify() == TextJustifyDistribute);
- if (isExpansionOpportunity ||
- (m_textRun.getTextJustify() == TextJustifyAuto &&
- Character::isCJKIdeographOrSymbol(charData.character))) {
- // Distribute the run's total expansion evenly over all expansion
- // opportunities in the run.
- if (m_expansion) {
- if (!isExpansionOpportunity && !m_isAfterExpansion) {
- // Take the expansion opportunity before this ideograph.
- m_expansion -= m_expansionPerOpportunity;
- m_runWidthSoFar += m_expansionPerOpportunity;
- }
- if (m_textRun.allowsTrailingExpansion() ||
- (m_textRun.ltr() &&
- charData.characterOffset + charData.clusterLength <
- m_textRun.length()) ||
- (m_textRun.rtl() && charData.characterOffset)) {
- m_expansion -= m_expansionPerOpportunity;
- width += m_expansionPerOpportunity;
- m_isAfterExpansion = true;
- }
- } else {
- m_isAfterExpansion = false;
- }
-
- // Account for word spacing.
- // We apply additional space between "words" by adding width to the space
- // character.
- if (isExpansionOpportunity &&
- (charData.character != tabulationCharacter || !m_textRun.allowTabs()) &&
- (charData.characterOffset ||
- charData.character == noBreakSpaceCharacter) &&
- m_font->getFontDescription().wordSpacing()) {
- width += m_font->getFontDescription().wordSpacing();
- }
- } else {
- m_isAfterExpansion = false;
- }
-
- return width;
-}
-
-template <typename TextIterator>
-unsigned SimpleShaper::advanceInternal(TextIterator& textIterator,
- GlyphBuffer* glyphBuffer) {
- bool hasExtraSpacing =
- (m_font->getFontDescription().letterSpacing() ||
- m_font->getFontDescription().wordSpacing() || m_expansion) &&
- !m_textRun.spacingDisabled();
-
- const SimpleFontData* lastFontData = m_font->primaryFont();
- bool normalizeSpace = m_textRun.normalizeSpace();
- const float initialRunWidth = m_runWidthSoFar;
-
- CharacterData charData;
- while (textIterator.consume(charData.character)) {
- charData.characterOffset = textIterator.offset();
- charData.clusterLength = textIterator.glyphLength();
- GlyphData glyphData = glyphDataForCharacter(charData, normalizeSpace);
-
- // Some fonts do not have a glyph for zero-width-space,
- // in that case use the space character and override the width.
- float width;
- bool spaceUsedAsZeroWidthSpace = false;
- if (!glyphData.glyph &&
- Character::treatAsZeroWidthSpace(charData.character)) {
- charData.character = spaceCharacter;
- glyphData = glyphDataForCharacter(charData);
- width = 0;
- spaceUsedAsZeroWidthSpace = true;
- } else {
- width = characterWidth(charData.character, glyphData);
- }
-
- Glyph glyph = glyphData.glyph;
- const SimpleFontData* fontData = glyphData.fontData;
- ASSERT(fontData);
-
- if (m_fallbackFonts && lastFontData != fontData && width) {
- lastFontData = fontData;
- trackNonPrimaryFallbackFont(fontData);
- }
-
- if (hasExtraSpacing && !spaceUsedAsZeroWidthSpace)
- width = adjustSpacing(width, charData);
-
- if (m_glyphBoundingBox) {
- ASSERT(glyphData.fontData);
- FloatRect glyphBounds =
- glyphData.fontData->boundsForGlyph(glyphData.glyph);
- // We are handling simple text run here, so Y-Offset will be zero.
- // FIXME: Computing bounds relative to the initial advance seems odd. Are
- // we adjusting these someplace else? If not, we'll end up with different
- // bounds depending on how we segment our advance() calls.
- glyphBounds.move(m_runWidthSoFar - initialRunWidth, 0);
- m_glyphBoundingBox->unite(glyphBounds);
- }
-
- if (glyphBuffer) {
- if (!forTextEmphasis()) {
- glyphBuffer->add(glyph, fontData, m_runWidthSoFar);
- } else if (Character::canReceiveTextEmphasis(charData.character)) {
- addEmphasisMark(glyphBuffer, m_runWidthSoFar + width / 2);
- }
- }
-
- // Advance past the character we just dealt with.
- textIterator.advance();
- m_runWidthSoFar += width;
- }
-
- unsigned consumedCharacters = textIterator.offset() - m_currentCharacter;
- m_currentCharacter = textIterator.offset();
-
- return consumedCharacters;
-}
-
-unsigned SimpleShaper::advance(int offset, GlyphBuffer* glyphBuffer) {
- int length = m_textRun.length();
-
- if (offset > length)
- offset = length;
-
- if (m_currentCharacter >= static_cast<unsigned>(offset))
- return 0;
-
- if (m_textRun.is8Bit()) {
- Latin1TextIterator textIterator(m_textRun.data8(m_currentCharacter),
- m_currentCharacter, offset);
- return advanceInternal(textIterator, glyphBuffer);
- }
-
- UTF16TextIterator textIterator(m_textRun.data16(m_currentCharacter),
- m_currentCharacter, offset, length);
- return advanceInternal(textIterator, glyphBuffer);
-}
-
-bool SimpleShaper::advanceOneCharacter(float& width) {
- float initialWidth = m_runWidthSoFar;
-
- if (!advance(m_currentCharacter + 1))
- return false;
-
- width = m_runWidthSoFar - initialWidth;
- return true;
-}
-
-} // namespace blink
« no previous file with comments | « third_party/WebKit/Source/platform/fonts/shaping/SimpleShaper.h ('k') | third_party/WebKit/Source/platform/text/Character.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698