diff --git a/clay.h b/clay.h index 938683a..8971abe 100644 --- a/clay.h +++ b/clay.h @@ -566,6 +566,8 @@ typedef struct Clay_TextRenderData { uint16_t letterSpacing; // The height of the bounding box for this line of text. uint16_t lineHeight; + // Specifies the alignment of the text within its container. + Clay_TextAlignment textAlignment; } Clay_TextRenderData; // Render command data when commandType == CLAY_RENDER_COMMAND_TYPE_RECTANGLE @@ -2898,6 +2900,7 @@ void Clay__CalculateFinalLayout(void) { .fontSize = textElementConfig->fontSize, .letterSpacing = textElementConfig->letterSpacing, .lineHeight = textElementConfig->lineHeight, + .textAlignment = textElementConfig->textAlignment, }}, .userData = textElementConfig->userData, .id = Clay__HashNumber(lineIndex, currentElement->id).id, diff --git a/renderers/sokol/sokol_clay.h b/renderers/sokol/sokol_clay.h index 0436a50..9948502 100644 --- a/renderers/sokol/sokol_clay.h +++ b/renderers/sokol/sokol_clay.h @@ -227,13 +227,26 @@ Clay_Dimensions sclay_measure_text(Clay_StringSlice text, Clay_TextElementConfig sclay_font_t *fonts = (sclay_font_t *)userData; if(!fonts) return (Clay_Dimensions){ 0 }; fonsSetFont(_sclay.fonts, fonts[config->fontId]); - fonsSetSize(_sclay.fonts, config->fontSize); - fonsSetSpacing(_sclay.fonts, config->letterSpacing); + fonsSetSize(_sclay.fonts, config->fontSize * _sclay.dpi_scale); + fonsSetSpacing(_sclay.fonts, config->letterSpacing * _sclay.dpi_scale); + switch (config->textAlignment) { + case CLAY_TEXT_ALIGN_LEFT: + fonsSetAlign(_sclay.fonts, FONS_ALIGN_LEFT | FONS_ALIGN_TOP); + break; + case CLAY_TEXT_ALIGN_CENTER: + fonsSetAlign(_sclay.fonts, FONS_ALIGN_CENTER | FONS_ALIGN_TOP); + break; + case CLAY_TEXT_ALIGN_RIGHT: + fonsSetAlign(_sclay.fonts, FONS_ALIGN_RIGHT | FONS_ALIGN_TOP); + break; + default: + fonsSetAlign(_sclay.fonts, FONS_ALIGN_LEFT | FONS_ALIGN_TOP); + } float ascent, descent, lineh; fonsVertMetrics(_sclay.fonts, &ascent, &descent, &lineh); return (Clay_Dimensions) { - .width = fonsTextBounds(_sclay.fonts, 0, 0, text.chars, text.chars + text.length, NULL), - .height = ascent - descent + .width = fonsTextBounds(_sclay.fonts, 0, 0, text.chars, text.chars + text.length, NULL) / _sclay.dpi_scale, + .height = (ascent - descent) / _sclay.dpi_scale }; } @@ -366,6 +379,19 @@ void sclay_render(Clay_RenderCommandArray renderCommands, sclay_font_t *fonts) { config->textColor.a); fonsSetColor(_sclay.fonts, color); fonsSetSpacing(_sclay.fonts, config->letterSpacing * _sclay.dpi_scale); + switch (config->textAlignment) { + case CLAY_TEXT_ALIGN_LEFT: + fonsSetAlign(_sclay.fonts, FONS_ALIGN_LEFT | FONS_ALIGN_TOP); + break; + case CLAY_TEXT_ALIGN_CENTER: + fonsSetAlign(_sclay.fonts, FONS_ALIGN_CENTER | FONS_ALIGN_TOP); + break; + case CLAY_TEXT_ALIGN_RIGHT: + fonsSetAlign(_sclay.fonts, FONS_ALIGN_RIGHT | FONS_ALIGN_TOP); + break; + default: + fonsSetAlign(_sclay.fonts, FONS_ALIGN_LEFT | FONS_ALIGN_TOP); + } fonsSetAlign(_sclay.fonts, FONS_ALIGN_LEFT | FONS_ALIGN_TOP); fonsSetSize(_sclay.fonts, config->fontSize * _sclay.dpi_scale); sgl_matrix_mode_modelview();