- Timestamp:
- Jan 21, 2004, 6:25:18 PM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libcaca/trunk/examples/cacaview.c
r354 r358 45 45 #define STATUS_BACKGROUND 3 46 46 47 #define ZOOM_FACTOR 1.08f 48 #define ZOOM_MAX 50 49 #define PAD_STEP 0.15 50 47 51 /* Local functions */ 52 static void set_zoom(int); 48 53 static void load_image(char const *); 49 54 static void unload_image(void); 50 static void draw_checkers(unsigned int, unsigned int, 51 unsigned int, unsigned int); 55 static void draw_checkers(int, int, int, int); 52 56 #if !defined(HAVE_IMLIB2_H) 53 57 static int freadint(FILE *); … … 62 66 char *pixels = NULL; 63 67 struct caca_bitmap *bitmap = NULL; 64 int x, y;65 68 unsigned int w, h, depth, bpp, rmask, gmask, bmask, amask; 66 69 #if !defined(HAVE_IMLIB2_H) … … 68 71 #endif 69 72 73 float zoomtab[ZOOM_MAX + 1]; 74 float xfactor = 1.0, yfactor = 1.0, dx = 0.5, dy = 0.5; 75 int zoom = 0, fullscreen = 0, ww, wh; 76 70 77 int main(int argc, char **argv) 71 78 { 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; 74 81 75 82 char **list = NULL; … … 86 93 /* Set the window title */ 87 94 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; 88 103 89 104 /* Load items into playlist */ … … 112 127 while(!quit) 113 128 { 114 int ww, wh; 129 unsigned int const event_mask = CACA_EVENT_KEY_PRESS 130 | CACA_EVENT_RESIZE 131 | CACA_EVENT_MOUSE_PRESS; 115 132 unsigned int event, new_status = 0, new_help = 0; 116 133 117 ww = caca_get_width();118 wh = caca_get_height();119 120 134 if(update) 121 event = caca_get_event( CACA_EVENT_KEY_PRESS | CACA_EVENT_RESIZE);135 event = caca_get_event(event_mask); 122 136 else 123 event = caca_wait_event( CACA_EVENT_KEY_PRESS | CACA_EVENT_RESIZE);137 event = caca_wait_event(event_mask); 124 138 125 139 while(event) 126 140 { 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) 130 155 { 131 156 case 'n': … … 143 168 fullscreen = ~fullscreen; 144 169 update = 1; 170 set_zoom(zoom); 145 171 break; 146 172 case 'b': … … 187 213 break; 188 214 case '+': 189 zoom++;190 if(zoom > 48) zoom = 48; else update = 1;215 update = 1; 216 set_zoom(zoom + 1); 191 217 break; 192 218 case '-': 193 zoom--;194 if(zoom < -48) zoom = -48; else update = 1;219 update = 1; 220 set_zoom(zoom - 1); 195 221 break; 196 222 case 'x': 197 223 case 'X': 198 zoom = 0;199 update = 1;224 update = 1; 225 set_zoom(0); 200 226 break; 201 227 case 'k': 202 228 case 'K': 203 229 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; 205 232 update = 1; 206 233 break; … … 208 235 case 'J': 209 236 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; 211 239 update = 1; 212 240 break; … … 214 242 case 'H': 215 243 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; 217 246 update = 1; 218 247 break; … … 220 249 case 'L': 221 250 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; 223 253 update = 1; 224 254 break; … … 232 262 break; 233 263 } 234 235 if(event == CACA_EVENT_RESIZE) 264 else if(event == CACA_EVENT_RESIZE) 236 265 { 237 266 caca_refresh(); … … 239 268 wh = caca_get_height(); 240 269 update = 1; 270 set_zoom(zoom); 241 271 } 242 272 … … 259 289 260 290 buffer = malloc(len); 261 262 /* Reset image-specific runtime variables */263 zoom = 0;264 291 265 292 sprintf(buffer, " Loading `%s'... ", list[current]); … … 274 301 load_image(list[current]); 275 302 reload = 0; 303 304 /* Reset image-specific runtime variables */ 305 dx = dy = 0.5; 276 306 update = 1; 307 set_zoom(0); 277 308 278 309 free(buffer); … … 307 338 free(buffer); 308 339 } 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 #endif334 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 }342 340 else 343 341 { 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), 348 360 bitmap, pixels); 349 361 } … … 409 421 } 410 422 423 static 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 411 448 static void unload_image(void) 412 449 { … … 627 664 caca_set_bitmap_palette(bitmap, red, green, blue, alpha); 628 665 #endif 629 630 x = w / 2;631 y = h / 2;632 666 } 633 667 634 static void draw_checkers(unsigned int x1, unsigned int y1, 635 unsigned int x2, unsigned int y2) 668 static void draw_checkers(int x1, int y1, int x2, int y2) 636 669 { 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++) 641 677 { 642 678 if((((xn - x1) / 5) ^ ((yn - y1) / 3)) & 1)
Note: See TracChangeset
for help on using the changeset viewer.