added gimp_item_configure() and gimp_item_copy().

2003-01-31  Michael Natterer  <mitch@gimp.org>

	* app/core/gimpitem.[ch]: added gimp_item_configure() and
	gimp_item_copy().

	* app/core/gimpdrawable.c (gimp_drawable_configure,copy): use them.

	* app/vectors/gimpvectors.[ch]: added gimp_vectors_new(),
	gimp_vectors_copy() and gimp_vectors_copy_points(). Use the new
	GimpItem functions just as GimpDrawable does. Added a
	get_memsize() implementation.

	* app/vectors/gimpstroke.[ch]: made it a GimpObject and added
	a get_memsize() implementation.

	* app/undo.c: implemented vectors undo as if the new GimpVectors
	functions above worked.

	* app/gui/dialogs-constructors.c
	* app/gui/vectors-commands.c
	* app/tools/gimpvectortool.c: use gimp_vectors_new,copy().
This commit is contained in:
Michael Natterer 2003-01-31 18:08:32 +00:00 committed by Michael Natterer
parent 291eb383c7
commit 794885e297
15 changed files with 300 additions and 172 deletions

View File

@ -1,3 +1,25 @@
2003-01-31 Michael Natterer <mitch@gimp.org>
* app/core/gimpitem.[ch]: added gimp_item_configure() and
gimp_item_copy().
* app/core/gimpdrawable.c (gimp_drawable_configure,copy): use them.
* app/vectors/gimpvectors.[ch]: added gimp_vectors_new(),
gimp_vectors_copy() and gimp_vectors_copy_points(). Use the new
GimpItem functions just as GimpDrawable does. Added a
get_memsize() implementation.
* app/vectors/gimpstroke.[ch]: made it a GimpObject and added
a get_memsize() implementation.
* app/undo.c: implemented vectors undo as if the new GimpVectors
functions above worked.
* app/gui/dialogs-constructors.c
* app/gui/vectors-commands.c
* app/tools/gimpvectortool.c: use gimp_vectors_new,copy().
2003-01-31 Sven Neumann <sven@gimp.org>
* app/core/gimpdrawable.[ch]: added offset_x and offset_y to

View File

