source: libcaca/trunk/src/cacaview.c @ 717

Last change on this file since 717 was 710, checked in by Sam Hocevar, 14 years ago
  • Merged caca_wait_event() into caca_get_event() and added a timeout parameter to do what both functions did before, and even more.
  • Property svn:keywords set to Id
File size: 20.5 KB
RevLine 
[215]1/*
[291]2 *  cacaview      image viewer for libcaca
[268]3 *  Copyright (c) 2003 Sam Hocevar <sam@zoy.org>
4 *                All Rights Reserved
[215]5 *
[268]6 *  $Id: cacaview.c 710 2006-04-01 14:44:09Z sam $
[215]7 *
[268]8 *  This program is free software; you can redistribute it and/or
[522]9 *  modify it under the terms of the Do What The Fuck You Want To
10 *  Public License, Version 2, as published by Sam Hocevar. See
11 *  http://sam.zoy.org/wtfpl/COPYING for more details.
[215]12 */
13
14#include "config.h"
15
16#include <stdio.h>
[230]17#include <string.h>
[314]18#include <stdlib.h>
[215]19
[254]20#if defined(HAVE_IMLIB2_H)
21#   include <Imlib2.h>
22#else
23#   include <stdio.h>
24#endif
[215]25
[336]26#if defined(HAVE_SLEEP)
27#   include <windows.h>
28#endif
29
[524]30#include "cucul.h"
[215]31#include "caca.h"
32
[254]33/* Local macros */
[360]34#define MODE_IMAGE 1
35#define MODE_FILES 2
36
[254]37#define STATUS_DITHERING 1
38#define STATUS_ANTIALIASING 2
39#define STATUS_BACKGROUND 3
40
[358]41#define ZOOM_FACTOR 1.08f
42#define ZOOM_MAX 50
[662]43#define GAMMA_FACTOR 1.04f
44#define GAMMA_MAX 100
45#define GAMMA(g) (((g) < 0) ? 1.0 / gammatab[-(g)] : gammatab[(g)])
[358]46#define PAD_STEP 0.15
47
[524]48/* libcucul/libcaca contexts */
49cucul_t *qq; caca_t *kk;
50
[246]51/* Local functions */
[360]52static void print_status(void);
53static void print_help(int, int);
[358]54static void set_zoom(int);
[662]55static void set_gamma(int);
[305]56static void load_image(char const *);
[254]57static void unload_image(void);
[358]58static void draw_checkers(int, int, int, int);
[254]59#if !defined(HAVE_IMLIB2_H)
60static int freadint(FILE *);
61static int freadshort(FILE *);
62static int freadchar(FILE *);
63#endif
[246]64
65/* Local variables */
[254]66#if defined(HAVE_IMLIB2_H)
[215]67Imlib_Image image = NULL;
[254]68#endif
[215]69char *pixels = NULL;
[524]70struct cucul_bitmap *bitmap = NULL;
[254]71unsigned int w, h, depth, bpp, rmask, gmask, bmask, amask;
[291]72#if !defined(HAVE_IMLIB2_H)
[254]73unsigned int red[256], green[256], blue[256], alpha[256];
[291]74#endif
[215]75
[358]76float zoomtab[ZOOM_MAX + 1];
[662]77float gammatab[GAMMA_MAX + 1];
[358]78float xfactor = 1.0, yfactor = 1.0, dx = 0.5, dy = 0.5;
[662]79int zoom = 0, g = 0, fullscreen = 0, mode, ww, wh;
[358]80
[215]81int main(int argc, char **argv)
82{
[358]83    int quit = 0, update = 1, help = 0, status = 0;
84    int reload = 0;
[215]85
[233]86    char **list = NULL;
87    int current = 0, items = 0, opts = 1;
[246]88    int i;
[215]89
[524]90    /* Initialise libcucul */
[677]91    qq = cucul_create(0, 0);
[524]92    if(!qq)
[215]93    {
[524]94        fprintf(stderr, "%s: unable to initialise libcucul\n", argv[0]);
95        return 1;
96    }
97
98    kk = caca_attach(qq);
99    if(!kk)
100    {
[215]101        fprintf(stderr, "%s: unable to initialise libcaca\n", argv[0]);
102        return 1;
103    }
104
[343]105    /* Set the window title */
[524]106    caca_set_window_title(kk, "cacaview");
[343]107
[524]108    ww = cucul_get_width(qq);
109    wh = cucul_get_height(qq);
[358]110
111    /* Fill the zoom table */
112    zoomtab[0] = 1.0;
113    for(i = 0; i < ZOOM_MAX; i++)
[662]114        zoomtab[i + 1] = zoomtab[i] * ZOOM_FACTOR;
[358]115
[662]116    /* Fill the gamma table */
117    gammatab[0] = 1.0;
118    for(i = 0; i < GAMMA_MAX; i++)
119        gammatab[i + 1] = gammatab[i] * GAMMA_FACTOR;
120
[233]121    /* Load items into playlist */
122    for(i = 1; i < argc; i++)
123    {
124        /* Skip options except after `--' */
125        if(opts && argv[i][0] == '-')
126        {
127            if(argv[i][1] == '-' && argv[i][2] == '\0')
128                opts = 0;
129            continue;
130        }
[215]131
[233]132        /* Add argv[i] to the list */
133        if(items)
134            list = realloc(list, (items + 1) * sizeof(char *));
135        else
136            list = malloc(sizeof(char *));
137        list[items] = argv[i];
138        items++;
139
140        reload = 1;
[215]141    }
142
143    /* Go ! */
144    while(!quit)
145    {
[681]146        struct caca_event ev;
[358]147        unsigned int const event_mask = CACA_EVENT_KEY_PRESS
148                                      | CACA_EVENT_RESIZE
149                                      | CACA_EVENT_MOUSE_PRESS;
[681]150        unsigned int new_status = 0, new_help = 0;
151        int event;
[215]152
[337]153        if(update)
[710]154            event = caca_get_event(kk, event_mask, &ev, 0);
[337]155        else
[710]156            event = caca_get_event(kk, event_mask, &ev, -1);
[337]157
158        while(event)
[215]159        {
[681]160            if(ev.type & CACA_EVENT_MOUSE_PRESS)
[215]161            {
[681]162                if(ev.data.mouse.button == 1)
[358]163                {
164                    if(items) current = (current + 1) % items;
165                    reload = 1;
166                }
[681]167                else if(ev.data.mouse.button == 2)
[358]168                {
169                    if(items) current = (items + current - 1) % items;
170                    reload = 1;
171                }
172            }
[681]173            else if(ev.type & CACA_EVENT_KEY_PRESS) switch(ev.data.key.c)
[358]174            {
[316]175            case 'n':
176            case 'N':
[233]177                if(items) current = (current + 1) % items;
178                reload = 1;
179                break;
[316]180            case 'p':
181            case 'P':
[233]182                if(items) current = (items + current - 1) % items;
183                reload = 1;
184                break;
[316]185            case 'f':
186            case 'F':
[246]187                fullscreen = ~fullscreen;
188                update = 1;
[358]189                set_zoom(zoom);
[246]190                break;
[316]191            case 'b':
[524]192                i = 1 + cucul_get_feature(qq, CUCUL_BACKGROUND);
193                if(i > CUCUL_BACKGROUND_MAX) i = CUCUL_BACKGROUND_MIN;
194                cucul_set_feature(qq, i);
[254]195                new_status = STATUS_BACKGROUND;
[249]196                update = 1;
197                break;
[316]198            case 'B':
[524]199                i = -1 + cucul_get_feature(qq, CUCUL_BACKGROUND);
200                if(i < CUCUL_BACKGROUND_MIN) i = CUCUL_BACKGROUND_MAX;
201                cucul_set_feature(qq, i);
[254]202                new_status = STATUS_BACKGROUND;
[249]203                update = 1;
204                break;
[316]205            case 'a':
[524]206                i = 1 + cucul_get_feature(qq, CUCUL_ANTIALIASING);
207                if(i > CUCUL_ANTIALIASING_MAX) i = CUCUL_ANTIALIASING_MIN;
208                cucul_set_feature(qq, i);
[254]209                new_status = STATUS_ANTIALIASING;
[249]210                update = 1;
211                break;
[316]212            case 'A':
[524]213                i = -1 + cucul_get_feature(qq, CUCUL_ANTIALIASING);
214                if(i < CUCUL_ANTIALIASING_MIN) i = CUCUL_ANTIALIASING_MAX;
215                cucul_set_feature(qq, i);
[254]216                new_status = STATUS_ANTIALIASING;
[249]217                update = 1;
218                break;
[316]219            case 'd':
[524]220                i = 1 + cucul_get_feature(qq, CUCUL_DITHERING);
221                if(i > CUCUL_DITHERING_MAX) i = CUCUL_DITHERING_MIN;
222                cucul_set_feature(qq, i);
[254]223                new_status = STATUS_DITHERING;
[215]224                update = 1;
225                break;
[316]226            case 'D':
[524]227                i = -1 + cucul_get_feature(qq, CUCUL_DITHERING);
228                if(i < CUCUL_DITHERING_MIN) i = CUCUL_DITHERING_MAX;
229                cucul_set_feature(qq, i);
[254]230                new_status = STATUS_DITHERING;
[236]231                update = 1;
232                break;
[316]233            case '+':
[358]234                update = 1;
235                set_zoom(zoom + 1);
[215]236                break;
[316]237            case '-':
[358]238                update = 1;
239                set_zoom(zoom - 1);
[215]240                break;
[662]241            case 'G':
242                update = 1;
243                set_gamma(g + 1);
244                break;
245            case 'g':
246                update = 1;
247                set_gamma(g - 1);
248                break;
[316]249            case 'x':
250            case 'X':
[215]251                update = 1;
[358]252                set_zoom(0);
[662]253                set_gamma(0);
[215]254                break;
[316]255            case 'k':
256            case 'K':
257            case CACA_KEY_UP:
[358]258                if(yfactor > 1.0) dy -= PAD_STEP / yfactor;
259                if(dy < 0.0) dy = 0.0;
[215]260                update = 1;
261                break;
[316]262            case 'j':
263            case 'J':
264            case CACA_KEY_DOWN:
[358]265                if(yfactor > 1.0) dy += PAD_STEP / yfactor;
266                if(dy > 1.0) dy = 1.0;
[215]267                update = 1;
268                break;
[316]269            case 'h':
270            case 'H':
271            case CACA_KEY_LEFT:
[358]272                if(xfactor > 1.0) dx -= PAD_STEP / xfactor;
273                if(dx < 0.0) dx = 0.0;
[215]274                update = 1;
275                break;
[316]276            case 'l':
277            case 'L':
278            case CACA_KEY_RIGHT:
[358]279                if(xfactor > 1.0) dx += PAD_STEP / xfactor;
280                if(dx > 1.0) dx = 1.0;
[215]281                update = 1;
282                break;
[316]283            case '?':
[254]284                new_help = !help;
[230]285                update = 1;
286                break;
[316]287            case 'q':
288            case 'Q':
[215]289                quit = 1;
290                break;
291            }
[681]292            else if(ev.type == CACA_EVENT_RESIZE)
[354]293            {
[527]294                caca_display(kk);
[681]295                ww = ev.data.resize.w;
296                wh = ev.data.resize.h;
[354]297                update = 1;
[358]298                set_zoom(zoom);
[354]299            }
300
[254]301            if(status || new_status)
302                status = new_status;
303
304            if(help || new_help)
305                help = new_help;
[337]306
[710]307            event = caca_get_event(kk, CACA_EVENT_KEY_PRESS, &ev, 0);
[215]308        }
309
[233]310        if(items && reload)
311        {
[299]312            char *buffer;
313            int len = strlen(" Loading `%s'... ") + strlen(list[current]);
[233]314
[299]315            if(len < ww + 1)
316                len = ww + 1;
317
318            buffer = malloc(len);
319
320            sprintf(buffer, " Loading `%s'... ", list[current]);
[233]321            buffer[ww] = '\0';
[524]322            cucul_set_color(qq, CUCUL_COLOR_WHITE, CUCUL_COLOR_BLUE);
323            cucul_putstr(qq, (ww - strlen(buffer)) / 2, wh / 2, buffer);
[527]324            caca_display(kk);
[524]325            ww = cucul_get_width(qq);
326            wh = cucul_get_height(qq);
[233]327
[254]328            unload_image();
[233]329            load_image(list[current]);
330            reload = 0;
[358]331
332            /* Reset image-specific runtime variables */
333            dx = dy = 0.5;
[233]334            update = 1;
[358]335            set_zoom(0);
[662]336            set_gamma(0);
[233]337
338            free(buffer);
339        }
340
[524]341        cucul_clear(qq);
[230]342
[236]343        if(!items)
[254]344        {
[524]345            cucul_set_color(qq, CUCUL_COLOR_WHITE, CUCUL_COLOR_BLUE);
346            cucul_printf(qq, ww / 2 - 5, wh / 2, " No image. ");
[254]347        }
348        else if(!pixels)
[236]349        {
[302]350#if defined(HAVE_IMLIB2_H)
351#   define ERROR_STRING " Error loading `%s'. "
352#else
353#   define ERROR_STRING " Error loading `%s'. Only BMP is supported. "
354#endif
[299]355            char *buffer;
[302]356            int len = strlen(ERROR_STRING) + strlen(list[current]);
[299]357
358            if(len < ww + 1)
359                len = ww + 1;
360
361            buffer = malloc(len);
362
[302]363            sprintf(buffer, ERROR_STRING, list[current]);
[236]364            buffer[ww] = '\0';
[524]365            cucul_set_color(qq, CUCUL_COLOR_WHITE, CUCUL_COLOR_BLUE);
366            cucul_putstr(qq, (ww - strlen(buffer)) / 2, wh / 2, buffer);
[236]367            free(buffer);
368        }
369        else
370        {
[358]371            float xdelta, ydelta;
372            int y, height;
373
374            y = fullscreen ? 0 : 1;
375            height = fullscreen ? wh : wh - 3;
376
377            xdelta = (xfactor > 1.0) ? dx : 0.5;
378            ydelta = (yfactor > 1.0) ? dy : 0.5;
379
380            draw_checkers(ww * (1.0 - xfactor) / 2,
381                          y + height * (1.0 - yfactor) / 2,
382                          ww * (1.0 + xfactor) / 2,
383                          y + height * (1.0 + yfactor) / 2);
384
[524]385            cucul_draw_bitmap(qq, ww * (1.0 - xfactor) * xdelta,
386                              y + height * (1.0 - yfactor) * ydelta,
387                              ww * (xdelta + (1.0 - xdelta) * xfactor),
388                              y + height * (ydelta + (1.0 - ydelta) * yfactor),
389                              bitmap, pixels);
[236]390        }
[230]391
[246]392        if(!fullscreen)
393        {
[360]394            print_status();
[254]395
[524]396            cucul_set_color(qq, CUCUL_COLOR_LIGHTGRAY, CUCUL_COLOR_BLACK);
[254]397            switch(status)
398            {
399                case STATUS_ANTIALIASING:
[524]400                    cucul_printf(qq, 0, wh - 1, "Antialiasing: %s",
401                  cucul_get_feature_name(cucul_get_feature(qq, CUCUL_ANTIALIASING)));
[254]402                    break;
403                case STATUS_DITHERING:
[524]404                    cucul_printf(qq, 0, wh - 1, "Dithering: %s",
405                  cucul_get_feature_name(cucul_get_feature(qq, CUCUL_DITHERING)));
[254]406                    break;
407                case STATUS_BACKGROUND:
[524]408                    cucul_printf(qq, 0, wh - 1, "Background: %s",
409                  cucul_get_feature_name(cucul_get_feature(qq, CUCUL_BACKGROUND)));
[254]410                    break;
411            }
[246]412        }
413
[236]414        if(help)
415        {
[662]416            print_help(ww - 26, 2);
[215]417        }
[236]418
[527]419        caca_display(kk);
[236]420        update = 0;
[215]421    }
422
423    /* Clean up */
[254]424    unload_image();
[524]425    caca_detach(kk);
[677]426    cucul_free(qq);
[215]427
428    return 0;
429}
430
[360]431static void print_status(void)
432{
[524]433    cucul_set_color(qq, CUCUL_COLOR_WHITE, CUCUL_COLOR_BLUE);
[678]434    cucul_draw_line(qq, 0, 0, ww - 1, 0, " ");
435    cucul_draw_line(qq, 0, wh - 2, ww - 1, wh - 2, "-");
[662]436    cucul_putstr(qq, 0, 0, "q:Quit  np:Next/Prev  +-x:Zoom  gG:Gamma  "
437                           "hjkl:Move  d:Dither  a:Antialias");
[524]438    cucul_putstr(qq, ww - strlen("?:Help"), 0, "?:Help");
439    cucul_printf(qq, 3, wh - 2, "cacaview %s", VERSION);
[662]440    cucul_printf(qq, ww - 30, wh - 2, "(gamma: %#.3g)", GAMMA(g));
[524]441    cucul_printf(qq, ww - 14, wh - 2, "(zoom: %s%i)", zoom > 0 ? "+" : "", zoom);
[360]442
[524]443    cucul_set_color(qq, CUCUL_COLOR_LIGHTGRAY, CUCUL_COLOR_BLACK);
[678]444    cucul_draw_line(qq, 0, wh - 1, ww - 1, wh - 1, " ");
[360]445}
446
447static void print_help(int x, int y)
448{
449    static char const *help[] =
450    {
[662]451        " +: zoom in              ",
452        " -: zoom out             ",
453        " g: decrease gamma       ",
454        " G: increase gamma       ",
455        " x: reset zoom and gamma ",
456        " ----------------------- ",
457        " hjkl: move view         ",
458        " arrows: move view       ",
459        " ----------------------- ",
460        " a: antialiasing method  ",
461        " d: dithering method     ",
462        " b: background mode      ",
463        " ----------------------- ",
464        " ?: help                 ",
465        " q: quit                 ",
[360]466        NULL
467    };
468
469    int i;
470
[524]471    cucul_set_color(qq, CUCUL_COLOR_WHITE, CUCUL_COLOR_BLUE);
[360]472
473    for(i = 0; help[i]; i++)
[524]474        cucul_putstr(qq, x, y + i, help[i]);
[360]475}
476
[358]477static void set_zoom(int new_zoom)
478{
479    int height;
480
481    zoom = new_zoom;
482
483    if(zoom > ZOOM_MAX) zoom = ZOOM_MAX;
484    if(zoom < -ZOOM_MAX) zoom = -ZOOM_MAX;
485
[524]486    ww = cucul_get_width(qq);
[358]487    height = fullscreen ? wh : wh - 3;
488
489    xfactor = (zoom < 0) ? 1.0 / zoomtab[-zoom] : zoomtab[zoom];
490    yfactor = xfactor * ww / height * h / w
[524]491               * cucul_get_height(qq) / cucul_get_width(qq)
492               * caca_get_window_width(kk) / caca_get_window_height(kk);
[358]493
494    if(yfactor > xfactor)
495    {
496        float tmp = xfactor;
497        xfactor = tmp * tmp / yfactor;
498        yfactor = tmp;
499    }
500}
501
[662]502static void set_gamma(int new_gamma)
503{
504    g = new_gamma;
505
506    if(g > GAMMA_MAX) g = GAMMA_MAX;
507    if(g < -GAMMA_MAX) g = -GAMMA_MAX;
508
509    cucul_set_bitmap_gamma(bitmap, (g < 0) ? 1.0 / gammatab[-g] : gammatab[g]);
510}
511
[254]512static void unload_image(void)
[233]513{
[291]514#if defined(HAVE_IMLIB2_H)
[233]515    if(image)
516        imlib_free_image();
[254]517    image = NULL;
518    pixels = NULL;
519#else
520    if(pixels)
521        free(pixels);
522    pixels = NULL;
523#endif
[233]524    if(bitmap)
[653]525        cucul_free_bitmap(bitmap);
[233]526    bitmap = NULL;
[254]527}
[233]528
[305]529static void load_image(char const *name)
[254]530{
[291]531#if defined(HAVE_IMLIB2_H)
[233]532    /* Load the new image */
533    image = imlib_load_image(name);
534
535    if(!image)
536        return;
537
538    imlib_context_set_image(image);
539    pixels = (char *)imlib_image_get_data_for_reading_only();
540    w = imlib_image_get_width();
541    h = imlib_image_get_height();
[254]542    rmask = 0x00ff0000;
543    gmask = 0x0000ff00;
544    bmask = 0x000000ff;
545    amask = 0xff000000;
546    bpp = 32;
547    depth = 4;
[233]548
[524]549    /* Create the libcucul bitmap */
[666]550    bitmap = cucul_create_bitmap(bpp, w, h, depth * w,
[524]551                                 rmask, gmask, bmask, amask);
[233]552    if(!bitmap)
553    {
554        imlib_free_image();
555        image = NULL;
556    }
[254]557
558#else
559    /* Try to load a BMP file */
560    FILE *fp;
561    unsigned int i, colors, offset, tmp, planes;
562
563    fp = fopen(name, "rb");
564    if(!fp)
565        return;
566
567    if(freadshort(fp) != 0x4d42)
568    {
569        fclose(fp);
570        return;
571    }
572
573    freadint(fp); /* size */
574    freadshort(fp); /* reserved 1 */
575    freadshort(fp); /* reserved 2 */
576
577    offset = freadint(fp);
578
579    tmp = freadint(fp); /* header size */
580    if(tmp == 40)
581    {
582        w = freadint(fp);
583        h = freadint(fp);
584        planes = freadshort(fp);
585        bpp = freadshort(fp);
586
587        tmp = freadint(fp); /* compression */
588        if(tmp != 0)
589        {
590            fclose(fp);
591            return;
592        }
593
594        freadint(fp); /* sizeimage */
595        freadint(fp); /* xpelspermeter */
596        freadint(fp); /* ypelspermeter */
597        freadint(fp); /* biclrused */
598        freadint(fp); /* biclrimportantn */
599
600        colors = (offset - 54) / 4;
601        for(i = 0; i < colors && i < 256; i++)
602        {
603            blue[i] = freadchar(fp) * 16;
604            green[i] = freadchar(fp) * 16;
605            red[i] = freadchar(fp) * 16;
606            alpha[i] = 0;
607            freadchar(fp);
608        }
609    }
610    else if(tmp == 12)
611    {
612        w = freadint(fp);
613        h = freadint(fp);
614        planes = freadshort(fp);
615        bpp = freadshort(fp);
616
617        colors = (offset - 26) / 3;
618        for(i = 0; i < colors && i < 256; i++)
619        {
620            blue[i] = freadchar(fp);
621            green[i] = freadchar(fp);
622            red[i] = freadchar(fp);
623            alpha[i] = 0;
624        }
625    }
626    else
627    {
628        fclose(fp);
629        return;
630    }
631
632    /* Fill the rest of the palette */
633    for(i = colors; i < 256; i++)
634        blue[i] = green[i] = red[i] = alpha[i] = 0;
635
636    depth = (bpp + 7) / 8;
637
638    /* Sanity check */
639    if(!w || w > 0x10000 || !h || h > 0x10000 || planes != 1 /*|| bpp != 24*/)
640    {
641        fclose(fp);
642        return;
643    }
644
645    /* Allocate the pixel buffer */
646    pixels = malloc(w * h * depth);
647    if(!pixels)
648    {
649        fclose(fp);
650        return;
651    }
652
653    memset(pixels, 0, w * h * depth);
654
655    /* Read the bitmap data */
656    for(i = h; i--; )
657    {
658        unsigned int j, k, bits = 0;
659
660        switch(bpp)
661        {
662            case 1:
663                for(j = 0; j < w; j++)
664                {
665                    k = j % 32;
666                    if(k == 0)
667                        bits = freadint(fp);
668                    pixels[w * i * depth + j] =
[255]669                        (bits >> ((k & ~0xf) + 0xf - (k & 0xf))) & 0x1;
[254]670                }
671                break;
672            case 4:
673                for(j = 0; j < w; j++)
674                {
675                    k = j % 8;
676                    if(k == 0)
677                        bits = freadint(fp);
678                    pixels[w * i * depth + j] =
679                        (bits >> (4 * ((k & ~0x1) + 0x1 - (k & 0x1)))) & 0xf;
680                }
681                break;
682            default:
[255]683                /* Works for 8bpp, but also for 16, 24 etc. */
[254]684                fread(pixels + w * i * depth, w * depth, 1, fp);
685                /* Pad reads to 4 bytes */
[255]686                tmp = (w * depth) % 4;
687                tmp = (4 - tmp) % 4;
[254]688                while(tmp--)
689                    freadchar(fp);
690                break;
691        }
692    }
693
694    switch(depth)
695    {
696    case 3:
697        rmask = 0xff0000;
698        gmask = 0x00ff00;
699        bmask = 0x0000ff;
700        amask = 0x000000;
701        break;
702    case 2: /* XXX: those are the 16 bits values */
703        rmask = 0x7c00;
704        gmask = 0x03e0;
705        bmask = 0x001f;
706        amask = 0x0000;
707        break;
708    case 1:
709    default:
710        bpp = 8;
711        rmask = gmask = bmask = amask = 0;
712        break;
713    }
714
715    fclose(fp);
716
[666]717    /* Create the libcucul bitmap */
718    bitmap = cucul_create_bitmap(bpp, w, h, depth * w,
[540]719                                 rmask, gmask, bmask, amask);
[254]720    if(!bitmap)
721    {
722        free(pixels);
723        pixels = NULL;
724        return;
725    }
726
727    if(bpp == 8)
[653]728        cucul_set_bitmap_palette(bitmap, red, green, blue, alpha);
[254]729#endif
[233]730}
731
[358]732static void draw_checkers(int x1, int y1, int x2, int y2)
[246]733{
[358]734    int xn, yn;
[246]735
[524]736    if(x2 + 1 > (int)cucul_get_width(qq)) x2 = cucul_get_width(qq) - 1;
737    if(y2 + 1 > (int)cucul_get_height(qq)) y2 = cucul_get_height(qq) - 1;
[358]738
739    for(yn = y1 > 0 ? y1 : 0; yn <= y2; yn++)
740        for(xn = x1 > 0 ? x1 : 0; xn <= x2; xn++)
[246]741    {
[254]742        if((((xn - x1) / 5) ^ ((yn - y1) / 3)) & 1)
[524]743            cucul_set_color(qq, CUCUL_COLOR_LIGHTGRAY, CUCUL_COLOR_DARKGRAY);
[246]744        else
[524]745            cucul_set_color(qq, CUCUL_COLOR_DARKGRAY, CUCUL_COLOR_LIGHTGRAY);
746        cucul_putchar(qq, xn, yn, ' ');
[246]747    }
748}
749
[254]750#if !defined(HAVE_IMLIB2_H)
751static int freadint(FILE *fp)
752{
753    unsigned char buffer[4];
754    fread(buffer, 4, 1, fp);
755    return ((int)buffer[3] << 24) | ((int)buffer[2] << 16)
756             | ((int)buffer[1] << 8) | ((int)buffer[0]);
757}
758
759static int freadshort(FILE *fp)
760{
761    unsigned char buffer[2];
762    fread(buffer, 2, 1, fp);
763    return ((int)buffer[1] << 8) | ((int)buffer[0]);
764}
765
766static int freadchar(FILE *fp)
767{
768    unsigned char buffer;
769    fread(&buffer, 1, 1, fp);
770    return (int)buffer;
771}
772#endif
773
Note: See TracBrowser for help on using the repository browser.