fix keep_previous not working
This commit is contained in:
parent
8bf972d316
commit
ef7bf82a82
1 changed files with 37 additions and 19 deletions
56
src/font.c
56
src/font.c
|
@ -17,29 +17,15 @@ int initFont(TTF_Font **font, char *filename, int size) {
|
||||||
int writeText(GLuint *_textTexId, TTF_Font *font, const char *text,
|
int writeText(GLuint *_textTexId, TTF_Font *font, const char *text,
|
||||||
SDL_Color color, GLboolean keep_previous) {
|
SDL_Color color, GLboolean keep_previous) {
|
||||||
SDL_Surface *d, *s;
|
SDL_Surface *d, *s;
|
||||||
|
// Create text
|
||||||
if (!(d = TTF_RenderUTF8_Blended_Wrapped(font, text, color, 0))) {
|
if (!(d = TTF_RenderUTF8_Blended_Wrapped(font, text, color, 0))) {
|
||||||
freeFont(font);
|
freeFont(font);
|
||||||
fprintf(stderr, "Erreur TTF : TTF_RenderUTF8_Blended_Wrapped\n");
|
fprintf(stderr, "Erreur TTF : TTF_RenderUTF8_Blended_Wrapped\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
GLint w, h;
|
// Surface finale
|
||||||
if (keep_previous) {
|
if (!(s = SDL_CreateRGBSurface(0, d->w, d->h, 32, R_MASK, G_MASK, B_MASK,
|
||||||
glBindTexture(GL_TEXTURE_2D, *_textTexId);
|
|
||||||
|
|
||||||
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &w);
|
|
||||||
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &h);
|
|
||||||
} else {
|
|
||||||
// Aucune texture existante déjà créer
|
|
||||||
glGenTextures(1, _textTexId);
|
|
||||||
assert(_textTexId);
|
|
||||||
glBindTexture(GL_TEXTURE_2D, *_textTexId);
|
|
||||||
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
|
||||||
w = d->w, h = d->h;
|
|
||||||
}
|
|
||||||
if (!(s = SDL_CreateRGBSurface(0, w, h, 32, R_MASK, G_MASK, B_MASK,
|
|
||||||
A_MASK))) {
|
A_MASK))) {
|
||||||
freeFont(font);
|
freeFont(font);
|
||||||
fprintf(stderr, "Erreur SDL : %s\n", SDL_GetError());
|
fprintf(stderr, "Erreur SDL : %s\n", SDL_GetError());
|
||||||
|
@ -47,18 +33,50 @@ int writeText(GLuint *_textTexId, TTF_Font *font, const char *text,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (keep_previous) {
|
if (keep_previous) {
|
||||||
glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, s->pixels);
|
// On garde la texture déjà présente
|
||||||
|
assert(_textTexId);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, *_textTexId);
|
||||||
|
|
||||||
|
GLint w, h;
|
||||||
|
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &w);
|
||||||
|
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &h);
|
||||||
|
|
||||||
|
// Surface qui va garder les données de la texture
|
||||||
|
SDL_Surface *old;
|
||||||
|
if (!(old = SDL_CreateRGBSurface(0, w, h, 32, R_MASK, G_MASK, B_MASK,
|
||||||
|
A_MASK))) {
|
||||||
|
freeFont(font);
|
||||||
|
fprintf(stderr, "Erreur SDL : %s\n", SDL_GetError());
|
||||||
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Copie des données
|
||||||
|
glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, old->pixels);
|
||||||
|
|
||||||
|
// Scale les données sur la même taille que la surface finale
|
||||||
|
SDL_BlitScaled(old, NULL, s, NULL);
|
||||||
|
|
||||||
|
SDL_FreeSurface(old);
|
||||||
|
} else {
|
||||||
|
// Aucune texture existante, donc on la créée
|
||||||
|
glGenTextures(1, _textTexId);
|
||||||
|
assert(_textTexId);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, *_textTexId);
|
||||||
|
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copie le texte sur la surface finale
|
||||||
SDL_BlitSurface(d, NULL, s, NULL);
|
SDL_BlitSurface(d, NULL, s, NULL);
|
||||||
SDL_FreeSurface(d);
|
SDL_FreeSurface(d);
|
||||||
|
|
||||||
|
// Copie la surface dans la texture
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, s->w, s->h, 0, GL_RGBA,
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, s->w, s->h, 0, GL_RGBA,
|
||||||
GL_UNSIGNED_BYTE, s->pixels);
|
GL_UNSIGNED_BYTE, s->pixels);
|
||||||
|
|
||||||
SDL_FreeSurface(s);
|
SDL_FreeSurface(s);
|
||||||
glBindTexture(GL_TEXTURE_2D, 0);
|
glBindTexture(GL_TEXTURE_2D, 0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Reference in a new issue