Ignore:
Timestamp:
Nov 29, 2003, 6:36:00 PM (17 years ago)
Author:
Sam Hocevar
Message:
  • examples/view.c: + Added top and bottom status lines, like in mutt and slrn. + Added a status string when loading an image or upon error. + Can load multiple files; use 'n' and 'p' for next and previous. + Clip zoom between -48 and +48.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcaca/trunk/examples/view.c

    r230 r233  
    2626#include <stdio.h>
    2727#include <string.h>
     28#include <malloc.h>
    2829
    2930#define X_DISPLAY_MISSING 1
     
    3536char *pixels = NULL;
    3637struct caca_bitmap *bitmap = NULL;
     38int x, y, w, h;
    3739
    3840int dithering = 1;
     
    4042    { CACA_DITHER_NONE, CACA_DITHER_ORDERED, CACA_DITHER_RANDOM };
    4143
     44static void load_image(const char *);
     45
    4246int main(int argc, char **argv)
    4347{
    44     int quit = 0, update = 1, help = 0;
    45     int x, y, w, h, zoom = 0;
    46 
    47     if(argc != 2)
    48     {
    49         fprintf(stderr, "usage: %s <filename>\n", argv[0]);
    50         return 1;
    51     }
    52 
    53     image = imlib_load_image(argv[1]);
    54 
    55     if(!image)
    56     {
    57         fprintf(stderr, "%s: unable to open `%s'\n", argv[0], argv[1]);
    58         return 1;
    59     }
    60 
    61     imlib_context_set_image(image);
    62     pixels = (char *)imlib_image_get_data_for_reading_only();
    63     w = imlib_image_get_width();
    64     h = imlib_image_get_height();
    65     x = w / 2;
    66     y = h / 2;
    67 
     48    int quit = 0, update = 1, help = 0, reload = 0;
     49    int i, zoom = 0;
     50
     51    char **list = NULL;
     52    int current = 0, items = 0, opts = 1;
     53
     54    /* Initialise libcaca */
    6855    if(caca_init())
    6956    {
     
    7259    }
    7360
    74     /* Create the libcaca bitmap */
    75     bitmap = caca_create_bitmap(32, w, h, 4 * w,
    76                                 0x00ff0000, 0x0000ff00, 0x000000ff);
    77 
    78     if(!image)
    79     {
    80         fprintf(stderr, "%s: unable to create libcaca bitmap\n", argv[0]);
    81         caca_end();
    82         return 1;
     61    /* Load items into playlist */
     62    for(i = 1; i < argc; i++)
     63    {
     64        /* Skip options except after `--' */
     65        if(opts && argv[i][0] == '-')
     66        {
     67            if(argv[i][1] == '-' && argv[i][2] == '\0')
     68                opts = 0;
     69            continue;
     70        }
     71
     72        /* Add argv[i] to the list */
     73        if(items)
     74            list = realloc(list, (items + 1) * sizeof(char *));
     75        else
     76            list = malloc(sizeof(char *));
     77        list[items] = argv[i];
     78        items++;
     79
     80        reload = 1;
    8381    }
    8482
     
    8684    while(!quit)
    8785    {
     86        int ww = caca_get_width();
     87        int wh = caca_get_height();
     88
    8889        int event;
    8990
     
    9293            switch(event)
    9394            {
     95            case CACA_EVENT_KEY_PRESS | 'n':
     96            case CACA_EVENT_KEY_PRESS | 'N':
     97                if(items) current = (current + 1) % items;
     98                reload = 1;
     99                break;
     100            case CACA_EVENT_KEY_PRESS | 'p':
     101            case CACA_EVENT_KEY_PRESS | 'P':
     102                if(items) current = (items + current - 1) % items;
     103                reload = 1;
     104                break;
    94105            case CACA_EVENT_KEY_PRESS | 'd':
    95106            case CACA_EVENT_KEY_PRESS | 'D':
     
    99110            case CACA_EVENT_KEY_PRESS | '+':
    100111                zoom++;
    101                 update = 1;
     112                if(zoom > 48) zoom = 48; else update = 1;
    102113                break;
    103114            case CACA_EVENT_KEY_PRESS | '-':
    104115                zoom--;
    105                 update = 1;
     116                if(zoom < -48) zoom = -48; else update = 1;
    106117                break;
    107118            case CACA_EVENT_KEY_PRESS | 'x':
     
    145156        }
    146157
     158        if(items && reload)
     159        {
     160            char *buffer = malloc(ww + 1);
     161
     162            /* Reset image-specific runtime variables */
     163            zoom = 0;
     164
     165            snprintf(buffer, ww, " Loading `%s'... ", list[current]);
     166            buffer[ww] = '\0';
     167            caca_set_color(CACA_COLOR_WHITE, CACA_COLOR_BLUE);
     168            caca_putstr((ww - strlen(buffer)) / 2, wh / 2, buffer);
     169            caca_refresh();
     170
     171            load_image(list[current]);
     172            reload = 0;
     173            update = 1;
     174
     175            free(buffer);
     176        }
     177
    147178        if(update)
    148179        {
    149             int ww = caca_get_width();
    150             int wh = caca_get_height();
    151 
    152180            caca_clear();
    153181            caca_set_dithering(dithering_list[dithering]);
    154             if(zoom < 0)
     182            caca_set_color(CACA_COLOR_WHITE, CACA_COLOR_BLUE);
     183
     184            if(!items)
     185                caca_printf(ww / 2 - 5, wh / 2, " No image. ");
     186            else if(!image)
     187            {
     188                char *buffer = malloc(ww + 1);
     189                snprintf(buffer, ww, " Error loading `%s'. ", list[current]);
     190                buffer[ww] = '\0';
     191                caca_putstr((ww - strlen(buffer)) / 2, wh / 2, buffer);
     192                free(buffer);
     193            }
     194            else if(zoom < 0)
    155195            {
    156196                int xo = (ww - 1) / 2;
     
    183223            caca_set_color(CACA_COLOR_WHITE, CACA_COLOR_BLUE);
    184224            caca_draw_line(0, 0, ww - 1, 0, ' ');
    185             caca_printf(1, 0, "cacaview %s", VERSION);
    186             caca_putstr(ww - strlen("'?' for help") - 1, 0,
    187                         "'?' for help");
     225            caca_draw_line(0, wh - 1, ww - 1, wh - 1, '-');
     226            caca_putstr(0, 0, "q:Quit  +/-/x:Zoom  h/j/k/l: Move  "
     227                              "d:Dithering  ?:Help");
     228            caca_printf(3, wh - 1, "cacaview %s", VERSION);
     229            caca_printf(ww - 14, wh - 1,
     230                        "(zoom: %s%i)", zoom > 0 ? "+" : "", zoom);
    188231
    189232            if(help)
     
    209252    }
    210253
    211     caca_free_bitmap(bitmap);
    212     imlib_free_image();
     254    if(bitmap)
     255        caca_free_bitmap(bitmap);
     256    if(image)
     257        imlib_free_image();
    213258
    214259    /* Clean up */
     
    218263}
    219264
     265static void load_image(const char *name)
     266{
     267    /* Empty previous data */
     268    if(image)
     269        imlib_free_image();
     270
     271    if(bitmap)
     272        caca_free_bitmap(bitmap);
     273
     274    image = NULL;
     275    bitmap = NULL;
     276
     277    /* Load the new image */
     278    image = imlib_load_image(name);
     279
     280    if(!image)
     281    {
     282        return;
     283    }
     284
     285    imlib_context_set_image(image);
     286    pixels = (char *)imlib_image_get_data_for_reading_only();
     287    w = imlib_image_get_width();
     288    h = imlib_image_get_height();
     289    x = w / 2;
     290    y = h / 2;
     291
     292    /* Create the libcaca bitmap */
     293    bitmap = caca_create_bitmap(32, w, h, 4 * w,
     294                                0x00ff0000, 0x0000ff00, 0x000000ff);
     295    if(!bitmap)
     296    {
     297        imlib_free_image();
     298        image = NULL;
     299    }
     300}
     301
Note: See TracChangeset for help on using the changeset viewer.