diff --git a/font10x12.bmp b/font10x12.bmp new file mode 100644 index 0000000..2bad7de Binary files /dev/null and b/font10x12.bmp differ diff --git a/font5x7.bmp b/font5x7.bmp new file mode 100644 index 0000000..40e6f0d Binary files /dev/null and b/font5x7.bmp differ diff --git a/src/platform/sdl2.c b/src/platform/sdl2.c index a43a073..85e86a6 100644 --- a/src/platform/sdl2.c +++ b/src/platform/sdl2.c @@ -13,6 +13,31 @@ static SDL_Window *w = NULL; static SDL_Renderer *r = NULL; +/* Font surface */ +static SDL_Texture *font = NULL; + +/* Font configuration */ + +#ifndef LARGE_FONT /* Small font */ + +#define FONT_FILE "font5x7.bmp" +#define FONT_WIDTH 5 +#define FONT_HEIGHT 7 +#define FONT_OUTER 1 +#define FONT_INNER 2 +#define FONT_OFFSET 0 + +#else /* Large font */ + +#define FONT_FILE "font10x12.bmp" +#define FONT_WIDTH 10 +#define FONT_HEIGHT 12 +#define FONT_OUTER 3 +#define FONT_INNER 3 +#define FONT_OFFSET 32 + +#endif /* Font size */ + //--- // Interface functions //--- @@ -42,8 +67,8 @@ void intf_line(int x1, int y1, int x2, int y2, int color) /* intf_size() - Get the dimensions of a string */ void intf_size(char const *str, int *width, int *height) { - *width = 6 * strlen(str) - 1; - *height = 7; + *width = (FONT_WIDTH + 1) * strlen(str) - 1; + *height = FONT_HEIGHT; } /* intf_text() - Draw variable-width text */ @@ -54,9 +79,27 @@ void intf_text(char const *str, int x, int y, int color) int B = color & 0xff; SDL_SetRenderDrawColor(r, R, G, B, 255); - SDL_Rect rect = { .x = x, .y = y }; - intf_size(str, &rect.w, &rect.h); - SDL_RenderDrawRect(r, &rect); + int c; + while((c = *str++)) + { + int row = (c - FONT_OFFSET) >> 4; + int col = (c - FONT_OFFSET) & 15; + + SDL_Rect src = { + .x = FONT_OUTER + (FONT_WIDTH + FONT_INNER) * col, + .y = FONT_OUTER + (FONT_HEIGHT + FONT_INNER) * row, + .w = FONT_WIDTH, + .h = FONT_HEIGHT, + }; + SDL_Rect dst = { .x = x, .y = y, .w = src.w, .h = src.h }; + + SDL_RenderCopy(r, font, &src, &dst); + x += FONT_WIDTH + 1; + } + +// SDL_Rect rect = { .x = x, .y = y }; +// intf_size(str, &rect.w, &rect.h); +// SDL_RenderDrawRect(r, &rect); } //--- @@ -66,32 +109,30 @@ void intf_text(char const *str, int x, int y, int color) __attribute__((constructor)) static void init(void) { - if(SDL_Init(SDL_INIT_VIDEO) < 0) - { - fprintf(stderr, "error: cannot initialize SDL backend: %s\n", - SDL_GetError()); - exit(1); + #define fail(msg) { \ + fprintf(stderr, "error: " msg ": %s\n", SDL_GetError()); \ + exit(1); \ } + if(SDL_Init(SDL_INIT_VIDEO) < 0) fail("failed to initialize SDL"); + int c = SDL_WINDOWPOS_CENTERED; w = SDL_CreateWindow("2D rendering", c, c, 256, 128, 0); - if(!w) - { - fprintf(stderr, "error: cannot create SDL window: %s\n", - SDL_GetError()); - exit(1); - } + if(!w) fail("cannot create SDL window"); r = SDL_CreateRenderer(w, -1, SDL_RENDERER_ACCELERATED); - if(!r) - { - fprintf(stderr, "error: cannot create SDL renderer: %s\n", - SDL_GetError()); - exit(1); - } + if(!r) fail("cannot create SDL renderer"); SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "0"); + /* Load the font */ + SDL_Surface *font_surf = SDL_LoadBMP(FONT_FILE); + if(!font_surf) fail("cannot load font"); + + font = SDL_CreateTextureFromSurface(r, font_surf); + SDL_FreeSurface(font_surf); + if(!font) fail("cannot convert font to texture"); + /* Make the window visible */ SDL_RenderPresent(r); @@ -100,11 +141,15 @@ static void init(void) TeX_intf_line(intf_line); TeX_intf_size(intf_size); TeX_intf_text(intf_text); + + #undef fail } __attribute__((destructor)) static void fini(void) { + if(font) SDL_DestroyTexture(font); + if(r) SDL_DestroyRenderer(r); if(w) SDL_DestroyWindow(w); SDL_Quit(); } @@ -115,7 +160,8 @@ static void fini(void) int main(void) { - char const * formula = "\\frac{x_7}{" + char const * formula = + "\\frac{x_7\\left+3\\left<\\frac{A}{B}\\right>}{" "\\left\\{\\frac{\\frac{2}{3}}{27}\\right\\}^2" "}";