diff --git a/src/font.c b/src/font.c index dfeca6d..6cb1d4b 100644 --- a/src/font.c +++ b/src/font.c @@ -61,6 +61,7 @@ typedef struct _HeliLineDesc { double x, y; double l, t, r, b; double height; + double width; } HeliLineDesc; struct _TextLayout { @@ -69,6 +70,7 @@ struct _TextLayout { HeliLineDesc *lines; HeliCharDesc *chars; double l, t, r, b; + double ll, lt, lr, lb; }; struct _Font { @@ -412,6 +414,8 @@ TextLayout createTextLayout(const char *text) { FT_KERNING_UNFITTED, &kerning )) cc->pos += kerning.x/64.0; + if (line->width < cc->pos + cc->glyph->advance) + line->width = cc->pos + cc->glyph->advance; } expand(&line->l, &line->r, cc->pos + cc->glyph->l); expand(&line->l, &line->r, cc->pos + cc->glyph->r); @@ -443,27 +447,36 @@ TextLayout createTextLayout(const char *text) { double t = -layout->lines->height; double r = 0; double b = 0; + double ll = 0; + double lt = -layout->lines->height; + double lr = 0; + double lb = 0; for(int i = 0; i < layout->linesCount; ++i) { HeliLineDesc *line = layout->lines + i; if (i > 0) line->y = (line-1)->y + line->height; + if (l > line->l) l = line->l; if (r < line->r) r = line->r; if (t > line->t + line->y) t = line->t + line->y; if (b < line->b + line->y) b = line->b + line->y; + + if (lr < line->width) lr = line->width; + if (lt > line->y - line->height) lt = line->y - line->height; + if (lb < line->y) lb = line->y; } // alignment - double dx = drawingState->horAlign == HALIGN_RIGHT ? -r - : drawingState->horAlign == HALIGN_CENTER ? -0.5*(l + r) - : -l; - double dy = drawingState->vertAlign == VALIGN_BOTTOM ? -b - : drawingState->vertAlign == VALIGN_CENTER ? -0.5*(t + b) - : -t; + double dx = drawingState->horAlign == HALIGN_RIGHT ? -lr + : drawingState->horAlign == HALIGN_CENTER ? -0.5*(ll + lr) + : -ll; + double dy = drawingState->vertAlign == VALIGN_BOTTOM ? -lb + : drawingState->vertAlign == VALIGN_CENTER ? -0.5*(lt + lb) + : -lt; for(int i = 0; i < layout->linesCount; ++i) { HeliLineDesc *line = layout->lines + i; - line->x = drawingState->horAlign == HALIGN_RIGHT ? -line->r - : drawingState->horAlign == HALIGN_CENTER ? -0.5*(line->l + line->r) - : -line->l; + line->x = drawingState->horAlign == HALIGN_RIGHT ? -line->width + : drawingState->horAlign == HALIGN_CENTER ? -0.5*line->width + : 0; line->y += dy; for(int j = line->begin; j < line->end; ++j) { HeliCharDesc *cc = layout->chars + j; @@ -478,6 +491,11 @@ TextLayout createTextLayout(const char *text) { layout->r = r + dx; layout->b = b + dy; + layout->ll = ll + dx; + layout->lt = lt + dy; + layout->lr = lr + dx; + layout->lb = lb + dy; + // sort by textures for(int i = 0; i < charsCount-1; ++i) layout->chars[i].next = &layout->chars[i+1];