source: libcaca/trunk/examples/view.c @ 215

Last change on this file since 215 was 215, checked in by Sam Hocevar, 18 years ago
  • examples/: + Simple image viewer, cacaview, based on libcaca and imlib2. + Renamed caca-demo into cacademo.
  • doc/: + Renamed doc/caca-demo.1 into doc/cacademo.1.
  • Property svn:keywords set to Id
File size: 5.3 KB
Line 
1/*
2 *   view          image viewer for libcaca
3 *   Copyright (c) 2003 Sam Hocevar <sam@zoy.org>
4 *                 All Rights Reserved
5 *
6 *   $Id: view.c 215 2003-11-24 17:50:14Z sam $
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU Lesser General Public
10 *   License as published by the Free Software Foundation; either
11 *   version 2 of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16 *   Lesser General Public License for more details.
17 *
18 *   You should have received a copy of the GNU Lesser General Public
19 *   License along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
21 *   02111-1307  USA
22 */
23
24#include "config.h"
25
26#include <stdio.h>
27
28#define X_DISPLAY_MISSING 1
29#include <Imlib2.h>
30
31#include "caca.h"
32
33Imlib_Image image = NULL;
34char *pixels = NULL;
35struct caca_bitmap *bitmap = NULL;
36
37int dithering = 0;
38const enum caca_dithering dithering_list[] =
39    { CACA_DITHER_NONE, CACA_DITHER_ORDERED, CACA_DITHER_RANDOM };
40
41int main(int argc, char **argv)
42{
43    int quit = 0, update = 1;
44    int x, y, w, h, zoom = 0;
45
46    if(argc != 2)
47    {
48        fprintf(stderr, "usage: %s <filename>\n", argv[0]);
49        return 1;
50    }
51
52    image = imlib_load_image(argv[1]);
53
54    if(!image)
55    {
56        fprintf(stderr, "%s: unable to open `%s'\n", argv[0], argv[1]);
57        return 1;
58    }
59
60    imlib_context_set_image(image);
61    pixels = (char *)imlib_image_get_data_for_reading_only();
62    w = imlib_image_get_width();
63    h = imlib_image_get_height();
64    x = w / 2;
65    y = h / 2;
66
67    if(caca_init())
68    {
69        fprintf(stderr, "%s: unable to initialise libcaca\n", argv[0]);
70        return 1;
71    }
72
73    /* Create the libcaca bitmap */
74    bitmap = caca_create_bitmap(32, w, h, 4 * w,
75                                0x00ff0000, 0x0000ff00, 0x000000ff);
76
77    if(!image)
78    {
79        fprintf(stderr, "%s: unable to create libcaca bitmap\n", argv[0]);
80        caca_end();
81        return 1;
82    }
83
84    /* Go ! */
85    while(!quit)
86    {
87        int event;
88
89        while((event = caca_get_event()))
90        {
91            switch(event)
92            {
93            case CACA_EVENT_KEY_PRESS | 'd':
94            case CACA_EVENT_KEY_PRESS | 'D':
95                dithering = (dithering + 1) % 3;
96                update = 1;
97                break;
98            case CACA_EVENT_KEY_PRESS | '+':
99                zoom++;
100                update = 1;
101                break;
102            case CACA_EVENT_KEY_PRESS | '-':
103                zoom--;
104                update = 1;
105                break;
106            case CACA_EVENT_KEY_PRESS | 'x':
107            case CACA_EVENT_KEY_PRESS | 'X':
108                zoom = 0;
109                update = 1;
110                break;
111            case CACA_EVENT_KEY_PRESS | CACA_KEY_UP:
112                if(zoom > 0) y -= h / (2 + zoom) / 8;
113                update = 1;
114                break;
115            case CACA_EVENT_KEY_PRESS | CACA_KEY_DOWN:
116                if(zoom > 0) y += h / (2 + zoom) / 8;
117                update = 1;
118                break;
119            case CACA_EVENT_KEY_PRESS | CACA_KEY_LEFT:
120                if(zoom > 0) x -= w / (2 + zoom) / 8;
121                update = 1;
122                break;
123            case CACA_EVENT_KEY_PRESS | CACA_KEY_RIGHT:
124                if(zoom > 0) x += w / (2 + zoom) / 8;
125                update = 1;
126                break;
127            case CACA_EVENT_KEY_PRESS | 'q':
128            case CACA_EVENT_KEY_PRESS | 'Q':
129                quit = 1;
130                break;
131            }
132        }
133
134        if(update)
135        {
136            caca_clear();
137            caca_set_dithering(dithering_list[dithering]);
138            if(zoom < 0)
139            {
140                int xo = (caca_get_width() - 1) / 2;
141                int yo = (caca_get_height() - 1) / 2;
142                int xn = (caca_get_width() - 1) / (2 - zoom);
143                int yn = (caca_get_height() - 1) / (2 - zoom);
144                caca_draw_bitmap(xo - xn, yo - yn, xo + xn, yo + yn,
145                                 bitmap, pixels);
146            }
147            else if(zoom > 0)
148            {
149                struct caca_bitmap *newbitmap;
150                int xn = w / (2 + zoom);
151                int yn = h / (2 + zoom);
152                if(x < xn) x = xn;
153                if(y < yn) y = yn;
154                if(xn + x > w) x = w - xn;
155                if(yn + y > h) y = h - yn;
156                newbitmap = caca_create_bitmap(32, 2 * xn, 2 * yn, 4 * w,
157                                            0x00ff0000, 0x0000ff00, 0x000000ff);
158                caca_draw_bitmap(0, 0, caca_get_width() - 1,
159                                 caca_get_height() - 1, newbitmap,
160                                 pixels + 4 * (x - xn) + 4 * w * (y - yn));
161                caca_free_bitmap(newbitmap);
162            }
163            else
164            {
165                caca_draw_bitmap(0, 0, caca_get_width() - 1,
166                                 caca_get_height() - 1, bitmap, pixels);
167            }
168            caca_refresh();
169            update = 0;
170        }
171    }
172
173    caca_free_bitmap(bitmap);
174    imlib_free_image();
175
176    /* Clean up */
177    caca_end();
178
179    return 0;
180}
181
Note: See TracBrowser for help on using the repository browser.