diff options
Diffstat (limited to 'shell/menu/font_drawing.c')
-rw-r--r-- | shell/menu/font_drawing.c | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/shell/menu/font_drawing.c b/shell/menu/font_drawing.c new file mode 100644 index 0000000..9b964ef --- /dev/null +++ b/shell/menu/font_drawing.c @@ -0,0 +1,131 @@ +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> + +#include "video_blit.h" +#include "font_drawing.h" +#include "font_menudata.h" + +extern int32_t screen_width; +//#define setPixel(buffer, x,y,c) + +static inline void setPixel(uint16_t* restrict buffer, uint32_t x, uint32_t y, uint16_t c) +{ + if (x < BACKBUFFER_WIDTH_RESOLUTION && y < BACKBUFFER_HEIGHT_RESOLUTION) + { + *((uint16_t* restrict)buffer + ((x) + (y) * BACKBUFFER_WIDTH_RESOLUTION)) = c; + } +} + +static int32_t isOutlinePixel(uint8_t* charfont, uint32_t x, uint32_t y) +{ + uint32_t xis0 = !x, xis7 = x == 7, yis0 = !y, yis7 = y == 7; + + if(xis0) + { + if (yis0) + { + return !(*charfont & 0x80) && ((*charfont & 0x40) || (charfont[1] & 0x80) || (charfont[1] & 0x40)); + } + else if (yis7) + { + return !(charfont[7] & 0x80) && ((charfont[7] & 0x40) || (charfont[6] & 0x80) || (charfont[6] & 0x40)); + } + else + { + return !(charfont[y] & 0x80) && ( + (charfont[y - 1] & 0x80) || (charfont[y - 1] & 0x40) || + (charfont[y] & 0x40) || + (charfont[y + 1] & 0x80) || (charfont[y + 1] & 0x40)); + } + } + else if (xis7) + { + if (yis0) + { + return !(*charfont & 0x01) && ((*charfont & 0x02) || (charfont[1] & 0x01) || (charfont[1] & 0x02)); + } + else if (yis7) + { + return !(charfont[7] & 0x01) && ((charfont[7] & 0x02) || (charfont[6] & 0x01) || (charfont[6] & 0x02)); + } + else + { + return !(charfont[y] & 0x01) && ( + (charfont[y - 1] & 0x01) || (charfont[y - 1] & 0x02) || + (charfont[y] & 0x02) || + (charfont[y + 1] & 0x01) || (charfont[y + 1] & 0x02)); + } + } + else + { + uint32_t b = 1 << (7 - x); + if (yis0) + { + return !(*charfont & b) && ( + (*charfont & (b << 1)) || (*charfont & (b >> 1)) || + (charfont[1] & (b << 1)) || (charfont[1] & b) || (charfont[1] & (b >> 1))); + } + else if (yis7) + { + return !(charfont[7] & b) && ( + (charfont[7] & (b << 1)) || (charfont[7] & (b >> 1)) || + (charfont[6] & (b << 1)) || (charfont[6] & b) || (charfont[6] & (b >> 1))); + } + else + { + return !(charfont[y] & b) && ( + (charfont[y] & (b << 1)) || (charfont[y] & (b >> 1)) || + (charfont[y - 1] & (b << 1)) || (charfont[y - 1] & b) || (charfont[y - 1] & (b >> 1)) || + (charfont[y + 1] & (b << 1)) || (charfont[y + 1] & b) || (charfont[y + 1] & (b >> 1))); + } + } +} + +static void drawChar(uint16_t* restrict buffer, uint32_t *x, uint32_t *y, uint32_t margin, char ch, uint16_t fc, uint16_t olc) +{ + uint32_t i, j; + uint8_t *charSprite; + if (ch == '\n') + { + *x = margin; + *y += 8; + } + else if(*y < (BACKBUFFER_HEIGHT_RESOLUTION-1)) + { + charSprite = ch * 8 + n2DLib_font; + // Draw charSprite as monochrome 8*8 image using given color + for(i = 0; i < 8; i++) + { + for(j = 7; j; j--) + { + if((charSprite[i] >> j) & 1) + { + setPixel(buffer, *x + (7 - j), *y + i, fc); + } + else if(isOutlinePixel(charSprite, 7 - j, i)) + { + setPixel(buffer, *x + (7 - j), *y + i, olc); + } + } + } + *x += 8; + } +} + +static void drawString(uint16_t* restrict buffer, uint32_t *x, uint32_t *y, uint32_t _x, const char *str, uint16_t fc, uint16_t olc) +{ + uint32_t i; + size_t size_font; + + size_font = strnlen(str, (BACKBUFFER_WIDTH_RESOLUTION/8)) + 1; + for(i = 0; i < size_font; i++) + drawChar(buffer, x, y, _x, str[i], fc, olc); +} + +void print_string(const char *s, const uint16_t fg_color, const uint16_t bg_color, uint32_t x, uint32_t y, uint16_t* restrict buffer) +{ + if (!s) return; + + drawString(buffer, &x, &y, 0, s, fg_color, bg_color); +} |