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

Side by Side Diff: Source/platform/fonts/WidthIterator.cpp

Issue 255323004: Rendering text-justify:distribute for 8 bit characters. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Using 2 bits for enum Created 6 years, 4 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2003, 2006, 2008, 2009, 2010, 2011 Apple Inc. All rights reserv ed. 2 * Copyright (C) 2003, 2006, 2008, 2009, 2010, 2011 Apple Inc. All rights reserv ed.
3 * Copyright (C) 2008 Holger Hans Peter Freyther 3 * Copyright (C) 2008 Holger Hans Peter Freyther
4 * Copyright (C) 2014 Google Inc. All rights reserved. 4 * Copyright (C) 2014 Google Inc. All rights reserved.
5 * 5 *
6 * This library is free software; you can redistribute it and/or 6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public 7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either 8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version. 9 * version 2 of the License, or (at your option) any later version.
10 * 10 *
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
52 , m_accountForGlyphBounds(accountForGlyphBounds) 52 , m_accountForGlyphBounds(accountForGlyphBounds)
53 , m_forTextEmphasis(forTextEmphasis) 53 , m_forTextEmphasis(forTextEmphasis)
54 { 54 {
55 // If the padding is non-zero, count the number of spaces in the run 55 // If the padding is non-zero, count the number of spaces in the run
56 // and divide that by the padding for per space addition. 56 // and divide that by the padding for per space addition.
57 m_expansion = m_run.expansion(); 57 m_expansion = m_run.expansion();
58 if (!m_expansion) 58 if (!m_expansion)
59 m_expansionPerOpportunity = 0; 59 m_expansionPerOpportunity = 0;
60 else { 60 else {
61 bool isAfterExpansion = m_isAfterExpansion; 61 bool isAfterExpansion = m_isAfterExpansion;
62 unsigned expansionOpportunityCount = m_run.is8Bit() ? Character::expansi onOpportunityCount(m_run.characters8(), m_run.length(), m_run.direction(), isAft erExpansion) : Character::expansionOpportunityCount(m_run.characters16(), m_run. length(), m_run.direction(), isAfterExpansion); 62 unsigned expansionOpportunityCount = m_run.is8Bit() ? Character::expansi onOpportunityCount(m_run.characters8(), m_run.length(), m_run.direction(), isAft erExpansion, m_run.textJustify()) : Character::expansionOpportunityCount(m_run.c haracters16(), m_run.length(), m_run.direction(), isAfterExpansion, m_run.textJu stify());
63 if (isAfterExpansion && !m_run.allowsTrailingExpansion()) 63 if (isAfterExpansion && !m_run.allowsTrailingExpansion())
64 expansionOpportunityCount--; 64 expansionOpportunityCount--;
65 65
66 if (!expansionOpportunityCount) 66 if (!expansionOpportunityCount)
67 m_expansionPerOpportunity = 0; 67 m_expansionPerOpportunity = 0;
68 else 68 else
69 m_expansionPerOpportunity = m_expansion / expansionOpportunityCount; 69 m_expansionPerOpportunity = m_expansion / expansionOpportunityCount;
70 } 70 }
71 } 71 }
72 72
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
121 } 121 }
122 122
123 float WidthIterator::adjustSpacing(float width, const CharacterData& charData, 123 float WidthIterator::adjustSpacing(float width, const CharacterData& charData,
124 const SimpleFontData& fontData, GlyphBuffer* glyphBuffer) 124 const SimpleFontData& fontData, GlyphBuffer* glyphBuffer)
125 { 125 {
126 // Account for letter-spacing. 126 // Account for letter-spacing.
127 if (width) 127 if (width)
128 width += m_font->fontDescription().letterSpacing(); 128 width += m_font->fontDescription().letterSpacing();
129 129
130 static bool expandAroundIdeographs = FontPlatformFeatures::canExpandAroundId eographsInComplexText(); 130 static bool expandAroundIdeographs = FontPlatformFeatures::canExpandAroundId eographsInComplexText();
131 bool treatAsSpace = Character::treatAsSpace(charData.character); 131 bool isExpansionOpportunity = Character::treatAsSpace(charData.character) || (m_run.textJustify() == JustifyDistribute);
132 if (treatAsSpace || (expandAroundIdeographs && Character::isCJKIdeographOrSy mbol(charData.character))) { 132 if (isExpansionOpportunity || (expandAroundIdeographs && Character::isCJKIde ographOrSymbol(charData.character))) {
133
133 // Distribute the run's total expansion evenly over all expansion opport unities in the run. 134 // Distribute the run's total expansion evenly over all expansion opport unities in the run.
134 if (m_expansion) { 135 if (m_expansion) {
135 if (!treatAsSpace && !m_isAfterExpansion) { 136 if (!isExpansionOpportunity && !m_isAfterExpansion) {
136 // Take the expansion opportunity before this ideograph. 137 // Take the expansion opportunity before this ideograph.
137 m_expansion -= m_expansionPerOpportunity; 138 m_expansion -= m_expansionPerOpportunity;
138 float expansionAtThisOpportunity = m_expansionPerOpportunity; 139 float expansionAtThisOpportunity = m_expansionPerOpportunity;
139 m_runWidthSoFar += expansionAtThisOpportunity; 140 m_runWidthSoFar += expansionAtThisOpportunity;
140 if (glyphBuffer) { 141 if (glyphBuffer) {
141 if (glyphBuffer->isEmpty()) { 142 if (glyphBuffer->isEmpty()) {
142 if (m_forTextEmphasis) 143 if (m_forTextEmphasis)
143 glyphBuffer->add(fontData.zeroWidthSpaceGlyph(), &fo ntData, m_expansionPerOpportunity); 144 glyphBuffer->add(fontData.zeroWidthSpaceGlyph(), &fo ntData, m_expansionPerOpportunity);
144 else 145 else
145 glyphBuffer->add(fontData.spaceGlyph(), &fontData, e xpansionAtThisOpportunity); 146 glyphBuffer->add(fontData.spaceGlyph(), &fontData, e xpansionAtThisOpportunity);
146 } else { 147 } else {
147 glyphBuffer->expandLastAdvance(expansionAtThisOpportunit y); 148 glyphBuffer->expandLastAdvance(expansionAtThisOpportunit y);
148 } 149 }
149 } 150 }
150 } 151 }
151 if (m_run.allowsTrailingExpansion() 152 if (m_run.allowsTrailingExpansion()
152 || (m_run.ltr() && charData.characterOffset + charData.clusterLe ngth < static_cast<size_t>(m_run.length())) 153 || (m_run.ltr() && charData.characterOffset + charData.clusterLe ngth < static_cast<size_t>(m_run.length()))
153 || (m_run.rtl() && charData.characterOffset)) { 154 || (m_run.rtl() && charData.characterOffset)) {
154 m_expansion -= m_expansionPerOpportunity; 155 m_expansion -= m_expansionPerOpportunity;
155 width += m_expansionPerOpportunity; 156 width += m_expansionPerOpportunity;
156 m_isAfterExpansion = true; 157 m_isAfterExpansion = true;
157 } 158 }
158 } else { 159 } else {
159 m_isAfterExpansion = false; 160 m_isAfterExpansion = false;
160 } 161 }
161 162
162 // Account for word spacing. 163 // Account for word spacing.
163 // We apply additional space between "words" by adding width to the spac e character. 164 // We apply additional space between "words" by adding width to the spac e character.
164 if (treatAsSpace && (charData.character != '\t' || !m_run.allowTabs()) 165 if (isExpansionOpportunity && (charData.character != '\t' || !m_run.allo wTabs())
165 && (charData.characterOffset || charData.character == noBreakSpace) 166 && (charData.characterOffset || charData.character == noBreakSpace)
166 && m_font->fontDescription().wordSpacing()) { 167 && m_font->fontDescription().wordSpacing()) {
167 width += m_font->fontDescription().wordSpacing(); 168 width += m_font->fontDescription().wordSpacing();
168 } 169 }
169 } else { 170 } else {
170 m_isAfterExpansion = false; 171 m_isAfterExpansion = false;
171 } 172 }
172 173
173 return width; 174 return width;
174 } 175 }
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
258 float initialWidth = m_runWidthSoFar; 259 float initialWidth = m_runWidthSoFar;
259 260
260 if (!advance(m_currentCharacter + 1)) 261 if (!advance(m_currentCharacter + 1))
261 return false; 262 return false;
262 263
263 width = m_runWidthSoFar - initialWidth; 264 width = m_runWidthSoFar - initialWidth;
264 return true; 265 return true;
265 } 266 }
266 267
267 } 268 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698