1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/***************************************************************************/
2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*                                                                         */
3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*  ftspic.c                                                               */
4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*                                                                         */
5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*    The FreeType position independent code services for smooth module.   */
6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*                                                                         */
7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*  Copyright 2009, 2010, 2012, 2013 by                                    */
8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*  Oran Agra and Mickey Gabel.                                            */
9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*                                                                         */
10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*  This file is part of the FreeType project, and may only be used,       */
11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*  modified, and distributed under the terms of the FreeType project      */
12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*  this file you indicate that you have read the license and              */
14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*  understand and accept it fully.                                        */
15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*                                                                         */
16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/***************************************************************************/
17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/ft2build.h"
20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/freetype/freetype.h"
21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/freetype/internal/ftobjs.h"
22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "ftspic.h"
23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "ftsmerrs.h"
24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef FT_CONFIG_OPTION_PIC
27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* forward declaration of PIC init functions from ftgrays.c */
29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  void
30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_Init_Class_ft_grays_raster( FT_Raster_Funcs*  funcs );
31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  void
34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  ft_smooth_renderer_class_pic_free( FT_Library  library )
35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_PIC_Container*  pic_container = &library->pic_container;
37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Memory          memory        = library->memory;
38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( pic_container->smooth )
41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      SmoothPIC*  container = (SmoothPIC*)pic_container->smooth;
43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( --container->ref_count )
46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      FT_FREE( container );
49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      pic_container->smooth = NULL;
50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_Error
55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  ft_smooth_renderer_class_pic_init( FT_Library  library )
56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_PIC_Container*  pic_container = &library->pic_container;
58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Error           error         = FT_Err_Ok;
59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    SmoothPIC*         container     = NULL;
60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Memory          memory        = library->memory;
61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* since this function also serve smooth_lcd and smooth_lcdv renderers,
64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov       it implements reference counting */
65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( pic_container->smooth )
66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      ((SmoothPIC*)pic_container->smooth)->ref_count++;
68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      return error;
69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* allocate pointer, clear and set global container pointer */
72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( FT_ALLOC( container, sizeof ( *container ) ) )
73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      return error;
74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_MEM_SET( container, 0, sizeof ( *container ) );
75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pic_container->smooth = container;
76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    container->ref_count = 1;
78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* initialize pointer table -                       */
80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* this is how the module usually expects this data */
81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Init_Class_ft_grays_raster( &container->ft_grays_raster );
82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return error;
84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* re-route these init and free functions to the above functions */
88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_Error
89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  ft_smooth_lcd_renderer_class_pic_init( FT_Library  library )
90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return ft_smooth_renderer_class_pic_init( library );
92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  void
96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  ft_smooth_lcd_renderer_class_pic_free( FT_Library  library )
97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ft_smooth_renderer_class_pic_free( library );
99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_Error
103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  ft_smooth_lcdv_renderer_class_pic_init( FT_Library  library )
104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return ft_smooth_renderer_class_pic_init( library );
106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  void
110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  ft_smooth_lcdv_renderer_class_pic_free( FT_Library  library )
111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ft_smooth_renderer_class_pic_free( library );
113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* FT_CONFIG_OPTION_PIC */
116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* END */
119