From 6b422afbb34fa17774a847a51d5bb36aa10e2d4b Mon Sep 17 00:00:00 2001 From: Luo Jinghua Date: Wed, 8 Jun 2011 11:22:14 +0800 Subject: opengl: only use the alpha bits for subpixels enabled fonts --- src/sdl-freetype-opengl.c | 44 +++++++++++++++++++++++++++++--------------- 1 file 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]; -- cgit v1.2.3