1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
| GLuint loadString(const char *string, TTF_Font *font)
{
GLuint glID = 0;
SDL_Color color = {255, 255, 255};
SDL_Surface * picture_surface = NULL;
SDL_Surface * gl_surface = NULL;
SDL_Surface * gl_fliped_surface = NULL;
Uint32 rmask, gmask, bmask, amask;
int i=0, pitch=0;
picture_surface = TTF_RenderText_Solid(font, string, color);
if(picture_surface == NULL) {
printf("%s\n", TTF_GetError());
TTF_CloseFont(font);
return (0);
}
#if SDL_BYTEORDER == SDL_BIG_ENDIAN
rmask = 0xff000000;
gmask = 0x00ff0000;
bmask = 0x0000ff00;
amask = 0x000000ff;
#else
rmask = 0x000000ff;
gmask = 0x0000ff00;
bmask = 0x00ff0000;
amask = 0xff000000;
#endif
SDL_PixelFormat format = *(picture_surface->format);
format.BitsPerPixel = 32;
format.BytesPerPixel = 4;
format.Rmask = rmask;
format.Gmask = gmask;
format.Bmask = bmask;
format.Amask = amask;
gl_surface = SDL_ConvertSurface(picture_surface, &format, SDL_SWSURFACE);
gl_fliped_surface = SDL_CreateRGBSurface(SDL_SWSURFACE,
gl_surface->w,gl_surface->h,
gl_surface->format->BitsPerPixel,
gl_surface->format->Rmask,
gl_surface->format->Gmask,
gl_surface->format->Bmask,
gl_surface->format->Amask);
pitch = gl_surface->pitch;
SDL_LockSurface(gl_surface);
SDL_LockSurface(gl_fliped_surface);
/* On flip pour OpenGL :) */
for(i=0; i<gl_surface->h; i++)
{
memcpy(&((unsigned char* )gl_fliped_surface->pixels)[i*pitch],
&((unsigned char* )gl_surface->pixels)[(gl_surface->h - 1 - i)*pitch],
pitch);
}
SDL_UnlockSurface(gl_fliped_surface);
SDL_UnlockSurface(gl_surface);
glGenTextures(1, &glID);
glBindTexture(GL_TEXTURE_2D, glID);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, 4,
gl_fliped_surface->w,
gl_fliped_surface->h,
0,
GL_RGBA,
GL_UNSIGNED_BYTE,
gl_fliped_surface->pixels);
SDL_FreeSurface(gl_surface);
SDL_FreeSurface(gl_fliped_surface);
SDL_FreeSurface(picture_surface);
return (glID);
} |
Partager