+static int pangofont_char_width(PangoLayout *layout, struct pangofont *pfont,
+ wchar_t uchr, const char *utfchr, int utflen)
+{
+ /*
+ * Here we check whether a character has the same width as the
+ * character cell it'll be drawn in. Because profiling showed that
+ * pango_layout_get_pixel_extents() was a huge bottleneck when we
+ * were calling it every time we needed to know this, we instead
+ * call it only on characters we don't already know about, and
+ * cache the results.
+ */
+
+ if ((unsigned)uchr >= pfont->nwidthcache) {
+ unsigned newsize = ((int)uchr + 0x100) & ~0xFF;
+ pfont->widthcache = sresize(pfont->widthcache, newsize, int);
+ while (pfont->nwidthcache < newsize)
+ pfont->widthcache[pfont->nwidthcache++] = -1;
+ }
+
+ if (pfont->widthcache[uchr] < 0) {
+ PangoRectangle rect;
+ pango_layout_set_text(layout, utfchr, utflen);
+ pango_layout_get_pixel_extents(layout, NULL, &rect);
+ pfont->widthcache[uchr] = rect.width;
+ }
+
+ return pfont->widthcache[uchr];
+}
+