From d2a51fd7a1d5d3c8f661c2068120b60e84eca875 Mon Sep 17 00:00:00 2001 From: Kenichi Handa Date: Thu, 2 Feb 2012 09:30:09 +0900 Subject: [PATCH] Inhibit null-string composition component (Bug#6988). --- lisp/ChangeLog | 5 +++++ lisp/composite.el | 10 +++++++--- src/ChangeLog | 7 +++++++ src/xdisp.c | 10 +++++++--- 4 files changed, 26 insertions(+), 6 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index ad25d537f2b..2ee709f62b2 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,8 @@ +2012-02-01 Kenichi Handa + + * composite.el (compose-region, compose-string): Signal error for + a null string component (Bug#6988). + 2012-01-31 Chong Yidong * frame.el (set-frame-font): New arg ALL-FRAMES. diff --git a/lisp/composite.el b/lisp/composite.el index 72317ac470e..739ec8bbcbd 100644 --- a/lisp/composite.el +++ b/lisp/composite.el @@ -211,7 +211,7 @@ or a vector or list of integers and rules. If it is a character, it is an alternate character to display instead of the text in the region. -If it is a string, the elements are alternate characters. In +If it is a string, the elements are one or more alternate characters. In this case, TAB element has a special meaning. If the first character is TAB, the glyphs are displayed with left padding space so that no pixel overlaps with the previous column. If the last @@ -234,7 +234,9 @@ text in the composition." (let ((modified-p (buffer-modified-p)) (inhibit-read-only t)) (if (or (vectorp components) (listp components)) - (setq components (encode-composition-components components))) + (setq components (encode-composition-components components)) + (if (= (length components) 0) + (error "Invalid composition component: %s" components))) (compose-region-internal start end components modification-func) (restore-buffer-modified-p modified-p))) @@ -267,7 +269,9 @@ Optional 5th argument MODIFICATION-FUNC is a function to call to adjust the composition when it gets invalid because of a change of text in the composition." (if (or (vectorp components) (listp components)) - (setq components (encode-composition-components components))) + (setq components (encode-composition-components components)) + (if (= (length components) 0) + (error "Invalid composition component: %s" components))) (or start (setq start 0)) (or end (setq end (length string))) (compose-string-internal string start end components modification-func) diff --git a/src/ChangeLog b/src/ChangeLog index d114f0897eb..c41202bcfee 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,10 @@ +2012-02-01 Kenichi Handa + + * xdisp.c (BUILD_COMPOSITE_GLYPH_STRING): Initialize first_s to + NULL (Bug#6988). + (x_produce_glyphs): If the component of a composition is a null + string, set it->pixel_width to 1 to avoid zero-width glyph. + 2012-01-31 Glenn Morris * nsterm.m (syms_of_nsterm) : diff --git a/src/xdisp.c b/src/xdisp.c index c90184f4a4c..864517b950c 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -22738,7 +22738,7 @@ compute_overhangs_and_x (struct glyph_string *s, int x, int backward_p) ptrdiff_t cmp_id = (row)->glyphs[area][START].u.cmp.id; \ struct composition *cmp = composition_table[cmp_id]; \ XChar2b *char2b; \ - struct glyph_string *first_s IF_LINT (= NULL); \ + struct glyph_string *first_s = NULL; \ int n; \ \ char2b = (XChar2b *) alloca ((sizeof *char2b) * cmp->glyph_len); \ @@ -24400,7 +24400,7 @@ x_produce_glyphs (struct it *it) /* Initialize the bounding box. */ if (pcm) { - width = pcm->width; + width = cmp->glyph_len > 0 ? pcm->width : 0; ascent = pcm->ascent; descent = pcm->descent; lbearing = pcm->lbearing; @@ -24408,7 +24408,7 @@ x_produce_glyphs (struct it *it) } else { - width = font->space_width; + width = cmp->glyph_len > 0 ? font->space_width : 0; ascent = FONT_BASE (font); descent = FONT_DESCENT (font); lbearing = 0; @@ -24595,6 +24595,10 @@ x_produce_glyphs (struct it *it) it->glyph_row->contains_overlapping_glyphs_p = 1; it->pixel_width = cmp->pixel_width; + if (it->pixel_width == 0) + /* We assure that all visible glyphs have at least 1-pixel + width. */ + it->pixel_width = 1; it->ascent = it->phys_ascent = cmp->ascent; it->descent = it->phys_descent = cmp->descent; if (face->box != FACE_NO_BOX) -- 2.39.2