diff --git a/src/engine.c b/src/engine.c index a0cc6a2..d496ca5 100644 --- a/src/engine.c +++ b/src/engine.c @@ -30,6 +30,10 @@ along with this program. If not, see . #include "SDL.h" +#ifndef NOFONT +#include "SDL_ttf.h" +#endif + #ifndef NOSOUND #include "SDL_mixer.h" #endif @@ -403,6 +407,18 @@ void engine_cleanup() char filename[PATH_MAX]; strcpy(filename, ""); +#ifndef NOFONT + if (gfx_unicodeFont != NULL) + { + TTF_CloseFont(gfx_unicodeFont); + gfx_unicodeFont = NULL; + } + if (TTF_WasInit()) + { + TTF_Quit(); + } +#endif + #ifndef NOSOUND if (engine.useAudio) { diff --git a/src/gfx.c b/src/gfx.c index 490b4e1..2a9f975 100644 --- a/src/gfx.c +++ b/src/gfx.c @@ -23,6 +23,7 @@ along with this program. If not, see . #include "SDL.h" #include "SDL_image.h" + #ifndef NOFONT #include "SDL_ttf.h" #include "utf8proc.h" @@ -82,6 +83,12 @@ void gfx_init() screen = NULL; #ifndef NOFONT + if (TTF_Init() < 0) + { + printf("ERROR: Could not initialize TTF: %s\n", TTF_GetError()); + exit(1); + } + gfx_unicodeFont = TTF_OpenFont("data/DroidSansFallbackFull.ttf", 14); if (gfx_unicodeFont == NULL) { @@ -214,6 +221,9 @@ int gfx_renderString(const char *in, int x, int y, int fontColor, int wrap, SDL_ return gfx_renderStringBase(in, x, y, fontColor, wrap, dest); } +// TODO +#define NOFONT + #ifdef NOFONT int gfx_renderUnicode(const char *in, int x, int y, int fontColor, int wrap, SDL_Surface *dest) { @@ -225,6 +235,7 @@ int gfx_renderUnicodeBase(const char *in, int x, int y, int fontColor, int wrap, SDL_Surface *textSurf; SDL_Color color; int w, h; + int changed; utf8proc_int32_t buf; utf8proc_int32_t prev; int breakPoints[STRMAX]; @@ -247,7 +258,8 @@ int gfx_renderUnicodeBase(const char *in, int x, int y, int fontColor, int wrap, engine_error(TTF_GetError()); } - while (w > dest->w) + changed = 1; + while (changed && (w > dest->w)) { i = 0; j = 0; @@ -274,9 +286,12 @@ int gfx_renderUnicodeBase(const char *in, int x, int y, int fontColor, int wrap, prev = buf; } + changed = 0; for (i = nBreakPoints - 1; i >= 0; i--) { + printf("Breakpoint %d (%c)\n", i, remainingStr[breakPoints[i]]); strncpy(testStr, remainingStr, breakPoints[i]); + printf("Checking '%s'...\n", testStr); if (TTF_SizeUTF8(gfx_unicodeFont, testStr, &w, &h) < 0) { engine_error(TTF_GetError()); @@ -296,6 +311,7 @@ int gfx_renderUnicodeBase(const char *in, int x, int y, int fontColor, int wrap, y += TTF_FontHeight(gfx_unicodeFont); memmove(remainingStr, remainingStr + breakPoints[i], strlen(remainingStr) - breakPoints[i] + 1); + changed = 1; break; } } @@ -305,6 +321,22 @@ int gfx_renderUnicodeBase(const char *in, int x, int y, int fontColor, int wrap, engine_error(TTF_GetError()); } } + printf("Done splitting. Render '%s'\n", remainingStr); + textSurf = TTF_RenderUTF8_Solid(gfx_unicodeFont, remainingStr, color); + area.x = x; + area.y = y; + area.w = textSurf->w; + area.h = textSurf->h; + if (SDL_BlitSurface(textSurf, NULL, dest, &area) < 0) + { + printf("BlitSurface error: %s\n", SDL_GetError()); + engine_showError(2, ""); + } + y += TTF_FontHeight(gfx_unicodeFont); + } + else + { + engine_warn("gfx_unicodeFont is NULL!"); } return y; @@ -537,7 +569,7 @@ void gfx_createMessageBox(SDL_Surface *face, const char *message, int transparen x = 10; } - gfx_renderString(message, x, 5, FONT_WHITE, 1, gfx_messageBox); + gfx_renderUnicode(message, x, 5, FONT_WHITE, 1, gfx_messageBox); } SDL_Surface *gfx_loadImage(const char *filename) @@ -616,14 +648,6 @@ void gfx_free() SDL_FreeSurface(gfx_messageBox); gfx_messageBox = NULL; } - -#ifndef NOFONT - if (gfx_unicodeFont != NULL) - { - TTF_CloseFont(gfx_unicodeFont); - gfx_unicodeFont = NULL; - } -#endif } void gfx_scaleBackground() diff --git a/src/gfx.h b/src/gfx.h index 6101a56..b27b474 100644 --- a/src/gfx.h +++ b/src/gfx.h @@ -22,6 +22,10 @@ along with this program. If not, see . #include "SDL.h" +#ifndef NOFONT +#include "SDL_ttf.h" +#endif + #include "defs.h" #include "structs.h" @@ -35,10 +39,15 @@ extern SDL_Surface *gfx_shopSprites[SHOP_S_MAX]; extern TextObject gfx_textSprites[TS_MAX]; extern SDL_Surface *gfx_messageBox; +#ifndef NOFONT +extern TTF_Font *gfx_unicodeFont; +#endif + void gfx_init(); SDL_Surface *gfx_setTransparent(SDL_Surface *sprite); void gfx_blit(SDL_Surface *image, int x, int y, SDL_Surface *dest); int gfx_renderString(const char *in, int x, int y, int fontColor, int wrap, SDL_Surface *dest); +int gfx_renderUnicode(const char *in, int x, int y, int fontColor, int wrap, SDL_Surface *dest); void gfx_putPixel(SDL_Surface *surface, int x, int y, Uint32 pixel); void gfx_drawCircle(int xc, int yc, int R, SDL_Surface *PIX, int col); void gfx_drawRect(SDL_Surface *dest, int x, int y, int w, int h, Uint8 red, Uint8 green, Uint8 blue);