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>. ---------------------------------------------------------------------- SVN revision: 43283
This commit is contained in:
parent
e59a5a4e95
commit
f4494790e2
|
@ -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>.
|
||||
----------------------------------------------------------------------
|
||||
|
|
24
src/font.c
24
src/font.c
|
@ -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 {
|
||||
|
|
14
src/font.h
14
src/font.h
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
58
src/screen.c
58
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 */
|
||||
|
|
Loading…
Reference in New Issue