static grub_err_t grub_video_cbfb_fill_mode_info (struct grub_video_mode_info *out) { grub_memset (out, 0, sizeof (*out)); out->width = grub_video_coreboot_fbtable->width; out->height = grub_video_coreboot_fbtable->height; out->pitch = grub_video_coreboot_fbtable->pitch; out->red_field_pos = grub_video_coreboot_fbtable->red_field_pos; out->red_mask_size = grub_video_coreboot_fbtable->red_mask_size; out->green_field_pos = grub_video_coreboot_fbtable->green_field_pos; out->green_mask_size = grub_video_coreboot_fbtable->green_mask_size; out->blue_field_pos = grub_video_coreboot_fbtable->blue_field_pos; out->blue_mask_size = grub_video_coreboot_fbtable->blue_mask_size; out->reserved_field_pos = grub_video_coreboot_fbtable->reserved_field_pos; out->reserved_mask_size = grub_video_coreboot_fbtable->reserved_mask_size; out->mode_type = GRUB_VIDEO_MODE_TYPE_RGB; out->bpp = grub_video_coreboot_fbtable->bpp; out->bytes_per_pixel = (grub_video_coreboot_fbtable->bpp + 7) / 8; out->number_of_colors = 256; out->blit_format = grub_video_get_blit_format (out); return GRUB_ERR_NONE; }
static grub_err_t grub_video_ieee1275_fill_mode_info (grub_ieee1275_phandle_t dev, struct grub_video_mode_info *out) { grub_uint32_t tmp; grub_memset (out, 0, sizeof (*out)); if (grub_ieee1275_get_integer_property (dev, "width", &tmp, sizeof (tmp), 0)) return grub_error (GRUB_ERR_IO, "Couldn't retrieve display width."); out->width = tmp; if (grub_ieee1275_get_integer_property (dev, "height", &tmp, sizeof (tmp), 0)) return grub_error (GRUB_ERR_IO, "Couldn't retrieve display height."); out->height = tmp; if (grub_ieee1275_get_integer_property (dev, "linebytes", &tmp, sizeof (tmp), 0)) return grub_error (GRUB_ERR_IO, "Couldn't retrieve display pitch."); out->pitch = tmp; out->mode_type = GRUB_VIDEO_MODE_TYPE_INDEX_COLOR; out->bpp = 8; out->bytes_per_pixel = 1; out->number_of_colors = 256; out->blit_format = grub_video_get_blit_format (out); return GRUB_ERR_NONE; }
static grub_err_t grub_video_gop_fill_mode_info (unsigned mode, struct grub_efi_gop_mode_info *in, struct grub_video_mode_info *out) { out->mode_number = mode; out->number_of_colors = 256; out->width = in->width; out->height = in->height; out->mode_type = GRUB_VIDEO_MODE_TYPE_RGB; out->bpp = grub_video_gop_get_bpp (in); out->bytes_per_pixel = out->bpp >> 3; if (!out->bpp) return grub_error (GRUB_ERR_IO, "unsupported video mode"); out->pitch = in->pixels_per_scanline * out->bytes_per_pixel; switch (in->pixel_format) { case GRUB_EFI_GOT_RGBA8: out->red_mask_size = 8; out->red_field_pos = 0; out->green_mask_size = 8; out->green_field_pos = 8; out->blue_mask_size = 8; out->blue_field_pos = 16; out->reserved_mask_size = 8; out->reserved_field_pos = 24; break; case GRUB_EFI_GOT_BGRA8: out->red_mask_size = 8; out->red_field_pos = 16; out->green_mask_size = 8; out->green_field_pos = 8; out->blue_mask_size = 8; out->blue_field_pos = 0; out->reserved_mask_size = 8; out->reserved_field_pos = 24; break; case GRUB_EFI_GOT_BITMASK: grub_video_gop_get_bitmask (in->pixel_bitmask.r, &out->red_mask_size, &out->red_field_pos); grub_video_gop_get_bitmask (in->pixel_bitmask.g, &out->green_mask_size, &out->green_field_pos); grub_video_gop_get_bitmask (in->pixel_bitmask.b, &out->blue_mask_size, &out->blue_field_pos); grub_video_gop_get_bitmask (in->pixel_bitmask.a, &out->reserved_mask_size, &out->reserved_field_pos); break; default: return grub_error (GRUB_ERR_IO, "unsupported video mode"); } out->blit_format = grub_video_get_blit_format (out); return GRUB_ERR_NONE; }
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; }
static grub_err_t grub_video_sdl_setup (unsigned int width, unsigned int height, unsigned int mode_type, unsigned int mode_mask __attribute__ ((unused))) { int depth; int flags = 0; grub_err_t err; /* Decode depth from mode_type. If it is zero, then autodetect. */ depth = (mode_type & GRUB_VIDEO_MODE_TYPE_DEPTH_MASK) >> GRUB_VIDEO_MODE_TYPE_DEPTH_POS; if ((depth == 0) || (depth == 32)) depth = 24; if (width == 0 && height == 0) { width = 800; height = 600; } if ((mode_type & GRUB_VIDEO_MODE_TYPE_DOUBLE_BUFFERED) || !(mode_mask & GRUB_VIDEO_MODE_TYPE_DOUBLE_BUFFERED)) flags |= SDL_DOUBLEBUF; window = SDL_SetVideoMode (width, height, depth, flags | SDL_HWSURFACE); if (! window) window = SDL_SetVideoMode (width, height, depth, flags | SDL_SWSURFACE); if (! window) return grub_error (GRUB_ERR_BAD_DEVICE, "Couldn't open window: %s", SDL_GetError ()); grub_memset (&sdl_render_target, 0, sizeof (sdl_render_target)); mode_info.width = window->w; mode_info.height = window->h; mode_info.mode_type = 0; if (window->flags & SDL_DOUBLEBUF) mode_info.mode_type |= GRUB_VIDEO_MODE_TYPE_DOUBLE_BUFFERED; if (window->format->palette) mode_info.mode_type |= GRUB_VIDEO_MODE_TYPE_INDEX_COLOR; else mode_info.mode_type |= GRUB_VIDEO_MODE_TYPE_RGB; mode_info.bpp = window->format->BitsPerPixel; mode_info.bytes_per_pixel = window->format->BytesPerPixel; mode_info.pitch = window->pitch; /* In index color mode, number of colors. In RGB mode this is 256. */ if (window->format->palette) mode_info.number_of_colors = 1 << window->format->BitsPerPixel; else mode_info.number_of_colors = 256; if (! window->format->palette) { mode_info.red_mask_size = get_mask_size (window->format->Rmask >> window->format->Rshift); mode_info.red_field_pos = window->format->Rshift; mode_info.green_mask_size = get_mask_size (window->format->Gmask >> window->format->Gshift); mode_info.green_field_pos = window->format->Gshift; mode_info.blue_mask_size = get_mask_size (window->format->Bmask >> window->format->Bshift); mode_info.blue_field_pos = window->format->Bshift; mode_info.reserved_mask_size = get_mask_size (window->format->Amask >> window->format->Ashift); mode_info.reserved_field_pos = window->format->Ashift; mode_info.blit_format = grub_video_get_blit_format (&mode_info); }