From bcbd8a2d3f0f6c33fecb227063c4d92573ef54a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C2=A8Rene=20Richarz?= Date: Thu, 20 Jun 2019 09:26:38 +0200 Subject: [PATCH] improved acharacter size handling, added -autoClear argument --- README.md | 9 +++++++++ ards.c | 2 +- tek4010 | Bin 50268 -> 50300 bytes tek4010.c | 38 +++++++++++++++++++++----------------- tube.c | 23 ++++++++++++++--------- tube.h | 5 ++++- versions.txt | 10 ++++++++-- 7 files changed, 57 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index dac9be4..801cc86 100644 --- a/README.md +++ b/README.md @@ -272,6 +272,10 @@ tek4010 has the following options: -APL emulate Tektronix 4013/4015 with alternative APL character set. Details see below. + + -autoClear erase screen if a line feed is executed at the bottom of the screen. + This makes it sometimes easier to use tek4010 as the only terminal. It + is not the behaviour of the original hardware. **APL mode** @@ -381,6 +385,11 @@ http://sci-hub.tw/https://dl.acm.org/citation.cfm?id=356582&dl=ACM&coll=DL Detailed pictures of the terminal and the original mouse built by CDI can be found in the 1968 ARDS manual (see manuals folder) +**Using other fonts** + +The font used by tek4010 is defined in tube.h. If you prefer to use a different font (for example a +dotted font), define STANDARD_FONT and STANDARD_FONT_SIZE in tube.h and recompile the program. + **Help wanted** I am interested to find any recoverable original software using the graphical input modes of the diff --git a/ards.c b/ards.c index 643899e..1c43609 100755 --- a/ards.c +++ b/ards.c @@ -89,7 +89,7 @@ void ards_draw(cairo_t *cr, cairo_t *cr2, int first) efactor = windowWidth / 1080.0; // fprintf (stderr, "efactor: %0.2f\n", efactor); refresh_interval = 30; - tube_changeCharacterSize(cr, cr2, 80, 50, (int)(efactor * 20)); + tube_changeCharacterSize(cr, cr2, 80, 50, efactor * 1.1); } diff --git a/tek4010 b/tek4010 index 6c82d0c446c45fbea75ffb2c36b0c95a9a8bfbaf..ae8007bd8f5d8cc8f877c1df2f56bacf47a01129 100755 GIT binary patch delta 13129 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 E7d-;BSO5S3 delta 13114 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 Q8T windowWidth - hDotsPerChar) { tube_x0 = leftmargin; tube_y0 -= vDotsPerChar; } - if (tube_y0 < 4) { + if (tube_y0 < 4) { // new line at bottom of page tube_y0 = windowHeight - vDotsPerChar; if (leftmargin) leftmargin = 0; else leftmargin = windowWidth / 2; + if (argAutoClear) { + leftmargin = 0; + tube_clearPersistent(cr,cr2); + } /* check here for leftmargin */ if (tube_x0 < leftmargin) tube_x0 = leftmargin; } @@ -183,22 +187,22 @@ void tek4010_escapeCodeHandler(cairo_t *cr, cairo_t *cr2, int ch) case 8: // backspace during ESC tube_x0 -= hDotsPerChar; - tek4010_checkLimits(); + tek4010_checkLimits(cr, cr2); mode = 0; break; case 9: // tab during ESC if (argTab1) tube_x0 += hDotsPerChar; else tube_x0 = tube_x0 - (tube_x0 % (8 * hDotsPerChar)) + 8 * hDotsPerChar; - tek4010_checkLimits(); + tek4010_checkLimits(cr, cr2); mode = 0; break; case 11:// VT during ESC, move one line up tube_y0 += vDotsPerChar; - tek4010_checkLimits(); + tek4010_checkLimits(cr, cr2); mode = 0; break; case 12:// FF during ESC - tube_changeCharacterSize(cr, cr2, 74, 35, (int) (18.0 * efactor)); + tube_changeCharacterSize(cr, cr2, 74, 35, efactor); tube_clearPersistent(cr,cr2); mode = 0; break; case 13:mode = 0; break; @@ -232,10 +236,10 @@ void tek4010_escapeCodeHandler(cairo_t *cr, cairo_t *cr2, int ch) int defocussed = 0; break; - case '8': tube_changeCharacterSize(cr, cr2, 74, 35, (int)(efactor * 18)); mode = 0; break; - case '9': tube_changeCharacterSize(cr, cr2, 81, 38, (int)(efactor * 16)); mode = 0; break; - case ':': tube_changeCharacterSize(cr, cr2, 121, 58, (int)(efactor * 11)); mode = 0; break; - case ';': tube_changeCharacterSize(cr, cr2, 133, 64, (int)(efactor * 10)); mode = 0; break; + case '8': tube_changeCharacterSize(cr, cr2, 74, 35, efactor); mode = 0; break; + case '9': tube_changeCharacterSize(cr, cr2, 81, 38, efactor * 0.9); mode = 0; break; + case ':': tube_changeCharacterSize(cr, cr2, 121, 58, efactor * 0.65); mode = 0; break; + case ';': tube_changeCharacterSize(cr, cr2, 133, 64, efactor * 0.55); mode = 0; break; case '[': // a second escape code follows, do not reset mode break; @@ -314,7 +318,7 @@ void tek4010_draw(cairo_t *cr, cairo_t *cr2, int first) first = 0; efactor = windowWidth / 1024.0; refresh_interval = 30; - tube_changeCharacterSize(cr, cr2, 74, 35, (int) (18.0 * efactor)); + tube_changeCharacterSize(cr, cr2, 74, 35, efactor); if (windowWidth != 1024) printf("Scaling: %0.3f\n", efactor / 4.0); } @@ -329,7 +333,7 @@ void tek4010_draw(cairo_t *cr, cairo_t *cr2, int first) // clear persistent surface, if necessary if (tube_doClearPersistent) { tube_clearPersistent(cr,cr2); - tube_changeCharacterSize(cr, cr2, 74, 35, (int) (18.0 * efactor)); + tube_changeCharacterSize(cr, cr2, 74, 35, efactor); } if (aplMode) @@ -380,7 +384,7 @@ void tek4010_draw(cairo_t *cr, cairo_t *cr2, int first) case 10: // new line tube_y0 -= vDotsPerChar; if (!argRaw) tube_x0 = leftmargin; - tek4010_checkLimits(); + tek4010_checkLimits(cr, cr2); goto endDo; case 13: // return if (mode != 30) { // special handling in ESC mode @@ -608,25 +612,25 @@ void tek4010_draw(cairo_t *cr, cairo_t *cr2, int first) case 0: break; case 8: // backspace tube_x0 -= hDotsPerChar; - tek4010_checkLimits(); + tek4010_checkLimits(cr, cr2); break; case 9: // tab if (argTab1) tube_x0 += hDotsPerChar; else tube_x0 = tube_x0 - (tube_x0 % (8 * hDotsPerChar)) + 8 * hDotsPerChar; - tek4010_checkLimits(); + tek4010_checkLimits(cr, cr2); break; case 11: // VT, move one line up tube_y0 += vDotsPerChar; - tek4010_checkLimits(); + tek4010_checkLimits(cr, cr2); break; case 23: // ctrl-w screen dump system("scrot --focussed"); break; default: if ((ch >= 32) && (ch <127)) { // printable character - tek4010_checkLimits(); + tek4010_checkLimits(cr, cr2); tube_drawCharacter(cr,cr2, ch); todo-= 2; } diff --git a/tube.c b/tube.c index 0bccc28..51a574d 100755 --- a/tube.c +++ b/tube.c @@ -74,6 +74,7 @@ int argTab1 = 0; int argFull = 0; int argARDS = 0; int argAPL = 0; +int argAutoClear = 0; int refresh_interval; // after this time in msec next refresh is done @@ -273,7 +274,7 @@ void tube_init(int argc, char* argv[]) char *argv2[20]; size_t bufsize = 127; int firstArg = 1; - printf("tek4010 version 1.4\n"); + printf("tek4010 version 1.4.1\n"); windowName = "Tektronix 4010/4014 emulator"; if ((argc<2) || (argc>19)) { printf("Error:number of arguments\n"); @@ -307,6 +308,8 @@ void tube_init(int argc, char* argv[]) argTab1 = 1; else if (strcmp(argv[firstArg],"-full") == 0) argFull = 1; + else if (strcmp(argv[firstArg],"-autoClear") == 0) + argAutoClear = 1; else if (strcmp(argv[firstArg],"-APL") == 0) { argAPL = 1; windowName = "Tektronix 4013/4015 emulator (APL)"; @@ -706,16 +709,14 @@ void tube_drawCharacter(cairo_t *cr, cairo_t *cr2, char ch) else if ((ch>=97) && (ch<=122)) sprintf(s,"%c", ch - 32); // capital letters else sprintf(s," "); break; - } - cairo_set_font_size(cr, currentFontSize + 2); - cairo_set_font_size(cr2,currentFontSize + 2); + } } else { s[0] = ch; s[1] = 0; - cairo_set_font_size(cr, currentFontSize); - cairo_set_font_size(cr2,currentFontSize); } + cairo_set_font_size(cr, currentFontSize); + cairo_set_font_size(cr2,currentFontSize); if (writeThroughMode) { // draw the write-through character cairo_set_source_rgb(cr2, 0, WRITE_TROUGH_INTENSITY, 0); @@ -849,14 +850,18 @@ void tube_setupPainting(cairo_t *cr, cairo_t *cr2, char *fontName) cairo_select_font_face(cr2, fontName, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD); } -void tube_changeCharacterSize(cairo_t *cr, cairo_t *cr2,int charsPerLine, int charsPerPage, int fontSize) +void tube_changeCharacterSize(cairo_t *cr, cairo_t *cr2,int charsPerLine, int charsPerPage, double fontSize) { - int fontsize; cairo_font_extents_t et; hDotsPerChar = windowWidth / charsPerLine; vDotsPerChar = windowHeight / charsPerPage; leftmargin = 0; - currentFontSize = fontSize; + if (argARDS) { + currentFontSize = (int) (fontSize * APL_FONT_SIZE); + } + else { + currentFontSize = (int) (fontSize * STANDARD_FONT_SIZE); + } cairo_set_font_size(cr, currentFontSize); cairo_set_font_size(cr2,currentFontSize); if (argARDS) { diff --git a/tube.h b/tube.h index 8975ec0..94feda3 100644 --- a/tube.h +++ b/tube.h @@ -2,7 +2,9 @@ // fonts #define STANDARD_FONT "Monospace" +#define STANDARD_FONT_SIZE 18.0 #define APL_FONT "APL385 Unicode" +#define APL_FONT_SIZE 20.0 enum LineType {SOLID,DOTTED,DOTDASH,SHORTDASH,LONGDASH}; extern enum LineType ltype; @@ -15,6 +17,7 @@ extern int argFull; extern int argTab1; extern int argRaw; extern int argAPL; +extern int argAutoClear; extern int hDotsPerChar; extern int vDotsPerChar; @@ -50,4 +53,4 @@ extern void tube_drawVector(cairo_t *cr, cairo_t *cr2); extern void tube_drawCharacter(cairo_t *cr, cairo_t *cr2, char ch); extern void tube_drawPoint(cairo_t *cr, cairo_t *cr2); extern void tube_setupPainting(cairo_t *cr, cairo_t *cr2, char *fontName); -extern void tube_changeCharacterSize(cairo_t *cr, cairo_t *cr2, int charsPerLine, int charsPerPage, int fontSize); +extern void tube_changeCharacterSize(cairo_t *cr, cairo_t *cr2, int charsPerLine, int charsPerPage, double fontSize); diff --git a/versions.txt b/versions.txt index f453275..6deeff0 100644 --- a/versions.txt +++ b/versions.txt @@ -1,5 +1,11 @@ -Version 1.4 May 15 -================== + +Version 1.4.1 June 20, 2019 +=========================== +- argument -autoClear added +- improver character size handling for compilation with other fonts + +Version 1.4 May 15, 2019 +======================== - APL support released, Tek4010, 4013, 4014, 4015 emulation complete Version 1.3.4 May 13, 2019