diff options
author | dec05eba <dec05eba@protonmail.com> | 2021-12-14 23:48:34 +0100 |
---|---|---|
committer | dec05eba <dec05eba@protonmail.com> | 2021-12-15 10:30:34 +0100 |
commit | 0417619b36dc7f4b004caa64a65570f1344d1c8d (patch) | |
tree | 10c4b9bbe5bd7c16322495890c3324cd76d584c8 /src/mgui/image.c | |
parent | 396686a09ef471499c11256b8516c2702f761060 (diff) |
Layout, expand, etc
Diffstat (limited to 'src/mgui/image.c')
-rw-r--r-- | src/mgui/image.c | 61 |
1 files changed, 53 insertions, 8 deletions
diff --git a/src/mgui/image.c b/src/mgui/image.c index c2ff12f..1a0871f 100644 --- a/src/mgui/image.c +++ b/src/mgui/image.c @@ -9,6 +9,46 @@ /* TODO: Load image asynchronously and support network files */ +static mgl_vec2i wrap_to_size_x(mgl_vec2i size, int clamp_size) { + mgl_vec2i new_size; + if(size.x == 0) { + new_size.x = 0; + new_size.y = 0; + return new_size; + } + float size_ratio = (float)size.y / (float)size.x; + new_size.x = clamp_size; + new_size.y = new_size.x * size_ratio; + return new_size; +} + +static mgl_vec2i wrap_to_size_y(mgl_vec2i size, int clamp_size) { + mgl_vec2i new_size; + if(size.y == 0) { + new_size.x = 0; + new_size.y = 0; + return new_size; + } + float size_ratio = (float)size.x / (float)size.y; + new_size.y = clamp_size; + new_size.x = new_size.y * size_ratio; + return new_size; +} + +static mgl_vec2i wrap_to_size(const mgl_vec2i size, const mgl_vec2i clamp_size) { + mgl_vec2i new_size = wrap_to_size_x(size, clamp_size.x); + if(new_size.y > clamp_size.y) + new_size = wrap_to_size_y(size, clamp_size.y); + return new_size; +} + +static mgl_vec2i clamp_to_size(mgl_vec2i size, mgl_vec2i clamp_size) { + mgl_vec2i new_size = size; + if(size.x > clamp_size.x || size.y > clamp_size.y) + new_size = wrap_to_size(new_size, clamp_size); + return new_size; +} + mgui_image* mgui_image_create(const char *filepath) { mgui_image *image = mgui_alloc(sizeof(mgui_image)); mgui_widget_init(&image->widget, MGUI_WIDGET_IMAGE); @@ -35,10 +75,18 @@ void mgui_image_set_position(mgui_image *self, mgl_vec2i position) { mgl_sprite_set_position(&self->sprite, (mgl_vec2f){ position.x, position.y }); } -void mgui_image_set_width(mgui_image *self, int width) { - /* TODO: Implement */ - (void)self; - (void)width; +void mgui_image_calculate_size(mgui_image *self, mgl_vec2i max_size) { + if(self->sprite.texture) { + const mgl_vec2i texture_size = (mgl_vec2i){ self->sprite.texture->width, self->sprite.texture->height }; + const mgl_vec2i new_size = clamp_to_size(texture_size, max_size); + + self->sprite.scale.x = (float)new_size.x / (float)texture_size.x; + self->sprite.scale.y = (float)new_size.y / (float)texture_size.y; + + self->widget.size = new_size; + } else { + self->widget.size = (mgl_vec2i){ 0, 0 }; + } } void mgui_image_on_event(mgui_image *self, mgl_window *window, mgl_event *event) { @@ -48,13 +96,10 @@ void mgui_image_on_event(mgui_image *self, mgl_window *window, mgl_event *event) /* TODO: Implement */ } -mgl_vec2i mgui_image_draw(mgui_image *self, mgl_window *window) { +void mgui_image_draw(mgui_image *self, mgl_window *window) { if(self->sprite.texture) { const mgl_vec2i texture_size = (mgl_vec2i){ self->sprite.texture->width, self->sprite.texture->height }; if(mgui_rectangle_intersects_with_scissor((mgl_vec2i){ self->sprite.position.x, self->sprite.position.y }, texture_size, window)) mgl_sprite_draw(mgl_get_context(), &self->sprite); - return texture_size; - } else { - return (mgl_vec2i){ 0, 0 }; } } |