From 988a7ddb0c5bf2cf3c3898f58ba342045a4677bc Mon Sep 17 00:00:00 2001 From: Kenichi Handa Date: Thu, 5 Mar 2009 12:27:04 +0000 Subject: (font_select_entity): New function. (font_find_for_lface): Use font_select_entity to select a font. --- src/ChangeLog | 9 ++++ src/font.c | 138 +++++++++++++++++++++++++++++++--------------------------- 2 files changed, 84 insertions(+), 63 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 375aa3d845..ae3ef0e053 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,12 @@ +2009-03-05 Kenichi Handa + + * font.c (font_select_entity): New function. + (font_find_for_lface): Use font_select_entity to select a font. + + * fontset.c (fontset_find_font): If a font found without + restricting of the characters C doen't support C, try to find a + font with C restriction. + 2009-03-04 Nikolaj Schumacher (tiny change) * nsfont.m (nsfont_draw): Compare ns_antialias_text against lisp value. diff --git a/src/font.c b/src/font.c index 780413fb66..9a656b1c6f 100644 --- a/src/font.c +++ b/src/font.c @@ -3161,6 +3161,75 @@ font_update_lface (f, attrs) } +/* Selecte a font from ENTITIES that supports C and matches best with + ATTRS and PIXEL_SIZE. */ + +static Lisp_Object +font_select_entity (frame, entities, attrs, pixel_size, c) + Lisp_Object frame, entities, *attrs; + int pixel_size, c; +{ + Lisp_Object font_entity; + Lisp_Object prefer; + Lisp_Object props[FONT_REGISTRY_INDEX + 1] ; + int result, i; + FRAME_PTR f = XFRAME (frame); + + if (ASIZE (entities) == 1) + { + font_entity = AREF (entities, 0); + if (c < 0 + || (result = font_has_char (f, font_entity, c)) > 0) + return font_entity; + return Qnil; + } + + /* Sort fonts by properties specified in ATTRS. */ + prefer = scratch_font_prefer; + + for (i = FONT_WEIGHT_INDEX; i <= FONT_SIZE_INDEX; i++) + ASET (prefer, i, Qnil); + if (FONTP (attrs[LFACE_FONT_INDEX])) + { + Lisp_Object face_font = attrs[LFACE_FONT_INDEX]; + + for (i = FONT_WEIGHT_INDEX; i <= FONT_SIZE_INDEX; i++) + ASET (prefer, i, AREF (face_font, i)); + } + if (NILP (AREF (prefer, FONT_WEIGHT_INDEX))) + FONT_SET_STYLE (prefer, FONT_WEIGHT_INDEX, attrs[LFACE_WEIGHT_INDEX]); + if (NILP (AREF (prefer, FONT_SLANT_INDEX))) + FONT_SET_STYLE (prefer, FONT_SLANT_INDEX, attrs[LFACE_SLANT_INDEX]); + if (NILP (AREF (prefer, FONT_WIDTH_INDEX))) + FONT_SET_STYLE (prefer, FONT_WIDTH_INDEX, attrs[LFACE_SWIDTH_INDEX]); + ASET (prefer, FONT_SIZE_INDEX, make_number (pixel_size)); + entities = font_sort_entites (entities, prefer, frame, c < 0); + + if (c < 0) + return entities; + + for (i = 0; i < ASIZE (entities); i++) + { + int j; + + font_entity = AREF (entities, i); + if (i > 0) + { + for (j = FONT_FOUNDRY_INDEX; j <= FONT_REGISTRY_INDEX; j++) + if (! EQ (AREF (font_entity, j), props[j])) + break; + if (j > FONT_REGISTRY_INDEX) + continue; + } + for (j = FONT_FOUNDRY_INDEX; j <= FONT_REGISTRY_INDEX; j++) + props[j] = AREF (font_entity, j); + result = font_has_char (f, font_entity, c); + if (result > 0) + return font_entity; + } + return Qnil; +} + /* Return a font-entity satisfying SPEC and best matching with face's font related attributes in ATTRS. C, if not negative, is a character that the entity must support. */ @@ -3308,74 +3377,17 @@ font_find_for_lface (f, attrs, spec, c) ASET (work, FONT_ADSTYLE_INDEX, adstyle[l]); entities = font_list_entities (frame, work); if (ASIZE (entities) > 0) - goto found; + { + val = font_select_entity (frame, entities, + attrs, pixel_size, c); + if (! NILP (val)) + return val; + } } } } } return Qnil; - found: - if (ASIZE (entities) == 1) - { - if (c < 0) - return AREF (entities, 0); - } - else - { - /* Sort fonts by properties specified in LFACE. */ - Lisp_Object prefer = scratch_font_prefer; - - for (i = 0; i < FONT_EXTRA_INDEX; i++) - ASET (prefer, i, AREF (work, i)); - if (FONTP (attrs[LFACE_FONT_INDEX])) - { - Lisp_Object face_font = attrs[LFACE_FONT_INDEX]; - - for (i = 0; i < FONT_EXTRA_INDEX; i++) - if (NILP (AREF (prefer, i))) - ASET (prefer, i, AREF (face_font, i)); - } - if (NILP (AREF (prefer, FONT_WEIGHT_INDEX))) - FONT_SET_STYLE (prefer, FONT_WEIGHT_INDEX, attrs[LFACE_WEIGHT_INDEX]); - if (NILP (AREF (prefer, FONT_SLANT_INDEX))) - FONT_SET_STYLE (prefer, FONT_SLANT_INDEX, attrs[LFACE_SLANT_INDEX]); - if (NILP (AREF (prefer, FONT_WIDTH_INDEX))) - FONT_SET_STYLE (prefer, FONT_WIDTH_INDEX, attrs[LFACE_SWIDTH_INDEX]); - ASET (prefer, FONT_SIZE_INDEX, make_number (pixel_size)); - entities = font_sort_entites (entities, prefer, frame, c < 0); - } - if (c < 0) - return entities; - - for (i = 0; i < ASIZE (entities); i++) - { - int j; - - val = AREF (entities, i); - if (i > 0) - { - for (j = FONT_FOUNDRY_INDEX; j <= FONT_REGISTRY_INDEX; j++) - if (! EQ (AREF (val, j), props[j])) - break; - if (j > FONT_REGISTRY_INDEX) - continue; - } - for (j = FONT_FOUNDRY_INDEX; j <= FONT_REGISTRY_INDEX; j++) - props[j] = AREF (val, j); - result = font_has_char (f, val, c); - if (result > 0) - return val; - if (result == 0) - return Qnil; - val = font_open_for_lface (f, val, attrs, spec); - if (NILP (val)) - continue; - result = font_has_char (f, val, c); - font_close_object (f, val); - if (result > 0) - return AREF (entities, i); - } - return Qnil; } -- cgit v1.2.3