X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/d125ca15f3751f36a1ec49e3d9f9de1735b43698..85a83ea09dd2440187945ed4bb5f3f6fcebb9a71:/src/nsfont.m?ds=sidebyside diff --git a/src/nsfont.m b/src/nsfont.m index 2ba38b7570..ebee363651 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-2012 Free Software Foundation, Inc. + Copyright (C) 2006-2013 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -44,6 +44,7 @@ Author: Adrian Robert (arobert@cogsci.ucsd.edu) #endif #define NSFONT_TRACE 0 +#define LCD_SMOOTHING_MARGIN 2 extern Lisp_Object Qns; extern Lisp_Object Qnormal, Qbold, Qitalic; @@ -74,10 +75,9 @@ static void ns_glyph_metrics (struct nsfont_info *font_info, static void ns_escape_name (char *name) { - int i =0, len =strlen (name); - for ( ; i 0) - matchingDescs = [fdesc matchingFontDescriptorsWithMandatoryKeys: fkeys]; - else - matchingDescs = [NSMutableArray array]; + matchingDescs = [fdesc matchingFontDescriptorsWithMandatoryKeys: fkeys]; if (NSFONT_TRACE) NSLog(@"Got desc %@ and found %d matching fonts from it: ", fdesc, @@ -598,6 +595,8 @@ ns_findfonts (Lisp_Object font_spec, BOOL isMatch) [s1 release]; } + unblock_input (); + /* Return something if was a match and nothing found. */ if (isMatch) return ns_fallback_entity (); @@ -701,10 +700,12 @@ static Lisp_Object nsfont_list_family (Lisp_Object frame) { Lisp_Object list = Qnil; - NSEnumerator *families = - [[[NSFontManager sharedFontManager] availableFontFamilies] - objectEnumerator]; + NSEnumerator *families; NSString *family; + + block_input (); + families = [[[NSFontManager sharedFontManager] availableFontFamilies] + objectEnumerator]; while ((family = [families nextObject])) list = Fcons (intern ([family UTF8String]), list); /* FIXME: escape the name? */ @@ -713,6 +714,7 @@ nsfont_list_family (Lisp_Object frame) fprintf (stderr, "nsfont: list families returning %"pI"d entries\n", XINT (Flength (list))); + unblock_input (); return list; } @@ -735,6 +737,8 @@ nsfont_open (FRAME_PTR f, Lisp_Object font_entity, int pixel_size) Lisp_Object font_object; int fixLeopardBug; + block_input (); + if (NSFONT_TRACE) { fprintf (stderr, "nsfont: open size %d of fontentity:\n ", pixel_size); @@ -794,13 +798,14 @@ nsfont_open (FRAME_PTR f, Lisp_Object font_entity, int pixel_size) font_info = (struct nsfont_info *) XFONT_OBJECT (font_object); font = (struct font *) font_info; if (!font) - return Qnil; /* FIXME: other terms do, but return Qnil causes segfault */ + { + unblock_input (); + return Qnil; /* FIXME: other terms do, but return Qnil causes segfault */ + } font_info->glyphs = xzalloc (0x100 * sizeof *font_info->glyphs); font_info->metrics = xzalloc (0x100 * sizeof *font_info->metrics); - block_input (); - /* for metrics */ #ifdef NS_IMPL_COCOA sfont = [nsfont screenFontWithRenderingMode: @@ -1051,6 +1056,7 @@ nsfont_draw (struct glyph_string *s, int from, int to, int x, int y, char isComposite = s->first_glyph->type == COMPOSITE_GLYPH; int end = isComposite ? s->cmp_to : s->nchars; + block_input (); /* Select face based on input flags */ switch (ns_tmp_flags) { @@ -1240,7 +1246,6 @@ nsfont_draw (struct glyph_string *s, int from, int to, int x, int y, else CGContextSetShouldAntialias (gcontext, 1); - CGContextSetShouldSmoothFonts (gcontext, NO); CGContextSetTextMatrix (gcontext, fliptf); if (bgCol != nil) @@ -1273,6 +1278,7 @@ nsfont_draw (struct glyph_string *s, int from, int to, int x, int y, /* Draw underline, overline, strike-through. */ ns_draw_text_decoration (s, face, col, r.size.width, r.origin.x); + unblock_input (); return to-from; } @@ -1406,11 +1412,12 @@ ns_glyph_metrics (struct nsfont_info *font_info, unsigned char block) lb = r.origin.x; rb = r.size.width - w; + // Add to bearing for LCD smoothing. We don't know if it is there. if (lb < 0) - metrics->lbearing = round (lb); + metrics->lbearing = round (lb - LCD_SMOOTHING_MARGIN); if (font_info->ital) rb += 0.22 * font_info->height; - metrics->rbearing = lrint (w + rb); + metrics->rbearing = lrint (w + rb + LCD_SMOOTHING_MARGIN); metrics->descent = r.origin.y < 0 ? -r.origin.y : 0; /*lrint (hshrink * [sfont ascender] + expand * hd/2); */