blob: efc43e51f8fc8c08ffe3fa5955bb7ba5fc60f01a [file] [log] [blame]
/*
* Copyright (C) 2010 Kevin Ollivier, Stefan Csomor All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "config.h"
#include "FontPlatformData.h"
#include <wtf/MathExtras.h>
#include <wx/defs.h>
#include <wx/font.h>
#include <wx/fontutil.h>
#if !wxCHECK_VERSION(2,9,0)
#include <wx/mac/private.h>
#else
#include <wx/osx/private.h>
#endif
#if !wxCHECK_VERSION(2,9,0) || !wxOSX_USE_COCOA
static const NSAffineTransformStruct kSlantNSTransformStruct = { 1, 0, tan(deg2rad(11)), 1, 0, 0 };
NSFont* OSXCreateNSFont(const wxNativeFontInfo* info)
{
NSFont* nsFont;
int weight = 5;
NSFontTraitMask traits = 0;
if (info->GetWeight() == wxFONTWEIGHT_BOLD)
{
traits |= NSBoldFontMask;
weight = 9;
}
else if (info->GetWeight() == wxFONTWEIGHT_LIGHT)
weight = 3;
if (info->GetStyle() == wxFONTSTYLE_ITALIC || info->GetStyle() == wxFONTSTYLE_SLANT)
traits |= NSItalicFontMask;
nsFont = [[NSFontManager sharedFontManager] fontWithFamily:(NSString*)(CFStringRef)wxMacCFStringHolder(info->GetFaceName())
traits:traits weight:weight size:info->GetPointSize()];
if ( nsFont == nil )
{
NSFontTraitMask remainingTraits = traits;
nsFont = [[NSFontManager sharedFontManager] fontWithFamily:(NSString*)(CFStringRef)wxMacCFStringHolder(info->GetFaceName())
traits:0 weight:5 size:info->GetPointSize()];
if ( nsFont == nil )
{
if ( info->GetWeight() == wxFONTWEIGHT_BOLD )
{
nsFont = [NSFont boldSystemFontOfSize:info->GetPointSize()];
remainingTraits &= ~NSBoldFontMask;
}
else
nsFont = [NSFont systemFontOfSize:info->GetPointSize()];
}
// fallback - if in doubt, let go of the bold attribute
if ( nsFont && (remainingTraits & NSItalicFontMask) )
{
NSFont* nsFontWithTraits = nil;
if ( remainingTraits & NSBoldFontMask)
{
nsFontWithTraits = [[NSFontManager sharedFontManager] convertFont:nsFont toHaveTrait:NSBoldFontMask];
if ( nsFontWithTraits == nil )
{
nsFontWithTraits = [[NSFontManager sharedFontManager] convertFont:nsFont toHaveTrait:NSItalicFontMask];
if ( nsFontWithTraits != nil )
remainingTraits &= ~NSItalicFontMask;
}
else
{
remainingTraits &= ~NSBoldFontMask;
}
}
if ( remainingTraits & NSItalicFontMask)
{
if ( nsFontWithTraits == nil )
nsFontWithTraits = nsFont;
NSAffineTransform* transform = [NSAffineTransform transform];
[transform setTransformStruct:kSlantNSTransformStruct];
[transform scaleBy:info->GetPointSize()];
NSFontDescriptor* italicDesc = [[nsFontWithTraits fontDescriptor] fontDescriptorWithMatrix:transform];
if ( italicDesc != nil )
{
NSFont* f = [NSFont fontWithDescriptor:italicDesc size:(CGFloat)(info->GetPointSize())];
if ( f != nil )
nsFontWithTraits = f;
}
}
if ( nsFontWithTraits != nil )
nsFont = nsFontWithTraits;
}
}
wxASSERT_MSG(nsFont != nil,wxT("Couldn't create nsFont")) ;
wxMacCocoaRetain(nsFont);
return nsFont;
}
#endif
namespace WebCore {
void FontPlatformData::cacheNSFont()
{
if (m_nsFont)
return;
#if wxCHECK_VERSION(2,9,1) && wxOSX_USE_COCOA
if (m_font && m_font->font())
m_nsFont = (NSFont*)m_font->font()->OSXGetNSFont();
#else
m_nsFont = OSXCreateNSFont(m_font->font()->GetNativeFontInfo());
#endif
}
}