/** * gimp_text_layer_new: * @image: the #GimpImage the layer should belong to * @text: a #GimpText object * * Creates a new text layer. * * Return value: a new #GimpTextLayer or %NULL in case of a problem **/ GimpLayer * gimp_text_layer_new (GimpImage *image, GimpText *text) { GimpTextLayer *layer; g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL); g_return_val_if_fail (GIMP_IS_TEXT (text), NULL); if (! text->text && ! text->markup) return NULL; layer = GIMP_TEXT_LAYER (gimp_drawable_new (GIMP_TYPE_TEXT_LAYER, image, NULL, 0, 0, 1, 1, gimp_image_get_layer_format (image, TRUE))); gimp_text_layer_set_text (layer, text); if (! gimp_text_layer_render (layer)) { g_object_unref (layer); return NULL; } return GIMP_LAYER (layer); }
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)); }
/** * gimp_text_layer_new: * @image: the #GimpImage the layer should belong to * @text: a #GimpText object * * Creates a new text layer. * * Return value: a new #GimpTextLayer or %NULL in case of a problem **/ GimpLayer * gimp_text_layer_new (GimpImage *image, GimpText *text) { GimpTextLayer *layer; GimpImageType type; g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL); g_return_val_if_fail (GIMP_IS_TEXT (text), NULL); if (! text->text && ! text->markup) return NULL; type = gimp_image_base_type_with_alpha (image); layer = GIMP_TEXT_LAYER (gimp_drawable_new (GIMP_TYPE_TEXT_LAYER, image, NULL, 0, 0, 1, 1, type)); gimp_text_layer_set_text (layer, text); if (! gimp_text_layer_render (layer)) { g_object_unref (layer); return NULL; } return GIMP_LAYER (layer); }
GimpVectors * gimp_text_vectors_new (GimpImage *image, GimpText *text) { GimpVectors *vectors; GimpTextLayout *layout; RenderContext context = { 0, }; g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL); g_return_val_if_fail (GIMP_IS_TEXT (text), NULL); vectors = gimp_vectors_new (image, NULL); if (text->text) { gimp_object_set_name_safe (GIMP_OBJECT (vectors), text->text); layout = gimp_text_layout_new (text, image); context.vectors = vectors; gimp_text_layout_render (layout, (GimpTextRenderFunc) gimp_text_render_vectors, &context); g_object_unref (layout); if (context.stroke) gimp_stroke_close (context.stroke); } return vectors; }
void gimp_text_get_transformation (GimpText *text, GimpMatrix3 *matrix) { g_return_if_fail (GIMP_IS_TEXT (text)); g_return_if_fail (matrix != NULL); matrix->coeff[0][0] = text->transformation.coeff[0][0]; matrix->coeff[0][1] = text->transformation.coeff[0][1]; matrix->coeff[0][2] = text->offset_x; matrix->coeff[1][0] = text->transformation.coeff[1][0]; matrix->coeff[1][1] = text->transformation.coeff[1][1]; matrix->coeff[1][2] = text->offset_y; matrix->coeff[2][0] = 0.0; matrix->coeff[2][1] = 0.0; matrix->coeff[2][2] = 1.0; }
GtkWidget * gimp_text_options_editor_new (GtkWindow *parent, Gimp *gimp, GimpTextOptions *options, GimpMenuFactory *menu_factory, const gchar *title, GimpText *text, GimpTextBuffer *text_buffer, gdouble xres, gdouble yres) { GtkWidget *editor; const gchar *font_name; g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL); g_return_val_if_fail (GIMP_IS_TEXT_OPTIONS (options), NULL); g_return_val_if_fail (GIMP_IS_MENU_FACTORY (menu_factory), NULL); g_return_val_if_fail (title != NULL, NULL); g_return_val_if_fail (GIMP_IS_TEXT (text), NULL); g_return_val_if_fail (GIMP_IS_TEXT_BUFFER (text_buffer), NULL); editor = gimp_text_editor_new (title, parent, gimp, menu_factory, text, text_buffer, xres, yres); font_name = gimp_context_get_font_name (GIMP_CONTEXT (options)); gimp_text_editor_set_direction (GIMP_TEXT_EDITOR (editor), options->base_dir); gimp_text_editor_set_font_name (GIMP_TEXT_EDITOR (editor), font_name); g_signal_connect_object (editor, "dir-changed", G_CALLBACK (gimp_text_options_editor_dir_changed), options, 0); g_signal_connect_object (options, "notify::base-direction", G_CALLBACK (gimp_text_options_editor_notify_dir), editor, 0); g_signal_connect_object (options, "notify::font", G_CALLBACK (gimp_text_options_editor_notify_font), editor, 0); return editor; }
/** * 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); }
GtkWidget * gimp_text_style_editor_new (Gimp *gimp, GimpText *text, GimpTextBuffer *buffer, GimpContainer *fonts, gdouble resolution_x, gdouble resolution_y) { g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL); g_return_val_if_fail (GIMP_IS_TEXT (text), NULL); g_return_val_if_fail (GIMP_IS_TEXT_BUFFER (buffer), NULL); g_return_val_if_fail (resolution_x > 0.0, NULL); g_return_val_if_fail (resolution_y > 0.0, NULL); return g_object_new (GIMP_TYPE_TEXT_STYLE_EDITOR, "gimp", gimp, "text", text, "buffer", buffer, "fonts", fonts, "resolution-x", resolution_x, "resolution-y", resolution_y, NULL); }
/* This function could live in gimptexttool.c also. * But it takes some bloat out of that file... */ void gimp_text_options_connect_text (GimpTextOptions *options, GimpText *text) { GimpContext *context; GimpRGB color; g_return_if_fail (GIMP_IS_TEXT_OPTIONS (options)); g_return_if_fail (GIMP_IS_TEXT (text)); context = GIMP_CONTEXT (options); gimp_context_get_foreground (context, &color); gimp_config_sync (G_OBJECT (options), G_OBJECT (text), 0); g_object_set (text, "color", &color, "font", gimp_context_get_font_name (context), NULL); gimp_config_connect (G_OBJECT (options), G_OBJECT (text), NULL); g_signal_connect_object (options, "notify::font", G_CALLBACK (gimp_text_options_notify_font), text, 0); g_signal_connect_object (text, "notify::font", G_CALLBACK (gimp_text_options_notify_text_font), options, 0); g_signal_connect_object (options, "notify::foreground", G_CALLBACK (gimp_text_options_notify_color), text, 0); g_signal_connect_object (text, "notify::color", G_CALLBACK (gimp_text_options_notify_text_color), options, 0); }
/** * gimp_text_set_font_from_xlfd: * @text: a #GimpText object * @xlfd: X Logical Font Description * * Attempts to extract font name and font size from @xlfd and sets * them on the #GimpText object. **/ void gimp_text_set_font_from_xlfd (GimpText *text, const gchar *xlfd) { gchar *font; gdouble size; GimpUnit size_unit; g_return_if_fail (GIMP_IS_TEXT (text)); if (!xlfd) return; font = gimp_text_font_name_from_xlfd (xlfd); #if GIMP_TEXT_DEBUG g_printerr ("XLFD: %s font: %s\n", xlfd, font ? font : "(null)"); #endif if (gimp_text_font_size_from_xlfd (xlfd, &size, &size_unit)) { g_object_set (text, "font-size", size, "font-size-unit", size_unit, font ? "font" : NULL, font, NULL); } else if (font) { g_object_set (text, "font", font, NULL); } g_free (font); }
static void gimp_text_style_editor_constructed (GObject *object) { GimpTextStyleEditor *editor = GIMP_TEXT_STYLE_EDITOR (object); if (G_OBJECT_CLASS (parent_class)->constructed) G_OBJECT_CLASS (parent_class)->constructed (object); g_assert (GIMP_IS_GIMP (editor->gimp)); g_assert (GIMP_IS_FONT_LIST (editor->fonts)); g_assert (GIMP_IS_TEXT (editor->text)); g_assert (GIMP_IS_TEXT_BUFFER (editor->buffer)); editor->context = gimp_context_new (editor->gimp, "text style editor", NULL); g_signal_connect (editor->context, "font-changed", G_CALLBACK (gimp_text_style_editor_font_changed), editor); gimp_size_entry_set_resolution (GIMP_SIZE_ENTRY (editor->size_entry), 0, editor->resolution_y, TRUE); /* use the global user context so we get the global FG/BG colors */ gimp_color_panel_set_context (GIMP_COLOR_PANEL (editor->color_button), gimp_get_user_context (editor->gimp)); gimp_container_view_set_container (GIMP_CONTAINER_VIEW (editor->font_entry), editor->fonts); gimp_container_view_set_context (GIMP_CONTAINER_VIEW (editor->font_entry), editor->context); gimp_text_style_editor_create_toggle (editor, editor->buffer->bold_tag, GTK_STOCK_BOLD, _("Bold")); gimp_text_style_editor_create_toggle (editor, editor->buffer->italic_tag, GTK_STOCK_ITALIC, _("Italic")); gimp_text_style_editor_create_toggle (editor, editor->buffer->underline_tag, GTK_STOCK_UNDERLINE, _("Underline")); gimp_text_style_editor_create_toggle (editor, editor->buffer->strikethrough_tag, GTK_STOCK_STRIKETHROUGH, _("Strikethrough")); g_signal_connect_swapped (editor->text, "notify::font", G_CALLBACK (gimp_text_style_editor_update), editor); g_signal_connect_swapped (editor->text, "notify::font-size", G_CALLBACK (gimp_text_style_editor_update), editor); g_signal_connect_swapped (editor->text, "notify::font-size-unit", G_CALLBACK (gimp_text_style_editor_update), editor); g_signal_connect_swapped (editor->text, "notify::color", G_CALLBACK (gimp_text_style_editor_update), editor); g_signal_connect_data (editor->buffer, "changed", G_CALLBACK (gimp_text_style_editor_update), editor, 0, G_CONNECT_AFTER | G_CONNECT_SWAPPED); g_signal_connect_data (editor->buffer, "apply-tag", G_CALLBACK (gimp_text_style_editor_update), editor, 0, G_CONNECT_AFTER | G_CONNECT_SWAPPED); g_signal_connect_data (editor->buffer, "remove-tag", G_CALLBACK (gimp_text_style_editor_update), editor, 0, G_CONNECT_AFTER | G_CONNECT_SWAPPED); g_signal_connect_data (editor->buffer, "mark-set", G_CALLBACK (gimp_text_style_editor_update), editor, 0, G_CONNECT_AFTER | G_CONNECT_SWAPPED); }
GtkWidget * gimp_text_editor_new (const gchar *title, GtkWindow *parent, Gimp *gimp, GimpMenuFactory *menu_factory, GimpText *text, GimpTextBuffer *text_buffer, gdouble xres, gdouble yres) { GimpTextEditor *editor; GtkWidget *content_area; GtkWidget *toolbar; GtkWidget *style_editor; GtkWidget *scrolled_window; gboolean use_header_bar; g_return_val_if_fail (title != NULL, NULL); g_return_val_if_fail (parent == NULL || GTK_IS_WINDOW (parent), NULL); g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL); g_return_val_if_fail (GIMP_IS_MENU_FACTORY (menu_factory), NULL); g_return_val_if_fail (GIMP_IS_TEXT (text), NULL); g_return_val_if_fail (GIMP_IS_TEXT_BUFFER (text_buffer), NULL); g_object_get (gtk_settings_get_default (), "gtk-dialogs-use-header", &use_header_bar, NULL); editor = g_object_new (GIMP_TYPE_TEXT_EDITOR, "title", title, "role", "gimp-text-editor", "transient-for", parent, "help-func", gimp_standard_help_func, "help-id", GIMP_HELP_TEXT_EDITOR_DIALOG, "use-header-bar", use_header_bar, NULL); gtk_dialog_add_button (GTK_DIALOG (editor), _("_Close"), GTK_RESPONSE_CLOSE); g_signal_connect (editor, "response", G_CALLBACK (gtk_widget_destroy), NULL); g_signal_connect_object (text_buffer, "changed", G_CALLBACK (gimp_text_editor_text_changed), editor, 0); editor->ui_manager = gimp_menu_factory_manager_new (menu_factory, "<TextEditor>", editor); content_area = gtk_dialog_get_content_area (GTK_DIALOG (editor)); toolbar = gtk_ui_manager_get_widget (GTK_UI_MANAGER (editor->ui_manager), "/text-editor-toolbar"); if (toolbar) { gtk_box_pack_start (GTK_BOX (content_area), toolbar, FALSE, FALSE, 0); gtk_widget_show (toolbar); } style_editor = gimp_text_style_editor_new (gimp, text, text_buffer, gimp_data_factory_get_container (gimp->font_factory), xres, yres); gtk_box_pack_start (GTK_BOX (content_area), style_editor, FALSE, FALSE, 0); gtk_widget_show (style_editor); scrolled_window = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 2); gtk_box_pack_start (GTK_BOX (content_area), scrolled_window, TRUE, TRUE, 0); gtk_widget_show (scrolled_window); editor->view = gtk_text_view_new_with_buffer (GTK_TEXT_BUFFER (text_buffer)); gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (editor->view), GTK_WRAP_WORD_CHAR); gtk_container_add (GTK_CONTAINER (scrolled_window), editor->view); gtk_widget_show (editor->view); switch (editor->base_dir) { case GIMP_TEXT_DIRECTION_LTR: case GIMP_TEXT_DIRECTION_TTB_RTL: case GIMP_TEXT_DIRECTION_TTB_RTL_UPRIGHT: case GIMP_TEXT_DIRECTION_TTB_LTR: case GIMP_TEXT_DIRECTION_TTB_LTR_UPRIGHT: gtk_widget_set_direction (editor->view, GTK_TEXT_DIR_LTR); break; case GIMP_TEXT_DIRECTION_RTL: gtk_widget_set_direction (editor->view, GTK_TEXT_DIR_RTL); break; } gtk_widget_set_size_request (editor->view, 200, 64); editor->font_toggle = gtk_check_button_new_with_mnemonic (_("_Use selected font")); gtk_box_pack_start (GTK_BOX (content_area), editor->font_toggle, FALSE, FALSE, 0); gtk_widget_show (editor->font_toggle); g_signal_connect (editor->font_toggle, "toggled", G_CALLBACK (gimp_text_editor_font_toggled), editor); gtk_widget_grab_focus (editor->view); gimp_ui_manager_update (editor->ui_manager, editor); return GTK_WIDGET (editor); }