changeset 53936:4dd0e0a7fd9e

(struct fringe_bitmap): Change member bits from char to short to facilitate 16 bits wide bitmaps. Modify all standard bitmaps accordingly. (BYTES_PER_BITMAP_ROW, STANDARD_BITMAP_HEIGHT): New macros. (FRBITS): Use STANDARD_BITMAP_HEIGHT instead of just sizeof. (draw_fringe_bitmap): Ditto. (init_fringe_bitmap) [MAC_OS]: Don't bitswap. (init_fringe_bitmap) [HAVE_X_WINDOWS]: Enhance bitswapping to handle up to 16 bits wide bitmaps. (Fdefine_fringe_bitmap): Doc fix. Handle wider bitmaps.
author Kim F. Storm <storm@cua.dk>
date Fri, 13 Feb 2004 23:28:52 +0000
parents 60bbfcb6328e
children 8970999f9bcc
files src/fringe.c
diffstat 1 files changed, 73 insertions(+), 47 deletions(-) [+]
line wrap: on
line diff
--- a/src/fringe.c	Fri Feb 13 23:28:32 2004 +0000
+++ b/src/fringe.c	Fri Feb 13 23:28:52 2004 +0000
@@ -73,7 +73,7 @@
 
 struct fringe_bitmap
 {
-  unsigned char *bits;
+  unsigned short *bits;
   unsigned height : 8;
   unsigned width : 8;
   unsigned period : 8;
@@ -99,7 +99,7 @@
   ...xx...
   ...xx...
 */
-static unsigned char unknown_bits[] = {
+static unsigned short unknown_bits[] = {
   0x3c, 0x7e, 0x7e, 0x0c, 0x18, 0x18, 0x00, 0x18, 0x18};
 
 /* An arrow like this: `<-'.  */
@@ -113,7 +113,7 @@
   ..xx....
   ...xx...
 */
-static unsigned char left_arrow_bits[] = {
+static unsigned short left_arrow_bits[] = {
    0x18, 0x30, 0x60, 0xfc, 0xfc, 0x60, 0x30, 0x18};
 
 
@@ -128,7 +128,7 @@
   ....xx..
   ...xx...
 */
-static unsigned char right_arrow_bits[] = {
+static unsigned short right_arrow_bits[] = {
    0x18, 0x0c, 0x06, 0x3f, 0x3f, 0x06, 0x0c, 0x18};
 
 
@@ -143,7 +143,7 @@
   ...xx...
   ...xx...
 */
-static unsigned char up_arrow_bits[] = {
+static unsigned short up_arrow_bits[] = {
    0x18, 0x3c, 0x7e, 0xff, 0x18, 0x18, 0x18, 0x18};
 
 
@@ -158,7 +158,7 @@
   ..xxxx..
   ...xx...
 */
-static unsigned char down_arrow_bits[] = {
+static unsigned short down_arrow_bits[] = {
    0x18, 0x18, 0x18, 0x18, 0xff, 0x7e, 0x3c, 0x18};
 
 /* Marker for continued lines.  */
@@ -172,7 +172,7 @@
   ..xxxx..
   ..xxxxx.
 */
-static unsigned char continued_bits[] = {
+static unsigned short continued_bits[] = {
    0x3c, 0x3e, 0x03, 0x27, 0x3f, 0x3e, 0x3c, 0x3e};
 
 /* Marker for continuation lines.  */
@@ -186,7 +186,7 @@
   ..xxxx..
   .xxxxx..
 */
-static unsigned char continuation_bits[] = {
+static unsigned short continuation_bits[] = {
    0x3c, 0x7c, 0xc0, 0xe4, 0xfc, 0x7c, 0x3c, 0x7c};
 
 /* Overlay arrow bitmap.  A triangular arrow.  */
@@ -200,7 +200,7 @@
   xxxx....
   xx......
 */
-static unsigned char ov_bits[] = {
+static unsigned short ov_bits[] = {
    0xc0, 0xf0, 0xf8, 0xfc, 0xfc, 0xf8, 0xf0, 0xc0};
 
 #if 0
@@ -215,7 +215,7 @@
   ....xxxx
   ......xx
 */
-static unsigned char rev_ov_bits[] = {
+static unsigned short rev_ov_bits[] = {
    0x03, 0x0f, 0x1f, 0x3f, 0x3f, 0x1f, 0x0f, 0x03};
 #endif
 
@@ -230,7 +230,7 @@
   xx......
   ........
 */
-static unsigned char top_left_angle_bits[] = {
+static unsigned short top_left_angle_bits[] = {
    0xfc, 0xfc, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00};
 
 /* First line bitmap.  An right-up angle.  */
@@ -244,7 +244,7 @@
   ......xx
   ........
 */
-static unsigned char top_right_angle_bits[] = {
+static unsigned short top_right_angle_bits[] = {
    0x3f, 0x3f, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00};
 
 /* Last line bitmap.  An left-down angle.  */
@@ -258,7 +258,7 @@
   xxxxxx..
   xxxxxx..
 */
-static unsigned char bottom_left_angle_bits[] = {
+static unsigned short bottom_left_angle_bits[] = {
    0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xfc, 0xfc};
 
 /* Last line bitmap.  An right-down angle.  */
@@ -272,7 +272,7 @@
   ..xxxxxx
   ..xxxxxx
 */
-static unsigned char bottom_right_angle_bits[] = {
+static unsigned short bottom_right_angle_bits[] = {
    0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0x3f, 0x3f};
 
 /* First/last line bitmap.  An left bracket.  */
@@ -288,7 +288,7 @@
   xxxxxx..
   xxxxxx..
 */
-static unsigned char left_bracket_bits[] = {
+static unsigned short left_bracket_bits[] = {
    0xfc, 0xfc, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xfc, 0xfc};
 
 /* First/last line bitmap.  An right bracket.  */
@@ -304,7 +304,7 @@
   ..xxxxxx
   ..xxxxxx
 */
-static unsigned char right_bracket_bits[] = {
+static unsigned short right_bracket_bits[] = {
   0x3f, 0x3f, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x3f, 0x3f};
 
 /* Filled box cursor bitmap.  A filled box; max 13 pixels high.  */
@@ -323,7 +323,7 @@
   xxxxxxx.
   xxxxxxx.
 */
-static unsigned char filled_box_cursor_bits[] = {
+static unsigned short filled_box_cursor_bits[] = {
    0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe};
 
 /* Hollow box cursor bitmap.  A hollow box; max 13 pixels high.  */
@@ -342,7 +342,7 @@
   x.....x.
   xxxxxxx.
 */
-static unsigned char hollow_box_cursor_bits[] = {
+static unsigned short hollow_box_cursor_bits[] = {
    0xfe, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0xfe};
 
 /* Bar cursor bitmap.  A vertical bar; max 13 pixels high.  */
@@ -361,7 +361,7 @@
   xx......
   xx......
 */
-static unsigned char bar_cursor_bits[] = {
+static unsigned short bar_cursor_bits[] = {
    0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0};
 
 /* HBar cursor bitmap.  A horisontal bar; 2 pixels high.  */
@@ -369,7 +369,7 @@
   xxxxxxx.
   xxxxxxx.
 */
-static unsigned char hbar_cursor_bits[] = {
+static unsigned short hbar_cursor_bits[] = {
   0xfe, 0xfe};
 
 
@@ -383,7 +383,7 @@
   ..xxxx..
   ........
 */
-static unsigned char zv_bits[] = {
+static unsigned short zv_bits[] = {
   0x00, 0x3c, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x3c, 0x00,
   0x00, 0x3c, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x3c, 0x00,
   0x00, 0x3c, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x3c, 0x00,
@@ -402,12 +402,14 @@
   .x....x.
   .xxxxxx.
 */
-static unsigned char hollow_square_bits[] = {
+static unsigned short hollow_square_bits[] = {
    0x7e, 0x42, 0x42, 0x42, 0x42, 0x7e};
 
 
+#define BYTES_PER_BITMAP_ROW  (sizeof (unsigned short))
+#define STANDARD_BITMAP_HEIGHT(bits) (sizeof (bits)/BYTES_PER_BITMAP_ROW)
+#define FRBITS(bits)  bits, STANDARD_BITMAP_HEIGHT (bits)
 
-#define FRBITS(bits)  bits, sizeof bits
 struct fringe_bitmap standard_bitmaps[MAX_STANDARD_FRINGE_BITMAPS] =
 {
   { NULL, 0, 0, 0, 0, 0 }, /* NO_FRINGE_BITMAP */
@@ -604,7 +606,7 @@
       switch (w->phys_cursor_type)
 	{
 	case HOLLOW_BOX_CURSOR:
-	  if (row->visible_height >= sizeof(hollow_box_cursor_bits))
+	  if (row->visible_height >= STANDARD_BITMAP_HEIGHT (hollow_box_cursor_bits))
 	    cursor = HOLLOW_BOX_CURSOR_BITMAP;
 	  else
 	    cursor = HOLLOW_SQUARE_BITMAP;
@@ -1011,8 +1013,11 @@
 
 
 /* Initialize bitmap bit.
-   On X and MAC, we bit-swap the built-in bitmaps.
-   On W32, there's no need to do this.
+
+   On X, we bit-swap the built-in bitmaps and reduce bitmap
+   from short to char array if width is <= 8 bits.
+
+   On W32 and MAC, there's no need to do this.
 */
 
 void
@@ -1023,20 +1028,38 @@
 {
   if (once_p || fb->dynamic)
     {
-#if defined (HAVE_X_WINDOWS) || defined (MAC_OS)
-      unsigned char *bits = fb->bits;
+#if defined (HAVE_X_WINDOWS)
+      static unsigned char swap_nibble[16]
+	= { 0x0, 0x8, 0x4, 0xc,    /* 0000 1000 0100 1100 */
+	    0x2, 0xa, 0x6, 0xe,    /* 0010 1010 0110 1110 */
+	    0x1, 0x9, 0x5, 0xd,    /* 0001 1001 0101 1101 */
+	    0x3, 0xb, 0x7, 0xf };	 /* 0011 1011 0111 1111 */
+      unsigned short *bits = fb->bits;
       int j;
-      for (j = 0; j < fb->height; j++)
+
+      if (fb->width <= 8)
 	{
-	  static unsigned char swap_nibble[16]
-	    = { 0x0, 0x8, 0x4, 0xc,    /* 0000 1000 0100 1100 */
-		0x2, 0xa, 0x6, 0xe,    /* 0010 1010 0110 1110 */
-		0x1, 0x9, 0x5, 0xd,    /* 0001 1001 0101 1101 */
-		0x3, 0xb, 0x7, 0xf };	 /* 0011 1011 0111 1111 */
-
-	  unsigned char b = *bits;
-	  *bits++ = (unsigned short)((swap_nibble[b & 0xf]<<4)
-				     | (swap_nibble[(b>>4) & 0xf]));
+	  unsigned char *cbits = (unsigned char *)fb->bits;
+	  for (j = 0; j < fb->height; j++)
+	    {
+	      unsigned short b = *bits++;
+	      unsigned char c;
+	      c = (unsigned char)((swap_nibble[b & 0xf] << 4)
+				  | (swap_nibble[(b>>4) & 0xf]));
+	      *cbits++ = (c >> (8 - fb->width));
+	    }
+	}
+      else
+	{
+	  for (j = 0; j < fb->height; j++)
+	    {
+	      unsigned short b = *bits;
+	      b = (unsigned short)((swap_nibble[b & 0xf] << 12)
+				   | (swap_nibble[(b>>4) & 0xf] << 8)
+				   | (swap_nibble[(b>>8) & 0xf] << 4)
+				   | (swap_nibble[(b>>12) & 0xf]));
+	      *bits++ = (b >> (16 - fb->width));
+	    }
 	}
 #endif
     }
@@ -1058,12 +1081,14 @@
 DEFUN ("define-fringe-bitmap", Fdefine_fringe_bitmap, Sdefine_fringe_bitmap,
        1, 5, 0,
        doc: /* Define a fringe bitmap from BITS of height HEIGHT and width WIDTH.
-BITS is either a string or a vector.  If HEIGHT is nil, use number of bytes
-in BITS.  If WIDTH is zero, default to 8.  Optional forth arg ALIGN may be
-one of `top', `center', or `bottom', indicating the positioning of the
-bitmap relative to the rows where it is used; the default is to center the
-bitmap.  Fourth arg may also be a list (ALIGN PERIODIC) where 
-PERIODIC non-nil specifies that the bitmap should be repeated.
+BITS is either a string or a vector of integers.
+HEIGHT is height of bitmap.  If HEIGHT is nil, use length of BITS.
+WIDTH must be an integer between 1 and 16, or nil which defaults to 8.
+Optional forth arg ALIGN may be one of `top', `center', or `bottom',
+indicating the positioning of the bitmap relative to the rows where it
+is used; the default is to center the bitmap.  Fourth arg may also be a
+list (ALIGN PERIODIC) where PERIODIC non-nil specifies that the bitmap
+should be repeated.
 Optional fifth argument WHICH is bitmap number to redefine.
 Return new bitmap number, or nil of no more free bitmap slots.  */)
   (bits, height, width, align, which)
@@ -1071,7 +1096,7 @@
 {
   Lisp_Object len;
   int n, h, i, j;
-  unsigned char *b;
+  unsigned short *b;
   struct fringe_bitmap fb, *xfb;
   int fill1 = 0, fill2 = 0;
 
@@ -1152,8 +1177,9 @@
 
   fb.dynamic = 1;
 
-  xfb = (struct fringe_bitmap *)xmalloc (sizeof fb + fb.height);
-  fb.bits = b = (unsigned char *)(xfb+1);
+  xfb = (struct fringe_bitmap *)xmalloc (sizeof fb
+					 + fb.height * BYTES_PER_BITMAP_ROW);
+  fb.bits = b = (unsigned short *)(xfb+1);
   bzero (b, fb.height);
 
   j = 0;