From 65d3cc3dc2a306a173f1c6ed9aa98ad433ee63d5 Mon Sep 17 00:00:00 2001 From: IanSB Date: Tue, 5 Mar 2019 02:26:50 +0000 Subject: [PATCH] Fix OSD issues at half resoloution --- src/cpld_atom.c | 4 ++-- src/cpld_normal.c | 6 +++--- src/geometry.c | 4 +++- src/osd.c | 14 ++++++++++---- 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/cpld_atom.c b/src/cpld_atom.c index c60424ec..14f0e201 100644 --- a/src/cpld_atom.c +++ b/src/cpld_atom.c @@ -141,7 +141,7 @@ static void cpld_calibrate(capture_info_t *capinfo, int elk) { metric = diff_N_frames(capinfo, NUM_CAL_FRAMES, 0, elk); log_info("INFO: value = %d: metric = ", metric); sum_metrics[value] = metric; - osd_sp(config, 1, metric); + osd_sp(config, 3, metric); if (metric < min_metric) { min_metric = metric; } @@ -169,7 +169,7 @@ static void cpld_calibrate(capture_info_t *capinfo, int elk) { // Perform a final test of errors log_info("Performing final test"); errors = diff_N_frames(capinfo, NUM_CAL_FRAMES, 0, elk); - osd_sp(config, 1, errors); + osd_sp(config, 3, errors); log_sp(config); log_info("Calibration complete, errors = %d", errors); } diff --git a/src/cpld_normal.c b/src/cpld_normal.c index 67f580ea..89f5cc7a 100644 --- a/src/cpld_normal.c +++ b/src/cpld_normal.c @@ -270,7 +270,7 @@ static void cpld_calibrate(capture_info_t *capinfo, int elk) { } printf("%8d\r\n", metric); sum_metrics[value] = metric; - osd_sp(config, 1, metric); + osd_sp(config, 3, metric); if (metric < min_metric) { min_metric = metric; } @@ -339,7 +339,7 @@ static void cpld_calibrate(capture_info_t *capinfo, int elk) { } write_config(config); *errors = diff_N_frames(capinfo, NUM_CAL_FRAMES, mode7, elk); - osd_sp(config, 1, *errors); + osd_sp(config, 3, *errors); log_sp(config); log_info("Optimization complete, errors = %d", *errors); } @@ -358,7 +358,7 @@ static void cpld_calibrate(capture_info_t *capinfo, int elk) { // Perform a final test of errors log_info("Performing final test"); *errors = diff_N_frames(capinfo, NUM_CAL_FRAMES, mode7, elk); - osd_sp(config, 1, *errors); + osd_sp(config, 3, *errors); log_sp(config); log_info("Calibration complete, errors = %d", *errors); } diff --git a/src/geometry.c b/src/geometry.c index 564e3ec6..39fbbcde 100644 --- a/src/geometry.c +++ b/src/geometry.c @@ -59,12 +59,14 @@ static void update_param_range() { // Set the range of the V_HEIGHT param based on FB_HEIGHT max = geometry->fb_height; if (max > DUPLICATE_HEIGHT) { - max /= 2; + max >>= 1; } params[V_HEIGHT].max = max; if (geometry->v_height > max) { geometry->v_height = max; + } + } void geometry_init(int version) { diff --git a/src/osd.c b/src/osd.c index ef705d79..77348253 100644 --- a/src/osd.c +++ b/src/osd.c @@ -917,6 +917,12 @@ void osd_set(int line, int attr, char *text) { if (len > LINELEN) { len = LINELEN; } + int bufferCharWidth = geometry_get_value(FB_WIDTH) / 12; // SAA5050 character data is 12x20 + bufferCharWidth = (attr & ATTR_DOUBLE_SIZE) ? (bufferCharWidth >> 1) : bufferCharWidth; + if (len > bufferCharWidth) { + len = bufferCharWidth; + } + strncpy(buffer + line * LINELEN, text, len); osd_update((uint32_t *)capinfo->fb, capinfo->pitch); } @@ -953,7 +959,7 @@ int osd_key(int key) { redraw_menu(); } else if (key == key_clock_cal) { // Clock Calibration - osd_set(0, ATTR_DOUBLE_SIZE, "HDMI Calibration"); + osd_set(2, ATTR_DOUBLE_SIZE, "HDMI Calibration"); // Record the starting value of vsync last_vsync = get_vsync(); // Enable vsync @@ -968,7 +974,7 @@ int osd_key(int key) { osd_state = CLOCK_CAL0; } else if (key == key_auto_cal) { // Auto Calibration - osd_set(0, ATTR_DOUBLE_SIZE, "Auto Calibration"); + osd_set(2, ATTR_DOUBLE_SIZE, "Auto Calibration"); action_calibrate_auto(); // Fire OSD_EXPIRED in 50 frames time ret = 50; @@ -982,11 +988,11 @@ int osd_key(int key) { ret = 50; if (is_genlocked()) { // move on when locked - osd_set(0, ATTR_DOUBLE_SIZE, "Genlock Succeeded"); + osd_set(2, ATTR_DOUBLE_SIZE, "Genlock Succeeded"); osd_state = CLOCK_CAL1; } else if (cal_count == 10) { // give up after 10 seconds - osd_set(0, ATTR_DOUBLE_SIZE, "Genlock Failed"); + osd_set(2, ATTR_DOUBLE_SIZE, "Genlock Failed"); osd_state = CLOCK_CAL1; // restore the original HDMI clock set_vlockmode(HDMI_ORIGINAL);