OLD | NEW |
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 * | 4 * |
5 * This library is free software; you can redistribute it and/or | 5 * This library is free software; you can redistribute it and/or |
6 * modify it under the terms of the GNU Library General Public | 6 * modify it under the terms of the GNU Library General Public |
7 * License as published by the Free Software Foundation; either | 7 * License as published by the Free Software Foundation; either |
8 * version 2 of the License, or (at your option) any later version. | 8 * version 2 of the License, or (at your option) any later version. |
9 * | 9 * |
10 * This library is distributed in the hope that it will be useful, | 10 * This library is distributed in the hope that it will be useful, |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
44 , m_isAfterExpansion(!run.allowsLeadingExpansion()) | 44 , m_isAfterExpansion(!run.allowsLeadingExpansion()) |
45 , m_finalRoundingWidth(0) | 45 , m_finalRoundingWidth(0) |
46 , m_typesettingFeatures(font->fontDescription().typesettingFeatures()) | 46 , m_typesettingFeatures(font->fontDescription().typesettingFeatures()) |
47 , m_fallbackFonts(fallbackFonts) | 47 , m_fallbackFonts(fallbackFonts) |
48 , m_accountForGlyphBounds(accountForGlyphBounds) | 48 , m_accountForGlyphBounds(accountForGlyphBounds) |
49 , m_maxGlyphBoundingBoxY(numeric_limits<float>::min()) | 49 , m_maxGlyphBoundingBoxY(numeric_limits<float>::min()) |
50 , m_minGlyphBoundingBoxY(numeric_limits<float>::max()) | 50 , m_minGlyphBoundingBoxY(numeric_limits<float>::max()) |
51 , m_firstGlyphOverflow(0) | 51 , m_firstGlyphOverflow(0) |
52 , m_lastGlyphOverflow(0) | 52 , m_lastGlyphOverflow(0) |
53 , m_forTextEmphasis(forTextEmphasis) | 53 , m_forTextEmphasis(forTextEmphasis) |
| 54 , m_distributeJustification(false) |
54 { | 55 { |
55 // If the padding is non-zero, count the number of spaces in the run | 56 // 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. | 57 // and divide that by the padding for per space addition. |
57 m_expansion = m_run.expansion(); | 58 m_expansion = m_run.expansion(); |
| 59 m_distributeJustification = m_run.isDistributeJustification(); |
58 if (!m_expansion) | 60 if (!m_expansion) |
59 m_expansionPerOpportunity = 0; | 61 m_expansionPerOpportunity = 0; |
60 else { | 62 else { |
61 bool isAfterExpansion = m_isAfterExpansion; | 63 bool isAfterExpansion = m_isAfterExpansion; |
62 unsigned expansionOpportunityCount = m_run.is8Bit() ? Character::expansi
onOpportunityCount(m_run.characters8(), m_run.length(), m_run.ltr() ? LTR : RTL,
isAfterExpansion) : Character::expansionOpportunityCount(m_run.characters16(),
m_run.length(), m_run.ltr() ? LTR : RTL, isAfterExpansion); | 64 unsigned expansionOpportunityCount = m_run.is8Bit() ? Character::expansi
onOpportunityCount(m_run.characters8(), m_run.length(), m_run.ltr() ? LTR : RTL,
isAfterExpansion, m_distributeJustification) : Character::expansionOpportunityC
ount(m_run.characters16(), m_run.length(), m_run.ltr() ? LTR : RTL, isAfterExpan
sion, m_distributeJustification); |
63 if (isAfterExpansion && !m_run.allowsTrailingExpansion()) | 65 if (isAfterExpansion && !m_run.allowsTrailingExpansion()) |
64 expansionOpportunityCount--; | 66 expansionOpportunityCount--; |
65 | 67 |
66 if (!expansionOpportunityCount) | 68 if (!expansionOpportunityCount) |
67 m_expansionPerOpportunity = 0; | 69 m_expansionPerOpportunity = 0; |
68 else | 70 else |
69 m_expansionPerOpportunity = m_expansion / expansionOpportunityCount; | 71 m_expansionPerOpportunity = m_expansion / expansionOpportunityCount; |
70 } | 72 } |
71 } | 73 } |
72 | 74 |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
201 } | 203 } |
202 } | 204 } |
203 } | 205 } |
204 | 206 |
205 if (hasExtraSpacing) { | 207 if (hasExtraSpacing) { |
206 // Account for letter-spacing. | 208 // Account for letter-spacing. |
207 if (width && m_font->fontDescription().letterSpacing()) | 209 if (width && m_font->fontDescription().letterSpacing()) |
208 width += m_font->fontDescription().letterSpacing(); | 210 width += m_font->fontDescription().letterSpacing(); |
209 | 211 |
210 static bool expandAroundIdeographs = FontPlatformFeatures::canExpand
AroundIdeographsInComplexText(); | 212 static bool expandAroundIdeographs = FontPlatformFeatures::canExpand
AroundIdeographsInComplexText(); |
211 bool treatAsSpace = Character::treatAsSpace(character); | 213 bool isExpansionOpportunity = Character::treatAsSpace(character) ||
m_distributeJustification; |
212 if (treatAsSpace || (expandAroundIdeographs && Character::isCJKIdeog
raphOrSymbol(character))) { | 214 if (isExpansionOpportunity || (expandAroundIdeographs && Character::
isCJKIdeographOrSymbol(character))) { |
213 // Distribute the run's total expansion evenly over all expansio
n opportunities in the run. | 215 // Distribute the run's total expansion evenly over all expansio
n opportunities in the run. |
214 if (m_expansion) { | 216 if (m_expansion) { |
215 float previousExpansion = m_expansion; | 217 float previousExpansion = m_expansion; |
216 if (!treatAsSpace && !m_isAfterExpansion) { | 218 if (!isExpansionOpportunity && !m_isAfterExpansion) { |
217 // Take the expansion opportunity before this ideograph. | 219 // Take the expansion opportunity before this ideograph. |
218 m_expansion -= m_expansionPerOpportunity; | 220 m_expansion -= m_expansionPerOpportunity; |
219 float expansionAtThisOpportunity = !m_run.applyWordRound
ing() ? m_expansionPerOpportunity : roundf(previousExpansion) - roundf(m_expansi
on); | 221 float expansionAtThisOpportunity = !m_run.applyWordRound
ing() ? m_expansionPerOpportunity : roundf(previousExpansion) - roundf(m_expansi
on); |
220 m_runWidthSoFar += expansionAtThisOpportunity; | 222 m_runWidthSoFar += expansionAtThisOpportunity; |
221 if (glyphBuffer) { | 223 if (glyphBuffer) { |
222 if (glyphBuffer->isEmpty()) { | 224 if (glyphBuffer->isEmpty()) { |
223 if (m_forTextEmphasis) | 225 if (m_forTextEmphasis) |
224 glyphBuffer->add(fontData->zeroWidthSpaceGly
ph(), fontData, m_expansionPerOpportunity); | 226 glyphBuffer->add(fontData->zeroWidthSpaceGly
ph(), fontData, m_expansionPerOpportunity); |
225 else | 227 else |
226 glyphBuffer->add(fontData->spaceGlyph(), fon
tData, expansionAtThisOpportunity); | 228 glyphBuffer->add(fontData->spaceGlyph(), fon
tData, expansionAtThisOpportunity); |
227 } else | 229 } else |
228 glyphBuffer->expandLastAdvance(expansionAtThisOp
portunity); | 230 glyphBuffer->expandLastAdvance(expansionAtThisOp
portunity); |
229 } | 231 } |
230 previousExpansion = m_expansion; | 232 previousExpansion = m_expansion; |
231 } | 233 } |
232 if (m_run.allowsTrailingExpansion() || (m_run.ltr() && textI
terator.currentCharacter() + advanceLength < static_cast<size_t>(m_run.length())
) | 234 if (m_run.allowsTrailingExpansion() || (m_run.ltr() && textI
terator.currentCharacter() + advanceLength < static_cast<size_t>(m_run.length())
) |
233 || (m_run.rtl() && textIterator.currentCharacter())) { | 235 || (m_run.rtl() && textIterator.currentCharacter())) { |
234 m_expansion -= m_expansionPerOpportunity; | 236 m_expansion -= m_expansionPerOpportunity; |
235 width += !m_run.applyWordRounding() ? m_expansionPerOppo
rtunity : roundf(previousExpansion) - roundf(m_expansion); | 237 width += !m_run.applyWordRounding() ? m_expansionPerOppo
rtunity : roundf(previousExpansion) - roundf(m_expansion); |
236 m_isAfterExpansion = true; | 238 m_isAfterExpansion = true; |
237 } | 239 } |
238 } else | 240 } else |
239 m_isAfterExpansion = false; | 241 m_isAfterExpansion = false; |
240 | 242 |
241 // Account for word spacing. | 243 // Account for word spacing. |
242 // We apply additional space between "words" by adding width to
the space character. | 244 // We apply additional space between "words" by adding width to
the space character. |
243 if (treatAsSpace && (character != '\t' || !m_run.allowTabs()) &&
(textIterator.currentCharacter() || character == noBreakSpace) && m_font->fontD
escription().wordSpacing()) | 245 if (isExpansionOpportunity && (character != '\t' || !m_run.allow
Tabs()) && (textIterator.currentCharacter() || character == noBreakSpace) && m_f
ont->fontDescription().wordSpacing()) |
244 width += m_font->fontDescription().wordSpacing(); | 246 width += m_font->fontDescription().wordSpacing(); |
245 } else | 247 } else |
246 m_isAfterExpansion = false; | 248 m_isAfterExpansion = false; |
247 } | 249 } |
248 | 250 |
249 if (shouldApplyFontTransforms() && glyphBuffer && Character::treatAsSpac
e(character)) { | 251 if (shouldApplyFontTransforms() && glyphBuffer && Character::treatAsSpac
e(character)) { |
250 charactersTreatedAsSpace.append(make_pair(glyphBuffer->size(), | 252 charactersTreatedAsSpace.append(make_pair(glyphBuffer->size(), |
251 OriginalAdvancesForCharacterTreatedAsSpace(character == ' ', | 253 OriginalAdvancesForCharacterTreatedAsSpace(character == ' ', |
252 glyphBuffer->size() ? glyphBuffer->advanceAt(glyphBuffer->si
ze() - 1).width() : 0, | 254 glyphBuffer->size() ? glyphBuffer->advanceAt(glyphBuffer->si
ze() - 1).width() : 0, |
253 width))); | 255 width))); |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
339 unsigned oldSize = glyphBuffer.size(); | 341 unsigned oldSize = glyphBuffer.size(); |
340 advance(m_currentCharacter + 1, &glyphBuffer); | 342 advance(m_currentCharacter + 1, &glyphBuffer); |
341 float w = 0; | 343 float w = 0; |
342 for (unsigned i = oldSize; i < glyphBuffer.size(); ++i) | 344 for (unsigned i = oldSize; i < glyphBuffer.size(); ++i) |
343 w += glyphBuffer.advanceAt(i).width(); | 345 w += glyphBuffer.advanceAt(i).width(); |
344 width = w; | 346 width = w; |
345 return glyphBuffer.size() > oldSize; | 347 return glyphBuffer.size() > oldSize; |
346 } | 348 } |
347 | 349 |
348 } | 350 } |
OLD | NEW |