expo: video: Correct kerning output in console_truetype_putc_xy()

While the text is measured correctly, taking account of kerning
information, this is not used when actually displaying the text. This
results in a mismatch between the measurement and the output.

Fix this by adding the kerning offset to each character position.

Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Simon Glass
2025-05-24 09:41:11 -06:00
parent 49c22f66e5
commit f0669de445
4 changed files with 41 additions and 39 deletions

View File

@@ -271,7 +271,7 @@ static int cedit_render(struct unit_test_state *uts)
ut_asserteq(ID_AC_OFF, menu->cur_item_id);
ut_assertok(expo_render(exp));
ut_asserteq(4888, video_compress_fb(uts, dev, false));
ut_asserteq(4926, video_compress_fb(uts, dev, false));
ut_assertok(video_check_copy_fb(uts, dev));
/* move to the second menu */
@@ -279,54 +279,54 @@ static int cedit_render(struct unit_test_state *uts)
act.select.id = ID_POWER_LOSS;
ut_assertok(cedit_do_action(exp, scn, vid_priv, &act));
ut_assertok(expo_render(exp));
ut_asserteq(4967, video_compress_fb(uts, dev, false));
ut_asserteq(5000, video_compress_fb(uts, dev, false));
/* open the menu */
act.type = EXPOACT_OPEN;
act.select.id = ID_POWER_LOSS;
ut_assertok(cedit_do_action(exp, scn, vid_priv, &act));
ut_assertok(expo_render(exp));
ut_asserteq(5397, video_compress_fb(uts, dev, false));
ut_asserteq(5390, video_compress_fb(uts, dev, false));
/* close the menu */
act.type = EXPOACT_CLOSE;
act.select.id = ID_POWER_LOSS;
ut_assertok(cedit_do_action(exp, scn, vid_priv, &act));
ut_assertok(expo_render(exp));
ut_asserteq(4967, video_compress_fb(uts, dev, false));
ut_asserteq(5000, video_compress_fb(uts, dev, false));
/* open the menu again to check it looks the same */
act.type = EXPOACT_OPEN;
act.select.id = ID_POWER_LOSS;
ut_assertok(cedit_do_action(exp, scn, vid_priv, &act));
ut_assertok(expo_render(exp));
ut_asserteq(5397, video_compress_fb(uts, dev, false));
ut_asserteq(5390, video_compress_fb(uts, dev, false));
/* close the menu */
act.type = EXPOACT_CLOSE;
act.select.id = ID_POWER_LOSS;
ut_assertok(cedit_do_action(exp, scn, vid_priv, &act));
ut_assertok(expo_render(exp));
ut_asserteq(4967, video_compress_fb(uts, dev, false));
ut_asserteq(5000, video_compress_fb(uts, dev, false));
act.type = EXPOACT_OPEN;
act.select.id = ID_POWER_LOSS;
ut_assertok(cedit_do_action(exp, scn, vid_priv, &act));
ut_assertok(expo_render(exp));
ut_asserteq(5397, video_compress_fb(uts, dev, false));
ut_asserteq(5390, video_compress_fb(uts, dev, false));
act.type = EXPOACT_POINT_ITEM;
act.select.id = ID_AC_ON;
ut_assertok(cedit_do_action(exp, scn, vid_priv, &act));
ut_assertok(expo_render(exp));
ut_asserteq(5341, video_compress_fb(uts, dev, false));
ut_asserteq(5363, video_compress_fb(uts, dev, false));
/* select it */
act.type = EXPOACT_SELECT;
act.select.id = ID_AC_ON;
ut_assertok(cedit_do_action(exp, scn, vid_priv, &act));
ut_assertok(expo_render(exp));
ut_asserteq(4939, video_compress_fb(uts, dev, false));
ut_asserteq(4964, video_compress_fb(uts, dev, false));
ut_asserteq(ID_AC_ON, menu->cur_item_id);
@@ -335,14 +335,14 @@ static int cedit_render(struct unit_test_state *uts)
act.select.id = ID_MACHINE_NAME;
ut_assertok(cedit_do_action(exp, scn, vid_priv, &act));
ut_assertok(expo_render(exp));
ut_asserteq(4850, video_compress_fb(uts, dev, false));
ut_asserteq(4868, video_compress_fb(uts, dev, false));
/* open it */
act.type = EXPOACT_OPEN;
act.select.id = ID_MACHINE_NAME;
ut_assertok(cedit_do_action(exp, scn, vid_priv, &act));
ut_assertok(expo_render(exp));
ut_asserteq(4883, video_compress_fb(uts, dev, false));
ut_asserteq(4871, video_compress_fb(uts, dev, false));
/*
* Send some keypresses. Note that the console must be enabled so that
@@ -358,7 +358,7 @@ static int cedit_render(struct unit_test_state *uts)
ut_silence_console(uts);
ut_assertok(cedit_arange(exp, vid_priv, scn->id));
ut_assertok(expo_render(exp));
ut_asserteq(5033, video_compress_fb(uts, dev, false));
ut_asserteq(5076, video_compress_fb(uts, dev, false));
expo_destroy(exp);
cur_exp = NULL;
@@ -401,7 +401,7 @@ static int cedit_render_lineedit(struct unit_test_state *uts)
ut_asserteq(20, tline->pos);
ut_assertok(expo_render(exp));
ut_asserteq(5315, video_compress_fb(uts, dev, false));
ut_asserteq(5344, video_compress_fb(uts, dev, false));
ut_assertok(video_check_copy_fb(uts, dev));
/* move to the line-edit field */
@@ -409,14 +409,14 @@ static int cedit_render_lineedit(struct unit_test_state *uts)
act.select.id = ID_MACHINE_NAME;
ut_assertok(cedit_do_action(exp, scn, vid_priv, &act));
ut_assertok(expo_render(exp));
ut_asserteq(5372, video_compress_fb(uts, dev, false));
ut_asserteq(5408, video_compress_fb(uts, dev, false));
/* open it */
act.type = EXPOACT_OPEN;
act.select.id = ID_MACHINE_NAME;
ut_assertok(cedit_do_action(exp, scn, vid_priv, &act));
ut_assertok(expo_render(exp));
ut_asserteq(5259, video_compress_fb(uts, dev, false));
ut_asserteq(5291, video_compress_fb(uts, dev, false));
/* delete some characters */
ut_unsilence_console(uts);
@@ -427,7 +427,7 @@ static int cedit_render_lineedit(struct unit_test_state *uts)
ut_assertok(cedit_arange(exp, vid_priv, scn->id));
ut_assertok(expo_render(exp));
ut_asserteq(5126, video_compress_fb(uts, dev, false));
ut_asserteq(5209, video_compress_fb(uts, dev, false));
expo_destroy(exp);
cur_exp = NULL;

