00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include <ft2build.h>
00020 #include FT_INTERNAL_OBJECTS_H
00021 #include FT_OUTLINE_H
00022 #include "ftrend1.h"
00023 #include "ftraster.h"
00024 #include "rastpic.h"
00025
00026 #include "rasterrs.h"
00027
00028
00029
00030 static FT_Error
00031 ft_raster1_init( FT_Renderer render )
00032 {
00033 FT_Library library = FT_MODULE_LIBRARY( render );
00034
00035
00036 render->clazz->raster_class->raster_reset( render->raster,
00037 library->raster_pool,
00038 library->raster_pool_size );
00039
00040 return Raster_Err_Ok;
00041 }
00042
00043
00044
00045 static FT_Error
00046 ft_raster1_set_mode( FT_Renderer render,
00047 FT_ULong mode_tag,
00048 FT_Pointer data )
00049 {
00050
00051 return render->clazz->raster_class->raster_set_mode( render->raster,
00052 mode_tag,
00053 data );
00054 }
00055
00056
00057
00058 static FT_Error
00059 ft_raster1_transform( FT_Renderer render,
00060 FT_GlyphSlot slot,
00061 const FT_Matrix* matrix,
00062 const FT_Vector* delta )
00063 {
00064 FT_Error error = Raster_Err_Ok;
00065
00066
00067 if ( slot->format != render->glyph_format )
00068 {
00069 error = Raster_Err_Invalid_Argument;
00070 goto Exit;
00071 }
00072
00073 if ( matrix )
00074 FT_Outline_Transform( &slot->outline, matrix );
00075
00076 if ( delta )
00077 FT_Outline_Translate( &slot->outline, delta->x, delta->y );
00078
00079 Exit:
00080 return error;
00081 }
00082
00083
00084
00085 static void
00086 ft_raster1_get_cbox( FT_Renderer render,
00087 FT_GlyphSlot slot,
00088 FT_BBox* cbox )
00089 {
00090 FT_MEM_ZERO( cbox, sizeof ( *cbox ) );
00091
00092 if ( slot->format == render->glyph_format )
00093 FT_Outline_Get_CBox( &slot->outline, cbox );
00094 }
00095
00096
00097
00098 static FT_Error
00099 ft_raster1_render( FT_Renderer render,
00100 FT_GlyphSlot slot,
00101 FT_Render_Mode mode,
00102 const FT_Vector* origin )
00103 {
00104 FT_Error error;
00105 FT_Outline* outline;
00106 FT_BBox cbox;
00107 FT_UInt width, height, pitch;
00108 FT_Bitmap* bitmap;
00109 FT_Memory memory;
00110
00111 FT_Raster_Params params;
00112
00113
00114
00115 if ( slot->format != render->glyph_format )
00116 {
00117 error = Raster_Err_Invalid_Argument;
00118 goto Exit;
00119 }
00120
00121
00122 #ifndef FT_CONFIG_OPTION_PIC
00123 if ( mode != FT_RENDER_MODE_MONO )
00124 {
00125
00126 if ( render->clazz == &ft_raster1_renderer_class )
00127 return Raster_Err_Cannot_Render_Glyph;
00128 }
00129 else
00130 {
00131
00132 if ( render->clazz == &ft_raster5_renderer_class )
00133 return Raster_Err_Cannot_Render_Glyph;
00134 }
00135 #else
00136
00137
00138
00139
00140
00141 if ( mode != FT_RENDER_MODE_MONO )
00142 {
00143
00144 if ( render->clazz->root.module_name[6] == '1' )
00145 return Raster_Err_Cannot_Render_Glyph;
00146 }
00147 else
00148 {
00149
00150 if ( render->clazz->root.module_name[6] == '5' )
00151 return Raster_Err_Cannot_Render_Glyph;
00152 }
00153 #endif
00154
00155 outline = &slot->outline;
00156
00157
00158 if ( origin )
00159 FT_Outline_Translate( outline, origin->x, origin->y );
00160
00161
00162 FT_Outline_Get_CBox( outline, &cbox );
00163
00164 cbox.xMin = FT_PIX_FLOOR( cbox.xMin );
00165 cbox.yMin = FT_PIX_FLOOR( cbox.yMin );
00166 cbox.xMax = FT_PIX_CEIL( cbox.xMax );
00167 cbox.yMax = FT_PIX_CEIL( cbox.yMax );
00168
00169 width = (FT_UInt)( ( cbox.xMax - cbox.xMin ) >> 6 );
00170 height = (FT_UInt)( ( cbox.yMax - cbox.yMin ) >> 6 );
00171 bitmap = &slot->bitmap;
00172 memory = render->root.memory;
00173
00174
00175 if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP )
00176 {
00177 FT_FREE( bitmap->buffer );
00178 slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;
00179 }
00180
00181
00182 if ( !( mode & FT_RENDER_MODE_MONO ) )
00183 {
00184
00185 pitch = FT_PAD_CEIL( width, 4 );
00186 bitmap->pixel_mode = FT_PIXEL_MODE_GRAY;
00187 bitmap->num_grays = 256;
00188 }
00189 else
00190 {
00191 pitch = ( ( width + 15 ) >> 4 ) << 1;
00192 bitmap->pixel_mode = FT_PIXEL_MODE_MONO;
00193 }
00194
00195 bitmap->width = width;
00196 bitmap->rows = height;
00197 bitmap->pitch = pitch;
00198
00199 if ( FT_ALLOC_MULT( bitmap->buffer, pitch, height ) )
00200 goto Exit;
00201
00202 slot->internal->flags |= FT_GLYPH_OWN_BITMAP;
00203
00204
00205 FT_Outline_Translate( outline, -cbox.xMin, -cbox.yMin );
00206
00207
00208 params.target = bitmap;
00209 params.source = outline;
00210 params.flags = 0;
00211
00212 if ( bitmap->pixel_mode == FT_PIXEL_MODE_GRAY )
00213 params.flags |= FT_RASTER_FLAG_AA;
00214
00215
00216 error = render->raster_render( render->raster, ¶ms );
00217
00218 FT_Outline_Translate( outline, cbox.xMin, cbox.yMin );
00219
00220 if ( error )
00221 goto Exit;
00222
00223 slot->format = FT_GLYPH_FORMAT_BITMAP;
00224 slot->bitmap_left = (FT_Int)( cbox.xMin >> 6 );
00225 slot->bitmap_top = (FT_Int)( cbox.yMax >> 6 );
00226
00227 Exit:
00228 return error;
00229 }
00230
00231
00232 FT_DEFINE_RENDERER(ft_raster1_renderer_class,
00233
00234 FT_MODULE_RENDERER,
00235 sizeof( FT_RendererRec ),
00236
00237 "raster1",
00238 0x10000L,
00239 0x20000L,
00240
00241 0,
00242
00243 (FT_Module_Constructor)ft_raster1_init,
00244 (FT_Module_Destructor) 0,
00245 (FT_Module_Requester) 0
00246 ,
00247
00248 FT_GLYPH_FORMAT_OUTLINE,
00249
00250 (FT_Renderer_RenderFunc) ft_raster1_render,
00251 (FT_Renderer_TransformFunc)ft_raster1_transform,
00252 (FT_Renderer_GetCBoxFunc) ft_raster1_get_cbox,
00253 (FT_Renderer_SetModeFunc) ft_raster1_set_mode,
00254
00255 (FT_Raster_Funcs*) &FT_STANDARD_RASTER_GET
00256 )
00257
00258
00259
00260
00261
00262
00263 FT_DEFINE_RENDERER(ft_raster5_renderer_class,
00264
00265
00266 FT_MODULE_RENDERER,
00267 sizeof( FT_RendererRec ),
00268
00269 "raster5",
00270 0x10000L,
00271 0x20000L,
00272
00273 0,
00274
00275 (FT_Module_Constructor)ft_raster1_init,
00276 (FT_Module_Destructor) 0,
00277 (FT_Module_Requester) 0
00278 ,
00279
00280 FT_GLYPH_FORMAT_OUTLINE,
00281
00282 (FT_Renderer_RenderFunc) ft_raster1_render,
00283 (FT_Renderer_TransformFunc)ft_raster1_transform,
00284 (FT_Renderer_GetCBoxFunc) ft_raster1_get_cbox,
00285 (FT_Renderer_SetModeFunc) ft_raster1_set_mode,
00286
00287 (FT_Raster_Funcs*) &FT_STANDARD_RASTER_GET
00288 )
00289
00290
00291