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

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

Issue 546973004: Revert 181541 "Merge FontPlatformDataHarfBuzz and FontPlatformData headers" (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 3 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 | Annotate | Revision Log
« no previous file with comments | « Source/platform/fonts/mac/FontMac.cpp ('k') | Source/platform/fonts/win/FontCacheSkiaWin.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 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
124 else { 124 else {
125 const SimpleFontData* found = static_cast<const SimpleFontData*>(CFD ictionaryGetValue(m_derivedFontData->compositeFontReferences.get(), static_cast< const void *>(key))); 125 const SimpleFontData* found = static_cast<const SimpleFontData*>(CFD ictionaryGetValue(m_derivedFontData->compositeFontReferences.get(), static_cast< const void *>(key)));
126 if (found) 126 if (found)
127 return found; 127 return found;
128 } 128 }
129 if (CFMutableDictionaryRef dictionary = m_derivedFontData->compositeFont References.get()) { 129 if (CFMutableDictionaryRef dictionary = m_derivedFontData->compositeFont References.get()) {
130 NSFont *substituteFont = [key printerFont]; 130 NSFont *substituteFont = [key printerFont];
131 131
132 CTFontSymbolicTraits traits = CTFontGetSymbolicTraits(toCTFontRef(su bstituteFont)); 132 CTFontSymbolicTraits traits = CTFontGetSymbolicTraits(toCTFontRef(su bstituteFont));
133 bool syntheticBold = platformData().syntheticBold() && !(traits & kC TFontBoldTrait); 133 bool syntheticBold = platformData().syntheticBold() && !(traits & kC TFontBoldTrait);
134 bool syntheticItalic = platformData().syntheticItalic() && !(traits & kCTFontItalicTrait); 134 bool syntheticOblique = platformData().syntheticOblique() && !(trait s & kCTFontItalicTrait);
135 135
136 FontPlatformData substitutePlatform(substituteFont, platformData().s ize(), syntheticBold, syntheticItalic, platformData().orientation(), platformDat a().widthVariant()); 136 FontPlatformData substitutePlatform(substituteFont, platformData().s ize(), syntheticBold, syntheticOblique, platformData().orientation(), platformDa ta().widthVariant());
137 SimpleFontData* value = new SimpleFontData(substitutePlatform, isCus tomFont() ? CustomFontData::create() : nullptr); 137 SimpleFontData* value = new SimpleFontData(substitutePlatform, isCus tomFont() ? CustomFontData::create() : nullptr);
138 if (value) { 138 if (value) {
139 CFDictionaryAddValue(dictionary, key, value); 139 CFDictionaryAddValue(dictionary, key, value);
140 return value; 140 return value;
141 } 141 }
142 } 142 }
143 } 143 }
144 return 0; 144 return 0;
145 } 145 }
146 146
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
208 int iLineGap; 208 int iLineGap;
209 unsigned unitsPerEm; 209 unsigned unitsPerEm;
210 210
211 iAscent = CGFontGetAscent(m_platformData.cgFont()); 211 iAscent = CGFontGetAscent(m_platformData.cgFont());
212 // Some fonts erroneously specify a positive descender value. We follow Core Text in assuming that 212 // Some fonts erroneously specify a positive descender value. We follow Core Text in assuming that
213 // such fonts meant the same distance, but in the reverse direction. 213 // such fonts meant the same distance, but in the reverse direction.
214 iDescent = -abs(CGFontGetDescent(m_platformData.cgFont())); 214 iDescent = -abs(CGFontGetDescent(m_platformData.cgFont()));
215 iLineGap = CGFontGetLeading(m_platformData.cgFont()); 215 iLineGap = CGFontGetLeading(m_platformData.cgFont());
216 unitsPerEm = CGFontGetUnitsPerEm(m_platformData.cgFont()); 216 unitsPerEm = CGFontGetUnitsPerEm(m_platformData.cgFont());
217 217
218 float pointSize = m_platformData.m_textSize; 218 float pointSize = m_platformData.m_size;
219 float ascent = scaleEmToUnits(iAscent, unitsPerEm) * pointSize; 219 float ascent = scaleEmToUnits(iAscent, unitsPerEm) * pointSize;
220 float descent = -scaleEmToUnits(iDescent, unitsPerEm) * pointSize; 220 float descent = -scaleEmToUnits(iDescent, unitsPerEm) * pointSize;
221 float lineGap = scaleEmToUnits(iLineGap, unitsPerEm) * pointSize; 221 float lineGap = scaleEmToUnits(iLineGap, unitsPerEm) * pointSize;
222 float underlineThickness = CTFontGetUnderlineThickness(m_platformData.ctFont ()); 222 float underlineThickness = CTFontGetUnderlineThickness(m_platformData.ctFont ());
223 float underlinePosition = CTFontGetUnderlinePosition(m_platformData.ctFont() ); 223 float underlinePosition = CTFontGetUnderlinePosition(m_platformData.ctFont() );
224 224
225 // We need to adjust Times, Helvetica, and Courier to closely match the 225 // We need to adjust Times, Helvetica, and Courier to closely match the
226 // vertical metrics of their Microsoft counterparts that are the de facto 226 // vertical metrics of their Microsoft counterparts that are the de facto
227 // web standard. The AppKit adjustment of 20% is too big and is 227 // web standard. The AppKit adjustment of 20% is too big and is
228 // incorrectly added to line spacing, so we use a 15% adjustment instead 228 // incorrectly added to line spacing, so we use a 15% adjustment instead
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
274 274
275 void SimpleFontData::platformCharWidthInit() 275 void SimpleFontData::platformCharWidthInit()
276 { 276 {
277 m_avgCharWidth = 0; 277 m_avgCharWidth = 0;
278 m_maxCharWidth = 0; 278 m_maxCharWidth = 0;
279 279
280 RetainPtr<CFDataRef> os2Table(AdoptCF, copyFontTableForTag(m_platformData, ' OS/2')); 280 RetainPtr<CFDataRef> os2Table(AdoptCF, copyFontTableForTag(m_platformData, ' OS/2'));
281 if (os2Table && CFDataGetLength(os2Table.get()) >= 4) { 281 if (os2Table && CFDataGetLength(os2Table.get()) >= 4) {
282 const UInt8* os2 = CFDataGetBytePtr(os2Table.get()); 282 const UInt8* os2 = CFDataGetBytePtr(os2Table.get());
283 SInt16 os2AvgCharWidth = os2[2] * 256 + os2[3]; 283 SInt16 os2AvgCharWidth = os2[2] * 256 + os2[3];
284 m_avgCharWidth = scaleEmToUnits(os2AvgCharWidth, m_fontMetrics.unitsPerE m()) * m_platformData.m_textSize; 284 m_avgCharWidth = scaleEmToUnits(os2AvgCharWidth, m_fontMetrics.unitsPerE m()) * m_platformData.m_size;
285 } 285 }
286 286
287 RetainPtr<CFDataRef> headTable(AdoptCF, copyFontTableForTag(m_platformData, 'head')); 287 RetainPtr<CFDataRef> headTable(AdoptCF, copyFontTableForTag(m_platformData, 'head'));
288 if (headTable && CFDataGetLength(headTable.get()) >= 42) { 288 if (headTable && CFDataGetLength(headTable.get()) >= 42) {
289 const UInt8* head = CFDataGetBytePtr(headTable.get()); 289 const UInt8* head = CFDataGetBytePtr(headTable.get());
290 ushort uxMin = head[36] * 256 + head[37]; 290 ushort uxMin = head[36] * 256 + head[37];
291 ushort uxMax = head[40] * 256 + head[41]; 291 ushort uxMax = head[40] * 256 + head[41];
292 SInt16 xMin = static_cast<SInt16>(uxMin); 292 SInt16 xMin = static_cast<SInt16>(uxMin);
293 SInt16 xMax = static_cast<SInt16>(uxMax); 293 SInt16 xMax = static_cast<SInt16>(uxMax);
294 float diff = static_cast<float>(xMax - xMin); 294 float diff = static_cast<float>(xMax - xMin);
295 m_maxCharWidth = scaleEmToUnits(diff, m_fontMetrics.unitsPerEm()) * m_pl atformData.m_textSize; 295 m_maxCharWidth = scaleEmToUnits(diff, m_fontMetrics.unitsPerEm()) * m_pl atformData.m_size;
296 } 296 }
297 297
298 // Fallback to a cross-platform estimate, which will populate these values i f they are non-positive. 298 // Fallback to a cross-platform estimate, which will populate these values i f they are non-positive.
299 initCharWidths(); 299 initCharWidths();
300 } 300 }
301 301
302 void SimpleFontData::platformDestroy() 302 void SimpleFontData::platformDestroy()
303 { 303 {
304 if (!isCustomFont() && m_derivedFontData) { 304 if (!isCustomFont() && m_derivedFontData) {
305 // These come from the cache. 305 // These come from the cache.
306 if (m_derivedFontData->smallCaps) 306 if (m_derivedFontData->smallCaps)
307 FontCache::fontCache()->releaseFontData(m_derivedFontData->smallCaps .get()); 307 FontCache::fontCache()->releaseFontData(m_derivedFontData->smallCaps .get());
308 308
309 if (m_derivedFontData->emphasisMark) 309 if (m_derivedFontData->emphasisMark)
310 FontCache::fontCache()->releaseFontData(m_derivedFontData->emphasisM ark.get()); 310 FontCache::fontCache()->releaseFontData(m_derivedFontData->emphasisM ark.get());
311 } 311 }
312 } 312 }
313 313
314 PassRefPtr<SimpleFontData> SimpleFontData::platformCreateScaledFontData(const Fo ntDescription& fontDescription, float scaleFactor) const 314 PassRefPtr<SimpleFontData> SimpleFontData::platformCreateScaledFontData(const Fo ntDescription& fontDescription, float scaleFactor) const
315 { 315 {
316 if (isCustomFont()) { 316 if (isCustomFont()) {
317 FontPlatformData scaledFontData(m_platformData); 317 FontPlatformData scaledFontData(m_platformData);
318 scaledFontData.m_textSize = scaledFontData.m_textSize * scaleFactor; 318 scaledFontData.m_size = scaledFontData.m_size * scaleFactor;
319 return SimpleFontData::create(scaledFontData, CustomFontData::create()); 319 return SimpleFontData::create(scaledFontData, CustomFontData::create());
320 } 320 }
321 321
322 BEGIN_BLOCK_OBJC_EXCEPTIONS; 322 BEGIN_BLOCK_OBJC_EXCEPTIONS;
323 float size = m_platformData.size() * scaleFactor; 323 float size = m_platformData.size() * scaleFactor;
324 FontPlatformData scaledFontData([[NSFontManager sharedFontManager] convertFo nt:m_platformData.font() toSize:size], size, false, false, m_platformData.orient ation()); 324 FontPlatformData scaledFontData([[NSFontManager sharedFontManager] convertFo nt:m_platformData.font() toSize:size], size, false, false, m_platformData.orient ation());
325 325
326 // AppKit forgets about hinting property when scaling, so we have to remind it. 326 // AppKit forgets about hinting property when scaling, so we have to remind it.
327 scaledFontData.setFont(useHinting() ? [scaledFontData.font() screenFont] : [ scaledFontData.font() printerFont]); 327 scaledFontData.setFont(useHinting() ? [scaledFontData.font() screenFont] : [ scaledFontData.font() printerFont]);
328 328
329 if (scaledFontData.font()) { 329 if (scaledFontData.font()) {
330 NSFontManager *fontManager = [NSFontManager sharedFontManager]; 330 NSFontManager *fontManager = [NSFontManager sharedFontManager];
331 NSFontTraitMask fontTraits = [fontManager traitsOfFont:m_platformData.fo nt()]; 331 NSFontTraitMask fontTraits = [fontManager traitsOfFont:m_platformData.fo nt()];
332 332
333 if (m_platformData.m_syntheticBold) 333 if (m_platformData.m_syntheticBold)
334 fontTraits |= NSBoldFontMask; 334 fontTraits |= NSBoldFontMask;
335 if (m_platformData.m_syntheticItalic) 335 if (m_platformData.m_syntheticOblique)
336 fontTraits |= NSItalicFontMask; 336 fontTraits |= NSItalicFontMask;
337 337
338 NSFontTraitMask scaledFontTraits = [fontManager traitsOfFont:scaledFontD ata.font()]; 338 NSFontTraitMask scaledFontTraits = [fontManager traitsOfFont:scaledFontD ata.font()];
339 scaledFontData.m_syntheticBold = (fontTraits & NSBoldFontMask) && !(scal edFontTraits & NSBoldFontMask); 339 scaledFontData.m_syntheticBold = (fontTraits & NSBoldFontMask) && !(scal edFontTraits & NSBoldFontMask);
340 scaledFontData.m_syntheticItalic = (fontTraits & NSItalicFontMask) && !( scaledFontTraits & NSItalicFontMask); 340 scaledFontData.m_syntheticOblique = (fontTraits & NSItalicFontMask) && ! (scaledFontTraits & NSItalicFontMask);
341 341
342 // SimpleFontData::platformDestroy() takes care of not deleting the cach ed font data twice. 342 // SimpleFontData::platformDestroy() takes care of not deleting the cach ed font data twice.
343 return FontCache::fontCache()->fontDataFromFontPlatformData(&scaledFontD ata); 343 return FontCache::fontCache()->fontDataFromFontPlatformData(&scaledFontD ata);
344 } 344 }
345 END_BLOCK_OBJC_EXCEPTIONS; 345 END_BLOCK_OBJC_EXCEPTIONS;
346 346
347 return nullptr; 347 return nullptr;
348 } 348 }
349 349
350 void SimpleFontData::determinePitch() 350 void SimpleFontData::determinePitch()
(...skipping 30 matching lines...) Expand all
381 } 381 }
382 382
383 float SimpleFontData::platformWidthForGlyph(Glyph glyph) const 383 float SimpleFontData::platformWidthForGlyph(Glyph glyph) const
384 { 384 {
385 CGSize advance = CGSizeZero; 385 CGSize advance = CGSizeZero;
386 if (platformData().orientation() == Horizontal || m_isBrokenIdeographFallbac k) { 386 if (platformData().orientation() == Horizontal || m_isBrokenIdeographFallbac k) {
387 NSFont *font = platformData().font(); 387 NSFont *font = platformData().font();
388 if (font && platformData().isColorBitmapFont()) 388 if (font && platformData().isColorBitmapFont())
389 advance = NSSizeToCGSize([font advancementForGlyph:glyph]); 389 advance = NSSizeToCGSize([font advancementForGlyph:glyph]);
390 else { 390 else {
391 float pointSize = platformData().m_textSize; 391 float pointSize = platformData().m_size;
392 CGAffineTransform m = CGAffineTransformMakeScale(pointSize, pointSiz e); 392 CGAffineTransform m = CGAffineTransformMakeScale(pointSize, pointSiz e);
393 if (!CGFontGetGlyphAdvancesForStyle(platformData().cgFont(), &m, cgF ontRenderingModeForNSFont(font), &glyph, 1, &advance)) { 393 if (!CGFontGetGlyphAdvancesForStyle(platformData().cgFont(), &m, cgF ontRenderingModeForNSFont(font), &glyph, 1, &advance)) {
394 WTF_LOG_ERROR("Unable to cache glyph widths for %@ %f", [font di splayName], pointSize); 394 WTF_LOG_ERROR("Unable to cache glyph widths for %@ %f", [font di splayName], pointSize);
395 advance.width = 0; 395 advance.width = 0;
396 } 396 }
397 } 397 }
398 } else 398 } else
399 CTFontGetAdvancesForGlyphs(m_platformData.ctFont(), kCTFontVerticalOrien tation, &glyph, &advance, 1); 399 CTFontGetAdvancesForGlyphs(m_platformData.ctFont(), kCTFontVerticalOrien tation, &glyph, &advance, 1);
400 400
401 return advance.width + m_syntheticBoldOffset; 401 return advance.width + m_syntheticBoldOffset;
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
445 RetainPtr<CGFontRef> runCGFont(AdoptCF, CTFontCopyGraphicsFont(runFont, 0)); 445 RetainPtr<CGFontRef> runCGFont(AdoptCF, CTFontCopyGraphicsFont(runFont, 0));
446 if (!CFEqual(runCGFont.get(), cgFont.get())) 446 if (!CFEqual(runCGFont.get(), cgFont.get()))
447 return false; 447 return false;
448 } 448 }
449 449
450 addResult.storedValue->value = true; 450 addResult.storedValue->value = true;
451 return true; 451 return true;
452 } 452 }
453 453
454 } // namespace blink 454 } // namespace blink
OLDNEW
« no previous file with comments | « Source/platform/fonts/mac/FontMac.cpp ('k') | Source/platform/fonts/win/FontCacheSkiaWin.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698