diff options
author | Araki Ken <arakiken@users.sf.net> | 2013-02-02 07:32:37 +0000 |
---|---|---|
committer | Tatsuya Kinoshita <tats@debian.org> | 2014-12-06 11:47:04 +0000 |
commit | 147ef0048b9a50122e7865f36c97616b94ada76f (patch) | |
tree | 89bd2d84ee3b5530530928fd929e0a4b38345130 | |
parent | Support remote image by OSC 5379 show_picture sequence. (diff) | |
download | w3m-147ef0048b9a50122e7865f36c97616b94ada76f.tar.gz w3m-147ef0048b9a50122e7865f36c97616b94ada76f.zip |
- Adjust the image size to the terminal cell size. - If the image size is specified in html source, skip to load the image.
Diffstat (limited to '')
-rw-r--r-- | fm.h | 2 | ||||
-rw-r--r-- | image.c | 41 | ||||
-rw-r--r-- | terms.c | 41 |
3 files changed, 53 insertions, 31 deletions
@@ -1177,9 +1177,11 @@ global char *ssl_forbid_method init("2, 3"); global int is_redisplay init(FALSE); global int clear_buffer init(TRUE); global double pixel_per_char init(DEFAULT_PIXEL_PER_CHAR); +global int pixel_per_char_i init(DEFAULT_PIXEL_PER_CHAR); global int set_pixel_per_char init(FALSE); #ifdef USE_IMAGE global double pixel_per_line init(DEFAULT_PIXEL_PER_LINE); +global int pixel_per_line_i init(DEFAULT_PIXEL_PER_LINE); global int set_pixel_per_line init(FALSE); global double image_scale init(100); #endif @@ -57,6 +57,8 @@ getCharSize() int ppc, ppl; if (get_pixel_per_cell(&ppc,&ppl)) { + pixel_per_char_i = ppc ; + pixel_per_line_i = ppl ; pixel_per_char = (double)ppc; pixel_per_line = (double)ppl; } @@ -210,7 +212,7 @@ drawImage() i->cache->width > 0 ? i->cache->width : 0, i->cache->height > 0 ? i->cache->height : 0, i->sx, i->sy, i->width, i->height, - (int)pixel_per_char, (int)pixel_per_line); + pixel_per_char_i, pixel_per_line_i); #endif put_image( #if 1 @@ -220,27 +222,25 @@ drawImage() #else i->cache->url, #endif - (int)(i->x / pixel_per_char), - (int)(i->y / pixel_per_line), + i->x / pixel_per_char_i, + i->y / pixel_per_line_i, #if 1 i->cache->a_width > 0 ? - (int)((i->cache->width + i->x % (int)pixel_per_char + - pixel_per_char - 1) / pixel_per_char) : + (i->cache->width + i->x % pixel_per_char_i + pixel_per_char_i - 1) / + pixel_per_char_i : #endif 0, #if 1 i->cache->a_height > 0 ? - (int)((i->cache->height + i->y % (int)pixel_per_line + - pixel_per_line - 1) / pixel_per_line) : + (i->cache->height + i->y % pixel_per_line_i + pixel_per_line_i - 1) / + pixel_per_line_i : #endif 0, - (int)(i->sx / pixel_per_char), - (int)(i->sy / pixel_per_line), - (int)((i->width + i->sx % (int)pixel_per_char + - pixel_per_char - 1) / pixel_per_char), - (int)((i->height + i->sy % (int)pixel_per_line + - pixel_per_line - 1) / pixel_per_line)); + i->sx / pixel_per_char_i, + i->sy / pixel_per_line_i, + (i->width + i->sx % pixel_per_char_i + pixel_per_char_i - 1) / pixel_per_char_i, + (i->height + i->sy % pixel_per_line_i + pixel_per_line_i - 1) / pixel_per_line_i); continue ; } @@ -593,8 +593,19 @@ getImage(Image * image, ParsedURL *current, int flag) cache->pid = 0; cache->index = 0; cache->loaded = IMG_FLAG_UNLOADED; - cache->width = image->width; - cache->height = image->height; + if (support_remote_image) { + if (image->width > 0 && image->width % pixel_per_char_i > 0) + image->width += (pixel_per_char_i - image->width % pixel_per_char_i); + + if (image->height > 0 && image->height % pixel_per_line_i > 0) + image->height += (pixel_per_line_i - image->height % pixel_per_line_i); + + if (image->height > 0 && image->width > 0) + cache->loaded = IMG_FLAG_LOADED; + } + + cache->width = image->width ; + cache->height = image->height ; cache->a_width = image->width; cache->a_height = image->height; putHash_sv(image_hash, key->ptr, (void *)cache); @@ -489,31 +489,40 @@ get_pixel_per_cell(int *ppc, int *ppl) fd_set rfd; struct timeval tval; char buf[100]; + char *p; ssize_t len; + ssize_t left; int wp,hp,wc,hc; + int i; fputs("\x1b[14t\x1b[18t",ttyf); flush_tty(); - tval.tv_usec = 10000; /* 0.1 sec */ - tval.tv_sec = 0; - FD_SET(tty,&rfd); - if (select(tty+1,&rfd,NULL,NULL,&tval) < 0 || ! FD_ISSET(tty,&rfd)) { - return 0; - } + p = buf; + left = sizeof(buf) - 1; + for (i = 0; i < 5; i++) { + tval.tv_usec = 100000; /* 0.1 sec */ + tval.tv_sec = 0; + FD_SET(tty,&rfd); + if (select(tty+1,&rfd,NULL,NULL,&tval) <= 0 || ! FD_ISSET(tty,&rfd)) { + continue; + } - if ((len = read(tty,buf,sizeof(buf)-1)) <= 0) { - return 0; - } - buf[len] = '\0'; + if ((len = read(tty,p,left)) <= 0) { + return 0; + } + p[len] = '\0'; - if (sscanf(buf,"\x1b[4;%d;%dt\x1b[8;%d;%dt",&hp,&wp,&hc,&wc) != 4) { - return 0; - } + if (sscanf(buf,"\x1b[4;%d;%dt\x1b[8;%d;%dt",&hp,&wp,&hc,&wc) == 4) { + *ppc = wp / wc; + *ppl = hp / hc; - *ppc = wp / wc; - *ppl = hp / hc; + return 1; + } + p = buf + len; + left -= len; + } - return 1; + return 0; } #ifdef USE_MOUSE |