diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/main.c | 10 | ||||
-rw-r--r-- | src/meh.h | 3 | ||||
-rw-r--r-- | src/xlib.c | 66 |
3 files changed, 39 insertions, 40 deletions
@@ -89,6 +89,7 @@ void run(){ const char *filename = direction(); int width = 0, height = 0; struct image *img = NULL; + XImage *ximg = NULL; int redraw = 0; FILE *f = NULL; @@ -106,6 +107,9 @@ void run(){ width = event.xconfigure.width; height = event.xconfigure.height; redraw = 1; + if(ximg) + XDestroyImage(ximg); + ximg = NULL; /* Some window managers need reminding */ if(img) @@ -138,6 +142,9 @@ void run(){ free(img->buf); free(img); } + if(ximg) + XDestroyImage(ximg); + ximg = NULL; img = NULL; redraw = 1; break; @@ -188,7 +195,8 @@ void run(){ } continue; /* Allow for some events to be read, read is slow */ } - drawimage(img, width, height); + ximg = getimage(img, width, height); + drawimage(ximg, width, height); redraw = 0; } } @@ -20,5 +20,6 @@ struct image{ XImage *ximage(struct image *img, unsigned int width, unsigned int height); void setaspect(unsigned int w, unsigned int h); void xinit(); -void drawimage(struct image *img, unsigned int width, unsigned int height); +void drawimage(XImage *ximg, unsigned int width, unsigned int height); +XImage *getimage(struct image *img, int width, int height); @@ -86,53 +86,43 @@ XImage *ximage(struct image *img, unsigned int width, unsigned int height) { } -void drawimage(struct image *img, unsigned int width, unsigned int height){ - static struct image *lastimg = NULL; - static int lastwidth = 0, lastheight = 0; - static XImage *ximg = NULL; - if(0 && img == lastimg && width == lastwidth && height == lastheight){ +XImage *getimage(struct image *img, int width, int height){ + if(width * img->height > height * img->width){ + return ximage(img, img->width * height / img->height, height); }else{ - if(ximg) - XDestroyImage(ximg); - lastwidth = width; - lastheight = height; - lastimg = img; - if(width * img->height > height * img->width){ - ximg = ximage(img, img->width * height / img->height, height); - }else{ - ximg = ximage(img, width, img->height * width / img->width); - } + return ximage(img, width, img->height * width / img->width); } - assert(ximg); - { - XRectangle rects[2]; - int yoffset, xoffset; - xoffset = (width - ximg->width) / 2; - yoffset = (height - ximg->height) / 2; - if(xoffset || yoffset){ - rects[0].x = rects[0].y = 0; - if(xoffset){ - rects[0].width = rects[1].width = xoffset; - rects[0].height = rects[1].height = height; - rects[1].x = width-xoffset; - rects[1].y = 0; - }else if(yoffset){ - rects[0].width = rects[1].width = width; - rects[0].height = rects[1].height = yoffset; - rects[1].x = 0; - rects[1].y = height - yoffset; - } - XFillRectangles(display, window, gc, rects, 2); +} + +void drawimage(XImage *ximg, unsigned int width, unsigned int height){ + XRectangle rects[2]; + int yoffset, xoffset; + xoffset = (width - ximg->width) / 2; + yoffset = (height - ximg->height) / 2; + if(xoffset || yoffset){ + rects[0].x = rects[0].y = 0; + if(xoffset){ + rects[0].width = rects[1].width = xoffset; + rects[0].height = rects[1].height = height; + rects[1].x = width-xoffset; + rects[1].y = 0; + }else if(yoffset){ + rects[0].width = rects[1].width = width; + rects[0].height = rects[1].height = yoffset; + rects[1].x = 0; + rects[1].y = height - yoffset; } - XPutImage(display, window, gc, ximg, 0, 0, xoffset, yoffset, ximg->width, ximg->height); - XFlush(display); + XFillRectangles(display, window, gc, rects, 2); } + XPutImage(display, window, gc, ximg, 0, 0, xoffset, yoffset, ximg->width, ximg->height); + XFlush(display); } void setaspect(unsigned int w, unsigned int h){ XSizeHints *hints = XAllocSizeHints(); - hints->flags = PAspect; + //hints->flags = PAspect; + hints->flags = 0; hints->min_aspect.x = hints->max_aspect.x = w; hints->min_aspect.y = hints->max_aspect.y = h; XSetWMNormalHints(display, window, hints); |