diff options
Diffstat (limited to 'x11/xzoom/files/patch-xzoom.c')
-rw-r--r-- | x11/xzoom/files/patch-xzoom.c | 427 |
1 files changed, 427 insertions, 0 deletions
diff --git a/x11/xzoom/files/patch-xzoom.c b/x11/xzoom/files/patch-xzoom.c new file mode 100644 index 000000000000..0a5ed453d0f3 --- /dev/null +++ b/x11/xzoom/files/patch-xzoom.c @@ -0,0 +1,427 @@ +--- xzoom.c.orig Wed May 29 18:40:51 1996 ++++ xzoom.c Sat Jan 15 00:00:00 2000 +@@ -12,13 +12,20 @@ + exact location where the source code can be obtained. + + Changelist: +-Author Description +------- ----------- +-Itai Nahshon Version 0.1, Nov. 21 1995 +-Itai Nahshon Version 0.2, Apr. 17 1996 +- include <sys/types.h> +- Use memmove() instead of memcopy() +- Optional macro to replace call to usleep(). ++Author Description ++------ ----------- ++Itai Nahshon Version 0.1, Nov. 21 1995 ++Itai Nahshon Version 0.2, Apr. 17 1996 ++ include <sys/types.h> ++ Use memmove() instead of memcopy() ++ Optional macro to replace call to usleep(). ++Markus F.X.J. Oberhumer Version 0.4, Feb. 18 1998 ++ split into 2 files (scale.h) ++ added support for 15, 16, 24 and 32 bpp displays ++ added a grid (press key 'g') ++ optimized scaling routines ++ use memcpy() instead of memmove() ;-) ++ some other minor changes/fixes + */ + + #include <stdio.h> +@@ -87,8 +94,12 @@ + int xzoom_flag = False; /* next mag change only to magx */ + int yzoom_flag = False; /* next mag change only to magy */ + ++int gridx = False; ++int gridy = False; ++ + int width[2] = { 0, WIDTH }; + int height[2] = { 0, HEIGHT }; ++unsigned depth = 0; + + #ifdef XSHM + XShmSegmentInfo shminfo[2]; /* Segment info. */ +@@ -106,6 +117,7 @@ + void + timeout_func(int signum) { + set_title = True; ++ signum = signum; /* UNUSED */ + } + + #ifdef FRAME +@@ -116,9 +128,6 @@ + void + allocate_images(void) { + int i; +-#ifndef XSHM +- char *data; +-#endif + + for(i = 0; i < 2; i++) { + +@@ -137,7 +146,7 @@ + shminfo[i].shmid = shmget(IPC_PRIVATE, + (unsigned int)(ximage[i]->bytes_per_line * ximage[i]->height), + IPC_CREAT | 0777); +- ++ + if(shminfo[i].shmid < 0) { + perror("shmget"); + exit(-1); +@@ -163,20 +172,21 @@ + + shmctl(shminfo[i].shmid, IPC_RMID, 0); + #else +- data = malloc(width[i] * height[i]); ++ char *data; ++ data = malloc(BitmapUnit(dpy) / 8 * width[i] * height[i]); + + ximage[i] = XCreateImage(dpy, + DefaultVisualOfScreen(scr), + DefaultDepthOfScreen(scr), + ZPixmap, 0, data, +- width[i], height[i], 8, width[i]); ++ width[i], height[i], 32, 0); + + if(ximage[i] == NULL) { + perror("XCreateImage"); + exit(-1); + } + +-#endif XSHM ++#endif /* XSHM */ + } + created_images = True; + } +@@ -185,6 +195,9 @@ + destroy_images(void) { + int i; + ++ if (!created_images) ++ return; ++ + for(i = 0; i < 2; i++) { + #ifdef XSHM + XShmDetach(dpy, &shminfo[i]); /* ask X11 to detach shared segment */ +@@ -195,6 +208,8 @@ + ximage[i]->data = NULL; /* remove refrence to that address */ + XDestroyImage(ximage[i]); /* and destroy image */ + } ++ ++ created_images = False; + } + + void +@@ -230,8 +245,7 @@ + void + resize(int new_width, int new_height) { + +- if(created_images) +- destroy_images(); /* we can get rid of these */ ++ destroy_images(); /* we can get rid of these */ + + /* find new dimensions for source */ + +@@ -244,9 +258,13 @@ + height[SRC] = (new_height+magy-1) / magy; + } + ++ if(width[SRC] < 1) ++ width[SRC] = 1; + if(width[SRC] > WidthOfScreen(scr)) + width[SRC] = WidthOfScreen(scr); + ++ if(height[SRC] < 1) ++ height[SRC] = 1; + if(height[SRC] > HeightOfScreen(scr)) + height[SRC] = HeightOfScreen(scr); + +@@ -270,12 +288,34 @@ + height[DST] = new_height; + } + ++ ++void scale8(void) ++{ ++#define T unsigned char ++#include "scale.h" ++#undef T ++} ++ ++ ++void scale16(void) ++{ ++#define T unsigned short ++#include "scale.h" ++#undef T ++} ++ ++ ++void scale32(void) ++{ ++#define T unsigned int ++#include "scale.h" ++#undef T ++} ++ ++ + int + main(int argc, char **argv) { + XSetWindowAttributes xswa; +- int i, j, k; +- char c; +- char *p1, *p2; + XEvent event; + int buttonpressed = False; + int unmapped = True; +@@ -286,8 +326,9 @@ + int source_geom_mask = NoValue, + dest_geom_mask = NoValue, + copy_from_src_mask; +- int xpos = 0, ypos = 0; ++ int xpos = 0, ypos = 0; + ++ atexit(destroy_images); + progname = strrchr(argv[0], '/'); + if(progname) + ++progname; +@@ -312,7 +353,7 @@ + + if(magx <= 0) + Usage(); +- ++ + + magy = argc > 1 ? atoi(argv[1]) : -1; + +@@ -340,7 +381,7 @@ + flipxy = True; + continue; + } +- ++ + if(!strcmp(argv[0], "-source")) { + ++argv; --argc; + +@@ -438,23 +479,24 @@ + + scr = DefaultScreenOfDisplay(dpy); + +- if(DefaultDepthOfScreen(scr) != 8) { +- fprintf(stderr, "%s: can work only with 8 bits/pixel\n", progname); ++ depth = DefaultDepthOfScreen(scr); ++ if (depth < 8) { ++ fprintf(stderr, "%s: need at least 8 bits/pixel\n", progname); + exit(1); + } + + if(source_geom_mask & XNegative) + xgrab += WidthOfScreen(scr); +- ++ + if(source_geom_mask & YNegative) + ygrab += HeightOfScreen(scr); + + if(dest_geom_mask & XNegative) + xpos += WidthOfScreen(scr); +- ++ + if(source_geom_mask & YNegative) + ypos += HeightOfScreen(scr); +- ++ + /* printf("=%dx%d+%d+%d\n", width[DST], height[DST], xpos, ypos); */ + + xswa.event_mask = ButtonPressMask|ButtonReleaseMask|ButtonMotionMask; +@@ -463,17 +505,17 @@ + xswa.background_pixel = BlackPixelOfScreen(scr); + + win = XCreateWindow(dpy, RootWindowOfScreen(scr), +- xpos, ypos, width[DST], height[DST], 0, ++ xpos, ypos, width[DST], height[DST], 0, + DefaultDepthOfScreen(scr), InputOutput, + DefaultVisualOfScreen(scr), + CWEventMask | CWBackPixel, &xswa); + +- XChangeProperty(dpy, win, XA_WM_ICON_NAME, XA_STRING, 8, ++ XChangeProperty(dpy, win, XA_WM_ICON_NAME, XA_STRING, 8, + PropModeReplace, + (unsigned char *)progname, strlen(progname)); + + /* +- XChangeProperty(dpy, win, XA_WM_NAME, XA_STRING, 8, ++ XChangeProperty(dpy, win, XA_WM_NAME, XA_STRING, 8, + PropModeReplace, + (unsigned char *)progname, strlen(progname)); + */ +@@ -512,7 +554,7 @@ + { + static char bitmap_data[] = { 0 }; + static XColor col = { 0 }; +- Pixmap curs = XCreatePixmapFromBitmapData(dpy, ++ Pixmap curs = XCreatePixmapFromBitmapData(dpy, + RootWindowOfScreen(scr), bitmap_data, 1, 1, 0, 0, 1); + + when_button = XCreatePixmapCursor(dpy, curs, curs, &col, &col, 0, 0); +@@ -567,6 +609,7 @@ + + case '+': + case '=': ++ case XK_KP_Add: + if(!yzoom_flag) ++magx; + if(!xzoom_flag) ++magy; + xzoom_flag = yzoom_flag = False; +@@ -575,6 +618,7 @@ + break; + + case '-': ++ case XK_KP_Subtract: + if(!yzoom_flag) --magx; + if(!xzoom_flag) --magy; + xzoom_flag = yzoom_flag = False; +@@ -585,6 +629,7 @@ + break; + + case XK_Left: ++ case XK_KP_Left: + if(flipxy) + if(flipx) + ygrab += scroll; +@@ -598,6 +643,7 @@ + break; + + case XK_Right: ++ case XK_KP_Right: + if(flipxy) + if(flipx) + ygrab -= scroll; +@@ -611,6 +657,7 @@ + break; + + case XK_Up: ++ case XK_KP_Up: + if(flipxy) + if(flipy) + xgrab -= scroll; +@@ -624,6 +671,7 @@ + break; + + case XK_Down: ++ case XK_KP_Down: + if(flipxy) + if(flipy) + xgrab += scroll; +@@ -666,12 +714,17 @@ + xzoom_flag = False; + break; + ++ case 'g': ++ gridx = !gridx; ++ gridy = !gridy; ++ break; ++ + case 'd': + if(++delay_index >= NDELAYS) + delay_index = 0; + delay = delays[delay_index]; + sprintf(title, "delay = %d ms", delay/1000); +- XChangeProperty(dpy, win, XA_WM_NAME, XA_STRING, 8, ++ XChangeProperty(dpy, win, XA_WM_NAME, XA_STRING, 8, + PropModeReplace, + (unsigned char *)title, strlen(title)); + signal(SIGALRM, timeout_func); +@@ -717,6 +770,7 @@ + #endif + } + break; ++ + } + + /* trying XShmGetImage when part of the rect is +@@ -736,6 +790,7 @@ + + if(ygrab > HeightOfScreen(scr)-height[SRC]) + ygrab = HeightOfScreen(scr)-height[SRC]; ++ + } + + #ifdef XSHM +@@ -753,63 +808,12 @@ + } + #endif + +- /* copy scaled lines from src to dst */ +- for(j = flipxy?width[SRC]:height[SRC]; --j >= 0; ) { +- /* p1 point to begining of scanline j*magy in DST */ +- p1 = &ximage[DST]->data[ximage[DST]->xoffset + +- j*magy*ximage[DST]->bytes_per_line ]; +- /* p2 point to begining of scanline j in SRC */ +- /* if flipy then line height[SRC]-1-j */ +- p2 = &ximage[SRC]->data[ximage[SRC]->xoffset + +- (flipy?(height[SRC]-1-j):j)*ximage[SRC]->bytes_per_line ]; +- +- if(flipxy) { +- int p2step = ximage[SRC]->bytes_per_line; +- p2 = &ximage[SRC]->data[ximage[SRC]->xoffset + (flipy?j:(width[SRC]-1-j))]; +- +- if(flipx) { +- p2 += p2step * (height[SRC]-1); +- p2step = -p2step; +- } +- +- for(i = height[SRC]; --i >= 0;) { +- c = *p1++ = *p2; +- p2 += p2step; +- for(k = magx; --k > 0; ) +- *p1++ = c; +- } +- } +- else if(flipx) { +- p2 += width[SRC]; +- for(i = width[SRC]; --i >= 0;) { +- c = *p1++ = *--p2; +- for(k = magx; --k > 0; ) +- *p1++ = c; +- } +- } +- else { +- for(i = width[SRC]; --i >= 0;) { +- c = *p1++ = *p2++; +- for(k = magx; --k > 0; ) +- *p1++ = c; +- } +- } +- +- /* p1 point to begining of scanline j*magy in DST */ +- p1 = &ximage[DST]->data[ximage[DST]->xoffset + +- j*magy*ximage[DST]->bytes_per_line ]; +- /* p2 points to begining of next line */ +- p2 = p1 + ximage[DST]->bytes_per_line; +- /* duplicate that line as needed */ +- for(k = magy; --k > 0; ) { +-#ifdef BCOPY +- bcopy(p1, p2, width[DST]); +-#else +- memmove(p2, p1, width[DST]); +-#endif +- p2 += ximage[DST]->bytes_per_line; +- } +- } ++ if (depth == 8) ++ scale8(); ++ else if (depth <= 8*sizeof(short)) ++ scale16(); ++ else if (depth <= 8*sizeof(int)) ++ scale32(); + + #ifdef XSHM + XShmPutImage(dpy, win, gc, ximage[DST], 0, 0, 0, 0, width[DST], height[DST], False); +@@ -825,7 +829,7 @@ + flipx?"-":"", magx, + flipxy?" <=>":";", + flipy?"-":"", magy); +- XChangeProperty(dpy, win, XA_WM_NAME, XA_STRING, 8, ++ XChangeProperty(dpy, win, XA_WM_NAME, XA_STRING, 8, + PropModeReplace, + (unsigned char *)title, strlen(title)); + set_title = False; |