diff --git a/ards.c b/ards.c index 3499aea..e5e88bb 100755 --- a/ards.c +++ b/ards.c @@ -84,21 +84,8 @@ void ards_draw(cairo_t *cr, cairo_t *cr2, int first) if (first) { first = 0; - int actualWidth; - if (argFull) { - efactor = windowHeight / 780.0; - actualWidth = (int)(efactor * 1024.0); - eoffx = (windowWidth - actualWidth) / 2; - refresh_interval = (int)(30.0 * efactor * efactor); - } - else { - efactor = 1.0; - actualWidth = windowWidth; - eoffx = 0; - refresh_interval = 30; - } - windowWidth = actualWidth; - tube_changeCharacterSize(cr, cr2, 74, 35, (int) (10.0 * efactor)); + refresh_interval = 30; + tube_changeCharacterSize(cr, cr2, 74, 35, 10); } startPaintTime = tube_mSeconds(); // start to measure time for this draw operation diff --git a/main.c b/main.c index 2cbff57..6404091 100644 --- a/main.c +++ b/main.c @@ -57,6 +57,8 @@ extern int argARDS; int windowWidth; int windowHeight; +static int windowHeightOffset = 0; +static int windowWidthOffset = 0; extern int tube_doClearPersistent; @@ -96,7 +98,7 @@ static void do_drawing(cairo_t *cr, GtkWidget *widget) if (global_firstcall) { permanent_surface = cairo_surface_create_similar(cairo_get_target(cr), - CAIRO_CONTENT_COLOR_ALPHA, windowWidth, windowHeight); + CAIRO_CONTENT_COLOR, windowWidth, windowHeight); temporary_surface = cairo_surface_create_similar(cairo_get_target(cr), CAIRO_CONTENT_COLOR_ALPHA, windowWidth, windowHeight); } @@ -113,11 +115,11 @@ static void do_drawing(cairo_t *cr, GtkWidget *widget) tek4010_draw(permanent_cr, temporary_cr, global_firstcall); global_firstcall = FALSE; - cairo_set_source_surface(cr, permanent_surface, 0, 0); + cairo_set_source_surface(cr, permanent_surface, windowWidthOffset, windowHeightOffset); cairo_paint(cr); - cairo_set_source_surface(cr, temporary_surface, 0, 0); + cairo_set_source_surface(cr, temporary_surface, windowWidthOffset, windowHeightOffset); cairo_paint(cr); - + cairo_destroy(permanent_cr); cairo_destroy(temporary_cr); } @@ -125,7 +127,7 @@ static void do_drawing(cairo_t *cr, GtkWidget *widget) static void on_key_press(GtkWidget *widget, GdkEventKey *event, gpointer user_data) { int ch; - printf("key pressed, state =%04X, keyval=%04X\r\n", event->state, event->keyval); + // printf("key pressed, state =%04X, keyval=%04X\r\n", event->state, event->keyval); if ((event->keyval == 0xFF50) || // "home" key (event->keyval == 0xFF55) || // "page up" key @@ -140,7 +142,6 @@ static void on_key_press(GtkWidget *widget, GdkEventKey *event, gpointer user_da else if ((event->keyval >= 0xFF00) && (event->keyval <= 0xFF1F)) ch = event->keyval & 0x1F; else if (event->state & GDK_CONTROL_MASK) { - printf("control\n"); if ((event->keyval == 0xFF51) || // "left arrow" key (event->keyval == 0xFF52)) { // "up arrow" key tube_doClearPersistent = 1; @@ -152,7 +153,6 @@ static void on_key_press(GtkWidget *widget, GdkEventKey *event, gpointer user_da return; } else if (event->keyval == 0x0071) { // "q" quits tek4010 - printf("calling quit\n"); on_quit_event(); return; } @@ -179,6 +179,7 @@ int main (int argc, char *argv[]) int askWindowWidth; int askWindowHeight; + double aspectRatio; tube_init(argc, argv); @@ -194,13 +195,21 @@ int main (int argc, char *argv[]) else { askWindowWidth = 1024; askWindowHeight = 780; - } + } + aspectRatio = (double)askWindowWidth/(double)askWindowHeight; gtk_init(&argc, &argv); global_firstcall = TRUE; window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + + // set the background color + GdkColor color; + color.red = 0; + color.green = 0; + color.blue = 0; + gtk_widget_modify_bg(window, GTK_STATE_NORMAL, &color); darea = gtk_drawing_area_new(); gtk_container_add(GTK_CONTAINER(window), darea); @@ -217,13 +226,22 @@ int main (int argc, char *argv[]) int screenHeight = gdk_screen_get_height(screen); printf("Screen dimensions: %d x %d\n", screenWidth, screenHeight); - if (argFull && !argARDS) { + if (argFull) { // DISPLAY UNDECORATED FULL SCREEN WINDOW gtk_window_set_decorated(GTK_WINDOW(window), FALSE); gtk_window_fullscreen(GTK_WINDOW(window)); gtk_window_set_keep_above(GTK_WINDOW(window), FALSE); windowWidth = screenWidth; windowHeight = screenHeight; + // force aspect ratio + if (windowWidth > (int)((double)windowHeight * aspectRatio)) { + windowWidthOffset = (windowWidth - (int)((double)windowHeight * aspectRatio)) / 2; + windowWidth = (int)((double)windowHeight * aspectRatio); + } + if (windowHeight > (int)((double)windowWidth / aspectRatio)) { + windowHeightOffset = (windowHeight - (int)((double)windowWidth / aspectRatio)) / 2; + windowHeight = (int)((double)windowWidth / aspectRatio); + } } else { diff --git a/tek4010 b/tek4010 index 3b2555c..3cc78df 100755 Binary files a/tek4010 and b/tek4010 differ diff --git a/tek4010.c b/tek4010.c index b8ea98b..ae18a64 100755 --- a/tek4010.c +++ b/tek4010.c @@ -72,6 +72,7 @@ extern int leftmargin; static long startPaintTime; static int xh,xl,yh,yl,xy4014; static long todo; +static double efactor; // table for special plot point mode // 4014 manual page F-9 @@ -158,7 +159,7 @@ void tek4010_escapeCodeHandler(cairo_t *cr, cairo_t *cr2, int ch) // modes 27 and 29 - 31 are identical in all modes case 28: // record separator - /*if (DEBUG)*/ printf("Special point plot mode, mode=%d\n",savemode); + if (DEBUG) printf("Special point plot mode, mode=%d\n",savemode); mode = 50; // for the intensity/focus character specialPlotMode = 1; double intensity = 1.0; @@ -245,23 +246,15 @@ void tek4010_draw(cairo_t *cr, cairo_t *cr2, int first) if (first) { first = 0; - int actualWidth; if (argFull) { efactor = windowHeight / 780.0; - actualWidth = (int)(efactor * 1024.0); - eoffx = (windowWidth - actualWidth) / 2; - refresh_interval = (int)(30.0 * efactor * efactor); } else { efactor = 1.0; - actualWidth = windowWidth; - eoffx = 0; - refresh_interval = 30; } - windowWidth = actualWidth; + refresh_interval = 30; tube_changeCharacterSize(cr, cr2, 74, 35, (int) (18.0 * efactor)); - // printf("Scaling: %0.2f\n", efactor); - // printf("Offset: %d\n",eoffx); + printf("Scaling: %0.3f\n", efactor / 4.0); // printf("Refresh interval: %d\n",refresh_interval); } diff --git a/tube.c b/tube.c index c81af53..7bfc1ba 100755 --- a/tube.c +++ b/tube.c @@ -84,9 +84,6 @@ int tube_x0, tube_x2,tube_y0, tube_y2; static int debugCount = 0; -double efactor; -int eoffx; - long refreshCount = 0; // variables for baud rate and refresh rate measurements static long charCount = 0; @@ -181,7 +178,7 @@ void tube_init(int argc, char* argv[]) char *argv2[20]; size_t bufsize = 127; int firstArg = 1; - printf("tek4010 version 1.2\n"); + printf("tek4010 version 1.2.1\n"); windowName = "Tektronix 4010/4014 emulator"; if ((argc<2) || (argc>19)) { printf("Error:number of arguments\n"); @@ -394,7 +391,7 @@ void tube_doCursor(cairo_t *cr2) { cairo_set_source_rgb(cr2, 0, CURSOR_INTENSITY, 0); cairo_set_line_width (cr2, 1); - cairo_rectangle(cr2, tube_x0 + eoffx, windowHeight - tube_y0 - vDotsPerChar + 8, + cairo_rectangle(cr2, tube_x0, windowHeight - tube_y0 - vDotsPerChar + 8, hDotsPerChar - 3, vDotsPerChar - 3); cairo_fill(cr2); cairo_stroke (cr2); @@ -476,19 +473,19 @@ void tube_drawCharacter(cairo_t *cr, cairo_t *cr2, char ch) if (writeThroughMode) { // draw the write-through character cairo_set_source_rgb(cr2, 0, WRITE_TROUGH_INTENSITY, 0); - cairo_move_to(cr2, tube_x0 + eoffx, windowHeight - tube_y0); + cairo_move_to(cr2, tube_x0, windowHeight - tube_y0); cairo_show_text(cr2, s); } else { // draw the character cairo_set_source_rgb(cr, 0, (NORMAL_INTENSITY * intensity) / 100, 0); - cairo_move_to(cr, tube_x0 + eoffx, windowHeight - tube_y0); + cairo_move_to(cr, tube_x0, windowHeight - tube_y0); cairo_show_text(cr, s); // draw the bright spot cairo_set_source_rgb(cr2, BRIGHT_SPOT_COLOR, BRIGHT_SPOT_COLOR, BRIGHT_SPOT_COLOR); - cairo_move_to(cr2, tube_x0 + eoffx, windowHeight - tube_y0); + cairo_move_to(cr2, tube_x0, windowHeight - tube_y0); cairo_show_text(cr2, s); } @@ -513,8 +510,8 @@ void tube_drawPoint(cairo_t *cr, cairo_t *cr2) #define PI2 6.283185307 cairo_set_line_width (cr, 1 + defocussed); cairo_set_source_rgb(cr, 0, (NORMAL_INTENSITY * intensity) / 100, 0); - cairo_move_to(cr, tube_x2 + eoffx, windowHeight - tube_y2); - cairo_line_to(cr, tube_x2 + 1 + eoffx, windowHeight - tube_y2); + cairo_move_to(cr, tube_x2, windowHeight - tube_y2); + cairo_line_to(cr, tube_x2 + 1, windowHeight - tube_y2); cairo_stroke (cr); // speed is a problem here @@ -527,7 +524,7 @@ void tube_drawPoint(cairo_t *cr, cairo_t *cr2) cairo_set_line_width (cr2, 0.1); double bsc = (BRIGHT_SPOT_COLOR * intensity) / 100; cairo_set_source_rgb(cr2, bsc, bsc, bsc); - cairo_arc(cr2, tube_x2 + eoffx, windowHeight - tube_y2, 2 + defocussed, 0, PI2); + cairo_arc(cr2, tube_x2, windowHeight - tube_y2, 2 + defocussed, 0, PI2); cairo_fill(cr2); xlast = tube_x2; @@ -551,8 +548,8 @@ void tube_drawVector(cairo_t *cr, cairo_t *cr2) if (writeThroughMode) { cairo_set_line_width (cr2, 2); cairo_set_source_rgb(cr2, 0.0, WRITE_TROUGH_INTENSITY, 0.0); - cairo_move_to(cr2, tube_x0 + eoffx, windowHeight - tube_y0); - cairo_line_to(cr2, tube_x2 + eoffx, windowHeight - tube_y2); + cairo_move_to(cr2, tube_x0, windowHeight - tube_y0); + cairo_line_to(cr2, tube_x2, windowHeight - tube_y2); cairo_stroke (cr2); } @@ -561,24 +558,24 @@ void tube_drawVector(cairo_t *cr, cairo_t *cr2) cairo_set_line_width (cr, 1 + defocussed); cairo_set_source_rgb(cr, 0, (NORMAL_INTENSITY * intensity) / 100, 0); tube_line_type(cr, cr2, ltype); - cairo_move_to(cr, tube_x0 + eoffx, windowHeight - tube_y0); - cairo_line_to(cr, tube_x2 + eoffx, windowHeight - tube_y2); + cairo_move_to(cr, tube_x0, windowHeight - tube_y0); + cairo_line_to(cr, tube_x2, windowHeight - tube_y2); cairo_stroke (cr); //draw the bright spot, half intensity cairo_set_line_width (cr2, 6 + 2 * defocussed); double bsc = (BRIGHT_SPOT_COLOR_HALF * intensity) / 100; cairo_set_source_rgb(cr2, bsc, bsc, bsc); - cairo_move_to(cr2, tube_x0 + eoffx, windowHeight - tube_y0); - cairo_line_to(cr2, tube_x2 + eoffx, windowHeight - tube_y2); + cairo_move_to(cr2, tube_x0, windowHeight - tube_y0); + cairo_line_to(cr2, tube_x2, windowHeight - tube_y2); cairo_stroke (cr2); // draw the bright spot, high intensity cairo_set_line_width (cr2, 3 + 2 * defocussed); bsc = (BRIGHT_SPOT_COLOR * intensity) / 100; cairo_set_source_rgb(cr2, bsc, bsc, bsc); - cairo_move_to(cr2, tube_x0 + eoffx, windowHeight - tube_y0); - cairo_line_to(cr2, tube_x2 + eoffx, windowHeight - tube_y2); + cairo_move_to(cr2, tube_x0, windowHeight - tube_y0); + cairo_line_to(cr2, tube_x2, windowHeight - tube_y2); cairo_stroke(cr2); } diff --git a/tube.h b/tube.h index bc0aeb4..23b695a 100644 --- a/tube.h +++ b/tube.h @@ -27,9 +27,6 @@ extern int intensity; extern int plotPointMode; extern int writeThroughMode; -extern double efactor; -extern int eoffx; - extern int tube_x0, tube_x2, tube_y0, tube_y2; extern long tube_mSeconds(); diff --git a/versions.txt b/versions.txt index 318b845..70e39c0 100644 --- a/versions.txt +++ b/versions.txt @@ -1,3 +1,11 @@ +Version 1.2.1 April 15, 2019 +============================ +New features +- full screen mode for ARDS (variable scaling not yet implemented) +Bug fixes +- substantial speed increase on high resolution screens +- removed some debug messages + Version 1.2 April 14, 2019 ========================== New features