void FontPlatformData::platformDataInit(HFONT font, float size, HDC hdc, WCHAR* faceName) { // Try the face name first. Windows may end up localizing this name, and CG doesn't know about // the localization. If the create fails, we'll try the PostScript name. RetainPtr<CFStringRef> fullName(AdoptCF, CFStringCreateWithCharacters(NULL, (const UniChar*)faceName, wcslen(faceName))); m_cgFont.adoptCF(CGFontCreateWithFontName(fullName.get())); if (!m_cgFont) { CFStringRef postScriptName = getPostScriptName(fullName.get(), hdc); if (postScriptName) { m_cgFont.adoptCF(CGFontCreateWithFontName(postScriptName)); ASSERT(m_cgFont); } } }
void load(XFont *f) { int i, j; CGFontRef font; CFStringRef s; UniChar u[256]; CGGlyph g[256]; CGRect bbox; if(f->loaded) return; f->loaded = 1; s = c2mac(f->name); font = CGFontCreateWithFontName(s); CFRelease(s); if(font == nil) return; // assume bbox gives latin1 is height/ascent for all bbox = subfontbbox(font, 0x00, 0xff); f->unit = CGFontGetUnitsPerEm(font); f->height = bbox.size.height; f->originy = bbox.origin.y; // figure out where the letters are for(i=0; i<0xffff; i+=0x100) { for(j=0; j<0x100; j++) { u[j] = mapUnicode(i+j); g[j] = 0; } CGFontGetGlyphsForUnichars(font, u, g, 256); for(j=0; j<0x100; j++) { if(g[j] != 0) { f->range[i>>8] = 1; f->nrange++; break; } } }
FontFace::FontFace( const std::string &faceName ) { #if defined( CAIRO_HAS_QUARTZ_FONT ) CFStringRef nameRef = CFStringCreateWithCString( kCFAllocatorDefault, faceName.c_str(), kCFStringEncodingUTF8 ); CGFontRef fontRef = CGFontCreateWithFontName( nameRef ); if( ! fontRef ) throw; mCairoFontFace = cairo_quartz_font_face_create_for_cgfont( fontRef ); // Cairo releases the CGFontRef CFRelease( nameRef ); #elif defined( CINDER_MSW ) HFONT hf; HDC hdc; long lfHeight; hdc = ::GetDC( NULL ); lfHeight = -MulDiv(12, GetDeviceCaps(hdc, LOGPIXELSY), 72); ReleaseDC( NULL, hdc ); hf = CreateFontA( lfHeight, 0, 0, 0, 0, TRUE, 0, 0, 0, 0, 0, 0, 0, faceName.c_str() ); mCairoFontFace = cairo_win32_font_face_create_for_hfont( hf ); #endif }