static void blit (grub_gfxmenu_box_t self, int pixmap_index, int x, int y) { struct grub_video_bitmap *bitmap; bitmap = self->scaled_pixmaps[pixmap_index]; if (! bitmap) return; grub_video_blit_bitmap (bitmap, GRUB_VIDEO_BLIT_BLEND, x, y, 0, 0, grub_video_bitmap_get_width (bitmap), grub_video_bitmap_get_height (bitmap)); }
/* Draw the specified glyph at (x, y). The y coordinate designates the baseline of the character, while the x coordinate designates the left side location of the character. */ grub_err_t grub_font_draw_glyph (struct grub_font_glyph * glyph, grub_video_color_t color, int left_x, int baseline_y) { struct grub_video_bitmap glyph_bitmap; /* Don't try to draw empty glyphs (U+0020, etc.). */ if (glyph->width == 0 || glyph->height == 0) return GRUB_ERR_NONE; glyph_bitmap.mode_info.width = glyph->width; glyph_bitmap.mode_info.height = glyph->height; glyph_bitmap.mode_info.mode_type = (1 << GRUB_VIDEO_MODE_TYPE_DEPTH_POS) | GRUB_VIDEO_MODE_TYPE_1BIT_BITMAP; glyph_bitmap.mode_info.blit_format = GRUB_VIDEO_BLIT_FORMAT_1BIT_PACKED; glyph_bitmap.mode_info.bpp = 1; /* Really 1 bit per pixel. */ glyph_bitmap.mode_info.bytes_per_pixel = 0; /* Packed densely as bits. */ glyph_bitmap.mode_info.pitch = glyph->width; glyph_bitmap.mode_info.number_of_colors = 2; glyph_bitmap.mode_info.bg_red = 0; glyph_bitmap.mode_info.bg_green = 0; glyph_bitmap.mode_info.bg_blue = 0; glyph_bitmap.mode_info.bg_alpha = 0; grub_video_unmap_color (color, &glyph_bitmap.mode_info.fg_red, &glyph_bitmap.mode_info.fg_green, &glyph_bitmap.mode_info.fg_blue, &glyph_bitmap.mode_info.fg_alpha); glyph_bitmap.data = glyph->bitmap; int bitmap_left = left_x + glyph->offset_x; int bitmap_bottom = baseline_y - glyph->offset_y; int bitmap_top = bitmap_bottom - glyph->height; return grub_video_blit_bitmap (&glyph_bitmap, GRUB_VIDEO_BLIT_BLEND, bitmap_left, bitmap_top, 0, 0, glyph->width, glyph->height); }