Squeak1.31-Unix-1depth.patch

NISHIHARA Satoshi nishis at urban.ne.jp
Wed Apr 8 11:53:52 UTC 1998


Hello all

Here is a Squeak1.31-Unix-1depth.patch made by 
Mr. Suzuki.

http://www.sra.co.jp/smalltalk/SML/mails/2201-2300/2262.txt

--------------6BD33CBCEC0
Content-Type: text/plain; charset=iso-2022-jp;
name="Squeak1.31-Unix-1depth.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="Squeak1.31-Unix-1depth.patch"

--- ../../squeak1.3.1.org/src/sqXWindow.c       Thu Mar 26 21:26:30 1998
+++ sqXWindow.c Mon Apr  6 09:08:40 1998
@@ -103,4 +103,5 @@
 int             stDisplayBitsIndex= 0; /* last known oop of the VM's Display */
 XImage         *stImage= 0;            /* ...and it's client-side pixmap */
+XImage         *stImage1= 0;           /* ...and it's client-side pixmap */
 char           *stPrimarySelection;    /* buffer holding selection */
 char           *stEmptySelection= "";  /* immutable "empty string" value */
@@ -581,5 +582,5 @@
 void SetColorEntry(int index, int red, int green, int blue)
 {
-  if (index >= 256)
+  if (index >= 16)
     return;
 
@@ -1185,4 +1186,25 @@
 
 #ifndef HEADLESS
+#if    1
+static unsigned char swapBitsTable[]={
+0x00,0x80,0x40,0xc0, 0x20,0xa0,0x60,0xe0, 0x10,0x90,0x50,0xd0,
0x30,0xb0,0x70,0xf0,
+0x08,0x88,0x48,0xc8, 0x28,0xa8,0x68,0xe8, 0x18,0x98,0x58,0xd8,
0x38,0xb8,0x78,0xf8,
+0x04,0x84,0x44,0xc4, 0x24,0xa4,0x64,0xe4, 0x14,0x94,0x54,0xd4,
0x34,0xb4,0x74,0xf4,
+0x0c,0x8c,0x4c,0xcc, 0x2c,0xac,0x6c,0xec, 0x1c,0x9c,0x5c,0xdc,
0x3c,0xbc,0x7c,0xfc,
+0x02,0x82,0x42,0xc2, 0x22,0xa2,0x62,0xe2, 0x12,0x92,0x52,0xd2,
0x32,0xb2,0x72,0xf2,
+0x0a,0x8a,0x4a,0xca, 0x2a,0xaa,0x6a,0xea, 0x1a,0x9a,0x5a,0xda,
0x3a,0xba,0x7a,0xfa,
+0x06,0x86,0x46,0xc6, 0x26,0xa6,0x66,0xe6, 0x16,0x96,0x56,0xd6,
0x36,0xb6,0x76,0xf6,
+0x0e,0x8e,0x4e,0xce, 0x2e,0xae,0x6e,0xee, 0x1e,0x9e,0x5e,0xde,
0x3e,0xbe,0x7e,0xfe,
+0x01,0x81,0x41,0xc1, 0x21,0xa1,0x61,0xe1, 0x11,0x91,0x51,0xd1,
0x31,0xb1,0x71,0xf1,
+0x09,0x89,0x49,0xc9, 0x29,0xa9,0x69,0xe9, 0x19,0x99,0x59,0xd9,
0x39,0xb9,0x79,0xf9,
+0x05,0x85,0x45,0xc5, 0x25,0xa5,0x65,0xe5, 0x15,0x95,0x55,0xd5,
0x35,0xb5,0x75,0xf5,
+0x0d,0x8d,0x4d,0xcd, 0x2d,0xad,0x6d,0xed, 0x1d,0x9d,0x5d,0xdd,
0x3d,0xbd,0x7d,0xfd,
+0x03,0x83,0x43,0xc3, 0x23,0xa3,0x63,0xe3, 0x13,0x93,0x53,0xd3,
0x33,0xb3,0x73,0xf3,
+0x0b,0x8b,0x4b,0xcb, 0x2b,0xab,0x6b,0xeb, 0x1b,0x9b,0x5b,0xdb,
0x3b,0xbb,0x7b,0xfb,
+0x07,0x87,0x47,0xc7, 0x27,0xa7,0x67,0xe7, 0x17,0x97,0x57,0xd7,
0x37,0xb7,0x77,0xf7,
+0x0f,0x8f,0x4f,0xcf, 0x2f,0xaf,0x6f,0xef, 0x1f,0x9f,0x5f,0xdf,
0x3f,0xbf,0x7f,0xff,
+};
+#define        swapBits(x)     swapBitsTable[(x)&0xff]
+#else
 static unsigned char swapBits(unsigned char in)
 {
@@ -1197,8 +1219,37 @@
 }
 #endif
+#endif
 
 int ioSetCursor(int cursorBitsIndex, int offsetX, int offsetY)
 {
 #ifndef HEADLESS
+#if    1
+  unsigned char data[32];      /* cursors are always 16x16 */
+  int i;
+  Cursor cursor;
+  Pixmap dataPixmap;
+
+  for (i= 0; i < 32; i+=2)
+    {
+      register unsigned int c;
+      c= (unsigned int)checkedLongAt(cursorBitsIndex);
+      data[i  ]= swapBits((c >> 24) & 0xFF);
+      data[i+1]= swapBits((c >> 16) & 0xFF);
+         cursorBitsIndex += 4;
+    }
+
+  dataPixmap= XCreateBitmapFromData(stDisplay,
+                                   DefaultRootWindow(stDisplay),
+                                   (char *)data, 16, 16);
+
+  cursor= XCreatePixmapCursor(stDisplay, dataPixmap, dataPixmap,
+                             &stColorBlack, &stColorWhite,
+                             -offsetX, -offsetY);
+
+  XFreePixmap(stDisplay, dataPixmap);
+
+  if (cursor != None)
+    XDefineCursor(stDisplay, stWindow, cursor);
+#else
   unsigned char data[32], mask[32];    /* cursors are always 16x16 */
   int i;
@@ -1244,4 +1295,5 @@
     XDefineCursor(stDisplay, stWindow, cursor);
 #endif
+#endif
   return 0;
 }
@@ -1362,4 +1414,45 @@
 }
 
