Reimported scaling
This commit is contained in:
parent
927d0134c7
commit
a9d407a81e
8 changed files with 490 additions and 26 deletions
|
@ -22,6 +22,7 @@
|
|||
#include <grub/mm.h>
|
||||
#include <grub/cpu/xnu.h>
|
||||
#include <grub/video_fb.h>
|
||||
#include <grub/bitmap_scale.h>
|
||||
|
||||
#define min(a,b) (((a) < (b)) ? (a) : (b))
|
||||
#define max(a,b) (((a) > (b)) ? (a) : (b))
|
||||
|
@ -37,6 +38,7 @@ grub_xnu_set_video (struct grub_xnu_boot_params *params)
|
|||
char *tmp, *modevar;
|
||||
void *framebuffer;
|
||||
grub_err_t err;
|
||||
struct grub_video_bitmap *bitmap = NULL;
|
||||
|
||||
modevar = grub_env_get ("gfxpayload");
|
||||
/* Consider only graphical 32-bit deep modes. */
|
||||
|
@ -63,31 +65,46 @@ grub_xnu_set_video (struct grub_xnu_boot_params *params)
|
|||
if (err)
|
||||
return err;
|
||||
|
||||
ret = grub_video_get_info (&mode_info);
|
||||
if (ret)
|
||||
return grub_error (GRUB_ERR_IO, "couldn't retrieve video parameters");
|
||||
|
||||
if (grub_xnu_bitmap)
|
||||
{
|
||||
if (grub_xnu_bitmap_mode == GRUB_XNU_BITMAP_STRETCH)
|
||||
err = grub_video_bitmap_create_scaled (&bitmap,
|
||||
mode_info.width,
|
||||
mode_info.height,
|
||||
grub_xnu_bitmap,
|
||||
GRUB_VIDEO_BITMAP_SCALE_METHOD_BEST);
|
||||
else
|
||||
bitmap = grub_xnu_bitmap;
|
||||
}
|
||||
|
||||
if (bitmap)
|
||||
{
|
||||
int x, y;
|
||||
|
||||
x = mode_info.width - grub_xnu_bitmap->mode_info.width;
|
||||
x = mode_info.width - bitmap->mode_info.width;
|
||||
x /= 2;
|
||||
y = mode_info.height - grub_xnu_bitmap->mode_info.height;
|
||||
y = mode_info.height - bitmap->mode_info.height;
|
||||
y /= 2;
|
||||
err = grub_video_blit_bitmap (grub_xnu_bitmap,
|
||||
err = grub_video_blit_bitmap (bitmap,
|
||||
GRUB_VIDEO_BLIT_REPLACE,
|
||||
x > 0 ? x : 0,
|
||||
y > 0 ? y : 0,
|
||||
x < 0 ? -x : 0,
|
||||
y < 0 ? -y : 0,
|
||||
min (grub_xnu_bitmap->mode_info.width,
|
||||
min (bitmap->mode_info.width,
|
||||
mode_info.width),
|
||||
min (grub_xnu_bitmap->mode_info.height,
|
||||
min (bitmap->mode_info.height,
|
||||
mode_info.height));
|
||||
if (err)
|
||||
{
|
||||
grub_print_error ();
|
||||
grub_errno = GRUB_ERR_NONE;
|
||||
grub_xnu_bitmap = 0;
|
||||
}
|
||||
err = GRUB_ERR_NONE;
|
||||
}
|
||||
if (err)
|
||||
{
|
||||
grub_print_error ();
|
||||
grub_errno = GRUB_ERR_NONE;
|
||||
bitmap = 0;
|
||||
}
|
||||
|
||||
ret = grub_video_get_info_and_fini (&mode_info, &framebuffer);
|
||||
|
@ -100,8 +117,8 @@ grub_xnu_set_video (struct grub_xnu_boot_params *params)
|
|||
params->lfb_line_len = mode_info.pitch;
|
||||
|
||||
params->lfb_base = PTR_TO_UINT32 (framebuffer);
|
||||
params->lfb_mode = grub_xnu_bitmap
|
||||
? GRUB_XNU_VIDEO_SPLASH : GRUB_XNU_VIDEO_TEXT_IN_VIDEO;
|
||||
params->lfb_mode = bitmap ? GRUB_XNU_VIDEO_SPLASH
|
||||
: GRUB_XNU_VIDEO_TEXT_IN_VIDEO;
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue