Browse Source

avfilter/vf_drawtext: improve glyph shaping and positioning

- text is now shaped using libharfbuz
- glyphs position is now accurate to 1/4 pixel in both directions
- the default line height is now the one defined in the font

Adds libharfbuzz dependency.
yethie 2 years ago
parent
commit
1eeb59a209
3 changed files with 591 additions and 274 deletions
  1. 4 1
      configure
  2. 5 3
      doc/filters.texi
  3. 582 270
      libavfilter/vf_drawtext.c

+ 4 - 1
configure

@@ -236,6 +236,7 @@ External library support:
   --enable-libfontconfig   enable libfontconfig, useful for drawtext filter [no]
   --enable-libfontconfig   enable libfontconfig, useful for drawtext filter [no]
   --enable-libfreetype     enable libfreetype, needed for drawtext filter [no]
   --enable-libfreetype     enable libfreetype, needed for drawtext filter [no]
   --enable-libfribidi      enable libfribidi, improves drawtext filter [no]
   --enable-libfribidi      enable libfribidi, improves drawtext filter [no]
+  --enable-libharfbuzz     enable libharfbuzz, needed for drawtext filter [no]
   --enable-libglslang      enable GLSL->SPIRV compilation via libglslang [no]
   --enable-libglslang      enable GLSL->SPIRV compilation via libglslang [no]
   --enable-libgme          enable Game Music Emu via libgme [no]
   --enable-libgme          enable Game Music Emu via libgme [no]
   --enable-libgsm          enable GSM de/encoding via libgsm [no]
   --enable-libgsm          enable GSM de/encoding via libgsm [no]
@@ -1859,6 +1860,7 @@ EXTERNAL_LIBRARY_LIST="
     libfontconfig
     libfontconfig
     libfreetype
     libfreetype
     libfribidi
     libfribidi
+    libharfbuzz
     libglslang
     libglslang
     libgme
     libgme
     libgsm
     libgsm
@@ -3726,7 +3728,7 @@ dilation_opencl_filter_deps="opencl"
 dnn_classify_filter_select="dnn"
 dnn_classify_filter_select="dnn"
 dnn_detect_filter_select="dnn"
 dnn_detect_filter_select="dnn"
 dnn_processing_filter_select="dnn"
 dnn_processing_filter_select="dnn"
-drawtext_filter_deps="libfreetype"
+drawtext_filter_deps="libfreetype libharfbuzz"
 drawtext_filter_suggest="libfontconfig libfribidi"
 drawtext_filter_suggest="libfontconfig libfribidi"
 elbg_filter_deps="avcodec"
 elbg_filter_deps="avcodec"
 eq_filter_deps="gpl"
 eq_filter_deps="gpl"
@@ -6693,6 +6695,7 @@ enabled fontconfig        && enable libfontconfig
 enabled libfontconfig     && require_pkg_config libfontconfig fontconfig "fontconfig/fontconfig.h" FcInit
 enabled libfontconfig     && require_pkg_config libfontconfig fontconfig "fontconfig/fontconfig.h" FcInit
 enabled libfreetype       && require_pkg_config libfreetype freetype2 "ft2build.h FT_FREETYPE_H" FT_Init_FreeType
 enabled libfreetype       && require_pkg_config libfreetype freetype2 "ft2build.h FT_FREETYPE_H" FT_Init_FreeType
 enabled libfribidi        && require_pkg_config libfribidi fribidi fribidi.h fribidi_version_info
 enabled libfribidi        && require_pkg_config libfribidi fribidi fribidi.h fribidi_version_info
+enabled libharfbuzz       && require_pkg_config libharfbuzz harfbuzz hb.h hb_buffer_create
 enabled libglslang && { check_lib spirv_compiler glslang/Include/glslang_c_interface.h glslang_initialize_process \
 enabled libglslang && { check_lib spirv_compiler glslang/Include/glslang_c_interface.h glslang_initialize_process \
                             -lglslang -lMachineIndependent -lOSDependent -lHLSL -lOGLCompiler -lGenericCodeGen \
                             -lglslang -lMachineIndependent -lOSDependent -lHLSL -lOGLCompiler -lGenericCodeGen \
                             -lSPVRemapper -lSPIRV -lSPIRV-Tools-opt -lSPIRV-Tools -lpthread -lstdc++ -lm ||
                             -lSPVRemapper -lSPIRV -lSPIRV-Tools-opt -lSPIRV-Tools -lpthread -lstdc++ -lm ||

+ 5 - 3
doc/filters.texi

@@ -12344,7 +12344,7 @@ Draw a text string or text from a specified file on top of a video, using the
 libfreetype library.
 libfreetype library.
 
 
 To enable compilation of this filter, you need to configure FFmpeg with
 To enable compilation of this filter, you need to configure FFmpeg with
-@code{--enable-libfreetype}.
+@code{--enable-libfreetype} and @code{--enable-libharfbuzz}.
 To enable default font fallback and the @var{font} option you need to
 To enable default font fallback and the @var{font} option you need to
 configure FFmpeg with @code{--enable-libfontconfig}.
 configure FFmpeg with @code{--enable-libfontconfig}.
 To enable the @var{text_shaping} option, you need to configure FFmpeg with
 To enable the @var{text_shaping} option, you need to configure FFmpeg with
@@ -12372,8 +12372,7 @@ option, check the @ref{color syntax,,"Color" section in the ffmpeg-utils manual,
 The default value of @var{boxcolor} is "white".
 The default value of @var{boxcolor} is "white".
 
 
 @item line_spacing
 @item line_spacing
-Set the line spacing in pixels of the border to be drawn around the box using @var{box}.
-The default value of @var{line_spacing} is 0.
+Set the line spacing in pixels. The default value of @var{line_spacing} is 0.
 
 
 @item borderw
 @item borderw
 Set the width of the border to be drawn around the text using @var{bordercolor}.
 Set the width of the border to be drawn around the text using @var{bordercolor}.
@@ -12873,6 +12872,9 @@ For more information about fontconfig, check:
 For more information about libfribidi, check:
 For more information about libfribidi, check:
 @url{http://fribidi.org/}.
 @url{http://fribidi.org/}.
 
 
+For more information about libharfbuzz, check:
+@url{https://github.com/harfbuzz/harfbuzz}.
+
 @section edgedetect
 @section edgedetect
 
 
 Detect and draw edges. The filter uses the Canny Edge Detection algorithm.
 Detect and draw edges. The filter uses the Canny Edge Detection algorithm.

File diff suppressed because it is too large
+ 582 - 270
libavfilter/vf_drawtext.c


Some files were not shown because too many files changed in this diff