summaryrefslogtreecommitdiffstats
path: root/app/text/gimptextlayer-xcf.c
diff options
context:
space:
mode:
Diffstat (limited to 'app/text/gimptextlayer-xcf.c')
-rw-r--r--app/text/gimptextlayer-xcf.c220
1 files changed, 220 insertions, 0 deletions
diff --git a/app/text/gimptextlayer-xcf.c b/app/text/gimptextlayer-xcf.c
new file mode 100644
index 0000000..33452a1
--- /dev/null
+++ b/app/text/gimptextlayer-xcf.c
@@ -0,0 +1,220 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * GimpText
+ * Copyright (C) 2003 Sven Neumann <sven@gimp.org>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include <gdk-pixbuf/gdk-pixbuf.h>
+#include <gegl.h>
+#include <cairo.h>
+
+#include "libgimpbase/gimpbase.h"
+#include "text-types.h"
+
+#include "core/gimp.h"
+#include "core/gimpdrawable-private.h" /* eek */
+#include "core/gimpimage.h"
+#include "core/gimpparasitelist.h"
+
+#include "gimptext.h"
+#include "gimptext-parasite.h"
+#include "gimptextlayer.h"
+#include "gimptextlayer-xcf.h"
+
+#include "gimp-intl.h"
+
+
+enum
+{
+ TEXT_LAYER_XCF_NONE = 0,
+ TEXT_LAYER_XCF_DONT_AUTO_RENAME = 1 << 0,
+ TEXT_LAYER_XCF_MODIFIED = 1 << 1
+};
+
+
+static GimpLayer * gimp_text_layer_from_layer (GimpLayer *layer,
+ GimpText *text);
+
+
+gboolean
+gimp_text_layer_xcf_load_hack (GimpLayer **layer)
+{
+ const gchar *name;
+ GimpText *text = NULL;
+ const GimpParasite *parasite;
+
+ g_return_val_if_fail (layer != NULL, FALSE);
+ g_return_val_if_fail (GIMP_IS_LAYER (*layer), FALSE);
+
+ name = gimp_text_parasite_name ();
+ parasite = gimp_item_parasite_find (GIMP_ITEM (*layer), name);
+
+ if (parasite)
+ {
+ GError *error = NULL;
+
+ text = gimp_text_from_parasite (parasite, &error);
+
+ if (error)
+ {
+ gimp_message (gimp_item_get_image (GIMP_ITEM (*layer))->gimp, NULL,
+ GIMP_MESSAGE_ERROR,
+ _("Problems parsing the text parasite for layer '%s':\n"
+ "%s\n\n"
+ "Some text properties may be wrong. "
+ "Unless you want to edit the text layer, "
+ "you don't need to worry about this."),
+ gimp_object_get_name (*layer),
+ error->message);
+ g_clear_error (&error);
+ }
+ }
+ else
+ {
+ name = gimp_text_gdyntext_parasite_name ();
+
+ parasite = gimp_item_parasite_find (GIMP_ITEM (*layer), name);
+
+ if (parasite)
+ text = gimp_text_from_gdyntext_parasite (parasite);
+ }
+
+ if (text)
+ {
+ *layer = gimp_text_layer_from_layer (*layer, text);
+
+ /* let the text layer knows what parasite was used to create it */
+ GIMP_TEXT_LAYER (*layer)->text_parasite = name;
+ }
+
+ return (text != NULL);
+}
+
+void
+gimp_text_layer_xcf_save_prepare (GimpTextLayer *layer)
+{
+ GimpText *text;
+
+ g_return_if_fail (GIMP_IS_TEXT_LAYER (layer));
+
+ /* If the layer has a text parasite already, it wasn't changed and we
+ * can simply save the original parasite back which is still attached.
+ */
+ if (layer->text_parasite)
+ return;
+
+ text = gimp_text_layer_get_text (layer);
+ if (text)
+ {
+ GimpParasite *parasite = gimp_text_to_parasite (text);
+
+ /* Don't push an undo because the parasite only exists temporarily
+ * while the text layer is saved to XCF.
+ */
+ gimp_item_parasite_attach (GIMP_ITEM (layer), parasite, FALSE);
+
+ gimp_parasite_free (parasite);
+ }
+}
+
+guint32
+gimp_text_layer_get_xcf_flags (GimpTextLayer *text_layer)
+{
+ guint flags = 0;
+
+ g_return_val_if_fail (GIMP_IS_TEXT_LAYER (text_layer), 0);
+
+ if (! text_layer->auto_rename)
+ flags |= TEXT_LAYER_XCF_DONT_AUTO_RENAME;
+
+ if (text_layer->modified)
+ flags |= TEXT_LAYER_XCF_MODIFIED;
+
+ return flags;
+}
+
+void
+gimp_text_layer_set_xcf_flags (GimpTextLayer *text_layer,
+ guint32 flags)
+{
+ g_return_if_fail (GIMP_IS_TEXT_LAYER (text_layer));
+
+ g_object_set (text_layer,
+ "auto-rename", (flags & TEXT_LAYER_XCF_DONT_AUTO_RENAME) == 0,
+ "modified", (flags & TEXT_LAYER_XCF_MODIFIED) != 0,
+ NULL);
+}
+
+
+/**
+ * gimp_text_layer_from_layer:
+ * @layer: a #GimpLayer object
+ * @text: a #GimpText object
+ *
+ * Converts a standard #GimpLayer and a #GimpText object into a
+ * #GimpTextLayer. The new text layer takes ownership of the @text and
+ * @layer objects. The @layer object is rendered unusable by this
+ * function. Don't even try to use if afterwards!
+ *
+ * This is a gross hack that is needed in order to load text layers
+ * from XCF files in a backwards-compatible way. Please don't use it
+ * for anything else!
+ *
+ * Return value: a newly allocated #GimpTextLayer object
+ **/
+static GimpLayer *
+gimp_text_layer_from_layer (GimpLayer *layer,
+ GimpText *text)
+{
+ GimpTextLayer *text_layer;
+ GimpDrawable *drawable;
+
+ g_return_val_if_fail (GIMP_IS_LAYER (layer), NULL);
+ g_return_val_if_fail (GIMP_IS_TEXT (text), NULL);
+
+ text_layer = g_object_new (GIMP_TYPE_TEXT_LAYER,
+ "image", gimp_item_get_image (GIMP_ITEM (layer)),
+ NULL);
+
+ gimp_item_replace_item (GIMP_ITEM (text_layer), GIMP_ITEM (layer));
+
+ drawable = GIMP_DRAWABLE (text_layer);
+
+ gimp_drawable_steal_buffer (drawable, GIMP_DRAWABLE (layer));
+
+ gimp_layer_set_opacity (GIMP_LAYER (text_layer),
+ gimp_layer_get_opacity (layer), FALSE);
+ gimp_layer_set_mode (GIMP_LAYER (text_layer),
+ gimp_layer_get_mode (layer), FALSE);
+ gimp_layer_set_blend_space (GIMP_LAYER (text_layer),
+ gimp_layer_get_blend_space (layer), FALSE);
+ gimp_layer_set_composite_space (GIMP_LAYER (text_layer),
+ gimp_layer_get_composite_space (layer), FALSE);
+ gimp_layer_set_composite_mode (GIMP_LAYER (text_layer),
+ gimp_layer_get_composite_mode (layer), FALSE);
+ gimp_layer_set_lock_alpha (GIMP_LAYER (text_layer),
+ gimp_layer_get_lock_alpha (layer), FALSE);
+
+ gimp_text_layer_set_text (text_layer, text);
+
+ g_object_unref (text);
+ g_object_unref (layer);
+
+ return GIMP_LAYER (text_layer);
+}