First automated video test (running videotest and comparing results)
This commit is contained in:
parent
cd0f6eec7b
commit
5036166022
16 changed files with 1150 additions and 97 deletions
128
grub-core/video/capture.c
Normal file
128
grub-core/video/capture.c
Normal file
|
@ -0,0 +1,128 @@
|
|||
|
||||
#define grub_video_render_target grub_video_fbrender_target
|
||||
|
||||
#include <grub/video.h>
|
||||
#include <grub/video_fb.h>
|
||||
#include <grub/mm.h>
|
||||
|
||||
static struct
|
||||
{
|
||||
struct grub_video_mode_info mode_info;
|
||||
struct grub_video_render_target *render_target;
|
||||
grub_uint8_t *ptr;
|
||||
} framebuffer;
|
||||
|
||||
void (*grub_video_capture_refresh_cb) (void);
|
||||
|
||||
static grub_err_t
|
||||
grub_video_capture_swap_buffers (void)
|
||||
{
|
||||
if (grub_video_capture_refresh_cb)
|
||||
grub_video_capture_refresh_cb ();
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_video_capture_set_active_render_target (struct grub_video_render_target *target)
|
||||
{
|
||||
if (target == GRUB_VIDEO_RENDER_TARGET_DISPLAY)
|
||||
target = framebuffer.render_target;
|
||||
|
||||
return grub_video_fb_set_active_render_target (target);
|
||||
}
|
||||
|
||||
static struct grub_video_adapter grub_video_capture_adapter =
|
||||
{
|
||||
.name = "Render capture",
|
||||
|
||||
.prio = 0,
|
||||
.id = GRUB_VIDEO_ADAPTER_CAPTURE,
|
||||
|
||||
.fini = grub_video_fb_fini,
|
||||
.get_info = grub_video_fb_get_info,
|
||||
.get_info_and_fini = 0,
|
||||
.set_palette = grub_video_fb_set_palette,
|
||||
.get_palette = grub_video_fb_get_palette,
|
||||
.set_viewport = grub_video_fb_set_viewport,
|
||||
.get_viewport = grub_video_fb_get_viewport,
|
||||
.map_color = grub_video_fb_map_color,
|
||||
.map_rgb = grub_video_fb_map_rgb,
|
||||
.map_rgba = grub_video_fb_map_rgba,
|
||||
.unmap_color = grub_video_fb_unmap_color,
|
||||
.fill_rect = grub_video_fb_fill_rect,
|
||||
.blit_bitmap = grub_video_fb_blit_bitmap,
|
||||
.blit_render_target = grub_video_fb_blit_render_target,
|
||||
.scroll = grub_video_fb_scroll,
|
||||
.swap_buffers = grub_video_capture_swap_buffers,
|
||||
.create_render_target = grub_video_fb_create_render_target,
|
||||
.delete_render_target = grub_video_fb_delete_render_target,
|
||||
.set_active_render_target = grub_video_capture_set_active_render_target,
|
||||
.get_active_render_target = grub_video_fb_get_active_render_target,
|
||||
|
||||
.next = 0
|
||||
};
|
||||
|
||||
static struct grub_video_adapter *saved;
|
||||
static struct grub_video_mode_info saved_mode_info;
|
||||
|
||||
grub_err_t
|
||||
grub_video_capture_start (const struct grub_video_mode_info *mode_info,
|
||||
struct grub_video_palette_data *palette,
|
||||
unsigned int palette_size)
|
||||
{
|
||||
grub_err_t err;
|
||||
grub_memset (&framebuffer, 0, sizeof (framebuffer));
|
||||
|
||||
grub_video_fb_init ();
|
||||
|
||||
framebuffer.mode_info = *mode_info;
|
||||
framebuffer.mode_info.blit_format = grub_video_get_blit_format (&framebuffer.mode_info);
|
||||
|
||||
framebuffer.ptr = grub_malloc (framebuffer.mode_info.height * framebuffer.mode_info.pitch);
|
||||
if (!framebuffer.ptr)
|
||||
return grub_errno;
|
||||
|
||||
err = grub_video_fb_create_render_target_from_pointer (&framebuffer.render_target,
|
||||
&framebuffer.mode_info,
|
||||
framebuffer.ptr);
|
||||
if (err)
|
||||
return err;
|
||||
err = grub_video_fb_set_active_render_target (framebuffer.render_target);
|
||||
if (err)
|
||||
return err;
|
||||
err = grub_video_fb_set_palette (0, palette_size, palette);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
saved = grub_video_adapter_active;
|
||||
if (saved)
|
||||
{
|
||||
grub_video_get_info (&saved_mode_info);
|
||||
if (saved->fini)
|
||||
saved->fini ();
|
||||
}
|
||||
grub_video_adapter_active = &grub_video_capture_adapter;
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
void *
|
||||
grub_video_capture_get_framebuffer (void)
|
||||
{
|
||||
return framebuffer.ptr;
|
||||
}
|
||||
|
||||
void
|
||||
grub_video_capture_end (void)
|
||||
{
|
||||
grub_free (framebuffer.ptr);
|
||||
grub_video_fb_fini ();
|
||||
grub_video_adapter_active = saved;
|
||||
if (saved)
|
||||
{
|
||||
if (saved->init)
|
||||
saved->init ();
|
||||
if (saved->setup)
|
||||
saved->setup (saved_mode_info.width, saved_mode_info.height, 0, 0);
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue