summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuo Jinghua <sunmoon1997@gmail.com>2011-06-08 11:22:14 +0800
committerLuo Jinghua <sunmoon1997@gmail.com>2011-06-08 11:23:07 +0800
commit6b422afbb34fa17774a847a51d5bb36aa10e2d4b (patch)
tree8988cbe51b56c0168b69234330d8ea01dc8dba62
parentab8ce0f87066ffee8c4c0fd2c089b14999e83023 (diff)
opengl: only use the alpha bits for subpixels enabled fonts
-rw-r--r--src/sdl-freetype-opengl.c44
1 files changed, 29 insertions, 15 deletions
diff --git a/src/sdl-freetype-opengl.c b/src/sdl-freetype-opengl.c
index b38d4e8..b29e8a3 100644
--- a/src/sdl-freetype-opengl.c
+++ b/src/sdl-freetype-opengl.c
@@ -133,13 +133,12 @@ sdl_freetype_opengl_glyph_user_data_init (sdl_freetype_font_t * font,
break;
case FT_PIXEL_MODE_LCD:
case FT_PIXEL_MODE_LCD_V:
- opengl_render->subpixel = SDL_FREETYPE_TRUE;
- data = calloc (opengl_render->width * opengl_render->height * 4, 1);
+ data = calloc (opengl_render->width * opengl_render->height, 1);
if (!data)
return SDL_FREETYPE_ERR_OUT_OF_MEMORY;
- glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA,
+ glTexImage2D (GL_TEXTURE_2D, 0, GL_ALPHA,
opengl_render->width, opengl_render->height, 0,
- GL_RGBA, GL_UNSIGNED_BYTE, data);
+ GL_ALPHA, GL_UNSIGNED_BYTE, data);
free (data);
break;
default:
@@ -171,14 +170,29 @@ sdl_freetype_opengl_glyph_user_data_init (sdl_freetype_font_t * font,
dst[x] = 0xff;
}
}
+ } else if (bitmap->pixel_mode == FT_PIXEL_MODE_LCD ||
+ bitmap->pixel_mode == FT_PIXEL_MODE_LCD_V) {
+ unsigned char * src, * dst;
+ int h;
+
+ width = pitch = (bitmap->width + 3) & ~3;
+ data = calloc (pitch * info->bitmap.rows, 1);
+ if (!data)
+ return SDL_FREETYPE_ERR_OUT_OF_MEMORY;
+
+ src = bitmap->buffer;
+ dst = data;
+ for (h = bitmap->rows; h > 0; h--, src += bitmap->pitch, dst += pitch) {
+ int x;
+ unsigned int *s = (unsigned int*)src;
+
+ for (x = 0; x < bitmap->width; x++)
+ dst[x] = s[x] >> 24;
+ }
} 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;
+ width = (bitmap->width + 3) & ~3;
}
height = (bitmap->rows + 3) & ~3;
@@ -223,8 +237,8 @@ sdl_freetype_opengl_glyph_user_data_init (sdl_freetype_font_t * font,
case FT_PIXEL_MODE_LCD:
case FT_PIXEL_MODE_LCD_V:
glTexSubImage2D (GL_TEXTURE_2D, 0,
- area->x, area->y, bitmap->width, bitmap->rows,
- GL_RGBA, GL_UNSIGNED_BYTE, bitmap->buffer);
+ area->x, area->y, pitch, bitmap->rows,
+ GL_ALPHA, GL_UNSIGNED_BYTE, data);
break;
}
@@ -233,8 +247,8 @@ sdl_freetype_opengl_glyph_user_data_init (sdl_freetype_font_t * font,
if (data)
free (data);
- user_data->uv[0].x = (float)area->x ;
- user_data->uv[0].y = (float)area->y ;
+ user_data->uv[0].x = (float)area->x;
+ user_data->uv[0].y = (float)area->y;
user_data->uv[1].x = (float)(area->x + bitmap->width);
user_data->uv[1].y = (float)(area->y + bitmap->rows);
info->data = user_data;
@@ -246,7 +260,7 @@ sdl_freetype_opengl_glyph_user_data_fini (sdl_freetype_font_t * font,
sdl_freetype_glyph_render_t * render,
void * data)
{
- sdl_freetype_opengl_render_t * opengl_render =
+ sdl_freetype_opengl_render_t * opengl_render =
(sdl_freetype_opengl_render_t *) render;
if (!data)
@@ -272,7 +286,7 @@ sdl_freetype_opengl_glyphs_render (sdl_freetype_font_t * font,
const sdl_freetype_glyph_t * glyphs,
int num_glyphs)
{
- sdl_freetype_opengl_render_t * render =
+ sdl_freetype_opengl_render_t * render =
(sdl_freetype_opengl_render_t *) sdl_freetype_font_get_render (font);
sdl_freetype_opengl_user_data_t * user_data;
sdl_freetype_opengl_glyph_info_t * cached, stack_cached[LOCAL_BUF];