summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJinghua Luo <sunmoon1997@gmail.com>2007-02-04 22:17:18 +0800
committerJinghua Luo <sunmoon1997@gmail.com>2007-02-04 22:17:18 +0800
commit88212367e401c1949f57177f6bd437bf523947a2 (patch)
tree471c0b21a12ae0223c1c20e7de882081553a4c90
parentd42c44667a089af240d2403f007740a7498cf9c8 (diff)
opengl: fix a width caculate bug for cleartype mode.
-rw-r--r--src/sdl-freetype-opengl.c24
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 ();