Position Independent Code (PIC) support in smooth renderer.

* src/smooth/ftsmooth.h declare ft_smooth_renderer_class,
ft_smooth_lcd_renderer_class and ft_smooth_lcd_v_renderer_class
using macros from ftrender.h,
when FT_CONFIG_OPTION_PIC is defined create and destroy
functions will be declared.
* src/smooth/ftsmooth.c when FT_CONFIG_OPTION_PIC is defined
the following structs:
ft_smooth_renderer_class, ft_smooth_lcd_renderer_class
and ft_smooth_lcd_v_renderer_class
will have functions to init or create and destroy them
instead of being allocated in the global scope.
And macros will be used from ftspic.h in order to access
ft_grays_raster from the pic_container (allocated in ftgrays.c).

* src/smooth/ftgrays.h include FT_CONFIG_CONFIG_H
* src/smooth/ftgrays.c when FT_CONFIG_OPTION_PIC is NOT defined
func_interface was moved from gray_convert_glyph_inner function
to the global scope.
When FT_CONFIG_OPTION_PIC is defined
func_interface and ft_grays_raster structs
will have functions to init them
instead of being allocated in the global scope.
And func_interface will be allocated on the stack of
gray_convert_glyph_inner.

New Files:
* src/smooth/ftspic.h declare struct to hold PIC globals for smooth
renderer and macros to access them.
* src/smooth/ftspic.c implement functions to allocate, destroy and
initialize PIC globals for smooth renderer.

* src/smooth/smooth.c add new file to build: ftspic.c.
* src/smooth/jamfile add new files to FT2_MULTI build: ftspic.c.
This commit is contained in:
Oran Agra 2009-04-05 18:14:04 +03:00
parent cb3b61416b
commit c1e22f3986
9 changed files with 220 additions and 38 deletions

View File

@ -1,3 +1,41 @@
2009-04-05 Oran Agra <oran@monfort.co.il>
Position Independent Code (PIC) support in smooth renderer.
* src/smooth/ftsmooth.h declare ft_smooth_renderer_class,
ft_smooth_lcd_renderer_class and ft_smooth_lcd_v_renderer_class
using macros from ftrender.h,
when FT_CONFIG_OPTION_PIC is defined create and destroy
functions will be declared.
* src/smooth/ftsmooth.c when FT_CONFIG_OPTION_PIC is defined
the following structs:
ft_smooth_renderer_class, ft_smooth_lcd_renderer_class
and ft_smooth_lcd_v_renderer_class
will have functions to init or create and destroy them
instead of being allocated in the global scope.
And macros will be used from ftspic.h in order to access
ft_grays_raster from the pic_container (allocated in ftgrays.c).
* src/smooth/ftgrays.h include FT_CONFIG_CONFIG_H
* src/smooth/ftgrays.c when FT_CONFIG_OPTION_PIC is NOT defined
func_interface was moved from gray_convert_glyph_inner function
to the global scope.
When FT_CONFIG_OPTION_PIC is defined
func_interface and ft_grays_raster structs
will have functions to init them
instead of being allocated in the global scope.
And func_interface will be allocated on the stack of
gray_convert_glyph_inner.
New Files:
* src/smooth/ftspic.h declare struct to hold PIC globals for smooth
renderer and macros to access them.
* src/smooth/ftspic.c implement functions to allocate, destroy and
initialize PIC globals for smooth renderer.
* src/smooth/smooth.c add new file to build: ftspic.c.
* src/smooth/jamfile add new files to FT2_MULTI build: ftspic.c.
2009-04-05 Oran Agra <oran@monfort.co.il>
Position Independent Code (PIC) support in cff driver.

View File

