diff options
Diffstat (limited to 'render.c')
-rw-r--r-- | render.c | 92 |
1 files changed, 89 insertions, 3 deletions
@@ -73,7 +73,7 @@ Colour blend_mod(Colour dst, Colour src, Colour mod) { void init_font( BM_Font* font, - Bitmap* bmp, + const Bitmap* bmp, int char_w, int char_h, int chars_across @@ -84,28 +84,65 @@ void init_font( font->chars_across = chars_across; } -void rfont_char(int x, int y, char c) { +void rfont_char(const BM_Font* font, int x, int y, char c) { + Rectangle rect; + c -= ' '; + + rect.x = (c % font->chars_across) * font->char_w; + rect.y = (c / font->chars_across) * font->char_h; + rect.w = font->char_w; + rect.h = font->char_h; + + render_bitmap(font->bmp, x, y, &rect); } -void rfont_char_col(int x, int y, char c, Colour colour) { +void rfont_char_col( + const BM_Font* font, + int x, + int y, + char c, + Colour colour +) { + Rectangle rect; + + c -= ' '; + + rect.x = (c % font->chars_across) * font->char_w; + rect.y = (c / font->chars_across) * font->char_h; + rect.w = font->char_w; + rect.h = font->char_h; + render_bitmap_col(font->bmp, x, y, &rect, colour); } void rfont_text( + const BM_Font* font, int x, int y, const char* text ) { + const char* c; + + for (c = text; *c; c++) { + rfont_char(font, x, y, *c); + x += font->char_w; + } } void rfont_text_col( + const BM_Font* font, int x, int y, const char* text, Colour colour ) { + const char* c; + for (c = text; *c; c++) { + rfont_char_col(font, x, y, *c, colour); + x += font->char_w; + } } void render_bitmap( @@ -173,5 +210,54 @@ void render_bitmap_col( const Rectangle* rect, Colour colour ) { + int i, j, stride, sstride, n; + Colour* dst; + const Colour* src; + Rectangle sub; + sub = *rect; + + if (sub.w <= 0) { return; } + if (sub.h <= 0) { return; } + if (sub.w > bitmap->w) { return; } + if (sub.h > bitmap->h) { return; } + + if ((n = -x) > 0) { + sub.w -= n; + sub.x += n; + x += n; + } + + if ((n = -y) > 0) { + sub.h -= n; + sub.y += n; + y += n; + } + + if ((n = x + sub.w - renderer_w) > 0) { + sub.w -= n; + } + + if ((n = y + sub.h - renderer_h) > 0) { + sub.h -= n; + } + + if (sub.w <= 0) { return; } + if (sub.h <= 0) { return; } + + dst = renderer.pixels + (x + y * renderer_w); + src = bitmap->pixels + (sub.x + sub.y * bitmap->w); + + stride = renderer_w - sub.w; + sstride = bitmap->w - sub.w; + + for (i = 0; i < sub.h; i++) { + for (j = 0; j < sub.w; j++) { + *dst = blend_mod(*dst, *src, colour); + dst++; + src++; + } + dst += stride; + src += sstride; + } } |