/* * VAS_EBOOT -- GRand Unified Bootloader * Copyright (C) 2006,2007,2009 Free Software Foundation, Inc. * * VAS_EBOOT is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * VAS_EBOOT is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with VAS_EBOOT. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include VAS_EBOOT_MOD_LICENSE ("GPLv3+"); static VasEBoot_err_t VasEBoot_cmd_videotest (VasEBoot_command_t cmd __attribute__ ((unused)), int argc, char **args) { VasEBoot_err_t err; VasEBoot_video_color_t color; unsigned int x; unsigned int y; unsigned int width; unsigned int height; int i; struct VasEBoot_video_render_target *text_layer; VasEBoot_video_color_t palette[16]; const char *mode = NULL; #ifdef VAS_EBOOT_MACHINE_PCBIOS if (VasEBoot_strcmp (cmd->name, "vbetest") == 0) VasEBoot_dl_load ("vbe"); #endif mode = VasEBoot_env_get ("gfxmode"); if (argc) mode = args[0]; if (!mode) mode = "auto"; err = VasEBoot_video_set_mode (mode, VAS_EBOOT_VIDEO_MODE_TYPE_PURE_TEXT, 0); if (err) return err; VasEBoot_video_get_viewport (&x, &y, &width, &height); { const char *str; int texty; VasEBoot_font_t sansbig; VasEBoot_font_t sans; VasEBoot_font_t sanssmall; VasEBoot_font_t fixed; struct VasEBoot_font_glyph *glyph; if (VasEBoot_video_create_render_target (&text_layer, width, height, VAS_EBOOT_VIDEO_MODE_TYPE_RGB | VAS_EBOOT_VIDEO_MODE_TYPE_ALPHA) || !text_layer) goto fail; VasEBoot_video_set_active_render_target (text_layer); color = VasEBoot_video_map_rgb (0, 255, 255); sansbig = VasEBoot_font_get ("Unknown Regular 16"); sans = VasEBoot_font_get ("Unknown Regular 16"); sanssmall = VasEBoot_font_get ("Unknown Regular 16"); fixed = VasEBoot_font_get ("Fixed 20"); if (! sansbig || ! sans || ! sanssmall || ! fixed) return VasEBoot_error (VAS_EBOOT_ERR_BAD_FONT, "no font loaded"); glyph = VasEBoot_font_get_glyph (fixed, '*'); VasEBoot_font_draw_glyph (glyph, color, 200 ,0); color = VasEBoot_video_map_rgb (255, 255, 255); texty = 32; VasEBoot_font_draw_string ("The quick brown fox jumped over the lazy dog.", sans, color, 16, texty); texty += VasEBoot_font_get_descent (sans) + VasEBoot_font_get_leading (sans); texty += VasEBoot_font_get_ascent (fixed); VasEBoot_font_draw_string ("The quick brown fox jumped over the lazy dog.", fixed, color, 16, texty); texty += VasEBoot_font_get_descent (fixed) + VasEBoot_font_get_leading (fixed); /* To convert Unicode characters into UTF-8 for this test, the following command is useful: echo -ne '\x00\x00\x26\x3A' | iconv -f UTF-32BE -t UTF-8 | od -t x1 This converts the Unicode character U+263A to UTF-8. */ /* Characters used: Code point Description UTF-8 encoding ----------- ------------------------------ -------------- U+263A unfilled smiley face E2 98 BA U+00A1 inverted exclamation point C2 A1 U+00A3 British pound currency symbol C2 A3 U+03C4 Greek tau CF 84 U+00E4 lowercase letter a with umlaut C3 A4 U+2124 set 'Z' symbol (integers) E2 84 A4 U+2286 subset symbol E2 8A 86 U+211D set 'R' symbol (real numbers) E2 84 9D */ str = "Unicode test: happy\xE2\x98\xBA \xC2\xA3 5.00" " \xC2\xA1\xCF\x84\xC3\xA4u! " " \xE2\x84\xA4\xE2\x8A\x86\xE2\x84\x9D"; color = VasEBoot_video_map_rgb (128, 128, 255); /* All characters in the string exist in the 'Fixed 20' (10x20) font. */ texty += VasEBoot_font_get_ascent(fixed); VasEBoot_font_draw_string (str, fixed, color, 16, texty); texty += VasEBoot_font_get_descent (fixed) + VasEBoot_font_get_leading (fixed); texty += VasEBoot_font_get_ascent(sansbig); VasEBoot_font_draw_string (str, sansbig, color, 16, texty); texty += VasEBoot_font_get_descent (sansbig) + VasEBoot_font_get_leading (sansbig); texty += VasEBoot_font_get_ascent(sans); VasEBoot_font_draw_string (str, sans, color, 16, texty); texty += VasEBoot_font_get_descent (sans) + VasEBoot_font_get_leading (sans); texty += VasEBoot_font_get_ascent(sanssmall); VasEBoot_font_draw_string (str, sanssmall, color, 16, texty); texty += (VasEBoot_font_get_descent (sanssmall) + VasEBoot_font_get_leading (sanssmall)); glyph = VasEBoot_font_get_glyph (fixed, '*'); for (i = 0; i < 16; i++) { color = VasEBoot_video_map_color (i); palette[i] = color; VasEBoot_font_draw_glyph (glyph, color, 16 + i * 16, 220); } } VasEBoot_video_set_active_render_target (VAS_EBOOT_VIDEO_RENDER_TARGET_DISPLAY); for (i = 0; i < 5; i++) { if (i == 0 || i == 1) { color = VasEBoot_video_map_rgb (0, 0, 0); VasEBoot_video_fill_rect (color, 0, 0, width, height); color = VasEBoot_video_map_rgb (255, 0, 0); VasEBoot_video_fill_rect (color, 0, 0, 100, 100); color = VasEBoot_video_map_rgb (0, 255, 0); VasEBoot_video_fill_rect (color, 100, 0, 100, 100); color = VasEBoot_video_map_rgb (0, 0, 255); VasEBoot_video_fill_rect (color, 200, 0, 100, 100); color = VasEBoot_video_map_rgb (0, 255, 255); VasEBoot_video_fill_rect (color, 0, 100, 100, 100); color = VasEBoot_video_map_rgb (255, 0, 255); VasEBoot_video_fill_rect (color, 100, 100, 100, 100); color = VasEBoot_video_map_rgb (255, 255, 0); VasEBoot_video_fill_rect (color, 200, 100, 100, 100); VasEBoot_video_set_viewport (x + 150, y + 150, width - 150 * 2, height - 150 * 2); color = VasEBoot_video_map_rgb (77, 33, 77); VasEBoot_video_fill_rect (color, 0, 0, width, height); } color = VasEBoot_video_map_rgb (i, 33, 77); VasEBoot_video_fill_rect (color, 0, 0, width, height); VasEBoot_video_blit_render_target (text_layer, VAS_EBOOT_VIDEO_BLIT_BLEND, 0, 0, 0, 0, width, height); VasEBoot_video_swap_buffers (); } VasEBoot_getkey (); VasEBoot_video_delete_render_target (text_layer); VasEBoot_video_restore (); for (i = 0; i < 16; i++) VasEBoot_printf("color %d: %08x\n", i, palette[i]); VasEBoot_errno = VAS_EBOOT_ERR_NONE; return VasEBoot_errno; fail: VasEBoot_video_delete_render_target (text_layer); VasEBoot_video_restore (); return VasEBoot_errno; } static VasEBoot_command_t cmd; #ifdef VAS_EBOOT_MACHINE_PCBIOS static VasEBoot_command_t cmd_vbe; #endif VAS_EBOOT_MOD_INIT(videotest) { cmd = VasEBoot_register_command ("videotest", VasEBoot_cmd_videotest, /* TRANSLATORS: "x" has to be entered in, like an identifier, so please don't use better Unicode codepoints. */ N_("[WxH]"), /* TRANSLATORS: Here, on the other hand, it's nicer to use unicode cross instead of x. */ N_("Test video subsystem in mode WxH.")); #ifdef VAS_EBOOT_MACHINE_PCBIOS cmd_vbe = VasEBoot_register_command ("vbetest", VasEBoot_cmd_videotest, 0, N_("Test video subsystem.")); #endif } VAS_EBOOT_MOD_FINI(videotest) { VasEBoot_unregister_command (cmd); #ifdef VAS_EBOOT_MACHINE_PCBIOS VasEBoot_unregister_command (cmd_vbe); #endif }