Lisp_Object gstring, n;
int len, i, j;
+ if (! FONT_OBJECT_P (font_object))
+ return Qnil;
+ CHECK_FONT_GET_OBJECT (font_object, font);
+ if (! font->driver->shape)
+ return Qnil;
+
if (NILP (string))
{
validate_region (&from, &to);
args_out_of_range_3 (string, from, to);
}
- if (! FONT_OBJECT_P (font_object))
- return to;
-
- CHECK_FONT_GET_OBJECT (font_object, font);
len = end - start;
gstring = Ffont_make_gstring (font_object, make_number (len));
Ffont_fill_gstring (gstring, font_object, from, to, string);
- if (! font->driver->shape)
- {
- /* Make zero-width glyphs to have one pixel width to make the
- display routine not lose the cursor. */
- for (i = 0; i < len; i++)
- {
- Lisp_Object g = LGSTRING_GLYPH (gstring, i);
- unsigned code;
- struct font_metrics metrics;
-
- if (NILP (g))
- break;
- code = LGLYPH_CODE (g);
- if (font->driver->text_extents (font, &code, 1, &metrics) == 0)
- {
- Lisp_Object gstr = Ffont_make_gstring (font_object,
- make_number (1));
- LGSTRING_SET_WIDTH (gstr, 1);
- LGSTRING_SET_LBEARING (gstr, metrics.lbearing);
- LGSTRING_SET_RBEARING (gstr, metrics.rbearing + 1);
- LGSTRING_SET_ASCENT (gstr, metrics.ascent);
- LGSTRING_SET_DESCENT (gstr, metrics.descent);
- LGLYPH_SET_FROM (g, 0);
- LGLYPH_SET_TO (g, 1);
- LGSTRING_SET_GLYPH (gstr, 0, g);
- from = make_number (start + i);
- to = make_number (start + i + 1);
- if (NILP (string))
- Fcompose_region_internal (from, to, gstr, Qnil);
- else
- Fcompose_string_internal (string, from, to, gstr, Qnil);
- }
- }
- return make_number (end);
- }
-
/* Try at most three times with larger gstring each time. */
for (i = 0; i < 3; i++)