File fbiterm-combine-optimize.patch of Package xiterm

--- unix/fbiterm/src/fb_true16.c
+++ unix/fbiterm/src/fb_true16.c
@@ -92,23 +92,27 @@
   return;
 }
 
+extern char* iterm_bold;
+
 void
 fb_true16_draw_char (unsigned char *dst, int offset,
 		    unsigned char *bits, int cell_width,
 		    const xCharInfo *info,
-		    const TermFont *base)
+		    const TermFont *base, int blank)
 {
   int x, y;
   int height;
   unsigned short *dst16;
 
   height = (int)base->ascent - (int)info->ascent;
+#if 0 /* redundant */
   for (y = 0; y < height; y++) {
     dst16 = (unsigned short *) (dst + offset);
     for (x = 0; x < cell_width; x++)
       *dst16++ = bgcmap;
     dst += pIterm->fb->line_length;
   }
+#endif
 
   height = (int)info->ascent + (int)info->descent;
   for (y = 0; y < height; y++)
@@ -121,7 +125,8 @@
       c = cc = (c1 << 24) + (c2 << 16) + (c3 << 8) + c4;
       dst16 = (unsigned short *) (dst + offset);
       for (x = 0; x < info->leftSideBearing; x++) {
-	*dst16++ = bgcmap;
+	if(blank) *dst16 = bgcmap;
+	dst16++;
       }
       for (; x < info->rightSideBearing; x++, dst16++)
 	{
@@ -135,7 +140,7 @@
 		    *(dst16) = boldcmap;
 		  else
 		    {
-		      if (getenv ("ITERM_BOLD") != NULL)
+		      if (iterm_bold)
 			*(dst16) = boldcmap;
 		      else
 			*(dst16) = fgcmap;
@@ -143,17 +148,18 @@
 		}
 	      else
 		{
-		  *(dst16) = bgcmap;
+		  if(blank) *(dst16) = bgcmap;
 		}
 	    }
 	  c <<= 1;
 	}
-      for (; x < cell_width; x++)
-	*dst16++ = bgcmap;
+      for (; x < cell_width; x++, dst16++)
+	if(blank) *dst16 = bgcmap;
+      
       dst += pIterm->fb->line_length;
     }
   height = (int)base->descent - (int)info->descent;
-  for (y = 0; y < height; y++) {
+  if(blank) for (y = 0; y < height; y++) {
     dst16 = (unsigned short *) (dst + offset);
     for (x = 0; x < cell_width; x++)
       *dst16++ = bgcmap;
@@ -172,6 +178,7 @@
   mbstate_t ps;
   const xCharInfo *cinfo;
   const TermFont *base;
+  int blank;
 
   if (pIterm->lock)
     return;
@@ -199,6 +206,7 @@
       wchar_t wc;
       int wlen;
 
+      blank = 1;
       if (i >= length)
 	break;
 
@@ -220,14 +228,20 @@
 	      bits = get_glyph2 (pIterm->mb_font, wc, &height, &cinfo);
 	      wlen = wcwidth (wc);
 	      w = pIterm->asc_font->cell_width * (wlen > 0 ? wlen : 1);
+	      if(wlen == 0 && startx >= 2 * w) {
+	        startx -= (2 * w);
+	        blank = 0;
+              }
 	    }
 	}
       else
 	      break;
 
+      //printf("%s: w %d wcwidth %d blank %d bits %x\n",__FUNCTION__,w,wcwidth(wc),blank,(unsigned int*)bits);
+      
       i += len;
       dst = (char *) (pIterm->fb->buf + starty);
-      fb_true16_draw_char (dst, startx, bits, w, cinfo, base);
+      fb_true16_draw_char (dst, startx, bits, w, cinfo, base, blank);
       startx += (2 * w);
     }
   return;
--- unix/fbiterm/src/fb_true24.c
+++ unix/fbiterm/src/fb_true24.c
@@ -93,11 +93,13 @@
   return;
 }
 
+extern char* iterm_bold;
+
 void
 fb_true24_draw_char (unsigned char *dst, int offset,
 		     unsigned char *bits, int cell_width,
 		     const xCharInfo *info,
-		     const TermFont *base)
+		     const TermFont *base, int blank)
 {
   int x, y;
   int height;
@@ -107,6 +109,7 @@
    * this shouldn't work on some architectures because of word boundary!!
    */
 
+#if 0 /* redundant */
   height = (int)base->ascent - (int)info->ascent;
   for (y = 0; y < height; y++) {
     for (x = 0; x < cell_width; x++) {
@@ -115,6 +118,7 @@
     }
     dst += pIterm->fb->line_length;
   }
+#endif
 
   height = info->ascent + info->descent;
   for (y = 0; y < height; y++)
@@ -127,7 +131,7 @@
       c = cc = (c1 << 24) + (c2 << 16) + (c3 << 8) + c4;
       for (x = 0; x < info->leftSideBearing; x++) {
 	dst24 = (unsigned int *) (dst + offset + 3 * x);
-	*dst24 = bgcmap;
+	if(blank) *dst24 = bgcmap;
       }
       for (; x < info->rightSideBearing; x++)
 	{
@@ -143,7 +147,7 @@
 		    *(dst24) = boldcmap;
 		  else
 		    {
-		      if (getenv ("ITERM_BOLD") != NULL)
+		      if (iterm_bold)
 			*(dst24) = boldcmap;
 		      else
 			*(dst24) = fgcmap;
@@ -151,19 +155,19 @@
 		}
 	      else
 		{
-		  *(dst24) = bgcmap;
+		  if(blank) *(dst24) = bgcmap;
 		}
 	    }
 	  c <<= 1;
 	}
       for (; x < cell_width; x++) {
 	dst24 = (unsigned int *) (dst + offset + 3 * x);
-	*dst24 = bgcmap;
+	if(blank) *dst24 = bgcmap;
       }
       dst += pIterm->fb->line_length;
     }
   height = base->descent - info->descent;
