~ubuntu-branches/ubuntu/trusty/grub2/trusty

« back to all changes in this revision

Viewing changes to grub-core/video/capture.c

  • Committer: Package Import Robot
  • Author(s): Colin Watson
  • Date: 2014-01-16 15:18:04 UTC
  • mfrom: (17.6.38 experimental)
  • Revision ID: package-import@ubuntu.com-20140116151804-3foouk7fpqcq3sxx
Tags: 2.02~beta2-2
* Convert patch handling to git-dpm.
* Add bi-endian support to ELF parser (Tomohiro B Berry).
* Adjust restore_mkdevicemap.patch to mark get_kfreebsd_version as static,
  to appease "gcc -Werror=missing-prototypes".
* Cherry-pick from upstream:
  - Change grub-macbless' manual page section to 8.
* Install grub-glue-efi, grub-macbless, grub-render-label, and
  grub-syslinux2cfg.
* grub-shell: Pass -no-pad to xorriso when building floppy images.

Show diffs side-by-side

added added

removed removed

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