2021-06-29 15:07:19 +02:00
|
|
|
#include <fontconfig/fontconfig.h>
|
|
|
|
|
2021-06-28 21:37:34 +02:00
|
|
|
#include "score.h"
|
|
|
|
|
2021-06-29 15:07:19 +02:00
|
|
|
static const FcChar8 *SCORE_FONT_FAMILY = "Liberation Mono";
|
|
|
|
static const FcChar8 *SCORE_FONT_STYLE = "Bold";
|
2021-06-29 16:01:07 +02:00
|
|
|
static TTF_Font *SCORE_FONT = NULL;
|
|
|
|
static FcChar8 *SCORE_FONT_FILE = NULL;
|
2021-06-29 15:07:19 +02:00
|
|
|
static const int SCORE_FONT_PTSIZE = 16;
|
2021-06-29 16:01:07 +02:00
|
|
|
static const SDL_Color SCORE_FONT_COLOR = { 255, 255, 255 };
|
2021-06-28 21:37:34 +02:00
|
|
|
|
|
|
|
Score*
|
|
|
|
Score_init(int posX, int posY) {
|
|
|
|
Score *s = malloc(sizeof(Score));
|
|
|
|
*(int *)&s->POSX = posX;
|
|
|
|
*(int *)&s->POSY = posY;
|
|
|
|
s->score = 0;
|
2021-06-29 15:07:19 +02:00
|
|
|
|
2021-06-29 16:01:07 +02:00
|
|
|
if (SCORE_FONT == NULL) {
|
|
|
|
FcConfig *config = FcInitLoadConfigAndFonts();
|
|
|
|
FcPattern *pat = FcPatternCreate();
|
|
|
|
|
|
|
|
FcObjectSet* os = FcObjectSetBuild (FC_FAMILY, FC_STYLE, FC_LANG, FC_FILE, (char *) 0);
|
|
|
|
FcFontSet* fs = FcFontList(config, pat, os);
|
2021-06-29 15:07:19 +02:00
|
|
|
|
2021-06-29 16:01:07 +02:00
|
|
|
FcChar8 *style, *family;
|
|
|
|
for (int i=0; fs && i < fs->nfont; ++i) {
|
|
|
|
FcPattern* font = fs->fonts[i];
|
|
|
|
if (FcPatternGetString(font, FC_FILE, 0, &SCORE_FONT_FILE) == FcResultMatch
|
|
|
|
&& FcPatternGetString(font, FC_FAMILY, 0, &family) == FcResultMatch
|
|
|
|
&& FcPatternGetString(font, FC_STYLE, 0, &style) == FcResultMatch
|
|
|
|
&& strcmp(SCORE_FONT_FAMILY, family) == 0
|
|
|
|
&& strcmp(SCORE_FONT_STYLE, style) == 0) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
SCORE_FONT = TTF_OpenFont(SCORE_FONT_FILE, SCORE_FONT_PTSIZE);
|
|
|
|
FcFontSetDestroy(fs);
|
|
|
|
FcObjectSetDestroy(os);
|
|
|
|
FcPatternDestroy(pat);
|
|
|
|
FcConfigDestroy(config);
|
|
|
|
if (SCORE_FONT == NULL) {
|
|
|
|
printf("TTF_OpenFont fail with path '%s'. TTF_Error: %s\n", SCORE_FONT_FILE, TTF_GetError());
|
|
|
|
free(s);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-06-28 21:37:34 +02:00
|
|
|
return s;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
Score_free(Score *s) {
|
2021-06-29 16:01:07 +02:00
|
|
|
if (SCORE_FONT != NULL) {
|
|
|
|
TTF_CloseFont(SCORE_FONT);
|
|
|
|
SCORE_FONT = NULL;
|
|
|
|
}
|
2021-06-28 21:37:34 +02:00
|
|
|
free(s);
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
Score_render(const Score *s, SDL_Renderer *renderer) {
|
|
|
|
char score_str[3];
|
2021-06-29 01:25:08 +02:00
|
|
|
SDL_Rect scoreRect = { s->POSX , s->POSY, SCORE_WIDTH, SCORE_HEIGHT };
|
2021-06-28 21:37:34 +02:00
|
|
|
|
|
|
|
sprintf(score_str, "%i", s->score);
|
2021-06-29 16:01:07 +02:00
|
|
|
SDL_Surface *scoreSurface = TTF_RenderText_Solid(SCORE_FONT, score_str, SCORE_FONT_COLOR);
|
2021-06-28 21:37:34 +02:00
|
|
|
if (scoreSurface == NULL) {
|
|
|
|
printf("Text rendering failed. TTF_Error: %s\n", TTF_GetError());
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
SDL_Texture *scoreTexture = SDL_CreateTextureFromSurface(renderer, scoreSurface);
|
|
|
|
if (scoreTexture == NULL) {
|
|
|
|
printf("Texture rendering failed. SDL_Error: %s\n", SDL_GetError());
|
|
|
|
SDL_FreeSurface(scoreSurface);
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
SDL_RenderCopy(renderer, scoreTexture, NULL, &scoreRect);
|
|
|
|
|
|
|
|
SDL_FreeSurface(scoreSurface);
|
|
|
|
SDL_DestroyTexture(scoreTexture);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|