Home | History | Annotate | Download | only in gfx
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "ui/gfx/platform_font_ios.h"
      6 
      7 #import <UIKit/UIKit.h>
      8 
      9 #include "base/basictypes.h"
     10 #include "base/strings/sys_string_conversions.h"
     11 #include "base/strings/utf_string_conversions.h"
     12 #include "ui/gfx/font.h"
     13 
     14 namespace gfx {
     15 
     16 ////////////////////////////////////////////////////////////////////////////////
     17 // PlatformFontIOS, public:
     18 
     19 PlatformFontIOS::PlatformFontIOS() {
     20   font_size_ = [UIFont systemFontSize];
     21   style_ = gfx::Font::NORMAL;
     22   UIFont* system_font = [UIFont systemFontOfSize:font_size_];
     23   font_name_ = base::SysNSStringToUTF8([system_font fontName]);
     24   CalculateMetrics();
     25 }
     26 
     27 PlatformFontIOS::PlatformFontIOS(NativeFont native_font) {
     28   std::string font_name = base::SysNSStringToUTF8([native_font fontName]);
     29   InitWithNameSizeAndStyle(font_name,
     30                            [native_font pointSize],
     31                            gfx::Font::NORMAL);
     32 }
     33 
     34 PlatformFontIOS::PlatformFontIOS(const std::string& font_name,
     35                                  int font_size) {
     36   InitWithNameSizeAndStyle(font_name, font_size, gfx::Font::NORMAL);
     37 }
     38 
     39 ////////////////////////////////////////////////////////////////////////////////
     40 // PlatformFontIOS, PlatformFont implementation:
     41 
     42 Font PlatformFontIOS::DeriveFont(int size_delta, int style) const {
     43   return Font(new PlatformFontIOS(font_name_, font_size_ + size_delta, style));
     44 }
     45 
     46 int PlatformFontIOS::GetHeight() const {
     47   return height_;
     48 }
     49 
     50 int PlatformFontIOS::GetBaseline() const {
     51   return ascent_;
     52 }
     53 
     54 int PlatformFontIOS::GetCapHeight() const {
     55   return cap_height_;
     56 }
     57 
     58 int PlatformFontIOS::GetAverageCharacterWidth() const {
     59   return average_width_;
     60 }
     61 
     62 int PlatformFontIOS::GetStringWidth(const base::string16& text) const {
     63   NSString* ns_text = base::SysUTF16ToNSString(text);
     64   return [ns_text sizeWithFont:GetNativeFont()].width;
     65 }
     66 
     67 int PlatformFontIOS::GetExpectedTextWidth(int length) const {
     68   return length * average_width_;
     69 }
     70 
     71 int PlatformFontIOS::GetStyle() const {
     72   return style_;
     73 }
     74 
     75 std::string PlatformFontIOS::GetFontName() const {
     76   return font_name_;
     77 }
     78 
     79 std::string PlatformFontIOS::GetActualFontNameForTesting() const {
     80   return base::SysNSStringToUTF8([GetNativeFont() familyName]);
     81 }
     82 
     83 int PlatformFontIOS::GetFontSize() const {
     84   return font_size_;
     85 }
     86 
     87 NativeFont PlatformFontIOS::GetNativeFont() const {
     88   return [UIFont fontWithName:base::SysUTF8ToNSString(font_name_)
     89                          size:font_size_];
     90 }
     91 
     92 ////////////////////////////////////////////////////////////////////////////////
     93 // PlatformFontIOS, private:
     94 
     95 PlatformFontIOS::PlatformFontIOS(const std::string& font_name,
     96                                  int font_size,
     97                                  int style) {
     98   InitWithNameSizeAndStyle(font_name, font_size, style);
     99 }
    100 
    101 void PlatformFontIOS::InitWithNameSizeAndStyle(const std::string& font_name,
    102                                                int font_size,
    103                                                int style) {
    104   font_name_ = font_name;
    105   font_size_ = font_size;
    106   style_ = style;
    107   CalculateMetrics();
    108 }
    109 
    110 void PlatformFontIOS::CalculateMetrics() {
    111   UIFont* font = GetNativeFont();
    112   height_ = font.lineHeight;
    113   ascent_ = font.ascender;
    114   cap_height_ = font.capHeight;
    115   average_width_ = [@"x" sizeWithFont:font].width;
    116 }
    117 
    118 ////////////////////////////////////////////////////////////////////////////////
    119 // PlatformFont, public:
    120 
    121 // static
    122 PlatformFont* PlatformFont::CreateDefault() {
    123   return new PlatformFontIOS;
    124 }
    125 
    126 // static
    127 PlatformFont* PlatformFont::CreateFromNativeFont(NativeFont native_font) {
    128   return new PlatformFontIOS(native_font);
    129 }
    130 
    131 // static
    132 PlatformFont* PlatformFont::CreateFromNameAndSize(const std::string& font_name,
    133                                                   int font_size) {
    134   return new PlatformFontIOS(font_name, font_size);
    135 }
    136 
    137 }  // namespace gfx
    138