gboolean gimp_item_is_text_layer (GimpItem *item) { return (GIMP_IS_TEXT_LAYER (item) && GIMP_TEXT_LAYER (item)->text && GIMP_TEXT_LAYER (item)->modified == FALSE); }
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); } }
GimpText * gimp_text_layer_get_text (GimpTextLayer *layer) { g_return_val_if_fail (GIMP_IS_TEXT_LAYER (layer), NULL); return layer->text; }
void gimp_text_layer_set_text (GimpTextLayer *layer, GimpText *text) { g_return_if_fail (GIMP_IS_TEXT_LAYER (layer)); g_return_if_fail (text == NULL || GIMP_IS_TEXT (text)); if (layer->text == text) return; if (layer->text) { g_signal_handlers_disconnect_by_func (layer->text, G_CALLBACK (gimp_text_layer_text_changed), layer); g_object_unref (layer->text); layer->text = NULL; } if (text) { layer->text = g_object_ref (text); g_signal_connect_object (text, "changed", G_CALLBACK (gimp_text_layer_text_changed), layer, G_CONNECT_SWAPPED); } g_object_notify (G_OBJECT (layer), "text"); gimp_viewable_invalidate_preview (GIMP_VIEWABLE (layer)); }
static GimpItem * gimp_text_layer_duplicate (GimpItem *item, GType new_type) { GimpItem *new_item; g_return_val_if_fail (g_type_is_a (new_type, GIMP_TYPE_DRAWABLE), NULL); new_item = GIMP_ITEM_CLASS (parent_class)->duplicate (item, new_type); if (GIMP_IS_TEXT_LAYER (new_item)) { GimpTextLayer *layer = GIMP_TEXT_LAYER (item); GimpTextLayer *new_layer = GIMP_TEXT_LAYER (new_item); gimp_config_sync (G_OBJECT (layer), G_OBJECT (new_layer), 0); if (layer->text) { GimpText *text = gimp_config_duplicate (GIMP_CONFIG (layer->text)); gimp_text_layer_set_text (new_layer, text); g_object_unref (text); } /* this is just the parasite name, not a pointer to the parasite */ if (layer->text_parasite) new_layer->text_parasite = layer->text_parasite; } return new_item; }
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); }
GimpUndo * gimp_image_undo_push_text_layer_modified (GimpImage *image, const gchar *undo_desc, GimpTextLayer *layer) { g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL); g_return_val_if_fail (GIMP_IS_TEXT_LAYER (layer), NULL); g_return_val_if_fail (gimp_item_is_attached (GIMP_ITEM (layer)), NULL); return gimp_image_undo_push (image, GIMP_TYPE_TEXT_UNDO, GIMP_UNDO_TEXT_LAYER_MODIFIED, undo_desc, GIMP_DIRTY_ITEM_META, "item", layer, NULL); }
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; }
/** * gimp_text_layer_discard: * @layer: a #GimpTextLayer * * Discards the text information. This makes @layer behave like a * normal layer. */ void gimp_text_layer_discard (GimpTextLayer *layer) { g_return_if_fail (GIMP_IS_TEXT_LAYER (layer)); g_return_if_fail (gimp_item_is_attached (GIMP_ITEM (layer))); if (! layer->text) return; gimp_image_undo_push_text_layer (gimp_item_get_image (GIMP_ITEM (layer)), _("Discard Text Information"), layer, NULL); gimp_text_layer_set_text (layer, NULL); }
GimpUndo * gimp_image_undo_push_text_layer (GimpImage *image, const gchar *undo_desc, GimpTextLayer *layer, const GParamSpec *pspec) { g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL); g_return_val_if_fail (GIMP_IS_TEXT_LAYER (layer), NULL); g_return_val_if_fail (gimp_item_is_attached (GIMP_ITEM (layer)), NULL); return gimp_image_undo_push (image, GIMP_TYPE_TEXT_UNDO, GIMP_UNDO_TEXT_LAYER, undo_desc, GIMP_DIRTY_ITEM | GIMP_DIRTY_DRAWABLE, "item", layer, "param", pspec, NULL); }
GimpTextLayer * gimp_image_pick_text_layer (const GimpImage *image, gint x, gint y) { GList *all_layers; GList *list; g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL); all_layers = gimp_image_get_layer_list (image); for (list = all_layers; list; list = g_list_next (list)) { GimpLayer *layer = list->data; gint off_x, off_y; gimp_item_get_offset (GIMP_ITEM (layer), &off_x, &off_y); if (GIMP_IS_TEXT_LAYER (layer) && x >= off_x && y >= off_y && x < off_x + gimp_item_get_width (GIMP_ITEM (layer)) && y < off_y + gimp_item_get_height (GIMP_ITEM (layer))) { g_list_free (all_layers); return GIMP_TEXT_LAYER (layer); } else if (gimp_pickable_get_opacity_at (GIMP_PICKABLE (layer), x - off_x, y - off_y) > 63) { /* a normal layer covers any possible text layers below, * bail out */ break; } } g_list_free (all_layers); return NULL; }
static void gimp_text_undo_constructed (GObject *object) { GimpTextUndo *text_undo = GIMP_TEXT_UNDO (object); GimpTextLayer *layer; G_OBJECT_CLASS (parent_class)->constructed (object); g_assert (GIMP_IS_TEXT_LAYER (GIMP_ITEM_UNDO (text_undo)->item)); layer = GIMP_TEXT_LAYER (GIMP_ITEM_UNDO (text_undo)->item); switch (GIMP_UNDO (object)->undo_type) { case GIMP_UNDO_TEXT_LAYER: if (text_undo->pspec) { g_assert (text_undo->pspec->owner_type == GIMP_TYPE_TEXT); text_undo->value = g_slice_new0 (GValue); g_value_init (text_undo->value, text_undo->pspec->value_type); g_object_get_property (G_OBJECT (layer->text), text_undo->pspec->name, text_undo->value); } else if (layer->text) { text_undo->text = gimp_config_duplicate (GIMP_CONFIG (layer->text)); } break; case GIMP_UNDO_TEXT_LAYER_MODIFIED: text_undo->modified = layer->modified; break; case GIMP_UNDO_TEXT_LAYER_CONVERT: text_undo->format = gimp_drawable_get_format (GIMP_DRAWABLE (layer)); break; default: g_assert_not_reached (); } }