Simplify rxvt_temp_buf usage.
[dana/urxvt.git] / src / rxvtfont.C
index 3ec4fe3..a4dd1d6 100644 (file)
@@ -1,7 +1,7 @@
 /*----------------------------------------------------------------------*
  * File:       rxvtfont.C
  *----------------------------------------------------------------------*
- * Copyright (c) 2003-2006 Marc Lehmann <pcg@goof.com>
+ * Copyright (c) 2003-2008 Marc Lehmann <pcg@goof.com>
  *                             - original version.
  *
  * This program is free software; you can redistribute it and/or modify
@@ -81,8 +81,8 @@ const struct rxvt_fallback_font {
 #if ENCODING_JP || ENCODING_JP_EXT
 # if XFT
   // prefer xft for complex scripts
-  { CS_JIS0208_1990_0, "xft:Kochi Gothic:antialias=false"          },
   { CS_JIS0208_1990_0, "xft:Sazanami Mincho:antialias=false"       },
+  { CS_JIS0208_1990_0, "xft:Kochi Gothic:antialias=false"          },
   { CS_JIS0208_1990_0, "xft:Mincho:antialias=false"                },
   { CS_JIS0208_1990_0, "xft::lang=ja:antialias=false"              },
 # endif
@@ -218,13 +218,13 @@ rxvt_font::rxvt_font ()
 }
 
 void
-rxvt_font::set_name (char *name)
+rxvt_font::set_name (char *name_)
 {
-  if (this->name == name)
+  if (name == name_)
     return;
 
-  if (this->name) free (this->name); // let the compiler optimize
-  this->name = name;
+  if (name) free (name); // let the compiler optimize
+  name = name_;
 }
 
 void
@@ -794,14 +794,23 @@ rxvt_font_x11::load (const rxvt_fontprop &prop, bool force_prop)
   char *registry = get_property (f, term->xa [XA_CHARSET_REGISTRY], 0);
   char *encoding = get_property (f, term->xa [XA_CHARSET_ENCODING], 0);
 
+  cs = CS_UNKNOWN;
+
   if (registry && encoding)
     {
       char charset[64];
       snprintf (charset, 64, "%s-%s", registry, encoding);
 
       cs = codeset_from_name (charset);
+
+      if (cs == CS_UNKNOWN)
+        rxvt_warn ("%s: cannot deduce encoding from registry/encoding properties \"%s\", ignoring font.\n", name, charset);
     }
-  else
+
+  free (registry);
+  free (encoding);
+
+  if (cs == CS_UNKNOWN)
     {
       const char *charset = get_property (f, XA_FONT, 0);
 
@@ -814,10 +823,15 @@ rxvt_font_x11::load (const rxvt_fontprop &prop, bool force_prop)
           break;
 
       cs = codeset_from_name (charset);
+      if (cs == CS_UNKNOWN)
+        rxvt_warn ("%s: cannot deduce encoding from font name property \"%s\", ignoring font.\n", name, charset);
     }
 
-  free (registry);
-  free (encoding);
+  if (cs == CS_UNKNOWN)
+    {
+      clear ();
+      return false;
+    }
 
   if (cs == CS_UNICODE)
     cs = CS_UNICODE_16; // X11 can have a max. of 65536 chars per font
@@ -874,14 +888,6 @@ rxvt_font_x11::load (const rxvt_fontprop &prop, bool force_prop)
       if (width < g.width) width = g.width;
     }
 
-  if (cs == CS_UNKNOWN)
-    {
-      fprintf (stderr, "unable to deduce codeset, ignoring font '%s'\n", name);
-
-      clear ();
-      return false;
-    }
-
 #if 0 // do it per-character
   if (prop && width > prop->width)
     {
@@ -1135,7 +1141,7 @@ rxvt_font_xft::load (const rxvt_fontprop &prop, bool force_prop)
 #if 0 // clipping unfortunately destroys our precious double-width-characters
   // clip width, we can't do better, or can we?
   if (FcPatternGet (p, FC_CHAR_WIDTH, 0, &v) != FcResultMatch)
-    FcPatternAddInteger (p, FC_CHAR_WIDTH, prop->width);
+    FcPatternAddInteger (p, FC_CHAR_WIDTH, prop.width);
 #endif
 
   if (FcPatternGet (p, FC_MINSPACE, 0, &v) != FcResultMatch)
@@ -1289,7 +1295,7 @@ rxvt_font_xft::draw (rxvt_drawable &d, int x, int y,
                      int fg, int bg)
 {
   XGlyphInfo extents;
-  XftGlyphSpec *enc = (XftGlyphSpec *)rxvt_temp_buf (len * sizeof (XftGlyphSpec));
+  XftGlyphSpec *enc = rxvt_temp_buf<XftGlyphSpec> (len);
   XftGlyphSpec *ep = enc;
 
   dTermDisplay;
@@ -1298,15 +1304,8 @@ rxvt_font_xft::draw (rxvt_drawable &d, int x, int y,
   int w = term->fwidth * len;
   int h = term->fheight;
 
-  /*
-   * Maybe make buffering into a resource flag? Compile time option doesn't seems like a
-   * good idea from the perspective of packaging for wide variety of user configs.
-   */
-  bool buffered = bg >= Color_transparent;
-#ifdef FORCE_UNBUFFERED_XFT
-  buffered = false;
-#endif
-  buffered=false;//D
+  bool buffered = bg >= Color_transparent
+                  && term->option (Opt_buffered);
 
   // cut trailing spaces
   while (len && text [len - 1] == ' ')
@@ -1348,7 +1347,7 @@ rxvt_font_xft::draw (rxvt_drawable &d, int x, int y,
           rxvt_drawable &d2 = d.screen->scratch_drawable (w, h);
 
 #ifdef HAVE_BG_PIXMAP
-          Picture dst = 0;
+          Picture dst = 0; // the only assignment is done conditionally in the following if condition
 
           if (term->bgPixmap.pixmap
               && (bg == Color_transparent || bg == Color_bg
@@ -1391,12 +1390,13 @@ rxvt_font_xft::draw (rxvt_drawable &d, int x, int y,
                 {
                   Picture solid_color_pict = XftDrawSrcPicture (d2, &term->pix_colors[bg].c);
 
+                  // dst can only be set when bg >= 0
                   XRenderComposite (disp, PictOpOver, solid_color_pict, None, dst, 0, 0, 0, 0, 0, 0, w, h);
                 }
             }
           else
 #endif
-            clear_rect (d, x, y, w, h, bg);
+            XftDrawRect (d2, &term->pix_colors[bg >= 0 ? bg : Color_bg].c, 0, 0, w, h);
 
           XftDrawGlyphSpec (d2, &term->pix_colors[fg].c, f, enc, ep - enc);
           XCopyArea (disp, d2, d, gc, 0, 0, w, h, x, y);