2 * GRUB -- GRand Unified Bootloader
3 * Copyright (C) 2005,2006,2007,2008,2009 Free Software Foundation, Inc.
5 * GRUB is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
10 * GRUB is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
19 #define grub_video_render_target grub_video_fbrender_target
22 #include <grub/types.h>
24 #include <grub/misc.h>
26 #include <grub/video.h>
27 #include <grub/video_fb.h>
30 static SDL_Surface
*window
= 0;
31 static struct grub_video_render_target sdl_render_target
;
34 grub_video_sdl_set_palette (unsigned int start
, unsigned int count
,
35 struct grub_video_palette_data
*palette_data
);
38 grub_video_sdl_init (void)
41 grub_memset (&sdl_render_target
, 0, sizeof(sdl_render_target
));
43 if (SDL_Init (SDL_INIT_VIDEO
) < 0)
44 return grub_error (GRUB_ERR_BAD_DEVICE
, "Couldn't init SDL: %s",
46 /* Reset frame buffer and render target variables. */
47 grub_memset (&sdl_render_target
, 0, sizeof(sdl_render_target
));
48 return grub_video_fb_init ();
52 grub_video_sdl_fini (void)
56 grub_memset (&sdl_render_target
, 0, sizeof(sdl_render_target
));
58 return grub_video_fb_fini ();
61 static inline unsigned int
62 get_mask_size (grub_uint32_t mask
)
65 for (i
= 0; mask
> 1U << i
; i
++);
70 grub_video_sdl_setup (unsigned int width
, unsigned int height
,
71 unsigned int mode_type
)
75 /* Decode depth from mode_type. If it is zero, then autodetect. */
76 depth
= (mode_type
& GRUB_VIDEO_MODE_TYPE_DEPTH_MASK
)
77 >> GRUB_VIDEO_MODE_TYPE_DEPTH_POS
;
79 if (mode_type
& GRUB_VIDEO_MODE_TYPE_DOUBLE_BUFFERED
)
80 flags
|= SDL_DOUBLEBUF
;
82 window
= SDL_SetVideoMode (width
, height
, depth
, flags
| SDL_HWSURFACE
);
84 window
= SDL_SetVideoMode (width
, height
, depth
, flags
| SDL_SWSURFACE
);
86 return grub_error (GRUB_ERR_BAD_DEVICE
, "Couldn't open window: %s",
89 grub_memset (&sdl_render_target
, 0, sizeof (sdl_render_target
));
91 sdl_render_target
.mode_info
.width
= window
->w
;
92 sdl_render_target
.mode_info
.height
= window
->h
;
93 sdl_render_target
.mode_info
.mode_type
= 0;
94 if (window
->flags
& SDL_DOUBLEBUF
)
95 sdl_render_target
.mode_info
.mode_type
96 |= GRUB_VIDEO_MODE_TYPE_DOUBLE_BUFFERED
;
97 if (window
->format
->palette
)
98 sdl_render_target
.mode_info
.mode_type
|= GRUB_VIDEO_MODE_TYPE_INDEX_COLOR
;
100 sdl_render_target
.mode_info
.mode_type
|= GRUB_VIDEO_MODE_TYPE_RGB
;
102 sdl_render_target
.mode_info
.bpp
= window
->format
->BitsPerPixel
;
103 sdl_render_target
.mode_info
.bytes_per_pixel
= window
->format
->BytesPerPixel
;
104 sdl_render_target
.mode_info
.pitch
= window
->pitch
;
106 /* In index color mode, number of colors. In RGB mode this is 256. */
107 if (window
->format
->palette
)
108 sdl_render_target
.mode_info
.number_of_colors
109 = 1 << window
->format
->BitsPerPixel
;
111 sdl_render_target
.mode_info
.number_of_colors
= 256;
113 if (! window
->format
->palette
)
115 sdl_render_target
.mode_info
.red_mask_size
116 = get_mask_size (window
->format
->Rmask
>> window
->format
->Rshift
);
117 sdl_render_target
.mode_info
.red_field_pos
= window
->format
->Rshift
;
118 sdl_render_target
.mode_info
.green_mask_size
119 = get_mask_size (window
->format
->Gmask
>> window
->format
->Gshift
);
120 sdl_render_target
.mode_info
.green_field_pos
= window
->format
->Gshift
;
121 sdl_render_target
.mode_info
.blue_mask_size
122 = get_mask_size (window
->format
->Bmask
>> window
->format
->Bshift
);
123 sdl_render_target
.mode_info
.blue_field_pos
= window
->format
->Bshift
;
124 sdl_render_target
.mode_info
.reserved_mask_size
125 = get_mask_size (window
->format
->Amask
>> window
->format
->Ashift
);
126 sdl_render_target
.mode_info
.reserved_field_pos
= window
->format
->Ashift
;
127 sdl_render_target
.mode_info
.blit_format
128 = grub_video_get_blit_format (&sdl_render_target
.mode_info
);
131 sdl_render_target
.viewport
.x
= sdl_render_target
.viewport
.y
= 0;
132 sdl_render_target
.viewport
.width
= window
->w
;
133 sdl_render_target
.viewport
.height
= window
->h
;
134 sdl_render_target
.is_allocated
= 0;
135 sdl_render_target
.data
= window
->pixels
;
137 /* Copy default palette to initialize emulated palette. */
138 grub_video_sdl_set_palette (0, (sizeof (grub_video_fbstd_colors
)
139 / sizeof (grub_video_fbstd_colors
[0])),
140 grub_video_fbstd_colors
);
142 /* Reset render target to SDL one. */
143 return grub_video_fb_set_active_render_target (&sdl_render_target
);
147 grub_video_sdl_set_palette (unsigned int start
, unsigned int count
,
148 struct grub_video_palette_data
*palette_data
)
151 if (window
->format
->palette
)
153 SDL_Color
*tmp
= grub_malloc (count
* sizeof (tmp
[0]));
154 for (i
= 0; i
< count
; i
++)
156 tmp
[i
].r
= palette_data
[i
].r
;
157 tmp
[i
].g
= palette_data
[i
].g
;
158 tmp
[i
].b
= palette_data
[i
].b
;
159 tmp
[i
].unused
= palette_data
[i
].a
;
161 SDL_SetColors (window
, tmp
, start
, count
);
165 return grub_video_fb_set_palette (start
, count
, palette_data
);
169 grub_video_sdl_set_viewport (unsigned int x
, unsigned int y
,
170 unsigned int width
, unsigned int height
)
172 /* Make sure viewport is withing screen dimensions. If viewport was set
173 to be out of the region, mark its size as zero. */
174 if (x
> (unsigned) window
->w
)
180 if (y
> (unsigned) window
->h
)
186 if (x
+ width
> (unsigned) window
->w
)
187 width
= window
->w
- x
;
189 if (y
+ height
> (unsigned) window
->h
)
190 height
= window
->h
- y
;
191 return grub_video_fb_set_viewport (x
, y
, width
, height
);
195 grub_video_sdl_swap_buffers (void)
197 if (SDL_Flip (window
) < 0)
198 return grub_error (GRUB_ERR_BAD_DEVICE
, "couldn't swap buffers: %s",
200 return GRUB_ERR_NONE
;
204 grub_video_sdl_set_active_render_target (struct grub_video_render_target
*target
)
206 if (target
== GRUB_VIDEO_RENDER_TARGET_DISPLAY
)
207 return grub_video_fb_set_active_render_target (&sdl_render_target
);
209 return grub_video_fb_set_active_render_target (target
);
212 static grub_err_t
grub_video_sdl_enable_double_buffering (int enable
)
214 return GRUB_ERR_NONE
;
217 static struct grub_video_adapter grub_video_sdl_adapter
=
219 .name
= "SDL Video Driver",
221 .init
= grub_video_sdl_init
,
222 .fini
= grub_video_sdl_fini
,
223 .setup
= grub_video_sdl_setup
,
224 .get_info
= grub_video_fb_get_info
,
225 .set_palette
= grub_video_sdl_set_palette
,
226 .get_palette
= grub_video_fb_get_palette
,
227 .set_viewport
= grub_video_fb_set_viewport
,
228 .get_viewport
= grub_video_fb_get_viewport
,
229 .map_color
= grub_video_fb_map_color
,
230 .map_rgb
= grub_video_fb_map_rgb
,
231 .map_rgba
= grub_video_fb_map_rgba
,
232 .unmap_color
= grub_video_fb_unmap_color
,
233 .fill_rect
= grub_video_fb_fill_rect
,
234 .blit_bitmap
= grub_video_fb_blit_bitmap
,
235 .blit_render_target
= grub_video_fb_blit_render_target
,
236 .scroll
= grub_video_fb_scroll
,
237 .swap_buffers
= grub_video_sdl_swap_buffers
,
238 .create_render_target
= grub_video_fb_create_render_target
,
239 .delete_render_target
= grub_video_fb_delete_render_target
,
240 .set_active_render_target
= grub_video_sdl_set_active_render_target
,
241 .get_active_render_target
= grub_video_fb_get_active_render_target
,
242 .enable_double_buffering
= grub_video_sdl_enable_double_buffering
,
248 grub_video_register (&grub_video_sdl_adapter
);
253 grub_video_unregister (&grub_video_sdl_adapter
);