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

Side by Side Diff: Source/platform/fonts/mac/SimpleFontDataMac.mm

Issue 147703002: Calculate Underline thickness from Font (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Adding Test cases in TestExpectations Created 6 years, 10 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
« no previous file with comments | « Source/platform/fonts/FontMetrics.h ('k') | Source/platform/fonts/skia/SimpleFontDataSkia.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2005, 2006, 2010, 2011 Apple Inc. All rights reserved. 2 * Copyright (C) 2005, 2006, 2010, 2011 Apple Inc. All rights reserved.
3 * Copyright (C) 2006 Alexey Proskuryakov 3 * Copyright (C) 2006 Alexey Proskuryakov
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions 6 * modification, are permitted provided that the following conditions
7 * are met: 7 * are met:
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
148 148
149 // Special case hack to use "Times New Roman" in place of "Times". 149 // Special case hack to use "Times New Roman" in place of "Times".
150 // "Times RO" is a common font whose family name is "Times". 150 // "Times RO" is a common font whose family name is "Times".
151 // It overrides the normal "Times" family font. 151 // It overrides the normal "Times" family font.
152 // It also appears to have a corrupt regular variant. 152 // It also appears to have a corrupt regular variant.
153 NSString *fallbackFontFamily; 153 NSString *fallbackFontFamily;
154 if ([[m_platformData.font() familyName] isEqual:@"Times"]) 154 if ([[m_platformData.font() familyName] isEqual:@"Times"])
155 fallbackFontFamily = @"Times New Roman"; 155 fallbackFontFamily = @"Times New Roman";
156 else 156 else
157 fallbackFontFamily = webFallbackFontFamily(); 157 fallbackFontFamily = webFallbackFontFamily();
158 158
159 // Try setting up the alternate font. 159 // Try setting up the alternate font.
160 // This is a last ditch effort to use a substitute font when something h as gone wrong. 160 // This is a last ditch effort to use a substitute font when something h as gone wrong.
161 #if !ERROR_DISABLED 161 #if !ERROR_DISABLED
162 RetainPtr<NSFont> initialFont = m_platformData.font(); 162 RetainPtr<NSFont> initialFont = m_platformData.font();
163 #endif 163 #endif
164 if (m_platformData.font()) 164 if (m_platformData.font())
165 m_platformData.setFont([[NSFontManager sharedFontManager] convertFon t:m_platformData.font() toFamily:fallbackFontFamily]); 165 m_platformData.setFont([[NSFontManager sharedFontManager] convertFon t:m_platformData.font() toFamily:fallbackFontFamily]);
166 else 166 else
167 m_platformData.setFont([NSFont fontWithName:fallbackFontFamily size: m_platformData.size()]); 167 m_platformData.setFont([NSFont fontWithName:fallbackFontFamily size: m_platformData.size()]);
168 168
(...skipping 19 matching lines...) Expand all
188 [m_platformData.font() familyName], [initialFont.get() familyName]); 188 [m_platformData.font() familyName], [initialFont.get() familyName]);
189 } 189 }
190 190
191 // If all else fails, try to set up using the system font. 191 // If all else fails, try to set up using the system font.
192 // This is probably because Times and Times New Roman are both unavailable. 192 // This is probably because Times and Times New Roman are both unavailable.
193 if (failedSetup) { 193 if (failedSetup) {
194 m_platformData.setFont([NSFont systemFontOfSize:[m_platformData.font() p ointSize]]); 194 m_platformData.setFont([NSFont systemFontOfSize:[m_platformData.font() p ointSize]]);
195 WTF_LOG_ERROR("failed to set up font, using system font %s", m_platformD ata.font()); 195 WTF_LOG_ERROR("failed to set up font, using system font %s", m_platformD ata.font());
196 initFontData(this); 196 initFontData(this);
197 } 197 }
198 198
199 int iAscent; 199 int iAscent;
200 int iDescent; 200 int iDescent;
201 int iLineGap; 201 int iLineGap;
202 unsigned unitsPerEm; 202 unsigned unitsPerEm;
203
203 iAscent = CGFontGetAscent(m_platformData.cgFont()); 204 iAscent = CGFontGetAscent(m_platformData.cgFont());
204 // Some fonts erroneously specify a positive descender value. We follow Core Text in assuming that 205 // Some fonts erroneously specify a positive descender value. We follow Core Text in assuming that
205 // such fonts meant the same distance, but in the reverse direction. 206 // such fonts meant the same distance, but in the reverse direction.
206 iDescent = -abs(CGFontGetDescent(m_platformData.cgFont())); 207 iDescent = -abs(CGFontGetDescent(m_platformData.cgFont()));
207 iLineGap = CGFontGetLeading(m_platformData.cgFont()); 208 iLineGap = CGFontGetLeading(m_platformData.cgFont());
208 unitsPerEm = CGFontGetUnitsPerEm(m_platformData.cgFont()); 209 unitsPerEm = CGFontGetUnitsPerEm(m_platformData.cgFont());
209 210
210 float pointSize = m_platformData.m_size; 211 float pointSize = m_platformData.m_size;
211 float ascent = scaleEmToUnits(iAscent, unitsPerEm) * pointSize; 212 float ascent = scaleEmToUnits(iAscent, unitsPerEm) * pointSize;
212 float descent = -scaleEmToUnits(iDescent, unitsPerEm) * pointSize; 213 float descent = -scaleEmToUnits(iDescent, unitsPerEm) * pointSize;
213 float lineGap = scaleEmToUnits(iLineGap, unitsPerEm) * pointSize; 214 float lineGap = scaleEmToUnits(iLineGap, unitsPerEm) * pointSize;
215 float underlineThickness = CTFontGetUnderlineThickness(m_platformData.ctFont ());
214 216
215 // We need to adjust Times, Helvetica, and Courier to closely match the 217 // We need to adjust Times, Helvetica, and Courier to closely match the
216 // vertical metrics of their Microsoft counterparts that are the de facto 218 // vertical metrics of their Microsoft counterparts that are the de facto
217 // web standard. The AppKit adjustment of 20% is too big and is 219 // web standard. The AppKit adjustment of 20% is too big and is
218 // incorrectly added to line spacing, so we use a 15% adjustment instead 220 // incorrectly added to line spacing, so we use a 15% adjustment instead
219 // and add it to the ascent. 221 // and add it to the ascent.
220 NSString *familyName = [m_platformData.font() familyName]; 222 NSString *familyName = [m_platformData.font() familyName];
221 if ([familyName isEqualToString:@"Times"] || [familyName isEqualToString:@"H elvetica"] || [familyName isEqualToString:@"Courier"]) 223 if ([familyName isEqualToString:@"Times"] || [familyName isEqualToString:@"H elvetica"] || [familyName isEqualToString:@"Courier"])
222 ascent += floorf(((ascent + descent) * 0.15f) + 0.5f); 224 ascent += floorf(((ascent + descent) * 0.15f) + 0.5f);
223 225
224 // Compute and store line spacing, before the line metrics hacks are applied . 226 // Compute and store line spacing, before the line metrics hacks are applied .
225 m_fontMetrics.setLineSpacing(lroundf(ascent) + lroundf(descent) + lroundf(li neGap)); 227 m_fontMetrics.setLineSpacing(lroundf(ascent) + lroundf(descent) + lroundf(li neGap));
226 228
227 // Hack Hiragino line metrics to allow room for marked text underlines. 229 // Hack Hiragino line metrics to allow room for marked text underlines.
228 // <rdar://problem/5386183> 230 // <rdar://problem/5386183>
229 if (descent < 3 && lineGap >= 3 && [familyName hasPrefix:@"Hiragino"]) { 231 if (descent < 3 && lineGap >= 3 && [familyName hasPrefix:@"Hiragino"]) {
230 lineGap -= 3 - descent; 232 lineGap -= 3 - descent;
231 descent = 3; 233 descent = 3;
232 } 234 }
233 235
234 if (platformData().orientation() == Vertical && !isTextOrientationFallback() ) 236 if (platformData().orientation() == Vertical && !isTextOrientationFallback() )
235 m_hasVerticalGlyphs = fontHasVerticalGlyphs(m_platformData.ctFont()); 237 m_hasVerticalGlyphs = fontHasVerticalGlyphs(m_platformData.ctFont());
236 238
237 float xHeight; 239 float xHeight;
238 240
239 if (platformData().orientation() == Horizontal) { 241 if (platformData().orientation() == Horizontal) {
240 // Measure the actual character "x", since it's possible for it to exten d below the baseline, and we need the 242 // Measure the actual character "x", since it's possible for it to exten d below the baseline, and we need the
241 // reported x-height to only include the portion of the glyph that is ab ove the baseline. 243 // reported x-height to only include the portion of the glyph that is ab ove the baseline.
242 GlyphPage* glyphPageZero = GlyphPageTreeNode::getRootChild(this, 0)->pag e(); 244 GlyphPage* glyphPageZero = GlyphPageTreeNode::getRootChild(this, 0)->pag e();
243 NSGlyph xGlyph = glyphPageZero ? glyphPageZero->glyphForCharacter('x') : 0; 245 NSGlyph xGlyph = glyphPageZero ? glyphPageZero->glyphForCharacter('x') : 0;
244 if (xGlyph) 246 if (xGlyph)
245 xHeight = -CGRectGetMinY(platformBoundsForGlyph(xGlyph)); 247 xHeight = -CGRectGetMinY(platformBoundsForGlyph(xGlyph));
246 else 248 else
247 xHeight = scaleEmToUnits(CGFontGetXHeight(m_platformData.cgFont()), unitsPerEm) * pointSize; 249 xHeight = scaleEmToUnits(CGFontGetXHeight(m_platformData.cgFont()), unitsPerEm) * pointSize;
248 } else 250 } else
249 xHeight = verticalRightOrientationFontData()->fontMetrics().xHeight(); 251 xHeight = verticalRightOrientationFontData()->fontMetrics().xHeight();
250 252
251 m_fontMetrics.setUnitsPerEm(unitsPerEm); 253 m_fontMetrics.setUnitsPerEm(unitsPerEm);
252 m_fontMetrics.setAscent(ascent); 254 m_fontMetrics.setAscent(ascent);
253 m_fontMetrics.setDescent(descent); 255 m_fontMetrics.setDescent(descent);
254 m_fontMetrics.setLineGap(lineGap); 256 m_fontMetrics.setLineGap(lineGap);
255 m_fontMetrics.setXHeight(xHeight); 257 m_fontMetrics.setXHeight(xHeight);
258 m_fontMetrics.setUnderlineThickness(underlineThickness);
256 } 259 }
257 260
258 static CFDataRef copyFontTableForTag(FontPlatformData& platformData, FourCharCod e tableName) 261 static CFDataRef copyFontTableForTag(FontPlatformData& platformData, FourCharCod e tableName)
259 { 262 {
260 return CGFontCopyTableForTag(platformData.cgFont(), tableName); 263 return CGFontCopyTableForTag(platformData.cgFont(), tableName);
261 } 264 }
262 265
263 void SimpleFontData::platformCharWidthInit() 266 void SimpleFontData::platformCharWidthInit()
264 { 267 {
265 m_avgCharWidth = 0; 268 m_avgCharWidth = 0;
266 m_maxCharWidth = 0; 269 m_maxCharWidth = 0;
267 270
268 RetainPtr<CFDataRef> os2Table(AdoptCF, copyFontTableForTag(m_platformData, ' OS/2')); 271 RetainPtr<CFDataRef> os2Table(AdoptCF, copyFontTableForTag(m_platformData, ' OS/2'));
269 if (os2Table && CFDataGetLength(os2Table.get()) >= 4) { 272 if (os2Table && CFDataGetLength(os2Table.get()) >= 4) {
270 const UInt8* os2 = CFDataGetBytePtr(os2Table.get()); 273 const UInt8* os2 = CFDataGetBytePtr(os2Table.get());
271 SInt16 os2AvgCharWidth = os2[2] * 256 + os2[3]; 274 SInt16 os2AvgCharWidth = os2[2] * 256 + os2[3];
272 m_avgCharWidth = scaleEmToUnits(os2AvgCharWidth, m_fontMetrics.unitsPerE m()) * m_platformData.m_size; 275 m_avgCharWidth = scaleEmToUnits(os2AvgCharWidth, m_fontMetrics.unitsPerE m()) * m_platformData.m_size;
273 } 276 }
274 277
275 RetainPtr<CFDataRef> headTable(AdoptCF, copyFontTableForTag(m_platformData, 'head')); 278 RetainPtr<CFDataRef> headTable(AdoptCF, copyFontTableForTag(m_platformData, 'head'));
276 if (headTable && CFDataGetLength(headTable.get()) >= 42) { 279 if (headTable && CFDataGetLength(headTable.get()) >= 42) {
277 const UInt8* head = CFDataGetBytePtr(headTable.get()); 280 const UInt8* head = CFDataGetBytePtr(headTable.get());
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
443 RetainPtr<CGFontRef> runCGFont(AdoptCF, CTFontCopyGraphicsFont(runFont, 0)); 446 RetainPtr<CGFontRef> runCGFont(AdoptCF, CTFontCopyGraphicsFont(runFont, 0));
444 if (!CFEqual(runCGFont.get(), cgFont.get())) 447 if (!CFEqual(runCGFont.get(), cgFont.get()))
445 return false; 448 return false;
446 } 449 }
447 450
448 addResult.iterator->value = true; 451 addResult.iterator->value = true;
449 return true; 452 return true;
450 } 453 }
451 454
452 } // namespace WebCore 455 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/platform/fonts/FontMetrics.h ('k') | Source/platform/fonts/skia/SimpleFontDataSkia.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698