-  for (y = 0; y < height; y++) {
+  if(blank) for (y = 0; y < height; y++) {
     for (x = 0; x < cell_width; x++) {
       dst24 = (unsigned int *) (dst + offset + 3 * x);
       *dst24 = bgcmap;
@@ -183,6 +187,7 @@
   mbstate_t ps;
   const xCharInfo *cinfo;
   const TermFont *base;
+  int blank;
 
   if (pIterm->lock)
     return;
@@ -210,6 +215,7 @@
       wchar_t wc;
       int wlen;
 
+      blank = 1;
       if (i >= length)
 	break;
 
@@ -231,6 +237,10 @@
 	      bits = get_glyph2 (pIterm->mb_font, wc, &height, &cinfo);
 	      wlen = wcwidth (wc);
 	      w = pIterm->asc_font->cell_width * (wlen > 0 ? wlen : 1);
+	      if(wlen == 0 && startx >= 3 * w) {
+	        startx -= (3 * w);
+	        blank = 0;
+              }
 	    }
 	}
       else
@@ -238,7 +248,7 @@
 
       i += len;
       dst = (char *) (pIterm->fb->buf + starty);
-      fb_true24_draw_char (dst, startx, bits, w, cinfo, base);
+      fb_true24_draw_char (dst, startx, bits, w, cinfo, base, blank);
       startx += (3 * w);
     }
   return;
--- unix/fbiterm/src/fb_true8.c
+++ unix/fbiterm/src/fb_true8.c
@@ -82,23 +82,27 @@
   return;
 }
 
+extern char* iterm_bold;
+
 void
 fb_true8_draw_char (unsigned char *dst, int offset,
 		    unsigned char *bits, int cell_width,
 		    const xCharInfo *info,
-		    const TermFont *base)
+		    const TermFont *base, int blank)
 {
   int x, y;
   int height;
   unsigned char *dst8;
 
   height = (int)base->ascent - (int)info->ascent;
+#if 0 /* redundant */
   for (y = 0; y < height; y++) {
     dst8 = (unsigned char *) (dst + offset);
     for (x = 0; x < cell_width; x++)
       *dst8++ = (char) bgcmap;
     dst += pIterm->fb->line_length;
   }
+#endif
 
   height = info->ascent + info->descent;
   for (y = 0; y < height; y++)
@@ -111,7 +115,8 @@
       c = cc = (c1 << 24) + (c2 << 16) + (c3 << 8) + c4;
       dst8 = (unsigned char *) (dst + offset);
       for (x = 0; x < info->leftSideBearing; x++) {
-	*dst8++ = (char) bgcmap;
+	if(blank) *dst8 = (char) bgcmap;
+	dst8++;
       }
       for (; x < info->rightSideBearing; x++, dst8++)
 	{
@@ -125,23 +130,24 @@
 		    *(dst8) = (char) fgcmap | 0x08;
 		  else
 		    {
-		      if (getenv ("ITERM_BOLD") != NULL)
+		      if (iterm_bold)
 			*(dst8) = (char) fgcmap | 0x08;
 		      else
 			*(dst8) = (char) fgcmap;
 		    }
 		}
 	      else
-		*(dst8) = (char) bgcmap;
+		if(blank) *(dst8) = (char) bgcmap;
 	    }
 	  c <<= 1;
 	}
-      for (; x < cell_width; x++)
-	*dst8++ = (char) bgcmap;
+      for (; x < cell_width; x++, dst8++)
+	if(blank) *dst8 = (char) bgcmap;
+      
       dst += pIterm->fb->line_length;
     }
   height = base->descent - info->descent;
-  for (y = 0; y < height; y++) {
+  if(blank) for (y = 0; y < height; y++) {
     dst8 = (unsigned char *) (dst + offset);
     for (x = 0; x < cell_width; x++)
       *dst8++ = (char) bgcmap;
@@ -160,6 +166,7 @@
   mbstate_t ps;
   const xCharInfo *cinfo;
   const TermFont *base;
+  int blank;
 
   if (pIterm->lock)
     return;
@@ -187,6 +194,7 @@
       wchar_t wc;
       int wlen;
 
+      blank = 1;
       if (i >= length)
 	break;
 
@@ -208,6 +216,10 @@
 	      bits = get_glyph2 (pIterm->mb_font, wc, &height, &cinfo);
 	      wlen = wcwidth (wc);
 	      w = pIterm->asc_font->cell_width * (wlen > 0 ? wlen : 1);
+	      if(wlen == 0 && startx >= w) {
+	        startx -= w;
+	        blank = 0;
+              }
 	    }
 	}
       else
@@ -215,7 +227,7 @@
 
       i += len;
       dst = (char *) (pIterm->fb->buf + starty);
-      fb_true8_draw_char (dst, startx, bits, w, cinfo, base);
+      fb_true8_draw_char (dst, startx, bits, w, cinfo, base, blank);
       startx += w;
     }
   return;
--- unix/fbiterm/src/fbiterm.c
+++ unix/fbiterm/src/fbiterm.c
@@ -63,6 +63,8 @@
   exit (0);
 }
 
+char* iterm_bold = 0;
+
 int
 main (int argc, char *argv[])
 {
@@ -71,6 +73,8 @@
   int fontsize = 0;
   char **prog_args;
 
+  iterm_bold = getenv("ITERM_BOLD");
+  
   setlocale (LC_ALL, "");
 
   /* allocate memory for Iterm structure */