Annotation of researchv9/jtools/src/blitblt/blitblt.c, revision 1.1.1.1

1.1       root        1: #include <jerq.h>
                      2: 
                      3: #define        UP      0
                      4: #define        DOWN    1
                      5: #define NCHFIL 40
                      6: 
                      7: #define drstore(r)     rectf(&display, r, F_STORE)
                      8: #define drflip(r)      rectf(&display, r, F_XOR)
                      9: #define drclr(r)       rectf(&display, r, F_CLR)
                     10: #define drstring(s,p)  string(&defont, s, &display, p, F_XOR)
                     11: 
                     12: extern Cursor menu3, deadmouse;
                     13: 
                     14: char filnam[NCHFIL]="BLITBLT", ppgm[NCHFIL]="| bcan";
                     15: 
                     16: char *top_menu[]={
                     17:        "choose window",
                     18:        "window interior",
                     19:        "reverse video",
                     20:        "sweep rectangle",
                     21:        "whole screen (!)",
                     22:        "write file",
                     23:        ppgm,
                     24:        "exit",
                     25:        NULL
                     26: };
                     27: Menu topmenu={ top_menu };
                     28: 
                     29: Rectangle kbdrect(); Point kbdp; int fail;
                     30: 
                     31: Bitmap *bp;
                     32: Rectangle rect, findproc();
                     33: 
                     34: main(argc, argv)
                     35: char **argv;
                     36: {
                     37:        register m;
                     38:        int i;
                     39:        Rectangle r;
                     40: 
                     41:        for(i = 1; i < argc; i++) {
                     42:                if (argv[i][0] == '-' && argv[i][1] == 'p' && ++i < argc) {
                     43:                        strncpy(ppgm+2, argv[i], 30);
                     44:                        ppgm[30+2] = 0;
                     45:                }
                     46:        }
                     47:        request(KBD|MOUSE);
                     48:        initdisplay(argc, argv);
                     49:        initobjs();
                     50:        cursswitch(&menu3);
                     51:        checkshape(1);
                     52: 
                     53:        for (;; wait(MOUSE)) {
                     54:                if (lbuttons(DOWN) != 3) continue;
                     55: 
                     56:                cursswitch(NULL);
                     57:                m = menuhit(&topmenu,3);
                     58:                switch (m) {
                     59:                case 0:
                     60:                case 1:
                     61:                        r = findproc(m);
                     62:                        flash(r);
                     63:                        break;
                     64:                case 2:
                     65:                        if (bp) {
                     66:                                Jscreengrab();
                     67:                                rectf(bp, rect, F_XOR);
                     68:                                Jscreenrelease();
                     69:                        }
                     70:                        break;
                     71:                case 3:
                     72:                        flash(getrect3());
                     73:                        break;
                     74:                case 4:
                     75:                        flash(Jfscreen.rect);
                     76:                        break;
                     77:                case 5:
                     78:                        getfilnam();
                     79:                        sendrect(filnam);
                     80:                        break;
                     81:                case 6:
                     82:                        sendrect(ppgm);
                     83:                        break;
                     84:                case 7:
                     85:                        if (!lexit3()) break;
                     86:                        exit(0);
                     87:                }
                     88:                cursswitch(&menu3);
                     89:        }
                     90: }
                     91: 
                     92: sendrect(fp)
                     93: char *fp;
                     94: {
                     95:        fail = -1;
                     96:        cursswitch(&deadmouse);
                     97:        drstore(kbdrect());
                     98:        visible(0);
                     99:        if (bp) {
                    100:                Jscreengrab();
                    101:                fail = sendbitmap(bp, rect, fp);
                    102:                Jscreenrelease();
                    103:        }
                    104:        visible(1);
                    105:        drstore(kbdrect());
                    106:        switch (fail) {
                    107:        case -1:
                    108:                drstring("No selection", kbdp); break;
                    109:        case 0:
                    110:                drstring(fp, drstring("Wrote ", kbdp)); break;
                    111:        default:
                    112:                drstring("Write failed", kbdp); break;
                    113:        }
                    114: }
                    115: 
                    116: getfilnam()
                    117: {
                    118:        Point p; char str[NCHFIL];
                    119:        drstore(kbdrect());
                    120:        p=drstring("File (",kbdp); p=drstring(filnam,p); p=drstring("): ",p);
                    121: 
                    122:        if (kbdstring(str,NCHFIL,p) > 0) strcpy(filnam,str);
                    123: }
                    124: 
                    125: #ifdef SUNTOOLS
                    126: /*
                    127:  * Determine the window mpos is in
                    128:  * and return its rectangle.  If flag is
                    129:  * set don't return the border.
                    130:  */
                    131: Rectangle windowrect(mpos, flag)
                    132: Point mpos;
                    133: int flag;
                    134: {
                    135:        int wfd, next;
                    136:        Rectangle r;
                    137:        char name[WIN_NAMESIZE];
                    138:        struct rect srect;
                    139:        char *getenv();
                    140:        Point porigin;
                    141: 
                    142:        porigin = Jfscreen.rect.origin;
                    143:        if ((wfd = open(getenv("WINDOW_PARENT"), 0)) < 0)
                    144:                goto out;
                    145: again:
                    146:        next = win_getlink(wfd, WL_TOPCHILD);
                    147:        close(wfd);
                    148:        while (next != WIN_NULLLINK) {
                    149:                win_numbertoname(next, name);
                    150:                if ((wfd = open(name, 0)) < 0)
                    151:                        goto out;
                    152:                win_getrect(wfd, &srect);
                    153:                r.origin.x = srect.r_left;
                    154:                r.origin.y = srect.r_top;
                    155:                r.corner.x = r.origin.x + srect.r_width;
                    156:                r.corner.y = r.origin.y + srect.r_height;
                    157:                r = raddp(r, porigin);
                    158:                if (ptinrect(mpos, r)) {
                    159:                        if (flag) {
                    160:                                porigin = r.origin;
                    161:                                flag = 0;
                    162:                                goto again;
                    163:                        }
                    164:                        close(wfd);
                    165:                        return r;
                    166:                }
                    167:                next = win_getlink(wfd, WL_COVERED);
                    168:                close(wfd);
                    169:        }
                    170: out:
                    171:        r.origin.x = r.origin.y = 0;
                    172:        r.corner.x = r.corner.y = 0;
                    173:        return r;
                    174: }
                    175: 
                    176: getrast(bm,to)
                    177: Bitmap *bm;
                    178: register unsigned short *to;
                    179: {
                    180:        register unsigned short *from;
                    181:        register nshorts;
                    182:        int remainder;
                    183: 
                    184:        from = (unsigned short *)(
                    185:                ((struct mpr_data *)(
                    186:                  ((Pixrect *)bm->dr)->pr_data))->md_image);
                    187:        nshorts = (bm->rect.corner.x - bm->rect.origin.x + 15) / 16;
                    188:        remainder = (bm->rect.corner.x - bm->rect.origin.x) % 16;
                    189:        while(nshorts--)
                    190:                *to++ = *from++;
                    191:        if (remainder) {
                    192:                to--;
                    193:                *to &= (0xffff << (16 - remainder));
                    194:        }
                    195: }
                    196: #endif SUNTOOLS
                    197: 
                    198: #ifdef X11
                    199: /*
                    200:  * Determine the window mpos is in
                    201:  * and return its rectangle.  If flag is
                    202:  * set don't return the border.
                    203:  */
                    204: Rectangle windowrect(mpos, flag)
                    205: Point mpos;
                    206: int flag;
                    207: {
                    208:        Rectangle r;
                    209:        int nchildren = 0;
                    210:        Window rt, parent, *children;
                    211:        int x, y;
                    212:        unsigned w, h, bw, d;
                    213: 
                    214:        XQueryTree(dpy, RootWindow(dpy, DefaultScreen(dpy)), &rt, &parent,
                    215:                   &children, &nchildren);
                    216:        while (nchildren-- >= 0) {
                    217:                XGetGeometry(dpy, children[nchildren], &rt,
                    218:                             &x, &y, &w, &h, &bw, &d);
                    219:                r.origin.x = x + bw;
                    220:                r.origin.y = y + bw;
                    221:                r.corner.x = r.origin.x + w;
                    222:                r.corner.y = r.origin.y + h;
                    223:                if (ptinrect(mpos, r)) {
                    224:                        if (!flag)
                    225:                                r = inset(r, -bw);
                    226:                        break;
                    227:                }
                    228:        }
                    229:        if (nchildren < 0) {
                    230:                r.origin.x = r.origin.y = 0;
                    231:                r.corner.x = r.corner.y = 0;
                    232:        }
                    233: out:
                    234:        XFree(children);
                    235:        return r;
                    236: }
                    237: 
                    238: getrast(bm,to)
                    239: Bitmap *bm;
                    240: register unsigned short *to;
                    241: {
                    242:        register unsigned short *from;
                    243:        register nshorts;
                    244:        int remainder;
                    245:        XImage *im;
                    246: 
                    247:        im = XGetImage(dpy, bm->dr, 0, 0, bm->rect.corner.x - bm->rect.origin.x,
                    248:                       1, 1, XYPixmap);
                    249:        from = (unsigned short *)im->data;
                    250:        nshorts = (bm->rect.corner.x - bm->rect.origin.x + 15) / 16;
                    251:        remainder = (bm->rect.corner.x - bm->rect.origin.x) % 16;
                    252:        while(nshorts--)
                    253:                *to++ = *from++;
                    254:        if (remainder) {
                    255:                to--;
                    256:                *to &= (0xffff << (16 - remainder));
                    257:        }
                    258:        XDestroyImage(im);
                    259: }
                    260: #endif X11

unix.superglobalmegacorp.com

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