26#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
31#define FT_SHIFTCLAMP( x ) ( x >>= 8, (FT_Byte)( x > 255 ? 255 : x ) )
41 FT_Bitmap_LcdFilterFunc lcd_filter_func;
45 if (
slot->face &&
slot->face->internal->lcd_filter_func )
47 lcd_weights =
slot->face->internal->lcd_weights;
48 lcd_filter_func =
slot->face->internal->lcd_filter_func;
52 lcd_weights =
slot->library->lcd_weights;
53 lcd_filter_func =
slot->library->lcd_filter_func;
56 if ( lcd_filter_func == ft_lcd_filter_fir )
60 cbox->
xMin -= lcd_weights[0] ? 43 :
61 lcd_weights[1] ? 22 : 0;
62 cbox->
xMax += lcd_weights[4] ? 43 :
63 lcd_weights[3] ? 22 : 0;
67 cbox->
yMin -= lcd_weights[0] ? 43 :
68 lcd_weights[1] ? 22 : 0;
69 cbox->
yMax += lcd_weights[4] ? 43 :
70 lcd_weights[3] ? 22 : 0;
89 if ( pitch > 0 &&
height > 0 )
127 line[
xx - 2] = FT_SHIFTCLAMP( fir[0] );
130 line[
xx - 2] = FT_SHIFTCLAMP( fir[1] );
131 line[
xx - 1] = FT_SHIFTCLAMP( fir[2] );
161 for ( yy = 2; yy <
height; yy++, col -= pitch )
170 col[pitch * 2] = FT_SHIFTCLAMP( fir[0] );
173 col[pitch * 2] = FT_SHIFTCLAMP( fir[1] );
174 col[pitch] = FT_SHIFTCLAMP( fir[2] );
193 static const unsigned int filters[3][3] =
195 { 65538 * 9/13, 65538 * 1/6, 65538 * 1/13 },
196 { 65538 * 3/13, 65538 * 4/6, 65538 * 3/13 },
197 { 65538 * 1/13, 65538 * 1/6, 65538 * 9/13 }
204 if ( pitch > 0 &&
height > 0 )
225 r = filters[0][0] *
p;
226 g = filters[0][1] *
p;
227 b = filters[0][2] *
p;
230 r += filters[1][0] *
p;
231 g += filters[1][1] *
p;
232 b += filters[1][2] *
p;
235 r += filters[2][0] *
p;
236 g += filters[2][1] *
p;
237 b += filters[2][2] *
p;
262 r = filters[0][0] *
p;
263 g = filters[0][1] *
p;
264 b = filters[0][2] *
p;
267 r += filters[1][0] *
p;
268 g += filters[1][1] *
p;
269 b += filters[1][2] *
p;
272 r += filters[2][0] *
p;
273 g += filters[2][1] *
p;
274 b += filters[2][2] *
p;
277 col[pitch] = (
FT_Byte)(
g / 65536 );
278 col[pitch * 2] = (
FT_Byte)(
b / 65536 );
294 return FT_THROW( Invalid_Library_Handle );
297 return FT_THROW( Invalid_Argument );
300 library->lcd_filter_func = ft_lcd_filter_fir;
313 { 0x08, 0x4d, 0x56, 0x4d, 0x08 };
315 { 0x00, 0x55, 0x56, 0x55, 0x00 };
319 return FT_THROW( Invalid_Library_Handle );
331 library->lcd_filter_func = ft_lcd_filter_fir;
338 library->lcd_filter_func = ft_lcd_filter_fir;
345 library->lcd_filter_func = _ft_lcd_filter_legacy;
351 return FT_THROW( Invalid_Argument );
365 return FT_THROW( Unimplemented_Feature );
402 return FT_THROW( Unimplemented_Feature );
413 return FT_THROW( Unimplemented_Feature );
424 return FT_THROW( Invalid_Library_Handle );
427 return FT_THROW( Invalid_Argument );
431 return FT_THROW( Unimplemented_Feature );
enum FT_Render_Mode_ FT_Render_Mode
FT_Library_SetLcdFilter(FT_Library library, FT_LcdFilter filter)
FT_Library_SetLcdGeometry(FT_Library library, FT_Vector sub[3])
FT_Library_SetLcdFilterWeights(FT_Library library, unsigned char *weights)
ft_lcd_padding(FT_BBox *cbox, FT_GlyphSlot slot, FT_Render_Mode mode)
#define FT_LCD_FILTER_FIVE_TAPS
FT_BEGIN_HEADER enum FT_LcdFilter_ FT_LcdFilter
FT_Byte FT_LcdFiveTapFilter[FT_LCD_FILTER_FIVE_TAPS]
GLint GLint GLint GLint GLint x
GLint GLint GLint GLint GLint GLint y
GLint GLint GLsizei GLsizei height
GLdouble GLdouble GLdouble r
GLint GLint GLsizei width
GLboolean GLboolean GLboolean b
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
FT_Vector lcd_geometry[3]