View File

@@ -678,17 +678,17 @@ static int expo_render_image(struct unit_test_state *uts)
/* render it */
expo_set_scene_id(exp, SCENE1);
ut_assertok(expo_render(exp));
ut_asserteq(18786, video_compress_fb(uts, dev, false));
ut_asserteq(18792, video_compress_fb(uts, dev, false));
ut_asserteq(0, scn->highlight_id);
ut_assertok(scene_arrange(scn));
ut_asserteq(0, scn->highlight_id);
ut_assertok(expo_render(exp));
ut_asserteq(20433, video_compress_fb(uts, dev, false));
ut_asserteq(20401, video_compress_fb(uts, dev, false));
ut_assertok(scene_arrange(scn));
ut_assertok(expo_render(exp));
ut_asserteq(20433, video_compress_fb(uts, dev, false));
ut_asserteq(20401, video_compress_fb(uts, dev, false));
scene_set_highlight_id(scn, OBJ_MENU);
ut_asserteq(OBJ_MENU, scn->highlight_id);
@@ -700,7 +700,7 @@ static int expo_render_image(struct unit_test_state *uts)
ut_assert(!(obj->flags & SCENEOF_HIDE));
ut_assertok(expo_render(exp));
ut_asserteq(20433, video_compress_fb(uts, dev, false));
ut_asserteq(20401, video_compress_fb(uts, dev, false));
/* move down */
ut_assertok(expo_send_key(exp, BKEY_DOWN));
@@ -713,7 +713,7 @@ static int expo_render_image(struct unit_test_state *uts)
ut_asserteq(ITEM2, scene_menu_get_cur_item(scn, OBJ_MENU));
ut_assertok(scene_arrange(scn));
ut_assertok(expo_render(exp));
ut_asserteq(19673, video_compress_fb(uts, dev, false));
ut_asserteq(19650, video_compress_fb(uts, dev, false));
ut_assertok(video_check_copy_fb(uts, dev));
/* hide the text editor since the following tets don't need it */
@@ -722,18 +722,18 @@ static int expo_render_image(struct unit_test_state *uts)
/* do some alignment checks */
ut_assertok(scene_obj_set_halign(scn, OBJ_TEXT3, SCENEOA_CENTRE));
ut_assertok(expo_render(exp));
ut_asserteq(16368, video_compress_fb(uts, dev, false));
ut_asserteq(16322, video_compress_fb(uts, dev, false));
ut_assertok(scene_obj_set_halign(scn, OBJ_TEXT3, SCENEOA_RIGHT));
ut_assertok(expo_render(exp));
ut_asserteq(16321, video_compress_fb(uts, dev, false));
ut_asserteq(16276, video_compress_fb(uts, dev, false));
ut_assertok(scene_obj_set_halign(scn, OBJ_TEXT3, SCENEOA_LEFT));
ut_assertok(scene_obj_set_valign(scn, OBJ_TEXT3, SCENEOA_CENTRE));
ut_assertok(expo_render(exp));
ut_asserteq(18763, video_compress_fb(uts, dev, false));
ut_asserteq(18753, video_compress_fb(uts, dev, false));
ut_assertok(scene_obj_set_valign(scn, OBJ_TEXT3, SCENEOA_BOTTOM));
ut_assertok(expo_render(exp));
ut_asserteq(18714, video_compress_fb(uts, dev, false));
ut_asserteq(18696, video_compress_fb(uts, dev, false));
/* make sure only the preview for the second item is shown */
obj = scene_obj_find(scn, ITEM1_PREVIEW, SCENEOBJT_NONE);
@@ -759,7 +759,7 @@ static int expo_render_image(struct unit_test_state *uts)
exp->show_highlight = true;
ut_assertok(scene_arrange(scn));
ut_assertok(expo_render(exp));
ut_asserteq(18844, video_compress_fb(uts, dev, false));
ut_asserteq(18805, video_compress_fb(uts, dev, false));
/* now try in text mode */
expo_set_text_mode(exp, true);