@ -16,7 +16,7 @@ SubDir FT2_TOP $(FT2_SRC_DIR) smooth ;
if $(FT2_MULTI)
{
_sources = ftgrays ftsmooth ;
_sources = ftgrays ftsmooth ftspic ;
}
else
{

View File

@ -188,6 +188,7 @@
#endif /* !_STANDALONE_ */
#include "ftspic.h"
#ifndef FT_MEM_SET
#define FT_MEM_SET( d, s, c ) ft_memset( d, s, c )
@ -1666,23 +1667,25 @@
} TBand;
static int
gray_convert_glyph_inner( RAS_ARG )
{
static
const FT_Outline_Funcs func_interface =
{
FT_DEFINE_OUTLINE_FUNCS(func_interface,
(FT_Outline_MoveTo_Func) gray_move_to,
(FT_Outline_LineTo_Func) gray_line_to,
(FT_Outline_ConicTo_Func)gray_conic_to,
(FT_Outline_CubicTo_Func)gray_cubic_to,
0,
0
};
)
static int
gray_convert_glyph_inner( RAS_ARG )
{
volatile int error = 0;
#ifdef FT_CONFIG_OPTION_PIC
FT_Outline_Funcs func_interface;
Init_Class_func_interface(&func_interface);
#endif
if ( ft_setjmp( ras.jump_buffer ) == 0 )
{
@ -2037,8 +2040,7 @@
}
const FT_Raster_Funcs ft_grays_raster =
{
FT_DEFINE_RASTER_FUNCS(ft_grays_raster,
FT_GLYPH_FORMAT_OUTLINE,
(FT_Raster_New_Func) gray_raster_new,
@ -2046,7 +2048,7 @@
(FT_Raster_Set_Mode_Func)0,
(FT_Raster_Render_Func) gray_raster_render,
(FT_Raster_Done_Func) gray_raster_done
};
)
/* END */

View File

@ -28,6 +28,7 @@
#include "ftimage.h"
#else
#include <ft2build.h>
#include FT_CONFIG_CONFIG_H /* for FT_CONFIG_OPTION_PIC */
#include FT_IMAGE_H
#endif

View File

@ -22,6 +22,7 @@
#include FT_OUTLINE_H
#include "ftsmooth.h"
#include "ftgrays.h"
#include "ftspic.h"
#include "ftsmerrs.h"
@ -384,10 +385,8 @@
}
FT_CALLBACK_TABLE_DEF
const FT_Renderer_Class ft_smooth_renderer_class =
{
{
FT_DEFINE_RENDERER(ft_smooth_renderer_class,
FT_MODULE_RENDERER,
sizeof( FT_RendererRec ),
@ -400,7 +399,7 @@
(FT_Module_Constructor)ft_smooth_init,
(FT_Module_Destructor) 0,
(FT_Module_Requester) 0
},
,
FT_GLYPH_FORMAT_OUTLINE,
@ -409,14 +408,12 @@
(FT_Renderer_GetCBoxFunc) ft_smooth_get_cbox,
(FT_Renderer_SetModeFunc) ft_smooth_set_mode,
(FT_Raster_Funcs*) &ft_grays_raster
};
(FT_Raster_Funcs*) &FT_GRAYS_RASTER_GET
)
FT_CALLBACK_TABLE_DEF
const FT_Renderer_Class ft_smooth_lcd_renderer_class =
{
{
FT_DEFINE_RENDERER(ft_smooth_lcd_renderer_class,
FT_MODULE_RENDERER,
sizeof( FT_RendererRec ),
@ -429,7 +426,7 @@
(FT_Module_Constructor)ft_smooth_init,
(FT_Module_Destructor) 0,
(FT_Module_Requester) 0
},
,
FT_GLYPH_FORMAT_OUTLINE,
@ -438,15 +435,11 @@
(FT_Renderer_GetCBoxFunc) ft_smooth_get_cbox,
(FT_Renderer_SetModeFunc) ft_smooth_set_mode,
(FT_Raster_Funcs*) &ft_grays_raster
};
(FT_Raster_Funcs*) &FT_GRAYS_RASTER_GET
)
FT_DEFINE_RENDERER(ft_smooth_lcdv_renderer_class,
FT_CALLBACK_TABLE_DEF
const FT_Renderer_Class ft_smooth_lcdv_renderer_class =
{
{
FT_MODULE_RENDERER,
sizeof( FT_RendererRec ),
@ -459,7 +452,7 @@
(FT_Module_Constructor)ft_smooth_init,
(FT_Module_Destructor) 0,
(FT_Module_Requester) 0
},
,
FT_GLYPH_FORMAT_OUTLINE,
@ -468,8 +461,8 @@
(FT_Renderer_GetCBoxFunc) ft_smooth_get_cbox,
(FT_Renderer_SetModeFunc) ft_smooth_set_mode,
(FT_Raster_Funcs*) &ft_grays_raster
};
(FT_Raster_Funcs*) &FT_GRAYS_RASTER_GET
)
/* END */

View File

@ -28,15 +28,15 @@ FT_BEGIN_HEADER
#ifndef FT_CONFIG_OPTION_NO_STD_RASTER
FT_EXPORT_VAR( const FT_Renderer_Class ) ft_std_renderer_class;
FT_DECLARE_RENDERER( ft_std_renderer_class )
#endif
#ifndef FT_CONFIG_OPTION_NO_SMOOTH_RASTER
FT_EXPORT_VAR( const FT_Renderer_Class ) ft_smooth_renderer_class;
FT_DECLARE_RENDERER( ft_smooth_renderer_class )
FT_EXPORT_VAR( const FT_Renderer_Class ) ft_smooth_lcd_renderer_class;
FT_DECLARE_RENDERER( ft_smooth_lcd_renderer_class )
FT_EXPORT_VAR( const FT_Renderer_Class ) ft_smooth_lcd_v_renderer_class;
FT_DECLARE_RENDERER( ft_smooth_lcd_v_renderer_class )
#endif

97
src/smooth/ftspic.c Normal file
View File

@ -0,0 +1,97 @@
/***************************************************************************/
/* */
/* ftspic.c */
/* */
/* The FreeType position independent code services for smooth module. */
/* */
/* Copyright 2009 by */
/* Oran Agra and Mickey Gabel. */
/* */
/* This file is part of the FreeType project, and may only be used, */
/* modified, and distributed under the terms of the FreeType project */
/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
/* this file you indicate that you have read the license and */
/* understand and accept it fully. */
/* */
/***************************************************************************/
#include <ft2build.h>
#include FT_FREETYPE_H
#include FT_INTERNAL_OBJECTS_H
#include "ftspic.h"
#ifdef FT_CONFIG_OPTION_PIC
/* forward declaration of PIC init functions from ftgrays.c */
void FT_Init_Class_ft_grays_raster(FT_Raster_Funcs*);
void
ft_smooth_renderer_class_pic_free( FT_Library library )
{
FT_PIC_Container* pic_container = &library->pic_container;
FT_Memory memory = library->memory;
if ( pic_container->smooth )
{
SmoothPIC* container = (SmoothPIC*)pic_container->smooth;
if(--container->ref_count)
return;
FT_FREE( container );
pic_container->smooth = NULL;
}
}
FT_Error
ft_smooth_renderer_class_pic_init( FT_Library library )
{
FT_PIC_Container* pic_container = &library->pic_container;
FT_Error error = FT_Err_Ok;
SmoothPIC* container;
FT_Memory memory = library->memory;
/* since this function also serve smooth_lcd and smooth_lcdv renderers,
it implements reference counting */
if(pic_container->smooth)
{
((SmoothPIC*)pic_container->smooth)->ref_count++;
return error;
}
/* allocate pointer, clear and set global container pointer */
if ( FT_ALLOC ( container, sizeof ( *container ) ) )
return error;
FT_MEM_SET( container, 0, sizeof(*container) );
pic_container->smooth = container;
container->ref_count = 1;
/* initialize pointer table - this is how the module usually expects this data */
FT_Init_Class_ft_grays_raster(&container->ft_grays_raster);
/*Exit:*/
if(error)
ft_smooth_renderer_class_pic_free(library);
return error;
}
/* re-route these init and free functions to the above functions */
FT_Error ft_smooth_lcd_renderer_class_pic_init(FT_Library library)
{
return ft_smooth_renderer_class_pic_init(library);
}
void ft_smooth_lcd_renderer_class_pic_free(FT_Library library)
{
ft_smooth_renderer_class_pic_free(library);
}
FT_Error ft_smooth_lcdv_renderer_class_pic_init(FT_Library library)
{
return ft_smooth_renderer_class_pic_init(library);
}
void ft_smooth_lcdv_renderer_class_pic_free(FT_Library library)
{
ft_smooth_renderer_class_pic_free(library);
}
#endif /* FT_CONFIG_OPTION_PIC */
/* END */

50
src/smooth/ftspic.h Normal file
View File

@ -0,0 +1,50 @@
/***************************************************************************/
/* */
/* ftspic.h */
/* */
/* The FreeType position independent code services for smooth module. */
/* */
/* Copyright 2009 by */
/* Oran Agra and Mickey Gabel. */
/* */
/* This file is part of the FreeType project, and may only be used, */
/* modified, and distributed under the terms of the FreeType project */
/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
/* this file you indicate that you have read the license and */
/* understand and accept it fully. */
/* */
/***************************************************************************/
#ifndef __FTSPIC_H__
#define __FTSPIC_H__
FT_BEGIN_HEADER
#include FT_INTERNAL_PIC_H
#ifndef FT_CONFIG_OPTION_PIC
#define FT_GRAYS_RASTER_GET ft_grays_raster
#else /* FT_CONFIG_OPTION_PIC */
typedef struct SmoothPIC_
{
int ref_count;
FT_Raster_Funcs ft_grays_raster;
} SmoothPIC;
#define GET_PIC(lib) ((SmoothPIC*)((lib)->pic_container.smooth))
#define FT_GRAYS_RASTER_GET (GET_PIC(library)->ft_grays_raster)
#endif /* FT_CONFIG_OPTION_PIC */
/* */
FT_END_HEADER
#endif /* __FTSPIC_H__ */
/* END */

View File

@ -19,6 +19,7 @@
#define FT_MAKE_OPTION_SINGLE_OBJECT
#include <ft2build.h>
#include "ftspic.c"
#include "ftgrays.c"
#include "ftsmooth.c"