20#include FT_INTERNAL_DEBUG_H
22#include FT_LCD_FILTER_H
24#include FT_INTERNAL_OBJECTS_H
27#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
32#define FT_SHIFTCLAMP( x ) ( x >>= 8, (FT_Byte)( x > 255 ? 255 : x ) )
42 FT_Bitmap_LcdFilterFunc lcd_filter_func;
46 if (
slot->face &&
slot->face->internal->lcd_filter_func )
48 lcd_weights =
slot->face->internal->lcd_weights;
49 lcd_filter_func =
slot->face->internal->lcd_filter_func;
53 lcd_weights =
slot->library->lcd_weights;
54 lcd_filter_func =
slot->library->lcd_filter_func;
57 if ( lcd_filter_func == ft_lcd_filter_fir )
61 cbox->
xMin -= lcd_weights[0] ? 43 :
62 lcd_weights[1] ? 22 : 0;
63 cbox->
xMax += lcd_weights[4] ? 43 :
64 lcd_weights[3] ? 22 : 0;
68 cbox->
yMin -= lcd_weights[0] ? 43 :
69 lcd_weights[1] ? 22 : 0;
70 cbox->
yMax += lcd_weights[4] ? 43 :
71 lcd_weights[3] ? 22 : 0;
90 if ( pitch > 0 &&
height > 0 )
128 line[
xx - 2] = FT_SHIFTCLAMP( fir[0] );
131 line[
xx - 2] = FT_SHIFTCLAMP( fir[1] );
132 line[
xx - 1] = FT_SHIFTCLAMP( fir[2] );
162 for ( yy = 2; yy <
height; yy++, col -= pitch )
171 col[pitch * 2] = FT_SHIFTCLAMP( fir[0] );
174 col[pitch * 2] = FT_SHIFTCLAMP( fir[1] );
175 col[pitch] = FT_SHIFTCLAMP( fir[2] );
194 static const unsigned int filters[3][3] =
196 { 65538 * 9/13, 65538 * 1/6, 65538 * 1/13 },
197 { 65538 * 3/13, 65538 * 4/6, 65538 * 3/13 },
198 { 65538 * 1/13, 65538 * 1/6, 65538 * 9/13 }
205 if ( pitch > 0 &&
height > 0 )
226 r = filters[0][0] *
p;
227 g = filters[0][1] *
p;
228 b = filters[0][2] *
p;
231 r += filters[1][0] *
p;
232 g += filters[1][1] *
p;
233 b += filters[1][2] *
p;
236 r += filters[2][0] *
p;
237 g += filters[2][1] *
p;
238 b += filters[2][2] *
p;
263 r = filters[0][0] *
p;
264 g = filters[0][1] *
p;
265 b = filters[0][2] *
p;
268 r += filters[1][0] *
p;
269 g += filters[1][1] *
p;
270 b += filters[1][2] *
p;
273 r += filters[2][0] *
p;
274 g += filters[2][1] *
p;
275 b += filters[2][2] *
p;
278 col[pitch] = (
FT_Byte)(
g / 65536 );
279 col[pitch * 2] = (
FT_Byte)(
b / 65536 );
295 return FT_THROW( Invalid_Library_Handle );
298 return FT_THROW( Invalid_Argument );
301 library->lcd_filter_func = ft_lcd_filter_fir;
314 { 0x08, 0x4d, 0x56, 0x4d, 0x08 };
316 { 0x00, 0x55, 0x56, 0x55, 0x00 };
320 return FT_THROW( Invalid_Library_Handle );
332 library->lcd_filter_func = ft_lcd_filter_fir;
339 library->lcd_filter_func = ft_lcd_filter_fir;
346 library->lcd_filter_func = _ft_lcd_filter_legacy;
352 return FT_THROW( Invalid_Argument );
366 return FT_THROW( Unimplemented_Feature );
403 return FT_THROW( Unimplemented_Feature );
414 return FT_THROW( Unimplemented_Feature );
425 return FT_THROW( Invalid_Library_Handle );
428 return FT_THROW( Invalid_Argument );
432 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]