115 |
switch ( bitmap->pixel_mode ) |
switch ( bitmap->pixel_mode ) |
116 |
{ |
{ |
117 |
case FT_PIXEL_MODE_MONO: |
case FT_PIXEL_MODE_MONO: |
|
case FT_PIXEL_MODE_LCD: |
|
|
case FT_PIXEL_MODE_LCD_V: |
|
118 |
ppb = 8; |
ppb = 8; |
119 |
break; |
break; |
120 |
case FT_PIXEL_MODE_GRAY2: |
case FT_PIXEL_MODE_GRAY2: |
124 |
ppb = 2; |
ppb = 2; |
125 |
break; |
break; |
126 |
case FT_PIXEL_MODE_GRAY: |
case FT_PIXEL_MODE_GRAY: |
127 |
|
case FT_PIXEL_MODE_LCD: |
128 |
|
case FT_PIXEL_MODE_LCD_V: |
129 |
ppb = 1; |
ppb = 1; |
130 |
break; |
break; |
131 |
default: |
default: |
132 |
return FT_Err_Invalid_Glyph_Format; |
return FT_Err_Invalid_Glyph_Format; |
133 |
} |
} |
134 |
|
|
135 |
/* check whether we must allocate memory */ |
/* if no need to allocate memory */ |
136 |
if ( ypixels == 0 && pitch * ppb >= bitmap->width + xpixels ) |
if ( ypixels == 0 && pitch * ppb >= bitmap->width + xpixels ) |
137 |
|
{ |
138 |
|
/* zero the padding */ |
139 |
|
for ( i = 0; i < bitmap->rows; i++ ) |
140 |
|
{ |
141 |
|
unsigned char* last_byte; |
142 |
|
int bits = xpixels * ( 8 / ppb ); |
143 |
|
int mask = 0; |
144 |
|
|
145 |
|
|
146 |
|
last_byte = bitmap->buffer + i * pitch + ( bitmap->width - 1 ) / ppb; |
147 |
|
|
148 |
|
if ( bits >= 8 ) |
149 |
|
{ |
150 |
|
FT_MEM_ZERO( last_byte + 1, bits / 8 ); |
151 |
|
bits %= 8; |
152 |
|
} |
153 |
|
|
154 |
|
if ( bits > 0 ) |
155 |
|
{ |
156 |
|
while ( bits-- > 0 ) |
157 |
|
mask |= 1 << bits; |
158 |
|
|
159 |
|
*last_byte &= ~mask; |
160 |
|
} |
161 |
|
} |
162 |
|
|
163 |
return FT_Err_Ok; |
return FT_Err_Ok; |
164 |
|
} |
165 |
|
|
166 |
new_pitch = ( bitmap->width + xpixels + ppb - 1 ) / ppb; |
new_pitch = ( bitmap->width + xpixels + ppb - 1 ) / ppb; |
167 |
|
|
214 |
if ( !bitmap ) |
if ( !bitmap ) |
215 |
return FT_Err_Invalid_Argument; |
return FT_Err_Invalid_Argument; |
216 |
|
|
217 |
|
xstr = FT_PIX_ROUND( xStrength ) >> 6; |
218 |
|
ystr = FT_PIX_ROUND( yStrength ) >> 6; |
219 |
|
|
220 |
switch ( bitmap->pixel_mode ) |
switch ( bitmap->pixel_mode ) |
221 |
{ |
{ |
222 |
case FT_PIXEL_MODE_GRAY2: |
case FT_PIXEL_MODE_GRAY2: |
223 |
case FT_PIXEL_MODE_GRAY4: |
case FT_PIXEL_MODE_GRAY4: |
224 |
return FT_Err_Invalid_Glyph_Format; |
return FT_Err_Invalid_Glyph_Format; |
225 |
|
case FT_PIXEL_MODE_LCD: |
226 |
|
xstr *= 3; |
227 |
|
break; |
228 |
|
case FT_PIXEL_MODE_LCD_V: |
229 |
|
ystr *= 3; |
230 |
|
break; |
231 |
} |
} |
232 |
|
|
|
xstr = FT_PIX_ROUND( xStrength ) >> 6; |
|
|
ystr = FT_PIX_ROUND( yStrength ) >> 6; |
|
|
|
|
233 |
if ( xstr == 0 && ystr == 0 ) |
if ( xstr == 0 && ystr == 0 ) |
234 |
return FT_Err_Ok; |
return FT_Err_Ok; |
235 |
else if ( xstr < 0 || ystr < 0 || xstr > 8 ) |
else if ( xstr < 0 || ystr < 0 || xstr > 8 ) |
278 |
break; |
break; |
279 |
#endif |
#endif |
280 |
} |
} |
281 |
else if ( bitmap->pixel_mode == FT_PIXEL_MODE_GRAY ) |
else |
282 |
{ |
{ |
283 |
if ( x - i >= 0 ) |
if ( x - i >= 0 ) |
284 |
{ |
{ |
285 |
if ( p[x] + p[x - i] > bitmap->num_grays ) |
if ( p[x] + p[x - i] > bitmap->num_grays - 1 ) |
286 |
{ |
{ |
287 |
p[x] = bitmap->num_grays; |
p[x] = bitmap->num_grays - 1; |
288 |
break; |
break; |
289 |
} |
} |
290 |
else |
else |
291 |
{ |
{ |
292 |
p[x] += p[x - i]; |
p[x] += p[x - i]; |
293 |
if ( p[x] == bitmap->num_grays ) |
if ( p[x] == bitmap->num_grays - 1 ) |
294 |
break; |
break; |
295 |
} |
} |
296 |
} |
} |