2020-08-16 13:39:22 +02:00
|
|
|
|
2020-08-20 05:47:38 +02:00
|
|
|
#include <freetype/internal/ftobjs.h>
|
|
|
|
#include <freetype/internal/ftdebug.h>
|
|
|
|
#include <freetype/internal/ftmemory.h>
|
|
|
|
#include <freetype/fttrigon.h>
|
|
|
|
|
|
|
|
#include "ftsdf.h"
|
|
|
|
#include "ftsdferrs.h"
|
|
|
|
#include "ftsdfcommon.h"
|
|
|
|
|
|
|
|
|
|
|
|
/**************************************************************************
|
|
|
|
*
|
|
|
|
* useful macros
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define ONE 65536 /* 1 in 16.16 */
|
|
|
|
|
|
|
|
|
|
|
|
/**************************************************************************
|
|
|
|
*
|
|
|
|
* structs
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
/**************************************************************************
|
|
|
|
*
|
|
|
|
* @Struct:
|
|
|
|
* BSDF_TRaster
|
|
|
|
*
|
|
|
|
* @Description:
|
|
|
|
* This struct is used in place of @FT_Raster and is stored within the
|
|
|
|
* internal FreeType renderer struct. While rasterizing this is passed
|
|
|
|
* to the @FT_Raster_RenderFunc function, which then can be used however
|
|
|
|
* we want.
|
|
|
|
*
|
|
|
|
* @Fields:
|
|
|
|
* memory ::
|
|
|
|
* Used internally to allocate intermediate memory while raterizing.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
typedef struct BSDF_TRaster_
|
|
|
|
{
|
|
|
|
FT_Memory memory;
|
|
|
|
|
|
|
|
} BSDF_TRaster;
|
|
|
|
|
|
|
|
|
|
|
|
/**************************************************************************
|
|
|
|
*
|
|
|
|
* @Struct:
|
|
|
|
* ED
|
|
|
|
*
|
|
|
|
* @Description:
|
|
|
|
* Euclidean distance. It gets used for Euclidean distance transforms;
|
|
|
|
* it can also be interpreted as an edge distance.
|
|
|
|
*
|
|
|
|
* @Fields:
|
|
|
|
* dist ::
|
|
|
|
* Vector length of the `near` parameter. Can be squared or absolute
|
|
|
|
* depending on the `USE_SQUARED_DISTANCES` macro defined in file
|
|
|
|
* `ftsdfcommon.h`.
|
|
|
|
*
|
|
|
|
* near ::
|
|
|
|
* Vector to the nearest edge. Can also be interpreted as shortest
|
|
|
|
* distance of a point.
|
|
|
|
*
|
|
|
|
* alpha ::
|
|
|
|
* Alpha value of the original bitmap from which we generate SDF.
|
|
|
|
* Needed for computing the gradient and determining the proper sign
|
|
|
|
* of a pixel.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
typedef struct ED_
|
|
|
|
{
|
|
|
|
FT_16D16 dist;
|
|
|
|
FT_16D16_Vec near;
|
|
|
|
FT_Byte alpha;
|
|
|
|
|
|
|
|
} ED;
|
|
|
|
|
|
|
|
|
|
|
|
/**************************************************************************
|
|
|
|
*
|
|
|
|
* @Struct:
|
|
|
|
* BSDF_Worker
|
|
|
|
*
|
|
|
|
* @Description:
|
|
|
|
* A convenience struct that is passed to functions while generating
|
|
|
|
* SDF; most of those functions require the same parameters.
|
|
|
|
*
|
|
|
|
* @Fields:
|
|
|
|
* distance_map ::
|
|
|
|
* A one-dimensional array that gets interpreted as two-dimensional
|
|
|
|
* one. It contains the Euclidean distances of all points of the
|
|
|
|
* bitmap.
|
|
|
|
*
|
|
|
|
* width ::
|
|
|
|
* Width of the above `distance_map`.
|
|
|
|
*
|
|
|
|
* rows ::
|
|
|
|
* Number of rows in the above `distance_map`.
|
|
|
|
*
|
|
|
|
* params ::
|
|
|
|
* Internal parameters and properties required by the rasterizer. See
|
|
|
|
* file `ftsdf.h` for more.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
typedef struct BSDF_Worker_
|
|
|
|
{
|
|
|
|
ED* distance_map;
|
|
|
|
|
|
|
|
FT_Int width;
|
|
|
|
FT_Int rows;
|
|
|
|
|
|
|
|
SDF_Raster_Params params;
|
|
|
|
|
|
|
|
} BSDF_Worker;
|
|
|
|
|
|
|
|
|
|
|
|
/**************************************************************************
|
|
|
|
*
|
|
|
|
* initializer
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
static const ED zero_ed = { 0, { 0, 0 }, 0 };
|
|
|
|
|
2020-08-16 13:39:22 +02:00
|
|
|
|
|
|
|
/* END */
|