ref: c1e22f3986d8f7df115f9e5a627c396390cac679
parent: cb3b61416b4271024bbe67f3b9e8a4b23e726b82
author: Oran Agra <[email protected]>
date: Sun Apr 5 14:14:04 EDT 2009
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.
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,43 @@
2009-04-05 Oran Agra <[email protected]>
+ 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 <[email protected]>
+
Position Independent Code (PIC) support in cff driver.
* include/freetype/internal/services/svcid.h add macros to init
--- a/src/smooth/Jamfile
+++ b/src/smooth/Jamfile
@@ -16,7 +16,7 @@
if $(FT2_MULTI)
{
- _sources = ftgrays ftsmooth ;
+ _sources = ftgrays ftsmooth ftspic ;
}
else
{
--- a/src/smooth/ftgrays.c
+++ b/src/smooth/ftgrays.c
@@ -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,13 +1667,7 @@
} 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,
@@ -1679,10 +1674,18 @@
(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 */
--- a/src/smooth/ftgrays.h
+++ b/src/smooth/ftgrays.h
@@ -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
--- a/src/smooth/ftsmooth.c
+++ b/src/smooth/ftsmooth.c
@@ -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 */
--- a/src/smooth/ftsmooth.h
+++ b/src/smooth/ftsmooth.h
@@ -28,15 +28,15 @@
#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
--- /dev/null
+++ b/src/smooth/ftspic.c
@@ -1,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 */
--- /dev/null
+++ b/src/smooth/ftspic.h
@@ -1,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 */
--- a/src/smooth/smooth.c
+++ b/src/smooth/smooth.c
@@ -19,6 +19,7 @@
#define FT_MAKE_OPTION_SINGLE_OBJECT
#include <ft2build.h>
+#include "ftspic.c"
#include "ftgrays.c"
#include "ftsmooth.c"