In 1998, Markus Oberhumer greatly extended this program and bumped

the version to 0.4.  Finally switch to a tarball that incorporates
those changes and stop carrying them along as a patch set.
This commit is contained in:
Christian Weisgerber 2020-07-13 15:21:51 +00:00
parent 80bbe5d4ad
commit 626e2b6d8a
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/head/; revision=542143
6 changed files with 8 additions and 561 deletions

View File

@ -2,15 +2,14 @@
# $FreeBSD$
PORTNAME= xzoom
PORTVERSION= 0.3
PORTREVISION= 2
PORTVERSION= 0.4
CATEGORIES= x11 accessibility
MASTER_SITES= SUNSITE/libs/X
MASTER_SITES= http://www.linklevel.net/distfiles/
MAINTAINER= ports@FreeBSD.org
COMMENT= Magnify, rotate, mirror the image on the X screen
COMMENT= Magnify, rotate, mirror the image on the X11 screen
USES= imake tar:tgz xorg
USES= imake xorg
USE_XORG= x11 xext
PLIST_FILES= bin/xzoom man/man1/xzoom.1.gz

View File

@ -1,2 +1,3 @@
SHA256 (xzoom-0.3.tgz) = b26bfd692d3e1d30e8d524d4018fc3f0fe847983a2778a4a2496784bfc2df44b
SIZE (xzoom-0.3.tgz) = 9127
TIMESTAMP = 1594653417
SHA256 (xzoom-0.4.tar.gz) = 42e70abffa34a2bb6e11b38fb978ffb3de7de3f918bb2638b6a3425579716f84
SIZE (xzoom-0.4.tar.gz) = 9773

View File

@ -1,105 +0,0 @@
--- scale.h.orig Sat Jan 15 14:23:58 2000
+++ scale.h Sat Jan 15 00:00:00 2000
@@ -0,0 +1,102 @@
+/* scale image from SRC to DST - parameterized by type T */
+
+/* get pixel address of point (x,y) in image t */
+#define getP(t,x,y) \
+ (T *) (&ximage[t]->data[(ximage[t]->xoffset+(x))*sizeof(T) + \
+ (y)*ximage[t]->bytes_per_line])
+
+{
+ int i, j, k;
+
+ /* copy scaled lines from SRC to DST */
+ j = flipxy ? width[SRC] - 1 : height[SRC] - 1;
+ do {
+ T *p1;
+ T *p2;
+ int p2step;
+ T *p1_save;
+
+ /* p1 point to begining of scanline j*magy in DST */
+ p1 = getP(DST,0,j*magy);
+ p1_save = p1;
+ /* p2 point to begining of scanline j in SRC */
+ /* if flipy then line height[SRC]-1-j */
+ p2 = getP(SRC,0,flipy ? (height[SRC]-1-j) : j);
+
+ if (flipxy)
+ {
+ p2 = getP(SRC,flipy ? j : (width[SRC]-1-j),0);
+ p2step = ximage[SRC]->bytes_per_line / sizeof(T);
+
+ if (flipx)
+ {
+ p2 += p2step * (height[SRC]-1);
+ p2step = -p2step;
+ }
+
+ i = height[SRC];
+ do {
+ T c = *p2; p2 += p2step;
+ k = magx; do *p1++ = c; while (--k > 0);
+ } while (--i > 0);
+ }
+ else if (flipx)
+ {
+ p2 += width[SRC];
+ i = width[SRC];
+ do {
+ T c = *--p2;
+ k = magx; do *p1++ = c; while (--k > 0);
+ } while (--i > 0);
+ }
+ else
+ {
+ i = width[SRC];
+ do {
+ T c = *p2++;
+ k = magx; do *p1++ = c; while (--k > 0);
+ } while (--i > 0);
+ }
+
+ /* draw vertical grid */
+ if (gridy && magx >= 2)
+ {
+ p1 = p1_save - 1;
+ i = magx;
+ k = flipxy ? height[SRC] : width[SRC];
+ do {
+ p1 += i;
+ *p1 ^= ~((T)0);
+ } while (--k > 0);
+ }
+
+ /* duplicate that line as needed */
+ if (magy > 1)
+ {
+ /* p1 point to begining of scanline j*magy in DST */
+ p1 = p1_save;
+ /* p2 points to begining of next line */
+ p2 = p1;
+ p2step = ximage[DST]->bytes_per_line / sizeof(T);
+
+ i = width[DST] * sizeof(T);
+ k = magy - 1;
+ do {
+ p2 += p2step;
+ memcpy(p2, p1, i);
+ } while (--k > 0);
+
+ /* draw horizontal grid */
+ if (gridx && magy >= 2)
+ {
+ k = width[DST];
+ do {
+ *p2++ ^= ~((T)0);
+ } while (--k > 0);
+ }
+ }
+ } while (--j >= 0);
+}
+
+#undef getP
+

View File

@ -1,427 +0,0 @@
--- 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;

View File

@ -1,21 +0,0 @@
--- xzoom.man.orig Thu Apr 18 01:37:48 1996
+++ xzoom.man Sat Jan 15 00:00:00 2000
@@ -3,7 +3,7 @@
.\"
.TH XZOOM 1X
.SH NAME
-xzoom \-
+xzoom \- magnify part of the screen, with fast updates
.SH SYNOPSIS
.B xzoom
[ \-display \fIdisplayname\fP ] [ \-mag \fImag\fP [ \fImag\fP ] ]
@@ -84,6 +84,9 @@
.B d
sets the delay between frame updates.
Built-in delays are 200, 100, 50, 10 and 0 ms.
+.TP 5
+.B g
+toggle grid on and off.
.TP 5
.B Mouse buttons
To set the location of the magnified are click the left mouse

View File

@ -1 +1 @@
magnify, rotate, mirror the image on the X screen
Magnify, rotate, mirror the image on the X11 screen.