From c29fdcbaf28d3f9fa4aa9ba1c82b39b35517aebb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C2=A8Rene=20Richarz?= <¨rene.richarz@bluewin.ch¨> Date: Fri, 5 Apr 2019 14:47:36 +0200 Subject: [PATCH] check limits properly when displaying text --- pltfiles/{usmap.tek => usmap.plt} | Bin tek4010 | Bin 34376 -> 34456 bytes tek4010.c | 80 +++++++++++++++++++----------- 3 files changed, 52 insertions(+), 28 deletions(-) rename pltfiles/{usmap.tek => usmap.plt} (100%) diff --git a/pltfiles/usmap.tek b/pltfiles/usmap.plt similarity index 100% rename from pltfiles/usmap.tek rename to pltfiles/usmap.plt diff --git a/tek4010 b/tek4010 index 21ed4d785edbc501bdf25bd20073fd746ff8e3b8..f86c3f1d40ebd5af2fa4b5d24fba11020541c572 100755 GIT binary patch delta 9770 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 VKB)dl#&+?D=jSV*@U-V+{u^RaEgS#< delta 9270 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 L$|3$&2SffFE6tfv diff --git a/tek4010.c b/tek4010.c index f4d1c9d..306efb9 100755 --- a/tek4010.c +++ b/tek4010.c @@ -24,7 +24,7 @@ * */ -#define DEBUG 0 // print debug info +#define DEBUG 0 // print debug info #define DEBUGMAX 0 // exit after DEBUGMAX chars, 0 means no exit #define REFRESH_INTERVAL 30 // time in msec between refresh events @@ -95,11 +95,11 @@ static long characterInterval = 0; // mode 30 expecting escape sequence, escape code received // mode 31 received in ANSI escape sequence, escape sequence continues if next char is digit // -// mode 40 incremental plot (4104); is ignored until exit from incremental plot received +// mode 40 incremental plot mode; is ignored until exit from incremental plot received // mode 50 special point plot mode; not yet implemented // mode 101 ignore until group separator, not yet implemented -static int mode; +static int mode, savemode; int leftmargin; @@ -472,9 +472,10 @@ void tek4010_line_type(cairo_t *cr, cairo_t *cr2, enum LineType ln) cairo_set_dash (cr2,&dashset[ndx],ndash,ofs); } -void drawVector(cairo_t *cr, cairo_t *cr2,int x0,int y0,int x2,int y2) +void drawVector(cairo_t *cr, cairo_t *cr2) { if (DEBUG) printf("******************************************** Drawing to (%d,%d)\n",x2,y2); + if ((x2 == x0) && (y2 == y0)) x0++; // cairo cannot draw a dot if (writeThroughMode) { cairo_set_line_width (cr2, 1); cairo_set_source_rgb(cr2, 0.0, 1.0, 0.0); @@ -528,6 +529,16 @@ int escapeCodeHandler(cairo_t *cr, cairo_t *cr2, int todo, int ch) case '[': // a second escape code follows, do not reset mode break; + + case 14: // SO activate alternative char set, not implemented + case 15: // SI deactivate alternative char set + mode = 0; + break; + + case 28: // file separator >> point plot mode + mode = 5; + plotPointMode= 1; + break; // start of ignoring ANSI escape sequencies, could be improved (but the Tek4010 couldn't do this either!) case '0': @@ -566,12 +577,30 @@ int escapeCodeHandler(cairo_t *cr, cairo_t *cr2, int todo, int ch) case 'w': ltype = SOLID; writeThroughMode = 1; mode = 101; showCursor = 0; todo = 0; break; default: - printf("Escape code %02X not implemented\n",ch); + printf("Escape code %02X not implemented, mode = %d\n",ch, savemode); mode = 0; break; } - return todo; + return todo; +} + +void checkLimits() +/* check whether char is in visibel space */ +{ + /* don't check here for leftmargin, graphics needs to write characters to the whole screen */ + if (x0 < 0) x0 = 0; + if (x0 > windowWidth - hDotsPerChar) { + x0 = leftmargin; y0 -= vDotsPerChar; + } + if (y0 < 4) { + y0 = windowHeight - vDotsPerChar; + if (leftmargin) leftmargin = 0; + else leftmargin = windowWidth / 2; + /* check here for leftmargin */ + if (x0 < leftmargin) x0 = leftmargin; + } + if (y0 > (windowHeight - vDotsPerChar)) y0 = windowHeight - vDotsPerChar; } void tek4010_draw(cairo_t *cr, cairo_t *cr2, int first) @@ -650,14 +679,20 @@ void tek4010_draw(cairo_t *cr, cairo_t *cr2, int first) } if (mode == 31) { - // printf("ANSI escape mode 31, ch=%02x\n",ch); - if ((ch>='0') && (ch<='9')) mode = 30; + printf("ANSI escape mode 31, ch=%02x\n",ch); + if ((ch>='0') && (ch<='9')) { savemode = mode; mode = 30; } } if (ch == 27) { // escape code + savemode = mode; mode = 30; return; } + if (ch == 30) { + printf("Incremental plot mode not implemented\n"); + mode = 40; return; + } + int tag = (ch >> 5) & 3; if ((mode >= 1) && (mode <= 8)) { @@ -677,10 +712,6 @@ void tek4010_draw(cairo_t *cr, cairo_t *cr2, int first) mode = 1; goto endDo; // goto end of do loop } - if (ch == 30) { - if (DEBUG) printf("Starting incremental plot mode (4014)\n"); - mode = 40; return; - } if (DEBUG) { if (mode & 1) @@ -828,7 +859,7 @@ void tek4010_draw(cairo_t *cr, cairo_t *cr2, int first) else { cairo_set_source_rgb(cr, 0, 0.7, 0); - drawVector(cr,cr2,x0,y0,x2,y2); + drawVector(cr,cr2); todo--; } @@ -843,7 +874,7 @@ void tek4010_draw(cairo_t *cr, cairo_t *cr2, int first) case 30: todo = escapeCodeHandler(cr, cr2, todo, ch); break; - case 40: // used to ignore certain 4014 sequencies + case 40: // incremental plot mode, wait for end mark if (ch == 31) mode = 0; // leave this mode break; case 101: @@ -862,35 +893,28 @@ void tek4010_draw(cairo_t *cr, cairo_t *cr2, int first) break; case 8: // backspace x0 -= hDotsPerChar; - if (x0> point plot mode mode = 5; plotPointMode= 1; break; @@ -904,11 +928,11 @@ void tek4010_draw(cairo_t *cr, cairo_t *cr2, int first) mode = 0; break; default: if ((ch >= 32) && (ch <127)) { // printable character - if (y0 < 8) y0 = 8; + checkLimits(); s[0] = ch; s[1] = 0; - if (writeThroughMode) { // draw the write-trough character + if (writeThroughMode) { // draw the write-through character cairo_set_source_rgb(cr2, 0, 0.7, 0); cairo_move_to(cr2, x0, windowHeight - y0 + 4); cairo_show_text(cr2, s);