+#ifndef HEADLESS
+static void copyReverseImageBits(int *fromImageData, int *toImageData,
+                          int width, int height,
+                          int affectedL, int affectedT, int affectedR, int
affectedB)
+{
+  register int scanLine, widthWord;
+  register int line;
+  register unsigned int *from;
+  register unsigned char *to;
+
+  scanLine= bytesPerLine(width, 1);
+  {
+    register int firstWord;
+    firstWord= bytesPerLineRD(affectedL, 1);
+    widthWord= bytesPerLine(affectedR, 1) - firstWord;
+    firstWord += scanLine*affectedT;
+    from= (unsigned int *)((int)fromImageData+firstWord);
+    to= (unsigned char*)((int)toImageData+firstWord);
+  }
+  scanLine -= widthWord*4;
+
+  for (line= affectedB-affectedT; line > 0; line--)
+  {
+    register int limit;
+    for(limit= widthWord; limit > 0; limit--)
+      {
+       register unsigned int c;
+       c = *from++;
+       to[3] = swapBits(c);    c >>= 8;
+       to[2] = swapBits(c);    c >>= 8;
+       to[1] = swapBits(c);    c >>= 8;
+       to[0] = swapBits(c);
+       to += 4;
+      }
+      from= (unsigned int*)((int)from + scanLine);
+      to= (unsigned char*)((int)to + scanLine);
+  }
+}
+
+#endif
+
 int ioShowDisplay(int dispBitsIndex, int width, int height, int depth,
                  int affectedL, int affectedR, int affectedT, int affectedB)
@@ -1372,5 +1465,5 @@
     return 1;
 
