Annotation of 43BSDTahoe/new/X/showimg/shzoom.c, revision 1.1.1.1

1.1       root        1: #include <stdio.h>
                      2: #include <X/Xlib.h>
                      3: 
                      4: #include "wzoom.cursor"
                      5: #include "wzoom_mask.cursor"
                      6: 
                      7: #define ZOOMFACT 4   /* zoom factor relative to parent window */
                      8: 
                      9: #define MIN(a,b) (((a) < (b)) ? (a) : (b))
                     10: #define MAX(a,b) (((a) > (b)) ? (a) : (b))
                     11: 
                     12: static u_char *zimage = NULL;          /* pointer to storage */
                     13: static unsigned long zsize = 0;        /* current storage size */
                     14: static Bitmap wzmask = NULL;
                     15: static int xcur, ycur;
                     16: static int xnstatic = 0, ynstatic = 0;
                     17: static int xzoom = 0, yzoom = 0, f = 0;
                     18: 
                     19: updatezoom(wzoom, xzoomsize, yzoomsize,
                     20:           x, y, xsize, ysize, image, wzfactor)
                     21: 
                     22:     Window wzoom;              /* zoom window ID */
                     23:     int xzoomsize, yzoomsize;  /* zoom window size */
                     24:     register int x, y;         /* center coord for zoom */
                     25:     int xsize, ysize;          /* size of original image */
                     26:     unsigned char *image;      /* 8-bit image */
                     27:     int wzfactor;              /* parent window zoom factor */
                     28: 
                     29: {
                     30:     unsigned char *malloc(), *free();
                     31:     int i;
                     32:     register int j, xn = xnstatic, yn = ynstatic;
                     33: 
                     34:     if(x<0 || x>=xsize || y<0 || y>= ysize) return;
                     35: 
                     36: /* recalculate the storage needed for nearest larger zoomed pixel */
                     37:     if((f != ZOOMFACT * wzfactor) || (xzoom != xzoomsize) || 
                     38:        (yzoom != yzoomsize)) {
                     39:           f = ZOOMFACT * wzfactor;
                     40:           xn = xnstatic = xzoomsize/f + 1;
                     41:           yn = ynstatic = yzoomsize/f + 1;
                     42:           xzoom = xn*f; 
                     43:           yzoom = yn*f;
                     44:           xcur = (xzoom>>1) - wzoom_x_hot + ((f/ZOOMFACT)<<1);
                     45:           ycur = (yzoom>>1) - wzoom_y_hot + ((f/ZOOMFACT)<<1);
                     46:        }
                     47: 
                     48: /* check available storage space */
                     49:     if( (xzoom*yzoom) > zsize) {
                     50:        if(zimage != NULL) free(zimage);
                     51:        zsize = xzoom*yzoom;
                     52:        if((zimage = malloc(zsize)) == NULL) {
                     53:            fprintf(stderr,"Can't allocate zoom image buffer!\n");
                     54:            exit(1);
                     55:        }
                     56:     }
                     57: 
                     58:     replicate(x-xn/2,y-yn/2,xsize,ysize,image,f,
                     59:            0,0,xzoom,yzoom,zimage);
                     60: 
                     61:     if( (y-yn/2) < 0) 
                     62:       bzero(zimage,xzoom*f*(yn/2-y));
                     63:     if( (y-yn/2+yn) > ysize)
                     64:       bzero(zimage+xzoom*f*(ysize-y+yn/2),
                     65:            xzoom*f*(y-yn/2+yn-ysize));
                     66:     if( (x-xn/2) < 0)
                     67:       for(j=0;j<yzoom;j++) bzero(zimage+j*xzoom,f*(xn/2-x));
                     68:     if( (x-xn/2+xn) > xsize)
                     69:       for(j=0;j<yzoom;j++) bzero(zimage+j*xzoom+f*(xsize-x+xn/2),
                     70:                             f*(x-xn/2+xn-xsize));
                     71: 
                     72:     XPixmapBitsPutZ(wzoom,0,0,xzoom,yzoom,zimage,0,GXcopy,AllPlanes);
                     73: 
                     74:     if(wzmask == NULL) {
                     75:        wzmask = XStoreBitmap(wzoom_mask_width, wzoom_mask_height,
                     76:                              wzoom_mask_bits);
                     77:     }
                     78:     XBitmapBitsPut(wzoom, xcur, ycur,
                     79:                   wzoom_width, wzoom_height, wzoom_bits,
                     80:                   WhitePixel, BlackPixel, wzmask, GXcopy, AllPlanes);
                     81: }
                     82: 
                     83: replicate(x0,y0,w0,h0,from,f,x,y,w,h,to)
                     84: /* Fill array "to" with a piece of "from", each pixel mapping to fxf pixels */
                     85:      unsigned char *from, *to; /* Source array, destination array */
                     86:      int x0,y0,w0,h0;          /* Source origin, dimensions */
                     87:      int x,y,w,h;              /* Destination origin, dimensions */
                     88:      int f;                    /* Replication factor */
                     89: {
                     90:     register unsigned char *s, *d;
                     91:     register int k, n, i;
                     92:     int i0,i1,j0,j1,j;
                     93: 
                     94:     j0 = MAX(0,y0);
                     95:     j1 = MIN(h0,y0+(h-y)/f);
                     96:     i0 = MAX(0,x0);
                     97:     i1 = MIN(w0,x0+(w-x)/f);
                     98:     for(j=j0;j<j1;j++) {
                     99:        s = from + w0*j + i0;
                    100:        d = to + w*(f*(j-y0)+y) + x + f*(i0-x0);
                    101:        i = i1 - i0;
                    102:        n = f;
                    103:        while(i--) {
                    104:            k = n;
                    105:            while(k--) *d++ = *s;
                    106:            s++;
                    107:        }
                    108:        i = f-1;
                    109:        n = f*(i1-i0);
                    110:        s = d - f*(i1-i0);
                    111:        d = s + w;
                    112:        while(i--) {
                    113:            bcopy(s,d,n);
                    114:            d += w;
                    115:        }
                    116:     }
                    117: }
                    118: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.