Github User Fetcher 1.0.0
C Application with Server and GUI
Loading...
Searching...
No Matches
otsvg.h
Go to the documentation of this file.
1/****************************************************************************
2 *
3 * otsvg.h
4 *
5 * Interface for OT-SVG support related things (specification).
6 *
7 * Copyright (C) 2022-2024 by
8 * David Turner, Robert Wilhelm, Werner Lemberg, and Moazin Khatti.
9 *
10 * This file is part of the FreeType project, and may only be used,
11 * modified, and distributed under the terms of the FreeType project
12 * license, LICENSE.TXT. By continuing to use, modify, or distribute
13 * this file you indicate that you have read the license and
14 * understand and accept it fully.
15 *
16 */
17
18
19#ifndef OTSVG_H_
20#define OTSVG_H_
21
22#include <freetype/freetype.h>
23
24#ifdef FREETYPE_H
25#error "freetype.h of FreeType 1 has been loaded!"
26#error "Please fix the directory search order for header files"
27#error "so that freetype.h of FreeType 2 is found first."
28#endif
29
30
32
33
34 /**************************************************************************
35 *
36 * @section:
37 * svg_fonts
38 *
39 * @title:
40 * OpenType SVG Fonts
41 *
42 * @abstract:
43 * OT-SVG API between FreeType and an external SVG rendering library.
44 *
45 * @description:
46 * This section describes the four hooks necessary to render SVG
47 * 'documents' that are contained in an OpenType font's 'SVG~' table.
48 *
49 * For more information on the implementation, see our standard hooks
50 * based on 'librsvg' in the [FreeType Demo
51 * Programs](https://gitlab.freedesktop.org/freetype/freetype-demos)
52 * repository.
53 *
54 */
55
56
57 /**************************************************************************
58 *
59 * @functype:
60 * SVG_Lib_Init_Func
61 *
62 * @description:
63 * A callback that is called when the first OT-SVG glyph is rendered in
64 * the lifetime of an @FT_Library object. In a typical implementation,
65 * one would want to allocate a structure and point the `data_pointer`
66 * to it and perform any library initializations that might be needed.
67 *
68 * @inout:
69 * data_pointer ::
70 * The SVG rendering module stores a pointer variable that can be used
71 * by clients to store any data that needs to be shared across
72 * different hooks. `data_pointer` is essentially a pointer to that
73 * pointer such that it can be written to as well as read from.
74 *
75 * @return:
76 * FreeType error code. 0 means success.
77 *
78 * @since:
79 * 2.12
80 */
81 typedef FT_Error
82 (*SVG_Lib_Init_Func)( FT_Pointer *data_pointer );
83
84
85 /**************************************************************************
86 *
87 * @functype:
88 * SVG_Lib_Free_Func
89 *
90 * @description:
91 * A callback that is called when the `ot-svg` module is being freed.
92 * It is only called if the init hook was called earlier. This means
93 * that neither the init nor the free hook is called if no OT-SVG glyph
94 * is rendered.
95 *
96 * In a typical implementation, one would want to free any state
97 * structure that was allocated in the init hook and perform any
98 * library-related closure that might be needed.
99 *
100 * @inout:
101 * data_pointer ::
102 * The SVG rendering module stores a pointer variable that can be used
103 * by clients to store any data that needs to be shared across
104 * different hooks. `data_pointer` is essentially a pointer to that
105 * pointer such that it can be written to as well as read from.
106 *
107 * @since:
108 * 2.12
109 */
110 typedef void
111 (*SVG_Lib_Free_Func)( FT_Pointer *data_pointer );
112
113
114 /**************************************************************************
115 *
116 * @functype:
117 * SVG_Lib_Render_Func
118 *
119 * @description:
120 * A callback that is called to render an OT-SVG glyph. This callback
121 * hook is called right after the preset hook @SVG_Lib_Preset_Slot_Func
122 * has been called with `cache` set to `TRUE`. The data necessary to
123 * render is available through the handle @FT_SVG_Document, which is set
124 * in the `other` field of @FT_GlyphSlotRec.
125 *
126 * The render hook is expected to render the SVG glyph to the bitmap
127 * buffer that is allocated already at `slot->bitmap.buffer`. It also
128 * sets the `num_grays` value as well as `slot->format`.
129 *
130 * @input:
131 * slot ::
132 * The slot to render.
133 *
134 * @inout:
135 * data_pointer ::
136 * The SVG rendering module stores a pointer variable that can be used
137 * by clients to store any data that needs to be shared across
138 * different hooks. `data_pointer` is essentially a pointer to that
139 * pointer such that it can be written to as well as read from.
140 *
141 * @return:
142 * FreeType error code. 0 means success.
143 *
144 * @since:
145 * 2.12
146 */
147 typedef FT_Error
149 FT_Pointer *data_pointer );
150
151
152 /**************************************************************************
153 *
154 * @functype:
155 * SVG_Lib_Preset_Slot_Func
156 *
157 * @description:
158 * A callback that is called to preset the glyph slot. It is called from
159 * two places.
160 *
161 * 1. When `FT_Load_Glyph` needs to preset the glyph slot.
162 *
163 * 2. Right before the `svg` module calls the render callback hook.
164 *
165 * When it is the former, the argument `cache` is set to `FALSE`. When
166 * it is the latter, the argument `cache` is set to `TRUE`. This
167 * distinction has been made because many calculations that are necessary
168 * for presetting a glyph slot are the same needed later for the render
169 * callback hook. Thus, if `cache` is `TRUE`, the hook can _cache_ those
170 * calculations in a memory block referenced by the state pointer.
171 *
172 * This hook is expected to preset the slot by setting parameters such as
173 * `bitmap_left`, `bitmap_top`, `width`, `rows`, `pitch`, and
174 * `pixel_mode`. It is also expected to set all the metrics for the slot
175 * including the vertical advance if it is not already set. Typically,
176 * fonts have horizontal advances but not vertical ones. If those are
177 * available, they had already been set, otherwise they have to be
178 * estimated and set manually. The hook must take into account the
179 * transformations that have been set, and translate the transformation
180 * matrices into the SVG coordinate system, as the original matrix is
181 * intended for the TTF/CFF coordinate system.
182 *
183 * @input:
184 * slot ::
185 * The glyph slot that has the SVG document loaded.
186 *
187 * cache ::
188 * See description.
189 *
190 * @inout:
191 * data_pointer ::
192 * The SVG rendering module stores a pointer variable that can be used
193 * by clients to store any data that needs to be shared across
194 * different hooks. `data_pointer` is essentially a pointer to that
195 * pointer such that it can be written to as well as read from.
196 *
197 * @return:
198 * FreeType error code. 0 means success.
199 *
200 * @since:
201 * 2.12
202 */
203 typedef FT_Error
205 FT_Bool cache,
206 FT_Pointer *state );
207
208
209 /**************************************************************************
210 *
211 * @struct:
212 * SVG_RendererHooks
213 *
214 * @description:
215 * A structure that stores the four hooks needed to render OT-SVG glyphs
216 * properly. The structure is publicly used to set the hooks via the
217 * @svg-hooks driver property.
218 *
219 * The behavior of each hook is described in its documentation. One
220 * thing to note is that the preset hook and the render hook often need
221 * to do the same operations; therefore, it's better to cache the
222 * intermediate data in a state structure to avoid calculating it twice.
223 * For example, in the preset hook one can draw the glyph on a recorder
224 * surface and later create a bitmap surface from it in the render hook.
225 *
226 * All four hooks must be non-NULL.
227 *
228 * @fields:
229 * init_svg ::
230 * The initialization hook.
231 *
232 * free_svg ::
233 * The cleanup hook.
234 *
235 * render_hook ::
236 * The render hook.
237 *
238 * preset_slot ::
239 * The preset hook.
240 *
241 * @since:
242 * 2.12
243 */
253
254
255 /**************************************************************************
256 *
257 * @struct:
258 * FT_SVG_DocumentRec
259 *
260 * @description:
261 * A structure that models one SVG document.
262 *
263 * @fields:
264 * svg_document ::
265 * A pointer to the SVG document.
266 *
267 * svg_document_length ::
268 * The length of `svg_document`.
269 *
270 * metrics ::
271 * A metrics object storing the size information.
272 *
273 * units_per_EM ::
274 * The size of the EM square.
275 *
276 * start_glyph_id ::
277 * The first glyph ID in the glyph range covered by this document.
278 *
279 * end_glyph_id ::
280 * The last glyph ID in the glyph range covered by this document.
281 *
282 * transform ::
283 * A 2x2 transformation matrix to apply to the glyph while rendering
284 * it.
285 *
286 * delta ::
287 * The translation to apply to the glyph while rendering.
288 *
289 * @note:
290 * When an @FT_GlyphSlot object `slot` is passed down to a renderer, the
291 * renderer can only access the `metrics` and `units_per_EM` fields via
292 * `slot->face`. However, when @FT_Glyph_To_Bitmap sets up a dummy
293 * object, it has no way to set a `face` object. Thus, metrics
294 * information and `units_per_EM` (which is necessary for OT-SVG) has to
295 * be stored separately.
296 *
297 * @since:
298 * 2.12
299 */
315
316
317 /**************************************************************************
318 *
319 * @type:
320 * FT_SVG_Document
321 *
322 * @description:
323 * A handle to an @FT_SVG_DocumentRec object.
324 *
325 * @since:
326 * 2.12
327 */
329
330
332
333#endif /* OTSVG_H_ */
334
335
336/* END */
#define FT_END_HEADER
Definition ftheader.h:57
#define FT_BEGIN_HEADER
Definition ftheader.h:37
void * FT_Pointer
Definition fttypes.h:313
FT_BEGIN_HEADER typedef unsigned char FT_Bool
Definition fttypes.h:111
unsigned long FT_ULong
Definition fttypes.h:256
unsigned char FT_Byte
Definition fttypes.h:157
int FT_Error
Definition fttypes.h:302
unsigned short FT_UShort
Definition fttypes.h:212
FT_BEGIN_HEADER typedef FT_Error(* SVG_Lib_Init_Func)(FT_Pointer *data_pointer)
Definition otsvg.h:82
FT_Error(* SVG_Lib_Render_Func)(FT_GlyphSlot slot, FT_Pointer *data_pointer)
Definition otsvg.h:148
struct FT_SVG_DocumentRec_ FT_SVG_DocumentRec
struct SVG_RendererHooks_ SVG_RendererHooks
void(* SVG_Lib_Free_Func)(FT_Pointer *data_pointer)
Definition otsvg.h:111
struct FT_SVG_DocumentRec_ * FT_SVG_Document
Definition otsvg.h:328
FT_Error(* SVG_Lib_Preset_Slot_Func)(FT_GlyphSlot slot, FT_Bool cache, FT_Pointer *state)
Definition otsvg.h:204
FT_Matrix transform
Definition otsvg.h:311
FT_Size_Metrics metrics
Definition otsvg.h:305
FT_UShort end_glyph_id
Definition otsvg.h:309
FT_UShort start_glyph_id
Definition otsvg.h:308
FT_Vector delta
Definition otsvg.h:312
FT_Byte * svg_document
Definition otsvg.h:302
FT_ULong svg_document_length
Definition otsvg.h:303
FT_UShort units_per_EM
Definition otsvg.h:306
SVG_Lib_Free_Func free_svg
Definition otsvg.h:247
SVG_Lib_Preset_Slot_Func preset_slot
Definition otsvg.h:250
SVG_Lib_Init_Func init_svg
Definition otsvg.h:246
SVG_Lib_Render_Func render_svg
Definition otsvg.h:248