summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordario-loi <loi.1940849@studenti.uniroma1.it>2024-11-24 17:33:45 +0100
committerdario-loi <loi.1940849@studenti.uniroma1.it>2024-11-24 18:37:25 +0100
commit8a347f9515a0021361549016e86fcca159c948f5 (patch)
tree620d4f42e138a1633d36f306859dc158bf11e8fd
parentb5edf73ceff686b4220cc822fe054b7d8f7de81b (diff)
Working CMakeLists.txt and many bugfixes
Provided a working CMakeLists.txt file to build all of the examples, also fixed a bunch of bugs (some fixes also depend on personal preference and should be reviewed by maintainers): 1. Switched fbgl_t types from size_t to uint32_t as there is no way a screen resolution will be more than 2^32, this way we save 4 bytes and we have faster comparisons 2. Used int32_t instead of int for better clarity 3. fbgl_point now uses int32_t instead of uint32_t, no more sign comparison warnings (for loops that worked with fbgl_point were already working with int32_t in practice) 4. line.c now uses usleep(1000) to wait inbetween individual line draws instead of an empty for loop, as that was optimized away in release builds and led to all the animation being played instantly 5. removed the void fbgl_set_bg() forward declaration as it was incorrect w.r.t the actual function definition 6. fbgl_draw_texture specifies a const pointer to the texture resource, possibly allowing for compiler optimizations 7. fbgl_set_bg and fbgl_put_pixel now use #ifdef DEBUG to compile away checks in release builds, for faster performance 8. various const-correctness improvements 9. all required UNIX headers have been imported so that fbgl_check_esc_key does not give any more warnings All examples have been tested (on my local machine, so take this with a grain of salt)
-rw-r--r--.gitignore2
-rw-r--r--CMakeLists.txt31
-rw-r--r--example/.gitignore2
-rw-r--r--example/CMakeLists.txt24
-rw-r--r--example/empty_example.c53
-rw-r--r--example/raw_mode.c21
-rw-r--r--example/rectangle.c59
-rw-r--r--example/red.c13
-rw-r--r--examples/.gitignore1
-rw-r--r--examples/empty_example.c53
-rw-r--r--examples/framebuf_info.c17
-rw-r--r--examples/line.c (renamed from example/line.c)10
-rw-r--r--examples/raw_mode.c20
-rw-r--r--examples/rectangle.c61
-rw-r--r--examples/red.c14
-rw-r--r--examples/texture.c (renamed from example/texture.c)0
-rw-r--r--fbgl.h84
17 files changed, 256 insertions, 209 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..1899660
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+build
+.vscode \ No newline at end of file
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..03453ef
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,31 @@
+cmake_minimum_required(VERSION 3.11)
+
+project(fbglExamples C)
+
+add_custom_target(run-examples)
+
+set(FBGL_HEADER "fbgl.h")
+set(EXAMPLES_DIR "${CMAKE_CURRENT_SOURCE_DIR}/examples")
+
+# find freetype2
+find_package(PkgConfig REQUIRED)
+pkg_check_modules(FREETYPE2 REQUIRED freetype2)
+include_directories(${FREETYPE2_INCLUDE_DIRS})
+
+function(add_example NAME)
+ add_executable("${NAME}" "${EXAMPLES_DIR}/${NAME}.c" "${FBGL_HEADER}")
+ target_compile_features("${NAME}" PRIVATE c_std_99)
+ target_include_directories("${NAME}" PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}")
+ target_link_libraries("${NAME}" PRIVATE ${FREETYPE2_LIBRARIES})
+ add_custom_target("run_${NAME}" COMMAND "${NAME}" VERBATIM)
+ add_dependencies("run_${NAME}" "${NAME}")
+ add_dependencies(run-examples "run_${NAME}")
+endfunction()
+
+add_example(empty_example)
+add_example(line)
+add_example(rectangle)
+add_example(red)
+add_example(texture)
+add_example(raw_mode)
+add_example(framebuf_info) \ No newline at end of file
diff --git a/example/.gitignore b/example/.gitignore
deleted file mode 100644
index 07ac165..0000000
--- a/example/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-build/
-core.*
diff --git a/example/CMakeLists.txt b/example/CMakeLists.txt
deleted file mode 100644
index 411945a..0000000
--- a/example/CMakeLists.txt
+++ /dev/null
@@ -1,24 +0,0 @@
-cmake_minimum_required(VERSION 3.21)
-
-project(fbglExamples C)
-
-include(../cmake/folders.cmake)
-
-if(PROJECT_IS_TOP_LEVEL)
- find_package(fbgl REQUIRED)
-endif()
-
-add_custom_target(run-examples)
-
-function(add_example NAME)
- add_executable("${NAME}" "${NAME}.c")
- target_link_libraries("${NAME}" PRIVATE fbgl::fbgl)
- target_compile_features("${NAME}" PRIVATE c_std_99)
- add_custom_target("run_${NAME}" COMMAND "${NAME}" VERBATIM)
- add_dependencies("run_${NAME}" "${NAME}")
- add_dependencies(run-examples "run_${NAME}")
-endfunction()
-
-add_example(empty_example)
-
-add_folders(Example)
diff --git a/example/empty_example.c b/example/empty_example.c
deleted file mode 100644
index aee9232..0000000
--- a/example/empty_example.c
+++ /dev/null
@@ -1,53 +0,0 @@
-#define FBGL_IMPLEMENTATION
-//#define FBGL_HIDE_CURSOR
-#define FBGL_USE_FREETYPE
-#include "../fbgl.h"
-
-#include <stdio.h>
-#include <stddef.h>
-
-int main()
-{
- printf("version %s\n", fbgl_version_info());
- printf("name %s\n", fbgl_name_info());
-
- fbgl_t buffer;
- if (fbgl_init("/dev/fb0", &buffer) == -1) {
- fprintf(stdout, "Error: could not open framebuffer device\n");
- return -1;
- }
- int color = 0x00000000;
-
-
- FT_Library library = fbgl_freetype_init();
- if (!library) {
- fbgl_destroy(&buffer);
- return -1;
- }
-
- FT_Face face = fbgl_load_font(library, "../asset/font_2.ttf", 24); // Adjust path and size
- if (!face) {
- fbgl_freetype_cleanup(library);
- fbgl_destroy(&buffer);
- return -1;
- }
-
- // Render text to framebuffer
- fbgl_render_freetype_text(&buffer, library, face, "Hello, World!", 50, 50);
-
- // Main loop checking for ESC key
- int l = 0;
- while (1) {
-
- if (fbgl_check_esc_key()) {
- fprintf(stdout, "ESC pressed\n");
- break;
- }
- //fbgl_set_bg(&buffer, i++); // Set background color to
- for(int i = 0x000000; i <= 0xFFFFFF; i++) {
- fbgl_set_bg(&buffer, i);
- }
- }
- fbgl_destroy(&buffer);
- return 0;
-}
diff --git a/example/raw_mode.c b/example/raw_mode.c
deleted file mode 100644
index 12127af..0000000
--- a/example/raw_mode.c
+++ /dev/null
@@ -1,21 +0,0 @@
-#define FBGL_IMPLEMENTATION
-#include "../fbgl.h"
-#include <stdio.h>
-
-int main(int argc, char *argv[])
-{
- fbgl_t fb;
- fbgl_init("/dev/fb0", &fb);
-
- fbgl_set_bg(&fb, 0xFFFFFF);
-
- while(1) {
- if(fbgl_check_esc_key()) {
- printf("pressed");
- fbgl_set_bg(&fb, 0x000000);
- }
- }
-
- return 0;
-}
-
diff --git a/example/rectangle.c b/example/rectangle.c
deleted file mode 100644
index 73f9c4b..0000000
--- a/example/rectangle.c
+++ /dev/null
@@ -1,59 +0,0 @@
-#define FBGL_IMPLEMENTATION
-#include "../fbgl.h"
-
-int main(int argc, char *argv[])
-{
- fbgl_t buffer;
- if (fbgl_init("/dev/fb0", &buffer) == -1) {
- fprintf(stdout, "Error: could not open framebuffer device\n");
- return -1;
- }
-
- fbgl_set_bg(&buffer, 0xFFFFFF); // Set the background to white
-
- fbgl_point_t start = {100, 100};
- fbgl_point_t end = {200, 200};
- fbgl_draw_rectangle_outline(start, end, 0xFF0000, &buffer); // Draw red rectangle outline
-
- fbgl_point_t start2 = {600, 400};
- fbgl_point_t end2 = {800, 800};
- uint32_t colors[] = {0xFFC00, 0x00FF00, 0x0000FF, 0xFF00FF}; // Yellow, Green, Blue, Magenta
- size_t color_index = 0;
-
- // Initial position of the marquee rectangle
- int dx = 15; // Horizontal speed
- int dy = 8; // Vertical speed
-
- while (1) {
- // Clear the framebuffer (set background)
- fbgl_set_bg(&buffer, 0xFFFFFF);
-
-
- // Draw the moving filled rectangle
- fbgl_draw_rectangle_filled(start2, end2, colors[color_index], &buffer);
-
- // Move the filled rectangle by updating its position
- start2.x += dx;
- end2.x += dx;
- start2.y += dy;
- end2.y += dy;
-
- // Reverse direction if the rectangle hits the screen boundary
- if (start2.x <= 0 || end2.x >= buffer.width) {
- dx = -dx;
- color_index++;
- }
- if (start2.y <= 0 || end2.y >= buffer.height) {
- dy = -dy;
- color_index++;
- }
- if (color_index >= 4) {
- color_index = 0;
- }
-
- usleep(50000); // Delay to make the animation visible (adjust as needed)
- }
-
- fbgl_destroy(&buffer);
- return 0;
-}
diff --git a/example/red.c b/example/red.c
deleted file mode 100644
index 274bc31..0000000
--- a/example/red.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#define FBGL_IMPLEMENTATION
-#include "../fbgl.h"
-#include <stdio.h>
-
-int main(int argc, char *argv[])
-{
- fbgl_t fb;
- fbgl_init("/dev/fb0", &fb);
- fbgl_set_bg(&fb, 0xFF0000);
- while(1){}
-
- return 0;
-}
diff --git a/examples/.gitignore b/examples/.gitignore
new file mode 100644
index 0000000..4b44f82
--- /dev/null
+++ b/examples/.gitignore
@@ -0,0 +1 @@
+build / core.*
diff --git a/examples/empty_example.c b/examples/empty_example.c
new file mode 100644
index 0000000..cbb69c4
--- /dev/null
+++ b/examples/empty_example.c
@@ -0,0 +1,53 @@
+#define FBGL_IMPLEMENTATION
+//#define FBGL_HIDE_CURSOR
+#define FBGL_USE_FREETYPE
+#include "../fbgl.h"
+
+#include <stdio.h>
+#include <stddef.h>
+
+int main()
+{
+ printf("version %s\n", fbgl_version_info());
+ printf("name %s\n", fbgl_name_info());
+
+ fbgl_t buffer;
+ if (fbgl_init("/dev/fb0", &buffer) == -1) {
+ fprintf(stdout, "Error: could not open framebuffer device\n");
+ return -1;
+ }
+ int color = 0x00000000;
+
+ FT_Library library = fbgl_freetype_init();
+ if (!library) {
+ fbgl_destroy(&buffer);
+ return -1;
+ }
+
+ FT_Face face = fbgl_load_font(library, "../asset/font_2.ttf",
+ 24); // Adjust path and size
+ if (!face) {
+ fbgl_freetype_cleanup(library);
+ fbgl_destroy(&buffer);
+ return -1;
+ }
+
+ // Render text to framebuffer
+ fbgl_render_freetype_text(&buffer, library, face, "Hello, World!", 50,
+ 50);
+
+ // Main loop checking for ESC key
+ int l = 0;
+ while (1) {
+ if (fbgl_check_esc_key()) {
+ fprintf(stdout, "ESC pressed\n");
+ break;
+ }
+ //fbgl_set_bg(&buffer, i++); // Set background color to
+ for (int i = 0x000000; i <= 0xFFFFFF; i++) {
+ fbgl_set_bg(&buffer, i);
+ }
+ }
+ fbgl_destroy(&buffer);
+ return 0;
+}
diff --git a/examples/framebuf_info.c b/examples/framebuf_info.c
new file mode 100644
index 0000000..9d149fd
--- /dev/null
+++ b/examples/framebuf_info.c
@@ -0,0 +1,17 @@
+#define FBGL_IMPLEMENTATION
+#include "fbgl.h"
+
+int main(int argc, char *argv[])
+{
+ fbgl_t buffer;
+ if (fbgl_init("/dev/fb0", &buffer) == -1) {
+ fprintf(stdout, "Error: could not open framebuffer device\n");
+ return -1;
+ }
+
+ fprintf(stdout, "Framebuffer width: %d\n", fb_get_width(&buffer));
+ fprintf(stdout, "Framebuffer height: %d\n", fb_get_height(&buffer));
+ fprintf(stdout, "Framebuffer screen size: %d\n", buffer.screen_size);
+
+ return 0;
+}
diff --git a/example/line.c b/examples/line.c
index 9d937cd..e22a113 100644
--- a/example/line.c
+++ b/examples/line.c
@@ -1,5 +1,5 @@
#define FBGL_IMPLEMENTATION
-#include "../fbgl.h"
+#include "fbgl.h"
int main(int argc, char *argv[])
{
@@ -9,13 +9,13 @@ int main(int argc, char *argv[])
return -1;
}
- fbgl_set_bg(&buffer, 0xFF0000);
+ fbgl_set_bg(&buffer, 0x00FF0000);
fbgl_point_t start = { 0, 0 };
- fbgl_point_t end = { 1020, 1020};
- for(int i = 0; i < 1890; i++) {
+ fbgl_point_t end = { 1020, 1020 };
+ for (int i = 0; i < 1890; i++) {
start.x = i;
fbgl_draw_line(start, end, 0xFFFFFF, &buffer);
- for(int j = 0; j < 10000000; j++){}
+ usleep(1000); // sleep for 1 millisecond
}
fbgl_draw_line(start, end, 0x000000, &buffer);
diff --git a/examples/raw_mode.c b/examples/raw_mode.c
new file mode 100644
index 0000000..449a824
--- /dev/null
+++ b/examples/raw_mode.c
@@ -0,0 +1,20 @@
+#define FBGL_IMPLEMENTATION
+#include "../fbgl.h"
+#include <stdio.h>
+
+int main(int argc, char *argv[])
+{
+ fbgl_t fb;
+ fbgl_init("/dev/fb0", &fb);
+
+ fbgl_set_bg(&fb, 0xFFFFFF);
+
+ while (1) {
+ if (fbgl_check_esc_key()) {
+ printf("pressed");
+ fbgl_set_bg(&fb, 0x000000);
+ }
+ }
+
+ return 0;
+}
diff --git a/examples/rectangle.c b/examples/rectangle.c
new file mode 100644
index 0000000..ecc1afd
--- /dev/null
+++ b/examples/rectangle.c
@@ -0,0 +1,61 @@
+#define FBGL_IMPLEMENTATION
+#include "../fbgl.h"
+
+int main(int argc, char *argv[])
+{
+ fbgl_t buffer;
+ if (fbgl_init("/dev/fb0", &buffer) == -1) {
+ fprintf(stdout, "Error: could not open framebuffer device\n");
+ return -1;
+ }
+
+ fbgl_set_bg(&buffer, 0xFFFFFF); // Set the background to white
+
+ fbgl_point_t start = { 100, 100 };
+ fbgl_point_t end = { 200, 200 };
+ fbgl_draw_rectangle_outline(start, end, 0xFF0000,
+ &buffer); // Draw red rectangle outline
+
+ fbgl_point_t start2 = { 600, 400 };
+ fbgl_point_t end2 = { 800, 800 };
+ uint32_t colors[] = { 0xFFC00, 0x00FF00, 0x0000FF,
+ 0xFF00FF }; // Yellow, Green, Blue, Magenta
+ size_t color_index = 0;
+
+ // Initial position of the marquee rectangle
+ int dx = 15; // Horizontal speed
+ int dy = 8; // Vertical speed
+
+ while (1) {
+ // Clear the framebuffer (set background)
+ fbgl_set_bg(&buffer, 0xFFFFFF);
+
+ // Draw the moving filled rectangle
+ fbgl_draw_rectangle_filled(start2, end2, colors[color_index],
+ &buffer);
+
+ // Move the filled rectangle by updating its position
+ start2.x += dx;
+ end2.x += dx;
+ start2.y += dy;
+ end2.y += dy;
+
+ // Reverse direction if the rectangle hits the screen boundary
+ if (start2.x <= 0 || end2.x >= buffer.width) {
+ dx = -dx;
+ color_index++;
+ }
+ if (start2.y <= 0 || end2.y >= buffer.height) {
+ dy = -dy;
+ color_index++;
+ }
+ if (color_index >= 4) {
+ color_index = 0;
+ }
+
+ usleep(50000); // Delay to make the animation visible (adjust as needed)
+ }
+
+ fbgl_destroy(&buffer);
+ return 0;
+}
diff --git a/examples/red.c b/examples/red.c
new file mode 100644
index 0000000..3809813
--- /dev/null
+++ b/examples/red.c
@@ -0,0 +1,14 @@
+#define FBGL_IMPLEMENTATION
+#include "../fbgl.h"
+#include <stdio.h>
+
+int main(int argc, char *argv[])
+{
+ fbgl_t fb;
+ fbgl_init("/dev/fb0", &fb);
+ fbgl_set_bg(&fb, 0x00FF0000);
+ while (1) {
+ }
+
+ return 0;
+}
diff --git a/example/texture.c b/examples/texture.c
index da614d4..da614d4 100644
--- a/example/texture.c
+++ b/examples/texture.c
diff --git a/fbgl.h b/fbgl.h
index 455c3e9..7c75156 100644
--- a/fbgl.h
+++ b/fbgl.h
@@ -52,20 +52,20 @@
* Structs
*/
typedef struct fbgl {
- int width;
- int height;
- int fd;
- size_t screen_size;
+ int32_t width;
+ int32_t height;
+ int32_t fd;
+ uint32_t screen_size;
uint32_t* pixels;
struct fb_var_screeninfo vinfo; // Variable screen information
struct fb_fix_screeninfo finfo; // Fixed screen information
} fbgl_t;
typedef struct fbgl_window {
- int x; // Top-left x-coordinate of the window
- int y; // Top-left y-coordinate of the window
- int width; // Width of the window
- int height; // Height of the window
+ int32_t x; // Top-left x-coordinate of the window
+ int32_t y; // Top-left y-coordinate of the window
+ uint32_t width; // Width of the window
+ uint32_t height; // Height of the window
fbgl_t* fb; // Pointer to the framebuffer context
} fbgl_window_t;
@@ -82,8 +82,8 @@ typedef struct fbgl_psf2_header {
} fbgl_psf2_header_t;
typedef struct fbgl_point {
- size_t x;
- size_t y;
+ int32_t x;
+ int32_t y;
} fbgl_point_t;
typedef struct fbgl_tga_texture {
@@ -160,7 +160,6 @@ void fbgl_destroy(fbgl_t* fb);
void fbgl_clear(uint32_t color);
void fbgl_put_pixel(int x, int y, uint32_t color, fbgl_t* fb);
void fbgl_draw_line(fbgl_point_t x, fbgl_point_t y, uint32_t color, fbgl_t* fb);
-void fbgl_set_bg();
/**
* Display methods
@@ -170,9 +169,9 @@ void fbgl_display();
/**
* Access framebuffer data methods
*/
-uint32_t* fb_get_data(void);
-int fb_get_width(void);
-int fb_get_height(void);
+uint32_t* fb_get_data(fbgl_t const* fb);
+uint32_t fb_get_width(fbgl_t const* fb);
+uint32_t fb_get_height(fbgl_t const* fb);
/**
* Shapes
@@ -189,7 +188,7 @@ void fbgl_draw_rectangle_filled(fbgl_point_t top_left,
*/
fbgl_tga_texture_t* fbgl_load_tga_texture(const char* path);
void fbgl_destroy_texture(fbgl_tga_texture_t* texture);
-void fbgl_draw_texture(fbgl_t* fb, fbgl_tga_texture_t* texture, int x, int y);
+void fbgl_draw_texture(fbgl_t* fb, fbgl_tga_texture_t const* texture, int32_t x, int32_t y);
/**
* Keyboard
@@ -282,19 +281,22 @@ void fbgl_destroy(fbgl_t* fb)
void fbgl_set_bg(fbgl_t* fb, uint32_t color)
{
+#ifdef DEBUG
if (!fb || fb->fd == -1) {
fprintf(stderr, "Error: framebuffer not initialized.\n");
return;
}
+#endif // DEBUG
// Fill the entire framebuffer with the specified color
- for (size_t i = 0; i < (fb->width * fb->height); ++i) {
+ for (int i = 0; i < fb->screen_size; i++) {
fb->pixels[i] = color;
}
}
void fbgl_put_pixel(int x, int y, uint32_t color, fbgl_t* fb)
{
+#ifdef DEBUG
if (!fb || !fb->pixels) {
fprintf(stderr, "Error: framebuffer not initialized.\n");
return;
@@ -303,8 +305,9 @@ void fbgl_put_pixel(int x, int y, uint32_t color, fbgl_t* fb)
if (x < 0 || x >= fb->width || y < 0 || y >= fb->height) {
return; // Ignore out-of-bound coordinates
}
+#endif // DEBUG
- size_t index = y * fb->width + x;
+ const size_t index = y * fb->width + x;
fb->pixels[index] = color;
}
@@ -376,8 +379,6 @@ void fbgl_set_signal_handlers()
}
}
-#endif
-
#ifdef FBGL_USE_FREETYPE
FT_Library fbgl_freetype_init()
{
@@ -408,15 +409,15 @@ FT_Face fbgl_load_font(FT_Library library, const char* font_path, int font_size)
}
void fbgl_render_freetype_text(fbgl_t* fb, FT_Library library, FT_Face face,
- const char* text, int x, int y)
+ const char* text, int32_t x, int32_t y)
{
while (*text) {
FT_Load_Char(face, *text, FT_LOAD_RENDER);
FT_Bitmap bitmap = face->glyph->bitmap;
// Draw the bitmap to framebuffer
- for (int j = 0; j < bitmap.rows; j++) {
- for (int i = 0; i < bitmap.width; i++) {
+ for (int32_t j = 0; j < bitmap.rows; j++) {
+ for (int32_t i = 0; i < bitmap.width; i++) {
if (bitmap.buffer[j * bitmap.width + i]) { // Check pixel is not empty
fbgl_put_pixel(x + i, y + j, 0xFF0000,
fb); // Draw white pixel
@@ -429,26 +430,27 @@ void fbgl_render_freetype_text(fbgl_t* fb, FT_Library library, FT_Face face,
}
#endif // FBGL_USE_FREETYPE
+
void fbgl_draw_line(fbgl_point_t x, fbgl_point_t y, uint32_t color,
fbgl_t* buffer)
{
- int dx = abs(y.x - x.x);
- int dy = abs(y.y - x.y);
+ const int32_t dx = abs(y.x - x.x);
+ const int32_t dy = abs(y.y - x.y);
- int sx = (x.x < y.x) ? 1 : -1;
- int sy = (x.y < y.y) ? 1 : -1;
+ const int32_t sx = (x.x < y.x) ? 1 : -1;
+ const int32_t sy = (x.y < y.y) ? 1 : -1;
- int err = dx - dy;
+ int32_t err = dx - dy;
while (1) {
// Set the pixel at the current position
fbgl_put_pixel(x.x, x.y, color, buffer);
// If we've reached the end point, break
- if (x.x == y.x && x.y == y.y)
+ if (x.x >= y.x && x.y >= y.y)
break;
- int e2 = 2 * err;
+ const int32_t e2 = 2 * err;
if (e2 > -dy) {
err -= dy;
@@ -490,9 +492,9 @@ void fbgl_draw_rectangle_filled(fbgl_point_t top_left,
fbgl_point_t bottom_right, uint32_t color,
fbgl_t* fb)
{
- for (int y = top_left.y; y < bottom_right.y; y++) {
+ for (int32_t y = top_left.y; y < bottom_right.y; y++) {
// Manually set each pixel in the row
- for (int x = top_left.x; x < bottom_right.x; x++) {
+ for (int32_t x = top_left.x; x < bottom_right.x; x++) {
fbgl_put_pixel(x, y, color, fb);
}
}
@@ -602,7 +604,7 @@ void fbgl_destroy_texture(fbgl_tga_texture_t* texture)
}
}
-void fbgl_draw_texture(fbgl_t* fb, fbgl_tga_texture_t* texture, int x, int y)
+void fbgl_draw_texture(fbgl_t* fb, fbgl_tga_texture_t const* texture, int32_t x, int32_t y)
{
if (!fb || !texture || !texture->data) {
return;
@@ -626,6 +628,24 @@ void fbgl_draw_texture(fbgl_t* fb, fbgl_tga_texture_t* texture, int x, int y)
}
}
}
+
+uint32_t fb_get_width(fbgl_t const* fb)
+{
+ return fb->width;
+}
+
+uint32_t fb_get_height(fbgl_t const* fb)
+{
+ return fb->height;
+}
+
+uint32_t* fb_get_data(fbgl_t const* fb)
+{
+ return fb->pixels;
+}
+
+#endif // FBGL_IMPLEMENTATION
+
#ifdef __cplusplus
} // extern "C"
#endif