2006-03-14 Vesa Jaaskelainen <chaac@nic.fi>

* DISTLIST: Added include/grub/video.h, term/gfxterm.c,
        video/video.c, commands/videotest.c.  Removed term/i386/pc/vesafb.c.

        * conf/i386-pc.rmk (pkgdata_MODULES): Added video.mod,
        gfxterm.mod, videotest.mod.  Removed vga.mod, vesafb.mod.
        (video_mod_SOURCES): Added.
        (video_mod_CFLAGS): Likewise.
        (video_mod_LDFLAGS): Likewise.
        (gfxterm_mod_SOURCES): Likewise.
        (gfxterm_mod_CFLAGS): Likewise.
        (gfxterm_mod_LDFLAGS): Likewise.
        (videotest_mod_SOURCES): Likewise.
        (videotest_mod_CFLAGS): Likewise.
        (videotest_mod_LDFLAGS): Likewise.
        (vesafb_mod_SOURCES): Removed.
        (vesafb_mod_CFLAGS): Likewise.
        (vesafb_mod_LDFLAGS): Likewise.
        (vga_mod_SOURCES): Likewise.
        (vga_mod_CFLAGS): Likewise.
        (vga_mod_LDFLAGS): Likewise.

        * commands/videotest.c: New file.

        * font/manager.c (fill_with_default_glyph): Modified to use
        grub_font_glyph.
        (grub_font_get_glyph): Likewise.
        (fontmanager): Renamed from this...
        (font_manager): ... to this.

        * include/grub/font.h (grub_font_glyph): Added new structure.
        (grub_font_get_glyph): Modified to use grub_font_glyph.

        * include/grub/misc.h (grub_abs): Added as inline function.

        * include/grub/video.h: New file.

        * include/grub/i386/pc/vbe.h (GRUB_VBE_STATUS_OK): New macro.
        (GRUB_VBE_MEMORY_MODEL_PACKED_PIXEL): Likewise.
        (GRUB_VBE_MEMORY_MODEL_DIRECT_COLOR): Likewise.
        (grub_vbe_get_controller_info): Renamed from this...
        (grub_vbe_bios_get_controller_info): ... to this.
        (grub_vbe_get_mode_info): Renamed from this...
        (grub_vbe_bios_get_mode_info): ... to this.
        (grub_vbe_set_mode): Renamed from this...
        (grub_vbe_bios_set_mode): ... to this.
        (grub_vbe_get_mode): Renamed from this...
        (grub_vbe_bios_get_mode): ... to this.
        (grub_vbe_set_memory_window): Renamed from this...
        (grub_vbe_bios_set_memory_window): ... to this.
        (grub_vbe_get_memory_window): Renamed from this...
        (grub_vbe_bios_get_memory_window): ... to this.
        (grub_vbe_set_scanline_length): Renamed from this...
        (grub_vbe_set_scanline_length): ... to this.
        (grub_vbe_get_scanline_length): Renamed from this...
        (grub_vbe_bios_get_scanline_length): ... to this.
        (grub_vbe_set_display_start): Renamed from this...
        (grub_vbe_bios_set_display_start): ... to this.
        (grub_vbe_get_display_start): Renamed from this...
        (grub_vbe_bios_get_display_start): ... to this.
        (grub_vbe_set_palette_data): Renamed from this...
        (grub_vbe_bios_set_palette_data): ... to this.
        (grub_vbe_set_pixel_rgb): Removed.
        (grub_vbe_set_pixel_index): Likewise.

        * kern/i386/pc/startup.S (grub_vbe_get_controller_info): Renamed
        from this...
        (grub_vbe_bios_get_controller_info): ... to this.
        (grub_vbe_get_mode_info): Renamed from this...
        (grub_vbe_bios_get_mode_info): ... to this.
        (grub_vbe_set_mode): Renamed from this...
        (grub_vbe_bios_set_mode): ... to this.
        (grub_vbe_get_mode): Renamed from this...
        (grub_vbe_bios_get_mode): ... to this.
        (grub_vbe_set_memory_window): Renamed from this...
        (grub_vbe_bios_set_memory_window): ... to this.
        (grub_vbe_get_memory_window): Renamed from this...
        (grub_vbe_bios_get_memory_window): ... to this.
        (grub_vbe_set_scanline_length): Renamed from this...
        (grub_vbe_set_scanline_length): ... to this.
        (grub_vbe_get_scanline_length): Renamed from this...
        (grub_vbe_bios_get_scanline_length): ... to this.
        (grub_vbe_set_display_start): Renamed from this...
        (grub_vbe_bios_set_display_start): ... to this.
        (grub_vbe_get_display_start): Renamed from this...
        (grub_vbe_bios_get_display_start): ... to this.
        (grub_vbe_set_palette_data): Renamed from this...
        (grub_vbe_bios_set_palette_data): ... to this.
        (grub_vbe_bios_get_controller_info): Fixed problem with registers
        getting corrupted after calling it.  Added more pushes and pops.
        (grub_vbe_bios_set_mode): Likewise.
        (grub_vbe_bios_get_mode): Likewise.
        (grub_vbe_bios_get_memory_window): Likewise.
        (grub_vbe_bios_set_scanline_length): Likewise.
        (grub_vbe_bios_get_scanline_length): Likewise.
        (grub_vbe_bios_get_display_start): Likewise.
        (grub_vbe_bios_set_palette_data): Likewise.

        * normal/cmdline.c (cl_set_pos): Refresh the screen.
        (cl_insert): Likewise.
        (cl_delete): Likewise.

        * term/gfxterm.c: New file.

        * term/i386/pc/vesafb.c: Removed file.

        * video/video.c: New file.

        * video/i386/pc/vbe.c (real2pm): Added new function.
        (grub_video_vbe_draw_pixel): Likewise.
        (grub_video_vbe_get_video_ptr): Likewise.
        (grub_video_vbe_get_pixel): Likewise
        (grub_video_vbe_init): Likewise.
        (grub_video_vbe_fini): Likewise.
        (grub_video_vbe_setup): Likewise.
        (grub_video_vbe_get_info): Likewise.
        (grub_video_vbe_set_palette): Likewise.
        (grub_video_vbe_get_palette): Likewise.
        (grub_video_vbe_set_viewport): Likewise.
        (grub_video_vbe_get_viewport): Likewise.
        (grub_video_vbe_map_color): Likewise.
        (grub_video_vbe_map_rgb): Likewise.
        (grub_video_vbe_map_rgba): Likewise.
        (grub_video_vbe_unmap_color): Likewise.
        (grub_video_vbe_fill_rect): Likewise.
        (grub_video_vbe_blit_glyph): Likewise.
        (grub_video_vbe_blit_bitmap): Likewise.
        (grub_video_vbe_blit_render_target): Likewise.
        (grub_video_vbe_scroll): Likewise.
        (grub_video_vbe_swap_buffers): Likewise.
        (grub_video_vbe_create_render_target): Likewise.
        (grub_video_vbe_delete_render_target): Likewise.
        (grub_video_vbe_set_active_render_target): Likewise.
        (grub_vbe_set_pixel_rgb): Remove function.
        (grub_vbe_set_pixel_index): Likewise.
        (index_color_mode): Remove static variable.
        (active_mode): Likewise.
        (framebuffer): Likewise.
        (bytes_per_scan_line): Likewise.
        (grub_video_vbe_adapter): Added new static variable.
        (framebuffer): Likewise.
        (render_target): Likewise.
        (initial_mode): Likewise.
        (mode_in_use): Likewise.
        (mode_list): Likewise.
