2009-11-21 Samuel Thibault <samuel.thibault@ens-lyon.org>
[grub2.git] / commands / videotest.c
blob6fe4b9bd1e560031bdb0e9c10e2b7e64642bf234
1 /*
2 * GRUB -- GRand Unified Bootloader
3 * Copyright (C) 2006,2007,2009 Free Software Foundation, Inc.
5 * GRUB is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
10 * GRUB is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
19 #include <grub/video.h>
20 #include <grub/types.h>
21 #include <grub/dl.h>
22 #include <grub/misc.h>
23 #include <grub/mm.h>
24 #include <grub/font.h>
25 #include <grub/term.h>
26 #include <grub/command.h>
28 static grub_err_t
29 grub_cmd_videotest (grub_command_t cmd __attribute__ ((unused)),
30 int argc __attribute__ ((unused)),
31 char **args __attribute__ ((unused)))
33 if (grub_video_set_mode ("1024x768;800x600;640x480", 0) != GRUB_ERR_NONE)
34 return grub_errno;
36 grub_video_color_t color;
37 unsigned int x;
38 unsigned int y;
39 unsigned int width;
40 unsigned int height;
41 int i;
42 grub_font_t sansbig;
43 grub_font_t sans;
44 grub_font_t sanssmall;
45 grub_font_t fixed;
46 struct grub_font_glyph *glyph;
47 struct grub_video_render_target *text_layer;
48 grub_video_color_t palette[16];
49 const char *str;
50 int texty;
52 grub_video_get_viewport (&x, &y, &width, &height);
54 grub_video_create_render_target (&text_layer, width, height,
55 GRUB_VIDEO_MODE_TYPE_RGB
56 | GRUB_VIDEO_MODE_TYPE_ALPHA);
58 grub_video_set_active_render_target (GRUB_VIDEO_RENDER_TARGET_DISPLAY);
60 color = grub_video_map_rgb (0, 0, 0);
61 grub_video_fill_rect (color, 0, 0, width, height);
63 color = grub_video_map_rgb (255, 0, 0);
64 grub_video_fill_rect (color, 0, 0, 100, 100);
66 color = grub_video_map_rgb (0, 255, 255);
67 grub_video_fill_rect (color, 100, 100, 100, 100);
69 sansbig = grub_font_get ("Helvetica Bold 24");
70 sans = grub_font_get ("Helvetica Bold 14");
71 sanssmall = grub_font_get ("Helvetica 8");
72 fixed = grub_font_get ("Fixed 20");
73 if (! sansbig || ! sans || ! sanssmall || ! fixed)
74 return grub_error (GRUB_ERR_BAD_FONT, "No font loaded.");
76 glyph = grub_font_get_glyph (fixed, '*');
77 grub_font_draw_glyph (glyph, color, 200 ,0);
79 grub_video_set_viewport (x + 150, y + 150,
80 width - 150 * 2, height - 150 * 2);
81 color = grub_video_map_rgb (77, 33, 77);
82 grub_video_fill_rect (color, 0, 0, width, height);
84 grub_video_set_active_render_target (text_layer);
86 color = grub_video_map_rgb (255, 255, 255);
88 texty = 32;
89 grub_font_draw_string ("The quick brown fox jumped over the lazy dog.",
90 sans, color, 16, texty);
91 texty += grub_font_get_descent (sans) + grub_font_get_leading (sans);
93 texty += grub_font_get_ascent (fixed);
94 grub_font_draw_string ("The quick brown fox jumped over the lazy dog.",
95 fixed, color, 16, texty);
96 texty += grub_font_get_descent (fixed) + grub_font_get_leading (fixed);
98 /* To convert Unicode characters into UTF-8 for this test, the following
99 command is useful:
100 echo -ne '\x00\x00\x26\x3A' | iconv -f UTF-32BE -t UTF-8 | od -t x1
101 This converts the Unicode character U+263A to UTF-8. */
103 /* Characters used:
104 Code point Description UTF-8 encoding
105 ----------- ------------------------------ --------------
106 U+263A unfilled smiley face E2 98 BA
107 U+00A1 inverted exclamation point C2 A1
108 U+00A3 British pound currency symbol C2 A3
109 U+03C4 Greek tau CF 84
110 U+00E4 lowercase letter a with umlaut C3 A4
111 U+2124 set 'Z' symbol (integers) E2 84 A4
112 U+2287 subset symbol E2 8A 87
113 U+211D set 'R' symbol (real numbers) E2 84 9D */
115 str =
116 "Unicode test: happy\xE2\x98\xBA \xC2\xA3 5.00"
117 " \xC2\xA1\xCF\x84\xC3\xA4u! "
118 " \xE2\x84\xA4\xE2\x8A\x87\xE2\x84\x9D";
119 color = grub_video_map_rgb (128, 128, 255);
121 /* All characters in the string exist in the 'Fixed 20' (10x20) font. */
122 texty += grub_font_get_ascent(fixed);
123 grub_font_draw_string (str, fixed, color, 16, texty);
124 texty += grub_font_get_descent (fixed) + grub_font_get_leading (fixed);
126 /* Some character don't exist in the Helvetica font, so the font engine
127 will fall back to using glyphs from another font that does contain them.
128 TODO The font engine should be smart about selecting a replacement font
129 and prioritize fonts with similar sizes. */
131 texty += grub_font_get_ascent(sansbig);
132 grub_font_draw_string (str, sansbig, color, 16, texty);
133 texty += grub_font_get_descent (sansbig) + grub_font_get_leading (sansbig);
135 texty += grub_font_get_ascent(sans);
136 grub_font_draw_string (str, sans, color, 16, texty);
137 texty += grub_font_get_descent (sans) + grub_font_get_leading (sans);
139 texty += grub_font_get_ascent(sanssmall);
140 grub_font_draw_string (str, sanssmall, color, 16, texty);
141 texty += (grub_font_get_descent (sanssmall)
142 + grub_font_get_leading (sanssmall));
144 glyph = grub_font_get_glyph (fixed, '*');
146 for (i = 0; i < 16; i++)
148 color = grub_video_map_color (i);
149 palette[i] = color;
150 grub_font_draw_glyph (glyph, color, 16 + i * 16, 220);
153 grub_video_set_active_render_target (GRUB_VIDEO_RENDER_TARGET_DISPLAY);
155 for (i = 0; i < 255; i++)
157 color = grub_video_map_rgb (i, 33, 77);
158 grub_video_fill_rect (color, 0, 0, width, height);
159 grub_video_blit_render_target (text_layer, GRUB_VIDEO_BLIT_BLEND, 0, 0,
160 0, 0, width, height);
163 grub_getkey ();
165 grub_video_delete_render_target (text_layer);
167 grub_video_restore ();
169 for (i = 0; i < 16; i++)
170 grub_printf("color %d: %08x\n", i, palette[i]);
172 grub_errno = GRUB_ERR_NONE;
173 return grub_errno;
176 static grub_command_t cmd;
178 GRUB_MOD_INIT(videotest)
180 cmd = grub_register_command ("videotest", grub_cmd_videotest,
181 0, "Test video subsystem");
184 GRUB_MOD_FINI(videotest)
186 grub_unregister_command (cmd);