⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vbeblit.c

📁 grub 1.95 linux 的bootloader 源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
          if (a == 255)            {              color = grub_video_vbe_map_rgb(sr, sg, sb);              *dstptr++ = color & 0xFF;              continue;            }          grub_video_vbe_unmap_color (dst, *dstptr, &dr, &dg, &db, &da);          dr = (dr * (255 - a) + sr * a) / 255;          dg = (dg * (255 - a) + sg * a) / 255;          db = (db * (255 - a) + sb * a) / 255;          color = grub_video_vbe_map_rgb(dr, dg, db);          *dstptr++ = color & 0xFF;        }    }}voidgrub_video_i386_vbeblit_index_R8G8B8X8 (struct grub_video_i386_vbeblit_info *dst,                                        struct grub_video_i386_vbeblit_info *src,                                        int x, int y, int width, int height,                                        int offset_x, int offset_y){  grub_uint32_t color;  int i;  int j;  grub_uint32_t *srcptr;  grub_uint8_t *dstptr;  unsigned int sr;  unsigned int sg;  unsigned int sb;  /* We do not need to worry about data being out of bounds  as we assume that everything has been checked before.  */  for (j = 0; j < height; j++)  {    srcptr = (grub_uint32_t *)get_data_ptr (src, offset_x, j + offset_y);    dstptr = (grub_uint8_t *)get_data_ptr (dst, x, y + j);    for (i = 0; i < width; i++)    {      color = *srcptr++;      sr = (color >> 0) & 0xFF;      sg = (color >> 8) & 0xFF;      sb = (color >> 16) & 0xFF;      color = grub_video_vbe_map_rgb(sr, sg, sb);      *dstptr++ = color & 0xFF;    }  }}voidgrub_video_i386_vbeblit_R8G8B8A8_R8G8B8 (struct grub_video_i386_vbeblit_info *dst,                                         struct grub_video_i386_vbeblit_info *src,                                         int x, int y, int width, int height,                                         int offset_x, int offset_y){  grub_uint32_t color;  int i;  int j;  grub_uint8_t *srcptr;  grub_uint32_t *dstptr;  unsigned int sr;  unsigned int sg;  unsigned int sb;  /* We do not need to worry about data being out of bounds     as we assume that everything has been checked before.  */  for (j = 0; j < height; j++)    {      srcptr = (grub_uint8_t *)get_data_ptr (src, offset_x, j + offset_y);      dstptr = (grub_uint32_t *)get_data_ptr (dst, x, y + j);      for (i = 0; i < width; i++)        {          sr = *srcptr++;          sg = *srcptr++;          sb = *srcptr++;          color = 0xFF000000 | (sb << 16) | (sg << 8) | sr;          *dstptr++ = color;        }    }}voidgrub_video_i386_vbeblit_R8G8B8_R8G8B8 (struct grub_video_i386_vbeblit_info *dst,                                       struct grub_video_i386_vbeblit_info *src,                                       int x, int y, int width, int height,                                       int offset_x, int offset_y){  int j;  grub_uint8_t *srcptr;  grub_uint8_t *dstptr;  int pitch;  pitch = src->mode_info->bytes_per_pixel;  /* We do not need to worry about data being out of bounds     as we assume that everything has been checked before.  */  for (j = 0; j < height; j++)    {      srcptr = (grub_uint8_t *)get_data_ptr (src, offset_x, j + offset_y);      dstptr = (grub_uint8_t *)get_data_ptr (dst, x, y + j);      grub_memmove (dstptr, srcptr, width * pitch);    }}voidgrub_video_i386_vbeblit_index_R8G8B8 (struct grub_video_i386_vbeblit_info *dst,                                      struct grub_video_i386_vbeblit_info *src,                                      int x, int y, int width, int height,                                      int offset_x, int offset_y){  grub_uint32_t color;  int i;  int j;  grub_uint8_t *srcptr;  grub_uint8_t *dstptr;  unsigned int sr;  unsigned int sg;  unsigned int sb;  /* We do not need to worry about data being out of bounds     as we assume that everything has been checked before.  */  for (j = 0; j < height; j++)    {      srcptr = (grub_uint8_t *)get_data_ptr (src, offset_x, j + offset_y);      dstptr = (grub_uint8_t *)get_data_ptr (dst, x, y + j);      for (i = 0; i < width; i++)        {          sr = *srcptr++;          sg = *srcptr++;          sb = *srcptr++;          color = grub_video_vbe_map_rgb(sr, sg, sb);          *dstptr++ = color & 0xFF;        }    }}voidgrub_video_i386_vbeblit_index_index (struct grub_video_i386_vbeblit_info *dst,                                     struct grub_video_i386_vbeblit_info *src,                                     int x, int y, int width, int height,                                     int offset_x, int offset_y){  int j;  grub_uint8_t *srcptr;  grub_uint8_t *dstptr;  int pitch;  pitch = src->mode_info->bytes_per_pixel;  /* We do not need to worry about data being out of bounds     as we assume that everything has been checked before.  */  for (j = 0; j < height; j++)    {      srcptr = (grub_uint8_t *)get_data_ptr (src, offset_x, j + offset_y);      dstptr = (grub_uint8_t *)get_data_ptr (dst, x, y + j);      grub_memmove (dstptr, srcptr, width * pitch);    }}voidgrub_video_i386_vbeblit_blend (struct grub_video_i386_vbeblit_info *dst,                               struct grub_video_i386_vbeblit_info *src,                               int x, int y, int width, int height,                               int offset_x, int offset_y){  int i;  int j;  /* We do not need to worry about data being out of bounds     as we assume that everything has been checked before.  */  for (j = 0; j < height; j++)    {      for (i = 0; i < width; i++)        {          grub_uint8_t src_red;          grub_uint8_t src_green;          grub_uint8_t src_blue;          grub_uint8_t src_alpha;          grub_uint8_t dst_red;          grub_uint8_t dst_green;          grub_uint8_t dst_blue;          grub_uint8_t dst_alpha;          grub_video_color_t src_color;          grub_video_color_t dst_color;          src_color = get_pixel (src, i + offset_x, j + offset_y);          grub_video_vbe_unmap_color (src, src_color, &src_red, &src_green,                                      &src_blue, &src_alpha);          if (src_alpha == 0)            continue;          if (src_alpha == 255)            {              dst_color = grub_video_vbe_map_rgba (src_red, src_green,                                                   src_blue, src_alpha);              set_pixel (dst, x + i, y + j, dst_color);              continue;            }          dst_color = get_pixel (dst, x + i, y + j);          grub_video_vbe_unmap_color (dst, dst_color, &dst_red,                                      &dst_green, &dst_blue, &dst_alpha);          dst_red = (((src_red * src_alpha)                      + (dst_red * (255 - src_alpha))) / 255);          dst_green = (((src_green * src_alpha)                        + (dst_green * (255 - src_alpha))) / 255);          dst_blue = (((src_blue * src_alpha)                       + (dst_blue * (255 - src_alpha))) / 255);          dst_alpha = src_alpha;          dst_color = grub_video_vbe_map_rgba (dst_red, dst_green, dst_blue,                                               dst_alpha);          set_pixel (dst, x + i, y + j, dst_color);        }    }}voidgrub_video_i386_vbeblit_replace (struct grub_video_i386_vbeblit_info *dst,                                 struct grub_video_i386_vbeblit_info *src,                                 int x, int y, int width, int height,                                 int offset_x, int offset_y){  int i;  int j;  grub_uint8_t src_red;  grub_uint8_t src_green;  grub_uint8_t src_blue;  grub_uint8_t src_alpha;  grub_video_color_t src_color;  grub_video_color_t dst_color;  /* We do not need to worry about data being out of bounds     as we assume that everything has been checked before.  */  for (j = 0; j < height; j++)  {    for (i = 0; i < width; i++)    {      src_color = get_pixel (src, i + offset_x, j + offset_y);      grub_video_vbe_unmap_color (src, src_color, &src_red, &src_green,                                  &src_blue, &src_alpha);      dst_color = grub_video_vbe_map_rgba (src_red, src_green,                                           src_blue, src_alpha);      set_pixel (dst, x + i, y + j, dst_color);    }  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -