From 1f850dd849a7b303a8bf794950feb6fd4ebc8dcc Mon Sep 17 00:00:00 2001
From: themushroompirates
<59015901+themushroompirates@users.noreply.github.com>
Date: Fri, 10 Oct 2025 17:34:03 +0200
Subject: [PATCH] Added text alignment example
---
examples/Makefile | 3 +-
examples/Makefile.Web | 3 +-
examples/README.md | 5 +-
examples/examples_list.txt | 1 +
examples/text/text_words_alignment.c | 130 +++++++++++++++++++++++++
examples/text/text_words_alignment.png | Bin 0 -> 15745 bytes
6 files changed, 138 insertions(+), 4 deletions(-)
create mode 100644 examples/text/text_words_alignment.c
create mode 100644 examples/text/text_words_alignment.png
diff --git a/examples/Makefile b/examples/Makefile
index fb33b4894..389935a23 100644
--- a/examples/Makefile
+++ b/examples/Makefile
@@ -607,7 +607,8 @@ TEXT = \
text/text_sprite_fonts \
text/text_unicode_emojis \
text/text_unicode_ranges \
- text/text_writing_anim
+ text/text_writing_anim \
+ text/text_words_alignment
MODELS = \
models/models_animation_gpu_skinning \
diff --git a/examples/Makefile.Web b/examples/Makefile.Web
index 0dbefadf2..636cbe0f9 100644
--- a/examples/Makefile.Web
+++ b/examples/Makefile.Web
@@ -607,7 +607,8 @@ TEXT = \
text/text_sprite_fonts \
text/text_unicode_emojis \
text/text_unicode_ranges \
- text/text_writing_anim
+ text/text_writing_anim \
+ text/text_words_alignment
MODELS = \
models/models_animation_gpu_skinning \
diff --git a/examples/README.md b/examples/README.md
index 70e07df2b..1064f950a 100644
--- a/examples/README.md
+++ b/examples/README.md
@@ -17,7 +17,7 @@ You may find it easier to use than other toolchains, especially when it comes to
- `zig build [module]` to compile all examples for a module (e.g. `zig build core`)
- `zig build [example]` to compile _and run_ a particular example (e.g. `zig build core_basic_window`)
-## EXAMPLES COLLECTION [TOTAL: 172]
+## EXAMPLES COLLECTION [TOTAL: 173]
### category: core [40]
@@ -129,7 +129,7 @@ Examples using raylib textures functionality, including image/textures loading/g
| [textures_image_rotate](textures/textures_image_rotate.c) |
| ⭐⭐☆☆ | 1.0 | 1.0 | [Ramon Santamaria](https://github.com/raysan5) |
| [textures_textured_curve](textures/textures_textured_curve.c) |
| ⭐⭐⭐☆ | 4.5 | 4.5 | [Jeffery Myers](https://github.com/JeffM2501) |
-### category: text [14]
+### category: text [15]
Examples using raylib text functionality, including sprite fonts loading/generation and text drawing, provided by raylib [text](../src/rtext.c) module.
@@ -149,6 +149,7 @@ Examples using raylib text functionality, including sprite fonts loading/generat
| [text_3d_drawing](text/text_3d_drawing.c) |
| ⭐⭐⭐⭐️ | 3.5 | 4.0 | [Vlad Adrian](https://github.com/demizdor) |
| [text_codepoints_loading](text/text_codepoints_loading.c) |
| ⭐⭐⭐☆ | 4.2 | 4.2 | [Ramon Santamaria](https://github.com/raysan5) |
| [text_inline_styling](text/text_inline_styling.c) |
| ⭐⭐⭐☆ | 5.6-dev | 5.6-dev | [Wagner Barongello](https://github.com/SultansOfCode) |
+| [text_words_alignment](text/text_words_alignment.c) |
| ⭐⭐⭐☆ | 5.6-dev | 5.6-dev | [JP Mortiboys](https://github.com/themushroompirates) |
### category: models [25]
diff --git a/examples/examples_list.txt b/examples/examples_list.txt
index 50643bf2b..1ffc9c02c 100644
--- a/examples/examples_list.txt
+++ b/examples/examples_list.txt
@@ -110,6 +110,7 @@ text;text_unicode_ranges;★★★★;5.5;5.6;2025;2025;"Vlad Adrian";@demizdor
text;text_3d_drawing;★★★★;3.5;4.0;2021;2025;"Vlad Adrian";@demizdor
text;text_codepoints_loading;★★★☆;4.2;4.2;2022;2025;"Ramon Santamaria";@raysan5
text;text_inline_styling;★★★☆;5.6-dev;5.6-dev;2025;2025;"Wagner Barongello";@SultansOfCode
+text;text_words_alignment;★☆☆☆;5.6-dev;5.6-dev;2025;2025;"JP Mortiboys";@themushroompirates
models;models_animation_playing;★★☆☆;2.5;3.5;2019;2025;"Culacant";@culacant
models;models_billboard_rendering;★★★☆;1.3;3.5;2015;2025;"Ramon Santamaria";@raysan5
models;models_box_collisions;★☆☆☆;1.3;3.5;2015;2025;"Ramon Santamaria";@raysan5
diff --git a/examples/text/text_words_alignment.c b/examples/text/text_words_alignment.c
new file mode 100644
index 000000000..0f012ab75
--- /dev/null
+++ b/examples/text/text_words_alignment.c
@@ -0,0 +1,130 @@
+/*******************************************************************************************
+*
+* raylib [text] example - text alignment
+*
+* Example complexity rating: [★☆☆☆] 1/4
+*
+* Example originally created with raylib 5.0, last time updated with raylib 5.5
+*
+* Example contributed by JP Mortiboys (@themushroompirates) and reviewed by Ramon Santamaria (@raysan5)
+*
+* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
+* BSD-like license that allows static linking with closed source software
+*
+* Copyright (c) 2025 JP Mortiboys (@themushroompirates)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+#include "raymath.h" // Required for: Lerp()
+
+typedef enum TextAlignment {
+ TEXT_ALIGN_LEFT = 0,
+ TEXT_ALIGN_TOP = 0,
+ TEXT_ALIGN_CENTRE = 1,
+ TEXT_ALIGN_MIDDLE = 1,
+ TEXT_ALIGN_RIGHT = 2,
+ TEXT_ALIGN_BOTTOM = 2
+} TextAlignment;
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [text] example - text alignment");
+
+ // Define the rectangle we will draw the text in
+ Rectangle textContainerRect = (Rectangle){ screenWidth/2-screenWidth/4, screenHeight/2-screenHeight/3, screenWidth/2, screenHeight*2/3 };
+
+ // Some text to display the current alignment
+ const char *textAlignNameH[] = { "Left", "Centre", "Right" };
+ const char *textAlignNameV[] = { "Top", "Middle", "Bottom" };
+
+ // Define the text we're going to draw in the rectangle
+ int wordIndex = 0;
+ int wordCount = 0;
+ char **words = TextSplit("raylib is a simple and easy-to-use library to enjoy videogames programming", ' ', &wordCount);
+
+ // Initialize the font size we're going to use
+ int fontSize = 40;
+
+ // And of course the font...
+ Font font = GetFontDefault();
+
+ // Intialize the alignment variables
+ TextAlignment hAlign = TEXT_ALIGN_CENTRE;
+ TextAlignment vAlign = TEXT_ALIGN_MIDDLE;
+
+ SetTargetFPS(60); // Set our game to run at 60 frames-per-second
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!WindowShouldClose()) // Detect window close button or ESC key
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+
+ if (IsKeyPressed(KEY_LEFT)) {
+ hAlign = hAlign - 1;
+ if (hAlign < 0) hAlign = 0;
+ }
+ if (IsKeyPressed(KEY_RIGHT)) {
+ hAlign = hAlign + 1;
+ if (hAlign > 2) hAlign = 2;
+ }
+ if (IsKeyPressed(KEY_UP)) {
+ vAlign = vAlign - 1;
+ if (vAlign < 0) vAlign = 0;
+ }
+ if (IsKeyPressed(KEY_DOWN)) {
+ vAlign = vAlign + 1;
+ if (vAlign > 2) vAlign = 2;
+ }
+
+ // One word per second
+ wordIndex = (int)GetTime() % wordCount;
+
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(DARKBLUE);
+
+ DrawText("Use Arrow Keys to change the text alignment", 20, 20, 20, LIGHTGRAY);
+ DrawText(TextFormat("Alignment: Horizontal = %s, Vertical = %s", textAlignNameH[hAlign], textAlignNameV[vAlign]), 20, 40, 20, LIGHTGRAY);
+
+ DrawRectangleRec(textContainerRect, BLUE);
+
+ // Get the size of the text to draw
+ Vector2 textSize = MeasureTextEx(font, words[wordIndex], fontSize, fontSize*.1f);
+
+ // Calculate the top-left text position based on the rectangle and alignment
+ Vector2 textPos = (Vector2) {
+ textContainerRect.x + Lerp(0.0f, textContainerRect.width - textSize.x, ((float)hAlign) * 0.5f),
+ textContainerRect.y + Lerp(0.0f, textContainerRect.height - textSize.y, ((float)vAlign) * 0.5f)
+ };
+
+ // Draw the text
+ DrawTextEx(font, words[wordIndex], textPos, fontSize, fontSize*.1f, RAYWHITE);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
\ No newline at end of file
diff --git a/examples/text/text_words_alignment.png b/examples/text/text_words_alignment.png
new file mode 100644
index 0000000000000000000000000000000000000000..ae0892381437200ccf3fd6e74005250d658e2282
GIT binary patch
literal 15745
zcmeHOdsI?+9tUNROq3p$$_SEfR!+t!RvS`^idci1S$PZDuFpBx=
z_?Ee8{Avzr>I2M@$_phO^mJpB5VR=|JQji20XJuGMFgUS-c$!8k!6;~0EzgYN1>X!qrm&%
zEnd1r5trD;32K$v*|7Tw4^~r0vG$?6OK;egJzdk@Y;FI>#5A^<+-W@YGUQzSLzfEu
zyeex7C9~%j>4V3rilCztq~=*t$(pH|Eh4yF#<0!NTp7kH#wMEdNLwO{W+n(6a-8$M
zwU>O|R6O^Xy3&9W1bB{YG(w$^C$ga5yA;#j`bY{QJieazD7xn!4_WRb`;e~nl
zq@^R$4oZ3RGsWE|j@>R*C6ynjRv0yKEbzcxV$7yE2){-dRZ^^qGlnr1@2s6{QY{Cl
zEAp8AH=eN~M)o8&Y`BHmKj+LYLU(xBO_Lv=pOi}Op2+rHAXkEAogi+jisch(=K6!XayeW`^BMS1bGhpRQ^>!&V9F<3bw
z;+V+W)N}Y}uJ3
z80P*iHe<7Bbeq{{n%QjBvlV54=ns&Wl+O;eoysgByibM|2{x~7%kO&mcg0txp#x-J
zNB`~{o$OoJC2OxI4||@fD(;6DZF*~bDGETs(YKc^!C}YIeF_lC(Ml8=4tHSZQh
zUlkSX3mQCFEe+{X4UU**e*DPrFF%#yW&gbz7*!>CR+q8
z?3xYf0*~9XOY%9k@yIx!yfp~r9c*X-xdV1nr+y+=Y*&P#c7E;P-&*%5eRVT`buI0z
zQ*}9QxT!9$`JedH1D;{uVhZ{j8V8bpPU^5eU*2pfemP%UTOf;a_Klt`eub@gHnZxH
zM_Bm=@|q_dB6=xn!R5!brT_+bc2CB=c4AthQX1f^)KZbH;qeE00dS^iJ2JU_mP5qe
z@45BJysGX~wlOw;WA)dVvbrB%w(baF9X2Bt?Q9Ue#^uF`kNU#`{GNoR_A
zdP$>mPZwp+INLVIXp}6p3%E?yqK^x>zGX$XM-Q@jx~sApvJj{_<{kt>vjv(QBN3+(~la0MXx*
z-}`K5U_2^?(dOp#t#n=6(_B1%?Z}@4o9}btx2Z;bo2)9vFtB1Ysx-$0c_IuR=5M0*
z7eyfq^WG674Z>`WK3Hrj?@X?R_u!Z(O_&v3^|1TF0_;xx!qHod1I3lUAr5)FE@(Yk
zV{xsUk3T;U9dx+yd3OHwhK-pleAB9tv`asY3AL536d)8JT~IFGArv4KG{z&u1&9j}
z7j&1hP(?r$0aXN45tAEpkS;*F@ZabHJXd;dg1MN0N;vCOx)Bq52Y>aRRq-+ZSG27<
zb~{^b=05}V*Fn87-bcH!fc+<>Ol;`VfvyT=fk?Vi>pYUwk^BJGm-*Db@Z?B1bM+K&
z{CvaE?{TQO0-rvdQCR04*WM~ZF@H>PEJu1`%eWWJnWJu0a6!CbRbPDip0slAkJ?ZD
zfMuW=!sR4JICM;JZKG%imtB*awMc%!A^%IQ)%ZumM09s!m%n&w#yG6?xaxqWjM`_BT6*RcqVaxlWzRaS$`kIN`a71EV)KDRj!H1$_wt|m>SHpYo(A1@sx
zDxez~cme{aaZH+`y6Ng!dVOa^u8vCVTtZO77d65tpPL+aAQ@SP2?bX?t+y)!fO(?Q
z>}xC-zo%8IgmMr!A*DPg1nq^?jA5pwjs&IZs6{zV%(k|9pv?QPytIXvKFvvgGhqn$
zX#z1W{3fSX+gT8Ls2%$sKW!dRp@flM~3%c7)p^AVi
z0;&k8A|`J`hjanb1xOblUHHG$1=t-@
zsFkL&DfP7;%%rorWokF?_3!BBK_RI8F6DbvP$D1{l&{f2C_pG^lo;Xy#07{8y6+eN
f@f86yqF}HCWt?{TR#*%0YBkKu!`uA~m7Vx6f{qQv
literal 0
HcmV?d00001