* src/base/ftdebug.c (ft_log_handler): Updates to print logs after
a fixed width for better vertical alignment.
* builds/windows/ftdebug.c (ft_log_handler): Updates to print logs after
a fixed width for better vertical alignment.
* docs/DEBUG: Updates related to `FT_LOGGING'.
* README.git: Updates related to logging
* src/sfnt/ttload.c (tt_face_load_font_dir): Changed layout of tracing
messages.
* builds/windows/vc2010/script.bat: New windows batch file to copy
necessary dlg files from `submodules/dlg' to `src/dlg'. This file is
used as a pre-built event in visual studios.
* builds/windows/ftdebug.c: Added support for logging and logging related
public APIs.
(ft_debug_init): Updates to support the change of levels of tracing
components of FreeType at run-time.
(FT_Trace_Set_Level): New function to change the levels of tracing
components at run-time.
(FT_Trace_Set_Default_Level): New function to reset the levels of
tracing components back to default.
(FT_Set_Log_Handler, FT_Set_Default_Log_Handler, FT_Callback): Added
function definitions.
* builds/windows/vc2010/freetype.vcxproj.filters: Added `src/dlgwrap.c'.
* builds/windows/vc2010/freetype.vcxproj (AdditionalIncludeDirectories):
Added include files of dlg for `Debug' and `Debug Static' configurations
on both `x64' and `win32' platforms.
(PreprocessorDefinitions): Added `FT_LOGGING' for `Debug' and
`Debug Static' configurations on both `x64' and `win32' platforms. Added
`DLG_STATIC' for `Debug' configuration on `x64' and `win32' platforms.
(DisableLanguageExtensions): We need to disable the `/Za' option when
building dlg with FreeType as dlg strictly follows `C99' standards and
the Visual Studios produces unexpected behaviours when compiling a `C99'
file with `/Za' option enabled.
* include/freetype/ftlogging.h (FT_Custom_Log_Handler): New function
pointer to store the custom callback logging function.
(FT_Set_Log_Handler, FT_Set_Default_Log_Handler): New functions to set and
reset custom log handler.
* include/freetype/internal/ftdebug.h: Added variables to support custom
callback logging function.
(FT_Callback): A function to print log using custom callback logging
function, which is set using `FT_Set_Log_Handler'.
* src/base/ftdebug.c: Added support for handling custom logging callback
function.
(FT_Set_Log_Handler, FT_Set_Default_Log_Handler, FT_Callback): Added
function definitions.
related public APIs.
[base] Added a public API to change the levels of tracing components.
* src/base/ftdebug.c: Added new variables.
(ft_debug_init): Updates to support the change of levels of tracing
components of FreeType at run-time.
(FT_Trace_Set_Level): New function to change the levels of tracing
components at run-time.
(FT_Trace_Set_Default_Level): New function to reset the levels of
tracing components back to default.
* include/freetype/ftchapters.h: Added `debugging_apis' section under
`support_api' chapter.
* include/freetype/internal/ftdebug.h (FT_LOGGING_TAG, FT_LOGGING_TAG_):
New macros to resolve the value of `FT_COMPONENT' into a string.
(ft_add_tag, ft_remove_tag): New functions to add and remove dlg tags.
* src/base/ftdebug.c: Added new variables to control the logging of
timestamp and name of `FT_COMPONENT' along with actual logs.
(ft_add_tag, ft_remove_tag): Added function definition.
(ft_log_handler): Updates to print timestamp and name of `FT_COMPONENT'.
(ft_debug_init): If `FT_LOGGING' macro is defined users can now control
the logging of timestamp and name of `FT_COMPONENT' by adding tags in
environment variable `FT2_DEBUG'
* include/freetype/internal/ftdebug.h: Added dlg's header files.
(FT_LOG): New macro to redirect trace logs to dlg's API's whenever
`FT_LOGGING' macros is defined.
(ft_logging_init, ft_logging_deinit): New functions to handle
initialization and uninitialization of logging related variables.
(ft_log_handler): A new function to handle logs of FreeType.
* src/base/ftdebug.c: Added necessary logging related variables.
(ft_logging_init, ft_logging_deinit, ft_log_handler): Added function
definitions.
* src/base/ftinit.c(FT_Init_FreeType): If `FT_LOGGING' macro is defined
call `ft_logging_init' to initialize logging related variables.
(FT_Done_FreeType): If `FT_LOGGING' macro is defined call
`ft_logging_deinit' to uninitialize logging related variables.
* src/base/ftobjs.c (FT_New_Library): Call `ft_debug_init' only if macro
`FT_LOGGING' is not defined.
* autogen.sh (copy_submodule_files): New script to copy all the
necessary dlg's source and include files from `submodules/dlg' to
`src/dlg'
* src/dlg/dlgwrap.c: A wrapper along `src/dlg.c', it enables the
dlg's build only when `FT_LOGGING' maro is defined.
* src/dlg/rules.mk: Makefile to compile dlg library along with
rest of FreeType's modules.
* builds/freetype.mk (DLG_DIR): New variable to include dlg's
header files.
(INCLUDES): Added `DLG_DIR'.
(FT_CFLAGS): Added `-std=c99' flag.
Include `src/dlg/rules.mk' file to build dlg.
(OBJ_S, OBJ_M): Added `DLG_OBJS_M' and `DLG_OBJS_S'.
* builds/toplevel.mk: For builds directly from the git repository
we need to copy files from `submodule/dlg' to `src/dlg
* {include/freetype/config, devel}/ftoption.h (FT_LOGGING): A new
macro to enable or disable the logging facility in FreeType.
For glyphs with OVERLAP_SIMPLE or OVERLAP_COMPOUND, set
FT_OUTLINE_OVERLAP to render them with direct oversampling, which
mitigates artifacts (see 3bb512bc9f).
* include/freetype/ftimage.h (FT_OUTLINE_OVERLAP): Redefine to rhyme
with OVERLAP_SIMPLE.
* src/base/ftgloadr.c (FT_GlyphLoader_Rewind): Reset outline flags.
* src/truetype/ttgload.c
(TT_Load_Simple_Glyph): Retain OVERLAP_SIMPLE.
(load_truetype_glyph): Retain OVERLAP_COMPOUND.
This file can be used to reformat FreeType sources and commits
using one of these methods:
- Direct formatting of a whole file:
clang-format -i path/to/file
For example, to reformat all sources at once:
echo builds/unix/ftconfig.h.in $(git ls-files *.[hc]) | xargs clang-format -i
- Only reformat the changed lines in the current work directoy:
git clang-format
The style settings in this file are very close to the FreeType
formatting style, with the following exceptions which are not supported
here:
- Mminimal 2-space margin on each non-empty line.
(no left margin instead).
- 2 empty lines between variable declarations and statements in C blocks.
(only 1 is kept).
{
int x = ...;
foo(x);
}
becomes
{
int x = ...;
foo(x);
}
- Aignment of declarations uses 2 spaces to separate types and variable
names (only 1 space is kept).
int x; => int x;
int y; int y;
- The start used for output parameters in function signature should be
near the variable name (always near the type).
void foo(int* input_ptr, int *output_ptr)
=> void foo(int* input_ptr, int* output_ptr)
In order to mention the limited accuracy of `FT_Matrix' coefficients
and encourage client code to perform the transform themselves with
floating point values instead.
* include/freetype/internal/autohint.h
(FT_DECLARE_AUTOHINTER_INTERFACE): New macro.
* src/autofit/afmodule.h: Use it to declare
`af_autofitter_interface'.
* include/freetype/internal/ftobjs.h (FT_DECLARE_GLYPH): New macro.
* src/base/ftbase.h: Use it to declare `ft_bitmap_glyph_class' and
`ft_outline_glyph_class'.
* src/base/ftglyph.c: Include `ftbase.h'.
* src/cff/cffparse.c (cff_parser_run): Fix type of `t2_size'.
* src/pcf/pcfdrivr.c (pcf_cmap_char_next): Fix type of `result'.
* src/psaux/psauxmod.c (psaux_module_class): Use `FT_DEFINE_MODULE'.
* src/psaux/psauxmod.h: Declare `afm_parser_funcs',
`t1_cmap_classes', `cff_decoder_funcs', and `psaux_module_class'.
* src/pshinter/pshmod.c: Include `pshmod.h'.
* src/sfnt/sfwoff2.c (ROUND4, WRITE_SHORT): Fix implicit sign
conversion.
(compute_ULong_sum): Fix return type.
Fix implicit sign conversion.
(store_points): Fix type of `last_flag', `repeat_count', and `flag'.
Use casts to avoid warnings.
(reconstruct_glyf): Fix implicit sign conversion.
Use cast to avoid warning.
(get_x_mins): Fix implicit sign conversion.
* src/sfnt/ttcmap.c: Undef `TTCMAPCITEM'.
* src/sfnt/ttcmap.h: Define `TTCMAPCITEM' and include `ttcmapc.h' to
declare cmap classes.
* src/smooth/ftsmooth.c (ft_smooth_overlap_spans): Use cast.
* src/truetype/ttinterp.c (Ins_MIAP): Fix typo.
The following builds were still failing due to previous changes:
make multi
make multi CC="c++"
make CC="c++"
This patch fixes the issues, which were missing includes to get the
right macro definitions in multi-build mode.
Also, `FT_UNUSED' is actually used by third-party code, so move it
back to `public-macros.h' to avoid breaking it.
* include/freetype/config/public-macros.h (FT_EXPORT): Remove
special definition for C++.
(FT_UNUSED): Define here instead of...
* include/freetype/config/compiler-macros.h: ... here.
(FT_FUNCTION_DECLARATION): Remove special definition for C++.
(FT_LOCAL_ARRAY_DEF): Fix definition.
* src/cache/ftccback.h, src/lzw/ftzopen.h, src/gxvalid/gxvmort.h,
src/gxvalid/gxvmorx.h: Add `FT_BEGIN_HEADER' and `FT_END_HEADER'.
The following builds were failing due to previous changes:
make multi
make multi CC="c++"
* include/freetype/config/ftconfig.h: Remove `FT_END_HEADER'.
* include/freetype/config/ftheader.h (FT_BEGIN_HEADER,
FT_END_HEADER): Protect against redefinition.
* src/cache/ftccache.h, src/cache/ftcmru.h, src/pcf/pcfutil.h,
src/psaux/pserror.h, src/psaux/psft.h, src/psaux/psstack.h,
src/sfnt/woff2tags.h: Include `compiler-macros.h'.
* src/sfnt/woff2tags.c: Include `woff2tags.h'.
* src/psaux/t1decode.c (t1_decoder_parse_metrics): Copy
corresponding code from old engine's `t1_decoder_parse_charstrings'
function to handle `op_callsubr' and `op_return'.
* include/freetype/config/public-macros.h
(FT_PUBLIC_FUNCTION_ATTRIBUTE): New macro to tag functions as
public (and thus exportable).
(FT_EXPORT): Use it.
* include/freetype/config/compiler-macros.h
(FT_INTERNAL_FUNCTION_ATTRIBUTE): New macro to tag functions as
internal to the library (and thus hidden). Note that on ELF
systems, all internal functions have hidden visibility, which avoids
the need to enforce this when invoking the compiler (e.g., with an
option like `-fvisibility=hidden').
(FT_FUNCTION_DECLARATION, FT_FUNCTION_DEFINITION): New base macros
to deal with C and C++ linkage issues at the same time.
(FT_LOCAL, FT_LOCAL_DEF, FT_LOCAL_ARRAY, FT_LOCAL_ARRAY_DEF,
FT_BASE, FT_BASE_DEF, FT_EXPORT_VAR, FT_BASE_CALLBACK,
FT_BASE_CALLBACK_DEF): Redefined using new macros.
* builds/unix/ftconfig.h.in, builds/vms/ftconfig.h,
include/freetype/config/ftconfig.h: Split off macro definitions
required by the FreeType API headers to...
* include/freetype/config/public-macros.h: ...this new file.
* builds/unix/ftconfig.h.in, builds/vms/ftconfig.h,
include/freetype/config/ftconfig.h: Split off macro definitions used
by the library but not to be exposed to clients to...
* include/freetype/config/compiler-macros.h: ...this new file.
* include/freetype/internal/*.h, src/raster/ftraster.h: Include
`compiler-macros.h' where needed.
* builds/unix/ftconfig.h.in, builds/vms/ftconfig.h,
include/freetype/config/ftconfig.h: Split off mac-specific stuff
to...
* include/freetype/config/mac-support.h: ...this new file.
* CMakeLists.txt, builds/unix/configure.raw: Remove `/undef ->
#undef' string replacement; the affected code is no longer part of
the `ftconfig.h' template.
Refactor some of the `ftconfig.h' headers and template to move the
definition of the FreeType integer types (e.g., `FT_Int16') to a
common header file `freetype/config/integer-types.h'.
* builds/unix/ftconfig.h.in, builds/vms/ftconfig.h,
include/freetype/config/ftconfig.h: Split off integer type
definition stuff to...
* include/freetype/config/integer-types.h: ...this new file.
* builds/unix/ftconfig.h.in: Control the definition of
`FT_SIZEOF_INT' and `FT_SIZEOF_LONG' with macro
`FT_USE_AUTOCONF_SIZEOF_TYPES'. If these are not defined, auto
detection happens in `integer-types.h' as usual based on `INTXX_MAX'
values. Otherwise the autoconf-detected values are used.
* builds/unix/configure.raw (CPPFLAGS): Don't include path to
`config' directory. Instead, ...
(FT_CONFIG_STANDARD_LIBRARY_H): Use complete path.
Since we are no longer limited to 8.3 file names, it is simpler to
follow the usual conventions for template files.
* builds/unix/ftconfig.in: Renamed to...
* builds/unix/ftconfig.h.in: ...this.
* CMakeLists.txt, builds/unix/configure.raw: Updated.
This implements oversampling to metigate artifacts in pixels partially
covered by overlapping contours. It turns out that the 4x4
oversampling is sufficient but, at least, quadruples the rendering
time. The outline has to set FT_OUTLINE_OVERLAP to use this method.
* include/freetype/ftimage.h (FT_OUTLINE_OVERLAP): New flag.
* src/smooth/ftsmooth.c (ft_smooth_render): Check it to...
(ft_smooth_raster_overlap): ... inflate outline and set up direct
rendering for oversampling with...
(ft_smooth_overlap_spans): ... new span function that integrates them.
Instead of rendering 3 bitmaps side by side and reshuffling, we use
direct rendering to deliver the bitmaps on each third byte.
* src/smooth/ftsmooth.c (ft_smooth_raster_lcd)
[!FT_CONFIG_OPTION_SUBPIXEL_RENDERING]: Set up direct mode with...
(ft_smooth_lcd_spans): ... new span function.
This makes `ft_smooth_render' a lot smaller and easier to follow. It
also cleanly separates Harmony and ClearType-style LCD rendering
algorithms. Now I only wish to move LCD filtering and geometry from
FT_Library to FT_Renderer.
* src/smooth/ftsmooth.c (ft_smooth_render): Move LCD code from here...
(ft_smooth_raster_lcd, ft_smooth_raster_lcdv): ... to here.
[FT_CONFIG_OPTION_SUBPIXEL_RENDERING]: Reorganize #ifdef's.
* src/cff/cffobjs.c (cff_face_init): If a call to `cff_strcpy' fails
by returning NULL in `cff_face_init', `remove_style' is still
called. This means that the NULL pointer is dereferenced, causing a
crash.
* src/cff/cffobjs.c (cff_size_init): If a call to `funcs->create'
fails to allocate one of the `internal->subfont' variables, make
sure to free `internal->topfont' and any successfully allocated
subfonts.
* src/base/ftobjs.c (FT_New_Size): Avoid trying to free
`size->internal`, unless `size' has been allocated. This
mistake appeared in the fix for 58611.
* src/cff/cffobjs.c (cff_slot_done), src/cid/cidobjs.c
(cid_slot_done): If `ft_glyphslot_init' fails to allocate
`internal', then the class' `done_slot' callback (called by
`ft_glyphslot_done') must not dereference the pointer to `internal'.