Commit 794885e2 authored by Michael Natterer's avatar Michael Natterer 😴 Committed by Michael Natterer
Browse files

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().
parent 291eb383
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
......
......@@ -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;
}
......
......@@ -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);
}
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;
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);
}
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);
add_alpha_region (&srcPR, &destPR);
return new_drawable;
}
......
......@@ -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);
}
......
......@@ -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)
{
......
......@@ -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);
......
......@@ -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,
......
......@@ -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,
......
......@@ -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;
}
......
......@@ -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);
}
......
......@@ -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);
}
......
......@@ -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);
}
......@@ -88,36 +88,40 @@ gimp_stroke_get_type (void)
static void
gimp_stroke_class_init (GimpStrokeClass *klass)
{
GObjectClass *object_class;
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;
object_class->finalize = gimp_stroke_finalize;
gimp_object_class->get_memsize = gimp_stroke_get_memsize;
klass->changed = NULL;
klass->removed = NULL;
klass->changed = NULL;
klass->removed = NULL;
klass->anchor_get = gimp_stroke_real_anchor_get;
klass->anchor_get_next = gimp_stroke_real_anchor_get_next;
klass->anchor_move_relative = gimp_stroke_real_anchor_move_relative;
klass->anchor_move_absolute = gimp_stroke_real_anchor_move_absolute;
klass->anchor_delete = NULL;
klass->anchor_get = gimp_stroke_real_anchor_get;
klass->anchor_get_next = gimp_stroke_real_anchor_get_next;
klass->anchor_move_relative = gimp_stroke_real_anchor_move_relative;
klass->anchor_move_absolute = gimp_stroke_real_anchor_move_absolute;
klass->anchor_delete = NULL;
klass->get_length = NULL;
klass->get_distance = NULL;
klass->interpolate = NULL;
klass->get_length = NULL;
klass->get_distance = NULL;
klass->interpolate = NULL;
klass->temp_anchor_get = NULL;
klass->temp_anchor_set = NULL;
klass->temp_anchor_fix = NULL;
klass->temp_anchor_get = NULL;
klass->temp_anchor_set = NULL;
klass->temp_anchor_fix = NULL;
klass->make_bezier = NULL;
klass->make_bezier = NULL;
klass->get_draw_anchors = NULL;
klass->get_draw_controls = NULL;
klass->get_draw_lines = NULL;
klass->get_draw_anchors = NULL;
klass->get_draw_controls = NULL;
klass->get_draw_lines = NULL;
}
static void
......@@ -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 *
......
......@@ -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))