* src/sdf/ftsdf.c: Added the citation of the original paper
and added a overview of the process for generating SDF
from outlines.
* src/sdf/ftsdf.c (sdf_generate_subdivision): Added comment
explaining how the optimization works.
* src/base/ftobjs.c (ft_remove_renderer): Similar to
`ft_add_renderer', remover raster's `glyph_format'
check. Due to this the rasterizers which do not have
`glyph_format' of `FT_GLYPH_FORMAT_OUTLINE' won't get
deallocated (the `raster_done' function is no called).
* src/sdf/ftsdf.c (sdf_generate_with_overlaps): Deallocate
the temporary bitmaps, and all the rest of the arrays.
And also handle the `shape' appropriately so as to not
cause memory leaks.
* src/sdf/ftsdf.c (sdf_generate_with_overlaps): Handle
Handle Post-Script fonts for overlap support. Simply
flip the orientation while combining all the separate
SDF.
Also, handle the `flip_sign' property separately so as
to avoid handling extra cases.
* src/sdf/ftsdfrend.h (SDF_Renderer_Module): Removed the
expermental `optimization' property.
Added another property `overlaps', which can be used to
turn on the overlap support.
* src/sdf/ftsdf.h (SDF_Raster_Params): Ditto as above.
* src/sdf/ftsdfrend.c (*): Added functionality to set
and get the new `overlaps' property.
* src/sdf/ftsdf.c (sdf_raster_render):
Removed support for all the optimization modes and
only keep the subdivision optimization and the new
overlap support function.
* src/sdf/ftsdf.c (sdf_generate_coarse_grid): Turned
off until we can find a way to make it faster.
* src/sdf/ftsdf.c (sdf_generate_with_overlaps): Added
a function to generate SDF for shapes with overlapping
contours. It basically generate SDF for separate contours
in seperate bitmaps and then combine them to remove
overlaps.
* src/sdf/ftsdf.c (SDF_Contour_Orientation): Added
enum to hold the different orientations of a contour.
* src/sdf/ftsdf.c (get_contour_orientation): Added
function which can be used to compute the orientation
of a contour.
* src/sdf/ftbsdf.c (*): Remove completed `[TODO]'s.
* src/sdf/ftbsdf.c (bsdf_init_distance_map): Handle
monochrome bitmaps and convert them to the internal
intermediate format, which can then be used to
generate SDF.
* src/sdf/ftbsdf.c (bsdf_raster_render): Release the
allocated distance map.
Also, added a log of total memory allocated for
generating SDF from bitmap.
* src/sdf/ftbsdf.c (finalize_sdf): First check if the
value is withing [-spread, spread] and then cast it
to 6.10 short, otherwise the value can overflow and
give negative result.
Also, flip the sign if the property `flip_sign' is
set to true.
* src/sdf/ftbsdf.c (bsdf_is_edge): Modified the function
to use distance map rather than the alpha values from
the source image.
* src/sdf/ftbsdf.c (bsdf_approximate_edge): Only calculate
approximate edges for edge pixels. Use `bsdf_is_edge' is
to check for edge pixels. For non edge pixel assgn far
away distances.
* src/sdf/ftbsdf.c (finalize_sdf): Handle distances in case
of squared distances.
And also use the macro `VECTOR_LENGTH_16D16' in the entire
code to compute vector length. This takes care of squared
distances.
* src/sdf/ftsdfcommon.c (VECTOR_LENGTH_16D16): Move the macro
`VECTOR_LENGTH_16D16' from `ftsdf.c' to this file because
it is also used by the `bsdf' renderer.
* src/sdf/ftbsdf.c (ED: sign => alpha): Renamed sign
to alphs. This is used to store the alpha of the current
pixel mapped to the source image. This let's us store
additional information without increasing memory usage.
* src/sdf/ftbsdf.c (bsdf_init_distance_map): Removed any/all
kind of edge approximation and edge check from the function.
The function simply copy the source bitmap to the distance
map now, preserving alpha values.
* src/sdf/ftbsdf.c (compute_edge_distance): Use the new `alpha'
parameter to compute gradient and approximate distance.
Previously we were using the `dist' variable to store alpha
values, which restricts modifying the `dist' variable because
we need alpha values of neighbor to compute the gradient.
* src/sdf/ftbsdf.c (bsdf_approximate_edge): Now that we can
modify the `dist' variable of the distance map, we can
combine the two nested loops.
* src/sdf/ftbsdf.c (finalize_sdf): Move the `sign' determination
and assignment to this function.
* src/sdf/ftbsdf.c (compute_gradient => compute_edge_distance):
Renamed to make sense of what the function does.
Also, added the explanation of the algorithm used
and a high level view of how it works.
* src/sdf/ftbsdf.c (compare_neighbor): Fix a bug related
to value approximation before calling `FT_Vector_Length'.
* src/sdf/ftsdfcommon.h: Added new file which contains
common function, macros, properties for both `sdf' and
`bsdf' renderer.
* src/sdf/ftsdf.c, src/sdf/ftsdf.h, src/sdf/ftbsdf.c:
Remove common properties and include `ftsdfcommon.h'.
* src/sdf/rules.mk (SDF_DRV_H): Add the new `ftsdfcommon.h'
file to include list.
* src/sdf/ftbsdf.c (bsdf_approximate_edge): The function
uses the Gustavson's algorithm to approximate the edge
from pixel values.
* src/sdf/ftbsdf.c (compute_gradient): The function uses
Sobel's operator to compute the gradient at a pixel.
The is used to detect edge direction.
Use function `compare_neighbor' for comparing the
neighbors. Makes it easier to tweak the algorithm
and looks better.
* src/sdf/ftbsdf.c (compare_neighbor): Added function
to compare the neighbors and assign values if the
new distance is the shortest.
Added edge detection algorithm. It works by checking
the neighboring pixels and if any neighbor is not
filled (i.e. belongs to background) we mark the
pixel as edge by setting it's distance to 0.
* src/sdf/ftbsdf.c (bsdf_is_edge): Added function to
detect if the pixel is an edge.
Added the second pass of the 8SED algorithm. The second pass
transverse the bitmap from bottom to top and for each row
it sweeps forward and backward assigning distances to the
grid points.
* src/sdf/ftbsdf.c (second_pas): Added function to do the
second pass of the 8SED algorithm on the bitmap.
* src/sdf/ftbsdf.c (first_pass): Optimize the first
pass by first approximating the neighbor's distance
by adding an offset. The offset will be max root(2)
because the maximum be add to a vector is (1, 1).
By approximating we can reduce the number of
`FT_Vector_Length' calls and thus make the process
faster.
* src/sdf/rules.mk (SDF_DRV_H): Manually add source files
as there is a `ftbsdf.c' file without any `ftbsdf.h'.
* src/sdf/ftbsdf.c: Include `fttrigon.h' for `multi' builds.
Added the first pass of the 8SED algorithm. The first pass
transverse the bitmap from top to bottom and for each row
it sweeps forward and backward assigning distances to the
grid points.
* src/sdf/ftbsdf.c (ED): Added additional parameter `sign'.
* src/sdf/ftbsdf.c (edt8): Added function to convert bitmap
to SDF using the 8SED algorithm.
* src/sdf/ftbsdf.c (first_pass): Added function to do the
first pass of the 8SED algorithm on the bitmap.
* src/sdf/ftbsdf.c (finalize_sdf): Added function to assign
the final SDF data to the target bitmap.
* src/sdf/ftbsdf.c (*): Various minor or experimental changes.
* src/sdf/ftsdfrend.c (ft_bsdf_render): Fix spacing.
Due to the way the 8SED algorithm works we need to keep
a track of distances and nearest point of all the pixels/
grid points.
* src/sdf/ftbsdf.c (BSDF_TRaster): Added struct to
hold the `FT_Memory' reference, to be used to allocate
memory.
* src/sdf/ftbsdf.c (ED, BSDF_Worker): Added few more
essential struct. `ED' contains infomation about the
nearest point. `BSDF_Worker' is used to combine all
the essentail parameters to functions.
* src/sdf/ftbsdf.c (bsdf_copy_source_to_target =>
bsdf_init_distance_map): Renamed.
* src/sdf/ftbsdf.c (*): Various minor changes.
* src/sdf/sdf.c: Change the order of source include
because `ftsdf.c' change some internal freetype
defines which are required in `ftbsdf.c'.
* src/sdf/ftbsdf.c (bsdf_copy_source_to_target): Added
extra parameter to flip the bitmap vertically.
* src/sdf/ftbsdf.c (bsdf_copy_source_to_target):
Implemented functionality to convert 8bits per
pixel bitmap to a 16bits per pixel bitmap, which
will be used to generate SDF.
* src/sdf/ftbsdf.c (*): Fix line endings.
* src/sdf/ftbsdf.c (bsdf_copy_source_to_target): Added
function to copy the source bitmap to the center of
the target bitmap and also convert it to normalized
16 bits per pixel bitmap.
* src/base/ftobjs.c (FT_Render_Glyph_Internal): Remove
the bitmap check which prevent calling renderers
if the glyph is already a bitmap. The `bsdf' renderer
requires a bitmap for conversion.
* src/base/ftobjs.c (ft_add_renderer): Remove the glyph
format check which ensures that the glyph format for
a renderer is `FT_GLYPH_FORMAT_OUTLINE', again the `bsdf'
renderer has `FT_GLYPH_FORMAT_BITMAP' as a glyph format,
so we need to remove the condition to initialize the
renderer properly.
* src/sdf/ftbsdf.c (*): Added a rasterizer for the
`bsdf' renderer and created necessary functions.
* src/sdf/ftbsdf.h: Add forward declaration of the
rasterizer.
* src/sdf/ftsdfrend.c (ft_bitmap_sdf_renderer_class):
Define the new `bsdf' rendere and add the
`FT_Renderer_RenderFunc' function, the rest is
same as the `sdf' renderer.
* src/sdf/ftsdfrend.h: Add forward declaration of the
renderer.
* src/sdf/rules.mk (SDF_DRV_SRC): Add the new `ftbsdf.c'
file to the compile list.
* src/sdf/sdf.c: Inclue the `ftbsdf.c' file if making
single object.
* src/sdf/ftsdf.c (*): Add `sdf_alloc' and `sdf_free'
to allocate and deallocate memory respectively.
By using function we can directly use them in the
conditional statements, which is not possible when
using `do {} while ( 0 )'.
* src/sdf/ftsdf.c (SDF_MEMORY_TRACKER_): When not
debugging don't leave the macros empty otherwise
some compiler may emit warning because of empty
`;' semi-colon.
* src/sdf/ftsdfrend.* (*): Added new renderer
named `bsdf' which basically convert bitmap
to signed distance fields. This is a part of
the `sdf' module and not a separate module on
it's own.
* src/sdf/module.mk (FTMODULE_H_COMMANDS): Add
the new renderer to the list of modules.
* include/freetype/config/ftmodule.h: Add the
new renderer to default list of modules when
not compiling with GNU Make.
* src/sdfb/rules.mk (SDFB_DRV_H): Fix name of
the module specific error file `ftsdfberrs.h'.
* src/sdf/ftsdf.h (Optimizations): Fix warning.
`warning: comma at end of enumerator list [-Wpedantic]'
* src/sdf/ftsdf.c (sdf_generate_coarse_grid): Remove
unused variable `cindex', causes warning.
`warning: unused variable 'cindex' [-Wunused-variable]'
* src/sdfb/sdfb.c, src/sdfb/ftsdfbrend.c,
src/sdfb/ftsdfb.c, src/sdfb/ftsdfbrend.h,
src/sdfb/ftsdfb.h, src/sdfb/ftsdfberrs.h:
Added files required by the `sdfb' renderer module.
* src/sdfb/rules.mk, src/sdfb/module.mk: Added
files required to build the `sdfb' module using
the default build system.
* CMakeLists.txt (BASE_SRCS): Add `src/sdfb/sdfb.c'
to the variable.
* include/freetype/config/ftmodule.h: Added `sdfb'
module declaration so that the module can be compiled
when not compiling with GNU make.
* modules.cfg (RASTER_MODULES): Include `sdfb' module
to the default rasterizer module list.
* include/freetype/ftmoderr.h: sdfb module error define
* src/sdf/rules.mk: Add EOF.
* src/sdf/ftsdf.c (SDF_MemoryUser): Added struct
which is used in place of `FT_Memory::user'.
* src/sdf/ftsdf.c (SDF_ALLOC, SDF_FREE): Added macros
for allocating and deallocating memory. These macros
restore the old `FT_Memory::user' before calling the
relevant allocation/deallocation functions so as to
not cause errors while debugging memory. And later
they add the allocated memory size in a variable.
* src/sdf/ftsdf.c (*): Use `SDF_ALLOC', `SDF_FREE'
instead of the `FT_' variant.