This commit is contained in:
chaac 2006-03-14 19:08:34 +00:00
parent 5f97350bc7
commit bd0d7896cf
15 changed files with 3234 additions and 313 deletions

View file

@ -24,7 +24,31 @@
#define GRUB_FONT_MAGIC "PPF\x7f"
struct grub_font_glyph
{
/* Glyph width in pixels. */
grub_uint8_t width;
/* Glyph height in pixels. */
grub_uint8_t height;
/* Glyph width in characters. */
grub_uint8_t char_width;
/* Glyph baseline position in pixels (from up). */
grub_uint8_t baseline;
/* Glyph bitmap data array of bytes in ((width + 7) / 8) * height.
Bitmap is formulated by height scanlines, each scanline having
width number of pixels. Pixels are coded as bits, value 1 meaning
of opaque pixel and 0 is transparent. If width does not fit byte
boundary, it will be padded with 0 to make it fit. */
grub_uint8_t bitmap[32];
};
typedef struct grub_font_glyph *grub_font_glyph_t;
int grub_font_get_glyph (grub_uint32_t code,
unsigned char bitmap[32], unsigned *width);
grub_font_glyph_t glyph);
#endif /* ! GRUB_FONT_HEADER */

View file

@ -27,6 +27,13 @@
/* Default video mode to be used. */
#define GRUB_VBE_DEFAULT_VIDEO_MODE 0x101
/* VBE status codes. */
#define GRUB_VBE_STATUS_OK 0x004f
/* VBE memory model types. */
#define GRUB_VBE_MEMORY_MODEL_PACKED_PIXEL 0x04
#define GRUB_VBE_MEMORY_MODEL_DIRECT_COLOR 0x06
/* Note:
Please refer to VESA BIOS Extension 3.0 Specification for more descriptive
@ -117,7 +124,7 @@ struct grub_vbe_mode_info_block
/* Reserved field to make structure to be 256 bytes long, VESA BIOS
Extension 3.0 Specification says to reserve 189 bytes here but
that doesn't make structure to be 256 bytes. So additional one is
that doesn't make structure to be 256 bytes. So additional one is
added here. */
grub_uint8_t reserved4[189 + 1];
} __attribute__ ((packed));
@ -147,45 +154,45 @@ struct grub_vbe_palette_data
/* Prototypes for kernel real mode thunks. */
/* Call VESA BIOS 0x4f00 to get VBE Controller Information, return status. */
grub_vbe_status_t EXPORT_FUNC(grub_vbe_get_controller_info) (struct grub_vbe_info_block *controller_info);
grub_vbe_status_t EXPORT_FUNC(grub_vbe_bios_get_controller_info) (struct grub_vbe_info_block *controller_info);
/* Call VESA BIOS 0x4f01 to get VBE Mode Information, return status. */
grub_vbe_status_t EXPORT_FUNC(grub_vbe_get_mode_info) (grub_uint32_t mode,
struct grub_vbe_mode_info_block *mode_info);
grub_vbe_status_t EXPORT_FUNC(grub_vbe_bios_get_mode_info) (grub_uint32_t mode,
struct grub_vbe_mode_info_block *mode_info);
/* Call VESA BIOS 0x4f02 to set video mode, return status. */
grub_vbe_status_t EXPORT_FUNC(grub_vbe_set_mode) (grub_uint32_t mode,
struct grub_vbe_crtc_info_block *crtc_info);
grub_vbe_status_t EXPORT_FUNC(grub_vbe_bios_set_mode) (grub_uint32_t mode,
struct grub_vbe_crtc_info_block *crtc_info);
/* Call VESA BIOS 0x4f03 to return current VBE Mode, return status. */
grub_vbe_status_t EXPORT_FUNC(grub_vbe_get_mode) (grub_uint32_t *mode);
grub_vbe_status_t EXPORT_FUNC(grub_vbe_bios_get_mode) (grub_uint32_t *mode);
/* Call VESA BIOS 0x4f05 to set memory window, return status. */
grub_vbe_status_t EXPORT_FUNC(grub_vbe_set_memory_window) (grub_uint32_t window,
grub_uint32_t position);
grub_vbe_status_t EXPORT_FUNC(grub_vbe_bios_set_memory_window) (grub_uint32_t window,
grub_uint32_t position);
/* Call VESA BIOS 0x4f05 to return memory window, return status. */
grub_vbe_status_t EXPORT_FUNC(grub_vbe_get_memory_window) (grub_uint32_t window,
grub_uint32_t *position);
grub_vbe_status_t EXPORT_FUNC(grub_vbe_bios_get_memory_window) (grub_uint32_t window,
grub_uint32_t *position);
/* Call VESA BIOS 0x4f06 to set scanline length (in bytes), return status. */
grub_vbe_status_t EXPORT_FUNC(grub_vbe_set_scanline_length) (grub_uint32_t length);
grub_vbe_status_t EXPORT_FUNC(grub_vbe_bios_set_scanline_length) (grub_uint32_t length);
/* Call VESA BIOS 0x4f06 to return scanline length (in bytes), return status. */
grub_vbe_status_t EXPORT_FUNC(grub_vbe_get_scanline_length) (grub_uint32_t *length);
grub_vbe_status_t EXPORT_FUNC(grub_vbe_bios_get_scanline_length) (grub_uint32_t *length);
/* Call VESA BIOS 0x4f07 to set display start, return status. */
grub_vbe_status_t EXPORT_FUNC(grub_vbe_set_display_start) (grub_uint32_t x,
grub_uint32_t y);
grub_vbe_status_t EXPORT_FUNC(grub_vbe_bios_set_display_start) (grub_uint32_t x,
grub_uint32_t y);
/* Call VESA BIOS 0x4f07 to get display start, return status. */
grub_vbe_status_t EXPORT_FUNC(grub_vbe_get_display_start) (grub_uint32_t *x,
grub_uint32_t *y);
grub_vbe_status_t EXPORT_FUNC(grub_vbe_bios_get_display_start) (grub_uint32_t *x,
grub_uint32_t *y);
/* Call VESA BIOS 0x4f09 to set palette data, return status. */
grub_vbe_status_t EXPORT_FUNC(grub_vbe_set_palette_data) (grub_uint32_t color_count,
grub_uint32_t start_index,
struct grub_vbe_palette_data *palette_data);
grub_vbe_status_t EXPORT_FUNC(grub_vbe_bios_set_palette_data) (grub_uint32_t color_count,
grub_uint32_t start_index,
struct grub_vbe_palette_data *palette_data);
/* Prototypes for helper functions. */
@ -195,13 +202,5 @@ grub_err_t grub_vbe_set_video_mode (grub_uint32_t mode,
grub_err_t grub_vbe_get_video_mode (grub_uint32_t *mode);
grub_err_t grub_vbe_get_video_mode_info (grub_uint32_t mode,
struct grub_vbe_mode_info_block *mode_info);
void grub_vbe_set_pixel_rgb (grub_uint32_t x,
grub_uint32_t y,
grub_uint8_t red,
grub_uint8_t green,
grub_uint8_t blue);
void grub_vbe_set_pixel_index (grub_uint32_t x,
grub_uint32_t y,
grub_uint8_t color);
#endif /* ! GRUB_VBE_MACHINE_HEADER */

View file

@ -76,4 +76,14 @@ grub_ssize_t EXPORT_FUNC(grub_utf8_to_ucs4) (grub_uint32_t *dest,
const grub_uint8_t *src,
grub_size_t size);
/* Inline functions. */
static inline unsigned int
grub_abs (int x)
{
if (x < 0)
return (unsigned int)(-x);
else
return (unsigned int)x;
}
#endif /* ! GRUB_MISC_HEADER */

309
include/grub/video.h Normal file
View file

@ -0,0 +1,309 @@
/*
* GRUB -- GRand Unified Bootloader
* Copyright (C) 2006 Free Software Foundation, Inc.
*
* GRUB 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 2 of the License, or
* (at your option) any later version.
*
* This program 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 GRUB; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef GRUB_VIDEO_HEADER
#define GRUB_VIDEO_HEADER 1
#include <grub/err.h>
#include <grub/symbol.h>
#include <grub/types.h>
typedef grub_uint32_t grub_video_color_t;
struct grub_video_render_target;
/* Defines used to describe video mode or rendering target. */
#define GRUB_VIDEO_MODE_TYPE_ALPHA 0x00000008
#define GRUB_VIDEO_MODE_TYPE_DOUBLE_BUFFERED 0x00000004
#define GRUB_VIDEO_MODE_TYPE_INDEX_COLOR 0x00000002
#define GRUB_VIDEO_MODE_TYPE_RGB 0x00000001
/* Defines used to mask flags. */
#define GRUB_VIDEO_MODE_TYPE_COLOR_MASK 0x00000003
/* Defines used to specify requested bit depth. */
#define GRUB_VIDEO_MODE_TYPE_DEPTH_MASK 0x0000ff00
#define GRUB_VIDEO_MODE_TYPE_DEPTH_POS 8
/* Defined predefined render targets. */
#define GRUB_VIDEO_RENDER_TARGET_DISPLAY ((struct grub_video_render_target *) 0)
#define GRUB_VIDEO_RENDER_TARGET_FRONT_BUFFER ((struct grub_video_render_target *) 0)
#define GRUB_VIDEO_RENDER_TARGET_BACK_BUFFER ((struct grub_video_render_target *) 1)
struct grub_video_mode_info
{
/* Width of the screen. */
unsigned int width;
/* Height of the screen. */
unsigned int height;
/* Mode type bitmask. Contains information like is it Index color or
RGB mode. */
unsigned int mode_type;
/* Bits per pixel. */
unsigned int bpp;
/* Bytes per pixel. */
unsigned int bytes_per_pixel;
/* Pitch of one scanline. How many bytes there are for scanline. */
unsigned int pitch;
/* In index color mode, number of colors. In RGB mode this is 256. */
unsigned int number_of_colors;
/* How many bits are reserved for red color. */
unsigned int red_mask_size;
/* What is location of red color bits. In Index Color mode, this is 0. */
unsigned int red_field_pos;
/* How many bits are reserved for green color. */
unsigned int green_mask_size;
/* What is location of green color bits. In Index Color mode, this is 0. */
unsigned int green_field_pos;
/* How many bits are reserved for blue color. */
unsigned int blue_mask_size;
/* What is location of blue color bits. In Index Color mode, this is 0. */
unsigned int blue_field_pos;
/* How many bits are reserved in color. */
unsigned int reserved_mask_size;
/* What is location of reserved color bits. In Index Color mode,
this is 0. */
unsigned int reserved_field_pos;
};
struct grub_video_render_target
{
/* Copy of the screen's mode info structure, except that width, height and
mode_type has been re-adjusted to requested render target settings. */
struct grub_video_mode_info mode_info;
struct
{
unsigned int x;
unsigned int y;
unsigned int width;
unsigned int height;
} viewport;
/* Indicates wether the data has been allocated by us and must be freed
when render target is destroyed. */
int is_allocated;
/* Pointer to data. Can either be in video card memory or in local host's
memory. */
void *data;
};
struct grub_video_palette_data
{
grub_uint8_t r; /* Red color value (0-255). */
grub_uint8_t g; /* Green color value (0-255). */
grub_uint8_t b; /* Blue color value (0-255). */
grub_uint8_t a; /* Reserved bits value (0-255). */
};
struct grub_font_glyph;
struct grub_video_bitmap;
struct grub_video_adapter
{
/* The video adapter name. */
const char *name;
/* Initialize the video adapter. */
grub_err_t (*init) (void);
/* Clean up the video adapter. */
grub_err_t (*fini) (void);
grub_err_t (*setup) (unsigned int width,
unsigned int height,
unsigned int mode_type);
grub_err_t (*get_info) (struct grub_video_mode_info *mode_info);
grub_err_t (*set_palette) (unsigned int start,
unsigned int count,
struct grub_video_palette_data *palette_data);
grub_err_t (*get_palette) (unsigned int start,
unsigned int count,
struct grub_video_palette_data *palette_data);
grub_err_t (*set_viewport) (unsigned int x,
unsigned int y,
unsigned int width,
unsigned int height);
grub_err_t (*get_viewport) (unsigned int *x,
unsigned int *y,
unsigned int *width,
unsigned int *height);
grub_video_color_t (*map_color) (grub_uint32_t color_name);
grub_video_color_t (*map_rgb) (grub_uint8_t red,
grub_uint8_t green,
grub_uint8_t blue);
grub_video_color_t (*map_rgba) (grub_uint8_t red,
grub_uint8_t green,
grub_uint8_t blue,
grub_uint8_t alpha);
grub_err_t (*fill_rect) (grub_video_color_t color,
int x,
int y,
unsigned int width,
unsigned int height);
grub_err_t (*blit_glyph) (struct grub_font_glyph *glyph,
grub_video_color_t color,
int x,
int y);
grub_err_t (*blit_bitmap) (struct grub_video_bitmap *bitmap,
int x,
int y,
int offset_x,
int offset_y,
unsigned int width,
unsigned int height);
grub_err_t (*blit_render_target) (struct grub_video_render_target *source,
int x,
int y,
int offset_x,
int offset_y,
unsigned int width,
unsigned int height);
grub_err_t (*scroll) (grub_video_color_t color,
int dx,
int dy);
grub_err_t (*swap_buffers) (void);
grub_err_t (*create_render_target) (struct grub_video_render_target **result,
unsigned int width,
unsigned int height,
unsigned int mode_type);
grub_err_t (*delete_render_target) (struct grub_video_render_target *target);
grub_err_t (*set_active_render_target) (struct grub_video_render_target *target);
/* The next video adapter. */
struct grub_video_adapter *next;
};
typedef struct grub_video_adapter *grub_video_adapter_t;
void EXPORT_FUNC(grub_video_register) (grub_video_adapter_t adapter);
void EXPORT_FUNC(grub_video_unregister) (grub_video_adapter_t adapter);
void EXPORT_FUNC(grub_video_iterate) (int (*hook) (grub_video_adapter_t adapter));
grub_err_t EXPORT_FUNC(grub_video_setup) (unsigned int width,
unsigned int height,
unsigned int mode_type);
grub_err_t EXPORT_FUNC(grub_video_restore) (void);
grub_err_t EXPORT_FUNC(grub_video_get_info) (struct grub_video_mode_info *mode_info);
grub_err_t EXPORT_FUNC(grub_video_set_palette) (unsigned int start,
unsigned int count,
struct grub_video_palette_data *palette_data);
grub_err_t EXPORT_FUNC(grub_video_get_palette) (unsigned int start,
unsigned int count,
struct grub_video_palette_data *palette_data);
grub_err_t EXPORT_FUNC(grub_video_set_viewport) (unsigned int x,
unsigned int y,
unsigned int width,
unsigned int height);
grub_err_t EXPORT_FUNC(grub_video_get_viewport) (unsigned int *x,
unsigned int *y,
unsigned int *width,
unsigned int *height);
grub_video_color_t EXPORT_FUNC(grub_video_map_color) (grub_uint32_t color_name);
grub_video_color_t EXPORT_FUNC(grub_video_map_rgb) (grub_uint8_t red,
grub_uint8_t green,
grub_uint8_t blue);
grub_video_color_t EXPORT_FUNC(grub_video_map_rgba) (grub_uint8_t red,
grub_uint8_t green,
grub_uint8_t blue,
grub_uint8_t alpha);
grub_err_t EXPORT_FUNC(grub_video_fill_rect) (grub_video_color_t color,
int x,
int y,
unsigned int width,
unsigned int height);
grub_err_t EXPORT_FUNC(grub_video_blit_glyph) (struct grub_font_glyph *glyph,
grub_video_color_t color,
int x,
int y);
grub_err_t EXPORT_FUNC(grub_video_blit_bitmap) (struct grub_video_bitmap *bitmap,
int x,
int y,
int offset_x,
int offset_y,
unsigned int width,
unsigned int height);
grub_err_t EXPORT_FUNC(grub_video_blit_render_target) (struct grub_video_render_target *source,
int x,
int y,
int offset_x,
int offset_y,
unsigned int width,
unsigned int height);
grub_err_t EXPORT_FUNC(grub_video_scroll) (grub_video_color_t color,
int dx,
int dy);
grub_err_t EXPORT_FUNC(grub_video_swap_buffers) (void);
grub_err_t EXPORT_FUNC(grub_video_create_render_target) (struct grub_video_render_target **result,
unsigned int width,
unsigned int height,
unsigned int mode_type);
grub_err_t EXPORT_FUNC(grub_video_delete_render_target) (struct grub_video_render_target *target);
grub_err_t EXPORT_FUNC(grub_video_set_active_render_target) (struct grub_video_render_target *target);
#endif /* ! GRUB_VIDEO_HEADER */