forked from old/legacy-imlib2
Move some code as suggested in source
This commit is contained in:
parent
60fb882dad
commit
5261da4a6e
|
@ -34,6 +34,7 @@ image_tags.c \
|
||||||
line.c \
|
line.c \
|
||||||
loaders.c loaders.h \
|
loaders.c loaders.h \
|
||||||
modules.c \
|
modules.c \
|
||||||
|
object.c object.h \
|
||||||
polygon.c \
|
polygon.c \
|
||||||
rectangle.c \
|
rectangle.c \
|
||||||
rgbadraw.c rgbadraw.h \
|
rgbadraw.c rgbadraw.h \
|
||||||
|
|
|
@ -3,23 +3,7 @@
|
||||||
#include FT_GLYPH_H
|
#include FT_GLYPH_H
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
#include "object.h"
|
||||||
/* TODO separate fonts and data stuff */
|
|
||||||
|
|
||||||
typedef struct _Imlib_Object_List {
|
|
||||||
struct _Imlib_Object_List *next, *prev;
|
|
||||||
} Imlib_Object_List;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int population;
|
|
||||||
Imlib_Object_List *buckets[256];
|
|
||||||
} Imlib_Hash;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
Imlib_Object_List _list_data;
|
|
||||||
char *key;
|
|
||||||
void *data;
|
|
||||||
} Imlib_Hash_El;
|
|
||||||
|
|
||||||
typedef struct _Imlib_Font {
|
typedef struct _Imlib_Font {
|
||||||
Imlib_Object_List _list_data;
|
Imlib_Object_List _list_data;
|
||||||
|
@ -104,17 +88,3 @@ void __imlib_font_draw(ImlibImage * dst, DATA32 col,
|
||||||
ImlibFont * fn, int x, int y,
|
ImlibFont * fn, int x, int y,
|
||||||
const char *text, int *nextx, int *nexty,
|
const char *text, int *nextx, int *nexty,
|
||||||
int clx, int cly, int clw, int clh);
|
int clx, int cly, int clw, int clh);
|
||||||
|
|
||||||
/* data manipulation */
|
|
||||||
|
|
||||||
void *__imlib_object_list_prepend(void *in_list, void *in_item);
|
|
||||||
void *__imlib_object_list_remove(void *in_list, void *in_item);
|
|
||||||
Imlib_Hash *__imlib_hash_add(Imlib_Hash * hash, const char *key,
|
|
||||||
const void *data);
|
|
||||||
void *__imlib_hash_find(Imlib_Hash * hash, const char *key);
|
|
||||||
void __imlib_hash_free(Imlib_Hash * hash);
|
|
||||||
void __imlib_hash_foreach(Imlib_Hash * hash,
|
|
||||||
int (*func)(Imlib_Hash * hash,
|
|
||||||
const char *key,
|
|
||||||
void *data, void *fdata),
|
|
||||||
const void *fdata);
|
|
||||||
|
|
|
@ -17,12 +17,6 @@
|
||||||
|
|
||||||
FT_Library ft_lib;
|
FT_Library ft_lib;
|
||||||
|
|
||||||
static int __imlib_hash_gen(const char *key);
|
|
||||||
static int imlib_list_alloc_error(void);
|
|
||||||
|
|
||||||
static int _imlib_hash_alloc_error = 0;
|
|
||||||
static int _imlib_list_alloc_error = 0;
|
|
||||||
|
|
||||||
void
|
void
|
||||||
__imlib_font_init(void)
|
__imlib_font_init(void)
|
||||||
{
|
{
|
||||||
|
@ -174,232 +168,3 @@ __imlib_font_utf8_get_next(unsigned char *buf, int *iindex)
|
||||||
*iindex = index;
|
*iindex = index;
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO put this somewhere else */
|
|
||||||
|
|
||||||
void *
|
|
||||||
__imlib_object_list_prepend(void *in_list, void *in_item)
|
|
||||||
{
|
|
||||||
Imlib_Object_List *new_l;
|
|
||||||
Imlib_Object_List *list, *item;
|
|
||||||
|
|
||||||
list = in_list;
|
|
||||||
item = in_item;
|
|
||||||
new_l = item;
|
|
||||||
new_l->prev = NULL;
|
|
||||||
if (!list)
|
|
||||||
{
|
|
||||||
new_l->next = NULL;
|
|
||||||
return new_l;
|
|
||||||
}
|
|
||||||
new_l->next = list;
|
|
||||||
list->prev = new_l;
|
|
||||||
return new_l;
|
|
||||||
}
|
|
||||||
|
|
||||||
void *
|
|
||||||
__imlib_object_list_remove(void *in_list, void *in_item)
|
|
||||||
{
|
|
||||||
Imlib_Object_List *return_l;
|
|
||||||
Imlib_Object_List *list = in_list;
|
|
||||||
Imlib_Object_List *item = in_item;
|
|
||||||
|
|
||||||
/* checkme */
|
|
||||||
if (!list)
|
|
||||||
return list;
|
|
||||||
if (!item)
|
|
||||||
return list;
|
|
||||||
|
|
||||||
if (item->next)
|
|
||||||
item->next->prev = item->prev;
|
|
||||||
|
|
||||||
if (item->prev)
|
|
||||||
{
|
|
||||||
item->prev->next = item->next;
|
|
||||||
return_l = list;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return_l = item->next;
|
|
||||||
}
|
|
||||||
|
|
||||||
item->next = NULL;
|
|
||||||
item->prev = NULL;
|
|
||||||
|
|
||||||
return return_l;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
__imlib_hash_gen(const char *key)
|
|
||||||
{
|
|
||||||
unsigned int hash_num = 0;
|
|
||||||
const unsigned char *ptr;
|
|
||||||
|
|
||||||
if (!key)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
for (ptr = (unsigned char *)key; *ptr; ptr++)
|
|
||||||
hash_num ^= (int)(*ptr);
|
|
||||||
|
|
||||||
hash_num &= 0xff;
|
|
||||||
return (int)hash_num;
|
|
||||||
}
|
|
||||||
|
|
||||||
Imlib_Hash *
|
|
||||||
__imlib_hash_add(Imlib_Hash * hash, const char *key, const void *data)
|
|
||||||
{
|
|
||||||
int hash_num;
|
|
||||||
Imlib_Hash_El *el;
|
|
||||||
|
|
||||||
_imlib_hash_alloc_error = 0;
|
|
||||||
if (!hash)
|
|
||||||
{
|
|
||||||
hash = calloc(1, sizeof(Imlib_Hash));
|
|
||||||
if (!hash)
|
|
||||||
{
|
|
||||||
_imlib_hash_alloc_error = 1;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!(el = malloc(sizeof(Imlib_Hash_El))))
|
|
||||||
{
|
|
||||||
if (hash->population <= 0)
|
|
||||||
{
|
|
||||||
free(hash);
|
|
||||||
hash = NULL;
|
|
||||||
}
|
|
||||||
_imlib_hash_alloc_error = 1;
|
|
||||||
return hash;
|
|
||||||
};
|
|
||||||
if (key)
|
|
||||||
{
|
|
||||||
el->key = strdup(key);
|
|
||||||
if (!el->key)
|
|
||||||
{
|
|
||||||
free(el);
|
|
||||||
_imlib_hash_alloc_error = 1;
|
|
||||||
return hash;
|
|
||||||
}
|
|
||||||
hash_num = __imlib_hash_gen(key);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
el->key = NULL;
|
|
||||||
hash_num = 0;
|
|
||||||
}
|
|
||||||
el->data = (void *)data;
|
|
||||||
|
|
||||||
hash->buckets[hash_num] =
|
|
||||||
__imlib_object_list_prepend(hash->buckets[hash_num], el);
|
|
||||||
|
|
||||||
if (imlib_list_alloc_error())
|
|
||||||
{
|
|
||||||
_imlib_hash_alloc_error = 1;
|
|
||||||
free(el->key);
|
|
||||||
free(el);
|
|
||||||
return hash;
|
|
||||||
}
|
|
||||||
hash->population++;
|
|
||||||
return hash;
|
|
||||||
}
|
|
||||||
|
|
||||||
void *
|
|
||||||
__imlib_hash_find(Imlib_Hash * hash, const char *key)
|
|
||||||
{
|
|
||||||
int hash_num;
|
|
||||||
Imlib_Hash_El *el;
|
|
||||||
Imlib_Object_List *l;
|
|
||||||
|
|
||||||
_imlib_hash_alloc_error = 0;
|
|
||||||
if (!hash)
|
|
||||||
return NULL;
|
|
||||||
hash_num = __imlib_hash_gen(key);
|
|
||||||
for (l = hash->buckets[hash_num]; l; l = l->next)
|
|
||||||
{
|
|
||||||
el = (Imlib_Hash_El *) l;
|
|
||||||
if (((el->key) && (key) && (!strcmp(el->key, key)))
|
|
||||||
|| ((!el->key) && (!key)))
|
|
||||||
{
|
|
||||||
if (l != hash->buckets[hash_num])
|
|
||||||
{
|
|
||||||
/* FIXME: move to front of list without alloc */
|
|
||||||
hash->buckets[hash_num] =
|
|
||||||
__imlib_object_list_remove(hash->buckets[hash_num], el);
|
|
||||||
hash->buckets[hash_num] =
|
|
||||||
__imlib_object_list_prepend(hash->buckets[hash_num], el);
|
|
||||||
if (imlib_list_alloc_error())
|
|
||||||
{
|
|
||||||
_imlib_hash_alloc_error = 1;
|
|
||||||
return el->data;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return el->data;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
__imlib_hash_size(Imlib_Hash * hash)
|
|
||||||
{
|
|
||||||
if (!hash)
|
|
||||||
return 0;
|
|
||||||
return 256;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
__imlib_hash_free(Imlib_Hash * hash)
|
|
||||||
{
|
|
||||||
int i, size;
|
|
||||||
|
|
||||||
if (!hash)
|
|
||||||
return;
|
|
||||||
|
|
||||||
size = __imlib_hash_size(hash);
|
|
||||||
for (i = 0; i < size; i++)
|
|
||||||
{
|
|
||||||
Imlib_Hash_El *el, *el_next;
|
|
||||||
|
|
||||||
for (el = (Imlib_Hash_El *) hash->buckets[i]; el; el = el_next)
|
|
||||||
{
|
|
||||||
el_next = (Imlib_Hash_El *) el->_list_data.next;
|
|
||||||
free(el->key);
|
|
||||||
free(el);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
free(hash);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
__imlib_hash_foreach(Imlib_Hash * hash, int (*func)(Imlib_Hash * hash,
|
|
||||||
const char *key,
|
|
||||||
void *data, void *fdata),
|
|
||||||
const void *fdata)
|
|
||||||
{
|
|
||||||
int i, size;
|
|
||||||
|
|
||||||
if (!hash)
|
|
||||||
return;
|
|
||||||
size = __imlib_hash_size(hash);
|
|
||||||
for (i = 0; i < size; i++)
|
|
||||||
{
|
|
||||||
Imlib_Object_List *l, *next_l;
|
|
||||||
|
|
||||||
for (l = hash->buckets[i]; l;)
|
|
||||||
{
|
|
||||||
Imlib_Hash_El *el;
|
|
||||||
|
|
||||||
next_l = l->next;
|
|
||||||
el = (Imlib_Hash_El *) l;
|
|
||||||
if (!func(hash, el->key, el->data, (void *)fdata))
|
|
||||||
return;
|
|
||||||
l = next_l;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
imlib_list_alloc_error(void)
|
|
||||||
{
|
|
||||||
return _imlib_list_alloc_error;
|
|
||||||
}
|
|
||||||
|
|
|
@ -0,0 +1,249 @@
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "object.h"
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
Imlib_Object_List _list_data;
|
||||||
|
char *key;
|
||||||
|
void *data;
|
||||||
|
} Imlib_Hash_El;
|
||||||
|
|
||||||
|
static int _imlib_list_alloc_error = 0;
|
||||||
|
static int _imlib_hash_alloc_error = 0;
|
||||||
|
|
||||||
|
static int
|
||||||
|
__imlib_list_alloc_error(void)
|
||||||
|
{
|
||||||
|
return _imlib_list_alloc_error;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *
|
||||||
|
__imlib_object_list_prepend(void *in_list, void *in_item)
|
||||||
|
{
|
||||||
|
Imlib_Object_List *new_l;
|
||||||
|
Imlib_Object_List *list, *item;
|
||||||
|
|
||||||
|
list = in_list;
|
||||||
|
item = in_item;
|
||||||
|
new_l = item;
|
||||||
|
new_l->prev = NULL;
|
||||||
|
if (!list)
|
||||||
|
{
|
||||||
|
new_l->next = NULL;
|
||||||
|
return new_l;
|
||||||
|
}
|
||||||
|
new_l->next = list;
|
||||||
|
list->prev = new_l;
|
||||||
|
|
||||||
|
return new_l;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *
|
||||||
|
__imlib_object_list_remove(void *in_list, void *in_item)
|
||||||
|
{
|
||||||
|
Imlib_Object_List *return_l;
|
||||||
|
Imlib_Object_List *list = in_list;
|
||||||
|
Imlib_Object_List *item = in_item;
|
||||||
|
|
||||||
|
/* checkme */
|
||||||
|
if (!list)
|
||||||
|
return list;
|
||||||
|
if (!item)
|
||||||
|
return list;
|
||||||
|
|
||||||
|
if (item->next)
|
||||||
|
item->next->prev = item->prev;
|
||||||
|
|
||||||
|
if (item->prev)
|
||||||
|
{
|
||||||
|
item->prev->next = item->next;
|
||||||
|
return_l = list;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return_l = item->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
item->next = NULL;
|
||||||
|
item->prev = NULL;
|
||||||
|
|
||||||
|
return return_l;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
__imlib_hash_gen(const char *key)
|
||||||
|
{
|
||||||
|
unsigned int hash_num = 0;
|
||||||
|
const unsigned char *ptr;
|
||||||
|
|
||||||
|
if (!key)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
for (ptr = (unsigned char *)key; *ptr; ptr++)
|
||||||
|
hash_num ^= (int)(*ptr);
|
||||||
|
|
||||||
|
hash_num &= 0xff;
|
||||||
|
return (int)hash_num;
|
||||||
|
}
|
||||||
|
|
||||||
|
Imlib_Hash *
|
||||||
|
__imlib_hash_add(Imlib_Hash * hash, const char *key, const void *data)
|
||||||
|
{
|
||||||
|
int hash_num;
|
||||||
|
Imlib_Hash_El *el;
|
||||||
|
|
||||||
|
_imlib_hash_alloc_error = 0;
|
||||||
|
|
||||||
|
if (!hash)
|
||||||
|
{
|
||||||
|
hash = calloc(1, sizeof(Imlib_Hash));
|
||||||
|
if (!hash)
|
||||||
|
{
|
||||||
|
_imlib_hash_alloc_error = 1;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(el = malloc(sizeof(Imlib_Hash_El))))
|
||||||
|
{
|
||||||
|
if (hash->population <= 0)
|
||||||
|
{
|
||||||
|
free(hash);
|
||||||
|
hash = NULL;
|
||||||
|
}
|
||||||
|
_imlib_hash_alloc_error = 1;
|
||||||
|
return hash;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (key)
|
||||||
|
{
|
||||||
|
el->key = strdup(key);
|
||||||
|
if (!el->key)
|
||||||
|
{
|
||||||
|
free(el);
|
||||||
|
_imlib_hash_alloc_error = 1;
|
||||||
|
return hash;
|
||||||
|
}
|
||||||
|
hash_num = __imlib_hash_gen(key);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
el->key = NULL;
|
||||||
|
hash_num = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
el->data = (void *)data;
|
||||||
|
|
||||||
|
hash->buckets[hash_num] =
|
||||||
|
__imlib_object_list_prepend(hash->buckets[hash_num], el);
|
||||||
|
|
||||||
|
if (__imlib_list_alloc_error())
|
||||||
|
{
|
||||||
|
_imlib_hash_alloc_error = 1;
|
||||||
|
free(el->key);
|
||||||
|
free(el);
|
||||||
|
return hash;
|
||||||
|
}
|
||||||
|
|
||||||
|
hash->population++;
|
||||||
|
|
||||||
|
return hash;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *
|
||||||
|
__imlib_hash_find(Imlib_Hash * hash, const char *key)
|
||||||
|
{
|
||||||
|
int hash_num;
|
||||||
|
Imlib_Hash_El *el;
|
||||||
|
Imlib_Object_List *l;
|
||||||
|
|
||||||
|
_imlib_hash_alloc_error = 0;
|
||||||
|
|
||||||
|
if (!hash)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
hash_num = __imlib_hash_gen(key);
|
||||||
|
for (l = hash->buckets[hash_num]; l; l = l->next)
|
||||||
|
{
|
||||||
|
el = (Imlib_Hash_El *) l;
|
||||||
|
if (((el->key) && (key) && (!strcmp(el->key, key)))
|
||||||
|
|| ((!el->key) && (!key)))
|
||||||
|
{
|
||||||
|
if (l != hash->buckets[hash_num])
|
||||||
|
{
|
||||||
|
/* FIXME: move to front of list without alloc */
|
||||||
|
hash->buckets[hash_num] =
|
||||||
|
__imlib_object_list_remove(hash->buckets[hash_num], el);
|
||||||
|
hash->buckets[hash_num] =
|
||||||
|
__imlib_object_list_prepend(hash->buckets[hash_num], el);
|
||||||
|
if (__imlib_list_alloc_error())
|
||||||
|
{
|
||||||
|
_imlib_hash_alloc_error = 1;
|
||||||
|
return el->data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return el->data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
__imlib_hash_size(Imlib_Hash * hash)
|
||||||
|
{
|
||||||
|
if (!hash)
|
||||||
|
return 0;
|
||||||
|
return 256;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
__imlib_hash_free(Imlib_Hash * hash)
|
||||||
|
{
|
||||||
|
int i, size;
|
||||||
|
|
||||||
|
if (!hash)
|
||||||
|
return;
|
||||||
|
|
||||||
|
size = __imlib_hash_size(hash);
|
||||||
|
for (i = 0; i < size; i++)
|
||||||
|
{
|
||||||
|
Imlib_Hash_El *el, *el_next;
|
||||||
|
|
||||||
|
for (el = (Imlib_Hash_El *) hash->buckets[i]; el; el = el_next)
|
||||||
|
{
|
||||||
|
el_next = (Imlib_Hash_El *) el->_list_data.next;
|
||||||
|
free(el->key);
|
||||||
|
free(el);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(hash);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
__imlib_hash_foreach(Imlib_Hash * hash,
|
||||||
|
Imlib_Hash_Func * func, const void *fdata)
|
||||||
|
{
|
||||||
|
int i, size;
|
||||||
|
|
||||||
|
if (!hash)
|
||||||
|
return;
|
||||||
|
|
||||||
|
size = __imlib_hash_size(hash);
|
||||||
|
for (i = 0; i < size; i++)
|
||||||
|
{
|
||||||
|
Imlib_Object_List *l, *next_l;
|
||||||
|
|
||||||
|
for (l = hash->buckets[i]; l;)
|
||||||
|
{
|
||||||
|
Imlib_Hash_El *el;
|
||||||
|
|
||||||
|
next_l = l->next;
|
||||||
|
el = (Imlib_Hash_El *) l;
|
||||||
|
if (!func(hash, el->key, el->data, (void *)fdata))
|
||||||
|
return;
|
||||||
|
l = next_l;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,27 @@
|
||||||
|
#ifndef OBJECT_H
|
||||||
|
#define OBJECT_H
|
||||||
|
|
||||||
|
typedef struct _Imlib_Object_List {
|
||||||
|
struct _Imlib_Object_List *next, *prev;
|
||||||
|
} Imlib_Object_List;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int population;
|
||||||
|
Imlib_Object_List *buckets[256];
|
||||||
|
} Imlib_Hash;
|
||||||
|
|
||||||
|
typedef int (Imlib_Hash_Func) (Imlib_Hash * hash, const char *key,
|
||||||
|
void *data, void *fdata);
|
||||||
|
|
||||||
|
void *__imlib_object_list_prepend(void *in_list, void *in_item);
|
||||||
|
void *__imlib_object_list_remove(void *in_list, void *in_item);
|
||||||
|
|
||||||
|
Imlib_Hash *__imlib_hash_add(Imlib_Hash * hash, const char *key,
|
||||||
|
const void *data);
|
||||||
|
void *__imlib_hash_find(Imlib_Hash * hash, const char *key);
|
||||||
|
void __imlib_hash_free(Imlib_Hash * hash);
|
||||||
|
void __imlib_hash_foreach(Imlib_Hash * hash,
|
||||||
|
Imlib_Hash_Func * func,
|
||||||
|
const void *fdata);
|
||||||
|
|
||||||
|
#endif /* OBJECT_H */
|
Loading…
Reference in New Issue