Krolyxon
Commit e2d4b9c

Branches

Refs →

nsxive2d4b9c

Added dirty flag to img struct

Author
Bert
Date
2011-09-11 01:13 +0200
Parent
5105127
Commit
e2d4b9c7915a2a356cae04d33f1713ae224fbe7e

+69 −29

3 files changed

  1. M Makefile +1 −1
  2. M image.c +67 −28
  3. M image.h +1 −0
M Makefile View
@@ -1,4 +1,4 @@
1−VERSION = git-20110910
1+VERSION = git-20110911
22
33 CC = gcc
44 CFLAGS = -Wall -pedantic -O2
M image.c View
@@ -17,6 +17,7 @@
1717 */
1818
1919 #define _POSIX_C_SOURCE 200112L
20+#define _IMAGE_CONFIG
2021
2122 #include <string.h>
2223 #include <unistd.h>
@@ -34,10 +35,10 @@
3435 #include "image.h"
3536 #include "options.h"
3637 #include "util.h"
37−
38−#define _IMAGE_CONFIG
3938 #include "config.h"
4039
40+#define ZOOMDIFF(z1,z2) ((z1) - (z2) > 0.001 || (z1) - (z2) < -0.001)
41+
4142 enum { MIN_GIF_DELAY = 50 };
4243
4344 float zoom_min;
@@ -54,6 +55,8 @@ void img_init(img_t *img, win_t *win) {
5455 img->zoom = options->zoom;
5556 img->zoom = MAX(img->zoom, zoom_min);
5657 img->zoom = MIN(img->zoom, zoom_max);
58+ img->checkpan = 0;
59+ img->dirty = 0;
5760 img->aa = options->aa;
5861 img->alpha = 1;
5962 img->slideshow = 0;
@@ -313,6 +316,7 @@ int img_load(img_t *img, const fileinfo_t *file) {
313316 img->w = imlib_image_get_width();
314317 img->h = imlib_image_get_height();
315318
319+ img->dirty = 1;
316320 return 1;
317321 }
318322
@@ -339,10 +343,15 @@ void img_close(img_t *img, int decache) {
339343 }
340344 }
341345
342−void img_check_pan(img_t *img, win_t *win) {
346+void img_check_pan(img_t *img, win_t *win, int moved) {
347+ int ox, oy;
348+
343349 if (!img || !win)
344350 return;
345351
352+ ox = img->x;
353+ oy = img->y;
354+
346355 if (img->w * img->zoom > win->w) {
347356 if (img->x > 0 && img->x + img->w * img->zoom > win->w)
348357 img->x = 0;
@@ -359,23 +368,32 @@ void img_check_pan(img_t *img, win_t *win) {
359368 } else {
360369 img->y = (win->h - img->h * img->zoom) / 2;
361370 }
371+
372+ if (!moved && (ox != img->x || oy != img->y))
373+ img->dirty = 1;
362374 }
363375
364376 int img_fit(img_t *img, win_t *win) {
365− float oz, zw, zh;
377+ float z, zmax, zw, zh;
366378
367− if (!img || !win)
379+ if (!img || !win || img->scalemode == SCALE_ZOOM)
368380 return 0;
369381
370− oz = img->zoom;
382+ zmax = img->scalemode == SCALE_DOWN ? 1.0 : zoom_max;
371383 zw = (float) win->w / (float) img->w;
372384 zh = (float) win->h / (float) img->h;
373385
374− img->zoom = MIN(zw, zh);
375− img->zoom = MAX(img->zoom, zoom_min);
376− img->zoom = MIN(img->zoom, zoom_max);
386+ z = MIN(zw, zh);
387+ z = MAX(z, zoom_min);
388+ z = MIN(z, zmax);
377389
378− return oz != img->zoom;
390+ if (ZOOMDIFF(z, img->zoom)) {
391+ img->zoom = z;
392+ img->dirty = 1;
393+ return 1;
394+ } else {
395+ return 0;
396+ }
379397 }
380398
381399 void img_render(img_t *img, win_t *win) {
@@ -385,11 +403,7 @@ void img_render(img_t *img, win_t *win) {
385403 if (!img || !img->im || !win)
386404 return;
387405
388− if (img->scalemode != SCALE_ZOOM) {
389− img_fit(img, win);
390− if (img->scalemode == SCALE_DOWN && img->zoom > 1.0)
391− img->zoom = 1.0;
392− }
406+ img_fit(img, win);
393407
394408 if (!img->re) {
395409 /* rendered for the first time */
@@ -405,10 +419,13 @@ void img_render(img_t *img, win_t *win) {
405419 }
406420
407421 if (img->checkpan) {
408− img_check_pan(img, win);
422+ img_check_pan(img, win, 0);
409423 img->checkpan = 0;
410424 }
411425
426+ if (!img->dirty)
427+ return;
428+
412429 /* calculate source and destination offsets */
413430 if (img->x < 0) {
414431 sx = -img->x / img->zoom;
@@ -444,6 +461,8 @@ void img_render(img_t *img, win_t *win) {
444461 imlib_render_image_part_on_drawable_at_size(sx, sy, sw, sh, dx, dy, dw, dh);
445462
446463 win_draw(win);
464+
465+ img->dirty = 0;
447466 }
448467
449468 int img_fit_win(img_t *img, win_t *win) {
@@ -466,7 +485,12 @@ int img_center(img_t *img, win_t *win) {
466485 img->x = (win->w - img->w * img->zoom) / 2;
467486 img->y = (win->h - img->h * img->zoom) / 2;
468487
469− return ox != img->x || oy != img->y;
488+ if (ox != img->x || oy != img->y) {
489+ img->dirty = 1;
490+ return 1;
491+ } else {
492+ return 0;
493+ }
470494 }
471495
472496 int img_zoom(img_t *img, win_t *win, float z) {
@@ -478,11 +502,12 @@ int img_zoom(img_t *img, win_t *win, float z) {
478502
479503 img->scalemode = SCALE_ZOOM;
480504
481− if (z != img->zoom) {
505+ if (ZOOMDIFF(z, img->zoom)) {
482506 img->x = win->w / 2 - (win->w / 2 - img->x) * z / img->zoom;
483507 img->y = win->h / 2 - (win->h / 2 - img->y) * z / img->zoom;
484508 img->zoom = z;
485509 img->checkpan = 1;
510+ img->dirty = 1;
486511 return 1;
487512 } else {
488513 return 0;
@@ -527,9 +552,14 @@ int img_move(img_t *img, win_t *win, int dx, int dy) {
527552 img->x += dx;
528553 img->y += dy;
529554
530− img_check_pan(img, win);
555+ img_check_pan(img, win, 1);
531556
532− return ox != img->x || oy != img->y;
557+ if (ox != img->x || oy != img->y) {
558+ img->dirty = 1;
559+ return 1;
560+ } else {
561+ return 0;
562+ }
533563 }
534564
535565 int img_pan(img_t *img, win_t *win, direction_t dir, int screen) {
@@ -546,7 +576,6 @@ int img_pan(img_t *img, win_t *win, direction_t dir, int screen) {
546576 case DIR_DOWN:
547577 return img_move(img, win, 0, win->h / (screen ? 1 : 5) * -1);
548578 }
549−
550579 return 0;
551580 }
552581
@@ -574,9 +603,14 @@ int img_pan_edge(img_t *img, win_t *win, direction_t dir) {
574603 break;
575604 }
576605
577− img_check_pan(img, win);
606+ img_check_pan(img, win, 1);
578607
579− return ox != img->x || oy != img->y;
608+ if (ox != img->x || oy != img->y) {
609+ img->dirty = 1;
610+ return 1;
611+ } else {
612+ return 0;
613+ }
580614 }
581615
582616 void img_rotate(img_t *img, win_t *win, int d) {
@@ -599,6 +633,7 @@ void img_rotate(img_t *img, win_t *win, int d) {
599633 img->h = tmp;
600634
601635 img->checkpan = 1;
636+ img->dirty = 1;
602637 }
603638
604639 void img_rotate_left(img_t *img, win_t *win) {
@@ -610,11 +645,13 @@ void img_rotate_right(img_t *img, win_t *win) {
610645 }
611646
612647 void img_toggle_antialias(img_t *img) {
613− if (img && img->im) {
614− img->aa ^= 1;
615− imlib_context_set_image(img->im);
616− imlib_context_set_anti_alias(img->aa);
617− }
648+ if (!img || !img->im)
649+ return;
650+
651+ img->aa ^= 1;
652+ imlib_context_set_image(img->im);
653+ imlib_context_set_anti_alias(img->aa);
654+ img->dirty = 1;
618655 }
619656
620657 int img_frame_goto(img_t *img, int n) {
@@ -631,6 +668,7 @@ int img_frame_goto(img_t *img, int n) {
631668 img->w = imlib_image_get_width();
632669 img->h = imlib_image_get_height();
633670 img->checkpan = 1;
671+ img->dirty = 1;
634672
635673 return 1;
636674 }
@@ -664,5 +702,6 @@ int img_frame_animate(img_t *img, int restart) {
664702 }
665703 img->multi.animate = 1;
666704
705+ img->dirty = 1;
667706 return img->multi.frames[img->multi.sel].delay;
668707 }
M image.h View
@@ -46,6 +46,7 @@ typedef struct {
4646
4747 unsigned char re;
4848 unsigned char checkpan;
49+ unsigned char dirty;
4950 unsigned char aa;
5051 unsigned char alpha;
5152