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
|