Started separating crud out of drawables. Isolated the id system of images entirely within pdb. Even the window titles and menus use pointers instead of ids. Should at least remind people that this is a developers' version. :)
232 lines
5.3 KiB
C
232 lines
5.3 KiB
C
#include "gimpimageP.h"
|
|
#include "gimage.h"
|
|
#include "gimpimage.h"
|
|
#include "channels_dialog.h"
|
|
#include "layers_dialog.h"
|
|
|
|
#include "indexed_palette.h"
|
|
|
|
#include "drawable.h"
|
|
#include "gdisplay.h"
|
|
#include "procedural_db.h"
|
|
|
|
#include "palette.h"
|
|
#include "undo.h"
|
|
|
|
#include "layer.h"
|
|
#include "layer_pvt.h"
|
|
#include "channel.h"
|
|
#include "tools.h"
|
|
#include "general.h"
|
|
|
|
/* gimage.c: Junk (ugly dependencies) from gimpimage.c on its way
|
|
to proper places. That is, the handlers should be moved to
|
|
layers_dialog, gdisplay, tools, etc.. */
|
|
|
|
static void gimage_dirty_handler (GimpImage* gimage);
|
|
static void gimage_destroy_handler (GimpImage* gimage);
|
|
static void gimage_rename_handler (GimpImage* gimage);
|
|
static void gimage_resize_handler (GimpImage* gimage);
|
|
static void gimage_restructure_handler (GimpImage* gimage);
|
|
static void gimage_repaint_handler (GimpImage* gimage, gint, gint, gint, gint);
|
|
|
|
/* This is the app's global context of "all images".. This should be
|
|
unglobalized, too */
|
|
|
|
static GSList* image_list;
|
|
|
|
GImage*
|
|
gimage_new(int width, int height, GimpImageBaseType base_type)
|
|
{
|
|
GimpImage* gimage = gimp_image_new (width, height, base_type);
|
|
|
|
gtk_signal_connect (GTK_OBJECT (gimage), "dirty",
|
|
GTK_SIGNAL_FUNC(gimage_dirty_handler), NULL);
|
|
gtk_signal_connect (GTK_OBJECT (gimage), "destroy",
|
|
GTK_SIGNAL_FUNC(gimage_destroy_handler), NULL);
|
|
gtk_signal_connect (GTK_OBJECT (gimage), "rename",
|
|
GTK_SIGNAL_FUNC(gimage_rename_handler), NULL);
|
|
gtk_signal_connect (GTK_OBJECT (gimage), "resize",
|
|
GTK_SIGNAL_FUNC(gimage_resize_handler), NULL);
|
|
gtk_signal_connect (GTK_OBJECT (gimage), "restructure",
|
|
GTK_SIGNAL_FUNC(gimage_restructure_handler), NULL);
|
|
gtk_signal_connect (GTK_OBJECT (gimage), "repaint",
|
|
GTK_SIGNAL_FUNC(gimage_repaint_handler), NULL);
|
|
|
|
image_list=g_slist_prepend(image_list, gimage);
|
|
pdb_add_image(gimage);
|
|
lc_dialog_update_image_list ();
|
|
indexed_palette_update_image_list ();
|
|
return gimage;
|
|
}
|
|
|
|
GImage*
|
|
gimage_get_ID (gint ID)
|
|
{
|
|
return pdb_id_to_image(ID);
|
|
}
|
|
|
|
|
|
/* Ack! GImages have their own ref counts! This is going to cause
|
|
trouble.. It should be pretty easy to convert to proper GtkObject
|
|
ref counting, though. */
|
|
|
|
void
|
|
gimage_delete (GImage *gimage)
|
|
{
|
|
gimage->ref_count--;
|
|
if (gimage->ref_count <= 0)
|
|
gtk_object_unref (GTK_OBJECT(gimage));
|
|
};
|
|
|
|
void
|
|
gimage_invalidate_previews (void)
|
|
{
|
|
GSList *tmp = image_list;
|
|
GimpImage *gimage;
|
|
|
|
while (tmp)
|
|
{
|
|
gimage = (GimpImage *) tmp->data;
|
|
gimp_image_invalidate_preview (gimage);
|
|
tmp = g_slist_next (tmp);
|
|
}
|
|
}
|
|
static void
|
|
gimage_dirty_handler (GimpImage* gimage){
|
|
if (active_tool && !active_tool->preserve) {
|
|
GDisplay* gdisp = active_tool->gdisp_ptr;
|
|
if (gdisp) {
|
|
if (gdisp->gimage == gimage)
|
|
tools_initialize (active_tool->type, gdisp);
|
|
else
|
|
tools_initialize (active_tool->type, NULL);
|
|
}
|
|
}
|
|
}
|
|
|
|
static void
|
|
gimage_destroy_handler (GimpImage* gimage)
|
|
{
|
|
|
|
/* free the undo list */
|
|
undo_free (gimage);
|
|
|
|
pdb_remove_image(gimage);
|
|
image_list=g_slist_remove(image_list, gimage);
|
|
lc_dialog_update_image_list ();
|
|
|
|
indexed_palette_update_image_list ();
|
|
}
|
|
|
|
static void
|
|
gimage_rename_handler (GimpImage* gimage)
|
|
{
|
|
gdisplays_update_title (gimage);
|
|
lc_dialog_update_image_list ();
|
|
indexed_palette_update_image_list ();
|
|
}
|
|
|
|
static void
|
|
gimage_resize_handler (GimpImage* gimage)
|
|
{
|
|
undo_push_group_end (gimage);
|
|
|
|
/* shrink wrap and update all views */
|
|
channel_invalidate_previews (gimage);
|
|
layer_invalidate_previews (gimage);
|
|
gimp_image_invalidate_preview (gimage);
|
|
gdisplays_update_full (gimage);
|
|
gdisplays_shrink_wrap (gimage);
|
|
}
|
|
|
|
static void
|
|
gimage_restructure_handler (GimpImage* gimage)
|
|
{
|
|
gdisplays_update_title (gimage);
|
|
}
|
|
|
|
static void
|
|
gimage_repaint_handler (GimpImage* gimage, gint x, gint y, gint w, gint h)
|
|
{
|
|
gdisplays_update_area (gimage, x, y, w, h);
|
|
}
|
|
|
|
|
|
|
|
/* These really belong in the layer class */
|
|
|
|
void
|
|
gimage_set_layer_mask_apply (GImage *gimage, GimpLayer* layer)
|
|
{
|
|
int off_x, off_y;
|
|
|
|
g_return_if_fail(gimage);
|
|
g_return_if_fail(layer);
|
|
|
|
if (! layer->mask)
|
|
return;
|
|
|
|
layer->apply_mask = ! layer->apply_mask;
|
|
drawable_offsets (GIMP_DRAWABLE(layer), &off_x, &off_y);
|
|
gdisplays_update_area (gimage, off_x, off_y,
|
|
drawable_width (GIMP_DRAWABLE(layer)),
|
|
drawable_height (GIMP_DRAWABLE(layer)));
|
|
}
|
|
|
|
|
|
|
|
void
|
|
gimage_set_layer_mask_edit (GImage *gimage, Layer * layer, int edit)
|
|
{
|
|
/* find the layer */
|
|
if (!layer)
|
|
return;
|
|
|
|
if (layer->mask)
|
|
layer->edit_mask = edit;
|
|
}
|
|
|
|
|
|
void
|
|
gimage_set_layer_mask_show (GImage *gimage, GimpLayer* layer)
|
|
{
|
|
int off_x, off_y;
|
|
|
|
g_return_if_fail(gimage);
|
|
g_return_if_fail(layer);
|
|
|
|
if (! layer->mask)
|
|
return;
|
|
|
|
layer->show_mask = ! layer->show_mask;
|
|
drawable_offsets (GIMP_DRAWABLE(layer), &off_x, &off_y);
|
|
gdisplays_update_area (gimage, off_x, off_y,
|
|
drawable_width (GIMP_DRAWABLE(layer)), drawable_height (GIMP_DRAWABLE(layer)));
|
|
}
|
|
|
|
void
|
|
gimage_foreach (GFunc func, gpointer user_data){
|
|
GSList* l;
|
|
for(l=image_list;l;l=l->next)
|
|
func(l->data, user_data);
|
|
}
|
|
|
|
GImage *
|
|
gimage_get_named (gchar *name)
|
|
{
|
|
GSList *tmp = image_list;
|
|
GimpImage *gimage;
|
|
char *str;
|
|
while (tmp)
|
|
{
|
|
gimage = tmp->data;
|
|
str = prune_filename (gimp_image_filename (gimage));
|
|
if (strcmp (str, name) == 0)
|
|
return gimage;
|
|
|
|
tmp = g_slist_next (tmp);
|
|
}
|
|
return NULL;
|
|
}
|
|
|