Home | History | Annotate | Download | only in wx
      1 /*
      2  * Copyright (C) 2007 Kevin Ollivier <kevino (at) theolliviers.com>
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      7  * 1. Redistributions of source code must retain the above copyright
      8  *    notice, this list of conditions and the following disclaimer.
      9  * 2. Redistributions in binary form must reproduce the above copyright
     10  *    notice, this list of conditions and the following disclaimer in the
     11  *    documentation and/or other materials provided with the distribution.
     12  *
     13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
     14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
     17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
     21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     24  */
     25 
     26 #include "config.h"
     27 #include "FontPlatformData.h"
     28 
     29 #include "FontDescription.h"
     30 #include "PlatformString.h"
     31 #include <wx/defs.h>
     32 #include <wx/gdicmn.h>
     33 #include <wx/font.h>
     34 
     35 namespace WebCore {
     36 
     37 static wxFontFamily fontFamilyToWxFontFamily(const int family)
     38 {
     39     switch (family) {
     40         case FontDescription::StandardFamily:
     41             return wxFONTFAMILY_DEFAULT;
     42         case FontDescription::SerifFamily:
     43             return wxFONTFAMILY_ROMAN;
     44         case FontDescription::SansSerifFamily:
     45             return wxFONTFAMILY_MODERN;
     46         case FontDescription::MonospaceFamily:
     47             return wxFONTFAMILY_TELETYPE; // TODO: Check these are equivalent
     48         case FontDescription::CursiveFamily:
     49             return wxFONTFAMILY_SCRIPT;
     50         case FontDescription::FantasyFamily:
     51             return wxFONTFAMILY_DECORATIVE;
     52         default:
     53             return wxFONTFAMILY_DEFAULT;
     54     }
     55 }
     56 
     57 static wxFontWeight fontWeightToWxFontWeight(FontWeight weight)
     58 {
     59     if (weight >= FontWeight600)
     60         return wxFONTWEIGHT_BOLD;
     61 
     62     if (weight <= FontWeight300)
     63         return wxFONTWEIGHT_LIGHT;
     64 
     65     return wxFONTWEIGHT_NORMAL;
     66 }
     67 
     68 static int italicToWxFontStyle(bool isItalic)
     69 {
     70     if (isItalic)
     71         return wxFONTSTYLE_ITALIC;
     72 
     73     return wxFONTSTYLE_NORMAL;
     74 }
     75 
     76 FontPlatformData::FontPlatformData(const FontDescription& desc, const AtomicString& family)
     77 {
     78 // NB: The Windows wxFont constructor has two forms, one taking a wxSize (with pixels)
     79 // and one taking an int (points). When points are used, Windows calculates
     80 // a pixel size using an algorithm which causes the size to be way off. However,
     81 // this is a moot issue on Linux and Mac as they only accept the point argument. So,
     82 // we use the pixel size constructor on Windows, but we use point size on Linux and Mac.
     83 #if __WXMSW__
     84     m_font = adoptRef(new FontHolder(new wxFont(   wxSize(0, -desc.computedPixelSize()),
     85                                 fontFamilyToWxFontFamily(desc.genericFamily()),
     86                                 italicToWxFontStyle(desc.italic()),
     87                                 fontWeightToWxFontWeight(desc.weight()),
     88                                 false,
     89                                 family.string()
     90                             )
     91                         ));
     92 #else
     93     m_font = adoptRef(new FontHolder(new wxFont(   desc.computedPixelSize(),
     94                                 fontFamilyToWxFontFamily(desc.genericFamily()),
     95                                 italicToWxFontStyle(desc.italic()),
     96                                 fontWeightToWxFontWeight(desc.weight()),
     97                                 false,
     98                                 family.string()
     99                             )
    100                         ));
    101 #endif
    102 #if OS(DARWIN)
    103 #if !wxOSX_USE_CORE_TEXT
    104 #if wxCHECK_VERSION(2,9,0)
    105     m_atsuFontID = m_font->font()->OSXGetATSUFontID();
    106 #else
    107     m_atsuFontID = m_font->font()->MacGetATSUFontID();
    108 #endif
    109 #endif
    110     m_nsFont = 0;
    111     cacheNSFont();
    112 #endif
    113     m_size = desc.computedPixelSize();
    114     m_fontState = VALID;
    115     m_size = desc.computedPixelSize();
    116 }
    117 
    118 unsigned FontPlatformData::computeHash() const
    119 {
    120     wxFont* thisFont = m_font->font();
    121     ASSERT(thisFont && thisFont->IsOk());
    122 
    123     // make a hash that is unique for this font, but not globally unique - that is,
    124     // a font whose properties are equal should generate the same hash
    125     uintptr_t hashCodes[6] = {
    126         thisFont->GetPointSize(),
    127         thisFont->GetFamily(),
    128         thisFont->GetStyle(),
    129         thisFont->GetWeight(),
    130         thisFont->GetUnderlined(),
    131         StringHasher::computeHash(thisFont->GetFaceName().utf8_str().data())
    132     };
    133 
    134     return StringHasher::hashMemory<sizeof(hashCodes)>(hashCodes);
    135 }
    136 
    137 FontPlatformData::~FontPlatformData()
    138 {
    139     m_fontState = UNINITIALIZED;
    140     m_font = 0;
    141 }
    142 
    143 #ifndef NDEBUG
    144 String FontPlatformData::description() const
    145 {
    146     return String();
    147 }
    148 #endif
    149 
    150 #if OS(WINDOWS)
    151 bool FontPlatformData::useGDI() const
    152 {
    153     return true;
    154 }
    155 
    156 HFONT FontPlatformData::hfont() const
    157 {
    158     return static_cast<HFONT>(m_font->font()->GetHFONT());
    159 }
    160 #endif
    161 
    162 #if OS(DARWIN)
    163 CGFontRef FontPlatformData::cgFont() const
    164 {
    165     CGFontRef cgFont = 0;
    166 #ifdef wxOSX_USE_CORE_TEXT && wxOSX_USE_CORE_TEXT
    167     cgFont = CTFontCopyGraphicsFont((CTFontRef)m_font->font()->OSXGetCTFont(), 0);
    168 #else
    169     ATSFontRef fontRef;
    170 
    171     fontRef = FMGetATSFontRefFromFont(m_atsuFontID);
    172 
    173     if (fontRef)
    174         cgFont = CGFontCreateWithPlatformFont((void*)&fontRef);
    175 #endif
    176     return cgFont;
    177 }
    178 #endif
    179 
    180 
    181 
    182 }
    183