From 2fe66f3a6f1b1fd28424a2f14beebdd535e9d17b Mon Sep 17 00:00:00 2001 From: Araki Ken Date: Mon, 22 Sep 2014 20:16:39 +0900 Subject: Add -sixel option which supports image processing by img2sixel. --- display.c | 4 ++-- file.c | 6 +++--- fm.h | 2 +- image.c | 28 ++++++++++++++-------------- main.c | 45 ++++++--------------------------------------- terms.c | 18 +++++++++++++++++- 6 files changed, 43 insertions(+), 60 deletions(-) diff --git a/display.c b/display.c index 691437b..6dd0976 100644 --- a/display.c +++ b/display.c @@ -523,7 +523,7 @@ drawAnchorCursor0(Buffer *buf, AnchorList *al, int hseq, int prevhseq, if (hseq >= 0 && an->hseq == hseq) { int start_pos = an->start.pos; for (i = an->start.pos; i < an->end.pos; i++) { - if (support_remote_image && (l->propBuf[i] & PE_IMAGE)) + if (enable_inline_image && (l->propBuf[i] & PE_IMAGE)) start_pos = i + 1; /* Lazy check */ if (l->propBuf[i] & (PE_IMAGE | PE_ANCHOR | PE_FORM)) { if (active) @@ -858,7 +858,7 @@ redrawLineImage(Buffer *buf, Line *l, int i) y = (int)(i * pixel_per_line); sx = (int)((rcol - COLPOS(l, a->start.pos)) * pixel_per_char); sy = (int)((l->linenumber - image->y) * pixel_per_line); - if (! support_remote_image) { + if (! enable_inline_image) { if (sx == 0 && x + image->xoffset >= 0) x += image->xoffset; else diff --git a/file.c b/file.c index b907c14..709a0c1 100644 --- a/file.c +++ b/file.c @@ -3345,7 +3345,7 @@ process_img(struct parsed_tag *tag, int width) if (i < 0) i = pixel_per_line; } - if (support_remote_image) { + if (enable_inline_image) { nw = (w > 1) ? ((w - 1) / pixel_per_char_i + 1) : 1 ; ni = (i > 1) ? ((i - 1) / pixel_per_line_i + 1) : 1 ; } @@ -3384,7 +3384,7 @@ process_img(struct parsed_tag *tag, int width) Strcat(tmp, Sprintf(" height=%d", i0)); switch (align) { case ALIGN_MIDDLE: - if (!support_remote_image) { + if (!enable_inline_image) { top = ni / 2; bottom = top; if (top * 2 == ni) @@ -3416,7 +3416,7 @@ process_img(struct parsed_tag *tag, int width) break; } - if (support_remote_image) + if (enable_inline_image) xoffset = 0; else xoffset = (int)((nw * pixel_per_char - w) / 2); diff --git a/fm.h b/fm.h index b6cedcf..8f594dc 100644 --- a/fm.h +++ b/fm.h @@ -921,7 +921,7 @@ global char *CurrentKeyData; global char *CurrentCmdData; global char *w3m_reqlog; extern char *w3m_version; -extern int support_remote_image; +extern int enable_inline_image; #define DUMP_BUFFER 0x01 #define DUMP_HEAD 0x02 diff --git a/image.c b/image.c index 28dc585..09e929c 100644 --- a/image.c +++ b/image.c @@ -53,7 +53,7 @@ getCharSize() set_environ("W3M_TTY", ttyname_tty()); - if (support_remote_image) { + if (enable_inline_image) { int ppc, ppl; if (get_pixel_per_cell(&ppc,&ppl)) { @@ -170,7 +170,7 @@ addImage(ImageCache * cache, int x, int y, int sx, int sy, int w, int h) static void syncImage(void) { - if (support_remote_image) { + if (enable_inline_image) { return; } @@ -189,6 +189,9 @@ syncImage(void) n_terminal_image = 0; } +void put_image_osc5379(char *url, int x, int y, int w, int h, int sx, int sy, int sw, int sh); +void put_image_sixel(char *url, int x, int y, int w, int h, int sx, int sy, int sw, int sh); + void drawImage() { @@ -204,7 +207,7 @@ drawImage() for (j = 0; j < n_terminal_image; j++) { i = &terminal_image[j]; - if (support_remote_image) { + if (enable_inline_image) { #if 0 fprintf(stderr,"file %s x %d y %d w %d h %d sx %d sy %d sw %d sh %d (ppc %d ppl %d)\n", (getenv("WINDOWID") && i->cache->touch) ? i->cache->file : i->cache->url, @@ -214,14 +217,11 @@ drawImage() i->sx, i->sy, i->width, i->height, pixel_per_char_i, pixel_per_line_i); #endif - put_image( - #if 1 - /* XXX I don't know why but sometimes i->cache->file doesn't exist. */ - (getenv("WINDOWID") && i->cache->touch && stat(i->cache->file,&st) == 0) ? + (enable_inline_image == 2 ? put_image_sixel : put_image_osc5379)( + ((enable_inline_image == 2 /* sixel */ || getenv("WINDOWID")) && + /* XXX I don't know why but sometimes i->cache->file doesn't exist. */ + i->cache->touch && stat(i->cache->file,&st) == 0) ? /* local */ i->cache->file : /* remote */ i->cache->url, - #else - i->cache->url, - #endif i->x / pixel_per_char_i, i->y / pixel_per_line_i, #if 1 @@ -269,7 +269,7 @@ drawImage() draw = TRUE; } - if (!support_remote_image) { + if (!enable_inline_image) { if (!draw) return; syncImage(); @@ -388,7 +388,7 @@ showImageProgress(Buffer *buf) } } if (n) { - if (support_remote_image && n == l) + if (enable_inline_image && n == l) drawImage(); message(Sprintf("%d/%d images loaded", l, n)->ptr, buf->cursorX + buf->rootX, buf->cursorY + buf->rootY); @@ -476,7 +476,7 @@ loadImage(Buffer *buf, int flag) } if (draw && image_buffer) { - if (!support_remote_image) + if (!enable_inline_image) drawImage(); showImageProgress(image_buffer); } @@ -591,7 +591,7 @@ getImage(Image * image, ParsedURL *current, int flag) cache->pid = 0; cache->index = 0; cache->loaded = IMG_FLAG_UNLOADED; - if (support_remote_image) { + if (enable_inline_image) { if (image->width > 0 && image->width % pixel_per_char_i > 0) image->width += (pixel_per_char_i - image->width % pixel_per_char_i); diff --git a/main.c b/main.c index e00eb5e..5d8de21 100644 --- a/main.c +++ b/main.c @@ -122,41 +122,7 @@ static int searchKeyNum(void); #define help() fusage(stdout, 0) #define usage() fusage(stderr, 1) -int support_remote_image; - -static void -check_support_remote_image(void) -{ - char *env; - - if ((env = getenv("MLTERM"))) { - char *p; - int major; - int minor; - int micro; - - if (!(p = strchr(env,'.'))) - return; - *p = '\0'; - major = atoi(env); - env = p + 1; - - if (!(p = strchr(env,'.'))) - return; - *p = '\0'; - minor = atoi(env); - env = p + 1; - micro = atoi(env) ; - - if (major > 3 || - (major == 3 && (minor > 1 || (minor == 1 && micro >= 7)))) { - support_remote_image = 1 ; - set_environ( "W3M_USE_REMOTE_IMAGE","1"); /* for w3mimgdisplay */ - } - } - - return; -} +int enable_inline_image; /* 1 == mlterm OSC 5379, 2 == sixel */ static void fversion(FILE * f) @@ -445,7 +411,6 @@ main(int argc, char **argv, char **envp) #if defined(DONT_CALL_GC_AFTER_FORK) && defined(USE_IMAGE) char **getimage_args = NULL; #endif /* defined(DONT_CALL_GC_AFTER_FORK) && defined(USE_IMAGE) */ - check_support_remote_image(); GC_INIT(); #if defined(ENABLE_NLS) || (defined(USE_M17N) && defined(HAVE_LANGINFO_CODESET)) setlocale(LC_ALL, ""); @@ -715,9 +680,11 @@ main(int argc, char **argv, char **envp) } } #endif - else if (!strcmp("-ri" , argv[i])) { - support_remote_image = 1; - set_environ( "W3M_USE_REMOTE_IMAGE","1"); /* for w3mimgdisplay */ + else if (!strcmp("-ri", argv[i])) { + enable_inline_image = 1; + } + else if (!strcmp("-sixel", argv[i])) { + enable_inline_image = 2; } else if (!strcmp("-num", argv[i])) showLineNum = TRUE; diff --git a/terms.c b/terms.c index 6533712..53d604c 100644 --- a/terms.c +++ b/terms.c @@ -467,7 +467,7 @@ writestr(char *s) #define MOVE(line,column) writestr(tgoto(T_cm,column,line)); void -put_image(char *url, int x, int y, int w, int h, int sx, int sy, int sw, int sh) +put_image_osc5379(char *url, int x, int y, int w, int h, int sx, int sy, int sw, int sh) { Str buf; char *size ; @@ -483,6 +483,22 @@ put_image(char *url, int x, int y, int w, int h, int sx, int sy, int sw, int sh) MOVE(Currentbuf->cursorY,Currentbuf->cursorX); } +void +put_image_sixel(char *url, int x, int y, int w, int h, int sx, int sy, int sw, int sh) +{ + Str buf; + + MOVE(y,x); + flush_tty(); + buf = Sprintf("img2sixel -l disable -c %dx%d+%d+%d -w %d -h %d %s 2>/dev/null", + sw*pixel_per_char_i, sh*pixel_per_line_i, + sx*pixel_per_char_i, sy*pixel_per_line_i, + w*pixel_per_char_i, h*pixel_per_line_i, + url); + system(buf->ptr); + MOVE(Currentbuf->cursorY,Currentbuf->cursorX); +} + int get_pixel_per_cell(int *ppc, int *ppl) { -- cgit v1.2.3