diff --git a/src/immdraw.h b/src/immdraw.h index 51caf88..881a559 100644 --- a/src/immdraw.h +++ b/src/immdraw.h @@ -15,7 +15,7 @@ static inline void immdraw_fill_rect(int16_t x, int16_t y, int16_t w, int16_t h, static inline void immdraw_font_draw(struct k3Font *font, int16_t x, int16_t y, int16_t w, float sz, size_t len, const char *txt, int alignment, float r, float g, float b, float a) { struct k3RectF txtsz; - k3FontSz(font, sz, txt, &txtsz); + k3FontSz(font, sz, txt, w, &txtsz); if(alignment != k3M_ALIGN_LEFT) { if(alignment == k3M_ALIGN_CENTER) { @@ -25,11 +25,11 @@ static inline void immdraw_font_draw(struct k3Font *font, int16_t x, int16_t y, } } - k3FontDraw(font, x, GameWndH - y - sz, sz, txt, (vec4) {r, g, b, a}); + k3FontDraw(font, x, GameWndH - y - sz, sz, txt, w, (vec4) {r, g, b, a}); } -static inline void immdraw_font_size(struct k3Font *font, float sz, const char *txt, int16_t aabb[2]) { +static inline void immdraw_font_size(struct k3Font *font, float sz, const char *txt, int16_t wall, int16_t aabb[2]) { struct k3RectF txtsz; - k3FontSz(font, sz, txt, &txtsz); + k3FontSz(font, sz, txt, wall, &txtsz); aabb[0] = ceilf(txtsz.w); aabb[1] = ceilf(txtsz.h); diff --git a/src/k3font.c b/src/k3font.c index ae3edff..dc75d27 100644 --- a/src/k3font.c +++ b/src/k3font.c @@ -97,7 +97,13 @@ static uint32_t read_utf8(const char **txt_) { } } -void k3FontSz(struct k3Font *this, float sz, const char *txt, struct k3RectF *ret) { +void k3FontSz(struct k3Font *this, float sz, const char *txt, float wall, struct k3RectF *ret) { + if(wall < 0) { + wall = HUGE_VALF; + } + + float maxX = 0; + float x = 0, y = sz; while(1) { uint32_t cp = read_utf8(&txt); @@ -113,12 +119,23 @@ void k3FontSz(struct k3Font *this, float sz, const char *txt, struct k3RectF *re if(!g) continue; + if(x + g->width > wall) { + x = 0; + y += sz; + } + x += g->xadvance * this->lineScale * sz; + maxX = fmaxf(maxX, x); } - ret->w = x; + + ret->w = maxX; ret->h = y; } -void k3FontDraw(struct k3Font *this, float xStart, float yStart, float sz, const char *txt, vec4 color) { +void k3FontDraw(struct k3Font *this, float xStart, float yStart, float sz, const char *txt, float wall, vec4 color) { + if(wall < 0) { + wall = HUGE_VALF; + } + float x = xStart, y = yStart; while(1) { uint32_t cp = read_utf8(&txt); @@ -134,6 +151,11 @@ void k3FontDraw(struct k3Font *this, float xStart, float yStart, float sz, const if(!g) continue; + if(x + g->width - xStart > wall) { + x = xStart; + y -= sz; + } + struct k3Tex *tex = this->pages[g->page]; size_t texW = this->texW; size_t texH = this->texH; diff --git a/src/k3font.h b/src/k3font.h index b1dc163..b1246eb 100644 --- a/src/k3font.h +++ b/src/k3font.h @@ -38,8 +38,8 @@ typedef struct k3Tex*(*k3FontTexLoader)(struct k3Font*, const char *name); struct k3Font *k3FontCreate(); int k3FontLoad(struct k3Font*, const uint8_t *buf, size_t len, k3FontTexLoader); -void k3FontSz(struct k3Font*, float sz, const char *txt, struct k3RectF *ret); -void k3FontDraw(struct k3Font*, float x, float y, float sz, const char *txt, vec4 color); +void k3FontSz(struct k3Font*, float sz, const char *txt, float wall, struct k3RectF *ret); +void k3FontDraw(struct k3Font*, float x, float y, float sz, const char *txt, float wall, vec4 color); struct k3FontGlyph *k3FontGetGlyph(struct k3Font*, uint32_t cp); @@ -74,4 +74,4 @@ static inline const char *k3UTF8LastCodepointZ(const char *txt) { } } return NULL; -} \ No newline at end of file +} diff --git a/src/k3menu.c b/src/k3menu.c index aff35f1..db5ac15 100644 --- a/src/k3menu.c +++ b/src/k3menu.c @@ -87,8 +87,11 @@ static bool linear_arrange(struct k3MEvent *ev, uint8_t *ud) { c->x = o->x + padding[3]; c->y = y; - c->w = c->wDesired - padding[1] - padding[3]; - c->h = c->hDesired; + c->w = o->w - padding[1] - padding[3]; + + if(!k3MEventSend(&(struct k3MEvent) {.original = o, .target = c, .code = k3M_EVENT_SET_HEIGHT_FROM_WIDTH})) { + c->h = c->hDesired; + } y += c->h; } @@ -225,7 +228,16 @@ static bool label_draw(struct k3MEvent *ev, uint8_t *ud) { return false; } - +static bool label_set_height_from_width(struct k3MEvent *ev, uint8_t *ud) { + struct k3MLabel *this = (void*) ev->target; + + int16_t pxsz[2]; + immdraw_font_size(this->font, this->sz, this->txt, this->w, pxsz); + + this->h = pxsz[1]; + + return true; +} struct k3MLabel *k3MLabel(struct k3Font *font, float sz, const char *txt) { struct k3MLabel *ret = calloc(1, sizeof(*ret)); ret->font = font; @@ -233,11 +245,12 @@ struct k3MLabel *k3MLabel(struct k3Font *font, float sz, const char *txt) { ret->txt = strdup(txt); k3MRegisterEventHandler(ret, k3M_EVENT_DRAW, label_draw, NULL, 0); + k3MRegisterEventHandler(ret, k3M_EVENT_SET_HEIGHT_FROM_WIDTH, label_set_height_from_width, NULL, 0); - int16_t lblsz[2]; - immdraw_font_size(font, sz, txt, lblsz); - ret->w = lblsz[0]; - ret->h = lblsz[1]; + //int16_t lblsz[2]; + //immdraw_font_size(font, sz, txt, lblsz); + //ret->w = lblsz[0]; + //ret->h = lblsz[1]; return ret; } diff --git a/src/k3menu.h b/src/k3menu.h index 183a2cc..6f926e5 100644 --- a/src/k3menu.h +++ b/src/k3menu.h @@ -22,7 +22,8 @@ struct k3MObj; #define k3M_EVENT_MEASURE 11 #define k3M_EVENT_ARRANGE 12 #define k3M_EVENT_POST_ARRANGE 13 -#define k3M_EVENT_ALL 14 +#define k3M_EVENT_SET_HEIGHT_FROM_WIDTH 14 +#define k3M_EVENT_ALL 15 #define k3M_MOUSE_BUTTON_0 0 #define k3M_MOUSE_BUTTON_1 1