-  if (!(depth == 8 || depth == 16 || depth == 32))
+  if (!(depth == 1 || depth == 8 || depth == 16 || depth == 32))
   {
     fprintf(stderr, "depth %d is not supported\n", depth);
@@ -1388,8 +1481,15 @@
 #endif
       stDisplayBitsIndex= dispBitsIndex;
-      if (stImage)
-       {
+      if( depth == 1 ){
+       if (stImage1){
+         stImage1->data= 0; /* don't you dare free() Display's Bitmap! */
+         stXDestroyImage(stImage1);
+       }
+      } else {
+       if (stImage){
          stImage->data= 0; /* don't you dare free() Display's Bitmap! */
          stXDestroyImage(stImage);
+       }
+      }
          if (stDisplayBitmap)
            {
@@ -1397,5 +1497,4 @@
              stDisplayBitmap = 0;
            }
-       }
 
 #ifndef USE_XSHM
@@ -1422,4 +1521,34 @@
 #endif
 
+      if( depth == 1 )
+       {
+      stImage1= stXCreateImage(stDisplay,
+                             DefaultVisual(stDisplay,
DefaultScreen(stDisplay)),
+                             1,
+                             XYBitmap,
+                             0,
+                             (stDisplayBitmap
+                                ? stDisplayBitmap
+                                : (char *)stDisplayBitsIndex),
+                             width,
+                             height,
+                             32,
+                             0);
+      /* Xlib ignores the following */
+#ifdef HAS_LSB_FIRST
+      stImage1->byte_order = LSBFirst;
+      stImage1->bitmap_bit_order = LSBFirst;
+#else
+      stImage1->byte_order = MSBFirst;
+      stImage1->bitmap_bit_order = MSBFirst;
+#endif
+      /* not really required (since we never call Get/PutPixel), but what
the hey */
+      /*
+      if (!XInitImage(stImage1))
+       fprintf(stderr, "XInitImage failed (but we don't care)\n");
+      */
+       }
+      else
+       {
       stImage= stXCreateImage(stDisplay,
                              DefaultVisual(stDisplay,
DefaultScreen(stDisplay)),
@@ -1447,4 +1576,5 @@
        fprintf(stderr, "XInitImage failed (but we don't care)\n");
       */
+       }
     }
 
@@ -1453,4 +1583,26 @@
   if (affectedB > height) affectedB= height;
 
+  if(depth == 1){
+      int i;
+#ifdef USE_XSHM
+      if (useXshm)
+         copyReverseImageBytes((int *)dispBitsIndex, (int *)stDisplayBitmap,
+                               depth, width, height,
+                               affectedL, affectedT, affectedR, affectedB);
+      else
+#endif
+      {
+#ifdef HAS_LSB_FIRST
+      copyReverseImageBits((int *)dispBitsIndex, (int *)stDisplayBitmap,
+                           width, height,
+                           affectedL, affectedT, affectedR, affectedB);
+#endif
+      }
+  stXPutImage(stDisplay, stWindow, stGC, stImage1,
+             affectedL, affectedT,     /* src_x, src_y */
+             affectedL, affectedT,     /* dst_x, dst_y */
+             affectedR-affectedL,      /* width */
+             affectedB-affectedT);     /* height */
+  } else {
   if (depth != stBitsPerPixel)
     {
@@ -1542,5 +1694,4 @@
 #endif
     }
-
   stXPutImage(stDisplay, stWindow, stGC, stImage,
              affectedL, affectedT,     /* src_x, src_y */
@@ -1548,8 +1699,10 @@
              affectedR-affectedL,      /* width */
              affectedB-affectedT);     /* height */
+  }
 #endif
   return 0;
 }
 
+
 #ifndef HEADLESS
 void copyReverseImageBytes(int *fromImageData, int *toImageData,
@@ -1611,4 +1764,6 @@
 }
 
+#ifndef HAS_LSB_FIRST
+# ifdef USE_XSHM
 void copyImage8To8(int *fromImageData, int *toImageData,
                   int width, int height,
@@ -1632,4 +1787,7 @@
   }
 }
+#endif
+#endif
+
 
 void copyImage8To16(int *fromImageData, int *toImageData,
@@ -2269,5 +2427,5 @@
     initialHeapSize= strtobkm(ev);
   else
-    initialHeapSize= 5*1024*1024;      /* 5 megabytes by default */
+    initialHeapSize= 15*1024*1024;     /* 5 megabytes by default */
 
   if (getenv("SQUEAK_LAZY"))

--------------6BD33CBCEC0--



--------------------------------------------
$B@>86Ao;N(B (NISHIHARA Satoshi)
e-mail: nishis at urban.ne.jp
      : tcc00164 at niftyserve.or.jp
URL:    http://www.urban.ne.jp/home/nishis/
--------------------------------------------





More information about the Squeak-dev mailing list