1/****************************************************************************
2 *
3 * ftsdfcommon.h
4 *
5 * Auxiliary data for Signed Distance Field support (specification).
6 *
7 * Copyright (C) 2020-2023 by
8 * David Turner, Robert Wilhelm, and Werner Lemberg.
9 *
10 * Written by Anuj Verma.
11 *
12 * This file is part of the FreeType project, and may only be used,
13 * modified, and distributed under the terms of the FreeType project
14 * license, LICENSE.TXT. By continuing to use, modify, or distribute
15 * this file you indicate that you have read the license and
16 * understand and accept it fully.
17 *
18 */
19
20
21 /****************************************************
22 *
23 * This file contains common functions and properties
24 * for both the 'sdf' and 'bsdf' renderers.
25 *
26 */
27
28#ifndef FTSDFCOMMON_H_
29#define FTSDFCOMMON_H_
30
31#include <ft2build.h>
32#include FT_CONFIG_CONFIG_H
33#include <freetype/internal/ftobjs.h>
34
35
36FT_BEGIN_HEADER
37
38
39 /**************************************************************************
40 *
41 * default values (cannot be set individually for each renderer)
42 *
43 */
44
45 /* default spread value */
46#define DEFAULT_SPREAD 8
47 /* minimum spread supported by the renderer */
48#define MIN_SPREAD 2
49 /* maximum spread supported by the renderer */
50#define MAX_SPREAD 32
51 /* pixel size in 26.6 */
52#define ONE_PIXEL ( 1 << 6 )
53
54
55 /**************************************************************************
56 *
57 * common definitions (cannot be set individually for each renderer)
58 *
59 */
60
61 /* If this macro is set to 1 the rasterizer uses squared distances for */
62 /* computation. It can greatly improve the performance but there is a */
63 /* chance of overflow and artifacts. You can safely use it up to a */
64 /* pixel size of 128. */
65#ifndef USE_SQUARED_DISTANCES
66#define USE_SQUARED_DISTANCES 0
67#endif
68
69
70 /**************************************************************************
71 *
72 * common macros
73 *
74 */
75
76 /* convert int to 26.6 fixed-point */
77#define FT_INT_26D6( x ) ( x * 64 )
78 /* convert int to 16.16 fixed-point */
79#define FT_INT_16D16( x ) ( x * 65536 )
80 /* convert 26.6 to 16.16 fixed-point */
81#define FT_26D6_16D16( x ) ( x * 1024 )
82
83
84 /* Convenience macro to call a function; it */
85 /* jumps to label `Exit` if an error occurs. */
86#define FT_CALL( x ) do \
87 { \
88 error = ( x ); \
89 if ( error != FT_Err_Ok ) \
90 goto Exit; \
91 } while ( 0 )
92
93
94 /*
95 * The macro `VECTOR_LENGTH_16D16` computes either squared distances or
96 * actual distances, depending on the value of `USE_SQUARED_DISTANCES`.
97 *
98 * By using squared distances the performance can be greatly improved but
99 * there is a risk of overflow.
100 */
101#if USE_SQUARED_DISTANCES
102#define VECTOR_LENGTH_16D16( v ) ( FT_MulFix( v.x, v.x ) + \
103 FT_MulFix( v.y, v.y ) )
104#else
105#define VECTOR_LENGTH_16D16( v ) FT_Vector_Length( &v )
106#endif
107
108
109 /**************************************************************************
110 *
111 * common typedefs
112 *
113 */
114
115 typedef FT_Vector FT_26D6_Vec; /* with 26.6 fixed-point components */
116 typedef FT_Vector FT_16D16_Vec; /* with 16.16 fixed-point components */
117
118 typedef FT_Int32 FT_16D16; /* 16.16 fixed-point representation */
119 typedef FT_Int32 FT_26D6; /* 26.6 fixed-point representation */
120 typedef FT_Byte FT_SDFFormat; /* format to represent SDF data */
121
122 typedef FT_BBox FT_CBox; /* control box of a curve */
123
124
125 FT_LOCAL( FT_16D16 )
126 square_root( FT_16D16 val );
127
128 FT_LOCAL( FT_SDFFormat )
129 map_fixed_to_sdf( FT_16D16 dist,
130 FT_16D16 max_value );
131
132 FT_LOCAL( FT_SDFFormat )
133 invert_sign( FT_SDFFormat dist );
134
135
136FT_END_HEADER
137
138#endif /* FTSDFCOMMON_H_ */
139
140
141/* END */
142