From 19513964eb939d09abdbe465f03174c94fe60f90 Mon Sep 17 00:00:00 2001 From: Jasper Date: Wed, 24 Sep 2025 16:26:55 +0200 Subject: [PATCH] Issue #5474: Add sideways text orientations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds two new text orientations according to the suggestion in issue #5474. GIMP_TEXT_DIRECTION_SIDEWAYS_RL rotates the text 90° clockwise, GIMP_TEXT_DIRECTION_SIDEWAYS_LR rotates the text 90° counterclockwise. In contrast to vertical + mixed orientation even CJK characters are rotated. --- app/actions/layers-commands.c | 2 ++ app/actions/text-editor-actions.c | 20 ++++++++++++++++++++ app/actions/text-tool-actions.c | 12 +++++++++++- app/display/gimpcanvastextcursor.c | 8 ++++++++ app/text/gimptextlayer.c | 9 ++++++++- app/text/gimptextlayout-render.c | 6 ++++-- app/text/gimptextlayout.c | 24 +++++++++++++++++++++--- app/tools/gimptexttool-editor.c | 6 ++++++ app/tools/gimptexttool.c | 7 ++++++- app/widgets/gimphelp-ids.h | 2 ++ app/widgets/gimptexteditor.c | 4 ++++ gimp-data | 2 +- libgimpbase/gimpbaseenums.c | 4 ++++ libgimpbase/gimpbaseenums.h | 6 +++++- libgimpwidgets/gimpicons.h | 2 ++ menus/text-editor-toolbar.ui | 2 ++ menus/text-tool-menu.ui | 2 ++ pdb/enums.pl | 8 ++++++-- plug-ins/common/file-pdf-export.c | 22 +++++++++++++++++++--- 19 files changed, 133 insertions(+), 15 deletions(-) diff --git a/app/actions/layers-commands.c b/app/actions/layers-commands.c index 01c98ec26e9..46d0a3cfdc7 100644 --- a/app/actions/layers-commands.c +++ b/app/actions/layers-commands.c @@ -1241,6 +1241,8 @@ layers_text_along_path_cmd_callback (GimpAction *action, case GIMP_TEXT_DIRECTION_TTB_RTL_UPRIGHT: case GIMP_TEXT_DIRECTION_TTB_LTR: case GIMP_TEXT_DIRECTION_TTB_LTR_UPRIGHT: + case GIMP_TEXT_DIRECTION_SIDEWAYS_RL: + case GIMP_TEXT_DIRECTION_SIDEWAYS_LR: { GimpStroke *stroke = NULL; diff --git a/app/actions/text-editor-actions.c b/app/actions/text-editor-actions.c index 8e886c2ba90..3b0746ed250 100644 --- a/app/actions/text-editor-actions.c +++ b/app/actions/text-editor-actions.c @@ -86,6 +86,18 @@ static const GimpRadioActionEntry text_editor_direction_actions[] = NC_("text-editor-action", "Vertical, left to right (upright orientation)"), GIMP_TEXT_DIRECTION_TTB_LTR_UPRIGHT, NULL }, + + { "text-editor-direction-sideways-rl", GIMP_ICON_FORMAT_TEXT_DIRECTION_SIDEWAYS_RL, + NC_("text-editor-action", "SIDEWAYS-RL"), NULL, { NULL }, + NC_("text-editor-action", "Sideways, 90° clockwise, right to left"), + GIMP_TEXT_DIRECTION_SIDEWAYS_RL, + NULL }, + + { "text-editor-direction-sideways-lr", GIMP_ICON_FORMAT_TEXT_DIRECTION_SIDEWAYS_LR, + NC_("text-editor-action", "SIDEWAYS-LR"), NULL, { NULL }, + NC_("text-editor-action", "Sideways, 90° counterclockwise, left to right"), + GIMP_TEXT_DIRECTION_SIDEWAYS_LR, + NULL }, }; @@ -138,6 +150,14 @@ text_editor_actions_update (GimpActionGroup *group, case GIMP_TEXT_DIRECTION_TTB_LTR_UPRIGHT: SET_ACTIVE ("text-editor-direction-ttb-ltr-upright", TRUE); break; + + case GIMP_TEXT_DIRECTION_SIDEWAYS_RL: + SET_ACTIVE ("text-editor-direction-sideways-rl", TRUE); + break; + + case GIMP_TEXT_DIRECTION_SIDEWAYS_LR: + SET_ACTIVE ("text-editor-direction-sideways-lr", TRUE); + break; } #undef SET_ACTIVE diff --git a/app/actions/text-tool-actions.c b/app/actions/text-tool-actions.c index 38c9df50ff3..8268ab14c1b 100644 --- a/app/actions/text-tool-actions.c +++ b/app/actions/text-tool-actions.c @@ -137,7 +137,17 @@ static const GimpRadioActionEntry text_tool_direction_actions[] = { "text-tool-direction-ttb-ltr-upright", GIMP_ICON_FORMAT_TEXT_DIRECTION_TTB_LTR_UPRIGHT, NC_("text-tool-action", "Vertical, left to right (upright orientation)"), NULL, { NULL }, NULL, GIMP_TEXT_DIRECTION_TTB_LTR_UPRIGHT, - GIMP_HELP_TEXT_TOOL_DIRECTION_TTB_LTR_UP } + GIMP_HELP_TEXT_TOOL_DIRECTION_TTB_LTR_UP }, + + { "text-tool-direction-sideways-rl", GIMP_ICON_FORMAT_TEXT_DIRECTION_SIDEWAYS_RL, + NC_("text-tool-action", "Sideways, 90° clockwise, right to left"), NULL, { NULL }, NULL, + GIMP_TEXT_DIRECTION_SIDEWAYS_RL, + GIMP_HELP_TEXT_TOOL_DIRECTION_SIDEWAYS_RL }, + + { "text-tool-direction-sideways-lr", GIMP_ICON_FORMAT_TEXT_DIRECTION_SIDEWAYS_LR, + NC_("text-tool-action", "Sideways, 90° counterclockwise, left to right"), NULL, { NULL }, NULL, + GIMP_TEXT_DIRECTION_SIDEWAYS_LR, + GIMP_HELP_TEXT_TOOL_DIRECTION_SIDEWAYS_LR } }; diff --git a/app/display/gimpcanvastextcursor.c b/app/display/gimpcanvastextcursor.c index aaa8c5fb50f..484755334a8 100644 --- a/app/display/gimpcanvastextcursor.c +++ b/app/display/gimpcanvastextcursor.c @@ -238,10 +238,12 @@ gimp_canvas_text_cursor_transform (GimpCanvasItem *item, break; case GIMP_TEXT_DIRECTION_TTB_RTL: case GIMP_TEXT_DIRECTION_TTB_RTL_UPRIGHT: + case GIMP_TEXT_DIRECTION_SIDEWAYS_RL: *x = *x - *w; break; case GIMP_TEXT_DIRECTION_TTB_LTR: case GIMP_TEXT_DIRECTION_TTB_LTR_UPRIGHT: + case GIMP_TEXT_DIRECTION_SIDEWAYS_LR: *y = *y + *h; break; } @@ -262,11 +264,13 @@ gimp_canvas_text_cursor_transform (GimpCanvasItem *item, break; case GIMP_TEXT_DIRECTION_TTB_RTL: case GIMP_TEXT_DIRECTION_TTB_RTL_UPRIGHT: + case GIMP_TEXT_DIRECTION_SIDEWAYS_RL: *w = ceil (*w) - 1.0; *h = 0; break; case GIMP_TEXT_DIRECTION_TTB_LTR: case GIMP_TEXT_DIRECTION_TTB_LTR_UPRIGHT: + case GIMP_TEXT_DIRECTION_SIDEWAYS_LR: *w = ceil (*w) - 1.0; *h = 0; break; @@ -307,6 +311,8 @@ gimp_canvas_text_cursor_draw (GimpCanvasItem *item, case GIMP_TEXT_DIRECTION_TTB_RTL_UPRIGHT: case GIMP_TEXT_DIRECTION_TTB_LTR: case GIMP_TEXT_DIRECTION_TTB_LTR_UPRIGHT: + case GIMP_TEXT_DIRECTION_SIDEWAYS_RL: + case GIMP_TEXT_DIRECTION_SIDEWAYS_LR: cairo_move_to (cr, x, y); cairo_line_to (cr, x + w, y); @@ -354,6 +360,8 @@ gimp_canvas_text_cursor_get_extents (GimpCanvasItem *item) case GIMP_TEXT_DIRECTION_TTB_RTL_UPRIGHT: case GIMP_TEXT_DIRECTION_TTB_LTR: case GIMP_TEXT_DIRECTION_TTB_LTR_UPRIGHT: + case GIMP_TEXT_DIRECTION_SIDEWAYS_RL: + case GIMP_TEXT_DIRECTION_SIDEWAYS_LR: rectangle.x = floor (x - 1.5); rectangle.y = floor (y - 4.5); rectangle.width = ceil (w + 3.0); diff --git a/app/text/gimptextlayer.c b/app/text/gimptextlayer.c index cd2017e92f4..5f6a7599fab 100644 --- a/app/text/gimptextlayer.c +++ b/app/text/gimptextlayer.c @@ -660,10 +660,12 @@ gimp_text_layer_text_changed (GimpTextLayer *layer) case GIMP_TEXT_DIRECTION_RTL: case GIMP_TEXT_DIRECTION_TTB_LTR: case GIMP_TEXT_DIRECTION_TTB_LTR_UPRIGHT: + case GIMP_TEXT_DIRECTION_SIDEWAYS_LR: switch (new_base_dir) { case GIMP_TEXT_DIRECTION_TTB_RTL: case GIMP_TEXT_DIRECTION_TTB_RTL_UPRIGHT: + case GIMP_TEXT_DIRECTION_SIDEWAYS_RL: gimp_item_translate (item, -new_width, 0, FALSE); break; @@ -671,30 +673,35 @@ gimp_text_layer_text_changed (GimpTextLayer *layer) case GIMP_TEXT_DIRECTION_RTL: case GIMP_TEXT_DIRECTION_TTB_LTR: case GIMP_TEXT_DIRECTION_TTB_LTR_UPRIGHT: + case GIMP_TEXT_DIRECTION_SIDEWAYS_LR: break; } break; case GIMP_TEXT_DIRECTION_TTB_RTL: case GIMP_TEXT_DIRECTION_TTB_RTL_UPRIGHT: + case GIMP_TEXT_DIRECTION_SIDEWAYS_RL: switch (new_base_dir) { case GIMP_TEXT_DIRECTION_LTR: case GIMP_TEXT_DIRECTION_RTL: case GIMP_TEXT_DIRECTION_TTB_LTR: case GIMP_TEXT_DIRECTION_TTB_LTR_UPRIGHT: + case GIMP_TEXT_DIRECTION_SIDEWAYS_LR: gimp_item_translate (item, old_width, 0, FALSE); break; case GIMP_TEXT_DIRECTION_TTB_RTL: case GIMP_TEXT_DIRECTION_TTB_RTL_UPRIGHT: + case GIMP_TEXT_DIRECTION_SIDEWAYS_RL: break; } break; } } else if ((new_base_dir == GIMP_TEXT_DIRECTION_TTB_RTL || - new_base_dir == GIMP_TEXT_DIRECTION_TTB_RTL_UPRIGHT)) + new_base_dir == GIMP_TEXT_DIRECTION_TTB_RTL_UPRIGHT || + new_base_dir == GIMP_TEXT_DIRECTION_SIDEWAYS_RL)) { if (old_width != new_width) gimp_item_translate (item, old_width - new_width, 0, FALSE); diff --git a/app/text/gimptextlayout-render.c b/app/text/gimptextlayout-render.c index f3605e33613..c3e1de8268c 100644 --- a/app/text/gimptextlayout-render.c +++ b/app/text/gimptextlayout-render.c @@ -51,7 +51,8 @@ gimp_text_layout_render (GimpTextLayout *layout, cairo_transform (cr, &trafo); if (base_dir == GIMP_TEXT_DIRECTION_TTB_RTL || - base_dir == GIMP_TEXT_DIRECTION_TTB_RTL_UPRIGHT) + base_dir == GIMP_TEXT_DIRECTION_TTB_RTL_UPRIGHT || + base_dir == GIMP_TEXT_DIRECTION_SIDEWAYS_RL) { gimp_text_layout_get_size (layout, &width, &height); cairo_translate (cr, width, 0); @@ -59,7 +60,8 @@ gimp_text_layout_render (GimpTextLayout *layout, } if (base_dir == GIMP_TEXT_DIRECTION_TTB_LTR || - base_dir == GIMP_TEXT_DIRECTION_TTB_LTR_UPRIGHT) + base_dir == GIMP_TEXT_DIRECTION_TTB_LTR_UPRIGHT || + base_dir == GIMP_TEXT_DIRECTION_SIDEWAYS_LR) { gimp_text_layout_get_size (layout, &width, &height); cairo_translate (cr, 0, height); diff --git a/app/text/gimptextlayout.c b/app/text/gimptextlayout.c index d73cff10c0e..97264a48b14 100644 --- a/app/text/gimptextlayout.c +++ b/app/text/gimptextlayout.c @@ -192,7 +192,9 @@ gimp_text_layout_new (GimpText *text, case GIMP_TEXT_BOX_DYNAMIC: break; case GIMP_TEXT_BOX_FIXED: - if (! PANGO_GRAVITY_IS_VERTICAL (pango_context_get_base_gravity (context))) + if (! (PANGO_GRAVITY_IS_VERTICAL (pango_context_get_base_gravity (context)) || + text->base_dir == GIMP_TEXT_DIRECTION_SIDEWAYS_RL || + text->base_dir == GIMP_TEXT_DIRECTION_SIDEWAYS_LR)) pango_layout_set_width (layout->layout, pango_units_from_double (gimp_units_to_pixels (text->box_width, @@ -772,7 +774,9 @@ gimp_text_layout_position (GimpTextLayout *layout) (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)) + (base_dir == GIMP_TEXT_DIRECTION_TTB_LTR_UPRIGHT && align == PANGO_ALIGN_LEFT) || + (base_dir == GIMP_TEXT_DIRECTION_SIDEWAYS_RL && align == PANGO_ALIGN_RIGHT) || + (base_dir == GIMP_TEXT_DIRECTION_SIDEWAYS_LR && align == PANGO_ALIGN_RIGHT)) { layout->extents.x += PANGO_PIXELS (pango_layout_get_width (layout->layout)) - width; @@ -798,7 +802,9 @@ gimp_text_layout_position (GimpTextLayout *layout) layout->extents.height += 2 * border; } - if (PANGO_GRAVITY_IS_VERTICAL (pango_context_get_base_gravity (context))) + if (PANGO_GRAVITY_IS_VERTICAL (pango_context_get_base_gravity (context)) || + layout->text->base_dir == GIMP_TEXT_DIRECTION_SIDEWAYS_RL || + layout->text->base_dir == GIMP_TEXT_DIRECTION_SIDEWAYS_LR) { gint temp; @@ -918,6 +924,18 @@ gimp_text_get_pango_context (GimpText *text, pango_context_set_gravity_hint (context, PANGO_GRAVITY_HINT_STRONG); pango_context_set_base_gravity (context, PANGO_GRAVITY_WEST); break; + + case GIMP_TEXT_DIRECTION_SIDEWAYS_RL: + 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_SOUTH); + break; + + case GIMP_TEXT_DIRECTION_SIDEWAYS_LR: + 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_SOUTH); + break; } return context; diff --git a/app/tools/gimptexttool-editor.c b/app/tools/gimptexttool-editor.c index d596ca57e9d..fd9c4430ded 100644 --- a/app/tools/gimptexttool-editor.c +++ b/app/tools/gimptexttool-editor.c @@ -688,6 +688,7 @@ gimp_text_tool_editor_get_cursor_rect (GimpTextTool *text_tool, break; case GIMP_TEXT_DIRECTION_TTB_RTL: case GIMP_TEXT_DIRECTION_TTB_RTL_UPRIGHT: + case GIMP_TEXT_DIRECTION_SIDEWAYS_RL: { gint temp, width, height; @@ -704,6 +705,7 @@ gimp_text_tool_editor_get_cursor_rect (GimpTextTool *text_tool, break; case GIMP_TEXT_DIRECTION_TTB_LTR: case GIMP_TEXT_DIRECTION_TTB_LTR_UPRIGHT: + case GIMP_TEXT_DIRECTION_SIDEWAYS_LR: { gint temp, width, height; @@ -1802,12 +1804,14 @@ gimp_text_tool_fix_position (GimpTextTool *text_tool, break; case GIMP_TEXT_DIRECTION_TTB_RTL: case GIMP_TEXT_DIRECTION_TTB_RTL_UPRIGHT: + case GIMP_TEXT_DIRECTION_SIDEWAYS_RL: temp = width - *x; *x = *y; *y = temp; break; case GIMP_TEXT_DIRECTION_TTB_LTR: case GIMP_TEXT_DIRECTION_TTB_LTR_UPRIGHT: + case GIMP_TEXT_DIRECTION_SIDEWAYS_LR: temp = *x; *x = height - *y; *y = temp; @@ -1827,6 +1831,7 @@ gimp_text_tool_convert_gdkkeyevent (GimpTextTool *text_tool, case GIMP_TEXT_DIRECTION_TTB_RTL: case GIMP_TEXT_DIRECTION_TTB_RTL_UPRIGHT: + case GIMP_TEXT_DIRECTION_SIDEWAYS_RL: #ifdef _WIN32 switch (kevent->keyval) { @@ -1871,6 +1876,7 @@ gimp_text_tool_convert_gdkkeyevent (GimpTextTool *text_tool, break; case GIMP_TEXT_DIRECTION_TTB_LTR: case GIMP_TEXT_DIRECTION_TTB_LTR_UPRIGHT: + case GIMP_TEXT_DIRECTION_SIDEWAYS_LR: #ifdef _WIN32 switch (kevent->keyval) { diff --git a/app/tools/gimptexttool.c b/app/tools/gimptexttool.c index ac92aafcd5f..94866ffd41d 100644 --- a/app/tools/gimptexttool.c +++ b/app/tools/gimptexttool.c @@ -986,6 +986,7 @@ gimp_text_tool_draw_selection (GimpDrawTool *draw_tool) break; case GIMP_TEXT_DIRECTION_TTB_RTL: case GIMP_TEXT_DIRECTION_TTB_RTL_UPRIGHT: + case GIMP_TEXT_DIRECTION_SIDEWAYS_RL: rect.y = offset_x - rect.y + width; rect.x = offset_y + rect.x; gimp_draw_tool_add_rectangle (draw_tool, FALSE, @@ -994,6 +995,7 @@ gimp_text_tool_draw_selection (GimpDrawTool *draw_tool) break; case GIMP_TEXT_DIRECTION_TTB_LTR: case GIMP_TEXT_DIRECTION_TTB_LTR_UPRIGHT: + case GIMP_TEXT_DIRECTION_SIDEWAYS_LR: rect.y = offset_x + rect.y; rect.x = offset_y - rect.x + height; gimp_draw_tool_add_rectangle (draw_tool, FALSE, @@ -1669,7 +1671,8 @@ gimp_text_tool_create_layer (GimpTextTool *text_tool, { if (text_tool->text && (text_tool->text->base_dir == GIMP_TEXT_DIRECTION_TTB_RTL || - text_tool->text->base_dir == GIMP_TEXT_DIRECTION_TTB_RTL_UPRIGHT)) + text_tool->text->base_dir == GIMP_TEXT_DIRECTION_TTB_RTL_UPRIGHT || + text_tool->text->base_dir == GIMP_TEXT_DIRECTION_SIDEWAYS_RL)) { x1 -= gimp_item_get_width (GIMP_ITEM (layer)); } @@ -2429,6 +2432,8 @@ gimp_text_tool_create_path_warped (GimpTextTool *text_tool, case GIMP_TEXT_DIRECTION_TTB_RTL_UPRIGHT: case GIMP_TEXT_DIRECTION_TTB_LTR: case GIMP_TEXT_DIRECTION_TTB_LTR_UPRIGHT: + case GIMP_TEXT_DIRECTION_SIDEWAYS_RL: + case GIMP_TEXT_DIRECTION_SIDEWAYS_LR: { GimpStroke *stroke = NULL; diff --git a/app/widgets/gimphelp-ids.h b/app/widgets/gimphelp-ids.h index 57555f433f3..3548d58b184 100644 --- a/app/widgets/gimphelp-ids.h +++ b/app/widgets/gimphelp-ids.h @@ -328,6 +328,8 @@ #define GIMP_HELP_TEXT_TOOL_DIRECTION_TTB_RTL_UP "gimp-text-tool-direction-ttb-rtl-upright" #define GIMP_HELP_TEXT_TOOL_DIRECTION_TTB_LTR "gimp-text-tool-direction-ttb-ltr" #define GIMP_HELP_TEXT_TOOL_DIRECTION_TTB_LTR_UP "gimp-text-tool-direction-ttb-ltr-upright" +#define GIMP_HELP_TEXT_TOOL_DIRECTION_SIDEWAYS_RL "gimp-text-tool-direction-sideways-rl" +#define GIMP_HELP_TEXT_TOOL_DIRECTION_SIDEWAYS_LR "gimp-text-tool-direction-sideways-lr" #define GIMP_HELP_TOOL_AIRBRUSH "gimp-tool-airbrush" #define GIMP_HELP_TOOL_ALIGN "gimp-tool-align" diff --git a/app/widgets/gimptexteditor.c b/app/widgets/gimptexteditor.c index d21984f528e..6c5c297ea2d 100644 --- a/app/widgets/gimptexteditor.c +++ b/app/widgets/gimptexteditor.c @@ -223,6 +223,8 @@ gimp_text_editor_new (const gchar *title, case GIMP_TEXT_DIRECTION_TTB_RTL_UPRIGHT: case GIMP_TEXT_DIRECTION_TTB_LTR: case GIMP_TEXT_DIRECTION_TTB_LTR_UPRIGHT: + case GIMP_TEXT_DIRECTION_SIDEWAYS_RL: + case GIMP_TEXT_DIRECTION_SIDEWAYS_LR: gtk_widget_set_direction (editor->view, GTK_TEXT_DIR_LTR); break; case GIMP_TEXT_DIRECTION_RTL: @@ -299,6 +301,8 @@ gimp_text_editor_set_direction (GimpTextEditor *editor, case GIMP_TEXT_DIRECTION_TTB_RTL_UPRIGHT: case GIMP_TEXT_DIRECTION_TTB_LTR: case GIMP_TEXT_DIRECTION_TTB_LTR_UPRIGHT: + case GIMP_TEXT_DIRECTION_SIDEWAYS_RL: + case GIMP_TEXT_DIRECTION_SIDEWAYS_LR: gtk_widget_set_direction (editor->view, GTK_TEXT_DIR_LTR); break; case GIMP_TEXT_DIRECTION_RTL: diff --git a/gimp-data b/gimp-data index 9218ec59701..ea3e7c3d385 160000 --- a/gimp-data +++ b/gimp-data @@ -1 +1 @@ -Subproject commit 9218ec59701770715a2755d8ba9f8c0e588fb4bd +Subproject commit ea3e7c3d385ee3dfb8703fd71f35aa64e2ff5503 diff --git a/libgimpbase/gimpbaseenums.c b/libgimpbase/gimpbaseenums.c index 47d4b4fa3ee..74fab9e8b7f 100644 --- a/libgimpbase/gimpbaseenums.c +++ b/libgimpbase/gimpbaseenums.c @@ -1693,6 +1693,8 @@ gimp_text_direction_get_type (void) { 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" }, + { GIMP_TEXT_DIRECTION_SIDEWAYS_RL, "GIMP_TEXT_DIRECTION_SIDEWAYS_RL", "sideways-rl" }, + { GIMP_TEXT_DIRECTION_SIDEWAYS_LR, "GIMP_TEXT_DIRECTION_SIDEWAYS_LR", "sideways-lr" }, { 0, NULL, NULL } }; @@ -1704,6 +1706,8 @@ gimp_text_direction_get_type (void) { GIMP_TEXT_DIRECTION_TTB_RTL_UPRIGHT, NC_("text-direction", "Vertical, right to left (upright orientation)"), NULL }, { GIMP_TEXT_DIRECTION_TTB_LTR, NC_("text-direction", "Vertical, left to right (mixed orientation)"), NULL }, { GIMP_TEXT_DIRECTION_TTB_LTR_UPRIGHT, NC_("text-direction", "Vertical, left to right (upright orientation)"), NULL }, + { GIMP_TEXT_DIRECTION_SIDEWAYS_RL, NC_("text-direction", "Sideways, 90° clockwise, right to left"), NULL }, + { GIMP_TEXT_DIRECTION_SIDEWAYS_LR, NC_("text-direction", "Sideways, 90° counterclockwise, left to right"), NULL }, { 0, NULL, NULL } }; diff --git a/libgimpbase/gimpbaseenums.h b/libgimpbase/gimpbaseenums.h index 9b2f0c99219..cb0df339e36 100644 --- a/libgimpbase/gimpbaseenums.h +++ b/libgimpbase/gimpbaseenums.h @@ -1135,6 +1135,8 @@ typedef enum * @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 + * @GIMP_TEXT_DIRECTION_SIDEWAYS_RL: Characters are rotated 90° clockwise, Lines are from right to left + * @GIMP_TEXT_DIRECTION_SIDEWAYS_LR: Characters are rotated 90° counterclockwise, Lines are from left to right * * Text directions. **/ @@ -1149,7 +1151,9 @@ typedef enum GIMP_TEXT_DIRECTION_TTB_RTL, /*< desc="Vertical, right to left (mixed orientation)" >*/ GIMP_TEXT_DIRECTION_TTB_RTL_UPRIGHT, /*< desc="Vertical, right to left (upright orientation)" >*/ GIMP_TEXT_DIRECTION_TTB_LTR, /*< desc="Vertical, left to right (mixed orientation)" >*/ - GIMP_TEXT_DIRECTION_TTB_LTR_UPRIGHT /*< desc="Vertical, left to right (upright orientation)" >*/ + GIMP_TEXT_DIRECTION_TTB_LTR_UPRIGHT, /*< desc="Vertical, left to right (upright orientation)" >*/ + GIMP_TEXT_DIRECTION_SIDEWAYS_RL, /*< desc="Sideways, 90° clockwise, right to left" >*/ + GIMP_TEXT_DIRECTION_SIDEWAYS_LR /*< desc="Sideways, 90° counterclockwise, left to right" >*/ } GimpTextDirection; diff --git a/libgimpwidgets/gimpicons.h b/libgimpwidgets/gimpicons.h index 1eccb8be22d..3c75abf5412 100644 --- a/libgimpwidgets/gimpicons.h +++ b/libgimpwidgets/gimpicons.h @@ -237,6 +237,8 @@ G_BEGIN_DECLS #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_DIRECTION_SIDEWAYS_RL "gimp-text-dir-sideways-rl" /* use FDO */ +#define GIMP_ICON_FORMAT_TEXT_DIRECTION_SIDEWAYS_LR "gimp-text-dir-sideways-lr" /* 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.ui b/menus/text-editor-toolbar.ui index 8f7ec544c32..f0d9f400e3a 100644 --- a/menus/text-editor-toolbar.ui +++ b/menus/text-editor-toolbar.ui @@ -12,5 +12,7 @@ text-editor.text-editor-direction-ttb-rtl-upright text-editor.text-editor-direction-ttb-ltr text-editor.text-editor-direction-ttb-ltr-upright + text-editor.text-editor-direction-sideways-rl + text-editor.text-editor-direction-sideways-lr diff --git a/menus/text-tool-menu.ui b/menus/text-tool-menu.ui index 50bbb3bcd57..f07c0f03781 100644 --- a/menus/text-tool-menu.ui +++ b/menus/text-tool-menu.ui @@ -28,6 +28,8 @@ text-tool.text-tool-direction-ttb-rtl-upright text-tool.text-tool-direction-ttb-ltr text-tool.text-tool-direction-ttb-ltr-upright + text-tool.text-tool-direction-sideways-rl + text-tool.text-tool-direction-sideways-lr diff --git a/pdb/enums.pl b/pdb/enums.pl index fc0c5ceefbb..39d7abe7f91 100644 --- a/pdb/enums.pl +++ b/pdb/enums.pl @@ -551,13 +551,17 @@ package Gimp::CodeGen::enums; GIMP_TEXT_DIRECTION_TTB_RTL GIMP_TEXT_DIRECTION_TTB_RTL_UPRIGHT GIMP_TEXT_DIRECTION_TTB_LTR - GIMP_TEXT_DIRECTION_TTB_LTR_UPRIGHT) ], + GIMP_TEXT_DIRECTION_TTB_LTR_UPRIGHT + GIMP_TEXT_DIRECTION_SIDEWAYS_RL + GIMP_TEXT_DIRECTION_SIDEWAYS_LR) ], mapping => { GIMP_TEXT_DIRECTION_LTR => '0', 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' } + GIMP_TEXT_DIRECTION_TTB_LTR_UPRIGHT => '5', + GIMP_TEXT_DIRECTION_SIDEWAYS_RL => '6', + GIMP_TEXT_DIRECTION_SIDEWAYS_LR => '7' } }, GimpTextHintStyle => { contig => 1, diff --git a/plug-ins/common/file-pdf-export.c b/plug-ins/common/file-pdf-export.c index 900a8379076..b79f5aaa036 100644 --- a/plug-ins/common/file-pdf-export.c +++ b/plug-ins/common/file-pdf-export.c @@ -1702,6 +1702,18 @@ drawText (GimpLayer *layer, pango_context_set_gravity_hint (context, PANGO_GRAVITY_HINT_STRONG); pango_context_set_base_gravity (context, PANGO_GRAVITY_WEST); break; + + case GIMP_TEXT_DIRECTION_SIDEWAYS_RL: + 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_SOUTH); + break; + + case GIMP_TEXT_DIRECTION_SIDEWAYS_LR: + 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_SOUTH); + break; } /* We are done with the context's settings. It's time to create the @@ -1718,7 +1730,9 @@ drawText (GimpLayer *layer, pango_layout_set_font_description (layout, font_description); /* Width */ - if (! PANGO_GRAVITY_IS_VERTICAL (pango_context_get_base_gravity (context))) + if (! (PANGO_GRAVITY_IS_VERTICAL (pango_context_get_base_gravity (context)) || + dir == GIMP_TEXT_DIRECTION_SIDEWAYS_RL || + dir == GIMP_TEXT_DIRECTION_SIDEWAYS_LR)) pango_layout_set_width (layout, gimp_drawable_get_width (GIMP_DRAWABLE (layer)) * PANGO_SCALE); @@ -1774,14 +1788,16 @@ drawText (GimpLayer *layer, pango_layout_set_text (layout, text, -1); if (dir == GIMP_TEXT_DIRECTION_TTB_RTL || - dir == GIMP_TEXT_DIRECTION_TTB_RTL_UPRIGHT) + dir == GIMP_TEXT_DIRECTION_TTB_RTL_UPRIGHT || + dir == GIMP_TEXT_DIRECTION_SIDEWAYS_RL) { cairo_translate (cr, gimp_drawable_get_width (GIMP_DRAWABLE (layer)), 0); cairo_rotate (cr, G_PI_2); } if (dir == GIMP_TEXT_DIRECTION_TTB_LTR || - dir == GIMP_TEXT_DIRECTION_TTB_LTR_UPRIGHT) + dir == GIMP_TEXT_DIRECTION_TTB_LTR_UPRIGHT || + dir == GIMP_TEXT_DIRECTION_SIDEWAYS_LR) { cairo_translate (cr, 0, gimp_drawable_get_height (GIMP_DRAWABLE (layer))); cairo_rotate (cr, -G_PI_2); -- GitLab