From 587d9bbb03b19558b7900f61c852a470f85761aa Mon Sep 17 00:00:00 2001 From: ONO Yoshio Date: Sun, 29 Jul 2018 13:57:38 +0900 Subject: [PATCH] MR !19: Add support for vertical text writing. Squashed commit of the following: commit ee1ff7d502658cfa1248a13a3f0348495db07eda Author: ONO Yoshio Date: Sun Jul 29 00:31:47 2018 +0900 Fixed that gimp-text-dir-ttb-* icons are lacked in Symbolic. commit d87d012d697628da28fe90199cc04b95b72ba8ef Author: ONO Yoshio Date: Sat Jul 28 16:23:10 2018 +0900 Fix a typo. commit cf0238bf7df56c384cdf3b7ec69557d14740f853 Author: ONO Yoshio Date: Sat Jul 28 15:50:57 2018 +0900 Fixed seg fault error. commit b07f60d06fa1a753fda5b4d46af01698c344154e Author: ONO Yoshio Date: Fri Jul 27 17:15:34 2018 +0900 Add support for vertical text writing. https://gitlab.gnome.org/GNOME/gimp/issues/641 --- app/actions/text-editor-actions.c | 42 ++- app/actions/text-tool-actions.c | 20 ++ app/display/gimpcanvastextcursor.c | 118 +++++-- app/display/gimpcanvastextcursor.h | 3 +- app/text/gimptextlayer.c | 16 + app/text/gimptextlayout-render.c | 17 + app/text/gimptextlayout.c | 71 ++++- app/tools/gimpdrawtool.c | 9 +- app/tools/gimpdrawtool.h | 3 +- app/tools/gimptexttool-editor.c | 202 +++++++++++- app/tools/gimptexttool.c | 82 +++-- app/tools/gimptexttool.h | 3 + app/widgets/gimptexteditor.c | 8 + .../24/gimp-text-dir-ttb-ltr-upright.png | Bin 0 -> 769 bytes icons/Color/24/gimp-text-dir-ttb-ltr.png | Bin 0 -> 780 bytes .../24/gimp-text-dir-ttb-rtl-upright.png | Bin 0 -> 728 bytes icons/Color/24/gimp-text-dir-ttb-rtl.png | Bin 0 -> 780 bytes .../gimp-text-dir-ttb-ltr-upright.svg | 290 ++++++++++++++++++ .../Color/scalable/gimp-text-dir-ttb-ltr.svg | 290 ++++++++++++++++++ .../gimp-text-dir-ttb-rtl-upright.svg | 190 ++++++++++++ .../Color/scalable/gimp-text-dir-ttb-rtl.svg | 208 +++++++++++++ .../24/gimp-text-dir-ttb-ltr-upright.png | Bin 0 -> 471 bytes .../24/gimp-text-dir-ttb-ltr-upright.xcf | Bin 0 -> 4555 bytes icons/Legacy/24/gimp-text-dir-ttb-ltr.png | Bin 0 -> 445 bytes icons/Legacy/24/gimp-text-dir-ttb-ltr.xcf | Bin 0 -> 4558 bytes .../24/gimp-text-dir-ttb-rtl-upright.png | Bin 0 -> 353 bytes .../24/gimp-text-dir-ttb-rtl-upright.xcf | Bin 0 -> 4570 bytes icons/Legacy/24/gimp-text-dir-ttb-rtl.png | Bin 0 -> 433 bytes icons/Legacy/24/gimp-text-dir-ttb-rtl.xcf | Bin 0 -> 3392 bytes icons/Legacy/Makefile.am | 4 + .../24/gimp-text-dir-ttb-ltr-upright.png | Bin 0 -> 1132 bytes icons/Symbolic/24/gimp-text-dir-ttb-ltr.png | Bin 0 -> 1209 bytes .../24/gimp-text-dir-ttb-rtl-upright.png | Bin 0 -> 1160 bytes icons/Symbolic/24/gimp-text-dir-ttb-rtl.png | Bin 0 -> 1233 bytes .../gimp-text-dir-ttb-ltr-symbolic.svg | 174 +++++++++++ ...gimp-text-dir-ttb-ltr-upright-symbolic.svg | 174 +++++++++++ .../gimp-text-dir-ttb-rtl-symbolic.svg | 173 +++++++++++ ...gimp-text-dir-ttb-rtl-upright-symbolic.svg | 173 +++++++++++ icons/icon-list.mk | 12 + libgimpbase/gimpbaseenums.c | 8 + libgimpbase/gimpbaseenums.h | 12 +- libgimpwidgets/gimpicons.h | 4 + menus/text-editor-toolbar.xml | 4 + menus/text-tool-menu.xml | 4 + pdb/enums.pl | 12 +- 45 files changed, 2259 insertions(+), 67 deletions(-) create mode 100644 icons/Color/24/gimp-text-dir-ttb-ltr-upright.png create mode 100644 icons/Color/24/gimp-text-dir-ttb-ltr.png create mode 100644 icons/Color/24/gimp-text-dir-ttb-rtl-upright.png create mode 100644 icons/Color/24/gimp-text-dir-ttb-rtl.png create mode 100644 icons/Color/scalable/gimp-text-dir-ttb-ltr-upright.svg create mode 100644 icons/Color/scalable/gimp-text-dir-ttb-ltr.svg create mode 100644 icons/Color/scalable/gimp-text-dir-ttb-rtl-upright.svg create mode 100644 icons/Color/scalable/gimp-text-dir-ttb-rtl.svg create mode 100644 icons/Legacy/24/gimp-text-dir-ttb-ltr-upright.png create mode 100644 icons/Legacy/24/gimp-text-dir-ttb-ltr-upright.xcf create mode 100644 icons/Legacy/24/gimp-text-dir-ttb-ltr.png create mode 100644 icons/Legacy/24/gimp-text-dir-ttb-ltr.xcf create mode 100644 icons/Legacy/24/gimp-text-dir-ttb-rtl-upright.png create mode 100644 icons/Legacy/24/gimp-text-dir-ttb-rtl-upright.xcf create mode 100644 icons/Legacy/24/gimp-text-dir-ttb-rtl.png create mode 100644 icons/Legacy/24/gimp-text-dir-ttb-rtl.xcf create mode 100644 icons/Symbolic/24/gimp-text-dir-ttb-ltr-upright.png create mode 100644 icons/Symbolic/24/gimp-text-dir-ttb-ltr.png create mode 100644 icons/Symbolic/24/gimp-text-dir-ttb-rtl-upright.png create mode 100644 icons/Symbolic/24/gimp-text-dir-ttb-rtl.png create mode 100644 icons/Symbolic/scalable/gimp-text-dir-ttb-ltr-symbolic.svg create mode 100644 icons/Symbolic/scalable/gimp-text-dir-ttb-ltr-upright-symbolic.svg create mode 100644 icons/Symbolic/scalable/gimp-text-dir-ttb-rtl-symbolic.svg create mode 100644 icons/Symbolic/scalable/gimp-text-dir-ttb-rtl-upright-symbolic.svg diff --git a/app/actions/text-editor-actions.c b/app/actions/text-editor-actions.c index 270bbc2d80..52bf963aa6 100644 --- a/app/actions/text-editor-actions.c +++ b/app/actions/text-editor-actions.c @@ -65,7 +65,31 @@ static const GimpRadioActionEntry text_editor_direction_actions[] = NC_("text-editor-action", "RTL"), NULL, NC_("text-editor-action", "From right to left"), GIMP_TEXT_DIRECTION_RTL, - NULL } + NULL }, + + { "text-editor-direction-ttb-rtl", GIMP_ICON_FORMAT_TEXT_DIRECTION_TTB_RTL, + NC_("text-editor-action", "TTB-RTL"), NULL, + NC_("text-editor-action", "Characters are from top to bottom, Lines are from right to left"), + GIMP_TEXT_DIRECTION_TTB_RTL, + NULL }, + + { "text-editor-direction-ttb-rtl-upright", GIMP_ICON_FORMAT_TEXT_DIRECTION_TTB_RTL_UPRIGHT, + NC_("text-editor-action", "TTB-RTL-UPRIGHT"), NULL, + NC_("text-editor-action", "Upright characters are from top to bottom, Lines are from right to left"), + GIMP_TEXT_DIRECTION_TTB_RTL_UPRIGHT, + NULL }, + + { "text-editor-direction-ttb-ltr", GIMP_ICON_FORMAT_TEXT_DIRECTION_TTB_LTR, + NC_("text-editor-action", "TTB-LTR"), NULL, + NC_("text-editor-action", "Characters are from top to bottom, Lines are from left to right"), + GIMP_TEXT_DIRECTION_TTB_LTR, + NULL }, + + { "text-editor-direction-ttb-ltr-upright", GIMP_ICON_FORMAT_TEXT_DIRECTION_TTB_LTR_UPRIGHT, + NC_("text-editor-action", "TTB-LTR-UPRIGHT"), NULL, + NC_("text-editor-action", "Upright characters are from top to bottom, Lines are from left to right"), + GIMP_TEXT_DIRECTION_TTB_LTR_UPRIGHT, + NULL }, }; @@ -102,6 +126,22 @@ text_editor_actions_update (GimpActionGroup *group, case GIMP_TEXT_DIRECTION_RTL: SET_ACTIVE ("text-editor-direction-rtl", TRUE); break; + + case GIMP_TEXT_DIRECTION_TTB_RTL: + SET_ACTIVE ("text-editor-direction-ttb-rtl", TRUE); + break; + + case GIMP_TEXT_DIRECTION_TTB_RTL_UPRIGHT: + SET_ACTIVE ("text-editor-direction-ttb-rtl-upright", TRUE); + break; + + case GIMP_TEXT_DIRECTION_TTB_LTR: + SET_ACTIVE ("text-editor-direction-ttb-ltr", TRUE); + break; + + case GIMP_TEXT_DIRECTION_TTB_LTR_UPRIGHT: + SET_ACTIVE ("text-editor-direction-ttb-ltr-upright", TRUE); + break; } #undef SET_ACTIVE diff --git a/app/actions/text-tool-actions.c b/app/actions/text-tool-actions.c index 9abf263523..66f9746cfb 100644 --- a/app/actions/text-tool-actions.c +++ b/app/actions/text-tool-actions.c @@ -110,6 +110,26 @@ static const GimpRadioActionEntry text_tool_direction_actions[] = { "text-tool-direction-rtl", GIMP_ICON_FORMAT_TEXT_DIRECTION_RTL, NC_("text-tool-action", "From right to left"), NULL, NULL, GIMP_TEXT_DIRECTION_RTL, + NULL }, + + { "text-tool-direction-ttb-rtl", GIMP_ICON_FORMAT_TEXT_DIRECTION_TTB_RTL, + NC_("text-tool-action", "Characters are from top to bottom, Lines are from right to left"), NULL, NULL, + GIMP_TEXT_DIRECTION_TTB_RTL, + NULL }, + + { "text-tool-direction-ttb-rtl-upright", GIMP_ICON_FORMAT_TEXT_DIRECTION_TTB_RTL_UPRIGHT, + NC_("text-tool-action", "Upright characters are from top to bottom, Lines are from right to left"), NULL, NULL, + GIMP_TEXT_DIRECTION_TTB_RTL_UPRIGHT, + NULL }, + + { "text-tool-direction-ttb-ltr", GIMP_ICON_FORMAT_TEXT_DIRECTION_TTB_LTR, + NC_("text-tool-action", "Characters are from top to bottom, Lines are from left to right"), NULL, NULL, + GIMP_TEXT_DIRECTION_TTB_LTR, + NULL }, + + { "text-tool-direction-ttb-ltr-upright", GIMP_ICON_FORMAT_TEXT_DIRECTION_TTB_LTR_UPRIGHT, + NC_("text-tool-action", "Upright characters are from top to bottom, Lines are from left to right"), NULL, NULL, + GIMP_TEXT_DIRECTION_TTB_LTR_UPRIGHT, NULL } }; diff --git a/app/display/gimpcanvastextcursor.c b/app/display/gimpcanvastextcursor.c index 09cac03e9f..0e2780d723 100644 --- a/app/display/gimpcanvastextcursor.c +++ b/app/display/gimpcanvastextcursor.c @@ -39,7 +39,8 @@ enum PROP_Y, PROP_WIDTH, PROP_HEIGHT, - PROP_OVERWRITE + PROP_OVERWRITE, + PROP_DIRECTION }; @@ -47,11 +48,12 @@ typedef struct _GimpCanvasTextCursorPrivate GimpCanvasTextCursorPrivate; struct _GimpCanvasTextCursorPrivate { - gint x; - gint y; - gint width; - gint height; - gboolean overwrite; + gint x; + gint y; + gint width; + gint height; + gboolean overwrite; + GimpTextDirection direction; }; #define GET_PRIVATE(text_cursor) \ @@ -122,6 +124,12 @@ gimp_canvas_text_cursor_class_init (GimpCanvasTextCursorClass *klass) FALSE, GIMP_PARAM_READWRITE)); + g_object_class_install_property (object_class, PROP_DIRECTION, + g_param_spec_enum ("direction", NULL, NULL, + gimp_text_direction_get_type(), + GIMP_TEXT_DIRECTION_LTR, + GIMP_PARAM_READWRITE)); + g_type_class_add_private (klass, sizeof (GimpCanvasTextCursorPrivate)); } @@ -155,6 +163,9 @@ gimp_canvas_text_cursor_set_property (GObject *object, case PROP_OVERWRITE: private->overwrite = g_value_get_boolean (value); break; + case PROP_DIRECTION: + private->direction = g_value_get_enum (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); @@ -187,6 +198,9 @@ gimp_canvas_text_cursor_get_property (GObject *object, case PROP_OVERWRITE: g_value_set_boolean (value, private->overwrite); break; + case PROP_DIRECTION: + g_value_set_enum (value, private->direction); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); @@ -221,6 +235,20 @@ gimp_canvas_text_cursor_transform (GimpCanvasItem *item, *x = floor (*x) + 0.5; *y = floor (*y) + 0.5; + switch (private->direction) + { + case GIMP_TEXT_DIRECTION_LTR: + case GIMP_TEXT_DIRECTION_RTL: + break; + case GIMP_TEXT_DIRECTION_TTB_RTL: + case GIMP_TEXT_DIRECTION_TTB_RTL_UPRIGHT: + *x = *x - *w; + break; + case GIMP_TEXT_DIRECTION_TTB_LTR: + case GIMP_TEXT_DIRECTION_TTB_LTR_UPRIGHT: + *y = *y + *h; + break; + } if (private->overwrite) { @@ -229,8 +257,24 @@ gimp_canvas_text_cursor_transform (GimpCanvasItem *item, } else { - *w = 0; - *h = ceil (*h) - 1.0; + switch (private->direction) + { + case GIMP_TEXT_DIRECTION_LTR: + case GIMP_TEXT_DIRECTION_RTL: + *w = 0; + *h = ceil (*h) - 1.0; + break; + case GIMP_TEXT_DIRECTION_TTB_RTL: + case GIMP_TEXT_DIRECTION_TTB_RTL_UPRIGHT: + *w = ceil (*w) - 1.0; + *h = 0; + break; + case GIMP_TEXT_DIRECTION_TTB_LTR: + case GIMP_TEXT_DIRECTION_TTB_LTR_UPRIGHT: + *w = ceil (*w) - 1.0; + *h = 0; + break; + } } } @@ -250,14 +294,33 @@ gimp_canvas_text_cursor_draw (GimpCanvasItem *item, } else { - cairo_move_to (cr, x, y); - cairo_line_to (cr, x, y + h); + switch (private->direction) + { + case GIMP_TEXT_DIRECTION_LTR: + case GIMP_TEXT_DIRECTION_RTL: + cairo_move_to (cr, x, y); + cairo_line_to (cr, x, y + h); - cairo_move_to (cr, x - 3.0, y); - cairo_line_to (cr, x + 3.0, y); + cairo_move_to (cr, x - 3.0, y); + cairo_line_to (cr, x + 3.0, y); - cairo_move_to (cr, x - 3.0, y + h); - cairo_line_to (cr, x + 3.0, y + h); + cairo_move_to (cr, x - 3.0, y + h); + cairo_line_to (cr, x + 3.0, y + h); + break; + 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: + cairo_move_to (cr, x, y); + cairo_line_to (cr, x + w, y); + + cairo_move_to (cr, x, y - 3.0); + cairo_line_to (cr, x, y + 3.0); + + cairo_move_to (cr, x + w, y - 3.0); + cairo_line_to (cr, x + w, y + 3.0); + break; + } } _gimp_canvas_item_stroke (item, cr); @@ -282,10 +345,25 @@ gimp_canvas_text_cursor_get_extents (GimpCanvasItem *item) } else { - rectangle.x = floor (x - 4.5); - rectangle.y = floor (y - 1.5); - rectangle.width = ceil (9.0); - rectangle.height = ceil (h + 3.0); + switch (private->direction) + { + case GIMP_TEXT_DIRECTION_LTR: + case GIMP_TEXT_DIRECTION_RTL: + rectangle.x = floor (x - 4.5); + rectangle.y = floor (y - 1.5); + rectangle.width = ceil (9.0); + rectangle.height = ceil (h + 3.0); + break; + 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: + rectangle.x = floor (x - 1.5); + rectangle.y = floor (y - 4.5); + rectangle.width = ceil (w + 3.0); + rectangle.height = ceil (9.0); + break; + } } return cairo_region_create_rectangle (&rectangle); @@ -294,7 +372,8 @@ gimp_canvas_text_cursor_get_extents (GimpCanvasItem *item) GimpCanvasItem * gimp_canvas_text_cursor_new (GimpDisplayShell *shell, PangoRectangle *cursor, - gboolean overwrite) + gboolean overwrite, + GimpTextDirection direction) { g_return_val_if_fail (GIMP_IS_DISPLAY_SHELL (shell), NULL); g_return_val_if_fail (cursor != NULL, NULL); @@ -306,5 +385,6 @@ gimp_canvas_text_cursor_new (GimpDisplayShell *shell, "width", cursor->width, "height", cursor->height, "overwrite", overwrite, + "direction", direction, NULL); } diff --git a/app/display/gimpcanvastextcursor.h b/app/display/gimpcanvastextcursor.h index 6d930dcacf..210b2a25fb 100644 --- a/app/display/gimpcanvastextcursor.h +++ b/app/display/gimpcanvastextcursor.h @@ -51,7 +51,8 @@ GType gimp_canvas_text_cursor_get_type (void) G_GNUC_CONST; GimpCanvasItem * gimp_canvas_text_cursor_new (GimpDisplayShell *shell, PangoRectangle *cursor, - gboolean overwrite); + gboolean overwrite, + GimpTextDirection direction); #endif /* __GIMP_CANVAS_RECTANGLE_H__ */ diff --git a/app/text/gimptextlayer.c b/app/text/gimptextlayer.c index bfd5c8c544..525afb8dea 100644 --- a/app/text/gimptextlayer.c +++ b/app/text/gimptextlayer.c @@ -663,10 +663,26 @@ gimp_text_layer_render (GimpTextLayer *layer) gimp_drawable_get_format (drawable))) { GeglBuffer *new_buffer; + GimpItem *item; + gint oldwidth; + gint newwidth; + + item = GIMP_ITEM (drawable); + oldwidth = gimp_item_get_width (item); new_buffer = gegl_buffer_new (GEGL_RECTANGLE (0, 0, width, height), gimp_text_layer_get_format (layer)); gimp_drawable_set_buffer (drawable, FALSE, NULL, new_buffer); + + newwidth = gimp_item_get_width(item); + if (layer->text->box_mode == GIMP_TEXT_BOX_DYNAMIC && + oldwidth != newwidth && + (layer->text->base_dir == GIMP_TEXT_DIRECTION_TTB_RTL || + layer->text->base_dir == GIMP_TEXT_DIRECTION_TTB_RTL_UPRIGHT)) + { + gimp_item_translate (item, oldwidth - newwidth, 0, FALSE); + } + g_object_unref (new_buffer); if (gimp_layer_get_mask (GIMP_LAYER (layer))) diff --git a/app/text/gimptextlayout-render.c b/app/text/gimptextlayout-render.c index 7e401bd837..f3605e3361 100644 --- a/app/text/gimptextlayout-render.c +++ b/app/text/gimptextlayout-render.c @@ -37,6 +37,7 @@ gimp_text_layout_render (GimpTextLayout *layout, PangoLayout *pango_layout; cairo_matrix_t trafo; gint x, y; + gint width, height; g_return_if_fail (GIMP_IS_TEXT_LAYOUT (layout)); g_return_if_fail (cr != NULL); @@ -49,6 +50,22 @@ gimp_text_layout_render (GimpTextLayout *layout, gimp_text_layout_get_transform (layout, &trafo); cairo_transform (cr, &trafo); + if (base_dir == GIMP_TEXT_DIRECTION_TTB_RTL || + base_dir == GIMP_TEXT_DIRECTION_TTB_RTL_UPRIGHT) + { + gimp_text_layout_get_size (layout, &width, &height); + cairo_translate (cr, width, 0); + cairo_rotate (cr, G_PI_2); + } + + if (base_dir == GIMP_TEXT_DIRECTION_TTB_LTR || + base_dir == GIMP_TEXT_DIRECTION_TTB_LTR_UPRIGHT) + { + gimp_text_layout_get_size (layout, &width, &height); + cairo_translate (cr, 0, height); + cairo_rotate (cr, -G_PI_2); + } + pango_layout = gimp_text_layout_get_pango_layout (layout); if (path) diff --git a/app/text/gimptextlayout.c b/app/text/gimptextlayout.c index 069cac9b46..47beed7705 100644 --- a/app/text/gimptextlayout.c +++ b/app/text/gimptextlayout.c @@ -136,8 +136,6 @@ gimp_text_layout_new (GimpText *text, pango_layout_set_wrap (layout->layout, PANGO_WRAP_WORD_CHAR); - g_object_unref (context); - pango_layout_set_font_description (layout->layout, font_desc); pango_font_description_free (font_desc); @@ -167,12 +165,18 @@ gimp_text_layout_new (GimpText *text, case GIMP_TEXT_BOX_DYNAMIC: break; case GIMP_TEXT_BOX_FIXED: - pango_layout_set_width (layout->layout, - pango_units_from_double - (gimp_units_to_pixels (text->box_width, - text->box_unit, - xres) - - 2 * layout->text->border)); + if (! PANGO_GRAVITY_IS_VERTICAL (pango_context_get_base_gravity (context))) + pango_layout_set_width (layout->layout, + pango_units_from_double + (gimp_units_to_pixels (text->box_width, + text->box_unit, + xres))); + else + pango_layout_set_width (layout->layout, + pango_units_from_double + (gimp_units_to_pixels (text->box_height, + text->box_unit, + yres))); break; } @@ -210,6 +214,8 @@ gimp_text_layout_new (GimpText *text, break; } + g_object_unref (context); + return layout; } @@ -591,6 +597,7 @@ gimp_text_layout_position (GimpTextLayout *layout) { PangoRectangle ink; PangoRectangle logical; + PangoContext *context; gint x1, y1; gint x2, y2; @@ -603,6 +610,7 @@ gimp_text_layout_position (GimpTextLayout *layout) ink.width = ceil ((gdouble) ink.width * layout->xres / layout->yres); logical.width = ceil ((gdouble) logical.width * layout->xres / layout->yres); + context = pango_layout_get_context (layout->layout); #ifdef VERBOSE g_printerr ("ink rect: %d x %d @ %d, %d\n", @@ -641,7 +649,11 @@ gimp_text_layout_position (GimpTextLayout *layout) pango_layout_get_pixel_size (layout->layout, &width, NULL); if ((base_dir == GIMP_TEXT_DIRECTION_LTR && align == PANGO_ALIGN_RIGHT) || - (base_dir == GIMP_TEXT_DIRECTION_RTL && align == PANGO_ALIGN_LEFT)) + (base_dir == GIMP_TEXT_DIRECTION_RTL && align == PANGO_ALIGN_LEFT) || + (base_dir == GIMP_TEXT_DIRECTION_TTB_RTL && align == PANGO_ALIGN_RIGHT) || + (base_dir == GIMP_TEXT_DIRECTION_TTB_RTL_UPRIGHT && align == PANGO_ALIGN_RIGHT) || + (base_dir == GIMP_TEXT_DIRECTION_TTB_LTR && align == PANGO_ALIGN_LEFT) || + (base_dir == GIMP_TEXT_DIRECTION_TTB_LTR_UPRIGHT && align == PANGO_ALIGN_LEFT)) { layout->extents.x += PANGO_PIXELS (pango_layout_get_width (layout->layout)) - width; @@ -663,6 +675,19 @@ gimp_text_layout_position (GimpTextLayout *layout) layout->extents.height += 2 * border; } + if (PANGO_GRAVITY_IS_VERTICAL (pango_context_get_base_gravity (context))) + { + gint temp; + + temp = layout->extents.y; + layout->extents.y = layout->extents.x; + layout->extents.x = temp; + + temp = layout->extents.height; + layout->extents.height = layout->extents.width; + layout->extents.width = temp; + } + #ifdef VERBOSE g_printerr ("layout extents: %d x %d @ %d, %d\n", layout->extents.width, layout->extents.height, @@ -732,10 +757,38 @@ gimp_text_get_pango_context (GimpText *text, { case GIMP_TEXT_DIRECTION_LTR: pango_context_set_base_dir (context, PANGO_DIRECTION_LTR); + pango_context_set_gravity_hint (context, PANGO_GRAVITY_HINT_NATURAL); + pango_context_set_base_gravity (context, PANGO_GRAVITY_SOUTH); break; case GIMP_TEXT_DIRECTION_RTL: pango_context_set_base_dir (context, PANGO_DIRECTION_RTL); + pango_context_set_gravity_hint (context, PANGO_GRAVITY_HINT_NATURAL); + pango_context_set_base_gravity (context, PANGO_GRAVITY_SOUTH); + break; + + case GIMP_TEXT_DIRECTION_TTB_RTL: + pango_context_set_base_dir (context, PANGO_DIRECTION_LTR); + pango_context_set_gravity_hint (context, PANGO_GRAVITY_HINT_LINE); + pango_context_set_base_gravity (context, PANGO_GRAVITY_EAST); + break; + + case GIMP_TEXT_DIRECTION_TTB_RTL_UPRIGHT: + pango_context_set_base_dir (context, PANGO_DIRECTION_LTR); + pango_context_set_gravity_hint (context, PANGO_GRAVITY_HINT_STRONG); + pango_context_set_base_gravity (context, PANGO_GRAVITY_EAST); + break; + + case GIMP_TEXT_DIRECTION_TTB_LTR: + pango_context_set_base_dir (context, PANGO_DIRECTION_LTR); + pango_context_set_gravity_hint (context, PANGO_GRAVITY_HINT_LINE); + pango_context_set_base_gravity (context, PANGO_GRAVITY_WEST); + break; + + case GIMP_TEXT_DIRECTION_TTB_LTR_UPRIGHT: + pango_context_set_base_dir (context, PANGO_DIRECTION_LTR); + pango_context_set_gravity_hint (context, PANGO_GRAVITY_HINT_STRONG); + pango_context_set_base_gravity (context, PANGO_GRAVITY_WEST); break; } diff --git a/app/tools/gimpdrawtool.c b/app/tools/gimpdrawtool.c index e77aadf0b6..7b69f9b765 100644 --- a/app/tools/gimpdrawtool.c +++ b/app/tools/gimpdrawtool.c @@ -1143,16 +1143,17 @@ gimp_draw_tool_add_boundary (GimpDrawTool *draw_tool, } GimpCanvasItem * -gimp_draw_tool_add_text_cursor (GimpDrawTool *draw_tool, - PangoRectangle *cursor, - gboolean overwrite) +gimp_draw_tool_add_text_cursor (GimpDrawTool *draw_tool, + PangoRectangle *cursor, + gboolean overwrite, + GimpTextDirection direction) { GimpCanvasItem *item; g_return_val_if_fail (GIMP_IS_DRAW_TOOL (draw_tool), NULL); item = gimp_canvas_text_cursor_new (gimp_display_get_shell (draw_tool->display), - cursor, overwrite); + cursor, overwrite, direction); gimp_draw_tool_add_item (draw_tool, item); g_object_unref (item); diff --git a/app/tools/gimpdrawtool.h b/app/tools/gimpdrawtool.h index 7552a097f1..de13001c26 100644 --- a/app/tools/gimpdrawtool.h +++ b/app/tools/gimpdrawtool.h @@ -188,7 +188,8 @@ GimpCanvasItem * gimp_draw_tool_add_boundary (GimpDrawTool *draw_too GimpCanvasItem * gimp_draw_tool_add_text_cursor (GimpDrawTool *draw_tool, PangoRectangle *cursor, - gboolean overwrite); + gboolean overwrite, + GimpTextDirection direction); gboolean gimp_draw_tool_on_handle (GimpDrawTool *draw_tool, GimpDisplay *display, diff --git a/app/tools/gimptexttool-editor.c b/app/tools/gimptexttool-editor.c index fa61e1520a..4921cb2f9c 100644 --- a/app/tools/gimptexttool-editor.c +++ b/app/tools/gimptexttool-editor.c @@ -119,6 +119,13 @@ static void gimp_text_tool_im_delete_preedit (GimpTextTool *text_tool); static void gimp_text_tool_editor_copy_selection_to_clipboard (GimpTextTool *text_tool); +static void gimp_text_tool_fix_position (GimpTextTool *text_tool, + gdouble *x, + gdouble *y); + +static void gimp_text_tool_convert_gdkkeyevent (GimpTextTool *text_tool, + GdkEventKey *kevent); + /* public functions */ @@ -467,6 +474,8 @@ gimp_text_tool_editor_key_press (GimpTextTool *text_tool, return TRUE; } + gimp_text_tool_convert_gdkkeyevent (text_tool, kevent); + gimp_text_tool_ensure_proxy (text_tool); if (gtk_bindings_activate_event (G_OBJECT (text_tool->proxy_text_view), @@ -523,6 +532,8 @@ gimp_text_tool_editor_key_release (GimpTextTool *text_tool, return TRUE; } + gimp_text_tool_convert_gdkkeyevent (text_tool, kevent); + gimp_text_tool_ensure_proxy (text_tool); if (gtk_bindings_activate_event (G_OBJECT (text_tool->proxy_text_view), @@ -598,6 +609,7 @@ gimp_text_tool_editor_get_cursor_rect (GimpTextTool *text_tool, { GtkTextBuffer *buffer = GTK_TEXT_BUFFER (text_tool->buffer); PangoLayout *layout; + PangoContext *context; gint offset_x; gint offset_y; GtkTextIter cursor; @@ -615,19 +627,66 @@ gimp_text_tool_editor_get_cursor_rect (GimpTextTool *text_tool, layout = gimp_text_layout_get_pango_layout (text_tool->layout); + context = pango_layout_get_context (layout); + gimp_text_layout_get_offsets (text_tool->layout, &offset_x, &offset_y); if (overwrite) - pango_layout_index_to_pos (layout, cursor_index, cursor_rect); - else + { + pango_layout_index_to_pos (layout, cursor_index, cursor_rect); + + /* Avoid pango bug ? */ + if (pango_context_get_base_gravity (context) == PANGO_GRAVITY_WEST && + cursor_rect->width == 0) + pango_layout_get_cursor_pos (layout, cursor_index, cursor_rect, NULL); + } + else pango_layout_get_cursor_pos (layout, cursor_index, cursor_rect, NULL); gimp_text_layout_transform_rect (text_tool->layout, cursor_rect); - cursor_rect->x = PANGO_PIXELS (cursor_rect->x) + offset_x; - cursor_rect->y = PANGO_PIXELS (cursor_rect->y) + offset_y; - cursor_rect->width = PANGO_PIXELS (cursor_rect->width); - cursor_rect->height = PANGO_PIXELS (cursor_rect->height); + switch (gimp_text_tool_get_direction (text_tool)) + { + case GIMP_TEXT_DIRECTION_LTR: + case GIMP_TEXT_DIRECTION_RTL: + cursor_rect->x = PANGO_PIXELS (cursor_rect->x) + offset_x; + cursor_rect->y = PANGO_PIXELS (cursor_rect->y) + offset_y; + cursor_rect->width = PANGO_PIXELS (cursor_rect->width); + cursor_rect->height = PANGO_PIXELS (cursor_rect->height); + break; + case GIMP_TEXT_DIRECTION_TTB_RTL: + case GIMP_TEXT_DIRECTION_TTB_RTL_UPRIGHT: + { + gint temp, width, height; + + gimp_text_layout_get_size (text_tool->layout, &width, &height); + + temp = cursor_rect->x; + cursor_rect->x = width - PANGO_PIXELS (cursor_rect->y) + offset_x; + cursor_rect->y = PANGO_PIXELS (temp) + offset_y; + + temp = cursor_rect->width; + cursor_rect->width = PANGO_PIXELS (cursor_rect->height); + cursor_rect->height = PANGO_PIXELS (temp); + } + break; + case GIMP_TEXT_DIRECTION_TTB_LTR: + case GIMP_TEXT_DIRECTION_TTB_LTR_UPRIGHT: + { + gint temp, width, height; + + gimp_text_layout_get_size (text_tool->layout, &width, &height); + + temp = cursor_rect->x; + cursor_rect->x = PANGO_PIXELS (cursor_rect->y) + offset_x; + cursor_rect->y = height - PANGO_PIXELS (temp) + offset_y; + + temp = cursor_rect->width; + cursor_rect->width = PANGO_PIXELS (cursor_rect->height); + cursor_rect->height = PANGO_PIXELS (temp); + } + break; + } } void @@ -1375,6 +1434,8 @@ gimp_text_tool_xy_to_iter (GimpTextTool *text_tool, layout = gimp_text_layout_get_pango_layout (text_tool->layout); + gimp_text_tool_fix_position (text_tool, &x, &y); + pango_layout_xy_to_index (layout, x * PANGO_SCALE, y * PANGO_SCALE, @@ -1661,3 +1722,132 @@ gimp_text_tool_editor_copy_selection_to_clipboard (GimpTextTool *text_tool) gtk_text_buffer_copy_clipboard (buffer, clipboard); } } + +static void +gimp_text_tool_fix_position (GimpTextTool *text_tool, + gdouble *x, + gdouble *y) +{ + gint temp, width, height; + + gimp_text_layout_get_size (text_tool->layout, &width, &height); + switch (gimp_text_tool_get_direction(text_tool)) + { + case GIMP_TEXT_DIRECTION_RTL: + case GIMP_TEXT_DIRECTION_LTR: + break; + case GIMP_TEXT_DIRECTION_TTB_RTL: + case GIMP_TEXT_DIRECTION_TTB_RTL_UPRIGHT: + temp = width - *x; + *x = *y; + *y = temp; + break; + case GIMP_TEXT_DIRECTION_TTB_LTR: + case GIMP_TEXT_DIRECTION_TTB_LTR_UPRIGHT: + temp = *x; + *x = height - *y; + *y = temp; + break; + } +} + +static void +gimp_text_tool_convert_gdkkeyevent (GimpTextTool *text_tool, + GdkEventKey *kevent) +{ + switch (gimp_text_tool_get_direction (text_tool)) + { + case GIMP_TEXT_DIRECTION_LTR: + case GIMP_TEXT_DIRECTION_RTL: + break; + + case GIMP_TEXT_DIRECTION_TTB_RTL: + case GIMP_TEXT_DIRECTION_TTB_RTL_UPRIGHT: +#ifdef _WIN32 + switch (kevent->keyval) + { + case GDK_KEY_Up: + kevent->hardware_keycode = 0x25;/* VK_LEFT */ + kevent->keyval = GDK_KEY_Left; + break; + case GDK_KEY_Down: + kevent->hardware_keycode = 0x27;/* VK_RIGHT */ + kevent->keyval = GDK_KEY_Right; + break; + case GDK_KEY_Left: + kevent->hardware_keycode = 0x28;/* VK_DOWN */ + kevent->keyval = GDK_KEY_Down; + break; + case GDK_KEY_Right: + kevent->hardware_keycode = 0x26;/* VK_UP */ + kevent->keyval = GDK_KEY_Up; + break; + } +#else + switch (kevent->keyval) + { + case GDK_KEY_Up: + kevent->hardware_keycode = 113; + kevent->keyval = GDK_KEY_Left; + break; + case GDK_KEY_Down: + kevent->hardware_keycode = 114; + kevent->keyval = GDK_KEY_Right; + break; + case GDK_KEY_Left: + kevent->hardware_keycode = 116; + kevent->keyval = GDK_KEY_Down; + break; + case GDK_KEY_Right: + kevent->hardware_keycode = 111; + kevent->keyval = GDK_KEY_Up; + break; + } +#endif + break; + case GIMP_TEXT_DIRECTION_TTB_LTR: + case GIMP_TEXT_DIRECTION_TTB_LTR_UPRIGHT: +#ifdef _WIN32 + switch (kevent->keyval) + { + case GDK_KEY_Up: + kevent->hardware_keycode = 0x26;/* VK_UP */ + kevent->keyval = GDK_KEY_Up; + break; + case GDK_KEY_Down: + kevent->hardware_keycode = 0x28;/* VK_DOWN */ + kevent->keyval = GDK_KEY_Down; + break; + case GDK_KEY_Left: + kevent->hardware_keycode = 0x25;/* VK_LEFT */ + kevent->keyval = GDK_KEY_Left; + break; + case GDK_KEY_Right: + kevent->hardware_keycode = 0x27;/* VK_RIGHT */ + kevent->keyval = GDK_KEY_Right; + break; + } +#else + switch (kevent->keyval) + { + case GDK_KEY_Up: + kevent->hardware_keycode = 114; + kevent->keyval = GDK_KEY_Right; + break; + case GDK_KEY_Down: + kevent->hardware_keycode = 113; + kevent->keyval = GDK_KEY_Left; + break; + case GDK_KEY_Left: + kevent->hardware_keycode = 111; + kevent->keyval = GDK_KEY_Up; + break; + case GDK_KEY_Right: + kevent->hardware_keycode = 116; + kevent->keyval = GDK_KEY_Down; + break; + } +#endif + break; + } +} diff --git a/app/tools/gimptexttool.c b/app/tools/gimptexttool.c index 6f4e6742dc..3e9f2eb24a 100644 --- a/app/tools/gimptexttool.c +++ b/app/tools/gimptexttool.c @@ -891,10 +891,11 @@ gimp_text_tool_draw (GimpDrawTool *draw_tool) { /* If the text buffer has no selection, draw the text cursor */ - GimpCanvasItem *item; - PangoRectangle cursor_rect; - gint off_x, off_y; - gboolean overwrite; + GimpCanvasItem *item; + PangoRectangle cursor_rect; + gint off_x, off_y; + gboolean overwrite; + GimpTextDirection direction; gimp_text_tool_editor_get_cursor_rect (text_tool, text_tool->overwrite_mode, @@ -906,8 +907,10 @@ gimp_text_tool_draw (GimpDrawTool *draw_tool) overwrite = text_tool->overwrite_mode && cursor_rect.width != 0; + direction = gimp_text_tool_get_direction (text_tool); + item = gimp_draw_tool_add_text_cursor (draw_tool, &cursor_rect, - overwrite); + overwrite, direction); gimp_canvas_item_set_highlight (item, TRUE); } @@ -917,17 +920,20 @@ gimp_text_tool_draw (GimpDrawTool *draw_tool) static void gimp_text_tool_draw_selection (GimpDrawTool *draw_tool) { - GimpTextTool *text_tool = GIMP_TEXT_TOOL (draw_tool); - GtkTextBuffer *buffer = GTK_TEXT_BUFFER (text_tool->buffer); - GimpCanvasGroup *group; - PangoLayout *layout; - gint offset_x; - gint offset_y; - gint off_x, off_y; - PangoLayoutIter *iter; - GtkTextIter sel_start, sel_end; - gint min, max; - gint i; + GimpTextTool *text_tool = GIMP_TEXT_TOOL (draw_tool); + GtkTextBuffer *buffer = GTK_TEXT_BUFFER (text_tool->buffer); + GimpCanvasGroup *group; + PangoLayout *layout; + gint offset_x; + gint offset_y; + gint width; + gint height; + gint off_x, off_y; + PangoLayoutIter *iter; + GtkTextIter sel_start, sel_end; + gint min, max; + gint i; + GimpTextDirection direction; group = gimp_draw_tool_add_stroke_group (draw_tool); gimp_canvas_item_set_highlight (GIMP_CANVAS_ITEM (group), TRUE); @@ -941,10 +947,14 @@ gimp_text_tool_draw_selection (GimpDrawTool *draw_tool) gimp_text_layout_get_offsets (text_tool->layout, &offset_x, &offset_y); + gimp_text_layout_get_size (text_tool->layout, &width, &height); + gimp_item_get_offset (GIMP_ITEM (text_tool->layer), &off_x, &off_y); offset_x += off_x; offset_y += off_y; + direction = gimp_text_tool_get_direction (text_tool); + iter = pango_layout_get_iter (layout); gimp_draw_tool_push_group (draw_tool, group); @@ -971,12 +981,33 @@ gimp_text_tool_draw_selection (GimpDrawTool *draw_tool) gimp_text_layout_transform_rect (text_tool->layout, &rect); - rect.x += offset_x; - rect.y += offset_y; - - gimp_draw_tool_add_rectangle (draw_tool, FALSE, - rect.x, rect.y, - rect.width, rect.height); + switch (direction) + { + case GIMP_TEXT_DIRECTION_LTR: + case GIMP_TEXT_DIRECTION_RTL: + rect.x += offset_x; + rect.y += offset_y; + gimp_draw_tool_add_rectangle (draw_tool, FALSE, + rect.x, rect.y, + rect.width, rect.height); + break; + case GIMP_TEXT_DIRECTION_TTB_RTL: + case GIMP_TEXT_DIRECTION_TTB_RTL_UPRIGHT: + rect.y = offset_x - rect.y + width; + rect.x = offset_y + rect.x; + gimp_draw_tool_add_rectangle (draw_tool, FALSE, + rect.y, rect.x, + -rect.height, rect.width); + break; + case GIMP_TEXT_DIRECTION_TTB_LTR: + case GIMP_TEXT_DIRECTION_TTB_LTR_UPRIGHT: + rect.y = offset_x + rect.y; + rect.x = offset_y - rect.x + height; + gimp_draw_tool_add_rectangle (draw_tool, FALSE, + rect.y, rect.x, + rect.height, -rect.width); + break; + } } } while (pango_layout_iter_next_char (iter)); @@ -2264,3 +2295,10 @@ gimp_text_tool_create_vectors_warped (GimpTextTool *text_tool) gimp_image_flush (text_tool->image); } + +GimpTextDirection +gimp_text_tool_get_direction (GimpTextTool *text_tool) +{ + GimpTextOptions *options = GIMP_TEXT_TOOL_GET_OPTIONS (text_tool); + return options->base_dir; +} diff --git a/app/tools/gimptexttool.h b/app/tools/gimptexttool.h index d382ab9b6a..b463524440 100644 --- a/app/tools/gimptexttool.h +++ b/app/tools/gimptexttool.h @@ -119,6 +119,9 @@ void gimp_text_tool_paste_clipboard (GimpTextTool *text_tool); void gimp_text_tool_create_vectors (GimpTextTool *text_tool); void gimp_text_tool_create_vectors_warped (GimpTextTool *text_tool); +GimpTextDirection + gimp_text_tool_get_direction (GimpTextTool *text_tool); + /* only for the text editor */ void gimp_text_tool_clear_layout (GimpTextTool *text_tool); gboolean gimp_text_tool_ensure_layout (GimpTextTool *text_tool); diff --git a/app/widgets/gimptexteditor.c b/app/widgets/gimptexteditor.c index 953c7e3e80..dc25255cba 100644 --- a/app/widgets/gimptexteditor.c +++ b/app/widgets/gimptexteditor.c @@ -214,6 +214,10 @@ gimp_text_editor_new (const gchar *title, 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: @@ -286,6 +290,10 @@ gimp_text_editor_set_direction (GimpTextEditor *editor, 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: diff --git a/icons/Color/24/gimp-text-dir-ttb-ltr-upright.png b/icons/Color/24/gimp-text-dir-ttb-ltr-upright.png new file mode 100644 index 0000000000000000000000000000000000000000..f955debd15957a50e1349a3f0f489cf83c50de30 GIT binary patch literal 769 zcmV+c1OEJpP)bY*F7Wpd{G_b&hd03mcmSaefw zb#h~60BCe{a5^t9YH4k4VPh_Bb#rNBXklz@E@OIWX5(G}00J>dL_t(YiM7>Bh|f_J z2k_54n3;w@YCOhJ@+^iljg{3zB+8_ejV#8qSq&2v^{aF5IluEg=bm%VWtdTs$aAm^i!cMf@h)S33QzF1 zRD$wE9*rivM;&@Hw#~SObwzv~$8&5eM(`SqG5Y1$k#VpVCou*i3lL1ibc`!T(1EiU zAET&7Wz-vai7Nbxx>g*;1OI=r_edQ_=MRR2a9n@$ZkWaQKtmeiQJ7%8QTW5MB)cSA;{Mwhdv?Q zRNsrcxQ5k3A?Op@v?H!Bpf=He7cSUSOemEg?V=;tg~M@uJ!AV&DD<0XR}#_;KHwF$ zVtWDG9!$YJq034_n!!|IOpJ|WWkMaqy_QHmD5M$G<30`uL#{Q^O~a$XI?oc^!DHbr z)Z$~Jdx3??I?epQ$Qm{YE%+6ull{-aXgG#1cqWVssKH#}7-4esbFUCV3%=oYWaNc?3uu|x(PMnDmr|1?& zeU~EG7zwLl6#M<1ur0FnCkI300000NkvXXu0mjf0_92< literal 0 HcmV?d00001 diff --git a/icons/Color/24/gimp-text-dir-ttb-ltr.png b/icons/Color/24/gimp-text-dir-ttb-ltr.png new file mode 100644 index 0000000000000000000000000000000000000000..6bc4d84577f6c9936db902bd3246fe72310f10da GIT binary patch literal 780 zcmV+n1M~ceP)bY*F7Wpd{G_b&hd03mcmSaefw zb#h~60BCe{a5^t9YH4k4VPh_Bb#rNBXklz@E@OIWX5(G}00KNoL_t(YiM7>Bh|f_J z2k?(!nwcg(y&u(i1Ju@)F@KQYb?kHDdm+sim;?eDJ7*WGz&z? zBjdU7p0POhuRA}({D*v3=iYNW-}AowXY|eF37Cy0j7109lWsA-;#F@6Dl&N>8u1!+ zc$n#~VKq)+IcmGHbrAQlD!=TP$xqRMXPAy5*pYNkZ~-4g)YmYp5Ycdq!QkITuomYq zG-Kk7LgkO0000< KMNUMnLSTZDk4>lm literal 0 HcmV?d00001 diff --git a/icons/Color/24/gimp-text-dir-ttb-rtl-upright.png b/icons/Color/24/gimp-text-dir-ttb-rtl-upright.png new file mode 100644 index 0000000000000000000000000000000000000000..66febba0a8e8da01c8acd4bfaf6a69fe36baac88 GIT binary patch literal 728 zcmV;}0w?{6P)bY*F7Wpd{G_b&hd03mcmSaefw zb#h~60BCe{a5^t9YH4k4VPh_Bb#rNBXklz@E@OIWX5(G}00Ia}L_t(YiM7?wi%(G) z2JnyHjo+pjGYbr_fQ#3$z)BKHW}GOZ8uP>W^J#Guq(Rk%J^Q4PUa7=0{5y-C|t&FyvLk`e;4P? zn1TC3)ePBrmr!z@3Ev&LgV-Y^_!QMA6c%C)p5aEOHDNPe;~_qjxvP}WS+%Vju%?{Qocja2QtJ$3XKoU9~N3f_b(LOmbCq>^_hV4u(`2BAer z#_#xaU_+wM#yV_L-Z5)&9xEkBUDWv#p?*``PR2WhvaJ*Pc8(rg!!%6KgTt|G+?NHo zi;F^{n=`FVxRqNmt}OU1;p)D{)e?6Feh7^!#o74L>v&NXoKO|*C9VlavI_Il01-Qc zV;j`#^ULr``2P)Le7DdqdT~bhwH2txEMd1}utnI}n-YWn4u1edd2bceh9}1W0000< KMNUMnLSTZ^^gpuz literal 0 HcmV?d00001 diff --git a/icons/Color/24/gimp-text-dir-ttb-rtl.png b/icons/Color/24/gimp-text-dir-ttb-rtl.png new file mode 100644 index 0000000000000000000000000000000000000000..cf97823500fdb48748b9b46c557e21452e8467d4 GIT binary patch literal 780 zcmV+n1M~ceP)bY*F7Wpd{G_b&hd03mcmSaefw zb#h~60BCe{a5^t9YH4k4VPh_Bb#rNBXklz@E@OIWX5(G}00KNoL_t(YiM7>Bh>l?t z2k@VJA2TM+xMhq>B2sQCL=lGEW;qK=M9M;%6f2=biOfQ?A-9cz5wAfV_MtzfqC+&& zxQVA&k@4TcPF%t^49~=eU_5fD#`7eQEifLFF)ZVMi7PmPN3mc{D*hTXV)6!T#W)yP zq}^f|gjrZ5w7y0DxHjW9=AspMu^MN}Ezl&iy%FDw#7AR2D$s^KXfBqh1Al}zdy65$ zMCyf6q5Ki;#&lE(y#2s=T#NBt(f)|**n|tcDNunOSRe@CtssWr4+z(XS6t5`;%OiST1T4Lf?vC#cg{2tZ`iU{IzbJV z$3m4-OV%3|Ri*4&`M-)z+`zYJ|H>v9fq8flJ7^MqUI|8HLdvcya*1kz=oXAkoXK)j zpdBNly-FanE!w})Ba9#?Y;sTZCzy>Tf_&SB_d~zb2gl>h;R`0=U9^v8Zd)rTr8VOp zC@kU=MTj1Qufm9qWMT*8zkc;toU%t^KMvx7f0HOcGd^Qf#=ilL@!St51>VvaEWCJg zN+l + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + Jakub Steiner + + + http://jimmac.musichall.cz + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/icons/Color/scalable/gimp-text-dir-ttb-ltr.svg b/icons/Color/scalable/gimp-text-dir-ttb-ltr.svg new file mode 100644 index 0000000000..05b0deb01d --- /dev/null +++ b/icons/Color/scalable/gimp-text-dir-ttb-ltr.svg @@ -0,0 +1,290 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + Jakub Steiner + + + http://jimmac.musichall.cz + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/icons/Color/scalable/gimp-text-dir-ttb-rtl-upright.svg b/icons/Color/scalable/gimp-text-dir-ttb-rtl-upright.svg new file mode 100644 index 0000000000..714306ec0f --- /dev/null +++ b/icons/Color/scalable/gimp-text-dir-ttb-rtl-upright.svg @@ -0,0 +1,190 @@ + + + + + + + + + + + + + image/svg+xml + + + + Jakub Steiner + + + http://jimmac.musichall.cz + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/icons/Color/scalable/gimp-text-dir-ttb-rtl.svg b/icons/Color/scalable/gimp-text-dir-ttb-rtl.svg new file mode 100644 index 0000000000..7606d33038 --- /dev/null +++ b/icons/Color/scalable/gimp-text-dir-ttb-rtl.svg @@ -0,0 +1,208 @@ + + + + + + + + + + + + + image/svg+xml + + + + Jakub Steiner + + + http://jimmac.musichall.cz + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/icons/Legacy/24/gimp-text-dir-ttb-ltr-upright.png b/icons/Legacy/24/gimp-text-dir-ttb-ltr-upright.png new file mode 100644 index 0000000000000000000000000000000000000000..08556b3b2aa122037737d8d3b6d6c8a6b87d4da2 GIT binary patch literal 471 zcmV;|0Vw{7P)S1&pHf34DM%3CKVC=c@P7r2=>=Xtt?bfU@v1qRA0harU z0O0N>WtXEGQU6Nd6&*0btRNqmY!VRw4zmKX6j$2^TJ9@q%bX?YytfLYzvqh-0C2y$ z9z0Qkt$c?4Zw9^NUC*6Tjt!khop(!XnL?|M7;wb$kAL~kI1r3sNWq0n#yVDmMpVS z?%4*Ut9An5%fN6Q#mTM9MeH~(zfCNoI9UTAc?JfbPGkL5{3oXB!VekIigbNQzWo3I N002ovPDHLkV1mb;%cuYV literal 0 HcmV?d00001 diff --git a/icons/Legacy/24/gimp-text-dir-ttb-ltr-upright.xcf b/icons/Legacy/24/gimp-text-dir-ttb-ltr-upright.xcf new file mode 100644 index 0000000000000000000000000000000000000000..f4ef93ff4255989884fa40a61be22a1826046f22 GIT binary patch literal 4555 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 literal 0 HcmV?d00001 diff --git a/icons/Legacy/24/gimp-text-dir-ttb-rtl-upright.png b/icons/Legacy/24/gimp-text-dir-ttb-rtl-upright.png new file mode 100644 index 0000000000000000000000000000000000000000..7361e95bf5265a3cb272afca8657c818daaf27e0 GIT binary patch literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjY)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYYtEkBcrE_V~EG`tD%N`hYWaZ+^1?h(x1EPPpAKarXSq=iQPu24>Ub= zW-N6KoVCR-gI%YzBm4KczPAkZYBJg@lo&Xhg&9`dSoPYpeD6FX#YZxyJ9HR#R4f$= zPLDffp;GWEJv8EWjF?QS!%<0w8^_NXmw#Z*X*sy^+nR0fqC;;i`j@@b&sS0L)EVb* zcS8KMaswA_V2w;TZp!eFkMB~f3fqgSwM{(pERS{XUXdVH^wisWsn{J2eg=1j^7OOS zj1x9DKU-sY{Mxx$n>Rn>I?#78GcnfZU#qH=5Fc}cbVK+-flo2hc@I__xVY>{iu3b(-fy*mA;jS6>gTe~DWM4fn{0}A literal 0 HcmV?d00001 diff --git a/icons/Legacy/24/gimp-text-dir-ttb-rtl-upright.xcf b/icons/Legacy/24/gimp-text-dir-ttb-rtl-upright.xcf new file mode 100644 index 0000000000000000000000000000000000000000..711c0c6563fdf211ee2f48ac55513c9c5f9c4e53 GIT binary patch literal 4570 zcmeHLPiz!b7=Q20{+ZovySt?nT7^sjV{7ct%4CR=AmYJfVoV5lklXIET{l8ow?*lx z?Lr)DOj;6Ry!GP6#DhT(5($^qiM=Q1JIhYvyTpym9ojYGPs*|(j+Dy4LTb-Jm8A%UMR7z9lr)tKq z&qiyNV!;?Q$NbSj7!O?|2rYI9Res~)0)<|hnJ$#7lNIC0ODbV{c&?K%w2fYztj?nN z(z|7<`qI?I#7ud%T_8+ze>Vk|?Vt6>vJr?kus{zkl3;4FHS~Pn8 z2ku-V2G7OytyOO5)cjm6c*<*yp`FB+HecauUBAX+^M8Y21C1zfShAhOd) zfs}k8B0n3E(-GN-$eD=T6_L9mau%{KF~DggLF#_bMdU*yV_FORU?@|JdINhQM~3(% zqNpbm<`tVAd@yPBn){=R>1K~lF;g-T%4E}^YvA16Vy5Z4lu0)eEN*awCD=WqRxBC@ zO7`Q)P&n-ybW>w;L>L})VMxr5F>dfe^Yqyo0tDvA%s5P&?SKR{4^Dx}NhWZM47fBj zRKh{sEag|!q>4;4hXfut6-mVhasY@kK(hc16tmzBWzse18aTJMm}U7cWzsD`a{vwe zp0m2L;y8fj$CF{X?i+Lq&`t@*gDxCEvjENE%gy@IDgp%N$1Ff|HroM!=6G-dngwXM zMFw0tfMx-j1!#UnO{&PU0L}8isYoh5kOM$IG#k)BF&o}cCS8NBfpdF{*|zUeCfx=! z7tp}(xf|>2t_x^>JQ>z*_y*kuv@62(pbHn!Y(R7QTJy%O4Fm|xkJ*6cZngse&Gp~} zG#k)xiwwAQ0nG+98_@iUnpBZ(1DfrDQ;}4BAXD)=rk`P4YM|`@#A8f~RG7P)Wn_lQ z1x<30T;MlfwnbCJqLDi^7)9Aoo*gn4|w>|@@5l)IQ5h~u4>0}0uKYciB` zzCG{H>1Fo?V*@l->_IH!v2L z^-~8QOsPA{J}*wNHu3M+U9M-c`CM90#&{RIs}CJM`ts2ijQzbaXzAfsUORF8$nyvL zNE2QC`v&*s)9E<3D4n`D{n%f8=6DrqQ>HkD_BaCOaosU&dqT*9W3{h@;orfmEBXI|V!(+_BjN!bgEV+FEIfP0cHX6Y(p z_`K={3D$(h7?k@G2Rj%9zPjWaU{c@1w#X-tgou)0!9%(2B2y2|Pq(x6IsC4oxiRe;K~Ov|D&>FcmF-4-@xTxE=4zB literal 0 HcmV?d00001 diff --git a/icons/Legacy/24/gimp-text-dir-ttb-rtl.png b/icons/Legacy/24/gimp-text-dir-ttb-rtl.png new file mode 100644 index 0000000000000000000000000000000000000000..3d622f4df35d9db5fbfe10857544a0fab54da1ec GIT binary patch literal 433 zcmV;i0Z#sjP)mj011%Hl6-~KNgAnOsY=r{j-Q{OTS8`rEqWHb z!-!2-&qRB;zc6Bn2&v;djZ{M*Wh90zj*d?@@i3`GO4)cnoTAh7i}wP7G!We6>(dCK z5y7t%L}xhy>LN&v4O;~7c8((g>JXeCsFR$^HF%fqsR5K)^Ja>c=%TBGv&#qkr48wz zk_u^%-Y?UXrmRG1xK*s2CR(I}LIa!NokSD@;BcrHy**twE6A|@D8y8ac-D(F=L>3G zTc_$q!&WLAUjSSIc+R7&d=s=bvYTuT+uMSJI{>eS?PKun6TsI1qWOyoinO*Dy!%dN zn(2ZXvBi8PFsiER(l9y6NWt%o^Cjg=#(74c*Y}jrAkP>NGid6X$N)y3<{Z$;S b**AUwcMyg*l<08}00000NkvXXu0mjfPD``y literal 0 HcmV?d00001 diff --git a/icons/Legacy/24/gimp-text-dir-ttb-rtl.xcf b/icons/Legacy/24/gimp-text-dir-ttb-rtl.xcf new file mode 100644 index 0000000000000000000000000000000000000000..d4746f028b3db3edad86955a0a32735dcd8353c0 GIT binary patch literal 3392 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 literal 0 HcmV?d00001 diff --git a/icons/Symbolic/24/gimp-text-dir-ttb-rtl.png b/icons/Symbolic/24/gimp-text-dir-ttb-rtl.png new file mode 100644 index 0000000000000000000000000000000000000000..830a9c7a60267436df8314febfa64d7cd019455f GIT binary patch literal 1233 zcmV;?1TOoDP)Y;1WTV{&C- zbY)~9VRImKXk{QGL2`5;Ole|rWg;MHV{dLCb7gccAVqj|Wo~3;WFTQ~WFTQ=Z*X*F zWFTg5av(=ZO;9FWB!U0{1L8?UK~zYIwUk|G990y@|L5GPyOXZgkilb%X?nF0q+ISYm9k> znLQC<$8kykU|m!gh{*Lsv|nrOrO>R191Mcs8Y1!XzVQ% z3akH6vXzcy~6NJyfk$ZQHiLisQKR zGZ-Bm{Qz0PsBTc4posB4?TTBdzthG$*1(5gGG+ z|27esbY1s*pu-UbK~P}k-Abtsn0a1Aj+aWMOv0HpWP?uWYK6eo(se9ndFJ0=vcj8*J%f?>wd<}hX5?(ayhfk zL3^%8MC1Sfn~09(^Z7HW@0-iZ%P&k!OvC`-`~F?b{8s|!=H~iZt=0h%Q2+{-WfcH4 z*BrE6{0`uK02jhAd@bD_5q;U$*Y^MbhzPYeSx9(3pFgv-v~(E2fKuwwbaU%&k!4wj z0URA4AOAC*cO2&v0R6u2e;5S8Br~5H85ud7@TsY(D|&l-kBG=C#+V8GTNI1MPOt7- vl*{EigCH1azwZfx;H7f8e8=VP^Pl2xjxM^{x|Z^S00000NkvXXu0mjfVkRtY literal 0 HcmV?d00001 diff --git a/icons/Symbolic/scalable/gimp-text-dir-ttb-ltr-symbolic.svg b/icons/Symbolic/scalable/gimp-text-dir-ttb-ltr-symbolic.svg new file mode 100644 index 0000000000..4c5db3a24c --- /dev/null +++ b/icons/Symbolic/scalable/gimp-text-dir-ttb-ltr-symbolic.svg @@ -0,0 +1,174 @@ + + + + + + + image/svg+xml + + + + + Barbara Muraus, Jakub Steiner, Klaus Staedtler + + + Images originally created as the "Art Libre" icon set. Extended and adopted for GIMP + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/icons/Symbolic/scalable/gimp-text-dir-ttb-ltr-upright-symbolic.svg b/icons/Symbolic/scalable/gimp-text-dir-ttb-ltr-upright-symbolic.svg new file mode 100644 index 0000000000..c7512b02f4 --- /dev/null +++ b/icons/Symbolic/scalable/gimp-text-dir-ttb-ltr-upright-symbolic.svg @@ -0,0 +1,174 @@ + + + + + + + image/svg+xml + + + + + Barbara Muraus, Jakub Steiner, Klaus Staedtler + + + Images originally created as the "Art Libre" icon set. Extended and adopted for GIMP + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/icons/Symbolic/scalable/gimp-text-dir-ttb-rtl-symbolic.svg b/icons/Symbolic/scalable/gimp-text-dir-ttb-rtl-symbolic.svg new file mode 100644 index 0000000000..9fa67ff9f4 --- /dev/null +++ b/icons/Symbolic/scalable/gimp-text-dir-ttb-rtl-symbolic.svg @@ -0,0 +1,173 @@ + + + + + + + image/svg+xml + + + + + Barbara Muraus, Jakub Steiner, Klaus Staedtler + + + Images originally created as the "Art Libre" icon set. Extended and adopted for GIMP + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/icons/Symbolic/scalable/gimp-text-dir-ttb-rtl-upright-symbolic.svg b/icons/Symbolic/scalable/gimp-text-dir-ttb-rtl-upright-symbolic.svg new file mode 100644 index 0000000000..8f9b3550fb --- /dev/null +++ b/icons/Symbolic/scalable/gimp-text-dir-ttb-rtl-upright-symbolic.svg @@ -0,0 +1,173 @@ + + + + + + + image/svg+xml + + + + + Barbara Muraus, Jakub Steiner, Klaus Staedtler + + + Images originally created as the "Art Libre" icon set. Extended and adopted for GIMP + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/icons/icon-list.mk b/icons/icon-list.mk index 49dabe0b47..e50f1fc4d5 100644 --- a/icons/icon-list.mk +++ b/icons/icon-list.mk @@ -255,6 +255,10 @@ color_scalable_images = \ scalable/gimp-swap-colors.svg \ scalable/gimp-symmetry.svg \ scalable/gimp-template.svg \ + scalable/gimp-text-dir-ttb-rtl.svg \ + scalable/gimp-text-dir-ttb-rtl-upright.svg \ + scalable/gimp-text-dir-ttb-ltr.svg \ + scalable/gimp-text-dir-ttb-ltr-upright.svg \ scalable/gimp-text-layer.svg \ scalable/gimp-toilet-paper.svg \ scalable/gimp-tool-airbrush.svg \ @@ -751,6 +755,10 @@ symbolic_scalable_images = \ scalable/gimp-swap-colors-symbolic.svg \ scalable/gimp-symmetry-symbolic.svg \ scalable/gimp-template-symbolic.svg \ + scalable/gimp-text-dir-ttb-rtl-symbolic.svg \ + scalable/gimp-text-dir-ttb-rtl-upright-symbolic.svg \ + scalable/gimp-text-dir-ttb-ltr-symbolic.svg \ + scalable/gimp-text-dir-ttb-ltr-upright-symbolic.svg \ scalable/gimp-text-layer-symbolic.svg \ scalable/gimp-toilet-paper-symbolic.svg \ scalable/gimp-tool-airbrush-symbolic.svg \ @@ -1419,6 +1427,10 @@ icons24_images = \ 24/gimp-smartphone.png \ 24/gimp-symmetry.png \ 24/gimp-template.png \ + 24/gimp-text-dir-ttb-rtl.png \ + 24/gimp-text-dir-ttb-rtl-upright.png \ + 24/gimp-text-dir-ttb-ltr.png \ + 24/gimp-text-dir-ttb-ltr-upright.png \ 24/gimp-text-layer.png \ 24/gimp-toilet-paper.png \ 24/gimp-tool-airbrush.png \ diff --git a/libgimpbase/gimpbaseenums.c b/libgimpbase/gimpbaseenums.c index 003eda0273..83dfe2ef2a 100644 --- a/libgimpbase/gimpbaseenums.c +++ b/libgimpbase/gimpbaseenums.c @@ -1795,6 +1795,10 @@ gimp_text_direction_get_type (void) { { GIMP_TEXT_DIRECTION_LTR, "GIMP_TEXT_DIRECTION_LTR", "ltr" }, { GIMP_TEXT_DIRECTION_RTL, "GIMP_TEXT_DIRECTION_RTL", "rtl" }, + { GIMP_TEXT_DIRECTION_TTB_RTL, "GIMP_TEXT_DIRECTION_TTB_RTL", "ttb-rtl" }, + { GIMP_TEXT_DIRECTION_TTB_RTL_UPRIGHT, "GIMP_TEXT_DIRECTION_TTB_RTL_UPRIGHT", "ttb-rtl-upright" }, + { GIMP_TEXT_DIRECTION_TTB_LTR, "GIMP_TEXT_DIRECTION_TTB_LTR", "ttb-ltr" }, + { GIMP_TEXT_DIRECTION_TTB_LTR_UPRIGHT, "GIMP_TEXT_DIRECTION_TTB_LTR_UPRIGHT", "ttb-ltr-upright" }, { 0, NULL, NULL } }; @@ -1802,6 +1806,10 @@ gimp_text_direction_get_type (void) { { GIMP_TEXT_DIRECTION_LTR, NC_("text-direction", "From left to right"), NULL }, { GIMP_TEXT_DIRECTION_RTL, NC_("text-direction", "From right to left"), NULL }, + { GIMP_TEXT_DIRECTION_TTB_RTL, NC_("text-direction", "Characters are from top to bottom, Lines are from right to left"), NULL }, + { GIMP_TEXT_DIRECTION_TTB_RTL_UPRIGHT, NC_("text-direction", "Upright characters are from top to bottom, Lines are from right to left"), NULL }, + { GIMP_TEXT_DIRECTION_TTB_LTR, NC_("text-direction", "Characters are from top to bottom, Lines are from left to right"), NULL }, + { GIMP_TEXT_DIRECTION_TTB_LTR_UPRIGHT, NC_("text-direction", "Upright characters are from top to bottom, Lines are from left to right"), NULL }, { 0, NULL, NULL } }; diff --git a/libgimpbase/gimpbaseenums.h b/libgimpbase/gimpbaseenums.h index edc507a8d9..6a4d9e3ec8 100644 --- a/libgimpbase/gimpbaseenums.h +++ b/libgimpbase/gimpbaseenums.h @@ -1226,6 +1226,10 @@ typedef enum * GimpTextDirection: * @GIMP_TEXT_DIRECTION_LTR: From left to right * @GIMP_TEXT_DIRECTION_RTL: From right to left + * @GIMP_TEXT_DIRECTION_TTB_RTL: Characters are from top to bottom, Lines are from right to left + * @GIMP_TEXT_DIRECTION_TTB_RTL_UPRIGHT: Upright characters are from top to bottom, Lines are from right to left + * @GIMP_TEXT_DIRECTION_TTB_LTR: Characters are from top to bottom, Lines are from left to right + * @GIMP_TEXT_DIRECTION_TTB_LTR_UPRIGHT: Upright characters are from top to bottom, Lines are from left to right * * Text directions. **/ @@ -1235,8 +1239,12 @@ GType gimp_text_direction_get_type (void) G_GNUC_CONST; typedef enum { - GIMP_TEXT_DIRECTION_LTR, /*< desc="From left to right" >*/ - GIMP_TEXT_DIRECTION_RTL /*< desc="From right to left" >*/ + GIMP_TEXT_DIRECTION_LTR, /*< desc="From left to right" >*/ + GIMP_TEXT_DIRECTION_RTL, /*< desc="From right to left" >*/ + GIMP_TEXT_DIRECTION_TTB_RTL, /*< desc="Characters are from top to bottom, Lines are from right to left" >*/ + GIMP_TEXT_DIRECTION_TTB_RTL_UPRIGHT, /*< desc="Upright characters are from top to bottom, Lines are from right to left" >*/ + GIMP_TEXT_DIRECTION_TTB_LTR, /*< desc="Characters are from top to bottom, Lines are from left to right" >*/ + GIMP_TEXT_DIRECTION_TTB_LTR_UPRIGHT /*< desc="Upright characters are from top to bottom, Lines are from left to right" >*/ } GimpTextDirection; diff --git a/libgimpwidgets/gimpicons.h b/libgimpwidgets/gimpicons.h index 11a88b490d..2be4d0be22 100644 --- a/libgimpwidgets/gimpicons.h +++ b/libgimpwidgets/gimpicons.h @@ -218,6 +218,10 @@ G_BEGIN_DECLS #define GIMP_ICON_FORMAT_TEXT_UNDERLINE "format-text-underline" #define GIMP_ICON_FORMAT_TEXT_DIRECTION_LTR "format-text-direction-ltr" #define GIMP_ICON_FORMAT_TEXT_DIRECTION_RTL "format-text-direction-rtl" +#define GIMP_ICON_FORMAT_TEXT_DIRECTION_TTB_RTL "gimp-text-dir-ttb-rtl" /* use FDO */ +#define GIMP_ICON_FORMAT_TEXT_DIRECTION_TTB_RTL_UPRIGHT "gimp-text-dir-ttb-rtl-upright" /* use FDO */ +#define GIMP_ICON_FORMAT_TEXT_DIRECTION_TTB_LTR "gimp-text-dir-ttb-ltr" /* use FDO */ +#define GIMP_ICON_FORMAT_TEXT_DIRECTION_TTB_LTR_UPRIGHT "gimp-text-dir-ttb-ltr-upright" /* use FDO */ #define GIMP_ICON_FORMAT_TEXT_SPACING_LETTER "gimp-letter-spacing" #define GIMP_ICON_FORMAT_TEXT_SPACING_LINE "gimp-line-spacing" diff --git a/menus/text-editor-toolbar.xml b/menus/text-editor-toolbar.xml index 9d23692c03..d1e096fee5 100644 --- a/menus/text-editor-toolbar.xml +++ b/menus/text-editor-toolbar.xml @@ -8,5 +8,9 @@ + + + + diff --git a/menus/text-tool-menu.xml b/menus/text-tool-menu.xml index d4923a859f..c38f86be2f 100644 --- a/menus/text-tool-menu.xml +++ b/menus/text-tool-menu.xml @@ -16,6 +16,10 @@ + + + + diff --git a/pdb/enums.pl b/pdb/enums.pl index 33601e4eeb..906cedf344 100644 --- a/pdb/enums.pl +++ b/pdb/enums.pl @@ -605,9 +605,17 @@ package Gimp::CodeGen::enums; GimpTextDirection => { contig => 1, header => 'libgimpbase/gimpbaseenums.h', - symbols => [ qw(GIMP_TEXT_DIRECTION_LTR GIMP_TEXT_DIRECTION_RTL) ], + symbols => [ qw(GIMP_TEXT_DIRECTION_LTR GIMP_TEXT_DIRECTION_RTL + GIMP_TEXT_DIRECTION_TTB_RTL + GIMP_TEXT_DIRECTION_TTB_RTL_UPRIGHT + GIMP_TEXT_DIRECTION_TTB_LTR + GIMP_TEXT_DIRECTION_TTB_LTR_UPRIGHT) ], mapping => { GIMP_TEXT_DIRECTION_LTR => '0', - GIMP_TEXT_DIRECTION_RTL => '1' } + GIMP_TEXT_DIRECTION_RTL => '1', + GIMP_TEXT_DIRECTION_TTB_RTL => '2', + GIMP_TEXT_DIRECTION_TTB_RTL_UPRIGHT => '3', + GIMP_TEXT_DIRECTION_TTB_LTR => '4', + GIMP_TEXT_DIRECTION_TTB_LTR_UPRIGHT => '5' } }, GimpTextHintStyle => { contig => 1,