147
143
static unsigned char calculate_character_width (struct grub_font_glyph *glyph);
149
static void grub_gfxterm_refresh (void);
145
static void grub_gfxterm_refresh (struct grub_term_output *term __attribute__ ((unused)));
148
grub_gfxterm_getcharwidth (struct grub_term_output *term __attribute__ ((unused)),
149
const struct grub_unicode_glyph *c);
152
152
set_term_color (grub_uint8_t term_color)
178
178
clear_char (struct grub_colored_char *c)
181
c->code = grub_unicode_glyph_from_code (' ');
183
grub_errno = GRUB_ERR_NONE;
181
184
c->fg_color = virtual_screen.fg_color;
182
185
c->bg_color = virtual_screen.bg_color;
253
256
grub_video_set_active_render_target (text_layer);
255
258
virtual_screen.standard_color_setting = DEFAULT_STANDARD_COLOR;
256
virtual_screen.normal_color_setting = DEFAULT_NORMAL_COLOR;
257
virtual_screen.highlight_color_setting = DEFAULT_HIGHLIGHT_COLOR;
259
virtual_screen.term_color = virtual_screen.normal_color_setting;
260
virtual_screen.term_color = GRUB_TERM_DEFAULT_NORMAL_COLOR;
261
262
set_term_color (virtual_screen.term_color);
267
268
/* Clear out text buffer. */
268
269
for (i = 0; i < virtual_screen.columns * virtual_screen.rows; i++)
269
clear_char (&(virtual_screen.text_buffer[i]));
271
virtual_screen.text_buffer[i].code = 0;
272
clear_char (&(virtual_screen.text_buffer[i]));
271
275
return grub_errno;
613
617
/* Get glyph for character. */
614
glyph = grub_font_get_glyph (virtual_screen.font, p->code);
618
glyph = grub_font_construct_glyph (virtual_screen.font, p->code);
621
grub_errno = GRUB_ERR_NONE;
615
624
ascent = grub_font_get_ascent (virtual_screen.font);
617
626
width = virtual_screen.normal_char_width * calculate_character_width(glyph);
795
/* Clear first line in text buffer. */
797
i < virtual_screen.columns;
800
virtual_screen.text_buffer[i].code = 0;
801
clear_char (&(virtual_screen.text_buffer[i]));
785
804
/* Scroll text buffer with one line to up. */
786
805
grub_memmove (virtual_screen.text_buffer,
787
806
virtual_screen.text_buffer + virtual_screen.columns,
793
812
for (i = virtual_screen.columns * (virtual_screen.rows - 1);
794
813
i < virtual_screen.columns * virtual_screen.rows;
796
clear_char (&(virtual_screen.text_buffer[i]));
816
virtual_screen.text_buffer[i].code = 0;
817
clear_char (&(virtual_screen.text_buffer[i]));
798
820
virtual_screen.total_scroll++;
802
grub_gfxterm_putchar (grub_uint32_t c)
824
grub_gfxterm_putchar (struct grub_term_output *term,
825
const struct grub_unicode_glyph *c)
835
struct grub_font_glyph *glyph;
836
858
struct grub_colored_char *p;
837
859
unsigned char char_width;
839
/* Get properties of the character. */
840
glyph = grub_font_get_glyph (virtual_screen.font, c);
842
861
/* Calculate actual character width for glyph. This is number of
843
862
times of normal_font_width. */
844
char_width = calculate_character_width(glyph);
863
char_width = grub_gfxterm_getcharwidth (term, c);
846
865
/* If we are about to exceed line length, wrap to next line. */
847
866
if (virtual_screen.cursor_x + char_width > virtual_screen.columns)
868
if (virtual_screen.cursor_y >= virtual_screen.rows - 1)
871
virtual_screen.cursor_y++;
850
874
/* Find position on virtual screen, and fill information. */
851
875
p = (virtual_screen.text_buffer +
852
876
virtual_screen.cursor_x +
853
877
virtual_screen.cursor_y * virtual_screen.columns);
879
p->code = grub_unicode_glyph_dup (c);
881
grub_errno = GRUB_ERR_NONE;
855
882
p->fg_color = virtual_screen.fg_color;
856
883
p->bg_color = virtual_screen.bg_color;
857
884
p->width = char_width - 1;
931
961
static grub_ssize_t
932
grub_gfxterm_getcharwidth (grub_uint32_t c)
962
grub_gfxterm_getcharwidth (struct grub_term_output *term __attribute__ ((unused)),
963
const struct grub_unicode_glyph *c)
934
struct grub_font_glyph *glyph;
935
unsigned char char_width;
937
/* Get properties of the character. */
938
glyph = grub_font_get_glyph (virtual_screen.font, c);
940
/* Calculate actual character width for glyph. */
941
char_width = calculate_character_width (glyph);
966
dev_width = grub_font_get_constructed_device_width (virtual_screen.font, c);
971
return (dev_width + (virtual_screen.normal_char_width - 1))
972
/ virtual_screen.normal_char_width;
946
975
static grub_uint16_t
947
grub_virtual_screen_getwh (void)
976
grub_virtual_screen_getwh (struct grub_term_output *term __attribute__ ((unused)))
949
978
return (virtual_screen.columns << 8) | virtual_screen.rows;
952
981
static grub_uint16_t
953
grub_virtual_screen_getxy (void)
982
grub_virtual_screen_getxy (struct grub_term_output *term __attribute__ ((unused)))
955
984
return ((virtual_screen.cursor_x << 8) | virtual_screen.cursor_y);
959
grub_gfxterm_gotoxy (grub_uint8_t x, grub_uint8_t y)
988
grub_gfxterm_gotoxy (struct grub_term_output *term __attribute__ ((unused)),
989
grub_uint8_t x, grub_uint8_t y)
961
991
if (x >= virtual_screen.columns)
962
992
x = virtual_screen.columns - 1;
991
grub_gfxterm_cls (void)
1021
grub_gfxterm_cls (struct grub_term_output *term)
993
1023
grub_video_color_t color;
995
1025
/* Clear virtual screen. */
996
grub_virtual_screen_cls ();
1026
grub_virtual_screen_cls (term);
998
1028
/* Clear text layer. */
999
1029
grub_video_set_active_render_target (text_layer);
1005
1035
/* Mark virtual screen to be redrawn. */
1006
1036
dirty_region_add_virtualscreen ();
1008
grub_gfxterm_refresh ();
1038
grub_gfxterm_refresh (term);
1012
grub_virtual_screen_setcolorstate (grub_term_color_state state)
1042
grub_virtual_screen_setcolorstate (struct grub_term_output *term,
1043
grub_term_color_state state)
1020
1051
case GRUB_TERM_COLOR_NORMAL:
1021
virtual_screen.term_color = virtual_screen.normal_color_setting;
1052
virtual_screen.term_color = term->normal_color;
1024
1055
case GRUB_TERM_COLOR_HIGHLIGHT:
1025
virtual_screen.term_color = virtual_screen.highlight_color_setting;
1056
virtual_screen.term_color = term->highlight_color;
1037
grub_virtual_screen_setcolor (grub_uint8_t normal_color,
1038
grub_uint8_t highlight_color)
1040
virtual_screen.normal_color_setting = normal_color;
1041
virtual_screen.highlight_color_setting = highlight_color;
1045
grub_virtual_screen_getcolor (grub_uint8_t *normal_color,
1046
grub_uint8_t *highlight_color)
1048
*normal_color = virtual_screen.normal_color_setting;
1049
*highlight_color = virtual_screen.highlight_color_setting;
1053
grub_gfxterm_setcursor (int on)
1068
grub_gfxterm_setcursor (struct grub_term_output *term __attribute__ ((unused)),
1055
1071
if (virtual_screen.cursor_state != on)
1175
1191
.gotoxy = grub_gfxterm_gotoxy,
1176
1192
.cls = grub_gfxterm_cls,
1177
1193
.setcolorstate = grub_virtual_screen_setcolorstate,
1178
.setcolor = grub_virtual_screen_setcolor,
1179
.getcolor = grub_virtual_screen_getcolor,
1180
1194
.setcursor = grub_gfxterm_setcursor,
1181
1195
.refresh = grub_gfxterm_refresh,
1196
.flags = GRUB_TERM_CODE_TYPE_VISUAL_GLYPHS,
1197
.normal_color = GRUB_TERM_DEFAULT_NORMAL_COLOR,
1198
.highlight_color = GRUB_TERM_DEFAULT_HIGHLIGHT_COLOR,