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

Unified Diff: ui/gfx/platform_font_mac.mm

Issue 2898613002: Revert of Support finer grained font weights on Mac. (Closed)
Patch Set: Created 3 years, 7 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | ui/gfx/platform_font_mac_unittest.mm » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/gfx/platform_font_mac.mm
diff --git a/ui/gfx/platform_font_mac.mm b/ui/gfx/platform_font_mac.mm
index 7745bf94ca942e664ffab413de5327cf3a1c8cf6..d147607ba614fc448073ea981af3e86e6c9ed623 100644
--- a/ui/gfx/platform_font_mac.mm
+++ b/ui/gfx/platform_font_mac.mm
@@ -8,9 +8,7 @@
#include <Cocoa/Cocoa.h>
-#import "base/mac/foundation_util.h"
-#include "base/mac/scoped_cftyperef.h"
-#import "base/mac/scoped_nsobject.h"
+#include "base/mac/scoped_nsobject.h"
#include "base/strings/sys_string_conversions.h"
#include "base/strings/utf_string_conversions.h"
#include "ui/gfx/canvas.h"
@@ -20,60 +18,6 @@
namespace gfx {
namespace {
-
-// How to get from NORMAL weight to a fine-grained font weight using calls to
-// -[NSFontManager convertWeight:(BOOL)upFlag ofFont:(NSFont)].
-struct WeightSolver {
- int steps_up; // Times to call with upFlag:YES.
- int steps_down; // Times to call with upFlag:NO.
- // Either NORMAL or BOLD: whether to set the NSBoldFontMask symbolic trait.
- Font::Weight nearest;
-};
-
-// Solve changes to the font weight according to the following table, from
-// https://developer.apple.com/reference/appkit/nsfontmanager/1462321-convertweight
-// 1. ultralight | none
-// 2. thin | W1. ultralight
-// 3. light, extralight | W2. extralight
-// 4. book | W3. light
-// 5. regular, plain, display, roman | W4. semilight
-// 6. medium | W5. medium
-// 7. demi, demibold | none
-// 8. semi, semibold | W6. semibold
-// 9. bold | W7. bold
-// 10. extra, extrabold | W8. extrabold
-// 11. heavy, heavyface | none
-// 12. black, super | W9. ultrabold
-// 13. ultra, ultrablack, fat | none
-// 14. extrablack, obese, nord | none
-WeightSolver WeightChangeFromNormal(Font::Weight desired) {
- using Weight = Font::Weight;
- switch (desired) {
- case Weight::THIN:
- // It's weird, but to get LIGHT and THIN fonts, first go up a step.
- // Without this, the font stays stuck at NORMAL. See
- // PlatformFontMacTest, FontWeightAPIConsistency.
- return {1, 3, Weight::NORMAL};
- case Weight::EXTRA_LIGHT:
- return {1, 2, Weight::NORMAL};
- case Weight::LIGHT:
- return {1, 1, Weight::NORMAL};
- case Weight::NORMAL:
- return {0, 0, Weight::NORMAL};
- case Weight::MEDIUM:
- return {1, 0, Weight::NORMAL};
- case Weight::SEMIBOLD:
- return {0, 1, Weight::BOLD};
- case Weight::BOLD:
- return {0, 0, Weight::BOLD};
- case Weight::EXTRA_BOLD:
- return {1, 0, Weight::BOLD};
- case Weight::BLACK:
- return {3, 0, Weight::BOLD}; // Skip row 12.
- case Weight::INVALID:
- return {0, 0, Weight::NORMAL};
- }
-}
// Returns the font style for |font|. Disregards Font::UNDERLINE, since NSFont
// does not support it as a trait.
@@ -87,56 +31,8 @@
// Returns the Font weight for |font|.
Font::Weight GetFontWeightFromNSFont(NSFont* font) {
- if (!font)
- return Font::Weight::INVALID;
-
- // Map CoreText weights in a manner similar to ct_weight_to_fontstyle() from
- // SkFontHost_mac.cpp, but adjust for MEDIUM so that the San Francisco's
- // custom MEDIUM weight can be picked out. San Francisco has weights:
- // [0.23, 0.23, 0.3, 0.4, 0.56, 0.62, 0.62, ...] (no thin weights).
- // See PlatformFontMacTest.FontWeightAPIConsistency for details.
- // Note that the table Skia uses is also determined by experiment.
- constexpr struct {
- CGFloat ct_weight;
- Font::Weight gfx_weight;
- } weight_map[] = {
- // Missing: Apple "ultralight".
- {-0.70, Font::Weight::THIN},
- {-0.50, Font::Weight::EXTRA_LIGHT},
- {-0.23, Font::Weight::LIGHT},
- {0.00, Font::Weight::NORMAL},
- {0.23, Font::Weight::MEDIUM}, // Note: adjusted from 0.20 vs Skia.
- // Missing: Apple "demibold".
- {0.30, Font::Weight::SEMIBOLD},
- {0.40, Font::Weight::BOLD},
- {0.60, Font::Weight::EXTRA_BOLD},
- // Missing: Apple "heavyface".
- // Values will be capped to BLACK (this entry is here for consistency).
- {0.80, Font::Weight::BLACK},
- // Missing: Apple "ultrablack".
- // Missing: Apple "extrablack".
- };
- base::ScopedCFTypeRef<CFDictionaryRef> traits(
- CTFontCopyTraits(base::mac::NSToCFCast(font)));
- DCHECK(traits);
- CFNumberRef cf_weight = base::mac::GetValueFromDictionary<CFNumberRef>(
- traits, kCTFontWeightTrait);
- // A missing weight attribute just means 0 -> NORMAL.
- if (!cf_weight)
- return Font::Weight::NORMAL;
-
- // Documentation is vague about what sized floating point type should be used.
- // However, numeric_limits::epsilon() for 64-bit types is too small to match
- // the above table, so use 32-bit float.
- float weight_value;
- Boolean success =
- CFNumberGetValue(cf_weight, kCFNumberFloatType, &weight_value);
- DCHECK(success);
- for (const auto& item : weight_map) {
- if (weight_value - item.ct_weight <= std::numeric_limits<float>::epsilon())
- return item.gfx_weight;
- }
- return Font::Weight::BLACK;
+ NSFontSymbolicTraits traits = [[font fontDescriptor] symbolicTraits];
+ return (traits & NSFontBoldTrait) ? Font::Weight::BOLD : Font::Weight::NORMAL;
}
// Returns an autoreleased NSFont created with the passed-in specifications.
@@ -204,43 +100,24 @@
Font::Weight weight) const {
// For some reason, creating fonts using the NSFontDescriptor API's seem to be
// unreliable. Hence use the NSFontManager.
- NSFont* derived = native_font_;
+ NSFont* derived_font = native_font_;
NSFontManager* font_manager = [NSFontManager sharedFontManager];
- if (weight != font_weight_) {
- // Find a font without any bold traits. Ideally, all bold traits are
- // removed here, but non-symbolic traits are read-only properties of a
- // particular set of glyphs. And attempting to "reset" the attribute with a
- // new font descriptor will lose internal properties that Mac decorates its
- // UI fonts with. E.g., solving the plans below from NORMAL result in a
- // CTFontDescriptor attribute entry of NSCTFontUIUsageAttribute in
- // CTFont{Regular,Medium,Demi,Emphasized,Heavy,Black}Usage. Attempting to
- // "solve" weights starting at other than NORMAL has unpredictable results.
- if (font_weight_ != Font::Weight::NORMAL)
- derived = [font_manager convertFont:derived toHaveTrait:NSUnboldFontMask];
- DLOG_IF(WARNING, GetFontWeightFromNSFont(derived) != Font::Weight::NORMAL)
- << "Deriving from a font with an internal unmodifiable weight.";
-
- WeightSolver plan = WeightChangeFromNormal(weight);
- if (plan.nearest == Font::Weight::BOLD)
- derived = [font_manager convertFont:derived toHaveTrait:NSBoldFontMask];
- for (int i = 0; i < plan.steps_up; ++i)
- derived = [font_manager convertWeight:YES ofFont:derived];
- for (int i = 0; i < plan.steps_down; ++i)
- derived = [font_manager convertWeight:NO ofFont:derived];
- }
-
- if (style != font_style_) {
- NSFontTraitMask italic_trait_mask =
- (style & Font::ITALIC) ? NSItalicFontMask : NSUnitalicFontMask;
- derived = [font_manager convertFont:derived toHaveTrait:italic_trait_mask];
- }
-
- if (size_delta != 0)
- derived = [font_manager convertFont:derived toSize:font_size_ + size_delta];
-
- return Font(new PlatformFontMac(derived, font_name_, font_size_ + size_delta,
- style, weight));
+ NSFontTraitMask bold_trait_mask =
+ weight >= Font::Weight::BOLD ? NSBoldFontMask : NSUnboldFontMask;
+ derived_font =
+ [font_manager convertFont:derived_font toHaveTrait:bold_trait_mask];
+
+ NSFontTraitMask italic_trait_mask =
+ (style & Font::ITALIC) ? NSItalicFontMask : NSUnitalicFontMask;
+ derived_font =
+ [font_manager convertFont:derived_font toHaveTrait:italic_trait_mask];
+
+ derived_font =
+ [font_manager convertFont:derived_font toSize:font_size_ + size_delta];
+
+ return Font(new PlatformFontMac(derived_font, font_name_,
+ font_size_ + size_delta, style, weight));
}
int PlatformFontMac::GetHeight() {
« no previous file with comments | « no previous file | ui/gfx/platform_font_mac_unittest.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698