mape: Don't dynamically allocate memory for each pixel to draw

scancodes-fix
Armin Burgmeier 2009-10-06 20:30:54 -04:00
parent bc980ebc12
commit b2af6314cb
4 changed files with 38 additions and 80 deletions

View File

@ -40,7 +40,7 @@ static void mape_mapgen_read_color(guint8* dest,
MapeMaterialMap* material_map,
unsigned int matnum)
{
MapeMaterial* mat;
const MapeMaterial* mat;
GdkColor color;
if(matnum == 0)
@ -61,10 +61,6 @@ static void mape_mapgen_read_color(guint8* dest,
color.green = 0xffff;
color.blue = 0xffff;
/* TODO: Make this matmap-owned,
* we can't realloc mat for each pixel! */
mape_material_free(mat);
dest[matnum * 4 + 1] = color.red * 0xff / 0xffff;
dest[matnum * 4 + 2] = color.green * 0xff / 0xffff;
dest[matnum * 4 + 3] = color.blue * 0xff / 0xffff;

View File

@ -16,14 +16,14 @@
*/
/**
* SECTION:mape-material-mape
* SECTION:mape-material-map
* @title: MapeMaterialMap
* @short_description: C4MaterialMap interface
* @include: mape/material.h
* @stability: Unstable
*
* #MapeMaterialMap is a simple GObject-based interface to C4MaterialMap.
* It supports loading a material map from a Material.c4g material_map file. It can
* It supports loading a material map from a Material.c4g group file. It can
* load multiple files, with newer entries overloading previous ones in case
* of name clashes to support material overloading.
**/
@ -35,17 +35,17 @@
C4GroupHandle*
_mape_group_get_handle(MapeGroup* group);
C4MaterialHandle*
C4MaterialMapHandle*
_mape_material_map_get_handle(MapeMaterialMap* map);
struct _MapeMaterial {
/*struct _MapeMaterial {
MapeMaterialMap* map;
unsigned int mat_index;
};
};*/
typedef struct _MapeMaterialMapPrivate MapeMaterialMapPrivate;
struct _MapeMaterialMapPrivate {
C4MaterialHandle* handle;
C4MaterialMapHandle* handle;
};
enum {
@ -69,14 +69,22 @@ static MapeMaterial*
mape_material_new(MapeMaterialMap* map,
guint mat_index)
{
MapeMaterial* material;
MapeMaterialMapPrivate* priv;
priv = MAPE_MATERIAL_MAP_PRIVATE(map);
material = g_slice_new(MapeMaterial);
material->map = map;
material->mat_index = mat_index;
return (MapeMaterial*)c4_material_map_handle_get_material(priv->handle,
mat_index);
}
g_object_ref(map);
return material;
static MapeMaterial*
mape_material_copy(const MapeMaterial* material)
{
return (MapeMaterial*)material;
}
static void
mape_material_free(MapeMaterial* material)
{
}
/*
@ -89,7 +97,7 @@ mape_material_map_init(MapeMaterialMap* material_map)
MapeMaterialMapPrivate* priv;
priv = MAPE_MATERIAL_MAP_PRIVATE(material_map);
priv->handle = c4_material_handle_new();
priv->handle = c4_material_map_handle_new();
}
static void
@ -101,7 +109,7 @@ mape_material_map_finalize(GObject* object)
material_map = MAPE_MATERIAL_MAP(object);
priv = MAPE_MATERIAL_MAP_PRIVATE(material_map);
c4_material_handle_free(priv->handle);
c4_material_map_handle_free(priv->handle);
G_OBJECT_CLASS(mape_material_map_parent_class)->finalize(object);
}
@ -141,7 +149,7 @@ mape_material_map_get_property(GObject* object,
switch(prop_id)
{
case PROP_N_MATERIALS:
g_value_set_uint(value, c4_material_handle_get_num(priv->handle));
g_value_set_uint(value, c4_material_map_handle_get_num(priv->handle));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
@ -249,7 +257,7 @@ mape_material_map_load(MapeMaterialMap* map,
priv = MAPE_MATERIAL_MAP_PRIVATE(map);
new_count = c4_material_handle_load(
new_count = c4_material_map_handle_load(
priv->handle, _mape_group_get_handle(from));
if(new_count > 0)
@ -270,20 +278,21 @@ guint
mape_material_map_get_material_count(MapeMaterialMap* map)
{
g_return_val_if_fail(MAPE_IS_MATERIAL_MAP(map), 0);
return c4_material_handle_get_num(MAPE_MATERIAL_MAP_PRIVATE(map)->handle);
return c4_material_map_handle_get_num(
MAPE_MATERIAL_MAP_PRIVATE(map)->handle);
}
/**
* mape_material_map_get_material:
* @material: A #MapeMaterialMap.
* @map: A #MapeMaterialMap.
* @index: A material index.
*
* Returns the entry with the given index in the map.
*
* Returns: A new #MapeMaterial to be freed with mape_material_free() when
* no longer needed.
* Returns: A #MapeMaterial representing the indexed material. It is owned
* by #map and must not be used anymore after the map is finalized.
**/
MapeMaterial*
const MapeMaterial*
mape_material_map_get_material(MapeMaterialMap* map,
guint index)
{
@ -292,7 +301,8 @@ mape_material_map_get_material(MapeMaterialMap* map,
g_return_val_if_fail(MAPE_IS_MATERIAL_MAP(map), NULL);
priv = MAPE_MATERIAL_MAP_PRIVATE(map);
g_return_val_if_fail(index < c4_material_handle_get_num(priv->handle), NULL);
g_return_val_if_fail(index < c4_material_map_handle_get_num(priv->handle),
NULL);
return mape_material_new(map, index);
}
@ -333,37 +343,6 @@ mape_material_map_get_material_by_name(MapeMaterialMap* map,
}
#endif
/**
* mape_material_copy:
* @material: A #MapeMaterial.
*
* Creates a copy of @material.
*
* Returns: A new #MapeMaterial to be freed with mape_material_free() when
* no longer needed.
*/
MapeMaterial*
mape_material_copy(const MapeMaterial* material)
{
g_return_val_if_fail(material != NULL, NULL);
return mape_material_new(material->map, material->mat_index);
}
/**
* mape_material_free:
* @material: A #MapeMaterial.
*
* Releases all ressources taken up by @material.
*/
void
mape_material_free(MapeMaterial* material)
{
g_return_if_fail(material != NULL);
g_object_unref(material->map);
g_slice_free(MapeMaterial, material);
}
/**
* mape_material_get_name:
* @material: A #MapeMaterial.
@ -376,12 +355,8 @@ mape_material_free(MapeMaterial* material)
const gchar*
mape_material_get_name(const MapeMaterial* material)
{
MapeMaterialMapPrivate* priv;
g_return_val_if_fail(material != NULL, NULL);
priv = MAPE_MATERIAL_MAP_PRIVATE(material->map);
return c4_material_handle_get_name(priv->handle, material->mat_index);
return c4_material_handle_get_name((C4MaterialHandle*)material);
}
/**
@ -397,17 +372,12 @@ mape_material_get_name(const MapeMaterial* material)
const gchar*
mape_material_get_texture_overlay(const MapeMaterial* material)
{
MapeMaterialMapPrivate* priv;
g_return_val_if_fail(material != NULL, NULL);
priv = MAPE_MATERIAL_MAP_PRIVATE(material->map);
return c4_material_handle_get_texture_overlay(
priv->handle, material->mat_index);
return c4_material_handle_get_texture_overlay((C4MaterialHandle*)material);
}
/* This function is for internal use only */
C4MaterialHandle*
C4MaterialMapHandle*
_mape_material_map_get_handle(MapeMaterialMap* map)
{
g_return_val_if_fail(MAPE_IS_MATERIAL_MAP(map), NULL);

View File

@ -87,7 +87,7 @@ mape_material_map_load(MapeMaterialMap* map,
guint
mape_material_map_get_material_count(MapeMaterialMap* map);
MapeMaterial*
const MapeMaterial*
mape_material_map_get_material(MapeMaterialMap* map,
guint index);
@ -97,12 +97,6 @@ mape_material_map_get_material_by_name(MapeMaterialMap* map,
const gchar* name);
#endif
MapeMaterial*
mape_material_copy(const MapeMaterial* material);
void
mape_material_free(MapeMaterial* material);
const gchar*
mape_material_get_name(const MapeMaterial* material);

View File

@ -100,7 +100,7 @@ gboolean mape_mat_tex_view_reload(MapeMatTexView* view,
MapeMaterialMap* new_mat_map;
MapeTextureMap* new_tex_map;
MapeFileIcon* icon;
MapeMaterial* mat;
const MapeMaterial* mat;
unsigned int i;
new_mat_map = mape_material_map_new();
@ -145,8 +145,6 @@ gboolean mape_mat_tex_view_reload(MapeMatTexView* view,
mape_file_icon_get(icon),
mape_material_get_name(mat)
);
mape_material_free(mat);
}
mape_icon_view_clear(view->view_tex);