#include <stdlib.h>
#include "entity.h"
#include "SDL.h"
#include "sdl-common.h"
/**sdl_rectangle_render
* Render a sdl_sprite to the given SDL surface.
*
*/
void sdl_rectangle_render(SDL_Rect * dest, SDL_Surface * screen,
sdl_item * item)
{
dest->x = item->x;
dest->y = item->y;
dest->w = item->width;
dest->h = item->height;
SDL_FillRect(screen, dest, item->color);
return;
}
/**sdl_rectangle_refresh
* Set the refresh bit on our sprite to true.
*/
static gint
sdl_rectangle_refresh (ENode * node, EBuf * attr, EBuf * value)
{
return TRUE;
}
/**sdl_rectangle_new_pos
* Set the sprite to a new position, and set the refresh bit.
*/
static gint
sdl_rectangle_new_pos (ENode * node, EBuf * attr, EBuf * value)
{
char * xpos = NULL;
char * ypos = NULL;
char * width = NULL;
char * height = NULL;
sdl_item * item = NULL;
item = enode_get_kv(node, "item");
if (NULL == item)
{
g_warning ("Sdl-rectangle: No display item found.\n");
return FALSE;
}
xpos = enode_attrib_str (node, "xpos", NULL);
ypos = enode_attrib_str (node, "ypos", NULL);
width = enode_attrib_str (node, "width", NULL);
height = enode_attrib_str (node, "height", NULL);
if (NULL == xpos || NULL == ypos || NULL == width || NULL == height)
{
g_warning ("Sdl-rectangle: Bad x,y,width, or height position\n");
return FALSE;
}
item->x = atoi (xpos);
item->y = atoi (ypos);
item->width = atoi (width);
item->height = atoi (height);
enode_set_kv (node, "item", item);
return TRUE;
}
static gint
sdl_rectangle_set_color(ENode * node, EBuf * attr, EBuf * value)
{
int red, blue, green;
sdl_item * item = NULL;
ENode * parent;
SDL_Surface * screen;
/* Pull out the garray. */
parent = enode_parent (node, "sdl-window");
if (NULL == parent)
{
g_warning("Sdl-rectangle: Need parent of <sdl-window> type!\n");
return FALSE;
}
/* Get our SDL surface */
screen = enode_get_kv (parent, "surface");
if (NULL == screen)
{
g_warning("Sdl-rectangle: couldn't get valid screen.\n");
return FALSE;
}
item = enode_get_kv(node, "item");
if (NULL == item)
{
g_warning ("Sdl-rectangle: No display item found.\n");
return FALSE;
}
red = atoi (enode_attrib_str (node, "red", NULL) );
blue = atoi (enode_attrib_str (node, "blue", NULL) );
green = atoi (enode_attrib_str (node, "green", NULL) );
item->color = SDL_MapRGB(screen->format, red, green, blue);
item->needs_refresh = TRUE;
enode_set_kv (node, "item", item);
return TRUE;
}
/**sld_rectangle_setup
* setup the struct.
*/
static void
sdl_rectangle_setup (ENode * node)
{
ENode * parent;
GPtrArray * item_list = NULL;
SDL_Surface * screen;
char * src_str = NULL;
char * xpos = NULL;
char * ypos = NULL;
char * width = NULL;
char * height = NULL;
int red, blue, green;
sdl_item * item;
/* Pull out the garray. */
parent = enode_parent (node, "sdl-window");
if (NULL == parent)
{
g_warning("Sdl-rectangle: Need parent of <sdl-window> type!\n");
return;
}
/* Get our SDL surface */
screen = enode_get_kv (parent, "surface");
if (NULL == screen)
{
g_warning("Sdl-rectangle: couldn't get valid screen.\n");
return;
}
/* Get item list. */
item_list = enode_get_kv (parent, "item_list");
if (NULL == item_list)
{
g_warning ("Sdl-rectangle: Couldn't get sdl display list\n");
return;
}
src_str = enode_attrib_str (node, "src", NULL);
xpos = enode_attrib_str (node, "ypos", NULL);
ypos = enode_attrib_str (node, "xpos", NULL);
width = enode_attrib_str (node, "width", NULL);
height = enode_attrib_str (node, "height", NULL);
if (NULL == xpos || NULL == ypos || NULL == width || NULL == height)
{
g_warning ("Sdl-rectangle: Bad x and y position\n");
return;
}
red = atoi (enode_attrib_str (node, "red", NULL) );
blue = atoi (enode_attrib_str (node, "blue", NULL) );
green = atoi (enode_attrib_str (node, "green", NULL) );
item = malloc (sizeof (sdl_item));
/* Setup the item */
item->type = SDL_RECTANGLE;
item->name = "hi";
item->width = atoi (width);
item->height = atoi (height);
item->x = atoi (xpos);
item->y = atoi (ypos);
item->color = SDL_MapRGB(screen->format, red, green, blue);
item->needs_refresh = TRUE;
item->surface = NULL;
/* Push it on the display list */
g_ptr_array_add (item_list, item);
enode_set_kv(node, "item", item);
}
/**sdl_sprite_destroy
* Free the sprite.
*/
static void
sdl_rectangle_destroy (ENode * node)
{
}
/**sdl_rectangle_register
* Register the sdl rectangle attributes.
*/
void sdl_rectangle_register (void)
{
Element *element;
ElementAttr *e_attr;
/* Register sdl-sprite. */
element = g_new0 (Element, 1);
element->render_func = sdl_rectangle_setup;
element->destroy_func = sdl_rectangle_destroy;
element->parent_func = NULL;
element->tag = "sdl-rectangle";
element->description = "Create a new SDL window.";
element_register (element);
/* X position attribute. */
e_attr = g_new0 (ElementAttr, 1);
e_attr->attribute = "xpos";
e_attr->description = "X position of the sprite";
e_attr->value_desc = "integer";
e_attr->possible_values = "-1,*";
e_attr->set_attr_func = sdl_rectangle_new_pos;
element_register_attrib (element, e_attr);
/* Y position attribute. */
e_attr = g_new0 (ElementAttr, 1);
e_attr->attribute = "ypos";
e_attr->description = "y position of the sprite.";
e_attr->value_desc = "integer";
e_attr->possible_values = "-1,*";
e_attr->set_attr_func = sdl_rectangle_new_pos;
element_register_attrib (element, e_attr);
/* Width attribute. */
e_attr = g_new0 (ElementAttr, 1);
e_attr->attribute = "width";
e_attr->description = "Width.";
e_attr->value_desc = "integer";
e_attr->possible_values = "-1,*";
e_attr->set_attr_func = sdl_rectangle_new_pos;
element_register_attrib (element, e_attr);
/* Height position attribute. */
e_attr = g_new0 (ElementAttr, 1);
e_attr->attribute = "height";
e_attr->description = "Height.";
e_attr->value_desc = "integer";
e_attr->possible_values = "-1,*";
e_attr->set_attr_func = sdl_rectangle_new_pos;
element_register_attrib (element, e_attr);
/* Red attribute. */
e_attr = g_new0 (ElementAttr, 1);
e_attr->attribute = "red";
e_attr->description = "Red color value.";
e_attr->value_desc = "integer";
e_attr->possible_values = "-1,*";
e_attr->set_attr_func = sdl_rectangle_set_color;
element_register_attrib (element, e_attr);
/* Blue attribute. */
e_attr = g_new0 (ElementAttr, 1);
e_attr->attribute = "blue";
e_attr->description = "Blue color value.";
e_attr->value_desc = "integer";
e_attr->possible_values = "-1,*";
e_attr->set_attr_func = sdl_rectangle_set_color;
element_register_attrib (element, e_attr);
/* Green attribute. */
e_attr = g_new0 (ElementAttr, 1);
e_attr->attribute = "green";
e_attr->description = "Green color value.";
e_attr->value_desc = "integer";
e_attr->possible_values = "-1,*";
e_attr->set_attr_func = sdl_rectangle_set_color;
element_register_attrib (element, e_attr);
/* force-able refresh attribute. */
e_attr = g_new0 (ElementAttr, 1);
e_attr->attribute = "_refresh";
e_attr->description = "A force refresh";
e_attr->value_desc = "boolean";
e_attr->possible_values = "true,false";
e_attr->set_attr_func = sdl_rectangle_refresh;
element_register_attrib (element, e_attr);
}
syntax highlighted by Code2HTML, v. 0.9.1