Changeset 358 for libcaca


Ignore:
Timestamp:
Jan 21, 2004, 6:25:18 PM (18 years ago)
Author:
Sam Hocevar
Message:
  • examples/cacaview.c: + Proper aspect ratio support. + Finer zoom support. + Handle mouse clicks as next/prev picture command. + Removed useless iterations in draw_checkers().
File:
1 edited

Legend:

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

    r354 r358  
    4545#define STATUS_BACKGROUND 3
    4646
     47#define ZOOM_FACTOR 1.08f
     48#define ZOOM_MAX 50
     49#define PAD_STEP 0.15
     50
    4751/* Local functions */
     52static void set_zoom(int);
    4853static void load_image(char const *);
    4954static void unload_image(void);
    50 static void draw_checkers(unsigned int, unsigned int,
    51                           unsigned int, unsigned int);
     55static void draw_checkers(int, int, int, int);
    5256#if !defined(HAVE_IMLIB2_H)
    5357static int freadint(FILE *);
     
    6266char *pixels = NULL;
    6367struct caca_bitmap *bitmap = NULL;
    64 int x, y;
    6568unsigned int w, h, depth, bpp, rmask, gmask, bmask, amask;
    6669#if !defined(HAVE_IMLIB2_H)
     
    6871#endif
    6972
     73float zoomtab[ZOOM_MAX + 1];
     74float xfactor = 1.0, yfactor = 1.0, dx = 0.5, dy = 0.5;
     75int zoom = 0, fullscreen = 0, ww, wh;
     76
    7077int main(int argc, char **argv)
    7178{
    72     int quit = 0, update = 1, help = 0, fullscreen = 0, status = 0;
    73     int reload = 0, zoom = 0;
     79    int quit = 0, update = 1, help = 0, status = 0;
     80    int reload = 0;
    7481
    7582    char **list = NULL;
     
    8693    /* Set the window title */
    8794    caca_set_window_title("cacaview");
     95
     96    ww = caca_get_width();
     97    wh = caca_get_height();
     98
     99    /* Fill the zoom table */
     100    zoomtab[0] = 1.0;
     101    for(i = 0; i < ZOOM_MAX; i++)
     102        zoomtab[i + 1] = zoomtab[i] * 1.08;
    88103
    89104    /* Load items into playlist */
     
    112127    while(!quit)
    113128    {
    114         int ww, wh;
     129        unsigned int const event_mask = CACA_EVENT_KEY_PRESS
     130                                      | CACA_EVENT_RESIZE
     131                                      | CACA_EVENT_MOUSE_PRESS;
    115132        unsigned int event, new_status = 0, new_help = 0;
    116133
    117         ww = caca_get_width();
    118         wh = caca_get_height();
    119 
    120134        if(update)
    121             event = caca_get_event(CACA_EVENT_KEY_PRESS | CACA_EVENT_RESIZE);
     135            event = caca_get_event(event_mask);
    122136        else
    123             event = caca_wait_event(CACA_EVENT_KEY_PRESS | CACA_EVENT_RESIZE);
     137            event = caca_wait_event(event_mask);
    124138
    125139        while(event)
    126140        {
    127             unsigned int key = event & 0x00ffffff;
    128 
    129             if(key) switch(key)
     141            if(event & CACA_EVENT_MOUSE_PRESS)
     142            {
     143                if((event & 0x00ffffff) == 1)
     144                {
     145                    if(items) current = (current + 1) % items;
     146                    reload = 1;
     147                }
     148                else if((event & 0x00ffffff) == 2)
     149                {
     150                    if(items) current = (items + current - 1) % items;
     151                    reload = 1;
     152                }
     153            }
     154            else if(event & CACA_EVENT_KEY_PRESS) switch(event & 0x00ffffff)
    130155            {
    131156            case 'n':
     
    143168                fullscreen = ~fullscreen;
    144169                update = 1;
     170                set_zoom(zoom);
    145171                break;
    146172            case 'b':
     
    187213                break;
    188214            case '+':
    189                 zoom++;
    190                 if(zoom > 48) zoom = 48; else update = 1;
     215                update = 1;
     216                set_zoom(zoom + 1);
    191217                break;
    192218            case '-':
    193                 zoom--;
    194                 if(zoom < -48) zoom = -48; else update = 1;
     219                update = 1;
     220                set_zoom(zoom - 1);
    195221                break;
    196222            case 'x':
    197223            case 'X':
    198                 zoom = 0;
    199                 update = 1;
     224                update = 1;
     225                set_zoom(0);
    200226                break;
    201227            case 'k':
    202228            case 'K':
    203229            case CACA_KEY_UP:
    204                 if(zoom > 0) y -= 1 + h / (2 + zoom) / 8;
     230                if(yfactor > 1.0) dy -= PAD_STEP / yfactor;
     231                if(dy < 0.0) dy = 0.0;
    205232                update = 1;
    206233                break;
     
    208235            case 'J':
    209236            case CACA_KEY_DOWN:
    210                 if(zoom > 0) y += 1 + h / (2 + zoom) / 8;
     237                if(yfactor > 1.0) dy += PAD_STEP / yfactor;
     238                if(dy > 1.0) dy = 1.0;
    211239                update = 1;
    212240                break;
     
    214242            case 'H':
    215243            case CACA_KEY_LEFT:
    216                 if(zoom > 0) x -= 1 + w / (2 + zoom) / 8;
     244                if(xfactor > 1.0) dx -= PAD_STEP / xfactor;
     245                if(dx < 0.0) dx = 0.0;
    217246                update = 1;
    218247                break;
     
    220249            case 'L':
    221250            case CACA_KEY_RIGHT:
    222                 if(zoom > 0) x += 1 + w / (2 + zoom) / 8;
     251                if(xfactor > 1.0) dx += PAD_STEP / xfactor;
     252                if(dx > 1.0) dx = 1.0;
    223253                update = 1;
    224254                break;
     
    232262                break;
    233263            }
    234 
    235             if(event == CACA_EVENT_RESIZE)
     264            else if(event == CACA_EVENT_RESIZE)
    236265            {
    237266                caca_refresh();
     
    239268                wh = caca_get_height();
    240269                update = 1;
     270                set_zoom(zoom);
    241271            }
    242272
     
    259289
    260290            buffer = malloc(len);
    261 
    262             /* Reset image-specific runtime variables */
    263             zoom = 0;
    264291
    265292            sprintf(buffer, " Loading `%s'... ", list[current]);
     
    274301            load_image(list[current]);
    275302            reload = 0;
     303
     304            /* Reset image-specific runtime variables */
     305            dx = dy = 0.5;
    276306            update = 1;
     307            set_zoom(0);
    277308
    278309            free(buffer);
     
    307338            free(buffer);
    308339        }
    309         else if(zoom < 0)
    310         {
    311             int xo = (ww - 1) / 2;
    312             int yo = (wh - 1) / 2;
    313             int xn = (ww - 1) / (2 - zoom);
    314             int yn = (wh - 1) / (2 - zoom);
    315             draw_checkers(xo - xn, yo - yn, xo + xn, yo + yn);
    316             caca_draw_bitmap(xo - xn, yo - yn, xo + xn, yo + yn,
    317                              bitmap, pixels);
    318         }
    319         else if(zoom > 0)
    320         {
    321             struct caca_bitmap *newbitmap;
    322             int xn = w / (2 + zoom);
    323             int yn = h / (2 + zoom);
    324             if(x < xn) x = xn;
    325             if(y < yn) y = yn;
    326             if(xn + x > (int)w) x = w - xn;
    327             if(yn + y > (int)h) y = h - yn;
    328             newbitmap = caca_create_bitmap(bpp, 2 * xn, 2 * yn, depth * w,
    329                                            rmask, gmask, bmask, amask);
    330 #if !defined(HAVE_IMLIB2_H)
    331             if(bpp == 8)
    332                 caca_set_bitmap_palette(newbitmap, red, green, blue, alpha);
    333 #endif
    334             draw_checkers(0, fullscreen ? 0 : 1,
    335                           ww - 1, fullscreen ? wh - 1 : wh - 3);
    336             caca_draw_bitmap(0, fullscreen ? 0 : 1,
    337                              ww - 1, fullscreen ? wh - 1 : wh - 3,
    338                              newbitmap,
    339                              pixels + depth * (x - xn) + depth * w * (y - yn));
    340             caca_free_bitmap(newbitmap);
    341         }
    342340        else
    343341        {
    344             draw_checkers(0, fullscreen ? 0 : 1,
    345                           ww - 1, fullscreen ? wh - 1 : wh - 3);
    346             caca_draw_bitmap(0, fullscreen ? 0 : 1,
    347                              ww - 1, fullscreen ? wh - 1 : wh - 3,
     342            float xdelta, ydelta;
     343            int y, height;
     344
     345            y = fullscreen ? 0 : 1;
     346            height = fullscreen ? wh : wh - 3;
     347
     348            xdelta = (xfactor > 1.0) ? dx : 0.5;
     349            ydelta = (yfactor > 1.0) ? dy : 0.5;
     350
     351            draw_checkers(ww * (1.0 - xfactor) / 2,
     352                          y + height * (1.0 - yfactor) / 2,
     353                          ww * (1.0 + xfactor) / 2,
     354                          y + height * (1.0 + yfactor) / 2);
     355
     356            caca_draw_bitmap(ww * (1.0 - xfactor) * xdelta,
     357                             y + height * (1.0 - yfactor) * ydelta,
     358                             ww * (xdelta + (1.0 - xdelta) * xfactor),
     359                             y + height * (ydelta + (1.0 - ydelta) * yfactor),
    348360                             bitmap, pixels);
    349361        }
     
    409421}
    410422
     423static void set_zoom(int new_zoom)
     424{
     425    int height;
     426
     427    zoom = new_zoom;
     428
     429    if(zoom > ZOOM_MAX) zoom = ZOOM_MAX;
     430    if(zoom < -ZOOM_MAX) zoom = -ZOOM_MAX;
     431
     432    ww = caca_get_width();
     433    height = fullscreen ? wh : wh - 3;
     434
     435    xfactor = (zoom < 0) ? 1.0 / zoomtab[-zoom] : zoomtab[zoom];
     436    yfactor = xfactor * ww / height * h / w
     437               * caca_get_height() / caca_get_width()
     438               * caca_get_window_width() / caca_get_window_height();
     439
     440    if(yfactor > xfactor)
     441    {
     442        float tmp = xfactor;
     443        xfactor = tmp * tmp / yfactor;
     444        yfactor = tmp;
     445    }
     446}
     447
    411448static void unload_image(void)
    412449{
     
    627664        caca_set_bitmap_palette(bitmap, red, green, blue, alpha);
    628665#endif
    629 
    630     x = w / 2;
    631     y = h / 2;
    632666}
    633667
    634 static void draw_checkers(unsigned int x1, unsigned int y1,
    635                           unsigned int x2, unsigned int y2)
     668static void draw_checkers(int x1, int y1, int x2, int y2)
    636669{
    637     unsigned int xn, yn;
    638 
    639     for(yn = y1; yn <= y2; yn++)
    640         for(xn = x1; xn <= x2; xn++)
     670    int xn, yn;
     671
     672    if(x2 + 1 > (int)caca_get_width()) x2 = caca_get_width() - 1;
     673    if(y2 + 1 > (int)caca_get_height()) y2 = caca_get_height() - 1;
     674
     675    for(yn = y1 > 0 ? y1 : 0; yn <= y2; yn++)
     676        for(xn = x1 > 0 ? x1 : 0; xn <= x2; xn++)
    641677    {
    642678        if((((xn - x1) / 5) ^ ((yn - y1) / 3)) & 1)
Note: See TracChangeset for help on using the changeset viewer.