You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
178 lines
6.1 KiB
178 lines
6.1 KiB
10 years ago
|
|
||
|
#ifdef __LINK_AT_RUNTIME__
|
||
|
DEFINE_SYMBOL(long, bfd_canonicalize_reloc,
|
||
|
bfd *abfd, asection *sec, arelent **loc, asymbol **syms);
|
||
|
DEFINE_SYMBOL(bfd_boolean, bfd_close,
|
||
|
bfd *abfd);
|
||
|
DEFINE_SYMBOL(bfd_boolean, bfd_check_format,
|
||
|
bfd *abfd, bfd_format format);
|
||
|
DEFINE_SYMBOL(const char *, bfd_errmsg,
|
||
|
bfd_error_type error_tag);
|
||
|
DEFINE_SYMBOL(enum bfd_architecture, bfd_get_arch,
|
||
|
bfd *abfd);
|
||
|
DEFINE_SYMBOL(bfd_error_type, bfd_get_error,
|
||
|
void);
|
||
|
DEFINE_SYMBOL(unsigned long, bfd_get_mach,
|
||
|
bfd *abfd);
|
||
|
DEFINE_SYMBOL(long, bfd_get_reloc_upper_bound,
|
||
|
bfd *abfd, asection *sect);
|
||
|
DEFINE_SYMBOL(bfd_boolean, bfd_get_section_contents,
|
||
|
bfd *abfd, asection *section, void *location, file_ptr offset,
|
||
|
bfd_size_type count);
|
||
|
DEFINE_SYMBOL(asection *, bfd_make_section,
|
||
|
bfd *, const char *name);
|
||
|
DEFINE_SYMBOL(asection *, bfd_make_section_anyway_with_flags,
|
||
|
bfd *abfd, const char *name, flagword flags);
|
||
|
DEFINE_SYMBOL(bfd *, bfd_openr, const char *filename,
|
||
|
const char *target);
|
||
|
DEFINE_SYMBOL(bfd *, bfd_openw,
|
||
|
const char *filename, const char *target);
|
||
|
DEFINE_SYMBOL(bfd_boolean, bfd_set_file_flags,
|
||
|
bfd *abfd, flagword flags);
|
||
|
DEFINE_SYMBOL(void, bfd_set_reloc,
|
||
|
bfd *abfd, asection *sec, arelent **rel, unsigned int count);
|
||
|
DEFINE_SYMBOL(bfd_boolean, bfd_set_section_contents,
|
||
|
bfd *abfd, asection *section, const void *data, file_ptr offset,
|
||
|
bfd_size_type count);
|
||
|
DEFINE_SYMBOL(bfd_boolean, bfd_set_format,
|
||
|
bfd *abfd, bfd_format format);
|
||
|
DEFINE_SYMBOL(bfd_boolean, bfd_set_section_flags,
|
||
|
bfd *abfd, asection *sec, flagword flags);
|
||
|
DEFINE_SYMBOL(bfd_boolean, bfd_set_section_size,
|
||
|
bfd *abfd, asection *sec, bfd_size_type val);
|
||
|
DEFINE_SYMBOL(bfd_boolean, bfd_set_start_address,
|
||
|
bfd *abfd, bfd_vma vma);
|
||
|
DEFINE_SYMBOL(bfd_boolean, bfd_set_symtab,
|
||
|
bfd *abfd, asymbol **location, unsigned int count);
|
||
|
|
||
|
#define bfd_canonicalize_reloc
|
||
|
OVERRIDE_SYMBOL(bfd_canonicalize_reloc)
|
||
|
#define bfd_close OVERRIDE_SYMBOL(bfd_close)
|
||
|
#define bfd_check_format
|
||
|
OVERRIDE_SYMBOL(bfd_check_format)
|
||
|
#define bfd_errmsg OVERRIDE_SYMBOL(bfd_errmsg)
|
||
|
#define bfd_get_arch OVERRIDE_SYMBOL(bfd_get_arch)
|
||
|
#define bfd_get_error
|
||
|
OVERRIDE_SYMBOL(bfd_get_error)
|
||
|
#define bfd_get_mach OVERRIDE_SYMBOL(bfd_get_mach)
|
||
|
#define bfd_get_reloc_upper_bound
|
||
|
OVERRIDE_SYMBOL(bfd_get_reloc_upper_bound)
|
||
|
#define bfd_get_section_contents
|
||
|
OVERRIDE_SYMBOL(bfd_get_section_contents)
|
||
|
#define bfd_make_section
|
||
|
OVERRIDE_SYMBOL(bfd_make_section)
|
||
|
#define bfd_make_section_anyway_with_flags
|
||
|
OVERRIDE_SYMBOL(bfd_make_section_anyway_with_flags)
|
||
|
#define bfd_openr OVERRIDE_SYMBOL(bfd_openr)
|
||
|
#define bfd_openw OVERRIDE_SYMBOL(bfd_openw)
|
||
|
#define bfd_set_file_flags
|
||
|
OVERRIDE_SYMBOL(bfd_set_file_flags)
|
||
|
#define bfd_set_format
|
||
|
OVERRIDE_SYMBOL(bfd_set_format)
|
||
|
#define bfd_set_reloc
|
||
|
OVERRIDE_SYMBOL(bfd_set_reloc)
|
||
|
#define bfd_set_section_contents
|
||
|
OVERRIDE_SYMBOL(bfd_set_section_contents)
|
||
|
#define bfd_set_section_flags
|
||
|
OVERRIDE_SYMBOL(bfd_set_section_flags)
|
||
|
#define bfd_set_section_size
|
||
|
OVERRIDE_SYMBOL(bfd_set_section_size)
|
||
|
#define bfd_set_start_address
|
||
|
OVERRIDE_SYMBOL(bfd_set_start_address)
|
||
|
#define bfd_set_symtab
|
||
|
OVERRIDE_SYMBOL(bfd_set_symtab)
|
||
|
|
||
|
SYMBOL_TABLE(libbfd_symbols,
|
||
|
SYMBOL(bfd_openr),
|
||
|
SYMBOL(bfd_set_format),
|
||
|
);
|
||
|
#endif
|
||
|
|
||
|
#include <librsvg/rsvg.h>
|
||
|
|
||
|
DEFINE_SYMBOL(void, rsvg_init, void);
|
||
|
DEFINE_SYMBOL(RsvgHandle *, rsvg_handle_new, void);
|
||
|
DEFINE_SYMBOL(GdkPixbuf *, rsvg_handle_get_pixbuf, RsvgHandle *handle);
|
||
|
DEFINE_SYMBOL(gboolean, rsvg_handle_close, RsvgHandle * handle, GError ** error);
|
||
|
DEFINE_SYMBOL(void, rsvg_handle_get_dimensions, RsvgHandle * handle, RsvgDimensionData * dimension_data);
|
||
|
DEFINE_SYMBOL(gboolean, rsvg_handle_write, RsvgHandle * handle, const guchar * buf, gsize count, GError ** error);
|
||
|
DEFINE_SYMBOL(void, rsvg_handle_set_size_callback, RsvgHandle * handle, RsvgSizeFunc size_func, gpointer user_data, GDestroyNotify user_data_destroy);
|
||
|
|
||
|
#define rsvg_init OVERRIDE_SYMBOL(rsvg_init)
|
||
|
#define rsvg_handle_new OVERRIDE_SYMBOL(rsvg_handle_new)
|
||
|
#define rsvg_handle_get_pixbuf OVERRIDE_SYMBOL(rsvg_handle_get_pixbuf)
|
||
|
#define rsvg_handle_close OVERRIDE_SYMBOL(rsvg_handle_close)
|
||
|
#define rsvg_handle_write OVERRIDE_SYMBOL(rsvg_handle_write)
|
||
|
#define rsvg_handle_set_size_callback OVERRIDE_SYMBOL(rsvg_handle_set_size_callback)
|
||
|
#define rsvg_handle_get_dimensions OVERRIDE_SYMBOL(rsvg_handle_get_dimensions)
|
||
|
|
||
|
SYMBOL_TABLE(librsvg_symbols,
|
||
|
SYMBOL(rsvg_init),
|
||
|
SYMBOL(rsvg_handle_new),
|
||
|
SYMBOL(rsvg_handle_close),
|
||
|
SYMBOL(rsvg_handle_write),
|
||
|
SYMBOL(rsvg_handle_get_pixbuf),
|
||
|
SYMBOL(rsvg_handle_get_dimensions),
|
||
|
SYMBOL(rsvg_handle_set_size_callback),
|
||
|
);
|
||
|
|
||
|
/*
|
||
|
* Scale the SVG image to the required icon size
|
||
|
*/
|
||
|
static void rsvg_set_iconsize(int *width, int *height, gpointer data)
|
||
|
{
|
||
|
float multiplier = *(float*)data;
|
||
|
|
||
|
(*width) *= multiplier;
|
||
|
(*height) *= multiplier;
|
||
|
}
|
||
|
|
||
|
if(!rsvg_linked)
|
||
|
{
|
||
|
if(!LOAD_SYMBOLS("librsvg-2.so", librsvg_symbols))
|
||
|
{
|
||
|
// libr_icon_gtk requires that your application be linked to librsvg
|
||
|
return NULL;
|
||
|
}
|
||
|
}
|
||
|
RsvgHandle *rsvg = NULL;
|
||
|
libr_icontype_t type;
|
||
|
type = icon_handle->type;
|
||
|
if(type == LIBR_SVG)
|
||
|
{
|
||
|
RsvgHandle *rsvg = rsvg_handle_new();
|
||
|
if(rsvg != NULL)
|
||
|
{
|
||
|
if(rsvg_handle_write(rsvg, iconfile, iconfile_size, NULL))
|
||
|
{
|
||
|
if(rsvg_handle_close(rsvg, NULL))
|
||
|
{
|
||
|
RsvgDimensionData dim;
|
||
|
float multiplier;
|
||
|
int old_size;
|
||
|
|
||
|
rsvg_handle_get_dimensions(rsvg, &dim);
|
||
|
if(dim.width > dim.height)
|
||
|
old_size = dim.width;
|
||
|
else
|
||
|
old_size = dim.height;
|
||
|
multiplier = ((float)sizes[i])/old_size;
|
||
|
rsvg_handle_set_size_callback(rsvg, rsvg_set_iconsize, (void *) &multiplier, NULL);
|
||
|
icon = rsvg_handle_get_pixbuf(rsvg);
|
||
|
icons = g_list_append(icons, icon);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
free(iconfile);
|
||
|
}
|
||
|
else if(type == LIBR_PNG)
|
||
|
{
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
/* Unhandled image type */
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
|