diff options
| author | Manolo Gouy <Manolo> | 2013-10-29 12:46:51 +0000 |
|---|---|---|
| committer | Manolo Gouy <Manolo> | 2013-10-29 12:46:51 +0000 |
| commit | 1ad6b09de74731f6f639bb879d51ce14ff7a2878 (patch) | |
| tree | 37c90840144b73389919b4e292934d96d9670431 /src | |
| parent | f9470425359e8180ebe73f9585a4f27531f72839 (diff) | |
Fix mac-specific STR#2999. Use PostScript font name to ask the system for a font, and full font name
to display a font name.
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@10011 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'src')
| -rw-r--r-- | src/Fl_Font.H | 1 | ||||
| -rw-r--r-- | src/Fl_cocoa.mm | 1 | ||||
| -rw-r--r-- | src/fl_font_mac.cxx | 74 | ||||
| -rw-r--r-- | src/fl_set_fonts_mac.cxx | 23 |
4 files changed, 68 insertions, 31 deletions
diff --git a/src/Fl_Font.H b/src/Fl_Font.H index 5adc89ed9..13c6c1d4c 100644 --- a/src/Fl_Font.H +++ b/src/Fl_Font.H @@ -60,7 +60,6 @@ public: # endif ATSUStyle style; short ascent, descent, q_width; - char *q_name; # elif USE_XFT XftFont* font; //const char* encoding; diff --git a/src/Fl_cocoa.mm b/src/Fl_cocoa.mm index c39b264b9..8033120ca 100644 --- a/src/Fl_cocoa.mm +++ b/src/Fl_cocoa.mm @@ -104,6 +104,7 @@ Window fl_window; Fl_Window *Fl_Window::current_; int fl_mac_os_version = calc_mac_os_version(); // the version number of the running Mac OS X (e.g., 100604 for 10.6.4) static SEL inputContextSEL = (fl_mac_os_version >= 100600 ? @selector(inputContext) : @selector(FLinputContext)); +Fl_Fontdesc* fl_fonts = Fl_X::calc_fl_fonts(); // forward declarations of variables in this file static int got_events = 0; diff --git a/src/fl_font_mac.cxx b/src/fl_font_mac.cxx index 59f9291c1..4af8b220f 100644 --- a/src/fl_font_mac.cxx +++ b/src/fl_font_mac.cxx @@ -26,6 +26,8 @@ static CGAffineTransform font_mx = { 1, 0, 0, -1, 0, 0 }; static CFMutableDictionaryRef attributes = NULL; #endif +const int Fl_X::CoreText_threshold = 100500; // this represents Mac OS 10.5 + Fl_Font_Descriptor::Fl_Font_Descriptor(const char* name, Fl_Fontsize Size) { next = 0; # if HAVE_GL @@ -34,10 +36,9 @@ Fl_Font_Descriptor::Fl_Font_Descriptor(const char* name, Fl_Fontsize Size) { // knowWidths = 0; // OpenGL needs those for its font handling - q_name = strdup(name); size = Size; #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 -if (fl_mac_os_version >= 100500) {//unfortunately, CTFontCreateWithName != NULL on 10.4 also! +if (fl_mac_os_version >= Fl_X::CoreText_threshold) { CFStringRef str = CFStringCreateWithCString(NULL, name, kCFStringEncodingUTF8); fontref = CTFontCreateWithName(str, size, NULL); CGGlyph glyph[2]; @@ -115,9 +116,12 @@ else { // render our font up-side-down, so when rendered through our inverted CGContext, // text will appear normal again. Fixed fsize = IntToFixed(Size); -// ATSUFontID fontID = FMGetFontFromATSFontRef(font); +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7 ATSUFontID fontID; ATSUFindFontFromName(name, strlen(name), kFontFullName, kFontMacintoshPlatform, kFontRomanScript, kFontEnglishLanguage, &fontID); +#else + ATSUFontID fontID = FMGetFontFromATSFontRef(font); +#endif // draw the font upside-down... Compensate for fltk/OSX origin differences ATSUAttributeTag sTag[] = { kATSUFontTag, kATSUSizeTag, kATSUFontMatrixTag }; @@ -176,7 +180,7 @@ Fl_Font_Descriptor::~Fl_Font_Descriptor() { */ if (this == fl_graphics_driver->font_descriptor()) fl_graphics_driver->font_descriptor(NULL); #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 - if (fl_mac_os_version >= 100500) { + if (fl_mac_os_version >= Fl_X::CoreText_threshold) { CFRelease(fontref); for (unsigned i = 0; i < sizeof(width)/sizeof(float*); i++) { if (width[i]) free(width[i]); @@ -187,23 +191,42 @@ Fl_Font_Descriptor::~Fl_Font_Descriptor() { //////////////////////////////////////////////////////////////// -static Fl_Fontdesc built_in_table[] = { -{"Arial"}, -{"Arial Bold"}, -{"Arial Italic"}, -{"Arial Bold Italic"}, -{"Courier New"}, -{"Courier New Bold"}, -{"Courier New Italic"}, -{"Courier New Bold Italic"}, -{"Times New Roman"}, -{"Times New Roman Bold"}, -{"Times New Roman Italic"}, -{"Times New Roman Bold Italic"}, +static Fl_Fontdesc built_in_table_PS[] = { // PostScript font names preferred when Mac OS ≥ 10.5 +{"ArialMT"}, +{"Arial-BoldMT"}, +{"Arial-ItalicMT"}, +{"Arial-BoldItalicMT"}, +{"CourierNewPSMT"}, +{"CourierNewPS-BoldMT"}, +{"CourierNewPS-ItalicMT"}, +{"CourierNewPS-BoldItalicMT"}, +{"TimesNewRomanPSMT"}, +{"TimesNewRomanPS-BoldMT"}, +{"TimesNewRomanPS-ItalicMT"}, +{"TimesNewRomanPS-BoldItalicMT"}, {"Symbol"}, {"Monaco"}, -{"Andale Mono"}, // there is no bold Monaco font on standard Mac -{"Webdings"}, +{"AndaleMono"}, // there is no bold Monaco font on standard Mac +{"ZapfDingbatsITC"} +}; + +static Fl_Fontdesc built_in_table_full[] = { // full font names used before 10.5 + {"Arial"}, + {"Arial Bold"}, + {"Arial Italic"}, + {"Arial Bold Italic"}, + {"Courier New"}, + {"Courier New Bold"}, + {"Courier New Italic"}, + {"Courier New Bold Italic"}, + {"Times New Roman"}, + {"Times New Roman Bold"}, + {"Times New Roman Italic"}, + {"Times New Roman Bold Italic"}, + {"Symbol"}, + {"Monaco"}, + {"Andale Mono"}, // there is no bold Monaco font on standard Mac + {"Webdings"} }; static UniChar *utfWbuf = 0; @@ -223,7 +246,10 @@ static UniChar *mac_Utf8_to_Utf16(const char *txt, int len, int *new_len) return utfWbuf; } // mac_Utf8_to_Utf16 -Fl_Fontdesc* fl_fonts = built_in_table; +Fl_Fontdesc* Fl_X::calc_fl_fonts(void) +{ + return (fl_mac_os_version >= Fl_X::CoreText_threshold ? built_in_table_PS : built_in_table_full); +} static Fl_Font_Descriptor* find(Fl_Font fnum, Fl_Fontsize size) { Fl_Fontdesc* s = fl_fonts+fnum; @@ -287,7 +313,7 @@ static CGFloat surrogate_width(const UniChar *txt, Fl_Font_Descriptor *fl_fontsi static double fl_mac_width(const UniChar* txt, int n, Fl_Font_Descriptor *fl_fontsize) { #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 -if (fl_mac_os_version >= 100500) { +if (fl_mac_os_version >= Fl_X::CoreText_threshold) { double retval = 0; UniChar uni; int i; @@ -302,7 +328,7 @@ if (fl_mac_os_version >= 100500) { // r: index of the character block containing uni unsigned int r = uni >> 7; // change 7 if sizeof(width) is changed if (!fl_fontsize->width[r]) { // this character block has not been hit yet - //fprintf(stderr,"r=%d size=%d name=%s\n",r,fl_fontsize->size, fl_fontsize->q_name); + //fprintf(stderr,"r=%d size=%d name=%s\n",r,fl_fontsize->size,fl_fonts[fl_font()].name); // allocate memory to hold width of each character in the block fl_fontsize->width[r] = (float*) malloc(sizeof(float) * block); UniChar ii = r * block; @@ -406,7 +432,7 @@ void Fl_Quartz_Graphics_Driver::text_extents(const char *str8, int n, int &dx, i Fl_Font_Descriptor *fl_fontsize = font_descriptor(); UniChar *txt = mac_Utf8_to_Utf16(str8, n, &n); #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 -if (fl_mac_os_version >= 100500) { +if (fl_mac_os_version >= Fl_X::CoreText_threshold) { CFStringRef str16 = CFStringCreateWithCharactersNoCopy(NULL, txt, n, kCFAllocatorNull); CFDictionarySetValue (attributes, kCTFontAttributeName, fl_fontsize->fontref); CFAttributedStringRef mastr = CFAttributedStringCreate(kCFAllocatorDefault, str16, attributes); @@ -474,7 +500,7 @@ static void fl_mac_draw(const char *str, int n, float x, float y, Fl_Graphics_Dr // convert to UTF-16 first UniChar *uniStr = mac_Utf8_to_Utf16(str, n, &n); #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 - if (fl_mac_os_version >= 100500) { + if (fl_mac_os_version >= Fl_X::CoreText_threshold) { CFStringRef str16 = CFStringCreateWithCharactersNoCopy(NULL, uniStr, n, kCFAllocatorNull); if (str16 == NULL) return; // shd not happen CGColorRef color = flcolortocgcolor(driver->color()); diff --git a/src/fl_set_fonts_mac.cxx b/src/fl_set_fonts_mac.cxx index 18e14dd0d..52b4a2910 100644 --- a/src/fl_set_fonts_mac.cxx +++ b/src/fl_set_fonts_mac.cxx @@ -29,15 +29,27 @@ // making the name, and then forgot about it. To avoid having to change // the header files I decided to store this value in the last character // of the font name array. -#define ENDOFBUFFER 127 // sizeof(Fl_Font.fontname)-1 +#define ENDOFBUFFER sizeof(fl_fonts->fontname)-1 // turn a stored font name into a pretty name: const char* Fl::get_font_name(Fl_Font fnum, int* ap) { Fl_Fontdesc *f = fl_fonts + fnum; if (!f->fontname[0]) { +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 + if (fl_mac_os_version >= Fl_X::CoreText_threshold) { + CFStringRef cfname = CFStringCreateWithCString(NULL, f->name, kCFStringEncodingUTF8); + CTFontRef ctfont = CTFontCreateWithName(cfname, 0, NULL); + CFRelease(cfname); + cfname = CTFontCopyFullName(ctfont); + CFRelease(ctfont); + CFStringGetCString(cfname, f->fontname, ENDOFBUFFER, kCFStringEncodingUTF8); + CFRelease(cfname); + } + else +#endif + strlcpy(f->fontname, f->name, ENDOFBUFFER); const char* p = f->name; if (!p || !*p) {if (ap) *ap = 0; return "";} - strlcpy(f->fontname, p, ENDOFBUFFER); int type = 0; if (strstr(f->name, "Bold")) type |= FL_BOLD; if (strstr(f->name, "Italic")) type |= FL_ITALIC; @@ -61,8 +73,7 @@ Fl_Font Fl::set_fonts(const char* xstarname) { if (fl_free_font > FL_FREE_FONT) return (Fl_Font)fl_free_font; // if already called #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 -if(fl_mac_os_version >= 100500) { -//if(CTFontCreateWithFontDescriptor != NULL) {// CTFontCreateWithFontDescriptor != NULL on 10.4 also! +if(fl_mac_os_version >= Fl_X::CoreText_threshold) { int value[1] = {1}; CFDictionaryRef dict = CFDictionaryCreate(NULL, (const void **)kCTFontCollectionRemoveDuplicatesOption, @@ -77,9 +88,9 @@ if(fl_mac_os_version >= 100500) { for (i = 0; i < count; i++) { CTFontDescriptorRef fdesc = (CTFontDescriptorRef)CFArrayGetValueAtIndex(arrayref, i); CTFontRef font = CTFontCreateWithFontDescriptor(fdesc, 0., NULL); - CFStringRef cfname = CTFontCopyFullName(font); + CFStringRef cfname = CTFontCopyPostScriptName(font); CFRelease(font); - static char fname[100]; + static char fname[200]; CFStringGetCString(cfname, fname, sizeof(fname), kCFStringEncodingUTF8); tabfontnames[i] = strdup(fname); // never free'ed CFRelease(cfname); |
