summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnuj Verma <anujv@iitbhilai.ac.in>2020-08-17 11:40:57 +0530
committerAnuj Verma <anujv@iitbhilai.ac.in>2020-08-17 11:40:57 +0530
commite087e937e81e34286a8d8703d65b7b31504c43d0 (patch)
tree017f8e919f601d2a214da1db4562c056c33a0aa5
parent29de1ff66826b2b8e5f000f3f600ed63dd5760b5 (diff)
downloadfreetype2-e087e937e81e34286a8d8703d65b7b31504c43d0.tar.gz
[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.
-rw-r--r--src/sdf/ftsdfcommon.h129
-rw-r--r--src/sdf/ftsdferrs.h9
-rw-r--r--src/sdf/ftsdfrend.h89
3 files changed, 227 insertions, 0 deletions
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 <ft2build.h>
+#include FT_CONFIG_CONFIG_H
+#include <freetype/freetype.h>
+
+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 <freetype/ftmoderr.h>
+
+#undef FTERRORS_H_
+
+#undef FT_ERR_PREFIX
+#define FT_ERR_PREFIX Sdf_Err_
+#define FT_ERR_BASE FT_Mod_Err_Sdf
+
+#include <freetype/fterrors.h>
#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 <freetype/ftrender.h>
+#include <freetype/ftmodapi.h>
+#include <freetype/internal/ftobjs.h>
+
+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_ */