/* Try to load an icon for the specified CLASS_NAME in the directory DIR. Returns 0 if the icon could not be loaded, or returns a pointer to a new bitmap if it was successful. */ static struct grub_video_bitmap * try_loading_icon (grub_gfxmenu_icon_manager_t mgr, const char *dir, const char *class_name) { char *path; int l; path = grub_malloc (grub_strlen (dir) + grub_strlen (class_name) + grub_strlen (icon_extension) + 3); if (! path) return 0; grub_strcpy (path, dir); l = grub_strlen (path); if (path[l-1] != '/') { path[l] = '/'; path[l+1] = 0; } grub_strcat (path, class_name); grub_strcat (path, icon_extension); struct grub_video_bitmap *raw_bitmap; grub_video_bitmap_load (&raw_bitmap, path); grub_free (path); grub_errno = GRUB_ERR_NONE; /* Critical to clear the error!! */ if (! raw_bitmap) return 0; struct grub_video_bitmap *scaled_bitmap; grub_video_bitmap_create_scaled (&scaled_bitmap, mgr->icon_width, mgr->icon_height, raw_bitmap, GRUB_VIDEO_BITMAP_SCALE_METHOD_BEST); grub_video_bitmap_destroy (raw_bitmap); if (! scaled_bitmap) return 0; return scaled_bitmap; }
/* Set the specified property NAME on the view to the given string VALUE. The caller is responsible for the lifetimes of NAME and VALUE. */ static grub_err_t theme_set_string (grub_gfxmenu_view_t view, const char *name, const char *value, const char *theme_dir, const char *filename, int line_num, int col_num) { if (! grub_strcmp ("title-font", name)) view->title_font = grub_font_get (value); else if (! grub_strcmp ("message-font", name)) view->message_font = grub_font_get (value); else if (! grub_strcmp ("terminal-font", name)) { grub_free (view->terminal_font_name); view->terminal_font_name = grub_strdup (value); if (! view->terminal_font_name) return grub_errno; } else if (! grub_strcmp ("title-color", name)) grub_video_parse_color (value, &view->title_color); else if (! grub_strcmp ("message-color", name)) grub_video_parse_color (value, &view->message_color); else if (! grub_strcmp ("message-bg-color", name)) grub_video_parse_color (value, &view->message_bg_color); else if (! grub_strcmp ("desktop-image", name)) { struct grub_video_bitmap *raw_bitmap; char *path; path = grub_resolve_relative_path (theme_dir, value); if (! path) return grub_errno; if (grub_video_bitmap_load (&raw_bitmap, path) != GRUB_ERR_NONE) { grub_free (path); return grub_errno; } grub_free(path); grub_video_bitmap_destroy (view->raw_desktop_image); view->raw_desktop_image = raw_bitmap; } else if (! grub_strcmp ("desktop-image-scale-method", name)) { if (! value || ! grub_strcmp ("stretch", value)) view->desktop_image_scale_method = GRUB_VIDEO_BITMAP_SELECTION_METHOD_STRETCH; else if (! grub_strcmp ("crop", value)) view->desktop_image_scale_method = GRUB_VIDEO_BITMAP_SELECTION_METHOD_CROP; else if (! grub_strcmp ("padding", value)) view->desktop_image_scale_method = GRUB_VIDEO_BITMAP_SELECTION_METHOD_PADDING; else if (! grub_strcmp ("fitwidth", value)) view->desktop_image_scale_method = GRUB_VIDEO_BITMAP_SELECTION_METHOD_FITWIDTH; else if (! grub_strcmp ("fitheight", value)) view->desktop_image_scale_method = GRUB_VIDEO_BITMAP_SELECTION_METHOD_FITHEIGHT; else return grub_error (GRUB_ERR_BAD_ARGUMENT, "Unsupported scale method: %s", value); } else if (! grub_strcmp ("desktop-image-h-align", name)) { if (! grub_strcmp ("left", value)) view->desktop_image_h_align = GRUB_VIDEO_BITMAP_H_ALIGN_LEFT; else if (! grub_strcmp ("center", value)) view->desktop_image_h_align = GRUB_VIDEO_BITMAP_H_ALIGN_CENTER; else if (! grub_strcmp ("right", value)) view->desktop_image_h_align = GRUB_VIDEO_BITMAP_H_ALIGN_RIGHT; else return grub_error (GRUB_ERR_BAD_ARGUMENT, "Unsupported horizontal align method: %s", value); } else if (! grub_strcmp ("desktop-image-v-align", name)) { if (! grub_strcmp ("top", value)) view->desktop_image_v_align = GRUB_VIDEO_BITMAP_V_ALIGN_TOP; else if (! grub_strcmp ("center", value)) view->desktop_image_v_align = GRUB_VIDEO_BITMAP_V_ALIGN_CENTER; else if (! grub_strcmp ("bottom", value)) view->desktop_image_v_align = GRUB_VIDEO_BITMAP_V_ALIGN_BOTTOM; else return grub_error (GRUB_ERR_BAD_ARGUMENT, "Unsupported vertical align method: %s", value); } else if (! grub_strcmp ("desktop-color", name)) grub_video_parse_color (value, &view->desktop_color); else if (! grub_strcmp ("terminal-box", name)) { grub_err_t err; err = grub_gui_recreate_box (&view->terminal_box, value, theme_dir); if (err != GRUB_ERR_NONE) return err; } else if (! grub_strcmp ("terminal-border", name)) { view->terminal_border = grub_strtoul (value, 0, 10); if (grub_errno) return grub_errno; } else if (! grub_strcmp ("terminal-left", name)) { unsigned int tmp; int err = theme_get_unsigned_int_from_proportional (value, view->screen.width, &tmp); if (err != GRUB_ERR_NONE) return err; view->terminal_rect.x = tmp; } else if (! grub_strcmp ("terminal-top", name)) { unsigned int tmp; int err = theme_get_unsigned_int_from_proportional (value, view->screen.height, &tmp); if (err != GRUB_ERR_NONE) return err; view->terminal_rect.y = tmp; } else if (! grub_strcmp ("terminal-width", name)) { unsigned int tmp; int err = theme_get_unsigned_int_from_proportional (value, view->screen.width, &tmp); if (err != GRUB_ERR_NONE) return err; view->terminal_rect.width = tmp; } else if (! grub_strcmp ("terminal-height", name)) { unsigned int tmp; int err = theme_get_unsigned_int_from_proportional (value, view->screen.height, &tmp); if (err != GRUB_ERR_NONE) return err; view->terminal_rect.height = tmp; } else if (! grub_strcmp ("title-text", name)) { grub_free (view->title_text); view->title_text = grub_strdup (value); if (! view->title_text) return grub_errno; } else { return grub_error (GRUB_ERR_BAD_ARGUMENT, "%s:%d:%d unknown property `%s'", filename, line_num, col_num, name); } return grub_errno; }
/* Create a new box. If PIXMAPS_PREFIX and PIXMAPS_SUFFIX are both non-null, then an attempt is made to load the north, south, east, west, northwest, northeast, southeast, southwest, and center pixmaps. If either PIXMAPS_PREFIX or PIXMAPS_SUFFIX is 0, then no pixmaps are loaded, and the box has zero-width borders and is drawn transparent. */ grub_gfxmenu_box_t grub_gfxmenu_create_box (const char *pixmaps_prefix, const char *pixmaps_suffix) { unsigned i; grub_gfxmenu_box_t box; box = (grub_gfxmenu_box_t) grub_malloc (sizeof (*box)); if (! box) return 0; box->content_width = 0; box->content_height = 0; box->raw_pixmaps = (struct grub_video_bitmap **) grub_malloc (BOX_NUM_PIXMAPS * sizeof (struct grub_video_bitmap *)); box->scaled_pixmaps = (struct grub_video_bitmap **) grub_malloc (BOX_NUM_PIXMAPS * sizeof (struct grub_video_bitmap *)); /* Initialize all pixmap pointers to NULL so that proper destruction can be performed if an error is encountered partway through construction. */ for (i = 0; i < BOX_NUM_PIXMAPS; i++) box->raw_pixmaps[i] = 0; for (i = 0; i < BOX_NUM_PIXMAPS; i++) box->scaled_pixmaps[i] = 0; /* Load the pixmaps. */ for (i = 0; i < BOX_NUM_PIXMAPS; i++) { if (pixmaps_prefix && pixmaps_suffix) { char *path; char *path_end; path = grub_malloc (grub_strlen (pixmaps_prefix) + grub_strlen (box_pixmap_names[i]) + grub_strlen (pixmaps_suffix) + 1); if (! path) goto fail_and_destroy; /* Construct the specific path for this pixmap. */ path_end = grub_stpcpy (path, pixmaps_prefix); path_end = grub_stpcpy (path_end, box_pixmap_names[i]); path_end = grub_stpcpy (path_end, pixmaps_suffix); grub_video_bitmap_load (&box->raw_pixmaps[i], path); grub_free (path); /* Ignore missing pixmaps. */ grub_errno = GRUB_ERR_NONE; } } box->draw = draw; box->set_content_size = set_content_size; box->get_left_pad = get_left_pad; box->get_top_pad = get_top_pad; box->get_right_pad = get_right_pad; box->get_bottom_pad = get_bottom_pad; box->destroy = destroy; return box; fail_and_destroy: destroy (box); return 0; }