parent
be3f8c175f
commit
43f19fb8a0
@ -0,0 +1,61 @@
|
|||||||
|
#include "tdelficon.h"
|
||||||
|
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Obtain an existing icon resource list
|
||||||
|
*/
|
||||||
|
int get_iconlist(libr_file *file_handle, iconlist *icons)
|
||||||
|
{
|
||||||
|
if(icons == NULL)
|
||||||
|
{
|
||||||
|
/* Need to be able to return SOMETHING */
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
/* Obtain the icon resource list */
|
||||||
|
icons->buffer = libr_malloc(file_handle, ICON_SECTION, &(icons->size));
|
||||||
|
if(icons->buffer == NULL)
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get the next entry in an icon resource list
|
||||||
|
*/
|
||||||
|
iconentry *get_nexticon(iconlist *icons, iconentry *last_entry)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
/* The icon list is needed both for the data buffer and for a call-specific iconentry instance */
|
||||||
|
if(icons == NULL)
|
||||||
|
return NULL;
|
||||||
|
/* If this is the first call (last_entry == NULL) then return the first entry */
|
||||||
|
if(last_entry == NULL)
|
||||||
|
icons->entry.offset = sizeof(uint32_t)+sizeof(UUID);
|
||||||
|
else
|
||||||
|
icons->entry.offset += icons->entry.entry_size;
|
||||||
|
/* Check to see if we've run out of entries */
|
||||||
|
if(icons->entry.offset >= icons->size)
|
||||||
|
return NULL;
|
||||||
|
i = icons->entry.offset;
|
||||||
|
memcpy(&(icons->entry.entry_size), &(icons->buffer[i]), sizeof(uint32_t));
|
||||||
|
i += sizeof(uint32_t);
|
||||||
|
icons->entry.type = (libr_icontype_t)icons->buffer[i];
|
||||||
|
i += sizeof(unsigned char);
|
||||||
|
switch(icons->entry.type)
|
||||||
|
{
|
||||||
|
case LIBR_SVG:
|
||||||
|
icons->entry.icon_size = 0;
|
||||||
|
icons->entry.name = &(icons->buffer[i]);
|
||||||
|
break;
|
||||||
|
case LIBR_PNG:
|
||||||
|
memcpy(&(icons->entry.icon_size), &(icons->buffer[i]), sizeof(uint32_t));
|
||||||
|
i += sizeof(uint32_t);
|
||||||
|
icons->entry.name = &(icons->buffer[i]);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
/* Invalid entry type */
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return &(icons->entry);
|
||||||
|
}
|
@ -0,0 +1,48 @@
|
|||||||
|
|
||||||
|
#include <alloca.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <cstdlib>
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
#include <libr-icons.h>
|
||||||
|
|
||||||
|
// BEGIN HACK
|
||||||
|
// libr does not export these structures and defines,
|
||||||
|
// but we need access to them to make the UI behave sanely
|
||||||
|
// Keep them in sync with libr and all should be OK
|
||||||
|
|
||||||
|
// Valid for libr version 0.6.0
|
||||||
|
// See libr detection code in ConfigureChecks.cmake
|
||||||
|
|
||||||
|
typedef uint32_t ID8;
|
||||||
|
typedef uint16_t ID4;
|
||||||
|
typedef struct {uint64_t p:48;} __attribute__((__packed__)) ID12;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
ID8 g1;
|
||||||
|
ID4 g2;
|
||||||
|
ID4 g3;
|
||||||
|
ID4 g4;
|
||||||
|
ID12 g5;
|
||||||
|
} __attribute__((__packed__)) UUID;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char *name;
|
||||||
|
size_t offset;
|
||||||
|
size_t entry_size;
|
||||||
|
libr_icontype_t type;
|
||||||
|
unsigned int icon_size;
|
||||||
|
} iconentry;
|
||||||
|
|
||||||
|
typedef struct{
|
||||||
|
size_t size;
|
||||||
|
char *buffer;
|
||||||
|
iconentry entry;
|
||||||
|
} iconlist;
|
||||||
|
|
||||||
|
#define ICON_SECTION ".icon"
|
||||||
|
// END HACK
|
||||||
|
}
|
||||||
|
|
||||||
|
int get_iconlist(libr_file *file_handle, iconlist *icons);
|
||||||
|
iconentry *get_nexticon(iconlist *icons, iconentry *last_entry);
|
Loading…
Reference in new issue