* grub-core/gfxmenu/gui_box.c: Updated to work with area status.
* grub-core/gfxmenu/gui_canvas.c: Likewise. * grub-core/gfxmenu/view.c: Likewise. * grub-core/video/fb/video_fb.c: Introduce new functions: grub_video_set_area_status, grub_video_get_area_status, grub_video_set_region, grub_video_get_region. * grub-core/video/bochs.c: Likewise. * grub-core/video/capture.c: Likewise. * grub-core/video/video.c: Likewise. * grub-core/video/cirrus.c: Likewise. * grub-core/video/efi_gop.c: Likewise. * grub-core/video/efi_uga.c: Likewise. * grub-core/video/emu/sdl.c: Likewise. * grub-core/video/radeon_fuloong2e.c: Likewise. * grub-core/video/sis315pro.c: Likewise. * grub-core/video/sm712.c: Likewise. * grub-core/video/i386/pc/vbe.c: Likewise. * grub-core/video/i386/pc/vga.c: Likewise. * grub-core/video/ieee1275.c: Likewise. * grub-core/video/i386/coreboot/cbfb.c: Likewise. * include/grub/video.h: Likewise. * include/grub/video_fb.h: Likewise. * include/grub/fbfill.h: Updated render_target structure. grub_video_rect_t viewport, region, area int area_offset_x, area_offset_y, area_enabled * include/grub/gui.h: New helper function grub_video_bounds_inside_region. * docs/grub-dev.texi: Added information about new functions.
This commit is contained in:
parent
c6b755df45
commit
4db2250000
24 changed files with 536 additions and 34 deletions
|
@ -234,14 +234,30 @@ static void
|
|||
box_paint (void *vself, const grub_video_rect_t *region)
|
||||
{
|
||||
grub_gui_box_t self = vself;
|
||||
|
||||
struct component_node *cur;
|
||||
grub_video_rect_t vpsave;
|
||||
|
||||
grub_video_area_status_t box_area_status;
|
||||
grub_video_get_area_status (&box_area_status);
|
||||
|
||||
grub_gui_set_viewport (&self->bounds, &vpsave);
|
||||
for (cur = self->chead.next; cur != &self->ctail; cur = cur->next)
|
||||
{
|
||||
grub_gui_component_t comp = cur->component;
|
||||
grub_video_rect_t r;
|
||||
comp->ops->get_bounds(comp, &r);
|
||||
|
||||
if (!grub_video_have_common_points (region, &r))
|
||||
continue;
|
||||
|
||||
/* Paint the child. */
|
||||
if (box_area_status == GRUB_VIDEO_AREA_ENABLED
|
||||
&& grub_video_bounds_inside_region (&r, region))
|
||||
grub_video_set_area_status (GRUB_VIDEO_AREA_DISABLED);
|
||||
comp->ops->paint (comp, region);
|
||||
if (box_area_status == GRUB_VIDEO_AREA_ENABLED)
|
||||
grub_video_set_area_status (GRUB_VIDEO_AREA_ENABLED);
|
||||
}
|
||||
grub_gui_restore_viewport (&vpsave);
|
||||
}
|
||||
|
|
|
@ -80,9 +80,13 @@ static void
|
|||
canvas_paint (void *vself, const grub_video_rect_t *region)
|
||||
{
|
||||
grub_gui_canvas_t self = vself;
|
||||
|
||||
struct component_node *cur;
|
||||
grub_video_rect_t vpsave;
|
||||
|
||||
grub_video_area_status_t canvas_area_status;
|
||||
grub_video_get_area_status (&canvas_area_status);
|
||||
|
||||
grub_gui_set_viewport (&self->bounds, &vpsave);
|
||||
for (cur = self->components.next; cur; cur = cur->next)
|
||||
{
|
||||
|
@ -135,9 +139,16 @@ canvas_paint (void *vself, const grub_video_rect_t *region)
|
|||
r.height = h;
|
||||
comp->ops->set_bounds (comp, &r);
|
||||
|
||||
if (!grub_video_have_common_points (region, &r))
|
||||
continue;
|
||||
|
||||
/* Paint the child. */
|
||||
if (grub_video_have_common_points (region, &r))
|
||||
comp->ops->paint (comp, region);
|
||||
if (canvas_area_status == GRUB_VIDEO_AREA_ENABLED
|
||||
&& grub_video_bounds_inside_region (&r, region))
|
||||
grub_video_set_area_status (GRUB_VIDEO_AREA_DISABLED);
|
||||
comp->ops->paint (comp, region);
|
||||
if (canvas_area_status == GRUB_VIDEO_AREA_ENABLED)
|
||||
grub_video_set_area_status (GRUB_VIDEO_AREA_ENABLED);
|
||||
}
|
||||
grub_gui_restore_viewport (&vpsave);
|
||||
}
|
||||
|
|
|
@ -213,6 +213,7 @@ redraw_timeouts (struct grub_gfxmenu_view *view)
|
|||
{
|
||||
grub_video_rect_t bounds;
|
||||
cur->self->ops->get_bounds (cur->self, &bounds);
|
||||
grub_video_set_area_status (GRUB_VIDEO_AREA_ENABLED);
|
||||
grub_gfxmenu_view_redraw (view, &bounds);
|
||||
}
|
||||
}
|
||||
|
@ -321,6 +322,11 @@ grub_gfxmenu_view_redraw (grub_gfxmenu_view_t view,
|
|||
grub_gfxterm_schedule_repaint ();
|
||||
|
||||
grub_video_set_active_render_target (GRUB_VIDEO_RENDER_TARGET_DISPLAY);
|
||||
grub_video_area_status_t area_status;
|
||||
grub_video_get_area_status (&area_status);
|
||||
if (area_status == GRUB_VIDEO_AREA_ENABLED)
|
||||
grub_video_set_region (region->x, region->y,
|
||||
region->width, region->height);
|
||||
|
||||
redraw_background (view, region);
|
||||
if (view->canvas)
|
||||
|
@ -328,6 +334,9 @@ grub_gfxmenu_view_redraw (grub_gfxmenu_view_t view,
|
|||
draw_title (view);
|
||||
if (grub_video_have_common_points (&view->progress_message_frame, region))
|
||||
draw_message (view);
|
||||
|
||||
if (area_status == GRUB_VIDEO_AREA_ENABLED)
|
||||
grub_video_set_area_status (GRUB_VIDEO_AREA_ENABLED);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -350,10 +359,15 @@ grub_gfxmenu_view_draw (grub_gfxmenu_view_t view)
|
|||
refresh_menu_components (view);
|
||||
update_menu_components (view);
|
||||
|
||||
grub_video_set_area_status (GRUB_VIDEO_AREA_DISABLED);
|
||||
grub_gfxmenu_view_redraw (view, &view->screen);
|
||||
grub_video_swap_buffers ();
|
||||
if (view->double_repaint)
|
||||
grub_gfxmenu_view_redraw (view, &view->screen);
|
||||
{
|
||||
grub_video_set_area_status (GRUB_VIDEO_AREA_DISABLED);
|
||||
grub_gfxmenu_view_redraw (view, &view->screen);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -367,6 +381,7 @@ redraw_menu_visit (grub_gui_component_t component,
|
|||
grub_video_rect_t bounds;
|
||||
|
||||
component->ops->get_bounds (component, &bounds);
|
||||
grub_video_set_area_status (GRUB_VIDEO_AREA_ENABLED);
|
||||
grub_gfxmenu_view_redraw (view, &bounds);
|
||||
}
|
||||
}
|
||||
|
@ -404,6 +419,8 @@ grub_gfxmenu_draw_terminal_box (void)
|
|||
if (!term_box)
|
||||
return;
|
||||
|
||||
grub_video_set_area_status (GRUB_VIDEO_AREA_DISABLED);
|
||||
|
||||
term_box->set_content_size (term_box, term_view->terminal_rect.width,
|
||||
term_view->terminal_rect.height);
|
||||
|
||||
|
|
|
@ -401,6 +401,10 @@ static struct grub_video_adapter grub_video_bochs_adapter =
|
|||
.get_palette = grub_video_fb_get_palette,
|
||||
.set_viewport = grub_video_fb_set_viewport,
|
||||
.get_viewport = grub_video_fb_get_viewport,
|
||||
.set_region = grub_video_fb_set_region,
|
||||
.get_region = grub_video_fb_get_region,
|
||||
.set_area_status = grub_video_fb_set_area_status,
|
||||
.get_area_status = grub_video_fb_get_area_status,
|
||||
.map_color = grub_video_fb_map_color,
|
||||
.map_rgb = grub_video_fb_map_rgb,
|
||||
.map_rgba = grub_video_fb_map_rgba,
|
||||
|
|
|
@ -51,6 +51,10 @@ static struct grub_video_adapter grub_video_capture_adapter =
|
|||
.get_palette = grub_video_fb_get_palette,
|
||||
.set_viewport = grub_video_fb_set_viewport,
|
||||
.get_viewport = grub_video_fb_get_viewport,
|
||||
.set_region = grub_video_fb_set_region,
|
||||
.get_region = grub_video_fb_get_region,
|
||||
.set_area_status = grub_video_fb_set_area_status,
|
||||
.get_area_status = grub_video_fb_get_area_status,
|
||||
.map_color = grub_video_fb_map_color,
|
||||
.map_rgb = grub_video_fb_map_rgb,
|
||||
.map_rgba = grub_video_fb_map_rgba,
|
||||
|
|
|
@ -480,6 +480,10 @@ static struct grub_video_adapter grub_video_cirrus_adapter =
|
|||
.get_palette = grub_video_fb_get_palette,
|
||||
.set_viewport = grub_video_fb_set_viewport,
|
||||
.get_viewport = grub_video_fb_get_viewport,
|
||||
.set_region = grub_video_fb_set_region,
|
||||
.get_region = grub_video_fb_get_region,
|
||||
.set_area_status = grub_video_fb_set_area_status,
|
||||
.get_area_status = grub_video_fb_get_area_status,
|
||||
.map_color = grub_video_fb_map_color,
|
||||
.map_rgb = grub_video_fb_map_rgb,
|
||||
.map_rgba = grub_video_fb_map_rgba,
|
||||
|
|
|
@ -586,6 +586,10 @@ static struct grub_video_adapter grub_video_gop_adapter =
|
|||
.get_palette = grub_video_fb_get_palette,
|
||||
.set_viewport = grub_video_fb_set_viewport,
|
||||
.get_viewport = grub_video_fb_get_viewport,
|
||||
.set_region = grub_video_fb_set_region,
|
||||
.get_region = grub_video_fb_get_region,
|
||||
.set_area_status = grub_video_fb_set_area_status,
|
||||
.get_area_status = grub_video_fb_get_area_status,
|
||||
.map_color = grub_video_fb_map_color,
|
||||
.map_rgb = grub_video_fb_map_rgb,
|
||||
.map_rgba = grub_video_fb_map_rgba,
|
||||
|
|
|
@ -327,6 +327,10 @@ static struct grub_video_adapter grub_video_uga_adapter =
|
|||
.get_palette = grub_video_fb_get_palette,
|
||||
.set_viewport = grub_video_fb_set_viewport,
|
||||
.get_viewport = grub_video_fb_get_viewport,
|
||||
.set_region = grub_video_fb_set_region,
|
||||
.get_region = grub_video_fb_get_region,
|
||||
.set_area_status = grub_video_fb_set_area_status,
|
||||
.get_area_status = grub_video_fb_get_area_status,
|
||||
.map_color = grub_video_fb_map_color,
|
||||
.map_rgb = grub_video_fb_map_rgb,
|
||||
.map_rgba = grub_video_fb_map_rgba,
|
||||
|
|
|
@ -220,6 +220,10 @@ static struct grub_video_adapter grub_video_sdl_adapter =
|
|||
.get_palette = grub_video_fb_get_palette,
|
||||
.set_viewport = grub_video_fb_set_viewport,
|
||||
.get_viewport = grub_video_fb_get_viewport,
|
||||
.set_region = grub_video_fb_set_region,
|
||||
.get_region = grub_video_fb_get_region,
|
||||
.set_area_status = grub_video_fb_set_area_status,
|
||||
.get_area_status = grub_video_fb_get_area_status,
|
||||
.map_color = grub_video_fb_map_color,
|
||||
.map_rgb = grub_video_fb_map_rgb,
|
||||
.map_rgba = grub_video_fb_map_rgba,
|
||||
|
|
|
@ -399,12 +399,67 @@ grub_video_fb_set_palette (unsigned int start, unsigned int count,
|
|||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_video_fb_set_area (void)
|
||||
{
|
||||
unsigned int viewport_x1 = framebuffer.render_target->viewport.x;
|
||||
unsigned int viewport_y1 = framebuffer.render_target->viewport.y;
|
||||
unsigned int viewport_width = framebuffer.render_target->viewport.width;
|
||||
unsigned int viewport_height = framebuffer.render_target->viewport.height;
|
||||
unsigned int viewport_x2 = viewport_x1 + viewport_width;
|
||||
unsigned int viewport_y2 = viewport_y1 + viewport_height;
|
||||
|
||||
unsigned int region_x1 = framebuffer.render_target->region.x;
|
||||
unsigned int region_y1 = framebuffer.render_target->region.y;
|
||||
unsigned int region_width = framebuffer.render_target->region.width;
|
||||
unsigned int region_height = framebuffer.render_target->region.height;
|
||||
unsigned int region_x2 = region_x1 + region_width;
|
||||
unsigned int region_y2 = region_y1 + region_height;
|
||||
|
||||
unsigned int max_x1 = grub_max (viewport_x1, region_x1);
|
||||
unsigned int min_x2 = grub_min (viewport_x2, region_x2);
|
||||
unsigned int max_y1 = grub_max (viewport_y1, region_y1);
|
||||
unsigned int min_y2 = grub_min (viewport_y2, region_y2);
|
||||
|
||||
/* Viewport and region do not intersect. */
|
||||
if (viewport_width == 0 || viewport_height == 0 || region_width == 0
|
||||
|| region_height == 0 || max_x1 >= min_x2 || max_y1 >= min_y2)
|
||||
{
|
||||
framebuffer.render_target->area.x = 0;
|
||||
framebuffer.render_target->area.y = 0;
|
||||
framebuffer.render_target->area.width = 0;
|
||||
framebuffer.render_target->area.height = 0;
|
||||
framebuffer.render_target->area_offset_x = 0;
|
||||
framebuffer.render_target->area_offset_y = 0;
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
/* There is non-zero intersection. */
|
||||
framebuffer.render_target->area.x = max_x1;
|
||||
framebuffer.render_target->area.y = max_y1;
|
||||
framebuffer.render_target->area.width = min_x2 - max_x1;
|
||||
framebuffer.render_target->area.height = min_y2 - max_y1;
|
||||
|
||||
if (region_x1 > viewport_x1)
|
||||
framebuffer.render_target->area_offset_x = (int)region_x1
|
||||
- (int)viewport_x1;
|
||||
else
|
||||
framebuffer.render_target->area_offset_x = 0;
|
||||
if (region_y1 > viewport_y1)
|
||||
framebuffer.render_target->area_offset_y = (int)region_y1
|
||||
- (int)viewport_y1;
|
||||
else
|
||||
framebuffer.render_target->area_offset_y = 0;
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
grub_err_t
|
||||
grub_video_fb_set_viewport (unsigned int x, unsigned int y,
|
||||
unsigned int width, unsigned int height)
|
||||
{
|
||||
/* Make sure viewport is withing screen dimensions. If viewport was set
|
||||
to be out of the region, mark its size as zero. */
|
||||
/* Make sure viewport is within screen dimensions. If viewport was set
|
||||
to be out of the screen, mark its size as zero. */
|
||||
if (x > framebuffer.render_target->mode_info.width)
|
||||
{
|
||||
x = 0;
|
||||
|
@ -428,6 +483,10 @@ grub_video_fb_set_viewport (unsigned int x, unsigned int y,
|
|||
framebuffer.render_target->viewport.width = width;
|
||||
framebuffer.render_target->viewport.height = height;
|
||||
|
||||
/* Count drawing area only if needed. */
|
||||
if (framebuffer.render_target->area_enabled)
|
||||
grub_video_fb_set_area ();
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
|
@ -443,6 +502,78 @@ grub_video_fb_get_viewport (unsigned int *x, unsigned int *y,
|
|||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
grub_err_t
|
||||
grub_video_fb_set_region (unsigned int x, unsigned int y,
|
||||
unsigned int width, unsigned int height)
|
||||
{
|
||||
/* Make sure region is within screen dimensions. If region was set
|
||||
to be out of the screen, mark its size as zero. */
|
||||
if (x > framebuffer.render_target->mode_info.width)
|
||||
{
|
||||
x = 0;
|
||||
width = 0;
|
||||
}
|
||||
|
||||
if (y > framebuffer.render_target->mode_info.height)
|
||||
{
|
||||
y = 0;
|
||||
height = 0;
|
||||
}
|
||||
|
||||
if (x + width > framebuffer.render_target->mode_info.width)
|
||||
width = framebuffer.render_target->mode_info.width - x;
|
||||
|
||||
if (y + height > framebuffer.render_target->mode_info.height)
|
||||
height = framebuffer.render_target->mode_info.height - y;
|
||||
|
||||
framebuffer.render_target->region.x = x;
|
||||
framebuffer.render_target->region.y = y;
|
||||
framebuffer.render_target->region.width = width;
|
||||
framebuffer.render_target->region.height = height;
|
||||
|
||||
/* If we have called set_region then area is needed. */
|
||||
grub_video_fb_set_area ();
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
grub_err_t
|
||||
grub_video_fb_get_region (unsigned int *x, unsigned int *y,
|
||||
unsigned int *width, unsigned int *height)
|
||||
{
|
||||
if (x) *x = framebuffer.render_target->region.x;
|
||||
if (y) *y = framebuffer.render_target->region.y;
|
||||
if (width) *width = framebuffer.render_target->region.width;
|
||||
if (height) *height = framebuffer.render_target->region.height;
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
grub_err_t
|
||||
grub_video_fb_set_area_status (grub_video_area_status_t area_status)
|
||||
{
|
||||
if (area_status == GRUB_VIDEO_AREA_ENABLED)
|
||||
framebuffer.render_target->area_enabled = 1;
|
||||
else
|
||||
framebuffer.render_target->area_enabled = 0;
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
grub_err_t
|
||||
grub_video_fb_get_area_status (grub_video_area_status_t *area_status)
|
||||
{
|
||||
if (!area_status)
|
||||
return GRUB_ERR_NONE;
|
||||
|
||||
if (framebuffer.render_target->area_enabled)
|
||||
*area_status = GRUB_VIDEO_AREA_ENABLED;
|
||||
else
|
||||
*area_status = GRUB_VIDEO_AREA_DISABLED;
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
/* Maps color name to target optimized color format. */
|
||||
grub_video_color_t
|
||||
grub_video_fb_map_color (grub_uint32_t color_name)
|
||||
|
@ -714,14 +845,36 @@ grub_video_fb_fill_rect (grub_video_color_t color, int x, int y,
|
|||
unsigned int width, unsigned int height)
|
||||
{
|
||||
struct grub_video_fbblit_info target;
|
||||
unsigned int area_x;
|
||||
unsigned int area_y;
|
||||
unsigned int area_width;
|
||||
unsigned int area_height;
|
||||
if (framebuffer.render_target->area_enabled)
|
||||
{
|
||||
area_x = framebuffer.render_target->area.x;
|
||||
area_y = framebuffer.render_target->area.y;
|
||||
area_width = framebuffer.render_target->area.width;
|
||||
area_height = framebuffer.render_target->area.height;
|
||||
x -= framebuffer.render_target->area_offset_x;
|
||||
y -= framebuffer.render_target->area_offset_y;
|
||||
}
|
||||
else
|
||||
{
|
||||
area_x = framebuffer.render_target->viewport.x;
|
||||
area_y = framebuffer.render_target->viewport.y;
|
||||
area_width = framebuffer.render_target->viewport.width;
|
||||
area_height = framebuffer.render_target->viewport.height;
|
||||
}
|
||||
|
||||
/* Make sure there is something to do. */
|
||||
if ((x >= (int)framebuffer.render_target->viewport.width) || (x + (int)width < 0))
|
||||
if ((area_width == 0) || (area_height == 0))
|
||||
return GRUB_ERR_NONE;
|
||||
if ((y >= (int)framebuffer.render_target->viewport.height) || (y + (int)height < 0))
|
||||
if ((x >= (int)area_width) || (x + (int)width < 0))
|
||||
return GRUB_ERR_NONE;
|
||||
if ((y >= (int)area_height) || (y + (int)height < 0))
|
||||
return GRUB_ERR_NONE;
|
||||
|
||||
/* Do not allow drawing out of viewport. */
|
||||
/* Do not allow drawing out of area. */
|
||||
if (x < 0)
|
||||
{
|
||||
width += x;
|
||||
|
@ -733,14 +886,14 @@ grub_video_fb_fill_rect (grub_video_color_t color, int x, int y,
|
|||
y = 0;
|
||||
}
|
||||
|
||||
if ((x + width) > framebuffer.render_target->viewport.width)
|
||||
width = framebuffer.render_target->viewport.width - x;
|
||||
if ((y + height) > framebuffer.render_target->viewport.height)
|
||||
height = framebuffer.render_target->viewport.height - y;
|
||||
if ((x + width) > area_width)
|
||||
width = area_width - x;
|
||||
if ((y + height) > area_height)
|
||||
height = area_height - y;
|
||||
|
||||
/* Add viewport offset. */
|
||||
x += framebuffer.render_target->viewport.x;
|
||||
y += framebuffer.render_target->viewport.y;
|
||||
/* Add area offset. */
|
||||
x += area_x;
|
||||
y += area_y;
|
||||
|
||||
dirty (y, height);
|
||||
|
||||
|
@ -760,13 +913,33 @@ grub_video_fb_blit_source (struct grub_video_fbblit_info *source,
|
|||
unsigned int width, unsigned int height)
|
||||
{
|
||||
struct grub_video_fbblit_info target;
|
||||
unsigned int area_x;
|
||||
unsigned int area_y;
|
||||
unsigned int area_width;
|
||||
unsigned int area_height;
|
||||
if (framebuffer.render_target->area_enabled)
|
||||
{
|
||||
area_x = framebuffer.render_target->area.x;
|
||||
area_y = framebuffer.render_target->area.y;
|
||||
area_width = framebuffer.render_target->area.width;
|
||||
area_height = framebuffer.render_target->area.height;
|
||||
x -= framebuffer.render_target->area_offset_x;
|
||||
y -= framebuffer.render_target->area_offset_y;
|
||||
}
|
||||
else
|
||||
{
|
||||
area_x = framebuffer.render_target->viewport.x;
|
||||
area_y = framebuffer.render_target->viewport.y;
|
||||
area_width = framebuffer.render_target->viewport.width;
|
||||
area_height = framebuffer.render_target->viewport.height;
|
||||
}
|
||||
|
||||
/* Make sure there is something to do. */
|
||||
if ((width == 0) || (height == 0))
|
||||
if ((area_width == 0) || (area_height == 0) || (width == 0) || (height == 0))
|
||||
return GRUB_ERR_NONE;
|
||||
if ((x >= (int)framebuffer.render_target->viewport.width) || (x + (int)width < 0))
|
||||
if ((x >= (int)area_width) || (x + (int)width < 0))
|
||||
return GRUB_ERR_NONE;
|
||||
if ((y >= (int)framebuffer.render_target->viewport.height) || (y + (int)height < 0))
|
||||
if ((y >= (int)area_height) || (y + (int)height < 0))
|
||||
return GRUB_ERR_NONE;
|
||||
if ((x + (int)source->mode_info->width) < 0)
|
||||
return GRUB_ERR_NONE;
|
||||
|
@ -808,11 +981,11 @@ grub_video_fb_blit_source (struct grub_video_fbblit_info *source,
|
|||
y = 0;
|
||||
}
|
||||
|
||||
/* Do not allow drawing out of viewport. */
|
||||
if ((x + width) > framebuffer.render_target->viewport.width)
|
||||
width = framebuffer.render_target->viewport.width - x;
|
||||
if ((y + height) > framebuffer.render_target->viewport.height)
|
||||
height = framebuffer.render_target->viewport.height - y;
|
||||
/* Do not allow drawing out of area. */
|
||||
if ((x + width) > area_width)
|
||||
width = area_width - x;
|
||||
if ((y + height) > area_height)
|
||||
height = area_height - y;
|
||||
|
||||
if ((offset_x + width) > source->mode_info->width)
|
||||
width = source->mode_info->width - offset_x;
|
||||
|
@ -827,8 +1000,8 @@ grub_video_fb_blit_source (struct grub_video_fbblit_info *source,
|
|||
height = source->mode_info->height;
|
||||
|
||||
/* Add viewport offset. */
|
||||
x += framebuffer.render_target->viewport.x;
|
||||
y += framebuffer.render_target->viewport.y;
|
||||
x += area_x;
|
||||
y += area_y;
|
||||
|
||||
/* Use fbblit_info to encapsulate rendering. */
|
||||
target.mode_info = &framebuffer.render_target->mode_info;
|
||||
|
@ -1058,12 +1231,25 @@ grub_video_fb_create_render_target (struct grub_video_fbrender_target **result,
|
|||
/* Mark render target as allocated. */
|
||||
target->is_allocated = 1;
|
||||
|
||||
/* Maximize viewport. */
|
||||
/* Maximize viewport, region and area. */
|
||||
target->viewport.x = 0;
|
||||
target->viewport.y = 0;
|
||||
target->viewport.width = width;
|
||||
target->viewport.height = height;
|
||||
|
||||
target->region.x = 0;
|
||||
target->region.y = 0;
|
||||
target->region.width = width;
|
||||
target->region.height = height;
|
||||
|
||||
target->area_enabled = 0;
|
||||
target->area.x = 0;
|
||||
target->area.y = 0;
|
||||
target->area.width = width;
|
||||
target->area.height = height;
|
||||
target->area_offset_x = 0;
|
||||
target->area_offset_y = 0;
|
||||
|
||||
/* Setup render target format. */
|
||||
target->mode_info.width = width;
|
||||
target->mode_info.height = height;
|
||||
|
@ -1150,12 +1336,25 @@ grub_video_fb_create_render_target_from_pointer (struct grub_video_fbrender_targ
|
|||
|
||||
grub_memcpy (&(target->mode_info), mode_info, sizeof (target->mode_info));
|
||||
|
||||
/* Reset viewport to match new mode. */
|
||||
/* Reset viewport, region and area to match new mode. */
|
||||
target->viewport.x = 0;
|
||||
target->viewport.y = 0;
|
||||
target->viewport.width = mode_info->width;
|
||||
target->viewport.height = mode_info->height;
|
||||
|
||||
target->region.x = 0;
|
||||
target->region.y = 0;
|
||||
target->region.width = mode_info->width;
|
||||
target->region.height = mode_info->height;
|
||||
|
||||
target->area_enabled = 0;
|
||||
target->area.x = 0;
|
||||
target->area.y = 0;
|
||||
target->area.width = mode_info->width;
|
||||
target->area.height = mode_info->height;
|
||||
target->area_offset_x = 0;
|
||||
target->area_offset_y = 0;
|
||||
|
||||
/* Clear render target with black and maximum transparency. */
|
||||
for (y = 0; y < mode_info->height; y++)
|
||||
grub_memset (target->data + mode_info->pitch * y, 0,
|
||||
|
|
|
@ -138,6 +138,10 @@ static struct grub_video_adapter grub_video_cbfb_adapter =
|
|||
.get_palette = grub_video_fb_get_palette,
|
||||
.set_viewport = grub_video_fb_set_viewport,
|
||||
.get_viewport = grub_video_fb_get_viewport,
|
||||
.set_region = grub_video_fb_set_region,
|
||||
.get_region = grub_video_fb_get_region,
|
||||
.set_area_status = grub_video_fb_set_area_status,
|
||||
.get_area_status = grub_video_fb_get_area_status,
|
||||
.map_color = grub_video_fb_map_color,
|
||||
.map_rgb = grub_video_fb_map_rgb,
|
||||
.map_rgba = grub_video_fb_map_rgba,
|
||||
|
|
|
@ -1214,6 +1214,10 @@ static struct grub_video_adapter grub_video_vbe_adapter =
|
|||
.get_palette = grub_video_fb_get_palette,
|
||||
.set_viewport = grub_video_fb_set_viewport,
|
||||
.get_viewport = grub_video_fb_get_viewport,
|
||||
.set_region = grub_video_fb_set_region,
|
||||
.get_region = grub_video_fb_get_region,
|
||||
.set_area_status = grub_video_fb_set_area_status,
|
||||
.get_area_status = grub_video_fb_get_area_status,
|
||||
.map_color = grub_video_fb_map_color,
|
||||
.map_rgb = grub_video_fb_map_rgb,
|
||||
.map_rgba = grub_video_fb_map_rgba,
|
||||
|
|
|
@ -372,6 +372,10 @@ static struct grub_video_adapter grub_video_vga_adapter =
|
|||
.get_palette = grub_video_fb_get_palette,
|
||||
.set_viewport = grub_video_fb_set_viewport,
|
||||
.get_viewport = grub_video_fb_get_viewport,
|
||||
.set_region = grub_video_fb_set_region,
|
||||
.get_region = grub_video_fb_get_region,
|
||||
.set_area_status = grub_video_fb_set_area_status,
|
||||
.get_area_status = grub_video_fb_get_area_status,
|
||||
.map_color = grub_video_fb_map_color,
|
||||
.map_rgb = grub_video_fb_map_rgb,
|
||||
.map_rgba = grub_video_fb_map_rgba,
|
||||
|
|
|
@ -328,6 +328,10 @@ static struct grub_video_adapter grub_video_ieee1275_adapter =
|
|||
.get_palette = grub_video_fb_get_palette,
|
||||
.set_viewport = grub_video_fb_set_viewport,
|
||||
.get_viewport = grub_video_fb_get_viewport,
|
||||
.set_region = grub_video_fb_set_region,
|
||||
.get_region = grub_video_fb_get_region,
|
||||
.set_area_status = grub_video_fb_set_area_status,
|
||||
.get_area_status = grub_video_fb_get_area_status,
|
||||
.map_color = grub_video_fb_map_color,
|
||||
.map_rgb = grub_video_fb_map_rgb,
|
||||
.map_rgba = grub_video_fb_map_rgba,
|
||||
|
|
|
@ -207,6 +207,10 @@ static struct grub_video_adapter grub_video_radeon_fuloong2e_adapter =
|
|||
.get_palette = grub_video_fb_get_palette,
|
||||
.set_viewport = grub_video_fb_set_viewport,
|
||||
.get_viewport = grub_video_fb_get_viewport,
|
||||
.set_region = grub_video_fb_set_region,
|
||||
.get_region = grub_video_fb_get_region,
|
||||
.set_area_status = grub_video_fb_set_area_status,
|
||||
.get_area_status = grub_video_fb_get_area_status,
|
||||
.map_color = grub_video_fb_map_color,
|
||||
.map_rgb = grub_video_fb_map_rgb,
|
||||
.map_rgba = grub_video_fb_map_rgba,
|
||||
|
|
|
@ -420,6 +420,10 @@ static struct grub_video_adapter grub_video_sis315pro_adapter =
|
|||
.get_palette = grub_video_fb_get_palette,
|
||||
.set_viewport = grub_video_fb_set_viewport,
|
||||
.get_viewport = grub_video_fb_get_viewport,
|
||||
.set_region = grub_video_fb_set_region,
|
||||
.get_region = grub_video_fb_get_region,
|
||||
.set_area_status = grub_video_fb_set_area_status,
|
||||
.get_area_status = grub_video_fb_get_area_status,
|
||||
.map_color = grub_video_fb_map_color,
|
||||
.map_rgb = grub_video_fb_map_rgb,
|
||||
.map_rgba = grub_video_fb_map_rgba,
|
||||
|
|
|
@ -779,6 +779,10 @@ static struct grub_video_adapter grub_video_sm712_adapter =
|
|||
.get_palette = grub_video_fb_get_palette,
|
||||
.set_viewport = grub_video_fb_set_viewport,
|
||||
.get_viewport = grub_video_fb_get_viewport,
|
||||
.set_region = grub_video_fb_set_region,
|
||||
.get_region = grub_video_fb_get_region,
|
||||
.set_area_status = grub_video_fb_set_area_status,
|
||||
.get_area_status = grub_video_fb_get_area_status,
|
||||
.map_color = grub_video_fb_map_color,
|
||||
.map_rgb = grub_video_fb_map_rgb,
|
||||
.map_rgba = grub_video_fb_map_rgba,
|
||||
|
|
|
@ -225,6 +225,48 @@ grub_video_get_viewport (unsigned int *x, unsigned int *y,
|
|||
return grub_video_adapter_active->get_viewport (x, y, width, height);
|
||||
}
|
||||
|
||||
/* Set region dimensions. */
|
||||
grub_err_t
|
||||
grub_video_set_region (unsigned int x, unsigned int y,
|
||||
unsigned int width, unsigned int height)
|
||||
{
|
||||
if (! grub_video_adapter_active)
|
||||
return grub_error (GRUB_ERR_BAD_DEVICE, "no video mode activated");
|
||||
|
||||
return grub_video_adapter_active->set_region (x, y, width, height);
|
||||
}
|
||||
|
||||
/* Get region dimensions. */
|
||||
grub_err_t
|
||||
grub_video_get_region (unsigned int *x, unsigned int *y,
|
||||
unsigned int *width, unsigned int *height)
|
||||
{
|
||||
if (! grub_video_adapter_active)
|
||||
return grub_error (GRUB_ERR_BAD_DEVICE, "no video mode activated");
|
||||
|
||||
return grub_video_adapter_active->get_region (x, y, width, height);
|
||||
}
|
||||
|
||||
/* Set status of the intersection of the viewport and the region. */
|
||||
grub_err_t
|
||||
grub_video_set_area_status (grub_video_area_status_t area_status)
|
||||
{
|
||||
if (! grub_video_adapter_active)
|
||||
return grub_error (GRUB_ERR_BAD_DEVICE, "no video mode activated");
|
||||
|
||||
return grub_video_adapter_active->set_area_status (area_status);
|
||||
}
|
||||
|
||||
/* Get status of the intersection of the viewport and the region. */
|
||||
grub_err_t
|
||||
grub_video_get_area_status (grub_video_area_status_t *area_status)
|
||||
{
|
||||
if (! grub_video_adapter_active)
|
||||
return grub_error (GRUB_ERR_BAD_DEVICE, "no video mode activated");
|
||||
|
||||
return grub_video_adapter_active->get_area_status (area_status);
|
||||
}
|
||||
|
||||
/* Map color name to adapter specific color. */
|
||||
grub_video_color_t
|
||||
grub_video_map_color (grub_uint32_t color_name)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue