(font_select_entity): New function.

(font_find_for_lface): Use font_select_entity to select a font.
This commit is contained in:
Kenichi Handa 2009-03-05 12:27:04 +00:00
parent 162f54589e
commit 988a7ddb0c
2 changed files with 84 additions and 63 deletions

View file

@ -1,3 +1,12 @@
2009-03-05 Kenichi Handa <handa@m17n.org>
* 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 <me@nschum.de> (tiny change)
* nsfont.m (nsfont_draw): Compare ns_antialias_text against lisp value.

View file

@ -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;
}