X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/d607b96bc2824116a8fe0e5840ce49da7ce4514f..d8c2fa787973fc6d0d8c3693b97ddbba622ca41f:/src/nsfont.m diff --git a/src/nsfont.m b/src/nsfont.m index b389875886..3720e9a461 100644 --- a/src/nsfont.m +++ b/src/nsfont.m @@ -1,6 +1,6 @@ /* Font back-end driver for the NeXT/Open/GNUstep and MacOSX window system. See font.h - Copyright (C) 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. + Copyright (C) 2006-2011 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -48,10 +48,8 @@ Author: Adrian Robert (arobert@cogsci.ucsd.edu) extern Lisp_Object Qns; extern Lisp_Object Qnormal, Qbold, Qitalic, Qcondensed, Qexpanded; -static Lisp_Object Vns_reg_to_script; static Lisp_Object Qapple, Qroman, Qmedium; extern Lisp_Object Qappend; -extern Lisp_Object ns_antialias_text; extern float ns_antialias_threshold; extern int ns_tmp_flags; extern struct nsfont_info *ns_tmp_font; @@ -102,11 +100,11 @@ ns_get_family (Lisp_Object font_spec) return nil; else { - char *tmp = strdup (SDATA (SYMBOL_NAME (tem))); + char *tmp = xstrdup (SDATA (SYMBOL_NAME (tem))); NSString *family; ns_unescape_name (tmp); family = [NSString stringWithUTF8String: tmp]; - free (tmp); + xfree (tmp); return family; } } @@ -178,7 +176,7 @@ ns_descriptor_to_entity (NSFontDescriptor *desc, if (family == nil) family = [[NSFont userFixedPitchFontOfSize: 0] familyName]; - escapedFamily = strdup ([family UTF8String]); + escapedFamily = xstrdup ([family UTF8String]); ns_escape_name (escapedFamily); ASET (font_entity, FONT_TYPE_INDEX, Qns); @@ -219,7 +217,7 @@ ns_descriptor_to_entity (NSFontDescriptor *desc, debug_print (font_entity); } - free (escapedFamily); + xfree (escapedFamily); return font_entity; } @@ -811,6 +809,14 @@ nsfont_open (FRAME_PTR f, Lisp_Object font_entity, int pixel_size) const char *fontName = [[nsfont fontName] UTF8String]; int len = strlen (fontName); + /* The values specified by fonts are not always exact. For + * example, a 6x8 font could specify that the descender is + * -2.00000405... (represented by 0xc000000220000000). Without + * adjustment, the code below would round the descender to -3, + * resulting in a font that would be one pixel higher than + * intended. */ + CGFloat adjusted_descender = [sfont descender] + 0.0001; + #ifdef NS_IMPL_GNUSTEP font_info->nsfont = sfont; #else @@ -832,14 +838,14 @@ nsfont_open (FRAME_PTR f, Lisp_Object font_entity, int pixel_size) brect = [sfont boundingRectForFont]; full_height = brect.size.height; - min_height = [sfont ascender] - [sfont descender]; + min_height = [sfont ascender] - adjusted_descender; hd = full_height - min_height; /* standard height, similar to Carbon. Emacs.app: was 0.5 by default. */ expand = 0.0; hshrink = 1.0; - font_info->underpos = 2; /*[sfont underlinePosition] is often clipped out */ + font_info->underpos = [sfont underlinePosition]; font_info->underwidth = [sfont underlineThickness]; font_info->size = font->pixel_size; font_info->voffset = lrint (hshrink * [sfont ascender] + expand * hd / 2); @@ -847,10 +853,10 @@ nsfont_open (FRAME_PTR f, Lisp_Object font_entity, int pixel_size) /* max bounds */ font_info->max_bounds.ascent = lrint (hshrink * [sfont ascender] + expand * hd/2); - /* [sfont descender] is usually negative. Use floor to avoid + /* Descender is usually negative. Use floor to avoid clipping descenders. */ font_info->max_bounds.descent = - -lrint (floor(hshrink* [sfont descender] - expand*hd/2)); + -lrint (floor(hshrink* adjusted_descender - expand*hd/2)); font_info->height = font_info->max_bounds.ascent + font_info->max_bounds.descent; font_info->max_bounds.width = lrint (font_info->width); @@ -886,7 +892,7 @@ nsfont_open (FRAME_PTR f, Lisp_Object font_entity, int pixel_size) /* set up metrics portion of font struct */ font->ascent = lrint([sfont ascender]); - font->descent = -lrint(floor([sfont descender])); + font->descent = -lrint(floor(adjusted_descender)); font->min_width = ns_char_width(sfont, '|'); font->space_width = lrint (ns_char_width (sfont, ' ')); font->average_width = lrint (font_info->width); @@ -1190,20 +1196,7 @@ nsfont_draw (struct glyph_string *s, int from, int to, int x, int y, /*[context GSSetTextDrawingMode: GSTextFill]; /// not implemented yet */ } - /* do underline */ - if (face->underline_p) - { - if (face->underline_color != 0) - [ns_lookup_indexed_color (face->underline_color, s->f) set]; - else - [col set]; - DPSmoveto (context, r.origin.x, r.origin.y + font->underpos); - DPSlineto (context, r.origin.x+r.size.width, r.origin.y+font->underpos); - if (face->underline_color != 0) - [col set]; - } - else - [col set]; + [col set]; /* draw with DPSxshow () */ DPSmoveto (context, r.origin.x, r.origin.y); @@ -1249,23 +1242,7 @@ nsfont_draw (struct glyph_string *s, int from, int to, int x, int y, CGContextSetTextDrawingMode (gcontext, kCGTextFill); } - if (face->underline_p) - { - if (face->underline_color != 0) - [ns_lookup_indexed_color (face->underline_color, s->f) set]; - else - [col set]; - CGContextBeginPath (gcontext); - CGContextMoveToPoint (gcontext, - r.origin.x, r.origin.y + font->underpos); - CGContextAddLineToPoint (gcontext, r.origin.x + r.size.width, - r.origin.y + font->underpos); - CGContextStrokePath (gcontext); - if (face->underline_color != 0) - [col set]; - } - else - [col set]; + [col set]; CGContextSetTextPosition (gcontext, r.origin.x, r.origin.y); CGContextShowGlyphsWithAdvances (gcontext, s->char2b + s->cmp_from, @@ -1281,6 +1258,10 @@ nsfont_draw (struct glyph_string *s, int from, int to, int x, int y, CGContextRestoreGState (gcontext); } #endif /* NS_IMPL_COCOA */ + + /* Draw underline, overline, strike-through. */ + ns_draw_text_decoration (s, face, col, r.size.width, r.origin.x); + return to-from; } @@ -1517,8 +1498,6 @@ syms_of_nsfont (void) DEFSYM (Qapple, "apple"); DEFSYM (Qroman, "roman"); DEFSYM (Qmedium, "medium"); - DEFVAR_LISP ("ns-reg-to-script", &Vns_reg_to_script, + DEFVAR_LISP ("ns-reg-to-script", Vns_reg_to_script, doc: /* Internal use: maps font registry to unicode script. */); } - -// arch-tag: d6c3c6f0-62de-4978-8b1e-b7966fe02cae