~ubuntu-branches/debian/stretch/grub2/stretch

« back to all changes in this revision

Viewing changes to loader/i386/xnu.c

Tags: upstream-1.98+20100705
ImportĀ upstreamĀ versionĀ 1.98+20100705

Show diffs side-by-side

added added

removed removed

Lines of Context:
33
33
#include <grub/command.h>
34
34
#include <grub/gzio.h>
35
35
#include <grub/i18n.h>
 
36
#include <grub/bitmap_scale.h>
 
37
 
 
38
#define min(a,b) (((a) < (b)) ? (a) : (b))
 
39
#define max(a,b) (((a) > (b)) ? (a) : (b))
 
40
 
 
41
#define DEFAULT_VIDEO_MODE "auto"
36
42
 
37
43
char grub_xnu_cmdline[1024];
38
44
grub_uint32_t grub_xnu_heap_will_be_at;
838
844
                                state); 
839
845
}
840
846
 
 
847
/* Setup video for xnu. */
 
848
static grub_err_t
 
849
grub_xnu_set_video (struct grub_xnu_boot_params *params)
 
850
{
 
851
  struct grub_video_mode_info mode_info;
 
852
  int ret;
 
853
  char *tmp;
 
854
  const char *modevar;
 
855
  void *framebuffer;
 
856
  grub_err_t err;
 
857
  struct grub_video_bitmap *bitmap = NULL;
 
858
 
 
859
  modevar = grub_env_get ("gfxpayload");
 
860
  /* Consider only graphical 32-bit deep modes.  */
 
861
  if (! modevar || *modevar == 0)
 
862
    err = grub_video_set_mode (DEFAULT_VIDEO_MODE,
 
863
                               GRUB_VIDEO_MODE_TYPE_PURE_TEXT
 
864
                               | GRUB_VIDEO_MODE_TYPE_DEPTH_MASK,
 
865
                               32 << GRUB_VIDEO_MODE_TYPE_DEPTH_POS);
 
866
  else
 
867
    {
 
868
      tmp = grub_xasprintf ("%s;" DEFAULT_VIDEO_MODE, modevar);
 
869
      if (! tmp)
 
870
        return grub_errno;
 
871
      err = grub_video_set_mode (tmp,
 
872
                                 GRUB_VIDEO_MODE_TYPE_PURE_TEXT
 
873
                                 | GRUB_VIDEO_MODE_TYPE_DEPTH_MASK,
 
874
                                 32 << GRUB_VIDEO_MODE_TYPE_DEPTH_POS);
 
875
      grub_free (tmp);
 
876
    }
 
877
 
 
878
  if (err)
 
879
    return err;
 
880
 
 
881
  ret = grub_video_get_info (&mode_info);
 
882
  if (ret)
 
883
    return grub_error (GRUB_ERR_IO, "couldn't retrieve video parameters");
 
884
 
 
885
  if (grub_xnu_bitmap)
 
886
    {
 
887
      if (grub_xnu_bitmap_mode == GRUB_XNU_BITMAP_STRETCH)
 
888
        err = grub_video_bitmap_create_scaled (&bitmap,
 
889
                                               mode_info.width,
 
890
                                               mode_info.height,
 
891
                                               grub_xnu_bitmap,
 
892
                                               GRUB_VIDEO_BITMAP_SCALE_METHOD_BEST);
 
893
      else
 
894
        bitmap = grub_xnu_bitmap;
 
895
    }
 
896
 
 
897
  if (bitmap)
 
898
    {
 
899
      int x, y;
 
900
 
 
901
      x = mode_info.width - bitmap->mode_info.width;
 
902
      x /= 2;
 
903
      y = mode_info.height - bitmap->mode_info.height;
 
904
      y /= 2;
 
905
      err = grub_video_blit_bitmap (bitmap,
 
906
                                    GRUB_VIDEO_BLIT_REPLACE,
 
907
                                    x > 0 ? x : 0,
 
908
                                    y > 0 ? y : 0,
 
909
                                    x < 0 ? -x : 0,
 
910
                                    y < 0 ? -y : 0,
 
911
                                    min (bitmap->mode_info.width,
 
912
                                         mode_info.width),
 
913
                                    min (bitmap->mode_info.height,
 
914
                                         mode_info.height));
 
915
    }
 
916
  if (err)
 
917
    {
 
918
      grub_print_error ();
 
919
      grub_errno = GRUB_ERR_NONE;
 
920
      bitmap = 0;
 
921
    }
 
922
 
 
923
  ret = grub_video_get_info_and_fini (&mode_info, &framebuffer);
 
924
  if (ret)
 
925
    return grub_error (GRUB_ERR_IO, "couldn't retrieve video parameters");
 
926
 
 
927
  params->lfb_width = mode_info.width;
 
928
  params->lfb_height = mode_info.height;
 
929
  params->lfb_depth = mode_info.bpp;
 
930
  params->lfb_line_len = mode_info.pitch;
 
931
 
 
932
  params->lfb_base = PTR_TO_UINT32 (framebuffer);
 
933
  params->lfb_mode = bitmap ? GRUB_XNU_VIDEO_SPLASH 
 
934
    : GRUB_XNU_VIDEO_TEXT_IN_VIDEO;
 
935
 
 
936
  return GRUB_ERR_NONE;
 
937
}
 
938
 
841
939
/* Boot xnu. */
842
940
grub_err_t
843
941
grub_xnu_boot (void)