]> git.eshelyaron.com Git - emacs.git/commitdiff
Inhibit null-string composition component (Bug#6988).
authorKenichi Handa <handa@m17n.org>
Thu, 2 Feb 2012 00:30:09 +0000 (09:30 +0900)
committerKenichi Handa <handa@m17n.org>
Thu, 2 Feb 2012 00:30:09 +0000 (09:30 +0900)
lisp/ChangeLog
lisp/composite.el
src/ChangeLog
src/xdisp.c

index ad25d537f2bb724c1b5e0039b7e499be3d918943..2ee709f62b21b196d3ffee80a22c0c14af0dad5b 100644 (file)
@@ -1,3 +1,8 @@
+2012-02-01  Kenichi Handa  <handa@m17n.org>
+
+       * composite.el (compose-region, compose-string): Signal error for
+       a null string component (Bug#6988).
+
 2012-01-31  Chong Yidong  <cyd@gnu.org>
 
        * frame.el (set-frame-font): New arg ALL-FRAMES.
index 72317ac470ef13630794bc601c65d4fbdc6ebd5b..739ec8bbcbdcfdfb67c7a365f5a7248de00435ad 100644 (file)
@@ -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)
index d114f0897eba1ebff1d063377c14fe6b9751e4f0..c41202bcfee6eeb5ac2ebae3fa02b3a30ebbc066 100644 (file)
@@ -1,3 +1,10 @@
+2012-02-01  Kenichi Handa  <handa@m17n.org>
+
+       * 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  <rgm@gnu.org>
 
        * nsterm.m (syms_of_nsterm) <x-toolkit-scroll-bars>:
index c90184f4a4c3f778470c49fe4eab51135b466301..864517b950c93e46f32991e391978c48ae01197d 100644 (file)
@@ -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)