diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | src/font.c | 24 | ||||
-rw-r--r-- | src/font.h | 14 | ||||
-rw-r--r-- | src/options.c | 6 | ||||
-rw-r--r-- | src/screen.c | 58 |
5 files changed, 81 insertions, 26 deletions
@@ -5617,3 +5617,8 @@ Sun Oct 25 12:39:34 2009 Michael Jennings (mej) Fix for scrolling limitations from Cliff Miller <cbm@whatexit.org>. ---------------------------------------------------------------------- +Sun Oct 25 13:52:40 2009 Michael Jennings (mej) + +Support font effects in 8 directions. Patch supplied by Joern +Bernhardt <Joern.Bernhardt@gmx.net>. +---------------------------------------------------------------------- @@ -52,7 +52,7 @@ const char *def_mfontName[] = { MFONT0, MFONT1, MFONT2, MFONT3, MFONT4 }; #endif const char *def_fontName[] = { FONT0, FONT1, FONT2, FONT3, FONT4 }; unsigned char font_chg = 0; -fontshadow_t fshadow = { {0, 0, 0, 0}, {0, 0, 0, 1}, 1 }; +fontshadow_t fshadow = { {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 1}, 1 }; static cachefont_t *font_cache = NULL, *cur_font = NULL; static void font_cache_add(const char *name, unsigned char type, void *info); @@ -689,10 +689,18 @@ get_corner(const char *corner) { if (!BEG_STRCASECMP(corner, "tl ") || !BEG_STRCASECMP(corner, "top_left")) { return SHADOW_TOP_LEFT; + } else if (!BEG_STRCASECMP(corner, "t ") || !BEG_STRCASECMP(corner, "top")) { + return SHADOW_TOP; } else if (!BEG_STRCASECMP(corner, "tr ") || !BEG_STRCASECMP(corner, "top_right")) { return SHADOW_TOP_RIGHT; + } else if (!BEG_STRCASECMP(corner, "l ") || !BEG_STRCASECMP(corner, "left")) { + return SHADOW_LEFT; + } else if (!BEG_STRCASECMP(corner, "r ") || !BEG_STRCASECMP(corner, "right")) { + return SHADOW_RIGHT; } else if (!BEG_STRCASECMP(corner, "bl ") || !BEG_STRCASECMP(corner, "bottom_left")) { return SHADOW_BOTTOM_LEFT; + } else if (!BEG_STRCASECMP(corner, "b ") || !BEG_STRCASECMP(corner, "bottom")) { + return SHADOW_BOTTOM; } else if (!BEG_STRCASECMP(corner, "br ") || !BEG_STRCASECMP(corner, "bottom_right")) { return SHADOW_BOTTOM_RIGHT; } else { @@ -705,7 +713,7 @@ set_shadow_color_by_name(unsigned char which, const char *color_name) { Pixel p; - ASSERT(which <= 4); + ASSERT(which <= 7); // which = 0-7 [SHADOW_TOP_LEFT - SHADOW_BOTTOM_RIGHT] p = get_color_by_name(color_name, "#000000"); fshadow.color[which] = p; @@ -715,7 +723,7 @@ set_shadow_color_by_name(unsigned char which, const char *color_name) void set_shadow_color_by_pixel(unsigned char which, Pixel p) { - ASSERT(which <= 4); + ASSERT(which <= 7); // which = 0-7 [SHADOW_TOP_LEFT - SHADOW_BOTTOM_RIGHT] fshadow.color[which] = p; fshadow.shadow[which] = fshadow.do_shadow = 1; @@ -751,7 +759,7 @@ parse_font_fx(char *line) color = spiftool_get_word(2, line); p = get_color_by_name(color, "black"); FREE(color); - for (which = 0; which < 4; which++) { + for (which = 0; which < 8; which++) { set_shadow_color_by_pixel(which, p); } } else if (!BEG_STRCASECMP(line, "shadow")) { @@ -762,8 +770,10 @@ parse_font_fx(char *line) color = spiftool_get_word(3, line); corner = spiftool_get_pword(2, line); which = get_corner(corner); - if (which >= 4) { + if (which >= 8) { return 0; + } else if (which != SHADOW_BOTTOM_RIGHT) { + fshadow.shadow[SHADOW_BOTTOM_RIGHT] = 0; } } else { return 0; @@ -776,12 +786,14 @@ parse_font_fx(char *line) } color = spiftool_get_word(2, line); p = get_color_by_name(color, "black"); + set_shadow_color_by_pixel(SHADOW_BOTTOM, p); set_shadow_color_by_pixel(SHADOW_BOTTOM_RIGHT, p); FREE(color); color = spiftool_get_word(3, line); p = get_color_by_name(color, "white"); set_shadow_color_by_pixel(SHADOW_TOP_LEFT, p); + set_shadow_color_by_pixel(SHADOW_TOP, p); FREE(color); } else if (!BEG_STRCASECMP(line, "carved")) { if (n != 3) { @@ -790,10 +802,12 @@ parse_font_fx(char *line) color = spiftool_get_word(2, line); p = get_color_by_name(color, "black"); set_shadow_color_by_pixel(SHADOW_TOP_LEFT, p); + set_shadow_color_by_pixel(SHADOW_TOP, p); FREE(color); color = spiftool_get_word(3, line); p = get_color_by_name(color, "white"); + set_shadow_color_by_pixel(SHADOW_BOTTOM, p); set_shadow_color_by_pixel(SHADOW_BOTTOM_RIGHT, p); FREE(color); } else { @@ -42,9 +42,13 @@ /* These are subscripts for the arrays in a fontshadow_t */ #define SHADOW_TOP_LEFT 0 -#define SHADOW_TOP_RIGHT 1 -#define SHADOW_BOTTOM_LEFT 2 -#define SHADOW_BOTTOM_RIGHT 3 +#define SHADOW_TOP 1 +#define SHADOW_TOP_RIGHT 2 +#define SHADOW_LEFT 3 +#define SHADOW_RIGHT 4 +#define SHADOW_BOTTOM_LEFT 5 +#define SHADOW_BOTTOM 6 +#define SHADOW_BOTTOM_RIGHT 7 /* The macros are used to advance to the next/previous font as with Ctrl-> and Ctrl-< */ #define NEXT_FONT(i) do { if (font_idx + ((i)?(i):1) >= font_cnt) {font_idx = font_cnt - 1;} else {font_idx += ((i)?(i):1);} \ @@ -67,8 +71,8 @@ typedef struct cachefont_struct { } cachefont_t; typedef struct fontshadow_struct { - Pixel color[4]; - unsigned char shadow[4]; + Pixel color[8]; + unsigned char shadow[8]; unsigned char do_shadow; } fontshadow_t; diff --git a/src/options.c b/src/options.c index 7cf8a8a..2b305a3 100644 --- a/src/options.c +++ b/src/options.c @@ -3255,14 +3255,18 @@ save_config(char *path, unsigned char save_theme) if (fshadow.do_shadow) { const char *corners[] = { "top_left", + "top", "top_right", + "left", + "right", "bottom_left", + "bottom", "bottom_right" }; unsigned char shad = 0; fprintf(fp, " font effects"); - for (i = 0; i < 4; i++) { + for (i = 0; i < 8; i++) { if (fshadow.shadow[i]) { fprintf(fp, " %s 0x%08x", corners[i], (unsigned int) fshadow.color[i]); shad = 1; diff --git a/src/screen.c b/src/screen.c index 6410511..0b1b5a8 100644 --- a/src/screen.c +++ b/src/screen.c @@ -389,7 +389,7 @@ scr_poweron(void) /* * Save and Restore cursor - * XTERM_SEQ: Save cursor : ESC 7 + * XTERM_SEQ: Save cursor : ESC 7 * XTERM_SEQ: Restore cursor: ESC 8 */ void @@ -2014,11 +2014,11 @@ scr_refresh(int type) ww = Width2Pixel(wlen); hh = Height2Pixel(1); CLEAR_CHARS(xpixel, ypixel - ascent, len); - if (fshadow.shadow[SHADOW_TOP_LEFT] || fshadow.shadow[SHADOW_TOP_RIGHT]) { + if (fshadow.shadow[SHADOW_TOP_LEFT] || fshadow.shadow[SHADOW_TOP] || fshadow.shadow[SHADOW_TOP_RIGHT]) { yy--; hh++; } - if (fshadow.shadow[SHADOW_BOTTOM_LEFT] || fshadow.shadow[SHADOW_BOTTOM_RIGHT]) { + if (fshadow.shadow[SHADOW_BOTTOM_LEFT] || fshadow.shadow[SHADOW_BOTTOM] || fshadow.shadow[SHADOW_BOTTOM_RIGHT]) { hh++; if (row < nrows - 1) { int ii; @@ -2035,6 +2035,13 @@ scr_refresh(int type) dtp[col - 1] = 0; } } + if (fshadow.shadow[SHADOW_TOP]) { + XSetForeground(Xdisplay, TermWin.gc, fshadow.color[SHADOW_TOP]); + DRAW_STRING(draw_string, xpixel, ypixel - 1, buffer, wlen); + if (col) { + dtp[col] = 0; + } + } if (fshadow.shadow[SHADOW_TOP_RIGHT]) { XSetForeground(Xdisplay, TermWin.gc, fshadow.color[SHADOW_TOP_RIGHT]); DRAW_STRING(draw_string, xpixel + 1, ypixel - 1, buffer, wlen); @@ -2042,6 +2049,20 @@ scr_refresh(int type) dtp[col + 1] = 0; } } + if (fshadow.shadow[SHADOW_LEFT]) { + XSetForeground(Xdisplay, TermWin.gc, fshadow.color[SHADOW_LEFT]); + DRAW_STRING(draw_string, xpixel - 1, ypixel, buffer, wlen); + if (col) { + dtp[col - 1] = 0; + } + } + if (fshadow.shadow[SHADOW_RIGHT]) { + XSetForeground(Xdisplay, TermWin.gc, fshadow.color[SHADOW_RIGHT]); + DRAW_STRING(draw_string, xpixel + 1, ypixel, buffer, wlen); + if (col < ncols - 1) { + dtp[col + 1] = 0; + } + } if (fshadow.shadow[SHADOW_BOTTOM_LEFT]) { XSetForeground(Xdisplay, TermWin.gc, fshadow.color[SHADOW_BOTTOM_LEFT]); DRAW_STRING(draw_string, xpixel - 1, ypixel + 1, buffer, wlen); @@ -2049,6 +2070,13 @@ scr_refresh(int type) dtp[col - 1] = 0; } } + if (fshadow.shadow[SHADOW_BOTTOM]) { + XSetForeground(Xdisplay, TermWin.gc, fshadow.color[SHADOW_BOTTOM]); + DRAW_STRING(draw_string, xpixel, ypixel + 1, buffer, wlen); + if (col) { + dtp[col] = 0; + } + } if (fshadow.shadow[SHADOW_BOTTOM_RIGHT]) { XSetForeground(Xdisplay, TermWin.gc, fshadow.color[SHADOW_BOTTOM_RIGHT]); DRAW_STRING(draw_string, xpixel + 1, ypixel + 1, buffer, wlen); @@ -2163,37 +2191,37 @@ scr_refresh(int type) D_SCREEN(("Update box dimensions: from (%d, %d) to (%d, %d). Dimensions %dx%d\n", low_x, low_y, high_x, high_y, high_x - low_x + 1, high_y - low_y + 1)); XClearArea(Xdisplay, TermWin.vt, low_x, low_y, high_x - low_x + 1, high_y - low_y + 1, False); - if (fshadow.shadow[SHADOW_TOP_LEFT] || fshadow.shadow[SHADOW_BOTTOM_LEFT]) { + if (fshadow.shadow[SHADOW_TOP_LEFT] || fshadow.shadow[SHADOW_LEFT] || fshadow.shadow[SHADOW_BOTTOM_LEFT]) { XCopyArea(Xdisplay, pmap, buffer_pixmap, TermWin.gc, TermWin.internalBorder - 1, 0, 1, TermWin_TotalHeight() - 1, TermWin.internalBorder - 1, 0); XClearArea(Xdisplay, TermWin.vt, TermWin.internalBorder - 1, 0, 1, TermWin_TotalHeight() - 1, False); } - if (fshadow.shadow[SHADOW_TOP_RIGHT] || fshadow.shadow[SHADOW_BOTTOM_RIGHT] || boldlast) { + if (fshadow.shadow[SHADOW_TOP_RIGHT] || fshadow.shadow[SHADOW_RIGHT] || fshadow.shadow[SHADOW_BOTTOM_RIGHT] || boldlast) { XCopyArea(Xdisplay, pmap, buffer_pixmap, TermWin.gc, TermWin_TotalWidth() - 2, 0, 1, TermWin_TotalHeight() - 1, TermWin_TotalWidth() - 2, 0); XClearArea(Xdisplay, TermWin.vt, TermWin_TotalWidth() - 2, 0, 1, TermWin_TotalHeight() - 1, False); } - if (fshadow.shadow[SHADOW_TOP_LEFT] || fshadow.shadow[SHADOW_TOP_RIGHT]) { + if (fshadow.shadow[SHADOW_TOP_LEFT] || fshadow.shadow[SHADOW_TOP] || fshadow.shadow[SHADOW_TOP_RIGHT]) { XCopyArea(Xdisplay, pmap, buffer_pixmap, TermWin.gc, 0, TermWin.internalBorder - 1, TermWin_TotalWidth() - 1, 1, 0, TermWin.internalBorder - 1); XClearArea(Xdisplay, TermWin.vt, 0, TermWin.internalBorder - 1, TermWin_TotalWidth() - 1, 1, False); } - if (fshadow.shadow[SHADOW_BOTTOM_LEFT] || fshadow.shadow[SHADOW_BOTTOM_RIGHT]) { + if (fshadow.shadow[SHADOW_BOTTOM_LEFT] || fshadow.shadow[SHADOW_BOTTOM] || fshadow.shadow[SHADOW_BOTTOM_RIGHT]) { XCopyArea(Xdisplay, pmap, buffer_pixmap, TermWin.gc, 0, TermWin_TotalHeight() - TermWin.internalBorder, TermWin_TotalWidth() - 1, 1, 0, TermWin_TotalHeight() - TermWin.internalBorder); XClearArea(Xdisplay, TermWin.vt, 0, TermWin_TotalHeight() - TermWin.internalBorder, TermWin_TotalWidth() - 1, 1, False); } } else { - if (fshadow.shadow[SHADOW_TOP_LEFT] || fshadow.shadow[SHADOW_BOTTOM_LEFT]) { + if (fshadow.shadow[SHADOW_TOP_LEFT] || fshadow.shadow[SHADOW_LEFT] || fshadow.shadow[SHADOW_BOTTOM_LEFT]) { XClearArea(Xdisplay, TermWin.vt, TermWin.internalBorder - 1, 0, 1, TermWin_TotalHeight() - 1, False); } - if ((fshadow.shadow[SHADOW_TOP_RIGHT] || fshadow.shadow[SHADOW_BOTTOM_RIGHT] || boldlast) && TermWin.internalBorder) { + if ((fshadow.shadow[SHADOW_TOP_RIGHT] || fshadow.shadow[SHADOW_RIGHT] || fshadow.shadow[SHADOW_BOTTOM_RIGHT] || boldlast) && TermWin.internalBorder) { XClearArea(Xdisplay, TermWin.vt, TermWin_TotalWidth() - 2, 0, 1, TermWin_TotalHeight() - 1, False); } - if (fshadow.shadow[SHADOW_TOP_LEFT] || fshadow.shadow[SHADOW_TOP_RIGHT]) { + if (fshadow.shadow[SHADOW_TOP_LEFT] || fshadow.shadow[SHADOW_TOP] || fshadow.shadow[SHADOW_TOP_RIGHT]) { XClearArea(Xdisplay, TermWin.vt, 0, TermWin.internalBorder - 1, TermWin_TotalWidth() - 1, 1, False); } - if (fshadow.shadow[SHADOW_BOTTOM_LEFT] || fshadow.shadow[SHADOW_BOTTOM_RIGHT]) { + if (fshadow.shadow[SHADOW_BOTTOM_LEFT] || fshadow.shadow[SHADOW_BOTTOM] || fshadow.shadow[SHADOW_BOTTOM_RIGHT]) { XClearArea(Xdisplay, TermWin.vt, 0, TermWin_TotalHeight() - TermWin.internalBorder, TermWin_TotalWidth() - 1, 1, False); } } @@ -2704,7 +2732,7 @@ selection_start_colrow(int col, int row) selection.mark.row = row; } -/* +/* * Copy a selection into the cut buffer * EXT: button 1 or 3 release */ @@ -3242,7 +3270,7 @@ selection_extend_colrow(int col, int row, int flag, int cont) D_SELECT(("(c:%d,r:%d)-(c:%d,r:%d) old (c:%d,r:%d)-(c:%d,r:%d)\n", selection.beg.col, selection.beg.row, selection.end.col, selection.end.row, old_beg.col, old_beg.row, old_end.col, old_end.row)); -/* +/* * B1: clear anything before the current selection */ if ((old_beg.row < selection.beg.row) || (old_beg.row == selection.beg.row && old_beg.col < selection.beg.col)) { @@ -3255,7 +3283,7 @@ selection_extend_colrow(int col, int row, int flag, int cont) } selection_setclr(0, old_beg.row, old_beg.col, row, col); } -/* +/* * B2: clear anything after the current selection */ if ((old_end.row > selection.end.row) || (old_end.row == selection.end.row && old_end.col > selection.end.col)) { @@ -3268,7 +3296,7 @@ selection_extend_colrow(int col, int row, int flag, int cont) } selection_setclr(0, row, col, old_end.row, old_end.col); } -/* +/* * B3: set everything */ /* TODO: optimise this */ |