X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/aad3612f9eb7280bd4db8ee697186e75b1e82765..aac6be13316f360bb2df46d6708ad9eea6059dc5:/src/nsfont.m diff --git a/src/nsfont.m b/src/nsfont.m index b61147d66c..98c25fcded 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-2013 Free Software Foundation, Inc. + Copyright (C) 2006-2014 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -51,8 +51,6 @@ static Lisp_Object Qapple, Qroman, Qmedium; static Lisp_Object Qcondensed, Qexpanded; extern Lisp_Object Qappend; extern float ns_antialias_threshold; -extern int ns_tmp_flags; -extern struct nsfont_info *ns_tmp_font; /* font glyph and metrics caching functions, implemented at end */ @@ -528,7 +526,7 @@ static NSSet } if (NSFONT_TRACE) - NSLog(@" returning %d families", [families count]); + NSLog(@" returning %lu families", (unsigned long)[families count]); return families; } @@ -566,8 +564,8 @@ ns_findfonts (Lisp_Object font_spec, BOOL isMatch) matchingDescs = [fdesc matchingFontDescriptorsWithMandatoryKeys: fkeys]; if (NSFONT_TRACE) - NSLog(@"Got desc %@ and found %d matching fonts from it: ", fdesc, - [matchingDescs count]); + NSLog(@"Got desc %@ and found %lu matching fonts from it: ", fdesc, + (unsigned long)[matchingDescs count]); for (dEnum = [matchingDescs objectEnumerator]; (desc = [dEnum nextObject]);) { @@ -626,7 +624,7 @@ static Lisp_Object nsfont_match (struct frame *, Lisp_Object); static Lisp_Object nsfont_list_family (struct frame *); static Lisp_Object nsfont_open (struct frame *f, Lisp_Object font_entity, int pixel_size); -static void nsfont_close (struct frame *f, struct font *font); +static void nsfont_close (struct font *font); static int nsfont_has_char (Lisp_Object entity, int c); static unsigned int nsfont_encode_char (struct font *font, int c); static int nsfont_text_extents (struct font *font, unsigned int *code, @@ -651,7 +649,7 @@ struct font_driver nsfont_driver = nsfont_encode_char, nsfont_text_extents, nsfont_draw, - /* excluded: get_bitmap, free_bitmap, get_outline, free_outline, + /* excluded: get_bitmap, free_bitmap, anchor_point, otf_capability, otf_driver, start_for_frame, end_for_frame, shape */ }; @@ -798,6 +796,7 @@ nsfont_open (struct frame *f, Lisp_Object font_entity, int pixel_size) font_object = font_make_object (VECSIZE (struct nsfont_info), font_entity, pixel_size); + ASET (font_object, FONT_TYPE_INDEX, nsfont_driver.type); font_info = (struct nsfont_info *) XFONT_OBJECT (font_object); font = (struct font *) font_info; if (!font) @@ -830,10 +829,6 @@ nsfont_open (struct frame *f, Lisp_Object font_entity, int pixel_size) font->vertical_centering = 0; font->baseline_offset = 0; font->relative_compose = 0; - font->font_encoder = NULL; - - font->props[FONT_FORMAT_INDEX] = Qns; - font->props[FONT_FILE_INDEX] = Qnil; { const char *fontName = [[nsfont fontName] UTF8String]; @@ -871,10 +866,11 @@ nsfont_open (struct frame *f, Lisp_Object font_entity, int pixel_size) font_info->size = font->pixel_size; /* max bounds */ - font_info->max_bounds.ascent = lrint ([sfont ascender]); + font->ascent = font_info->max_bounds.ascent = lrint ([sfont ascender]); /* Descender is usually negative. Use floor to avoid clipping descenders. */ - font_info->max_bounds.descent = -lrint (floor(adjusted_descender)); + font->descent = + font_info->max_bounds.descent = -lrint (floor(adjusted_descender)); font_info->height = font_info->max_bounds.ascent + font_info->max_bounds.descent; font_info->max_bounds.width = lrint (font_info->width); @@ -929,29 +925,32 @@ nsfont_open (struct frame *f, Lisp_Object font_entity, int pixel_size) } -/* Close FONT on frame F. */ +/* Close FONT. */ static void -nsfont_close (struct frame *f, struct font *font) +nsfont_close (struct font *font) { - struct nsfont_info *font_info = (struct nsfont_info *)font; - int i; + struct nsfont_info *font_info = (struct nsfont_info *) font; - /* FIXME: this occurs apparently due to same failure to detect same font - that causes need for cache in nsfont_open () */ - if (!font_info) - return; - - for (i =0; i<0x100; i++) + /* FIXME: font_info may be NULL due to same failure to detect + same font that causes need for cache in nsfont_open. */ + if (font_info && font_info->name) { - xfree (font_info->glyphs[i]); - xfree (font_info->metrics[i]); - } - [font_info->nsfont release]; + int i; + + for (i = 0; i < 0x100; i++) + { + xfree (font_info->glyphs[i]); + xfree (font_info->metrics[i]); + } + xfree (font_info->glyphs); + xfree (font_info->metrics); + [font_info->nsfont release]; #ifdef NS_IMPL_COCOA - CGFontRelease (font_info->cgfont); + CGFontRelease (font_info->cgfont); #endif - xfree (font_info->name); - xfree (font_info); + xfree (font_info->name); + font_info->name = NULL; + } } @@ -1037,8 +1036,7 @@ nsfont_text_extents (struct font *font, unsigned int *code, int nglyphs, static int nsfont_draw (struct glyph_string *s, int from, int to, int x, int y, bool with_background) -/* NOTE: focus and clip must be set - also, currently assumed (true in nsterm.m call) from ==0, to ==nchars */ +/* NOTE: focus and clip must be set */ { static unsigned char cbuf[1024]; unsigned char *c = cbuf; @@ -1051,16 +1049,25 @@ nsfont_draw (struct glyph_string *s, int from, int to, int x, int y, #endif struct face *face; NSRect r; - struct nsfont_info *font = ns_tmp_font; + struct nsfont_info *font; NSColor *col, *bgCol; unsigned short *t = s->char2b; - int i, len; + int i, len, flags; char isComposite = s->first_glyph->type == COMPOSITE_GLYPH; - int end = isComposite ? s->cmp_to : s->nchars; block_input (); + + font = (struct nsfont_info *)s->face->font; + if (font == NULL) + font = (struct nsfont_info *)FRAME_FONT (s->f); + /* Select face based on input flags */ - switch (ns_tmp_flags) + flags = s->hl == DRAW_CURSOR ? NS_DUMPGLYPH_CURSOR : + (s->hl == DRAW_MOUSE_FACE ? NS_DUMPGLYPH_MOUSEFACE : + (s->for_overlaps ? NS_DUMPGLYPH_FOREGROUND : + NS_DUMPGLYPH_NORMAL)); + + switch (flags) { case NS_DUMPGLYPH_CURSOR: face = s->face; @@ -1088,8 +1095,8 @@ nsfont_draw (struct glyph_string *s, int from, int to, int x, int y, int cwidth, twidth = 0; int hi, lo; /* FIXME: composition: no vertical displacement is considered. */ - t += s->cmp_from; /* advance into composition */ - for (i = s->cmp_from; i < end; i++, t++) + t += from; /* advance into composition */ + for (i = from; i < to; i++, t++) { hi = (*t & 0xFF00) >> 8; lo = *t & 0x00FF; @@ -1183,13 +1190,13 @@ nsfont_draw (struct glyph_string *s, int from, int to, int x, int y, /* set up for character rendering */ - r.origin.y = s->ybase; + r.origin.y = y; col = (NS_FACE_FOREGROUND (face) != 0 ? ns_lookup_indexed_color (NS_FACE_FOREGROUND (face), s->f) : FRAME_FOREGROUND_COLOR (s->f)); - /* FIXME: find another way to pass this */ - bgCol = (ns_tmp_flags != NS_DUMPGLYPH_FOREGROUND ? nil + + bgCol = (flags != NS_DUMPGLYPH_FOREGROUND ? nil : (NS_FACE_BACKGROUND (face) != 0 ? ns_lookup_indexed_color (NS_FACE_BACKGROUND (face), s->f) : FRAME_BACKGROUND_COLOR (s->f))); @@ -1239,7 +1246,9 @@ nsfont_draw (struct glyph_string *s, int from, int to, int x, int y, CGContextSaveGState (gcontext); - fliptf.c = font->synthItal ? Fix2X (kATSItalicQDSkew) : 0.0; + // Used to be Fix2X (kATSItalicQDSkew), but Fix2X is deprecated + // and kATSItalicQDSkew is 0.25. + fliptf.c = font->synthItal ? 0.25 : 0.0; CGContextSetFont (gcontext, font->cgfont); CGContextSetFontSize (gcontext, font->size); @@ -1263,23 +1272,20 @@ nsfont_draw (struct glyph_string *s, int from, int to, int x, int y, [col set]; CGContextSetTextPosition (gcontext, r.origin.x, r.origin.y); - CGContextShowGlyphsWithAdvances (gcontext, s->char2b + s->cmp_from, - advances, len); + CGContextShowGlyphsWithAdvances (gcontext, s->char2b + from, + advances, len); if (face->overstrike) { CGContextSetTextPosition (gcontext, r.origin.x+0.5, r.origin.y); - CGContextShowGlyphsWithAdvances (gcontext, s->char2b + s->cmp_from, - advances, len); + CGContextShowGlyphsWithAdvances (gcontext, s->char2b + from, + advances, len); } CGContextRestoreGState (gcontext); } #endif /* NS_IMPL_COCOA */ - /* Draw underline, overline, strike-through. */ - ns_draw_text_decoration (s, face, col, r.size.width, r.origin.x); - unblock_input (); return to-from; }