From e087e937e81e34286a8d8703d65b7b31504c43d0 Mon Sep 17 00:00:00 2001 From: Anuj Verma Date: Mon, 17 Aug 2020 11:40:57 +0530 Subject: [PATCH] [sdf] Added common elements for `sdf' and `bsdf' renderers. * src/sdf/ftsdfrend.c (*): Added common renderer struct and declaration of both the renderers. * src/sdf/ftsdfcommon.h (*): Added common properties, typedefs, macros etc. * src/sdf/ftsdferrs.h (*): Error definitions for the module. --- src/sdf/ftsdfcommon.h | 129 ++++++++++++++++++++++++++++++++++++++++++ src/sdf/ftsdferrs.h | 9 +++ src/sdf/ftsdfrend.h | 89 +++++++++++++++++++++++++++++ 3 files changed, 227 insertions(+) diff --git a/src/sdf/ftsdfcommon.h b/src/sdf/ftsdfcommon.h index b8284ac68..b069077cb 100644 --- a/src/sdf/ftsdfcommon.h +++ b/src/sdf/ftsdfcommon.h @@ -1,7 +1,136 @@ + /**************************************************** + * + * This file contain common function and properties + * for both `sdf' and `bsdf' renderer. + * + */ + #ifndef FTSDFCOMMON_H_ #define FTSDFCOMMON_H_ +#include +#include FT_CONFIG_CONFIG_H +#include + +FT_BEGIN_HEADER + + /************************************************************************** + * + * default values (cannot be set individually for each renderer) + * + */ + + /* default spread value */ + #define DEFAULT_SPREAD 8 + + /* minimum spread supported by the renderer. */ + #define MIN_SPREAD 2 + + /* maximum spread supported by the renderer. */ + #define MAX_SPREAD 32 + + /************************************************************************** + * + * common definitions (cannot be set individually for each renderer) + * + */ + + /* If it is defined to 1 then the rasterizer will use squared distances */ + /* for computation. It can greatly improve the performance but there is */ + /* a chance of overflow and artifacts. You can safely use it upto a */ + /* pixel size of 128. */ + #ifndef USE_SQUARED_DISTANCES + # define USE_SQUARED_DISTANCES 0 + #endif + + /************************************************************************** + * + * common macros + * + */ + + /* convert int to 26.6 fixed point */ + #define FT_INT_26D6( x ) ( x * 64 ) + + /* convert int to 16.16 fixed point */ + #define FT_INT_16D16( x ) ( x * 65536 ) + + /* convert 26.6 to 16.16 fixed point */ + #define FT_26D6_16D16( x ) ( x * 1024 ) + + /* Convenient macro which calls the function */ + /* and returns if any error occurs. */ + #define FT_CALL( x ) do \ + { \ + error = ( x ); \ + if ( error != FT_Err_Ok ) \ + goto Exit; \ + } while ( 0 ) + + /* [IMPORTANT]: The macro `VECTOR_LENGTH_16D16' is not always the same */ + /* and must not be used anywhere except a few places. This macro is */ + /* controlled by the `USE_SQUARED_DISTANCES' macro. It compute squared */ + /* distance or actual distance based on `USE_SQUARED_DISTANCES' value. */ + /* By using squared distances the performance can be greatly improved */ + /* but there is a risk of overflow. Use it wisely. */ + #if USE_SQUARED_DISTANCES + # define VECTOR_LENGTH_16D16( v ) ( FT_MulFix( v.x, v.x ) + \ + FT_MulFix( v.y, v.y ) ) + #else + # define VECTOR_LENGTH_16D16( v ) FT_Vector_Length( &v ) + #endif + + /************************************************************************** + * + * common typedefs + * + */ + + typedef FT_Vector FT_26D6_Vec; /* with 26.6 fixed point components */ + typedef FT_Vector FT_16D16_Vec; /* with 16.16 fixed point components */ + + typedef FT_Fixed FT_16D16; /* 16.16 fixed point representation */ + typedef FT_Fixed FT_26D6; /* 26.6 fixed point representation */ + typedef FT_Short FT_6D10; /* 6.10 fixed point representation */ + + typedef FT_BBox FT_CBox; /* control box of a curve */ + + /************************************************************************** + * + * common functions + * + */ + + /* Original Algorithm: https://github.com/chmike/fpsqrt */ + /* Use this to compute the square root of a 16.16 fixed */ + /* point number. */ + static FT_16D16 + square_root( FT_16D16 val ) + { + FT_ULong t, q, b, r; + + + r = val; + b = 0x40000000; + q = 0; + while( b > 0x40 ) + { + t = q + b; + if( r >= t ) + { + r -= t; + q = t + b; + } + r <<= 1; + b >>= 1; + } + q >>= 8; + + return q; + } + +FT_END_HEADER #endif /* FTSDFCOMMON_H_ */ diff --git a/src/sdf/ftsdferrs.h b/src/sdf/ftsdferrs.h index d102e7fde..b9f412fe9 100644 --- a/src/sdf/ftsdferrs.h +++ b/src/sdf/ftsdferrs.h @@ -2,6 +2,15 @@ #ifndef FTSDFERRS_H_ #define FTSDFERRS_H_ +#include + +#undef FTERRORS_H_ + +#undef FT_ERR_PREFIX +#define FT_ERR_PREFIX Sdf_Err_ +#define FT_ERR_BASE FT_Mod_Err_Sdf + +#include #endif /* FTSDFERRS_H_ */ diff --git a/src/sdf/ftsdfrend.h b/src/sdf/ftsdfrend.h index 08cfa4ca2..4131a52f8 100644 --- a/src/sdf/ftsdfrend.h +++ b/src/sdf/ftsdfrend.h @@ -2,6 +2,95 @@ #ifndef FTSDFREND_H_ #define FTSDFREND_H_ +#include +#include +#include + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @struct: + * SDF_Renderer_Module + * + * @description: + * This struct extends the native renderer struct `FT_RendererRec'. + * It is basically used to store various parameters required by the + * renderer and some additional parameters which can be used to + * tweak the output of the renderer. + * + * @fields: + * root :: + * The native rendere struct. + * + * spread :: + * This is an essential parameter/property required by the + * rendere. `spread' defines the maximum unsigned value that + * will be present in the final SDF output. For default value + * check `ftsdfcommon.h'. + * + * flip_sign :: + * By default the position values are inside the contours i.e. + * filled by a contour. If this property is true then that output + * will be opposite from the default i.e. negative will be filled + * by a contour. + * + * flip_y :: + * Setting this parameter to true makes the output image flipped + * along the y-axis. + * + * overlaps :: + * Set this to true to generate SDF for glyphs having overlapping + * contours. The overlapping support is limited to glyph which do + * not have self intersecting contours. Also, removing overlaps + * require a considerable amount of extra memory and this is not + * valid while generating SDF from bitmap. + * + * @note: + * All properties except `overlaps' is valid for both `sdf' and + * `bsdf' renderer. + */ + typedef struct SDF_Renderer_Module_ + { + FT_RendererRec root; + FT_UInt spread; + FT_Bool flip_sign; + FT_Bool flip_y; + FT_Bool overlaps; + + } SDF_Renderer_Module, *SDF_Renderer; + + + /************************************************************************** + * + * @renderer: + * ft_sdf_renderer_class + * + * @description: + * Renderer to convert `FT_Outline' to signed distance fields. + * + */ + FT_DECLARE_RENDERER( ft_sdf_renderer_class ) + + + /************************************************************************** + * + * @renderer: + * ft_bitmap_sdf_renderer_class + * + * @description: + * This is not exactly a renderer, it's just a converter which + * convert bitmaps to signed distance fields. + * + * @note: + * This is not a separate module, it is a part of the `sdf' module. + * + */ + FT_DECLARE_RENDERER( ft_bitmap_sdf_renderer_class ) + + +FT_END_HEADER #endif /* FTSDFREND_H_ */