Annotation of researchv9/jtools/src/blitblt/blitblt.c, revision 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.