summaryrefslogtreecommitdiff
path: root/src/svg/ftsvg.c
blob: f40999a4a7ed9cf8f08047a13c4ba2fc7a4242bc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/****************************************************************************
 *
 * ftsvg.c
 *
 *   The FreeType svg renderer interface (body).
 *
 * Copyright (C) 1996-2019 by
 * David Turner, Robert Wilhelm, Werner Lemberg and Moazin Khatti.
 *
 * 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_SVG_RENDER_H
#include FT_BBOX_H

#include <stdio.h>

#include "ftsvg.h"

  /* ft_svg_init */
  static FT_Error
  ft_svg_init( SVG_Renderer svg_module )
  {
    FT_Error    error = FT_Err_Ok;
    svg_module->loaded = FALSE;
    return error;
  }

  static void
  ft_svg_done( SVG_Renderer svg_module )
  {
    FT_Library  library = svg_module->root.root.library;
    if ( svg_module->loaded == TRUE )
      svg_module->hooks.free_svg( library );
    svg_module->loaded = FALSE;
  }

  static FT_Error
  ft_svg_render( FT_Renderer       renderer,
                 FT_GlyphSlot      slot,
                 FT_Render_Mode    mode,
                 const FT_Vector*  origin )
  {
    SVG_Renderer  svg_renderer = (SVG_Renderer)renderer;
    FT_Library    library      = renderer->root.library;
    FT_Memory     memory       = library->memory;
    FT_BBox       outline_bbox;
    FT_Error      error;
    FT_ULong       size_image_buffer;

    SVG_RendererHooks hooks = svg_renderer->hooks;


    if ( svg_renderer->loaded == FALSE )
    {
      error = hooks.init_svg( library );
      svg_renderer->loaded = TRUE;
    }

    /* Let's calculate the bounding box in font units here */
    error = FT_Outline_Get_BBox( &slot->outline, &outline_bbox );
    if( error != FT_Err_Ok )
      return error;

    size_image_buffer = hooks.get_buffer_size( slot, outline_bbox );

    FT_MEM_ALLOC( slot->bitmap.buffer, size_image_buffer );
    if ( error )
      return error;

    return hooks.render_svg( slot, outline_bbox );
  }

  static FT_Error
  ft_svg_set_hooks( FT_Module                     module,
                    SVG_Lib_Init_Func             init_svg,
                    SVG_Lib_Free_Func             free_svg,
                    SVG_Lib_Render_Func           render_svg,
                    SVG_Lib_Get_Buffer_Size_Func  get_buffer_size )
  {
    SVG_Renderer  renderer;

    renderer = (SVG_Renderer)module;
    renderer->hooks.init_svg   = init_svg;
    renderer->hooks.free_svg   = free_svg;
    renderer->hooks.render_svg = render_svg;

    renderer->hooks.get_buffer_size = get_buffer_size;

    return FT_Err_Ok;
  }


  static const SVG_Renderer_Interface svg_renderer_interface =
  {
    (SVG_Set_Hooks_Func)ft_svg_set_hooks
  };


  FT_DEFINE_RENDERER(
    ft_svg_renderer_class,

      FT_MODULE_RENDERER,
      sizeof( SVG_RendererRec ),

      "ot-svg",
      0x10000L,
      0x20000L,
      (const void*)&svg_renderer_interface,   /* module specific interface */
      (FT_Module_Constructor)ft_svg_init,     /* module_init */
      (FT_Module_Destructor)ft_svg_done,      /* module_done */
      NULL,
      FT_GLYPH_FORMAT_SVG,
      (FT_Renderer_RenderFunc)ft_svg_render,
      NULL,
      NULL,
      NULL,
      NULL
  )