46 #define MAPE_TEXTURE_MAP_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), MAPE_TYPE_TEXTURE_MAP, MapeTextureMapPrivate))
48 static GQuark mape_texture_map_error_quark;
56 mape_texture_map_get_average_color(GdkPixbuf* pixbuf)
64 unsigned int accum[4];
67 width = gdk_pixbuf_get_width(pixbuf);
68 height = gdk_pixbuf_get_height(pixbuf);
69 bpp = gdk_pixbuf_get_n_channels(pixbuf);
70 pixels = gdk_pixbuf_get_pixels(pixbuf);
71 rowstride = gdk_pixbuf_get_rowstride(pixbuf);
72 accum[0] = accum[1] = accum[2] = accum[3] = 0;
74 for(y = 0; y < height; ++y)
76 for(x = 0; x < width; ++x)
78 accum[0] += (int)pixels[bpp*x + y*rowstride + 0];
79 accum[1] += (int)pixels[bpp*x + y*rowstride + 1];
80 accum[2] += (int)pixels[bpp*x + y*rowstride + 2];
82 accum[3] += (int)pixels[bpp*x + y*rowstride + 3];
86 size = width * height;
87 accum[0] = (
unsigned int)(accum[0] / size + 0.5);
88 accum[1] = (
unsigned int)(accum[1] / size + 0.5);
89 accum[2] = (
unsigned int)(accum[2] / size + 0.5);
90 accum[3] = (
unsigned int)(accum[3] / size + 0.5);
91 return accum[0] | (accum[1] << 8) | (accum[2] << 16) | (accum[3] << 24);
111 mape_texture_map_finalize(GObject*
object)
123 G_OBJECT_CLASS(mape_texture_map_parent_class)->finalize(
object);
127 mape_texture_map_set_property(GObject*
object,
136 G_OBJECT_WARN_INVALID_PROPERTY_ID(value, prop_id, pspec);
142 mape_texture_map_get_property(GObject*
object,
157 g_value_set_uint(value, g_hash_table_size(priv->
texture_table));
159 g_value_set_uint(value, 0u);
168 G_OBJECT_WARN_INVALID_PROPERTY_ID(
object, prop_id, pspec);
180 GObjectClass* object_class;
182 object_class = G_OBJECT_CLASS(
class);
183 mape_texture_map_parent_class =
184 G_OBJECT_CLASS(g_type_class_peek_parent(
class));
187 object_class->finalize = mape_texture_map_finalize;
188 object_class->set_property = mape_texture_map_set_property;
189 object_class->get_property = mape_texture_map_get_property;
191 mape_texture_map_error_quark =
192 g_quark_from_static_string(
"MAPE_TEXTURE_MAP_ERROR");
194 g_object_class_install_property(
200 "The number of loaded textures",
208 g_object_class_install_property(
211 g_param_spec_boolean(
212 "overload-materials",
213 "Overload Materials",
214 "Whether to overload globally loaded materials",
220 g_object_class_install_property(
223 g_param_spec_boolean(
226 "Whether to overload globally loaded textures",
273 g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
285 g_object_notify(G_OBJECT(texture_map),
"overload-materials");
286 g_object_notify(G_OBJECT(texture_map),
"overload-textures");
311 static const char* SUFFIXES[] = {
312 ".png",
".jpg",
".jpeg",
".bmp",
313 ".PNG",
".JPG",
".JPEG",
".BMP",
320 const char*
const* ext;
322 gchar* casefold_name;
326 GdkPixbufLoader* loader;
331 g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
348 for(ext = SUFFIXES; *ext != NULL; ++ext)
349 if(g_str_has_suffix(name, *ext))
355 len = strlen(name)-strlen(*ext);
357 casefold_name = g_utf8_casefold(name, len);
362 if(g_hash_table_lookup(priv->
texture_table, casefold_name) == NULL)
371 loader = gdk_pixbuf_loader_new();
372 gdk_pixbuf_loader_set_size(loader, 24, 24);
373 if(!gdk_pixbuf_loader_write(loader, data, datalen, error))
377 gdk_pixbuf_loader_close(loader, NULL);
378 g_object_unref(loader);
383 if(!gdk_pixbuf_loader_close(loader, error))
386 g_object_unref(loader);
390 pixbuf = gdk_pixbuf_loader_get_pixbuf(loader);
391 g_object_ref(pixbuf);
392 g_object_unref(loader);
401 mape_texture_map_get_average_color(pixbuf)
403 g_hash_table_insert(priv->
texture_table, casefold_name, pixbuf);
407 g_free(casefold_name);
484 g_return_val_if_fail(
508 gchar* casefold_name;
512 g_return_val_if_fail(name != NULL, NULL);
515 casefold_name = g_utf8_casefold(name, -1);
516 pixbuf = GDK_PIXBUF(g_hash_table_lookup(priv->
texture_table, casefold_name));
517 g_free(casefold_name);
typedefG_BEGIN_DECLS struct _C4GroupHandle C4GroupHandle
guchar * mape_group_load_entry(MapeGroup *group, const gchar *entry, gsize *size, GError **error)
gchar * mape_group_get_next_entry(MapeGroup *group)
void mape_group_rewind(MapeGroup *group)
#define MAPE_IS_GROUP(obj)
guint32 c4_texture_handle_get_average_texture_color(C4TextureMapHandle *texture_map, const char *name)
const char * c4_texture_handle_get_entry_material_name(C4TextureMapHandle *texture_map, guint index)
const char * c4_texture_map_handle_get_texture(C4TextureMapHandle *texture_map, guint index)
const char * c4_texture_handle_get_entry_texture_name(C4TextureMapHandle *texture_map, guint index)
gboolean c4_texture_map_handle_add_texture(C4TextureMapHandle *texture_map, const char *texture, guint32 avg_color)
C4TextureMapHandle * c4_texture_map_handle_new(void)
void c4_texture_map_handle_free(C4TextureMapHandle *texture_map)
guint c4_texture_map_handle_load_map(C4TextureMapHandle *texture_map, C4GroupHandle *group, const char *entry_name, gboolean *overload_materials, gboolean *overload_textures)
typedefG_BEGIN_DECLS struct _C4TextureMapHandle C4TextureMapHandle
#define MAPE_TEXTURE_MAP_PRIVATE(obj)
gboolean mape_texture_map_get_overload_textures(MapeTextureMap *texture_map)
const gchar * mape_texture_map_get_texture_name_from_mapping(MapeTextureMap *texture_map, guint index)
gboolean mape_texture_map_load_textures(MapeTextureMap *texture_map, MapeGroup *group, GError **error)
MapeTextureMap * mape_texture_map_new(void)
const gchar * mape_texture_map_get_material_name_from_mapping(MapeTextureMap *texture_map, guint index)
gboolean mape_texture_map_get_overload_materials(MapeTextureMap *texture_map)
const gchar * mape_texture_map_get_texture_name(MapeTextureMap *texture_map, guint index)
GdkPixbuf * mape_texture_map_lookup_texture(MapeTextureMap *texture_map, const gchar *name)
GHashTable * texture_table
C4TextureMapHandle * handle
@ PROP_OVERLOAD_MATERIALS
gboolean overload_materials
gboolean mape_texture_map_load_map(MapeTextureMap *texture_map, MapeGroup *group, GError **error)
C4GroupHandle * _mape_group_get_handle(MapeGroup *group)
C4TextureMapHandle * _mape_texture_map_get_handle(MapeTextureMap *map)
guint32 mape_texture_map_get_average_texture_color(MapeTextureMap *texture_map, const gchar *name)
guint mape_texture_map_get_texture_count(MapeTextureMap *texture_map)
gboolean overload_textures
#define MAPE_IS_TEXTURE_MAP(obj)
#define MAPE_TEXTURE_MAP(obj)
#define MAPE_TYPE_TEXTURE_MAP