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 36 FT_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 136 FT_END_HEADER 137 138 #endif /* FTSDFCOMMON_H_ */ 139 140 141 /* END */ 142