]> git.proxmox.com Git - grub2.git/blob - grub-core/video/capture.c
Import grub2_2.02+dfsg1.orig.tar.xz
[grub2.git] / grub-core / video / capture.c
1
2 #define grub_video_render_target grub_video_fbrender_target
3
4 #include <grub/video.h>
5 #include <grub/video_fb.h>
6 #include <grub/mm.h>
7 #include <grub/misc.h>
8
9 static struct
10 {
11 struct grub_video_mode_info mode_info;
12 struct grub_video_render_target *render_target;
13 grub_uint8_t *ptr;
14 } framebuffer;
15
16 void (*grub_video_capture_refresh_cb) (void);
17
18 static grub_err_t
19 grub_video_capture_swap_buffers (void)
20 {
21 if (grub_video_capture_refresh_cb)
22 grub_video_capture_refresh_cb ();
23 return GRUB_ERR_NONE;
24 }
25
26 static grub_err_t
27 grub_video_capture_set_active_render_target (struct grub_video_render_target *target)
28 {
29 if (target == GRUB_VIDEO_RENDER_TARGET_DISPLAY)
30 target = framebuffer.render_target;
31
32 return grub_video_fb_set_active_render_target (target);
33 }
34
35 static grub_err_t
36 grub_video_capture_fini (void)
37 {
38 return GRUB_ERR_NONE;
39 }
40
41 static struct grub_video_adapter grub_video_capture_adapter =
42 {
43 .name = "Render capture",
44
45 .prio = 0,
46 .id = GRUB_VIDEO_ADAPTER_CAPTURE,
47
48 .fini = grub_video_capture_fini,
49 .get_info = grub_video_fb_get_info,
50 .get_info_and_fini = 0,
51 .set_palette = grub_video_fb_set_palette,
52 .get_palette = grub_video_fb_get_palette,
53 .set_viewport = grub_video_fb_set_viewport,
54 .get_viewport = grub_video_fb_get_viewport,
55 .set_region = grub_video_fb_set_region,
56 .get_region = grub_video_fb_get_region,
57 .set_area_status = grub_video_fb_set_area_status,
58 .get_area_status = grub_video_fb_get_area_status,
59 .map_color = grub_video_fb_map_color,
60 .map_rgb = grub_video_fb_map_rgb,
61 .map_rgba = grub_video_fb_map_rgba,
62 .unmap_color = grub_video_fb_unmap_color,
63 .fill_rect = grub_video_fb_fill_rect,
64 .blit_bitmap = grub_video_fb_blit_bitmap,
65 .blit_render_target = grub_video_fb_blit_render_target,
66 .scroll = grub_video_fb_scroll,
67 .swap_buffers = grub_video_capture_swap_buffers,
68 .create_render_target = grub_video_fb_create_render_target,
69 .delete_render_target = grub_video_fb_delete_render_target,
70 .set_active_render_target = grub_video_capture_set_active_render_target,
71 .get_active_render_target = grub_video_fb_get_active_render_target,
72
73 .next = 0
74 };
75
76 static struct grub_video_adapter *saved;
77 static struct grub_video_mode_info saved_mode_info;
78
79 grub_err_t
80 grub_video_capture_start (const struct grub_video_mode_info *mode_info,
81 struct grub_video_palette_data *palette,
82 unsigned int palette_size)
83 {
84 grub_err_t err;
85 grub_memset (&framebuffer, 0, sizeof (framebuffer));
86
87 grub_video_fb_init ();
88
89 framebuffer.mode_info = *mode_info;
90 framebuffer.mode_info.blit_format = grub_video_get_blit_format (&framebuffer.mode_info);
91
92 framebuffer.ptr = grub_malloc (framebuffer.mode_info.height * framebuffer.mode_info.pitch);
93 if (!framebuffer.ptr)
94 return grub_errno;
95
96 err = grub_video_fb_create_render_target_from_pointer (&framebuffer.render_target,
97 &framebuffer.mode_info,
98 framebuffer.ptr);
99 if (err)
100 return err;
101 err = grub_video_fb_set_active_render_target (framebuffer.render_target);
102 if (err)
103 return err;
104 err = grub_video_fb_set_palette (0, palette_size, palette);
105 if (err)
106 return err;
107
108 saved = grub_video_adapter_active;
109 if (saved)
110 {
111 grub_video_get_info (&saved_mode_info);
112 if (saved->fini)
113 saved->fini ();
114 }
115 grub_video_adapter_active = &grub_video_capture_adapter;
116
117 return GRUB_ERR_NONE;
118 }
119
120 void *
121 grub_video_capture_get_framebuffer (void)
122 {
123 return framebuffer.ptr;
124 }
125
126 void
127 grub_video_capture_end (void)
128 {
129 grub_video_fb_delete_render_target (framebuffer.render_target);
130 grub_free (framebuffer.ptr);
131 grub_video_fb_fini ();
132 grub_video_adapter_active = saved;
133 if (saved)
134 {
135 if (saved->init)
136 saved->init ();
137 if (saved->setup)
138 saved->setup (saved_mode_info.width, saved_mode_info.height, 0, 0);
139 }
140 }