18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2007 Kevin Ollivier <kevino@theolliviers.com> 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 265f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "config.h" 278a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block// this needs to be included before fontprops.h for UChar* to be defined. 288a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block#include <wtf/unicode/Unicode.h> 298a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block 305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "fontprops.h" 3121939df44de1705786c545cd1bf519d47250322dBen Murdoch#include "WebCoreSystemInterface.h" 325f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <ApplicationServices/ApplicationServices.h> 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wx/defs.h> 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wx/gdicmn.h> 37cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block#include <wx/graphics.h> 385f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst float smallCapsFontSizeMultiplier = 0.7f; 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst float contextDPI = 72.0f; 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic inline float scaleEmToUnits(float x, unsigned unitsPerEm) { return x * (contextDPI / (contextDPI * unitsPerEm)); } 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectwxFontProperties::wxFontProperties(wxFont* font): 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectm_ascent(0), m_descent(0), m_lineGap(0), m_lineSpacing(0), m_xHeight(0) 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CGFontRef cgFont; 478f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 488f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#ifdef wxOSX_USE_CORE_TEXT && wxOSX_USE_CORE_TEXT 495f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian cgFont = CTFontCopyGraphicsFont((CTFontRef)font->OSXGetCTFont(), NULL); 508f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#else 518f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ATSFontRef fontRef; 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project fontRef = FMGetATSFontRefFromFont(font->MacGetATSUFontID()); 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (fontRef) 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project cgFont = CGFontCreateWithPlatformFont((void*)&fontRef); 578f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif 588f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (cgFont) { 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int iAscent; 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int iDescent; 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int iLineGap; 635f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian unsigned unitsPerEm; 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef BUILDING_ON_TIGER 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wkGetFontMetrics(cgFont, &iAscent, &iDescent, &iLineGap, &unitsPerEm); 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project iAscent = CGFontGetAscent(cgFont); 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project iDescent = CGFontGetDescent(cgFont); 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project iLineGap = CGFontGetLeading(cgFont); 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unitsPerEm = CGFontGetUnitsPerEm(cgFont); 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project float pointSize = font->GetPointSize(); 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project float fAscent = scaleEmToUnits(iAscent, unitsPerEm) * pointSize; 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project float fDescent = -scaleEmToUnits(iDescent, unitsPerEm) * pointSize; 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project float fLineGap = scaleEmToUnits(iLineGap, unitsPerEm) * pointSize; 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_ascent = lroundf(fAscent); 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_descent = lroundf(fDescent); 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_lineGap = lroundf(fLineGap); 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wxCoord xHeight = 0; 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GetTextExtent(*font, wxT("x"), NULL, &xHeight, NULL, NULL); 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_xHeight = lroundf(xHeight); 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_lineSpacing = m_ascent + m_descent + m_lineGap; 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 865f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 875f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (cgFont) 885f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian CGFontRelease(cgFont); 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9221939df44de1705786c545cd1bf519d47250322dBen Murdochbool wxFontContainsCharacters(void* font, const UChar* characters, int length) 938a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block{ 948a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block NSString* string = [[NSString alloc] initWithCharactersNoCopy:const_cast<unichar*>(characters) length:length freeWhenDone:NO]; 9521939df44de1705786c545cd1bf519d47250322dBen Murdoch NSCharacterSet* set = [[(NSFont*)font coveredCharacterSet] invertedSet]; 968a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block bool result = set && [string rangeOfCharacterFromSet:set].location == NSNotFound; 978a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block [string release]; 988a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block return result; 998a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block} 1008a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid GetTextExtent( const wxFont& font, const wxString& str, wxCoord *width, wxCoord *height, 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wxCoord *descent, wxCoord *externalLeading ) 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 104cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block wxGraphicsContext * const gc = wxGraphicsContext::Create(); 10521939df44de1705786c545cd1bf519d47250322dBen Murdoch 106cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block gc->SetFont(font, *wxBLACK); // colour doesn't matter but must be specified 107cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block struct GCTextExtent 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 109cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block wxDouble width, height, descent, externalLeading; 110cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block } e; 111cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block gc->GetTextExtent(str, &e.width, &e.height, &e.descent, &e.externalLeading); 112cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if ( width ) 113cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block *width = wxCoord(e.width + .5); 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( height ) 115cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block *height = wxCoord(e.height + .5); 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( descent ) 117cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block *descent = wxCoord(e.descent + .5); 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( externalLeading ) 119cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block *externalLeading = wxCoord(e.externalLeading + .5); 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 121cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block delete gc; 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 123