diff --git a/implementations/uvm-ncc/font/convert.py b/implementations/uvm-ncc/font/convert.py index 597c50c..9dcf906 100644 --- a/implementations/uvm-ncc/font/convert.py +++ b/implementations/uvm-ncc/font/convert.py @@ -22,8 +22,9 @@ for i, _ in enumerate(txt): print(f'''\ -int font_{font_name}_{pointsize}_width = {w}; -int font_{font_name}_{pointsize}_height = {h}; +u64 font_{font_name}_{pointsize}_number_of_characters = {len(txt)}; +u64 font_{font_name}_{pointsize}_width = {w}; +u64 font_{font_name}_{pointsize}_height = {h}; u32 font_{font_name}_{pointsize}_data[{len(txt)}][{w * h}]; diff --git a/implementations/uvm-ncc/font/font.h b/implementations/uvm-ncc/font/font.h index 488dfba..9929a11 100644 --- a/implementations/uvm-ncc/font/font.h +++ b/implementations/uvm-ncc/font/font.h @@ -1,6 +1,7 @@ -int font_Inconsolata_22_width = 12; -int font_Inconsolata_22_height = 25; +u64 font_Inconsolata_22_number_of_characters = 94; +u64 font_Inconsolata_22_width = 12; +u64 font_Inconsolata_22_height = 25; u32 font_Inconsolata_22_data[94][300]; diff --git a/implementations/uvm-ncc/graphics.h b/implementations/uvm-ncc/graphics.h index 47a36ad..c39d502 100644 --- a/implementations/uvm-ncc/graphics.h +++ b/implementations/uvm-ncc/graphics.h @@ -1,3 +1,4 @@ +#include void draw_background(u32* buffer, size_t w, size_t h) @@ -12,3 +13,32 @@ draw_background(u32* buffer, size_t w, size_t h) } } } + +void +carefree_alpha_blend_blit(u32* dest, u32* source, size_t dest_stride, u64 dest_x, u64 dest_y, u64 w, u64 h) +{ + u32* d = dest + dest_stride * dest_y + dest_x; + for (u64 x = 0; x < w; ++x) { + for (u64 y = 0; y < h; ++y) { + u32* pix_ptr = d + x + dest_stride * y; + u32* spix_ptr = source + x + w * y; + u32 pixel = *spix_ptr; + u8 alpha = pixel >> 24; + if (!alpha) { // no alpha + continue; + } + if (0xFF == alpha) { + *pix_ptr = pixel; + continue; + } + u32 dest_pixel = *pix_ptr; + u8 unalpha = 0xFF - alpha; + u8 red = (((dest_pixel >> 16) & 255) * unalpha + ((pixel >> 16) & 255) * alpha) / 0xff; + u8 green = (((dest_pixel >> 8) & 255) * unalpha + ((pixel >> 8) & 255) * alpha) / 0xff; + u8 blue = ((dest_pixel & 255) * unalpha + (pixel & 255) * alpha) / 0xff; + *pix_ptr = (alpha << 24) | (red << 16) | (green << 8) | blue; + } + } +} + + diff --git a/implementations/uvm-ncc/xerblin.c b/implementations/uvm-ncc/xerblin.c index a2c9686..d3a3cbe 100644 --- a/implementations/uvm-ncc/xerblin.c +++ b/implementations/uvm-ncc/xerblin.c @@ -1,3 +1,4 @@ +#include #include #include #include "/home/sforman/src/Joypy/implementations/uvm-ncc/font/font.h" @@ -10,34 +11,33 @@ size_t FRAME_WIDTH = 768; size_t FRAME_HEIGHT = 512; u32 frame_buffer[393216]; -int wid; +int wid; // Window ID. void draw_char(u8 ch, u64 dest_x, u64 dest_y) { - u32* dest = frame_buffer + FRAME_WIDTH * dest_y + dest_x; - u32* character_data = font_Inconsolata_22_data[ch]; - for (size_t x = 0; x < font_Inconsolata_22_width; ++x) { - for (size_t y = 0; y < font_Inconsolata_22_height; ++y) { - u32* pix_ptr = dest + x + FRAME_WIDTH * y; - u32 pixel = character_data[x + font_Inconsolata_22_width * y]; - u8 alpha = pixel >> 24; - if (!alpha) { // no alpha - continue; - } - if (0xFF == alpha) { - *pix_ptr = pixel; - continue; - } - u32 dest_pixel = *pix_ptr; - u8 unalpha = 0xFF - alpha; - u8 red = (((dest_pixel >> 16) & 255) * unalpha + ((pixel >> 16) & 255) * alpha) / 0xff; - u8 green = (((dest_pixel >> 8) & 255) * unalpha + ((pixel >> 8) & 255) * alpha) / 0xff; - u8 blue = ((dest_pixel & 255) * unalpha + (pixel & 255) * alpha) / 0xff; - *pix_ptr = (alpha << 24) | (red << 16) | (green << 8) | blue; - } + // Check the inputs. + // Trust that the type "u-" means we don't have to check lower bounds? + if (ch > font_Inconsolata_22_number_of_characters) { + // No error message or anything, just decline to draw. + return; } + if (dest_x >= (FRAME_WIDTH - font_Inconsolata_22_width)) { + return; + } + if (dest_y >= (FRAME_HEIGHT - font_Inconsolata_22_height)) { + return; + } + carefree_alpha_blend_blit( + frame_buffer, + font_Inconsolata_22_data[ch], + FRAME_WIDTH, + dest_x, + dest_y, + font_Inconsolata_22_width, + font_Inconsolata_22_height + ); } @@ -49,7 +49,7 @@ draw_char(u8 ch, u64 dest_x, u64 dest_y) void -mousemove(u64 window_id, u64 new_x, u64 new_y) +mousedown(u64 window_id, u64 new_x, u64 new_y) { u32* pix_ptr = frame_buffer + FRAME_WIDTH * new_y + new_x; *pix_ptr = GREEN; @@ -61,9 +61,9 @@ void main() { init_font_data(); - wid = window_create(FRAME_WIDTH, FRAME_HEIGHT, "Bouncing Ball Example", 0); + wid = window_create(FRAME_WIDTH, FRAME_HEIGHT, "Xerblin", 0); draw_background(frame_buffer, FRAME_WIDTH, FRAME_HEIGHT); - for (size_t ch = 0; ch < 94; ++ch) { + for (size_t ch = 0; ch < font_Inconsolata_22_number_of_characters; ++ch) { draw_char( ch, 128 + (ch % 26) * font_Inconsolata_22_width, @@ -72,6 +72,6 @@ main() } window_draw_frame(wid, frame_buffer); //window_on_keydown(wid, keydown); - window_on_mousemove(wid, mousemove); + window_on_mousedown(wid, mousedown); enable_event_loop(); }