Mercurial > emacs
diff src/font.c @ 107005:fb234c5a45ed
Merge from trunk
author | Jason Rumney <jasonr@gnu.org> |
---|---|
date | Thu, 07 Jan 2010 21:54:07 +0800 |
parents | 574dd89b7759 |
children | 1d1d5d9bd884 |
line wrap: on
line diff
--- a/src/font.c Thu Jan 07 21:53:57 2010 +0800 +++ b/src/font.c Thu Jan 07 21:54:07 2010 +0800 @@ -143,6 +143,8 @@ characters; used in xfont.c and ftfont.c. */ Lisp_Object Qja, Qko; +Lisp_Object QCuser_spec; + Lisp_Object Vfont_encoding_alist; /* Alist of font registry symbol and the corresponding charsets @@ -2989,16 +2991,6 @@ else if (CONSP (Vface_font_rescale_alist)) scaled_pixel_size = pixel_size * font_rescale_ratio (entity); -#if 0 - /* This doesn't work if you have changed hinting or any other parameter. - We need to make a new object in every case to be sure. */ - for (objlist = AREF (entity, FONT_OBJLIST_INDEX); CONSP (objlist); - objlist = XCDR (objlist)) - if (! NILP (AREF (XCAR (objlist), FONT_TYPE_INDEX)) - && XFONT_OBJECT (XCAR (objlist))->pixel_size == pixel_size) - return XCAR (objlist); -#endif - val = AREF (entity, FONT_TYPE_INDEX); for (driver_list = f->font_driver_list; driver_list && ! EQ (driver_list->driver->type, val); @@ -3006,6 +2998,19 @@ if (! driver_list) return Qnil; + for (objlist = AREF (entity, FONT_OBJLIST_INDEX); CONSP (objlist); + objlist = XCDR (objlist)) + { + Lisp_Object fn = XCAR (objlist); + if (! NILP (AREF (fn, FONT_TYPE_INDEX)) + && XFONT_OBJECT (fn)->pixel_size == pixel_size) + { + if (driver_list->driver->cached_font_ok == NULL + || driver_list->driver->cached_font_ok (f, fn, entity)) + return fn; + } + } + font_object = driver_list->driver->open (f, entity, scaled_pixel_size); if (!NILP (font_object)) ASET (font_object, FONT_SIZE_INDEX, make_number (pixel_size)); @@ -3161,6 +3166,7 @@ if (font_parse_name ((char *) SDATA (font_name), spec) == -1) return Qnil; font_put_extra (spec, QCname, font_name); + font_put_extra (spec, QCuser_spec, font_name); return spec; } @@ -3174,14 +3180,13 @@ if (! FONTP (font)) return; -#if 0 + if (! NILP (Ffont_get (font, QCname))) { font = Fcopy_font_spec (font); font_put_extra (font, QCname, Qnil); } -#endif if (NILP (AREF (font, prop)) && prop != FONT_FAMILY_INDEX && prop != FONT_FOUNDRY_INDEX @@ -3539,8 +3544,8 @@ entity = font_open_for_lface (f, entity, attrs, spec); if (!NILP (entity)) { - name = Ffont_get (spec, QCname); - if (STRINGP (name)) font_put_extra (entity, QCname, name); + name = Ffont_get (spec, QCuser_spec); + if (STRINGP (name)) font_put_extra (entity, QCuser_spec, name); } return entity; } @@ -3614,7 +3619,7 @@ ret = font_open_by_spec (f, spec); /* Do not loose name originally put in. */ if (!NILP (ret)) - font_put_extra (ret, QCname, args[1]); + font_put_extra (ret, QCuser_spec, args[1]); return ret; } @@ -5269,6 +5274,8 @@ DEFSYM (Qja, "ja"); DEFSYM (Qko, "ko"); + DEFSYM (QCuser_spec, "user-spec"); + staticpro (&null_vector); null_vector = Fmake_vector (make_number (0), Qnil);