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 |