Annotation of 43BSD/contrib/X/pikapix/pikapix.c, revision 1.1

1.1     ! root        1: #include <X/mit-copyright.h>
        !             2: 
        !             3: /* Copyright    Massachusetts Institute of Technology    1985  */
        !             4: 
        !             5: #ifndef lint
        !             6: static char *rcsid_pikapix_c = "$Header: pikapix.c,v 10.5 86/02/01 16:11:15 tony Rel $";
        !             7: #endif lint
        !             8: 
        !             9: #include <X/Xlib.h>
        !            10: #include <stdio.h>
        !            11: #include <strings.h>
        !            12: #include "../cursors/target.cursor"
        !            13: #include "../cursors/target_mask.cursor"
        !            14: #include <sys/types.h>
        !            15: 
        !            16: #define pik_width 15
        !            17: #define pik_height 15
        !            18: static short pik_bits[] = {
        !            19:    0x8080, 0x8080, 0x81c0, 0x83e0,
        !            20:    0x87f0, 0x8ff8, 0x9ffc, 0xbffe,
        !            21:    0xbffe, 0xbffe, 0xbffe, 0xbffe,
        !            22:    0xbffe, 0xbffe, 0x8000};
        !            23: static short pik_mask_bits[] = {
        !            24:    0x8080, 0x81c0, 0x83e0, 0x87f0,
        !            25:    0x8ff8, 0x9ffc, 0xbffe, 0xffff,
        !            26:    0xffff, 0xffff, 0xffff, 0xffff,
        !            27:    0xffff, 0xffff, 0xffff};
        !            28: 
        !            29: #define MIN(a,b) (((a) < (b)) ? (a) : (b))
        !            30: 
        !            31: #define MAXIDX 200
        !            32: #define PROMPT "#ffffff -> "
        !            33: #define ASKSIZE (sizeof(PROMPT) + 25)
        !            34: 
        !            35: #define RGBSIDE 50
        !            36: #define RGBWIDTH (RGBSIDE * 3)
        !            37: #define RGBHEIGHT (RGBSIDE * 2)
        !            38: 
        !            39: #define BASEDELTA (1<<8)
        !            40: 
        !            41: char *malloc();
        !            42: 
        !            43: Window win;
        !            44: u_char *buf;
        !            45: u_char transbuf[256];
        !            46: int width, height;
        !            47: int pixels[5];
        !            48: Color cdefs[2];
        !            49: Color origdefs[256];
        !            50: WindowInfo rinfo;
        !            51: Font font;
        !            52: Color rgbdefs[3];
        !            53: Window rgb, redw, greenw, bluew;
        !            54: int rgbx, rgby;
        !            55: int shared = 0;
        !            56: 
        !            57: main(argc, argv)
        !            58: int argc;
        !            59: char **argv;
        !            60: {
        !            61:     Cursor cursor;
        !            62:     XEvent ev;
        !            63:     XExposeEvent *exp = (XExposeEvent *) &ev;
        !            64:     XMouseMovedEvent *mot = (XMouseMovedEvent *) &ev;
        !            65:     register XButtonPressedEvent *but = (XButtonPressedEvent *) &ev;
        !            66:     WindowInfo winfo;
        !            67:     Window ask;
        !            68:     int asking = 0;
        !            69:     int askwidth;
        !            70:     int askheight;
        !            71:     char colorbuf[MAXIDX + sizeof(PROMPT) + 1];
        !            72:     register char *colorname = &colorbuf[sizeof(PROMPT)];
        !            73:     int coloridx = 0;
        !            74:     int mixing = 0;
        !            75:     int mixtrack = 0;
        !            76:     char *string;
        !            77:     int nbytes;
        !            78:     int tpix, cnt;
        !            79:     unsigned char pixel;
        !            80:     Color cdef;
        !            81:     FontInfo finfo;
        !            82:     int xoff, yoff;
        !            83:     char *display = NULL;
        !            84: 
        !            85:     for (cnt = 1; cnt < argc; cnt++) {
        !            86:        if (!*argv[cnt]) continue;
        !            87:        if (strcmp(argv[cnt], "-s") == 0)
        !            88:            shared = 1;
        !            89:        else if (index(argv[cnt], ':'))
        !            90:            display = argv[cnt];
        !            91:        else {
        !            92:            fprintf(stderr, "usage: pikapix [-s] [host:display]\n");
        !            93:            (void) fflush(stderr);
        !            94:            exit(1);
        !            95:        }
        !            96:     }
        !            97:     if (!XOpenDisplay(display)) {
        !            98:        perror("pikapix");
        !            99:        exit(1);
        !           100:     }
        !           101:     if (DisplayPlanes() < 2 || DisplayPlanes() > 8)
        !           102:        Error("only works on displays with 2 to 8 planes");
        !           103:     cursor = XCreateCursor(target_width, target_height,
        !           104:                           target_bits, target_mask_bits,
        !           105:                           8, 8, BlackPixel, WhitePixel, GXcopy);
        !           106:     while (!XGrabMouse(RootWindow, cursor, ButtonPressed))
        !           107:        sleep(1);
        !           108:     XNextEvent(&ev);
        !           109:     XUngrabMouse();
        !           110:     win = but->subwindow;
        !           111:     if (!win)
        !           112:        Error("no window selected");
        !           113:     xoff = 0;
        !           114:     yoff = 0;
        !           115:     switch (but->detail & ValueMask) {
        !           116:     case LeftButton:
        !           117:     case MiddleButton:
        !           118:        do {
        !           119:            XInterpretLocator(win, &but->x, &but->y, &but->subwindow,
        !           120:                              but->location);
        !           121:            if (!but->subwindow)
        !           122:                break;
        !           123:            if (!XQueryWindow(win, &winfo))
        !           124:                Error("window disappeared");
        !           125:            xoff += winfo.x + winfo.bdrwidth;
        !           126:            yoff += winfo.y + winfo.bdrwidth;
        !           127:            but->window = win;
        !           128:            win = but->subwindow;
        !           129:        } while ((but->detail & ValueMask) == LeftButton);
        !           130:     }
        !           131:     XFreeCursor(cursor);
        !           132:     if (!XGetColorCells(0, 5, 0, &cnt, pixels))
        !           133:        Error("not enough color map entries");
        !           134:     cdefs[0].pixel = pixels[0];
        !           135:     cdefs[0].red = cdefs[0].green = cdefs[0].blue = ~0;
        !           136:     cdefs[1].pixel = pixels[1];    
        !           137:     cdefs[1].red = cdefs[1].green = cdefs[1].blue = 0;
        !           138:     XStoreColors(2, cdefs);
        !           139:     cursor = XCreateCursor(pik_width, pik_height,
        !           140:                           pik_bits, pik_mask_bits,
        !           141:                           7, 0, pixels[0], pixels[1], GXcopy);
        !           142:     if (!XQueryWindow(win, &winfo))
        !           143:        Error("window disappeared");
        !           144:     width = winfo.width + (winfo.bdrwidth << 1);
        !           145:     height = winfo.height + (winfo.bdrwidth << 1);
        !           146:     nbytes = BZPixmapSize(width, height);
        !           147:     buf = (u_char *) malloc(nbytes);
        !           148:     if (buf == NULL)
        !           149:        Error("window too large");
        !           150:     XPixmapGetZ(but->window, winfo.x, winfo.y, width, height, buf);
        !           151:     if (!shared) {
        !           152:        for (cnt = 256; --cnt >= 0; )
        !           153:            transbuf[cnt] = cnt;
        !           154:        while (--nbytes >= 0) {
        !           155:            pixel = buf[nbytes];
        !           156:            if (transbuf[pixel] != pixel)
        !           157:                continue;
        !           158:            cdef.pixel = pixel;
        !           159:            XQueryColor(&cdef);
        !           160:            if (!XGetColorCells(0, 1, 0, &cnt, &cdef.pixel))
        !           161:                Error("not enough color map entries, try -s option");
        !           162:            transbuf[pixel] = cdef.pixel;
        !           163:            origdefs[cdef.pixel] = cdef;
        !           164:            origdefs[pixel] = cdef;
        !           165:            origdefs[pixel].pixel = pixel;
        !           166:            XStoreColors(1, &cdef);
        !           167:        }
        !           168:     } else {
        !           169:        transbuf[0] = 1;
        !           170:        while (--nbytes >= 0) {
        !           171:            pixel = buf[nbytes];
        !           172:            if (transbuf[pixel] == pixel)
        !           173:                continue;
        !           174:            cdef.pixel = pixel;
        !           175:            XQueryColor(&cdef);
        !           176:            transbuf[pixel] = pixel;
        !           177:            origdefs[pixel] = cdef;
        !           178:        }
        !           179:     }
        !           180:     win = XCreateWindow(RootWindow, xoff + winfo.x, yoff + winfo.y,
        !           181:                        width, height, 0, (Pixmap) 0, (Pixmap) 0);
        !           182:     XStoreName(win, "pikapix");
        !           183:     XDefineCursor(win, cursor);
        !           184:     XSelectInput(win, KeyPressed|ButtonPressed|ExposeRegion|MouseMoved);
        !           185:     XMapWindow(win);
        !           186:     font = XGetFont("6x10");
        !           187:     if (!font) Error("couldn't open font");
        !           188:     XQueryFont(font, &finfo);
        !           189:     askwidth = finfo.width * ASKSIZE + 2;
        !           190:     askheight = finfo.height + 2;
        !           191:     ask = XCreateWindow(RootWindow, 0, 0, askwidth, askheight,
        !           192:                        2, BlackPixmap, WhitePixmap);
        !           193:     askwidth += 4;
        !           194:     askheight += 4;
        !           195:     XSelectInput(ask, KeyPressed|ExposeWindow|ButtonPressed);
        !           196:     XDefineCursor(ask, cursor);
        !           197:     rgb = XCreateWindow(RootWindow, 0, 0, RGBWIDTH, RGBHEIGHT,
        !           198:                        2, XMakeTile(pixels[1]), XMakeTile(pixels[0]));
        !           199:     redw = XCreateWindow(rgb, 0, 0, RGBSIDE, RGBSIDE,
        !           200:                         0, (Pixmap) 0, XMakeTile(pixels[2]));
        !           201:     rgbdefs[0].pixel = pixels[2];
        !           202:     greenw = XCreateWindow(rgb, RGBSIDE, 0, RGBSIDE, RGBSIDE,
        !           203:                           0, (Pixmap) 0, XMakeTile(pixels[3]));
        !           204:     rgbdefs[1].pixel = pixels[3];
        !           205:     bluew = XCreateWindow(rgb, RGBSIDE * 2, 0, RGBSIDE, RGBSIDE,
        !           206:                          0, (Pixmap) 0, XMakeTile(pixels[4]));
        !           207:     rgbdefs[2].pixel = pixels[4];
        !           208:     rgbx = (RGBWIDTH - (finfo.width * 6)) >> 1;
        !           209:     rgby = RGBSIDE + ((RGBSIDE - finfo.height) >> 1);
        !           210:     XMapSubwindows(rgb);
        !           211:     XSelectInput(rgb, ButtonPressed|ExposeWindow);
        !           212:     XSelectInput(redw, ButtonPressed|ButtonReleased|MiddleDownMotion);
        !           213:     XSelectInput(greenw, ButtonPressed|ButtonReleased|MiddleDownMotion);
        !           214:     XSelectInput(bluew, ButtonPressed|ButtonReleased|MiddleDownMotion);
        !           215:     XDefineCursor(rgb, cursor);
        !           216:     XQueryWindow(RootWindow, &rinfo);
        !           217:     RedoCursor(1);
        !           218:     while (1) {
        !           219:        XNextEvent(&ev);
        !           220:        switch ((int)ev.type) {
        !           221:        case MouseMoved:
        !           222:            if (asking || (mixing && !mixtrack))
        !           223:                break;
        !           224:            if (mixtrack) {
        !           225:                XUpdateMouse(mot->window, &xoff, &yoff, &mot->subwindow);
        !           226:                CalcRGB(mot->window, pixel, yoff);
        !           227:            } else
        !           228:                RedoCursor(0);
        !           229:            break;
        !           230:        case KeyPressed:
        !           231:            string = XLookupMapping (&ev, &nbytes);
        !           232:            if (nbytes == 1 && (*string == '\003' || *string == '\004')) {
        !           233:                if (asking) {
        !           234:                    coloridx = 0;
        !           235:                    asking = 0;
        !           236:                    XUnmapWindow(ask);
        !           237:                    RedoCursor(0);
        !           238:                } else if (mixing) {
        !           239:                    mixing = 0;
        !           240:                    XUnmapWindow(rgb);
        !           241:                    RedoCursor(1);
        !           242:                } else
        !           243:                    exit(0);
        !           244:            } else if (asking && ev.window == ask) {
        !           245:                while (--nbytes >= 0)
        !           246:                    colorname[coloridx++] = *string++;
        !           247:                if (colorname[coloridx - 1] == '\r') {
        !           248:                        coloridx--;
        !           249:                        asking = 0;
        !           250:                } else if (colorname[coloridx - 1] == '\177') {
        !           251:                    if (--coloridx) {
        !           252:                        --coloridx;
        !           253:                        XClear(ask);
        !           254:                    }
        !           255:                } else if (colorname[coloridx - 1] == '\025') {
        !           256:                    if (--coloridx)
        !           257:                        XClear(ask);
        !           258:                    coloridx = 0;
        !           259:                }
        !           260:                XText(ask, 1, 1, colorbuf, sizeof (PROMPT) + coloridx, font,
        !           261:                        BlackPixel, WhitePixel);
        !           262:                if (!asking) {
        !           263:                    XUnmapWindow(ask);
        !           264:                    if (coloridx) {
        !           265:                        colorname[coloridx] = '\0';
        !           266:                        if (XParseColor(colorname, &cdef)) {
        !           267:                            if (!shared) {
        !           268:                                cdef.pixel = transbuf[pixel];
        !           269:                                XStoreColors(1, &cdef);
        !           270:                                origdefs[cdef.pixel] = cdef;
        !           271:                                RedoCursor(1);
        !           272:                            } else if (XGetHardwareColor(&cdef)) {
        !           273:                                if (transbuf[pixel] != pixel) {
        !           274:                                    tpix = transbuf[pixel];
        !           275:                                    XFreeColors(&tpix, 1, 0);
        !           276:                                }
        !           277:                                transbuf[pixel] = cdef.pixel;
        !           278:                                origdefs[cdef.pixel] = cdef;
        !           279:                                RedoCursor(1);
        !           280:                                BitsPut(0, 0, width, height);
        !           281:                            } else XFeep(0);
        !           282:                        } else
        !           283:                            XFeep(0);
        !           284:                        coloridx = 0;
        !           285:                    }
        !           286:                }
        !           287:            }
        !           288:            break;
        !           289:        case ButtonPressed:
        !           290:            if (asking) {
        !           291:                coloridx = 0;
        !           292:                asking = 0;
        !           293:                XUnmapWindow(ask);
        !           294:                RedoCursor(1);
        !           295:                break;
        !           296:            }
        !           297:            if (mixing && but->window == rgb) {
        !           298:                switch (but->detail & ValueMask) {
        !           299:                case LeftButton:
        !           300:                case MiddleButton:
        !           301:                    if ((but->detail & ValueMask) == LeftButton)
        !           302:                        cdefs[0] = origdefs[pixel];
        !           303:                    else
        !           304:                        cdefs[0] = cdef;
        !           305:                    if (!shared) {
        !           306:                        cdefs[0].pixel = transbuf[pixel];
        !           307:                        origdefs[cdefs[0].pixel] = cdefs[0];
        !           308:                        XStoreColors(1, &cdefs[0]);
        !           309:                    }
        !           310:                    cdefs[0].pixel = pixels[0];
        !           311:                    rgbdefs[0].red = cdefs[0].red;
        !           312:                    rgbdefs[1].green = cdefs[0].green;
        !           313:                    rgbdefs[2].blue = cdefs[0].blue;
        !           314:                    XStoreColors(3, rgbdefs);
        !           315:                    ResetCursor();
        !           316:                    PrintRGB();
        !           317:                    break;
        !           318:                case RightButton:
        !           319:                    XUnmapWindow(rgb);
        !           320:                    if (cdef.red != cdefs[0].red ||
        !           321:                        cdef.green != cdefs[0].green ||
        !           322:                        cdef.blue != cdefs[0].blue) {
        !           323:                        cdef = cdefs[0];
        !           324:                        if (!shared) {
        !           325:                            cdef.pixel = transbuf[pixel];
        !           326:                            origdefs[cdef.pixel] = cdef;
        !           327:                            XStoreColors(1, &cdef);
        !           328:                        } else if (XGetHardwareColor(&cdef)) {
        !           329:                            if (transbuf[pixel] != pixel) {
        !           330:                                tpix = transbuf[pixel];
        !           331:                                XFreeColors(&tpix, 1, 0);
        !           332:                            }
        !           333:                            transbuf[pixel] = cdef.pixel;
        !           334:                            origdefs[cdef.pixel] = cdef;
        !           335:                            RedoCursor(1);
        !           336:                            BitsPut(0, 0, width, height);
        !           337:                        } else
        !           338:                            XFeep(0);
        !           339:                    }
        !           340:                    RedoCursor(1);
        !           341:                    mixing = 0;
        !           342:                    mixtrack = 0;
        !           343:                    break;
        !           344:                }
        !           345:                break;
        !           346:            }
        !           347:            if (mixing && but->window == win)
        !           348:                break;
        !           349:            if (mixing) {
        !           350:                switch (but->detail & ValueMask) {
        !           351:                case MiddleButton:
        !           352:                    mixtrack = 1;
        !           353:                    CalcRGB(but->window, pixel, but->y);
        !           354:                    break;
        !           355:                case LeftButton:
        !           356:                    UpdateRGB(but->window, pixel, -BASEDELTA);
        !           357:                    break;
        !           358:                case RightButton:
        !           359:                    UpdateRGB(but->window, pixel, BASEDELTA);
        !           360:                    break;
        !           361:                }
        !           362:                break;
        !           363:            }
        !           364:            pixel = buf[BZPixmapSize(width, but->y) + BZPixmapSize(but->x, 1)];
        !           365:            switch (but->detail & ValueMask) {
        !           366:            case LeftButton:
        !           367:                if (!shared) {
        !           368:                    cdef = origdefs[pixel];
        !           369:                    cdef.pixel = transbuf[pixel];
        !           370:                    origdefs[cdef.pixel] = cdef;
        !           371:                    XStoreColors(1, &cdef);
        !           372:                    RedoCursor(1);
        !           373:                } else if (transbuf[pixel] != pixel) {
        !           374:                    tpix = transbuf[pixel];
        !           375:                    XFreeColors(&tpix, 1, 0);
        !           376:                    transbuf[pixel] = pixel;
        !           377:                    RedoCursor(1);
        !           378:                    BitsPut(0, 0, width, height);
        !           379:                }
        !           380:                break;
        !           381:            case MiddleButton:
        !           382:                PopWindow(ask, but, askwidth, askheight);
        !           383:                (void)sprintf(colorbuf, "#%02x%02x%02x -> ", cdefs[0].red >> 8,
        !           384:                        cdefs[0].green >> 8, cdefs[0].blue >> 8);
        !           385:                asking = 1;
        !           386:                break;
        !           387:            case RightButton:
        !           388:                mixing = 1;
        !           389:                cdef.red = rgbdefs[0].red = cdefs[0].red;
        !           390:                cdef.green = rgbdefs[1].green = cdefs[0].green;
        !           391:                cdef.blue = rgbdefs[2].blue = cdefs[0].blue;
        !           392:                XStoreColors(3, rgbdefs);
        !           393:                PopWindow(rgb, but, RGBWIDTH+4, RGBHEIGHT+4);
        !           394:                break;
        !           395:            }
        !           396:            break;
        !           397:        case ButtonReleased:
        !           398:            if (mixtrack && ((but->detail & ValueMask) == MiddleButton)) {
        !           399:                CalcRGB(but->window, pixel, but->y);
        !           400:                mixtrack = 0;
        !           401:            }
        !           402:            break;
        !           403:        case ExposeWindow:
        !           404:        case ExposeRegion:
        !           405:            if (exp->window == ask) {
        !           406:                XText(ask, 1, 1, colorbuf, sizeof (PROMPT) + coloridx, font,
        !           407:                        BlackPixel, WhitePixel);
        !           408:            } else if (exp->window == rgb) {
        !           409:                if (exp->subwindow == NULL ) PrintRGB();
        !           410:            } else {
        !           411:                exp->width = MIN(exp->x + exp->width, width) - exp->x;
        !           412:                exp->height = MIN(exp->y + exp->height, height) - exp->y;
        !           413:                if (exp->width > 0 && exp->height > 0)
        !           414:                    BitsPut(exp->x, exp->y, exp->width, exp->height);
        !           415:            }
        !           416:            break;
        !           417:        }
        !           418:     }
        !           419: }
        !           420: 
        !           421: PopWindow (pop, but, w, h)
        !           422:        Window pop;
        !           423:        XButtonPressedEvent *but;
        !           424:        int w, h;
        !           425: {
        !           426:        int x, y;
        !           427: 
        !           428:        x = ((but->location >> 16) & 0xffff) - (w >> 1);
        !           429:        if (x < 0)
        !           430:            x = 0;
        !           431:        else if (x + w > rinfo.width)
        !           432:            x = rinfo.width - w;
        !           433:        y = (but->location & 0xffff) - (h >> 1) - 3;
        !           434:        if (y < 0)
        !           435:            y = 0;
        !           436:        else if (y + h > rinfo.height)
        !           437:            y = rinfo.height - h;
        !           438:        XMoveWindow(pop, x, y);
        !           439:        XMapWindow(pop);
        !           440: }
        !           441: 
        !           442: RedoCursor (force)
        !           443:     int force;
        !           444: {
        !           445:     int x, y;
        !           446:     Window sub;
        !           447:     unsigned char pixel;
        !           448:     static unsigned short curspix = ~0;
        !           449: 
        !           450:     XUpdateMouse(win, &x, &y, &sub);
        !           451:     if (x < 0 || x >= width || y < 0 || y >= height)
        !           452:        return;
        !           453:     pixel = transbuf[buf[BZPixmapSize(width, y) + BZPixmapSize(x, 1)]];
        !           454:     if (!force && (pixel == curspix))
        !           455:        return;
        !           456:     curspix = pixel;
        !           457:     cdefs[0] = origdefs[pixel];
        !           458:     cdefs[0].pixel = pixels[0];
        !           459:     ResetCursor();
        !           460: }
        !           461: 
        !           462: ResetCursor()
        !           463: {
        !           464:        if (cdefs[0].red <= 0x8000 &&
        !           465:            cdefs[0].green <= 0x8000 &&
        !           466:            cdefs[0].blue <= 0x8000)
        !           467:            cdefs[1].red = cdefs[1].green = cdefs[1].blue = ~0;
        !           468:        else
        !           469:            cdefs[1].red = cdefs[1].green = cdefs[1].blue = 0;
        !           470:        XStoreColors(2, cdefs);
        !           471: }
        !           472: 
        !           473: UpdateRGB (ew, pixel, value)
        !           474:        Window ew;
        !           475:        unsigned pixel;
        !           476:        int value;
        !           477: {
        !           478:        Color cdef;
        !           479: 
        !           480:        if (ew == redw) {
        !           481:            value += rgbdefs[0].red;
        !           482:            if (value < 0)
        !           483:                value = 0;
        !           484:            else if (value > 0xffff)
        !           485:                value = 0xffff;
        !           486:            rgbdefs[0].red = value;
        !           487:            XStoreColors(1, &rgbdefs[0]);
        !           488:        } else if (ew == greenw) {
        !           489:            value += rgbdefs[1].green;
        !           490:            if (value < 0)
        !           491:                value = 0;
        !           492:            else if (value > 0xffff)
        !           493:                value = 0xffff;
        !           494:            rgbdefs[1].green = value;
        !           495:            XStoreColors(1, &rgbdefs[1]);
        !           496:        } else if (ew == bluew) {
        !           497:            value += rgbdefs[2].blue;
        !           498:            if (value < 0)
        !           499:                value = 0;
        !           500:            else if (value > 0xffff)
        !           501:                value = 0xffff;
        !           502:            rgbdefs[2].blue = value;
        !           503:            XStoreColors(1, &rgbdefs[2]);
        !           504:        } else
        !           505:            return;
        !           506:        cdefs[0].red = rgbdefs[0].red;
        !           507:        cdefs[0].green = rgbdefs[1].green;
        !           508:        cdefs[0].blue = rgbdefs[2].blue;
        !           509:        ResetCursor();
        !           510:        if (!shared) {
        !           511:            cdef = cdefs[0];
        !           512:            cdef.pixel = transbuf[pixel];
        !           513:            origdefs[cdef.pixel] = cdef;
        !           514:            XStoreColors(1, &cdef);
        !           515:        }
        !           516:        PrintRGB();
        !           517: }
        !           518: 
        !           519: CalcRGB (ew, pixel, value)
        !           520:        Window ew;
        !           521:        unsigned pixel;
        !           522:        int value;
        !           523: {
        !           524:        Color cdef;
        !           525: 
        !           526:        if (value < 0)
        !           527:            value = 0;
        !           528:        else if (value >= RGBSIDE)
        !           529:            value = (RGBSIDE - 1);
        !           530:        value = (0xffff * value) / (RGBSIDE - 1);
        !           531:        if (ew == redw) {
        !           532:            rgbdefs[0].red = value;
        !           533:            XStoreColors(1, &rgbdefs[0]);
        !           534:        } else if (ew == greenw) {
        !           535:            rgbdefs[1].green = value;
        !           536:            XStoreColors(1, &rgbdefs[1]);
        !           537:        } else if (ew == bluew) {
        !           538:            rgbdefs[2].blue = value;
        !           539:            XStoreColors(1, &rgbdefs[2]);
        !           540:        } else
        !           541:            return;
        !           542:        cdefs[0].red = rgbdefs[0].red;
        !           543:        cdefs[0].green = rgbdefs[1].green;
        !           544:        cdefs[0].blue = rgbdefs[2].blue;
        !           545:        ResetCursor();
        !           546:        if (!shared) {
        !           547:            cdef = cdefs[0];
        !           548:            cdef.pixel = transbuf[pixel];
        !           549:            origdefs[cdef.pixel] = cdef;
        !           550:            XStoreColors(1, &cdef);
        !           551:        }
        !           552:        PrintRGB();
        !           553: }
        !           554: 
        !           555: PrintRGB ()
        !           556: {
        !           557:        char rgbbuf[7];
        !           558: 
        !           559:        (void) sprintf(rgbbuf, "%02x%02x%02x", cdefs[0].red >> 8,
        !           560:                cdefs[0].green >> 8, cdefs[0].blue >> 8);
        !           561:        XText(rgb, rgbx, rgby, rgbbuf, 6, font, BlackPixel, WhitePixel);
        !           562: }
        !           563: 
        !           564: #define CHUNKSIZE 2048
        !           565: u_char outbuf[CHUNKSIZE];
        !           566: 
        !           567: BitsPut (x, y, w, h)
        !           568:        int x, y, w, h;
        !           569: {
        !           570:        register u_char *data, *ptr, *trans;
        !           571:        register int i, j;
        !           572:        int per, delta, linesize;
        !           573: 
        !           574:        trans = transbuf;
        !           575:        linesize = BZPixmapSize(width, 1);
        !           576:        data = &buf[y * linesize + BZPixmapSize(x, 1)];
        !           577: 
        !           578:        per = BZPixmapSize(w, 1);
        !           579:        delta = CHUNKSIZE / per;
        !           580:        linesize -= per;
        !           581: 
        !           582:        while (h) {
        !           583:            if (h < delta)
        !           584:                delta = h;
        !           585:            for (ptr = outbuf, i = delta; --i >= 0; data += linesize) {
        !           586:                for (j = per; --j >= 0; )
        !           587:                    *ptr++ = trans[*data++];
        !           588:            }
        !           589:            XPixmapBitsPutZ(win, x, y, w, delta, outbuf,
        !           590:                            NULL, GXcopy, AllPlanes);
        !           591:            y += delta;
        !           592:            h -= delta;
        !           593:        }
        !           594: }
        !           595: 
        !           596: Error (why)
        !           597:        char *why;
        !           598: {
        !           599:        fprintf(stderr, "pikapix: %s\n", why);
        !           600:        (void) fflush(stderr);
        !           601:        exit(1);
        !           602: }

unix.superglobalmegacorp.com

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