diff --git a/libui/framebuffer.c b/libui/framebuffer.c index 68328d08..c0a80795 100644 --- a/libui/framebuffer.c +++ b/libui/framebuffer.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, 2016 Jonas 'Sortie' Termansen. + * Copyright (c) 2014, 2015 Jonas 'Sortie' Termansen. * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -14,14 +14,17 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * framebuffer.c - * Framebuffer functions. + * Framebuffer utilities. */ +#include #include #include +#include #include "framebuffer.h" #include "pixel.h" +#include "vgafont.h" struct framebuffer framebuffer_crop(struct framebuffer fb, size_t left, @@ -69,3 +72,102 @@ void framebuffer_copy_to_framebuffer_blend(const struct framebuffer dst, } } } + +struct framebuffer framebuffer_crop_int(struct framebuffer fb, + int left, + int top, + int width, + int height) +{ + if ( left < 0 ) { width -= -left; left = 0; } + if ( top < 0 ) { top -= -height; top -= 0; } + if ( width < 0 ) { width = 0; } + if ( height < 0 ) { height = 0; } + return framebuffer_crop(fb, left, top, width, height); +} + +struct framebuffer framebuffer_cut_left_x(struct framebuffer fb, int offset) +{ + fb = framebuffer_crop_int(fb, offset, 0, fb.xres - offset, fb.yres); + return fb; +} + +struct framebuffer framebuffer_cut_right_x(struct framebuffer fb, int offset) +{ + fb = framebuffer_crop_int(fb, 0, 0, fb.xres - offset, fb.yres); + return fb; +} + +struct framebuffer framebuffer_cut_top_y(struct framebuffer fb, int offset) +{ + fb = framebuffer_crop_int(fb, 0, offset, fb.xres, fb.yres - offset); + return fb; +} + +struct framebuffer framebuffer_cut_bottom_y(struct framebuffer fb, int offset) +{ + fb = framebuffer_crop_int(fb, 0, 0, fb.xres, fb.yres - offset); + return fb; +} + +struct framebuffer framebuffer_center_x(struct framebuffer fb, int x, int width) +{ + x = x - width / 2; + if ( x < 0 ) { width -= -x; x = 0; } + if ( width < 0 ) { width = 0; } + fb = framebuffer_crop(fb, x, 0, width, fb.yres); + return fb; +} + +struct framebuffer framebuffer_center_y(struct framebuffer fb, int y, int height) +{ + y = y - height / 2; + if ( y < 0 ) { height -= -y; y = 0; } + if ( height < 0 ) { height = 0; } + fb = framebuffer_crop(fb, 0, y, fb.xres, height); + return fb; +} + +struct framebuffer framebuffer_right_x(struct framebuffer fb, int x, int width) +{ + x = x - width; + if ( x < 0 ) { width -= -x; x = 0; } + if ( width < 0 ) { width = 0; } + fb = framebuffer_crop(fb, x, 0, width, fb.yres); + return fb; +} + +struct framebuffer framebuffer_bottom_y(struct framebuffer fb, int y, int height) +{ + y = y - height; + if ( y < 0 ) { height -= -y; y = 0; } + if ( height < 0 ) { height = 0; } + fb = framebuffer_crop(fb, 0, y, fb.xres, height); + return fb; +} + +struct framebuffer framebuffer_center_text_x(struct framebuffer fb, int x, const char* str) +{ + int width = (FONT_WIDTH + 1) * strlen(str); + return framebuffer_center_x(fb, x, width); +} + +struct framebuffer framebuffer_center_text_y(struct framebuffer fb, int y, const char* str) +{ + (void) str; + int height = FONT_HEIGHT; + return framebuffer_center_y(fb, y, height); +} + +struct framebuffer framebuffer_right_text_x(struct framebuffer fb, int x, const char* str) +{ + int width = (FONT_WIDTH + 1) * strlen(str); + return framebuffer_right_x(fb, x, width); +} + +struct framebuffer framebuffer_bottom_text_y(struct framebuffer fb, int y, const char* str) +{ + (void) str; + int height = FONT_HEIGHT; + return framebuffer_bottom_y(fb, y, height); +} diff --git a/libui/include/framebuffer.h b/libui/include/framebuffer.h index bd81a331..c309a2a9 100644 --- a/libui/include/framebuffer.h +++ b/libui/include/framebuffer.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, 2016 Jonas 'Sortie' Termansen. + * Copyright (c) 2014, 2015 Jonas 'Sortie' Termansen. * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -14,7 +14,7 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * framebuffer.h - * Framebuffer functions. + * Framebuffer utilities. */ #ifndef FRAMEBUFFER_H @@ -59,5 +59,22 @@ void framebuffer_copy_to_framebuffer(const struct framebuffer dst, const struct framebuffer src); void framebuffer_copy_to_framebuffer_blend(const struct framebuffer dst, const struct framebuffer src); +struct framebuffer framebuffer_crop_int(struct framebuffer fb, + int left, + int top, + int width, + int height); +struct framebuffer framebuffer_cut_left_x(struct framebuffer fb, int offset); +struct framebuffer framebuffer_cut_right_x(struct framebuffer fb, int offset); +struct framebuffer framebuffer_cut_top_y(struct framebuffer fb, int offset); +struct framebuffer framebuffer_cut_bottom_y(struct framebuffer fb, int offset); +struct framebuffer framebuffer_center_x(struct framebuffer fb, int x, int width); +struct framebuffer framebuffer_center_y(struct framebuffer fb, int y, int height); +struct framebuffer framebuffer_right_x(struct framebuffer fb, int x, int width); +struct framebuffer framebuffer_bottom_y(struct framebuffer fb, int y, int height); +struct framebuffer framebuffer_center_text_x(struct framebuffer fb, int x, const char* str); +struct framebuffer framebuffer_center_text_y(struct framebuffer fb, int y, const char* str); +struct framebuffer framebuffer_right_text_x(struct framebuffer fb, int x, const char* str); +struct framebuffer framebuffer_bottom_text_y(struct framebuffer fb, int y, const char* str); #endif