summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVasily_Makarov <danilka.pro@gmail.com>2011-06-10 13:05:27 +0400
committerVasily_Makarov <danilka.pro@gmail.com>2011-06-10 13:05:27 +0400
commitd453d6488125405018bb066f80d8799309b323a6 (patch)
tree778d111dd631f4909c8799312106ad9e285d4447
parent313e47124a149c26b0e004b0d249bceeb2a61559 (diff)
downloadevol-tools-d453d6488125405018bb066f80d8799309b323a6.tar.gz
evol-tools-d453d6488125405018bb066f80d8799309b323a6.tar.bz2
evol-tools-d453d6488125405018bb066f80d8799309b323a6.tar.xz
evol-tools-d453d6488125405018bb066f80d8799309b323a6.zip
saedit: Add background support
-rw-r--r--saedit/main.c56
-rw-r--r--saedit/main.h23
2 files changed, 58 insertions, 21 deletions
diff --git a/saedit/main.c b/saedit/main.c
index cf31128..b6ea880 100644
--- a/saedit/main.c
+++ b/saedit/main.c
@@ -18,18 +18,37 @@ sprite_info *sprite_info_new(int index, int offsetX, int offsetY) {
res->offsetY = offsetY;
return res;
}
+cairo_surface_t *get_grid_surface(int w, int h) {
+ cairo_surface_t *surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, (w + 2) * GRID_SIZE, (h + 2) * GRID_SIZE);
+ cairo_t *cr = cairo_create(surface);
+ int x, y;
+
+ cairo_surface_t *gridsurf = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, w * GRID_SIZE + 1, h * GRID_SIZE + 1);
+ cairo_t *scr = cairo_create(gridsurf);
+
+ cairo_set_line_width(scr, 1);
+
+ for (x = 0; x < w; x++)
+ for (y = 0; y < h; y++) {
+ gdk_cairo_set_source_pixbuf(cr, imageset->ground, x * GRID_SIZE, y * GRID_SIZE);
+ cairo_paint(cr);
+ cairo_rectangle(scr, x*GRID_SIZE+0.5, y*GRID_SIZE+0.5, GRID_SIZE, GRID_SIZE);
+ cairo_stroke(scr);
+ }
+ cairo_set_source_surface(cr, gridsurf, GRID_SIZE, GRID_SIZE);
+ cairo_paint(cr);
+ return surface;
+}
gboolean on_expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer data) {
int width = widget->allocation.width,
height = widget->allocation.height;
+ int w = 3, h = 3;
+
cairo_t *cr = gdk_cairo_create(widget->window);
- cairo_surface_t *gridsurf = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height);
- cairo_t *scr = cairo_create(gridsurf);
- cairo_set_line_width(scr, 0.1);
- cairo_rectangle(scr, width/2 -GRID_SIZE/2, height/2, GRID_SIZE, GRID_SIZE);
- cairo_stroke(scr);
- cairo_set_source_surface(cr, gridsurf, 0, 0);
+
+ cairo_set_source_surface(cr, get_grid_surface(w, h), width/2 - GRID_SIZE * (w + 2) * 0.5, height/2 - GRID_SIZE * ((h + 2) * 0.5 - 0.5));
cairo_paint(cr);
GdkPixbuf *pbuf = get_sprite_by_index(current_sprite->index);
@@ -62,7 +81,7 @@ void open_xml_file(GtkButton *button, gpointer buffer) {
}
void free_imagesets() {
- spriteset = NULL;
+ imageset->spriteset = NULL;
imageset = imageset_info_new();
imagesets = NULL;
gtk_list_store_clear(GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(imagesetscombobox))));
@@ -133,8 +152,8 @@ gint xml_node_compare_with_name_attr(gconstpointer node, gconstpointer name) {
GdkPixbuf* get_sprite_by_index(size_t index) {
size_t w = spriteset_width/sprite_width;
- if (spriteset == NULL) return NULL;
- return gdk_pixbuf_new_subpixbuf(spriteset, index%w*sprite_width, index/w*sprite_height, sprite_width, sprite_height);
+ if (imageset->spriteset == NULL) return NULL;
+ return gdk_pixbuf_new_subpixbuf(imageset->spriteset, index%w*sprite_width, index/w*sprite_height, sprite_width, sprite_height);
}
void set_sprite_by_index(size_t index) {
@@ -340,15 +359,26 @@ void set_up_imageset_by_node(XMLNode *node) {
gchar path[255];
g_sprintf(path, "%s/%s", datapath, src);
- spriteset = gdk_pixbuf_new_from_file(path, NULL);
- spriteset_width = gdk_pixbuf_get_width(spriteset);
- spriteset_height = gdk_pixbuf_get_height(spriteset);
+ imageset->spriteset = gdk_pixbuf_new_from_file(path, NULL);
+ spriteset_width = gdk_pixbuf_get_width(imageset->spriteset);
+ spriteset_height = gdk_pixbuf_get_height(imageset->spriteset);
gchar *width = xml_node_get_attr_value(imageset->node, "width");
sscanf(width, "%d", &sprite_width);
gchar *height = xml_node_get_attr_value(imageset->node, "height");
sscanf(height, "%d", &sprite_height);
+ GList *list = g_list_find_custom(root->sub_nodes, "background", xml_node_compare_with_name);
+ if (list != NULL) {
+ gchar *image_attr = xml_node_get_attr_value((XMLNode *)list->data, "image");
+ if (image_attr != NULL) {
+ image_attr = g_strjoin(NULL, BACKGROUNDS_DIR, "/", image_attr, ".png", NULL);
+ GdkPixbuf *pbuf = gdk_pixbuf_new_from_file(image_attr, NULL);
+ if(pbuf != NULL)
+ imageset->ground = pbuf;
+ }
+ }
+
set_sprite_by_index(0);
}
@@ -522,7 +552,7 @@ gboolean frame_image_button_press_event(GtkWidget *widget, GdkEventButton *butto
}
void show_imageset_window() {
- if (spriteset == NULL) return;
+ if (imageset->spriteset == NULL) return;
GtkWidget *iwin = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(iwin), "Imageset preview");
gtk_window_set_position(GTK_WINDOW(iwin), GTK_WIN_POS_CENTER);
diff --git a/saedit/main.h b/saedit/main.h
index b211603..12f5f5a 100644
--- a/saedit/main.h
+++ b/saedit/main.h
@@ -17,6 +17,13 @@
#include <cairo.h>
#include <glib/gi18n.h>
+const int MIN_WIDTH = 600;
+const int MIN_HEIGHT = 600;
+const int SPRITE_WIDTH_DEFAULT = 64;
+const int SPRITE_HEIGHT_DEFAULT = 64;
+const int GRID_SIZE = 32;
+const gchar *BACKGROUNDS_DIR = "backgrounds";
+
typedef struct {
XMLNode *node;
GList *next;
@@ -34,17 +41,15 @@ typedef struct {
XMLNode *node;
int offsetX;
int offsetY;
+ GdkPixbuf *spriteset;
+ GdkPixbuf *ground;
} imageset_info;
static imageset_info *imageset_info_new() {
- return g_new0(imageset_info, 1);
+ imageset_info *res = g_new0(imageset_info, 1);
+ res->ground = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, GRID_SIZE * 3, GRID_SIZE * 3);
+ return res;
}
-const int MIN_WIDTH = 600;
-const int MIN_HEIGHT = 600;
-const int SPRITE_WIDTH_DEFAULT = 64;
-const int SPRITE_HEIGHT_DEFAULT = 64;
-const int GRID_SIZE = 32;
-
int sprite_width = 64, sprite_height = 64;
int spriteset_width, spriteset_height;
@@ -59,7 +64,8 @@ GtkWidget *actionscombobox = NULL;
GtkWidget *animationscombobox = NULL;
GtkSourceBuffer *sbuf = NULL;
-GdkPixbuf *spriteset = NULL;
+//GdkPixbuf *spriteset = NULL;
+//GdkPixbuf *ground = NULL;
GList *imagesets = NULL;
GList *actions = NULL;
@@ -103,3 +109,4 @@ static void set_up_interface();
static void show_about_dialog();
static void show_imageset_window();
static gboolean frame_image_button_press_event(GtkWidget *widget, GdkEventButton *button, int index);
+static cairo_surface_t *get_grid_surface(int w, int h);