@ -122,18 +122,11 @@ vectors_duplicate_vectors_cmd_callback (GtkWidget *widget,
GimpVectors *new_vectors;
return_if_no_vectors (gimage, active_vectors, data);
new_vectors = NULL;
#ifdef __GNUC__
#warning FIXME: need gimp_vectors_copy()
#endif
#if 0
new_vectors = gimp_vectors_copy (active_vectors,
G_TYPE_FROM_INSTANCE (active_vectors),
TRUE);
gimp_image_add_vectors (gimage, new_vectors, -1);
gimp_image_flush (gimage);
#endif
}
void
@ -410,12 +403,10 @@ new_vectors_query_ok_callback (GtkWidget *widget,
if ((gimage = options->gimage))
{
new_vectors = g_object_new (GIMP_TYPE_VECTORS, NULL);
new_vectors = gimp_vectors_new (gimage, vectors_name);
gimp_image_add_vectors (gimage, new_vectors, -1);
gimp_object_set_name (GIMP_OBJECT (new_vectors), vectors_name);
gimp_image_flush (gimage);
}
@ -440,12 +431,10 @@ vectors_new_vectors_query (GimpImage *gimage,
{
GimpVectors *new_vectors;
new_vectors = g_object_new (GIMP_TYPE_VECTORS, NULL);
new_vectors = gimp_vectors_new (gimage, _("Empty Vectors Copy"));
gimp_image_add_vectors (gimage, new_vectors, -1);
gimp_object_set_name (GIMP_OBJECT (new_vectors),
_("Empty Vectors Copy"));
return;
}

View File

@ -226,11 +226,9 @@ gimp_drawable_configure (GimpDrawable *drawable,
g_return_if_fail (GIMP_IS_DRAWABLE (drawable));
g_return_if_fail (GIMP_IS_IMAGE (gimage));
GIMP_ITEM (drawable)->ID = gimage->gimp->next_item_ID++;
g_hash_table_insert (gimage->gimp->item_table,
GINT_TO_POINTER (GIMP_ITEM (drawable)->ID),
drawable);
/* if not already configured by gimp_item_copy() */
if (! GIMP_ITEM (drawable)->ID)
gimp_item_configure (GIMP_ITEM (drawable), gimage, name);
drawable->width = width;
drawable->height = height;
@ -248,10 +246,6 @@ gimp_drawable_configure (GimpDrawable *drawable,
drawable->visible = TRUE;
gimp_item_set_image (GIMP_ITEM (drawable), gimage);
gimp_object_set_name (GIMP_OBJECT (drawable), name ? name : _("Unnamed"));
/* preview variables */
drawable->preview_cache = NULL;
drawable->preview_valid = FALSE;
@ -266,49 +260,18 @@ gimp_drawable_copy (GimpDrawable *drawable,
GimpImageType new_image_type;
PixelRegion srcPR;
PixelRegion destPR;
gchar *new_name;
g_return_val_if_fail (GIMP_IS_DRAWABLE (drawable), NULL);
g_return_val_if_fail (g_type_is_a (new_type, GIMP_TYPE_DRAWABLE), NULL);
/* formulate the new name */
{
const gchar *name;
gchar *ext;
gint number;
gint len;
name = gimp_object_get_name (GIMP_OBJECT (drawable));
g_return_val_if_fail (name != NULL, NULL);
ext = strrchr (name, '#');
len = strlen (_("copy"));
if ((strlen (name) >= len &&
strcmp (&name[strlen (name) - len], _("copy")) == 0) ||
(ext && (number = atoi (ext + 1)) > 0 &&
((int)(log10 (number) + 1)) == strlen (ext + 1)))
{
/* don't have redundant "copy"s */
new_name = g_strdup (name);
}
else
{
new_name = g_strdup_printf (_("%s copy"), name);
}
}
new_drawable = GIMP_DRAWABLE (gimp_item_copy (GIMP_ITEM (drawable),
new_type,
add_alpha));
if (add_alpha)
{
new_image_type = gimp_drawable_type_with_alpha (drawable);
}
else
{
new_image_type = drawable->type;
}
new_drawable = g_object_new (new_type, NULL);
new_image_type = gimp_drawable_type (drawable);
gimp_drawable_configure (new_drawable,
gimp_item_get_image (GIMP_ITEM (drawable)),
@ -317,34 +280,25 @@ gimp_drawable_copy (GimpDrawable *drawable,
gimp_drawable_width (drawable),
gimp_drawable_height (drawable),
new_image_type,
new_name);
g_free (new_name);
GIMP_OBJECT (new_drawable)->name);
new_drawable->visible = drawable->visible;
pixel_region_init (&srcPR, drawable->tiles,
0, 0,
drawable->width,
drawable->height,
gimp_drawable_width (drawable),
gimp_drawable_height (drawable),
FALSE);
pixel_region_init (&destPR, new_drawable->tiles,
0, 0,
drawable->width,
drawable->height,
gimp_drawable_width (new_drawable),
gimp_drawable_height (new_drawable),
TRUE);
if (new_image_type == drawable->type)
{
copy_region (&srcPR, &destPR);
}
else
{
add_alpha_region (&srcPR, &destPR);
}
g_object_unref (GIMP_ITEM (new_drawable)->parasites);
GIMP_ITEM (new_drawable)->parasites =
gimp_parasite_list_copy (GIMP_ITEM (drawable)->parasites);
return new_drawable;
}

View File

@ -52,6 +52,8 @@
#include "paint/gimppaintcore.h"
#include "vectors/gimpvectors.h"
#include "tools/gimpbycolorselecttool.h"
#include "tools/gimppainttool.h"
#include "tools/gimptransformtool.h"
@ -2710,7 +2712,9 @@ undo_push_vectors_mod (GimpImage *gimage,
new->free_func = undo_free_vectors_mod;
vmu->vectors = vectors;
vmu->undo_vectors = NULL; /* gimp_vectors_duplicate (vectors); */
vmu->undo_vectors = gimp_vectors_copy (vectors,
G_TYPE_FROM_INSTANCE (vectors),
FALSE);
return TRUE;
}
@ -2731,11 +2735,13 @@ undo_pop_vectors_mod (GimpImage *gimage,
temp = vmu->undo_vectors;
vmu->undo_vectors = NULL; /* gimp_vectors_duplicate (vmu->vectors); */
vmu->undo_vectors = gimp_vectors_copy (vmu->vectors,
G_TYPE_FROM_INSTANCE (vmu->vectors),
FALSE);
/* gimp_vectors_copy_strokes (temp, vmu->vectors); */
gimp_vectors_copy_strokes (temp, vmu->vectors);
/* g_object_unref (temp); */
g_object_unref (temp);
return TRUE;
}
@ -2749,7 +2755,7 @@ undo_free_vectors_mod (UndoState state,
vmu = (VectorsModUndo *) vmu_ptr;
/* g_object_unref (vmu->undo_vectors); */
g_object_unref (vmu->undo_vectors);
g_free (vmu);
}

View File

@ -279,6 +279,79 @@ gimp_item_removed (GimpItem *item)
g_signal_emit (item, gimp_item_signals[REMOVED], 0);
}
void
gimp_item_configure (GimpItem *item,
GimpImage *gimage,
const gchar *name)
{
g_return_if_fail (GIMP_IS_ITEM (item));
g_return_if_fail (item->ID == 0);
g_return_if_fail (item->gimage == 0);
g_return_if_fail (GIMP_IS_IMAGE (gimage));
item->ID = gimage->gimp->next_item_ID++;
g_hash_table_insert (gimage->gimp->item_table,
GINT_TO_POINTER (item->ID),
item);
gimp_item_set_image (item, gimage);
gimp_object_set_name (GIMP_OBJECT (item), name ? name : _("Unnamed"));
}
GimpItem *
gimp_item_copy (GimpItem *item,
GType new_type,
gboolean add_alpha)
{
GimpItem *new_item;
gchar *new_name;
g_return_val_if_fail (GIMP_IS_ITEM (item), NULL);
g_return_val_if_fail (GIMP_IS_IMAGE (item->gimage), NULL);
g_return_val_if_fail (g_type_is_a (new_type, GIMP_TYPE_ITEM), NULL);
/* formulate the new name */
{
const gchar *name;
gchar *ext;
gint number;
gint len;
name = gimp_object_get_name (GIMP_OBJECT (item));
g_return_val_if_fail (name != NULL, NULL);
ext = strrchr (name, '#');
len = strlen (_("copy"));
if ((strlen (name) >= len &&
strcmp (&name[strlen (name) - len], _("copy")) == 0) ||
(ext && (number = atoi (ext + 1)) > 0 &&
((int)(log10 (number) + 1)) == strlen (ext + 1)))
{
/* don't have redundant "copy"s */
new_name = g_strdup (name);
}
else
{
new_name = g_strdup_printf (_("%s copy"), name);
}
}
new_item = g_object_new (new_type, NULL);
gimp_item_configure (new_item, gimp_item_get_image (item), new_name);
g_free (new_name);
g_object_unref (new_item->parasites);
new_item->parasites = gimp_parasite_list_copy (item->parasites);
return new_item;
}
gint
gimp_item_get_ID (GimpItem *item)
{

View File

@ -57,6 +57,13 @@ GType gimp_item_get_type (void) G_GNUC_CONST;
void gimp_item_removed (GimpItem *item);
void gimp_item_configure (GimpItem *item,
GimpImage *gimage,
const gchar *name);
GimpItem * gimp_item_copy (GimpItem *item,
GType new_type,
gboolean add_alpha);
gint gimp_item_get_ID (GimpItem *item);
GimpItem * gimp_item_get_by_ID (Gimp *gimp,
gint id);

View File

@ -703,17 +703,6 @@ dialogs_channel_list_view_new (GimpDialogFactory *factory,
return dockable;
}
static GimpVectors *
gimp_vectors_copy (const GimpVectors *vectors,
GType new_type,
gboolean add_alpha /* unused */)
{
g_return_val_if_fail (GIMP_IS_VECTORS (vectors), NULL);
g_return_val_if_fail (g_type_is_a (new_type, GIMP_TYPE_VECTORS), NULL);
return NULL;
}
GtkWidget *
dialogs_vectors_list_view_new (GimpDialogFactory *factory,
GimpContext *context,

View File

@ -703,17 +703,6 @@ dialogs_channel_list_view_new (GimpDialogFactory *factory,
return dockable;
}
static GimpVectors *
gimp_vectors_copy (const GimpVectors *vectors,
GType new_type,
gboolean add_alpha /* unused */)
{
g_return_val_if_fail (GIMP_IS_VECTORS (vectors), NULL);
g_return_val_if_fail (g_type_is_a (new_type, GIMP_TYPE_VECTORS), NULL);
return NULL;
}
GtkWidget *
dialogs_vectors_list_view_new (GimpDialogFactory *factory,
GimpContext *context,

View File

@ -122,18 +122,11 @@ vectors_duplicate_vectors_cmd_callback (GtkWidget *widget,
GimpVectors *new_vectors;
return_if_no_vectors (gimage, active_vectors, data);
new_vectors = NULL;
#ifdef __GNUC__
#warning FIXME: need gimp_vectors_copy()
#endif
#if 0
new_vectors = gimp_vectors_copy (active_vectors,
G_TYPE_FROM_INSTANCE (active_vectors),
TRUE);
gimp_image_add_vectors (gimage, new_vectors, -1);
gimp_image_flush (gimage);
#endif
}
void
@ -410,12 +403,10 @@ new_vectors_query_ok_callback (GtkWidget *widget,
if ((gimage = options->gimage))
{
new_vectors = g_object_new (GIMP_TYPE_VECTORS, NULL);
new_vectors = gimp_vectors_new (gimage, vectors_name);
gimp_image_add_vectors (gimage, new_vectors, -1);
gimp_object_set_name (GIMP_OBJECT (new_vectors), vectors_name);
gimp_image_flush (gimage);
}
@ -440,12 +431,10 @@ vectors_new_vectors_query (GimpImage *gimage,
{
GimpVectors *new_vectors;
new_vectors = g_object_new (GIMP_TYPE_VECTORS, NULL);
new_vectors = gimp_vectors_new (gimage, _("Empty Vectors Copy"));
gimp_image_add_vectors (gimage, new_vectors, -1);
gimp_object_set_name (GIMP_OBJECT (new_vectors),
_("Empty Vectors Copy"));
return;
}

View File

@ -302,10 +302,9 @@ gimp_vector_tool_button_press (GimpTool *tool,
{
GimpVectors *vectors;
vectors = g_object_new (GIMP_TYPE_VECTORS, NULL);
vectors = gimp_vectors_new (gdisp->gimage, _("Unnamed"));
gimp_image_add_vectors (gdisp->gimage, vectors, -1);
gimp_object_set_name (GIMP_OBJECT (vectors), _("Unnamed"));
vector_tool->vectors = g_object_ref (vectors);
}

View File

@ -52,6 +52,8 @@
#include "paint/gimppaintcore.h"
#include "vectors/gimpvectors.h"
#include "tools/gimpbycolorselecttool.h"
#include "tools/gimppainttool.h"
#include "tools/gimptransformtool.h"
@ -2710,7 +2712,9 @@ undo_push_vectors_mod (GimpImage *gimage,
new->free_func = undo_free_vectors_mod;
vmu->vectors = vectors;
vmu->undo_vectors = NULL; /* gimp_vectors_duplicate (vectors); */
vmu->undo_vectors = gimp_vectors_copy (vectors,
G_TYPE_FROM_INSTANCE (vectors),
FALSE);
return TRUE;
}
@ -2731,11 +2735,13 @@ undo_pop_vectors_mod (GimpImage *gimage,
temp = vmu->undo_vectors;
vmu->undo_vectors = NULL; /* gimp_vectors_duplicate (vmu->vectors); */
vmu->undo_vectors = gimp_vectors_copy (vmu->vectors,
G_TYPE_FROM_INSTANCE (vmu->vectors),
FALSE);
/* gimp_vectors_copy_strokes (temp, vmu->vectors); */
gimp_vectors_copy_strokes (temp, vmu->vectors);
/* g_object_unref (temp); */
g_object_unref (temp);
return TRUE;
}
@ -2749,7 +2755,7 @@ undo_free_vectors_mod (UndoState state,
vmu = (VectorsModUndo *) vmu_ptr;
/* g_object_unref (vmu->undo_vectors); */
g_object_unref (vmu->undo_vectors);
g_free (vmu);
}

View File

@ -19,7 +19,6 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "config.h"
#include "glib-object.h"
@ -30,12 +29,6 @@
#include "gimpstroke.h"
/* private variables */
static GObjectClass *parent_class = NULL;
/* Prototypes */
static void gimp_stroke_class_init (GimpStrokeClass *klass);
@ -43,6 +36,8 @@ static void gimp_stroke_init (GimpStroke *stroke);
static void gimp_stroke_finalize (GObject *object);
static gsize gimp_stroke_get_memsize (GimpObject *object);
static GimpAnchor * gimp_stroke_real_anchor_get (const GimpStroke *stroke,
const GimpCoords *coord);
static GimpAnchor * gimp_stroke_real_anchor_get_next (const GimpStroke *stroke,
@ -57,6 +52,11 @@ static void gimp_stroke_real_anchor_move_absolute (GimpStroke *stroke,
const gint type);
/* private variables */
static GObjectClass *parent_class = NULL;
GType
gimp_stroke_get_type (void)
{
@ -77,7 +77,7 @@ gimp_stroke_get_type (void)
(GInstanceInitFunc) gimp_stroke_init,
};
stroke_type = g_type_register_static (G_TYPE_OBJECT,
stroke_type = g_type_register_static (GIMP_TYPE_OBJECT,
"GimpStroke",
&stroke_info, 0);
}
@ -89,13 +89,17 @@ static void
gimp_stroke_class_init (GimpStrokeClass *klass)
{
GObjectClass *object_class;
GimpObjectClass *gimp_object_class;
object_class = G_OBJECT_CLASS (klass);
gimp_object_class = GIMP_OBJECT_CLASS (klass);
parent_class = g_type_class_peek_parent (klass);
object_class->finalize = gimp_stroke_finalize;
gimp_object_class->get_memsize = gimp_stroke_get_memsize;
klass->changed = NULL;
klass->removed = NULL;
@ -130,9 +134,28 @@ gimp_stroke_init (GimpStroke *stroke)
static void
gimp_stroke_finalize (GObject *object)
{
#ifdef __GNUC__
#warning FIXME: implement gimp_stroke_finalize()
#endif
G_OBJECT_CLASS (parent_class)->finalize (object);
}
static gsize
gimp_stroke_get_memsize (GimpObject *object)
{
GimpStroke *stroke;
gsize memsize = 0;
stroke = GIMP_STROKE (object);
memsize += g_list_length (stroke->anchors) * (sizeof (GList) +
sizeof (GimpAnchor));
return memsize + GIMP_OBJECT_CLASS (parent_class)->get_memsize (object);
}
/* Calling the virtual functions */
GimpAnchor *

View File

@ -23,6 +23,9 @@
#define __GIMP_STROKE_H__
#include "core/gimpobject.h"
#define GIMP_TYPE_STROKE (gimp_stroke_get_type ())
#define GIMP_STROKE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_STROKE, GimpStroke))
#define GIMP_STROKE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_STROKE, GimpStrokeClass))
@ -33,7 +36,7 @@
struct _GimpStroke
{
GObject parent_instance;
GimpObject parent_instance;
GList *anchors;
@ -47,7 +50,7 @@ struct _GimpStroke
struct _GimpStrokeClass
{
GObjectClass parent_class;
GimpObjectClass parent_class;
void (* changed) (GimpStroke *stroke);

View File

@ -19,7 +19,6 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "config.h"
#include "glib-object.h"
@ -34,17 +33,18 @@
#include "gimpvectors-preview.h"
/* private variables */
static GimpItemClass *parent_class = NULL;
static void gimp_vectors_class_init (GimpVectorsClass *klass);
static void gimp_vectors_init (GimpVectors *vectors);
static void gimp_vectors_finalize (GObject *object);
static gsize gimp_vectors_get_memsize (GimpObject *object);
/* private variables */
static GimpItemClass *parent_class = NULL;
GType
gimp_vectors_get_type (void)
@ -89,7 +89,7 @@ gimp_vectors_class_init (GimpVectorsClass *klass)
object_class->finalize = gimp_vectors_finalize;
/* gimp_object_class->get_memsize = gimp_vectors_get_memsize; */
gimp_object_class->get_memsize = gimp_vectors_get_memsize;
viewable_class->get_new_preview = gimp_vectors_get_new_preview;
@ -118,9 +118,79 @@ gimp_vectors_init (GimpVectors *vectors)
static void
gimp_vectors_finalize (GObject *object)
{
#ifdef __GNUC__
#warning FIXME: implement gimp_vectors_finalize()
#endif
G_OBJECT_CLASS (parent_class)->finalize (object);
}
static gsize
gimp_vectors_get_memsize (GimpObject *object)
{
GimpVectors *vectors;
GimpStroke *stroke;
gsize memsize = 0;
vectors = GIMP_VECTORS (object);
for (stroke = vectors->strokes; stroke; stroke = stroke->next)
memsize += gimp_object_get_memsize (GIMP_OBJECT (stroke));
return memsize + GIMP_OBJECT_CLASS (parent_class)->get_memsize (object);
}
/* public functions */
GimpVectors *
gimp_vectors_new (GimpImage *gimage,
const gchar *name)
{
GimpVectors *vectors;
g_return_val_if_fail (GIMP_IS_IMAGE (gimage), NULL);
vectors = g_object_new (GIMP_TYPE_VECTORS, NULL);
gimp_item_configure (GIMP_ITEM (vectors), gimage, name);
return vectors;
}
GimpVectors *
gimp_vectors_copy (const GimpVectors *vectors,
GType new_type,
gboolean add_alpha /* unused */)
{
GimpVectors *new_vectors;
g_return_val_if_fail (GIMP_IS_VECTORS (vectors), NULL);
g_return_val_if_fail (g_type_is_a (new_type, GIMP_TYPE_VECTORS), NULL);
new_vectors = GIMP_VECTORS (gimp_item_copy (GIMP_ITEM (vectors),
new_type,
add_alpha));
#ifdef __GNUC__
#warning FIXME: implement gimp_vectors_copy()
#endif
return new_vectors;
}
void
gimp_vectors_copy_strokes (const GimpVectors *src_vectors,
GimpVectors *dest_vectors)
{
g_return_if_fail (GIMP_IS_VECTORS (src_vectors));
g_return_if_fail (GIMP_IS_VECTORS (dest_vectors));
#ifdef __GNUC__
#warning FIXME: implement gimp_vectors_copy_strokes()
#endif
}
/* Calling the virtual functions */

View File

@ -93,6 +93,15 @@ struct _GimpVectorsClass
GType gimp_vectors_get_type (void) G_GNUC_CONST;
GimpVectors * gimp_vectors_new (GimpImage *gimage,
const gchar *name);
GimpVectors * gimp_vectors_copy (const GimpVectors *vectors,
GType new_type,
gboolean add_alpha /* unused */);
void gimp_vectors_copy_strokes (const GimpVectors *src_vectors,
GimpVectors *dest_vectors);
/* accessing / modifying the anchors */