diff options
author | Jinghua Luo <sunmoon1997@gmail.com> | 2007-02-04 22:17:18 +0800 |
---|---|---|
committer | Jinghua Luo <sunmoon1997@gmail.com> | 2007-02-04 22:17:18 +0800 |
commit | 88212367e401c1949f57177f6bd437bf523947a2 (patch) | |
tree | 471c0b21a12ae0223c1c20e7de882081553a4c90 | |
parent | d42c44667a089af240d2403f007740a7498cf9c8 (diff) |
opengl: fix a width caculate bug for cleartype mode.
-rw-r--r-- | src/sdl-freetype-opengl.c | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/src/sdl-freetype-opengl.c b/src/sdl-freetype-opengl.c index 52b9eb2..4d7fde3 100644 --- a/src/sdl-freetype-opengl.c +++ b/src/sdl-freetype-opengl.c @@ -96,7 +96,7 @@ sdl_freetype_opengl_glyph_user_data_init (sdl_freetype_font_t * font, sdl_freetype_area_t * area; sdl_freetype_error_t err; FT_Bitmap * bitmap; - unsigned int pitch; + unsigned int pitch, width; unsigned char * data; if (info->flags & SDL_FREETYPE_GLYPH_EMPTY) @@ -119,6 +119,7 @@ sdl_freetype_opengl_glyph_user_data_init (sdl_freetype_font_t * font, glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + switch (bitmap->pixel_mode) { case FT_PIXEL_MODE_MONO: case FT_PIXEL_MODE_GRAY: @@ -172,6 +173,11 @@ sdl_freetype_opengl_glyph_user_data_init (sdl_freetype_font_t * font, } else { data = NULL; pitch = bitmap->pitch; + if (bitmap->pixel_mode == FT_PIXEL_MODE_LCD || + bitmap->pixel_mode == FT_PIXEL_MODE_LCD_V) + width = bitmap->width; + else + width = pitch; } user_data = sdl_freetype_opengl_user_data_create (); @@ -179,17 +185,18 @@ sdl_freetype_opengl_glyph_user_data_init (sdl_freetype_font_t * font, return SDL_FREETYPE_ERR_OUT_OF_MEMORY; err = sdl_freetype_area_manager_find (opengl_render->manager, - pitch, bitmap->rows, + width, bitmap->rows, SDL_FREETYPE_FALSE, user_data); if (err != SDL_FREETYPE_ERR_OK) { err = sdl_freetype_area_manager_find (opengl_render->manager, - pitch, bitmap->rows, + width, bitmap->rows, SDL_FREETYPE_TRUE, user_data); if (err != SDL_FREETYPE_ERR_OK) { sdl_freetype_opengl_user_data_destroy (user_data, opengl_render->manager); + printf ("allocate area failed (%d, %d)\n", width, bitmap->rows); return SDL_FREETYPE_ERR_OUT_OF_RESOURCES; } } @@ -204,12 +211,12 @@ sdl_freetype_opengl_glyph_user_data_init (sdl_freetype_font_t * font, switch (info->bitmap.pixel_mode) { case FT_PIXEL_MODE_MONO: glTexSubImage2D (GL_TEXTURE_2D, 0, - area->x, area->y, bitmap->width, bitmap->rows, + area->x, area->y, pitch, bitmap->rows, GL_ALPHA, GL_UNSIGNED_BYTE, data); break; case FT_PIXEL_MODE_GRAY: glTexSubImage2D (GL_TEXTURE_2D, 0, - area->x, area->y, bitmap->width, bitmap->rows, + area->x, area->y, pitch, bitmap->rows, GL_ALPHA, GL_UNSIGNED_BYTE, bitmap->buffer); break; case FT_PIXEL_MODE_LCD: @@ -316,6 +323,10 @@ sdl_freetype_opengl_glyphs_render (sdl_freetype_font_t * font, } if (num_cached) { + glMatrixMode (GL_TEXTURE); + glPushMatrix (); + glLoadIdentity (); + glMatrixMode (GL_MODELVIEW); glPushMatrix (); @@ -362,6 +373,9 @@ sdl_freetype_opengl_glyphs_render (sdl_freetype_font_t * font, glEnd (); glPopMatrix (); + + glMatrixMode (GL_TEXTURE); + glPopMatrix (); } glPopAttrib (); |