bug-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#14272: 24.3.50; crash on loading theme


From: Handa Kenichi
Subject: bug#14272: 24.3.50; crash on loading theme
Date: Sat, 27 Apr 2013 22:42:07 +0900

In article <83vc79u3uc.fsf@gnu.org>, Eli Zaretskii <eliz@gnu.org>
writes:

> The crash is caused by division by zero, here:

>       int font_wid = FRAME_COLUMN_WIDTH (f);
>       int cols = (left_wid + right_wid + font_wid-1) / font_wid;
>       <<<<<<<<

> most probably because font->average_width is zero, because
> FRAME_COLUMN_WIDTH gets its value for font's average_width.

I've just installed the attached fix to the trunk.  Please
try the lastest code.

---
Kenichi Handa
handa@gnu.org

2013-04-27  Kenichi Handa  <handa@gnu.org>

            * font.c (font_open_entity): Always open a font of
              manageable
              size.

=== modified file 'src/font.c'
--- src/font.c    2013-04-07 04:41:19 +0000
+++ src/font.c    2013-04-27 13:28:56 +0000
@@ -2819,7 +2819,7 @@
   struct font_driver_list *driver_list;
   Lisp_Object objlist, size, val, font_object;
   struct font *font;
-  int min_width, height;
+  int min_width, height, psize;
 
   eassert (FONT_ENTITY_P (entity));
   size = AREF (entity, FONT_SIZE_INDEX);
@@ -2846,12 +2846,19 @@
         }
     }
 
-  font_object = driver_list->driver->open (f, entity, pixel_size);
-  if (!NILP (font_object))
-    ASET (font_object, FONT_SIZE_INDEX, make_number (pixel_size));
+  /* We always open a font of manageable size; i.e non-zero average
+     width and height.  */
+  for (psize = pixel_size; ; psize++)
+    {
+      font_object = driver_list->driver->open (f, entity, psize);
+      if (NILP (font_object))
+      return Qnil;
+      font = XFONT_OBJECT (font_object);
+      if (font->average_width > 0 && font->height > 0)
+      break;
+    }
+  ASET (font_object, FONT_SIZE_INDEX, make_number (pixel_size));
   FONT_ADD_LOG ("open", entity, font_object);
-  if (NILP (font_object))
-    return Qnil;
   ASET (entity, FONT_OBJLIST_INDEX,
   Fcons (font_object, AREF (entity, FONT_OBJLIST_INDEX)));
 
@@ -3118,6 +3125,8 @@
       double pt = XINT (attrs[LFACE_HEIGHT_INDEX]);
 
       pixel_size = POINT_TO_PIXEL (pt / 10, FRAME_RES_Y (f));
+      if (pixel_size < 1)
+      pixel_size = 1;
     }
   ASET (work, FONT_SIZE_INDEX, Qnil);
   foundry[0] = AREF (work, FONT_FOUNDRY_INDEX);






reply via email to

[Prev in Thread] Current Thread [Next in Thread]