|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T s
Length: 3363 (0xd23)
Types: TextFile
Names: »shzoom.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
└─⟦526ad3590⟧ »EUUGD11/gnu-31mar87/X.V10.R4.tar.Z«
└─⟦2109abc41⟧
└─⟦this⟧ »./X.V10R4/showimg/shzoom.c«
#include <stdio.h>
#include <X/Xlib.h>
#include "wzoom.cursor"
#include "wzoom_mask.cursor"
#define ZOOMFACT 4 /* zoom factor relative to parent window */
#define MIN(a,b) (((a) < (b)) ? (a) : (b))
#define MAX(a,b) (((a) > (b)) ? (a) : (b))
static u_char *zimage = NULL; /* pointer to storage */
static unsigned long zsize = 0; /* current storage size */
static Bitmap wzmask = NULL;
static int xcur, ycur;
static int xnstatic = 0, ynstatic = 0;
static int xzoom = 0, yzoom = 0, f = 0;
updatezoom(wzoom, xzoomsize, yzoomsize,
x, y, xsize, ysize, image, wzfactor)
Window wzoom; /* zoom window ID */
int xzoomsize, yzoomsize; /* zoom window size */
register int x, y; /* center coord for zoom */
int xsize, ysize; /* size of original image */
unsigned char *image; /* 8-bit image */
int wzfactor; /* parent window zoom factor */
{
unsigned char *malloc(), *free();
int i;
register int j, xn = xnstatic, yn = ynstatic;
if(x<0 || x>=xsize || y<0 || y>= ysize) return;
/* recalculate the storage needed for nearest larger zoomed pixel */
if((f != ZOOMFACT * wzfactor) || (xzoom != xzoomsize) ||
(yzoom != yzoomsize)) {
f = ZOOMFACT * wzfactor;
xn = xnstatic = xzoomsize/f + 1;
yn = ynstatic = yzoomsize/f + 1;
xzoom = xn*f;
yzoom = yn*f;
xcur = (xzoom>>1) - wzoom_x_hot + ((f/ZOOMFACT)<<1);
ycur = (yzoom>>1) - wzoom_y_hot + ((f/ZOOMFACT)<<1);
}
/* check available storage space */
if( (xzoom*yzoom) > zsize) {
if(zimage != NULL) free(zimage);
zsize = xzoom*yzoom;
if((zimage = malloc(zsize)) == NULL) {
fprintf(stderr,"Can't allocate zoom image buffer!\n");
exit(1);
}
}
replicate(x-xn/2,y-yn/2,xsize,ysize,image,f,
0,0,xzoom,yzoom,zimage);
if( (y-yn/2) < 0)
bzero(zimage,xzoom*f*(yn/2-y));
if( (y-yn/2+yn) > ysize)
bzero(zimage+xzoom*f*(ysize-y+yn/2),
xzoom*f*(y-yn/2+yn-ysize));
if( (x-xn/2) < 0)
for(j=0;j<yzoom;j++) bzero(zimage+j*xzoom,f*(xn/2-x));
if( (x-xn/2+xn) > xsize)
for(j=0;j<yzoom;j++) bzero(zimage+j*xzoom+f*(xsize-x+xn/2),
f*(x-xn/2+xn-xsize));
XPixmapBitsPutZ(wzoom,0,0,xzoom,yzoom,zimage,0,GXcopy,AllPlanes);
if(wzmask == NULL) {
wzmask = XStoreBitmap(wzoom_mask_width, wzoom_mask_height,
wzoom_mask_bits);
}
XBitmapBitsPut(wzoom, xcur, ycur,
wzoom_width, wzoom_height, wzoom_bits,
WhitePixel, BlackPixel, wzmask, GXcopy, AllPlanes);
}
replicate(x0,y0,w0,h0,from,f,x,y,w,h,to)
/* Fill array "to" with a piece of "from", each pixel mapping to fxf pixels */
unsigned char *from, *to; /* Source array, destination array */
int x0,y0,w0,h0; /* Source origin, dimensions */
int x,y,w,h; /* Destination origin, dimensions */
int f; /* Replication factor */
{
register unsigned char *s, *d;
register int k, n, i;
int i0,i1,j0,j1,j;
j0 = MAX(0,y0);
j1 = MIN(h0,y0+(h-y)/f);
i0 = MAX(0,x0);
i1 = MIN(w0,x0+(w-x)/f);
for(j=j0;j<j1;j++) {
s = from + w0*j + i0;
d = to + w*(f*(j-y0)+y) + x + f*(i0-x0);
i = i1 - i0;
n = f;
while(i--) {
k = n;
while(k--) *d++ = *s;
s++;
}
i = f-1;
n = f*(i1-i0);
s = d - f*(i1-i0);
d = s + w;
while(i--) {
bcopy(s,d,n);
d += w;
}
}
}