#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ucx/map.h>
#include "toolkit.h"
#include "image.h"
#include "../common/properties.h"
static UcxMap *image_map;
static GtkIconTheme *icon_theme;
void ui_image_init(
void) {
image_map = ucx_map_new(
8);
icon_theme = gtk_icon_theme_get_default();
}
GdkPixbuf* ui_get_image(
const char *name) {
UiImage *img = ucx_map_cstr_get(image_map, name);
if(img) {
return img->pixbuf;
}
else {
return NULL;
}
}
static UiIcon* get_icon(
const char *name,
int size,
int scale) {
#ifdef UI_SUPPORTS_SCALE
GtkIconInfo *info = gtk_icon_theme_lookup_icon_for_scale(icon_theme, name, size, scale,
0);
#else
GtkIconInfo *info = gtk_icon_theme_lookup_icon(icon_theme, name, size,
0);
#endif
if(info) {
UiIcon *icon = malloc(
sizeof(UiIcon));
icon->info = info;
return icon;
}
return NULL;
}
UiIcon* ui_icon(
const char *name,
int size) {
return get_icon(name, size, ui_get_scalefactor());
}
UiIcon* ui_icon_unscaled(
const char *name,
int size) {
return get_icon(name, size,
1);
}
void ui_free_icon(UiIcon *icon) {
g_object_unref(icon->info);
free(icon);
}
UiImage* ui_icon_image(UiIcon *icon) {
GError *error =
NULL;
GdkPixbuf *pixbuf = gtk_icon_info_load_icon(icon->info, &error);
if(pixbuf) {
UiImage *img = malloc(
sizeof(UiImage));
img->pixbuf = pixbuf;
return img;
}
return NULL;
}
UiImage* ui_image(
const char *filename) {
return ui_named_image(filename,
NULL);
}
UiImage* ui_named_image(
const char *filename,
const char *name) {
char *path = uic_get_image_path(filename);
if(!path) {
fprintf(stderr,
"UiError: pixmaps directory not set\n");
return NULL;
}
UiImage *img = ui_load_image_from_path(path, name);
free(path);
return img;
}
UiImage* ui_load_image_from_path(
const char *path,
const char *name) {
GError *error =
NULL;
GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file(path, &error);
if(!pixbuf) {
fprintf(stderr,
"UiError: Cannot load image: %s\n", path);
return NULL;
}
UiImage *img = malloc(
sizeof(UiImage));
img->pixbuf = pixbuf;
if(name) {
ucx_map_cstr_put(image_map, name, img);
}
return img;
}
void ui_free_image(UiImage *img) {
g_object_unref(img->pixbuf);
free(img);
}