mirror of https://github.com/cy384/ssheven.git
improve text drawing code to work with multiple font sizes (no UI)
This commit is contained in:
parent
5ee3e7104b
commit
9a7b95ef6f
|
@ -20,6 +20,8 @@
|
||||||
|
|
||||||
char key_to_vterm[256] = { VTERM_KEY_NONE };
|
char key_to_vterm[256] = { VTERM_KEY_NONE };
|
||||||
|
|
||||||
|
int font_offset = 0;
|
||||||
|
|
||||||
void setup_key_translation(void)
|
void setup_key_translation(void)
|
||||||
{
|
{
|
||||||
// TODO: figure out how to translate the rest of these
|
// TODO: figure out how to translate the rest of these
|
||||||
|
@ -57,11 +59,10 @@ void setup_key_translation(void)
|
||||||
//key_to_vterm[0] = VTERM_KEY_KP_EQUAL;
|
//key_to_vterm[0] = VTERM_KEY_KP_EQUAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
Rect cell_rect(int x, int y, Rect bounds)
|
inline Rect cell_rect(int x, int y, Rect bounds)
|
||||||
{
|
{
|
||||||
Rect r = { (short) (bounds.top + y * con.cell_height), (short) (bounds.left + x * con.cell_width + 2),
|
Rect r = { (short) (bounds.top + y * con.cell_height + 2), (short) (bounds.left + x * con.cell_width + 2),
|
||||||
(short) (bounds.top + (y+1) * con.cell_height), (short) (bounds.left + (x+1) * con.cell_width + 2) };
|
(short) (bounds.top + (y+1) * con.cell_height + 2), (short) (bounds.left + (x+1) * con.cell_width + 2) };
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -72,7 +73,7 @@ void print_string(const char* c)
|
||||||
|
|
||||||
inline void draw_char(int x, int y, Rect* r, char c)
|
inline void draw_char(int x, int y, Rect* r, char c)
|
||||||
{
|
{
|
||||||
MoveTo(r->left + x * con.cell_width + 2, r->top + ((y+1) * con.cell_height) - 2);
|
MoveTo(r->left + 2 + x * con.cell_width, r->top + 2 - font_offset + ((y+1) * con.cell_height));
|
||||||
DrawChar(c);
|
DrawChar(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -111,46 +112,7 @@ int qd2idx(int qdc)
|
||||||
}
|
}
|
||||||
|
|
||||||
// convert vterm's ANSI color indexes into Quickdraw colors
|
// convert vterm's ANSI color indexes into Quickdraw colors
|
||||||
inline int idx2qd(VTermColor c)
|
int idx2qd[16] = { blackColor, redColor, greenColor, yellowColor, blueColor, magentaColor, cyanColor, whiteColor, blackColor, redColor, greenColor, yellowColor, blueColor, magentaColor, cyanColor, whiteColor };
|
||||||
{
|
|
||||||
switch (c.indexed.idx)
|
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
return blackColor;
|
|
||||||
case 1:
|
|
||||||
return redColor;
|
|
||||||
case 2:
|
|
||||||
return greenColor;
|
|
||||||
case 3:
|
|
||||||
return yellowColor;
|
|
||||||
case 4:
|
|
||||||
return blueColor;
|
|
||||||
case 5:
|
|
||||||
return magentaColor;
|
|
||||||
case 6:
|
|
||||||
return cyanColor;
|
|
||||||
case 7:
|
|
||||||
return whiteColor;
|
|
||||||
case 8:
|
|
||||||
return blackColor;
|
|
||||||
case 9:
|
|
||||||
return redColor;
|
|
||||||
case 10:
|
|
||||||
return greenColor;
|
|
||||||
case 11:
|
|
||||||
return yellowColor;
|
|
||||||
case 12:
|
|
||||||
return blueColor;
|
|
||||||
case 13:
|
|
||||||
return magentaColor;
|
|
||||||
case 14:
|
|
||||||
return cyanColor;
|
|
||||||
case 15:
|
|
||||||
return whiteColor;
|
|
||||||
default:
|
|
||||||
return blackColor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void point_to_cell(Point p, int* x, int* y)
|
void point_to_cell(Point p, int* x, int* y)
|
||||||
{
|
{
|
||||||
|
@ -403,11 +365,6 @@ void draw_screen_color(Rect* r)
|
||||||
//short minCol = (0 > (r->left - bounds.left) / con.cell_width) ? 0 : (r->left - bounds.left) / con.cell_width;
|
//short minCol = (0 > (r->left - bounds.left) / con.cell_width) ? 0 : (r->left - bounds.left) / con.cell_width;
|
||||||
//short maxCol = (con.size_x < (r->right - bounds.left + con.cell_width - 1) / con.cell_width) ? con.size_x : (r->right - bounds.left + con.cell_width - 1) / con.cell_width;
|
//short maxCol = (con.size_x < (r->right - bounds.left + con.cell_width - 1) / con.cell_width) ? con.size_x : (r->right - bounds.left + con.cell_width - 1) / con.cell_width;
|
||||||
|
|
||||||
short minRow = 0;
|
|
||||||
short maxRow = con.size_y;
|
|
||||||
short minCol = 0;
|
|
||||||
short maxCol = con.size_x;
|
|
||||||
|
|
||||||
// don't clobber font settings
|
// don't clobber font settings
|
||||||
short save_font = qd.thePort->txFont;
|
short save_font = qd.thePort->txFont;
|
||||||
short save_font_size = qd.thePort->txSize;
|
short save_font_size = qd.thePort->txSize;
|
||||||
|
@ -415,15 +372,19 @@ void draw_screen_color(Rect* r)
|
||||||
short save_font_fg = qd.thePort->fgColor;
|
short save_font_fg = qd.thePort->fgColor;
|
||||||
short save_font_bg = qd.thePort->bkColor;
|
short save_font_bg = qd.thePort->bkColor;
|
||||||
|
|
||||||
TextFont(kFontIDMonaco);
|
short minRow = 0;
|
||||||
TextSize(9);
|
short maxRow = con.size_y;
|
||||||
TextFace(normal);
|
short minCol = 0;
|
||||||
qd.thePort->bkColor = prefs.bg_color;
|
short maxCol = con.size_x;
|
||||||
qd.thePort->fgColor = prefs.fg_color;
|
|
||||||
|
|
||||||
TextFont(kFontIDMonaco);
|
TextFont(kFontIDMonaco);
|
||||||
TextSize(9);
|
TextSize(prefs.font_size);
|
||||||
TextFace(normal);
|
TextFace(normal);
|
||||||
|
BackColor(prefs.bg_color);
|
||||||
|
ForeColor(prefs.fg_color);
|
||||||
|
|
||||||
|
//EraseRect(&con.offscreen->portRect);
|
||||||
|
|
||||||
TextMode(srcOr);
|
TextMode(srcOr);
|
||||||
|
|
||||||
short face = normal;
|
short face = normal;
|
||||||
|
@ -468,13 +429,13 @@ void draw_screen_color(Rect* r)
|
||||||
|
|
||||||
if (vtsc->pen.reverse)
|
if (vtsc->pen.reverse)
|
||||||
{
|
{
|
||||||
qd.thePort->bkColor = idx2qd(vtsc->pen.fg);
|
BackColor(idx2qd[vtsc->pen.fg.indexed.idx]);
|
||||||
qd.thePort->fgColor = idx2qd(vtsc->pen.bg);
|
ForeColor(idx2qd[vtsc->pen.bg.indexed.idx]);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
qd.thePort->fgColor = idx2qd(vtsc->pen.fg);
|
ForeColor(idx2qd[vtsc->pen.fg.indexed.idx]);
|
||||||
qd.thePort->bkColor = idx2qd(vtsc->pen.bg);
|
BackColor(idx2qd[vtsc->pen.bg.indexed.idx]);
|
||||||
}
|
}
|
||||||
|
|
||||||
cr = cell_rect(pos.col, pos.row, *r);
|
cr = cell_rect(pos.col, pos.row, *r);
|
||||||
|
@ -495,9 +456,8 @@ void draw_screen_color(Rect* r)
|
||||||
if (vtsc->pen.italic) face |= (condense|italic);
|
if (vtsc->pen.italic) face |= (condense|italic);
|
||||||
if (vtsc->pen.underline) face |= underline;
|
if (vtsc->pen.underline) face |= underline;
|
||||||
|
|
||||||
if (face != normal) TextFace(face);
|
TextFace(face);
|
||||||
draw_char(pos.col, pos.row, r, c);
|
draw_char(pos.col, pos.row, r, c);
|
||||||
if (face != normal) TextFace(normal);
|
|
||||||
|
|
||||||
if (i < select_end && i >= select_start)
|
if (i < select_end && i >= select_start)
|
||||||
{
|
{
|
||||||
|
@ -543,17 +503,11 @@ void draw_screen_fast(Rect* r)
|
||||||
short save_font_bg = qd.thePort->bkColor;
|
short save_font_bg = qd.thePort->bkColor;
|
||||||
|
|
||||||
TextFont(kFontIDMonaco);
|
TextFont(kFontIDMonaco);
|
||||||
TextSize(9);
|
TextSize(prefs.font_size);
|
||||||
TextFace(normal);
|
TextFace(normal);
|
||||||
qd.thePort->bkColor = whiteColor;
|
qd.thePort->bkColor = whiteColor;
|
||||||
qd.thePort->fgColor = blackColor;
|
qd.thePort->fgColor = blackColor;
|
||||||
|
TextMode(srcOr); // or mode is faster for drawing black on white
|
||||||
//EraseRect(r);
|
|
||||||
|
|
||||||
TextFont(kFontIDMonaco);
|
|
||||||
TextSize(9);
|
|
||||||
TextFace(normal);
|
|
||||||
TextMode(srcOr);
|
|
||||||
|
|
||||||
int select_start = -1;
|
int select_start = -1;
|
||||||
int select_end = -1;
|
int select_end = -1;
|
||||||
|
@ -588,6 +542,8 @@ void draw_screen_fast(Rect* r)
|
||||||
char row_invert[con.size_x];
|
char row_invert[con.size_x];
|
||||||
Rect cr;
|
Rect cr;
|
||||||
|
|
||||||
|
int vertical_offset = r->top + con.cell_height - font_offset + 2;
|
||||||
|
|
||||||
for(pos.row = 0; pos.row < con.size_y; pos.row++)
|
for(pos.row = 0; pos.row < con.size_y; pos.row++)
|
||||||
{
|
{
|
||||||
erase_row(pos.row);
|
erase_row(pos.row);
|
||||||
|
@ -601,7 +557,7 @@ void draw_screen_fast(Rect* r)
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
MoveTo(r->left + 2, r->top + ((pos.row+1) * con.cell_height) - 2);
|
MoveTo(r->left + 2, vertical_offset);
|
||||||
DrawText(row_text, 0, con.size_x);
|
DrawText(row_text, 0, con.size_x);
|
||||||
|
|
||||||
for (int i = 0; i < con.size_x; i++)
|
for (int i = 0; i < con.size_x; i++)
|
||||||
|
@ -612,6 +568,7 @@ void draw_screen_fast(Rect* r)
|
||||||
InvertRect(&cr);
|
InvertRect(&cr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
vertical_offset += con.cell_height;
|
||||||
}
|
}
|
||||||
|
|
||||||
// do the cursor if needed
|
// do the cursor if needed
|
||||||
|
@ -814,21 +771,26 @@ void console_setup(void)
|
||||||
con.size_y = 24;
|
con.size_y = 24;
|
||||||
|
|
||||||
TextFont(kFontIDMonaco);
|
TextFont(kFontIDMonaco);
|
||||||
TextSize(9);
|
TextSize(prefs.font_size);
|
||||||
TextFace(normal);
|
TextFace(normal);
|
||||||
|
|
||||||
con.cell_height = 12;
|
FontInfo fi = {0};
|
||||||
con.cell_width = CharWidth('M');
|
GetFontInfo(&fi);
|
||||||
|
|
||||||
|
con.cell_height = fi.ascent + fi.descent + fi.leading + 1;
|
||||||
|
font_offset = fi.descent;
|
||||||
|
con.cell_width = fi.widMax;
|
||||||
|
|
||||||
TextFont(save_font);
|
TextFont(save_font);
|
||||||
TextSize(save_font_size);
|
TextSize(save_font_size);
|
||||||
TextFace(save_font_face);
|
TextFace(save_font_face);
|
||||||
|
|
||||||
Rect initial_window_bounds = qd.screenBits.bounds;
|
Rect initial_window_bounds = qd.screenBits.bounds;
|
||||||
|
|
||||||
InsetRect(&initial_window_bounds, 20, 20);
|
InsetRect(&initial_window_bounds, 20, 20);
|
||||||
initial_window_bounds.top += 40;
|
initial_window_bounds.top += 40;
|
||||||
|
|
||||||
initial_window_bounds.bottom = initial_window_bounds.top + con.cell_height * con.size_y + 2;
|
initial_window_bounds.bottom = initial_window_bounds.top + con.cell_height * con.size_y + 4;
|
||||||
initial_window_bounds.right = initial_window_bounds.left + con.cell_width * con.size_x + 4;
|
initial_window_bounds.right = initial_window_bounds.left + con.cell_width * con.size_x + 4;
|
||||||
|
|
||||||
ConstStr255Param title = "\pssheven " SSHEVEN_VERSION;
|
ConstStr255Param title = "\pssheven " SSHEVEN_VERSION;
|
||||||
|
|
|
@ -4,11 +4,11 @@
|
||||||
#define __SSHEVEN_CONSTANTS_R__
|
#define __SSHEVEN_CONSTANTS_R__
|
||||||
|
|
||||||
/* so many versions */
|
/* so many versions */
|
||||||
#define SSHEVEN_VERSION "0.8.6"
|
#define SSHEVEN_VERSION "0.8.7"
|
||||||
#define SSHEVEN_LONG_VERSION "0.8.6 prerelease, by cy384"
|
#define SSHEVEN_LONG_VERSION "0.8.7 prerelease, by cy384"
|
||||||
#define SSHEVEN_DESCRIPTION "ssheven 0.8.6 by cy384"
|
#define SSHEVEN_DESCRIPTION "ssheven 0.8.7 by cy384"
|
||||||
#define SSHEVEN_VERSION_MAJOR 0x00
|
#define SSHEVEN_VERSION_MAJOR 0x00
|
||||||
#define SSHEVEN_VERSION_MINOR 0x86
|
#define SSHEVEN_VERSION_MINOR 0x87
|
||||||
#define SSHEVEN_VERSION_PRERELEASE 0x01
|
#define SSHEVEN_VERSION_PRERELEASE 0x01
|
||||||
|
|
||||||
/* options: development, alpha, beta, release */
|
/* options: development, alpha, beta, release */
|
||||||
|
|
15
ssheven.c
15
ssheven.c
|
@ -131,7 +131,7 @@ int save_prefs(void)
|
||||||
memset(output_buffer, 0, write_length);
|
memset(output_buffer, 0, write_length);
|
||||||
|
|
||||||
long int i = snprintf(output_buffer, write_length, "%d\n%d\n", prefs.major_version, prefs.minor_version);
|
long int i = snprintf(output_buffer, write_length, "%d\n%d\n", prefs.major_version, prefs.minor_version);
|
||||||
i += snprintf(output_buffer+i, write_length-i, "%d\n%d\n%d\n%d\n", (int)prefs.auth_type, (int)prefs.display_mode, (int)prefs.fg_color, (int)prefs.bg_color);
|
i += snprintf(output_buffer+i, write_length-i, "%d\n%d\n%d\n%d\n%d\n", (int)prefs.auth_type, (int)prefs.display_mode, (int)prefs.fg_color, (int)prefs.bg_color, (int)prefs.font_size);
|
||||||
|
|
||||||
snprintf(output_buffer+i, prefs.hostname[0]+1, "%s", prefs.hostname+1); i += prefs.hostname[0];
|
snprintf(output_buffer+i, prefs.hostname[0]+1, "%s", prefs.hostname+1); i += prefs.hostname[0];
|
||||||
i += snprintf(output_buffer+i, write_length-i, "\n");
|
i += snprintf(output_buffer+i, write_length-i, "\n");
|
||||||
|
@ -192,6 +192,7 @@ void init_prefs(void)
|
||||||
prefs.display_mode = COLOR;
|
prefs.display_mode = COLOR;
|
||||||
prefs.fg_color = blackColor;
|
prefs.fg_color = blackColor;
|
||||||
prefs.bg_color = whiteColor;
|
prefs.bg_color = whiteColor;
|
||||||
|
prefs.font_size = 9;
|
||||||
|
|
||||||
prefs.loaded_from_file = 0;
|
prefs.loaded_from_file = 0;
|
||||||
}
|
}
|
||||||
|
@ -241,7 +242,7 @@ void load_prefs(void)
|
||||||
if ((prefs.major_version == SSHEVEN_VERSION_MAJOR) && (prefs.minor_version == SSHEVEN_VERSION_MINOR))
|
if ((prefs.major_version == SSHEVEN_VERSION_MAJOR) && (prefs.minor_version == SSHEVEN_VERSION_MINOR))
|
||||||
{
|
{
|
||||||
prefs.loaded_from_file = 1;
|
prefs.loaded_from_file = 1;
|
||||||
items_got = sscanf(buffer, "%d\n%d\n%d\n%d\n%d\n%d\n%255[^\n]\n%255[^\n]\n%255[^\n]\n%[^\n]\n%[^\n]", &prefs.major_version, &prefs.minor_version, (int*)&prefs.auth_type, (int*)&prefs.display_mode, &prefs.fg_color, &prefs.bg_color, prefs.hostname+1, prefs.username+1, prefs.port+1, prefs.privkey_path, prefs.pubkey_path);
|
items_got = sscanf(buffer, "%d\n%d\n%d\n%d\n%d\n%d\n%d\n%255[^\n]\n%255[^\n]\n%255[^\n]\n%[^\n]\n%[^\n]", &prefs.major_version, &prefs.minor_version, (int*)&prefs.auth_type, (int*)&prefs.display_mode, &prefs.fg_color, &prefs.bg_color, &prefs.font_size, prefs.hostname+1, prefs.username+1, prefs.port+1, prefs.privkey_path, prefs.pubkey_path);
|
||||||
|
|
||||||
// add the size for the pascal strings
|
// add the size for the pascal strings
|
||||||
prefs.hostname[0] = (unsigned char)strlen(prefs.hostname+1);
|
prefs.hostname[0] = (unsigned char)strlen(prefs.hostname+1);
|
||||||
|
@ -478,7 +479,7 @@ void resize_con_window(WindowPtr eventWin, EventRecord event)
|
||||||
int width = growResult & 0xFFFF;
|
int width = growResult & 0xFFFF;
|
||||||
|
|
||||||
// 'snap' to a size that won't have extra pixels not in a cell
|
// 'snap' to a size that won't have extra pixels not in a cell
|
||||||
int next_height = height - ((height - 2) % con.cell_height);
|
int next_height = height - ((height - 4) % con.cell_height);
|
||||||
int next_width = width - ((width - 4) % con.cell_width);
|
int next_width = width - ((width - 4) % con.cell_width);
|
||||||
|
|
||||||
SizeWindow(eventWin, next_width, next_height, true);
|
SizeWindow(eventWin, next_width, next_height, true);
|
||||||
|
@ -567,12 +568,12 @@ void event_loop(void)
|
||||||
// wait to get a GUI event
|
// wait to get a GUI event
|
||||||
while (!WaitNextEvent(everyEvent, &event, sleep_time, NULL))
|
while (!WaitNextEvent(everyEvent, &event, sleep_time, NULL))
|
||||||
{
|
{
|
||||||
// timed out without any GUI events
|
YieldToAnyThread();
|
||||||
// toggle our cursor if needed
|
|
||||||
check_cursor();
|
check_cursor();
|
||||||
|
|
||||||
// then let any other threads run before we wait for events again
|
BeginUpdate(con.win);
|
||||||
YieldToAnyThread();
|
draw_screen(&(con.win->portRect));
|
||||||
|
EndUpdate(con.win);
|
||||||
}
|
}
|
||||||
|
|
||||||
// might need to toggle our cursor even if we got an event
|
// might need to toggle our cursor even if we got an event
|
||||||
|
|
Loading…
Reference in New Issue