X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/micropolis/blobdiff_plain/0ac8627d3110b429d57db91538cf1f07d6428e72..6f214ac0ef5899987197c2e4c9baa0b51a04c197:/src/sim/w_x.c diff --git a/src/sim/w_x.c b/src/sim/w_x.c index 0d68209..b7cc9e9 100644 --- a/src/sim/w_x.c +++ b/src/sim/w_x.c @@ -91,7 +91,11 @@ unsigned char ColorIntensities[] = { /* COLOR_BLACK */ 0, }; +void FreeTiles(SimView *view); +void AllocTiles(SimView *view); +void DoAdjustPan(struct SimView *view); +void ViewToTileCoords(SimView *view, int x, int y, int *outx, int *outy) { x = (view->pan_x - ((view->w_width >>1) - x)) >>4; @@ -120,6 +124,7 @@ ViewToTileCoords(SimView *view, int x, int y, int *outx, int *outy) } +void ViewToPixelCoords(SimView *view, int x, int y, int *outx, int *outy) { x = view->pan_x - ((view->w_width >>1) - x); @@ -148,7 +153,8 @@ ViewToPixelCoords(SimView *view, int x, int y, int *outx, int *outy) } -UpdateFlush() +void +UpdateFlush(void) { struct XDisplay *xd; @@ -216,7 +222,8 @@ printf("GOT X ERROR code %d request code %d %d\n", } -DoStopMicropolis() +void +DoStopMicropolis(void) { (void)XSetErrorHandler(CatchXError); @@ -244,7 +251,8 @@ DoStopMicropolis() } -DoTimeoutListen() +void +DoTimeoutListen(void) { while (Tk_DoOneEvent(TK_DONT_WAIT)) ; } @@ -273,10 +281,7 @@ XDisplay * FindXDisplay(Tk_Window tkwin) { XDisplay *xd; - int d = 8; - unsigned long valuemask = 0; - XGCValues values; - XColor rgb, *color; + XColor *color; Display *dpy = Tk_Display(tkwin); Screen *screen = Tk_Screen(tkwin); #ifdef IS_LINUX @@ -327,28 +332,44 @@ FindXDisplay(Tk_Window tkwin) color->pixel; \ break; \ case 15: \ + if (xd->visual->red_mask == 0x7c00) { \ xd->pixels[i] = \ (((color->red >> (8 + 3)) & 0x1f) << (5 + 5)) | \ (((color->green >> (8 + 2)) & 0x1f) << (5)) | \ (((color->blue >> (8 + 3)) & 0x1f) << (0)); \ + } else { \ + xd->pixels[i] = \ + (((color->blue >> (8 + 3)) & 0x1f) << (5 + 5)) | \ + (((color->green >> (8 + 2)) & 0x1f) << (5)) | \ + (((color->red >> (8 + 3)) & 0x1f) << (0)); \ + } \ break; \ case 16: \ + if (xd->visual->red_mask == 0xf800) { \ xd->pixels[i] = \ (((color->red >> (8 + 3)) & 0x1f) << (6 + 5)) | \ (((color->green >> (8 + 2)) & 0x3f) << (5)) | \ (((color->blue >> (8 + 3)) & 0x1f) << (0)); \ + } else { \ + xd->pixels[i] = \ + (((color->blue >> (8 + 3)) & 0x1f) << (6 + 5)) | \ + (((color->green >> (8 + 2)) & 0x3f) << (5)) | \ + (((color->red >> (8 + 3)) & 0x1f) << (0)); \ + } \ break; \ case 24: \ + case 32: \ + if (xd->visual->red_mask == 0xff0000) { \ xd->pixels[i] = \ ((color->red & 0xff) << 16) | \ ((color->green & 0xff) << 8) | \ ((color->blue & 0xff) << 0); \ - break; \ - case 32: \ + } else { \ xd->pixels[i] = \ - ((color->red & 0xff) << 16) | \ + ((color->blue & 0xff) << 16) | \ ((color->green & 0xff) << 8) | \ - ((color->blue & 0xff) << 0); \ + ((color->red & 0xff) << 0); \ + } \ break; \ } \ } \ @@ -441,9 +462,7 @@ FindXDisplay(Tk_Window tkwin) } else { fprintf(stderr, "Cool, I found the shared memory extension!\n"); - fprintf(stderr, - "Disabled SHM, because it is currently broken!\n"); - xd->shared = 0; + xd->shared = 1; } } } @@ -472,12 +491,14 @@ FindXDisplay(Tk_Window tkwin) } +void IncRefDisplay(XDisplay *xd) { xd->references++; } +void DecRefDisplay(XDisplay *xd) { if ((--xd->references) == 0) { @@ -489,14 +510,8 @@ DecRefDisplay(XDisplay *xd) SimView * InitNewView(SimView *view, char *title, int class, int w, int h) { - int type, i; int test = 1; - int d = 8; - unsigned long valuemask = 0; char *t; - struct XDisplay *xd; - XGCValues values; - XColor rgb, *color; t = (char *)ckalloc(strlen(title) + 1); strcpy(t, title); @@ -585,8 +600,8 @@ InitNewView(SimView *view, char *title, int class, int w, int h) view->type = X_Mem_View; } - /* XXX: Find cases where transaltion is needed */ - view->x->needs_swap = 0; + view->x->needs_swap = !(*(unsigned char*) (&test)); + view->x->x_big_endian = (ImageByteOrder(view->x->dpy) == MSBFirst); GetPixmaps(view->x); @@ -598,12 +613,11 @@ InitNewView(SimView *view, char *title, int class, int w, int h) view->pan_x = w / 2; view->pan_y = h / 2; DoResizeView(view, w, h); - GetViewTiles(view); - return (view); } +void DestroyView(SimView *view) { SimView **vp; @@ -712,6 +726,7 @@ AllocPixels(int len, unsigned char pixel) } +void DoResizeView(SimView *view, int w, int h) { int resize = 0; @@ -923,7 +938,7 @@ DoResizeView(SimView *view, int w, int h) if (!GotXError) { attached = 1; view->pixmap = XShmCreatePixmap(view->x->dpy, view->x->root, - view->data, view->shminfo, + (char*)view->data, view->shminfo, view->m_width, view->m_height, view->x->depth); XSync(view->x->dpy, False); @@ -1231,15 +1246,20 @@ DoResizeView(SimView *view, int w, int h) } } } + + GetViewTiles(view); + } +void DoPanBy(struct SimView *view, int dx, int dy) { DoPanTo(view, view->pan_x + dx, view->pan_y + dy); } +void DoPanTo(struct SimView *view, int x, int y) { if (view->class != Editor_Class) { @@ -1260,12 +1280,12 @@ DoPanTo(struct SimView *view, int x, int y) /* #define DEBUG_PAN */ +void DoAdjustPan(struct SimView *view) { int ww2 = view->w_width >>1, wh2 = view->w_height >>1; int px = view->pan_x, py = view->pan_y; int last_tile_x = view->tile_x, last_tile_y = view->tile_y; - int last_tile_width = view->tile_width, last_tile_height = view->tile_height; int total_width = view->m_width >>4, total_height = view->m_height >>4; //fprintf(stderr, "DoAdjustPan\n"); @@ -1378,6 +1398,7 @@ DoAdjustPan(struct SimView *view) } +void AllocTiles(SimView *view) { int row, col; @@ -1409,6 +1430,7 @@ AllocTiles(SimView *view) } +void FreeTiles(SimView *view) { int col; @@ -1453,6 +1475,7 @@ NewInk() } +void FreeInk(Ink *ink) { ink->next = OldInk; @@ -1460,6 +1483,7 @@ FreeInk(Ink *ink) } +void StartInk(Ink *ink, int x, int y) { ink->length = 1; @@ -1468,6 +1492,7 @@ StartInk(Ink *ink, int x, int y) } +void AddInk(Ink *ink, int x, int y) { int dx = x - ink->last_x; @@ -1501,7 +1526,7 @@ AddInk(Ink *ink, int x, int y) ink->points[ink->length].y = dy; ink->length++; - ADJUST: + /* ADJUST: */ if (x < ink->left) ink->left = x; if (x > ink->right) @@ -1539,7 +1564,8 @@ AddInk(Ink *ink, int x, int y) } -EraseOverlay() +void +EraseOverlay(void) { Ink *ink;