From 9dd15018c26e25886dfb58ffa04886d89ee3c245 Mon Sep 17 00:00:00 2001 From: goksu <25721443+goeksu@users.noreply.github.com> Date: Thu, 25 May 2023 13:46:16 +0300 Subject: [PATCH] ftbench demo with seperate makefile --- .gitignore | 1 + src/tools/ftbench/Makefile | 40 + src/tools/ftbench/fonts/Arial_subset.ttf | Bin 0 -> 48720 bytes src/tools/ftbench/fonts/Roboto_subset.ttf | Bin 0 -> 12732 bytes src/tools/ftbench/fonts/Tahoma_subset.ttf | Bin 0 -> 37120 bytes .../ftbench/fonts/TimesNewRoman_subset.ttf | Bin 0 -> 63212 bytes src/tools/ftbench/fonts/Verdana_subset.ttf | Bin 0 -> 31488 bytes src/tools/ftbench/fonts/sub.sh | 15 + src/tools/ftbench/ftbench.c | 1613 +++++++++++++++++ src/tools/ftbench/mlgetopt.h | 44 + 10 files changed, 1713 insertions(+) create mode 100644 src/tools/ftbench/Makefile create mode 100644 src/tools/ftbench/fonts/Arial_subset.ttf create mode 100644 src/tools/ftbench/fonts/Roboto_subset.ttf create mode 100644 src/tools/ftbench/fonts/Tahoma_subset.ttf create mode 100644 src/tools/ftbench/fonts/TimesNewRoman_subset.ttf create mode 100644 src/tools/ftbench/fonts/Verdana_subset.ttf create mode 100644 src/tools/ftbench/fonts/sub.sh create mode 100644 src/tools/ftbench/ftbench.c create mode 100644 src/tools/ftbench/mlgetopt.h diff --git a/.gitignore b/.gitignore index e4f1510bf..b94251c8a 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ src/dlg/dlg.c subprojects/* !subprojects/*.wrap /tests/data/* +.DS_Store diff --git a/src/tools/ftbench/Makefile b/src/tools/ftbench/Makefile new file mode 100644 index 000000000..a8211ebd5 --- /dev/null +++ b/src/tools/ftbench/Makefile @@ -0,0 +1,40 @@ +# Variables +FTBENCH_SRC = ftbench.c +FTBENCH_BIN = bench.out +FTBENCH_FLAGS = $(shell pkg-config --cflags freetype2) -lfreetype +FONTS = $(wildcard fonts/*.ttf) +BASELINES = $(addprefix baselines/, $(notdir $(FONTS))) +BENCHMARKS = $(addprefix benchmarks/, $(notdir $(FONTS))) + +# Default target +all: $(FTBENCH_BIN) + +# Build ftbench +$(FTBENCH_BIN): $(FTBENCH_SRC) + gcc $(FTBENCH_FLAGS) $(FTBENCH_SRC) -o $(FTBENCH_BIN) + +# Create directories for baselines and benchmarks +baselines/ benchmarks/: + mkdir -p $@ + +# Create a baseline +.PHONY: baseline +baseline: $(FTBENCH_BIN) baselines/ + $(foreach font, $(FONTS), \ + ./$(FTBENCH_BIN) $(font) > baselines/$(notdir $(font)).txt; \ + ) + +# Benchmark and compare to baseline +.PHONY: benchmark +benchmark: $(FTBENCH_BIN) benchmarks/ + $(foreach font, $(FONTS), \ + ./$(FTBENCH_BIN) $(font) > benchmarks/$(notdir $(font)).txt; \ + ) + $(foreach font, $(FONTS), \ + diff baselines/$(notdir $(font)).txt benchmarks/$(notdir $(font)).txt; \ + ) + +.PHONY: clean +clean: + rm -f $(FTBENCH_BIN) + rm -rf baselines/ benchmarks/ diff --git a/src/tools/ftbench/fonts/Arial_subset.ttf b/src/tools/ftbench/fonts/Arial_subset.ttf new file mode 100644 index 0000000000000000000000000000000000000000..be51bfacac4dda4b41f527c3b21befadc49976e2 GIT binary patch literal 48720 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ι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 NAfja_aRN)o{{cw=Ln{CP literal 0 HcmV?d00001 diff --git a/src/tools/ftbench/fonts/Tahoma_subset.ttf b/src/tools/ftbench/fonts/Tahoma_subset.ttf new file mode 100644 index 0000000000000000000000000000000000000000..5d493a8ec58e29cbb6ec09bf9146f4fbea91a9f9 GIT binary patch literal 37120 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 ks`Cf)b5un8W{haxjFE-;xr0A88<+wF7XSbN literal 0 HcmV?d00001 diff --git a/src/tools/ftbench/fonts/TimesNewRoman_subset.ttf b/src/tools/ftbench/fonts/TimesNewRoman_subset.ttf new file mode 100644 index 0000000000000000000000000000000000000000..911dac542841fc5e1765b04bef3e34d1e1dd66ae GIT binary patch literal 63212 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 I6@0PdA7c-2TL1t6 literal 0 HcmV?d00001 diff --git a/src/tools/ftbench/fonts/Verdana_subset.ttf b/src/tools/ftbench/fonts/Verdana_subset.ttf new file mode 100644 index 0000000000000000000000000000000000000000..0d9a47f76fbcf8a677b34d5eb91c71bf3d8fe175 GIT binary patch literal 31488 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 literal 0 HcmV?d00001 diff --git a/src/tools/ftbench/fonts/sub.sh b/src/tools/ftbench/fonts/sub.sh new file mode 100644 index 000000000..3b114cce8 --- /dev/null +++ b/src/tools/ftbench/fonts/sub.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +# Define the Unicode range +unicodes="U+0021-007E" + +# Loop over all .ttf files in the current directory +for fontfile in *.ttf +do + # Generate the output filename + output="${fontfile%.ttf}_subset.ttf" + + # Run the pyftsubset command + pyftsubset "$fontfile" --unicodes=$unicodes --output-file="$output" +done + diff --git a/src/tools/ftbench/ftbench.c b/src/tools/ftbench/ftbench.c new file mode 100644 index 000000000..2f0f2a4e6 --- /dev/null +++ b/src/tools/ftbench/ftbench.c @@ -0,0 +1,1613 @@ +/****************************************************************************/ +/* */ +/* The FreeType project -- a free and portable quality TrueType renderer. */ +/* */ +/* Copyright (C) 2002-2023 by */ +/* D. Turner, R.Wilhelm, and W. Lemberg */ +/* */ +/* ftbench: bench some common FreeType call paths */ +/* */ +/****************************************************************************/ + + +#ifndef _GNU_SOURCE +#define _GNU_SOURCE /* we want to use extensions to `time.h' if available */ +#endif + +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define MAX_MM_AXES 16 + +#ifdef UNIX +#include +#else +#include "mlgetopt.h" +#endif + +#ifdef _WIN32 +#define WIN32_LEAN_AND_MEAN +#include + +/* Specify the timer: QPC for accurate wall time, GPT for user-mode time. */ +/* Otherwise, QPCT cycles are measured accurately but with huge overhead. */ +#define QPC + +#ifdef QPC + double interval; +#endif + +#endif + + + typedef struct btimer_t_ { + double t0; + double total; + + } btimer_t; + + + typedef int + (*bcall_t)( btimer_t* timer, + FT_Face face, + void* user_data ); + + + typedef struct btest_t_ { + const char* title; + bcall_t bench; + int cache_first; + void* user_data; + + } btest_t; + + + typedef struct bcharset_t_ + { + FT_Int size; + FT_ULong* code; + + } bcharset_t; + + + static FT_Error + get_face( FT_Face* face ); + + + /* + * Globals + */ + +#define CACHE_SIZE 1024 +#define BENCH_TIME 2.0 +#define FACE_SIZE 10 + + + static FT_Library lib; + static FTC_Manager cache_man; + static FTC_CMapCache cmap_cache; + static FTC_ImageCache image_cache; + static FTC_SBitCache sbit_cache; + static FTC_ImageTypeRec font_type; + + static FT_MM_Var* multimaster = NULL; + static FT_Fixed design_pos [MAX_MM_AXES]; + static FT_Fixed requested_pos[MAX_MM_AXES]; + static unsigned int requested_cnt = 0; + static unsigned int used_num_axes = 0; + + enum { + FT_BENCH_LOAD_GLYPH, + FT_BENCH_LOAD_ADVANCES, + FT_BENCH_RENDER, + FT_BENCH_GET_GLYPH, + FT_BENCH_CMAP, + FT_BENCH_CMAP_ITER, + FT_BENCH_NEW_FACE, + FT_BENCH_EMBOLDEN, + FT_BENCH_STROKE, + FT_BENCH_GET_BBOX, + FT_BENCH_GET_CBOX, + FT_BENCH_NEW_FACE_AND_LOAD_GLYPH, + N_FT_BENCH + }; + + + static const char* bench_desc[] = + { + "load a glyph (FT_Load_Glyph)", + "load advance widths (FT_Get_Advances)", + "render a glyph (FT_Render_Glyph)", + "load a glyph (FT_Get_Glyph)", + "get glyph indices (FT_Get_Char_Index)", + "iterate CMap (FT_Get_{First,Next}_Char)", + "open a new face (FT_New_Face)", + "embolden (FT_GlyphSlot_Embolden)", + "stroke (FT_Glyph_Stroke)", + "get glyph bbox (FT_Outline_Get_BBox)", + "get glyph cbox (FT_Glyph_Get_CBox)", + + "open face and load glyphs", + NULL + }; + + + static int preload; + static char* filename; + + static int first_index = 0; + static int last_index = INT_MAX; + static int incr_index = 1; + + static int cmap_index = -1; + +#define FOREACH( i ) for ( i = first_index ; \ + ( first_index <= i && i <= last_index ) || \ + ( first_index >= i && i >= last_index ) ; \ + i += incr_index ) + + static FT_Render_Mode render_mode = FT_RENDER_MODE_NORMAL; + static FT_Int32 load_flags = FT_LOAD_DEFAULT; + + static unsigned int tt_interpreter_versions[2]; + static int num_tt_interpreter_versions; + static unsigned int dflt_tt_interpreter_version; + + static unsigned int ps_hinting_engines[2]; + static int num_ps_hinting_engines; + static unsigned int dflt_ps_hinting_engine; + + static char ps_hinting_engine_names[2][10] = { "freetype", + "adobe" }; + + + /* + * Face requester for cache testing + */ + + static FT_Error + face_requester( FTC_FaceID face_id, + FT_Library library, + FT_Pointer request_data, + FT_Face* aface ) + { + FT_UNUSED( face_id ); + FT_UNUSED( library ); + FT_UNUSED( request_data ); + + return get_face( aface ); + } + + + /* + * timer in milliseconds + */ + + static double + get_time( void ) + { + /* NOTE: When building with the Mingw64 toolchain, `_POSIX_TIMERS` is + * defined, but function `clock_gettime` is not. Ensure that the + * `_WIN32` specific timer code appears first here. + */ +#if defined _WIN32 + +#ifdef QPC + LARGE_INTEGER ticks; + + + QueryPerformanceCounter( &ticks ); + + return interval * ticks.QuadPart; + +#elif defined GPT + FILETIME start, end, kern, user; + + + GetProcessTimes( GetCurrentProcess(), &start, &end, &kern, &user ); + + return 0.1 * user.dwLowDateTime + 429496729.6 * user.dwHighDateTime; + +#else + ULONG64 cycles; + + + QueryProcessCycleTime( GetCurrentProcess(), &cycles ); + + return 1e-3 * cycles; /* at 1GHz */ + +#endif + +#elif defined _POSIX_TIMERS && _POSIX_TIMERS > 0 + struct timespec tv; + + +#ifdef _POSIX_CPUTIME + clock_gettime( CLOCK_PROCESS_CPUTIME_ID, &tv ); +#else + clock_gettime( CLOCK_REALTIME, &tv ); +#endif /* _POSIX_CPUTIME */ + + return 1E6 * (double)tv.tv_sec + 1E-3 * (double)tv.tv_nsec; + +#else + /* clock() accuracy has improved since glibc 2.18 */ + return 1E6 * (double)clock() / (double)CLOCKS_PER_SEC; +#endif /* _POSIX_TIMERS */ + } + +#define TIMER_START( timer ) ( timer )->t0 = get_time() +#define TIMER_STOP( timer ) ( timer )->total += get_time() - ( timer )->t0 +#define TIMER_GET( timer ) ( timer )->total +#define TIMER_RESET( timer ) ( timer )->total = 0 + + + /* + * Bench code + */ + + static void + benchmark( FT_Face face, + btest_t* test, + int max_iter, + double max_time ) + { + int n, done; + btimer_t timer, elapsed; + + + if ( test->cache_first ) + { + TIMER_RESET( &timer ); + test->bench( &timer, face, test->user_data ); + } + + printf( " %-25s ", test->title ); + fflush( stdout ); + + TIMER_RESET( &timer ); + TIMER_RESET( &elapsed ); + + for ( n = 0, done = 0; !max_iter || n < max_iter; n++ ) + { + TIMER_START( &elapsed ); + + done += test->bench( &timer, face, test->user_data ); + + TIMER_STOP( &elapsed ); + + if ( TIMER_GET( &elapsed ) > 1E6 * max_time ) + break; + } + + if ( done ) + printf( "%10.3f us/op %10d done\n", + TIMER_GET( &timer ) / (double)done, done ); + else + printf( "no error-free calls\n" ); + } + + + /* + * Various tests + */ + + static int + test_load( btimer_t* timer, + FT_Face face, + void* user_data ) + { + int i, done = 0; + + FT_UNUSED( user_data ); + + + TIMER_START( timer ); + + FOREACH( i ) + { + if ( !FT_Load_Glyph( face, (FT_UInt)i, load_flags ) ) + done++; + } + + TIMER_STOP( timer ); + + return done; + } + + + static int + test_load_advances( btimer_t* timer, + FT_Face face, + void* user_data ) + { + int done = 0; + FT_Fixed* advances; + FT_ULong flags = *((FT_ULong*)user_data); + FT_Int start, count; + + + if ( incr_index > 0 ) + { + start = first_index; + count = last_index - first_index + 1; + } + else + { + start = last_index; + count = first_index - last_index + 1; + } + + advances = (FT_Fixed *)calloc( sizeof ( FT_Fixed ), (size_t)count ); + + TIMER_START( timer ); + + FT_Get_Advances( face, + (FT_UInt)start, (FT_UInt)count, + (FT_Int32)flags, advances ); + done += (int)count; + + TIMER_STOP( timer ); + + free( advances ); + + return done; + } + + + static int + test_render( btimer_t* timer, + FT_Face face, + void* user_data ) + { + int i, done = 0; + + FT_UNUSED( user_data ); + + + FOREACH( i ) + { + if ( FT_Load_Glyph( face, (FT_UInt)i, load_flags ) ) + continue; + + TIMER_START( timer ); + if ( !FT_Render_Glyph( face->glyph, render_mode ) ) + done++; + TIMER_STOP( timer ); + } + + return done; + } + + + static int + test_embolden( btimer_t* timer, + FT_Face face, + void* user_data ) + { + int i, done = 0; + + FT_UNUSED( user_data ); + + + FOREACH( i ) + { + if ( FT_Load_Glyph( face, (FT_UInt)i, load_flags ) ) + continue; + + TIMER_START( timer ); + FT_GlyphSlot_Embolden( face->glyph ); + done++; + TIMER_STOP( timer ); + } + + return done; + } + + + static int + test_stroke( btimer_t* timer, + FT_Face face, + void* user_data ) + { + FT_Glyph glyph; + FT_Stroker stroker; + + int i, done = 0; + + FT_UNUSED( user_data ); + + + FT_Stroker_New( lib, &stroker ); + FT_Stroker_Set( stroker, face->size->metrics.y_ppem, + FT_STROKER_LINECAP_ROUND, + FT_STROKER_LINEJOIN_ROUND, + 0 ); + + FOREACH( i ) + { + if ( FT_Load_Glyph( face, (FT_UInt)i, load_flags ) || + face->glyph->format != FT_GLYPH_FORMAT_OUTLINE || + FT_Get_Glyph( face->glyph, &glyph ) ) + continue; + + TIMER_START( timer ); + FT_Glyph_Stroke( &glyph, stroker, 1 ); + TIMER_STOP( timer ); + + FT_Done_Glyph( glyph ); + done++; + } + + FT_Stroker_Done( stroker ); + + return done; + } + + + static int + test_get_glyph( btimer_t* timer, + FT_Face face, + void* user_data ) + { + FT_Glyph glyph; + + int i, done = 0; + + FT_UNUSED( user_data ); + + + FOREACH( i ) + { + if ( FT_Load_Glyph( face, (FT_UInt)i, load_flags ) ) + continue; + + TIMER_START( timer ); + if ( !FT_Get_Glyph( face->glyph, &glyph ) ) + { + FT_Done_Glyph( glyph ); + done++; + } + TIMER_STOP( timer ); + } + + return done; + } + + + static int + test_get_cbox( btimer_t* timer, + FT_Face face, + void* user_data ) + { + FT_Glyph glyph; + FT_BBox bbox; + + int i, done = 0; + + FT_UNUSED( user_data ); + + + FOREACH( i ) + { + if ( FT_Load_Glyph( face, (FT_UInt)i, load_flags ) ) + continue; + + if ( FT_Get_Glyph( face->glyph, &glyph ) ) + continue; + + TIMER_START( timer ); + FT_Glyph_Get_CBox( glyph, FT_GLYPH_BBOX_PIXELS, &bbox ); + TIMER_STOP( timer ); + + FT_Done_Glyph( glyph ); + done++; + } + + return done; + } + + + static int + test_get_bbox( btimer_t* timer, + FT_Face face, + void* user_data ) + { + FT_BBox bbox; + + int i, done = 0; + + FT_UNUSED( user_data ); + + + FOREACH( i ) + { + if ( FT_Load_Glyph( face, (FT_UInt)i, load_flags ) ) + continue; + + TIMER_START( timer ); + FT_Outline_Get_BBox( &face->glyph->outline, &bbox ); + TIMER_STOP( timer ); + + done++; + } + + return done; + } + + + static int + test_get_char_index( btimer_t* timer, + FT_Face face, + void* user_data ) + { + bcharset_t* charset = (bcharset_t*)user_data; + int i, done = 0; + + + TIMER_START( timer ); + + for ( i = 0; i < charset->size; i++ ) + { + if ( FT_Get_Char_Index(face, charset->code[i]) ) + done++; + } + + TIMER_STOP( timer ); + + return done; + } + + + static int + test_cmap_cache( btimer_t* timer, + FT_Face face, + void* user_data ) + { + bcharset_t* charset = (bcharset_t*)user_data; + int i, done = 0; + + FT_UNUSED( face ); + + + TIMER_START( timer ); + + for ( i = 0; i < charset->size; i++ ) + { + if ( FTC_CMapCache_Lookup( cmap_cache, + font_type.face_id, + cmap_index, + charset->code[i] ) ) + done++; + } + + TIMER_STOP( timer ); + + return done; + } + + + static int + test_image_cache( btimer_t* timer, + FT_Face face, + void* user_data ) + { + FT_Glyph glyph; + + int i, done = 0; + + FT_UNUSED( face ); + FT_UNUSED( user_data ); + + + TIMER_START( timer ); + + FOREACH( i ) + { + if ( !FTC_ImageCache_Lookup( image_cache, + &font_type, + (FT_UInt)i, + &glyph, + NULL ) ) + done++; + } + + TIMER_STOP( timer ); + + return done; + } + + + static int + test_sbit_cache( btimer_t* timer, + FT_Face face, + void* user_data ) + { + FTC_SBit glyph; + + int i, done = 0; + + FT_UNUSED( face ); + FT_UNUSED( user_data ); + + + TIMER_START( timer ); + + FOREACH( i ) + { + if ( !FTC_SBitCache_Lookup( sbit_cache, + &font_type, + (FT_UInt)i, + &glyph, + NULL ) ) + done++; + } + + TIMER_STOP( timer ); + + return done; + } + + + static int + test_cmap_iter( btimer_t* timer, + FT_Face face, + void* user_data ) + { + FT_UInt idx; + FT_ULong charcode; + int done; + + FT_UNUSED( user_data ); + + + TIMER_START( timer ); + + charcode = FT_Get_First_Char( face, &idx ); + done = ( idx != 0 ); + + while ( idx != 0 ) + charcode = FT_Get_Next_Char( face, charcode, &idx ); + + TIMER_STOP( timer ); + + return done; + } + + + static int + test_new_face( btimer_t* timer, + FT_Face face, + void* user_data ) + { + FT_Face bench_face; + + FT_UNUSED( face ); + FT_UNUSED( user_data ); + + + TIMER_START( timer ); + + if ( !get_face( &bench_face ) ) + FT_Done_Face( bench_face ); + + TIMER_STOP( timer ); + + return 1; + } + + + static int + test_new_face_and_load_glyph( btimer_t* timer, + FT_Face face, + void* user_data ) + { + FT_Face bench_face; + + int i, done = 0; + + FT_UNUSED( face ); + FT_UNUSED( user_data ); + + + TIMER_START( timer ); + + if ( !get_face( &bench_face ) ) + { + FOREACH( i ) + { + if ( !FT_Load_Glyph( bench_face, (FT_UInt)i, load_flags ) ) + done++; + } + + FT_Done_Face( bench_face ); + } + + TIMER_STOP( timer ); + + return done; + } + + + /* + * main + */ + + static void + get_charset( FT_Face face, + bcharset_t* charset ) + { + FT_ULong charcode; + int i = 0; + + + charset->code = (FT_ULong*)calloc( (size_t)face->num_glyphs, + sizeof ( FT_ULong ) ); + if ( !charset->code ) + return; + + if ( face->charmap ) + { + FT_UInt idx; + + + charcode = FT_Get_First_Char( face, &idx ); + + /* certain fonts contain a broken charmap that will map character */ + /* codes to out-of-bounds glyph indices. Take care of that here. */ + /* */ + while ( idx && i < face->num_glyphs ) + { + FT_Int gindex = (FT_Int)idx; + + + if ( ( first_index <= gindex && gindex <= last_index ) || + ( first_index >= gindex && gindex >= last_index ) ) + charset->code[i++] = charcode; + charcode = FT_Get_Next_Char( face, charcode, &idx ); + } + } + else + { + int j; + + + /* no charmap, do an identity mapping */ + FOREACH( j ) + charset->code[i++] = (FT_ULong)j; + } + + charset->size = i; + } + + + static void + header( FT_Face face ) + { + const FT_String* target = + render_mode == FT_RENDER_MODE_NORMAL ? "normal" : + render_mode == FT_RENDER_MODE_LIGHT ? "light" : + render_mode == FT_RENDER_MODE_MONO ? "mono" : + render_mode == FT_RENDER_MODE_LCD ? "lcd" : + render_mode == FT_RENDER_MODE_LCD_V ? "lcd-v" : + render_mode == FT_RENDER_MODE_SDF ? "sdf" : ""; + const FT_String* module_name = FT_FACE_DRIVER_NAME( face ); + const FT_String* hinting_engine = ""; + FT_UInt prop; + + + if ( !FT_IS_SCALABLE( face ) ) + hinting_engine = "bitmap"; + + else if ( load_flags & FT_LOAD_NO_SCALE ) + hinting_engine = "unscaled"; + + else if ( load_flags & FT_LOAD_NO_HINTING ) + hinting_engine = "unhinted"; + + else if ( render_mode == FT_RENDER_MODE_LIGHT ) + hinting_engine = "auto"; + + else if ( load_flags == FT_LOAD_FORCE_AUTOHINT ) + hinting_engine = "auto"; + + else if ( !FT_Property_Get( lib, module_name, + "interpreter-version", &prop ) ) + { + switch ( prop ) + { + case TT_INTERPRETER_VERSION_35: + hinting_engine = "v35"; + break; + case TT_INTERPRETER_VERSION_40: + hinting_engine = "v40"; + break; + } + } + + else if ( !FT_Property_Get( lib, module_name, + "hinting-engine", &prop ) ) + { + switch ( prop ) + { + case FT_HINTING_FREETYPE: + hinting_engine = "FT"; + break; + case FT_HINTING_ADOBE: + hinting_engine = "Adobe"; + break; + } + } + + printf( "\n" + "family: %s\n" + " style: %s\n" + "driver: %s %s\n" + "target: %s\n" + " flags: 0x%X\n" + " cmap: %d\n" + "glyphs: %ld\n", + face->family_name, + face->style_name, + module_name, hinting_engine, + target, + load_flags, + FT_Get_Charmap_Index( face->charmap ), + face->num_glyphs ); + } + + + static FT_Error + get_face( FT_Face* face ) + { + static unsigned char* memory_file = NULL; + static size_t memory_size; + int face_index = 0; + FT_Error error; + + + if ( preload ) + { + if ( !memory_file ) + { + FILE* file = fopen( filename, "rb" ); + + + if ( file == NULL ) + { + fprintf( stderr, "couldn't find or open `%s'\n", filename ); + + return 1; + } + + fseek( file, 0, SEEK_END ); + memory_size = (size_t)ftell( file ); + fseek( file, 0, SEEK_SET ); + + memory_file = (FT_Byte*)malloc( memory_size ); + if ( memory_file == NULL ) + { + fprintf( stderr, + "couldn't allocate memory to pre-load font file\n" ); + + return 1; + } + + if ( !fread( memory_file, memory_size, 1, file ) ) + { + fprintf( stderr, "read error\n" ); + free( memory_file ); + memory_file = NULL; + + return 1; + } + } + + error = FT_New_Memory_Face( lib, + memory_file, + (FT_Long)memory_size, + face_index, + face ); + } + else + error = FT_New_Face( lib, filename, face_index, face ); + + if ( error ) + fprintf( stderr, "couldn't load font resource\n"); + + /* Set up MM_Var. */ + if ( requested_cnt != 0 ) + { + unsigned int n; + + + error = FT_Get_MM_Var( *face, &multimaster ); + if ( error ) + { + fprintf( stderr, "couldn't load MultiMaster info\n" ); + return error; + } + + used_num_axes = multimaster->num_axis; + + for ( n = 0; n < used_num_axes; n++ ) + { + FT_Var_Axis* a = multimaster->axis + n; + + + design_pos[n] = n < requested_cnt ? requested_pos[n] : a->def; + + if ( design_pos[n] < a->minimum ) + design_pos[n] = a->minimum; + else if ( design_pos[n] > a->maximum ) + design_pos[n] = a->maximum; + + if ( !FT_IS_SFNT( *face ) ) + design_pos[n] = FT_RoundFix( design_pos[n] ); + } + + error = FT_Set_Var_Design_Coordinates( *face, + used_num_axes, + design_pos ); + if ( error ) + { + fprintf( stderr, "couldn't set design coordinates\n" ); + return error; + } + + FT_Done_MM_Var( lib, multimaster ); + } + + return error; + } + + + static void + usage( void ) + { + int i; + char interpreter_versions[32]; + char hinting_engines[32]; + + + /* we expect that at least one interpreter version is available */ + if ( num_tt_interpreter_versions == 1 ) + snprintf( interpreter_versions, sizeof ( interpreter_versions ), + "%u", + tt_interpreter_versions[0]); + else + snprintf( interpreter_versions, sizeof ( interpreter_versions ), + "%u and %u", + tt_interpreter_versions[0], + tt_interpreter_versions[1] ); + + /* we expect that at least one hinting engine is available */ + if ( num_ps_hinting_engines == 1 ) + snprintf( hinting_engines, sizeof ( hinting_engines ), + "`%s'", + ps_hinting_engine_names[ps_hinting_engines[0]] ); + else + snprintf( hinting_engines, sizeof ( hinting_engines ), + "`%s' and `%s'", + ps_hinting_engine_names[ps_hinting_engines[0]], + ps_hinting_engine_names[ps_hinting_engines[1]] ); + + + fprintf( stderr, + "\n" + "ftbench: run FreeType benchmarks\n" + "--------------------------------\n" + "\n" + "Usage: ftbench [options] fontname\n" + "\n" + " -C Compare with cached version (if available).\n" + " -c N Use at most N iterations for each test\n" + " (0 means time limited).\n" + " -e E Set specific charmap index E.\n" + " -f L Use hex number L as load flags (see `FT_LOAD_XXX').\n" + " -H NAME Use PS hinting engine NAME.\n" + " Available versions are %s; default is `%s'.\n" + " -I VER Use TT interpreter version VER.\n" + " Available versions are %s; default is version %u.\n" + " -i I-J Forward or reverse range of glyph indices to use\n" + " (default is from 0 to the number of glyphs minus one).\n" + " -l N Set LCD filter to N\n" + " 0: none, 1: default, 2: light, 16: legacy\n" + " -m M Set maximum cache size to M KiByte (default is %d).\n", + hinting_engines, + ps_hinting_engine_names[dflt_ps_hinting_engine], + interpreter_versions, + dflt_tt_interpreter_version, + CACHE_SIZE ); + fprintf( stderr, + " -p Preload font file in memory.\n" + " -r N Set render mode to N\n" + " 0: normal, 1: light, 2: mono, 3: LCD, 4: LCD vertical\n" + " (default is 0).\n" + " -s S Use S ppem as face size (default is %dppem).\n" + " If set to zero, don't call FT_Set_Pixel_Sizes.\n" + " Use value 0 with option `-f 1' or something similar to\n" + " load the glyphs unscaled, otherwise errors will show up.\n", + FACE_SIZE ); + fprintf( stderr, + " -t T Use at most T seconds per bench (default is %.0f).\n" + "\n" + " -b tests Perform chosen tests (default is all):\n", + BENCH_TIME ); + + for ( i = 0; i < N_FT_BENCH; i++ ) + { + if ( !bench_desc[i] ) + break; + + fprintf( stderr, + " %c %s\n", 'a' + i, bench_desc[i] ); + } + + fprintf( stderr, + "\n" + " -v Show version.\n" + "\n" ); + + exit( 1 ); + } + + +#define TEST( x ) ( !test_string || strchr( test_string, (x) ) ) + + + static void + parse_design_coords( char *s ) + { + for ( requested_cnt = 0; + requested_cnt < MAX_MM_AXES && *s; + requested_cnt++ ) + { + requested_pos[requested_cnt] = (FT_Fixed)( strtod( s, &s ) * 65536.0 ); + + while ( *s==' ' ) + ++s; + } + } + + + int + main( int argc, + char** argv ) + { + FT_Face face; + FT_Error error; + + unsigned long max_bytes = CACHE_SIZE * 1024; + char* test_string = NULL; + unsigned int size = FACE_SIZE; + int max_iter = 0; + double max_time = BENCH_TIME; + int j; + + unsigned int versions[2] = { TT_INTERPRETER_VERSION_35, + TT_INTERPRETER_VERSION_40 }; + unsigned int engines[2] = { FT_HINTING_FREETYPE, + FT_HINTING_ADOBE }; + int version; + char *engine; + +#if defined _WIN32 && defined QPC + LARGE_INTEGER freq; + + QueryPerformanceFrequency( &freq ); + interval = 1e6 / freq.QuadPart; +#endif + + + if ( FT_Init_FreeType( &lib ) ) + { + fprintf( stderr, "could not initialize font library\n" ); + + return 1; + } + + + /* collect all available versions, then set again the default */ + FT_Property_Get( lib, + "truetype", + "interpreter-version", &dflt_tt_interpreter_version ); + for ( j = 0; j < 2; j++ ) + { + error = FT_Property_Set( lib, + "truetype", + "interpreter-version", &versions[j] ); + if ( !error ) + tt_interpreter_versions[num_tt_interpreter_versions++] = versions[j]; + } + FT_Property_Set( lib, + "truetype", + "interpreter-version", &dflt_tt_interpreter_version ); + + FT_Property_Get( lib, + "cff", + "hinting-engine", &dflt_ps_hinting_engine ); + for ( j = 0; j < 2; j++ ) + { + error = FT_Property_Set( lib, + "cff", + "hinting-engine", &engines[j] ); + if ( !error ) + ps_hinting_engines[num_ps_hinting_engines++] = engines[j]; + } + FT_Property_Set( lib, + "cff", + "hinting-engine", &dflt_ps_hinting_engine ); + FT_Property_Set( lib, + "type1", + "hinting-engine", &dflt_ps_hinting_engine ); + FT_Property_Set( lib, + "t1cid", + "hinting-engine", &dflt_ps_hinting_engine ); + + + version = (int)dflt_tt_interpreter_version; + engine = ps_hinting_engine_names[dflt_ps_hinting_engine]; + + while ( 1 ) + { + int opt; + + + opt = getopt( argc, argv, "a:b:Cc:e:f:H:I:i:l:m:pr:s:t:v" ); + + if ( opt == -1 ) + break; + + switch ( opt ) + { + case 'a': + parse_design_coords( optarg ); + break; + + case 'b': + test_string = optarg; + break; + + case 'C': + FTC_Manager_New( lib, + 0, 0, max_bytes, + face_requester, + NULL, + &cache_man ); + break; + + case 'c': + max_iter = atoi( optarg ); + if ( max_iter < 0 ) + max_iter = -max_iter; + break; + + case 'e': + cmap_index = atoi( optarg ); + break; + + case 'f': + load_flags = strtol( optarg, NULL, 16 ); + break; + + case 'H': + engine = optarg; + + for ( j = 0; j < num_ps_hinting_engines; j++ ) + { + if ( !strcmp( engine, ps_hinting_engine_names[j] ) ) + { + FT_Property_Set( lib, + "cff", + "hinting-engine", &j ); + FT_Property_Set( lib, + "type1", + "hinting-engine", &j ); + FT_Property_Set( lib, + "t1cid", + "hinting-engine", &j ); + break; + } + } + + if ( j == num_ps_hinting_engines ) + fprintf( stderr, + "warning: couldn't set hinting engine\n" ); + break; + + case 'I': + version = atoi( optarg ); + + for ( j = 0; j < num_tt_interpreter_versions; j++ ) + { + if ( version == (int)tt_interpreter_versions[j] ) + { + FT_Property_Set( lib, + "truetype", + "interpreter-version", &version ); + break; + } + } + + if ( j == num_tt_interpreter_versions ) + fprintf( stderr, + "warning: couldn't set TT interpreter version\n" ); + break; + + case 'i': + { + int fi, li; + + if ( sscanf( optarg, "%i%*[,:-]%i", &fi, &li ) == 2 ) + { + first_index = fi < 0 ? 0 : fi; + last_index = li < 0 ? 0 : li; + } + } + break; + + case 'l': + { + int filter = atoi( optarg ); + + + switch ( filter ) + { + case FT_LCD_FILTER_NONE: + case FT_LCD_FILTER_DEFAULT: + case FT_LCD_FILTER_LIGHT: + case FT_LCD_FILTER_LEGACY1: + case FT_LCD_FILTER_LEGACY: + FT_Library_SetLcdFilter( lib, (FT_LcdFilter)filter ); + } + } + break; + + case 'm': + { + int mb = atoi( optarg ); + + + if ( mb > 0 ) + max_bytes = (unsigned int)mb * 1024; + } + break; + + case 'p': + preload = 1; + break; + + case 'r': + { + int rm = atoi( optarg ); + + + if ( rm < 0 || rm >= FT_RENDER_MODE_MAX ) + render_mode = FT_RENDER_MODE_NORMAL; + else + render_mode = (FT_Render_Mode)rm; + } + break; + + case 's': + { + int sz = atoi( optarg ); + + + /* value 0 is special */ + if ( sz < 0 ) + size = 1; + else + size = (unsigned int)sz; + } + break; + + case 't': + max_time = atof( optarg ); + if ( max_time < 0 ) + max_time = -max_time; + break; + + case 'v': + { + FT_Int major, minor, patch; + + + FT_Library_Version( lib, &major, &minor, &patch ); + + printf( "ftbench (FreeType) %d.%d", major, minor ); + if ( patch ) + printf( ".%d", patch ); + printf( "\n" ); + exit( 0 ); + } + /* break; */ + + default: + usage(); + break; + } + } + + argc -= optind; + argv += optind; + + if ( argc != 1 ) + usage(); + + filename = *argv; + + if ( get_face( &face ) ) + goto Exit; + + j = printf( "\n" + "ftbench results for font `%s'\n", + filename ) - 2; + while ( j-- ) + putchar( '-' ); + putchar( '\n' ); + + if ( cmap_index >= face->num_charmaps ) + cmap_index = -1; + if ( cmap_index >= 0 ) + face->charmap = face->charmaps[cmap_index]; + + /* sync target and mode */ + load_flags |= FT_LOAD_TARGET_( render_mode ); + render_mode = (FT_Render_Mode)( ( load_flags & 0xF0000 ) >> 16 ); + + header( face ); + + if ( !face->num_glyphs ) + goto Exit; + + if ( first_index >= face->num_glyphs ) + first_index = face->num_glyphs - 1; + if ( last_index >= face->num_glyphs ) + last_index = face->num_glyphs - 1; + incr_index = last_index > first_index ? 1 : -1; + + if ( size ) + { + if ( FT_IS_SCALABLE( face ) ) + { + if ( FT_Set_Pixel_Sizes( face, size, size ) ) + { + fprintf( stderr, "failed to set pixel size to %u\n", size ); + + return 1; + } + } + else + { + size = (unsigned int)face->available_sizes[0].size >> 6; + fprintf( stderr, + "using size of first bitmap strike (%upx)\n", size ); + FT_Select_Size( face, 0 ); + } + } + + if ( cache_man ) + { + font_type.face_id = (FTC_FaceID)1; + font_type.width = size; + font_type.height = size; + font_type.flags = load_flags; + } + + printf( "\n" + "font preloading into memory: %s\n" + "maximum cache size: %lu KiByte\n", + preload ? "yes" : face->stream->base ? "mapped" : "no", + max_bytes / 1024 ); + + printf( "\n" + "testing glyph indices from %d to %d at %u ppem\n" + "number of seconds for each test: %s%g\n", + first_index, last_index, size, + max_iter ? "at most " : "", max_time ); + if ( max_iter ) + printf( "number of iterations for each test: at most %d\n", + max_iter ); + + printf( "\n" + "executing tests:\n" ); + + for ( j = 0; j < N_FT_BENCH; j++ ) + { + btest_t test; + FT_ULong flags; + + + if ( !TEST( 'a' + j ) ) + continue; + + test.title = NULL; + test.bench = NULL; + test.cache_first = 0; + test.user_data = NULL; + + switch ( j ) + { + case FT_BENCH_LOAD_GLYPH: + test.title = "Load"; + test.bench = test_load; + benchmark( face, &test, max_iter, max_time ); + + if ( cache_man ) + { + test.cache_first = 1; + + if ( !FTC_ImageCache_New( cache_man, &image_cache ) ) + { + test.title = "Load (image cached)"; + test.bench = test_image_cache; + benchmark( face, &test, max_iter, max_time ); + } + + if ( !FTC_SBitCache_New( cache_man, &sbit_cache ) ) + { + test.title = "Load (sbit cached)"; + test.bench = test_sbit_cache; + if ( size ) + benchmark( face, &test, max_iter, max_time ); + else + printf( " %-25s disabled (size = 0)\n", test.title ); + } + } + break; + + case FT_BENCH_LOAD_ADVANCES: + test.user_data = &flags; + + test.title = "Load_Advances (Normal)"; + test.bench = test_load_advances; + flags = FT_LOAD_DEFAULT; + benchmark( face, &test, max_iter, max_time ); + + test.title = "Load_Advances (Fast)"; + test.bench = test_load_advances; + flags = FT_LOAD_TARGET_LIGHT; + benchmark( face, &test, max_iter, max_time ); + + test.title = "Load_Advances (Unscaled)"; + test.bench = test_load_advances; + flags = FT_LOAD_NO_SCALE; + benchmark( face, &test, max_iter, max_time ); + break; + + case FT_BENCH_RENDER: + test.title = "Render"; + test.bench = test_render; + if ( size ) + benchmark( face, &test, max_iter, max_time ); + else + printf( " %-25s disabled (size = 0)\n", test.title ); + break; + + case FT_BENCH_GET_GLYPH: + test.title = "Get_Glyph"; + test.bench = test_get_glyph; + benchmark( face, &test, max_iter, max_time ); + break; + + case FT_BENCH_GET_CBOX: + test.title = "Get_CBox"; + test.bench = test_get_cbox; + benchmark( face, &test, max_iter, max_time ); + break; + + case FT_BENCH_GET_BBOX: + test.title = "Get_BBox"; + test.bench = test_get_bbox; + { + FT_Matrix rot30 = { 0xDDB4, -0x8000, 0x8000, 0xDDB4 }; + + + /* rotate outlines by 30 degrees so that CBox and BBox differ */ + FT_Set_Transform( face, &rot30, NULL ); + benchmark( face, &test, max_iter, max_time ); + FT_Set_Transform( face, NULL, NULL ); + } + break; + + case FT_BENCH_CMAP: + { + bcharset_t charset; + + + get_charset( face, &charset ); + if ( charset.code ) + { + test.user_data = (void*)&charset; + + + test.title = "Get_Char_Index"; + test.bench = test_get_char_index; + + benchmark( face, &test, max_iter, max_time ); + + if ( cache_man && + !FTC_CMapCache_New( cache_man, &cmap_cache ) ) + { + test.cache_first = 1; + + test.title = "Get_Char_Index (cached)"; + test.bench = test_cmap_cache; + benchmark( face, &test, max_iter, max_time ); + } + + free( charset.code ); + } + } + break; + + case FT_BENCH_CMAP_ITER: + test.title = "Iterate CMap"; + test.bench = test_cmap_iter; + benchmark( face, &test, max_iter, max_time ); + break; + + case FT_BENCH_NEW_FACE: + test.title = "New_Face"; + test.bench = test_new_face; + benchmark( face, &test, max_iter, max_time ); + break; + + case FT_BENCH_EMBOLDEN: + test.title = "Embolden"; + test.bench = test_embolden; + if ( size ) + benchmark( face, &test, max_iter, max_time ); + else + printf( " %-25s disabled (size = 0)\n", test.title ); + break; + + case FT_BENCH_STROKE: + test.title = "Stroke"; + test.bench = test_stroke; + if ( size ) + benchmark( face, &test, max_iter, max_time ); + else + printf( " %-25s disabled (size = 0)\n", test.title ); + break; + + case FT_BENCH_NEW_FACE_AND_LOAD_GLYPH: + test.title = "New_Face & load glyph(s)"; + test.bench = test_new_face_and_load_glyph; + benchmark( face, &test, max_iter, max_time ); + break; + } + } + + if ( cache_man ) + FTC_Manager_Done( cache_man ); + + Exit: + /* releases any remaining FT_Face object too */ + FT_Done_FreeType( lib ); + + return 0; + } + + +/* End */ diff --git a/src/tools/ftbench/mlgetopt.h b/src/tools/ftbench/mlgetopt.h new file mode 100644 index 000000000..ce981b1c6 --- /dev/null +++ b/src/tools/ftbench/mlgetopt.h @@ -0,0 +1,44 @@ +/* + * This is a cheap replacement for getopt() because that routine is not + * available on some platforms and behaves differently on other platforms. + * + * This code is hereby expressly placed in the public domain. + * mleisher@crl.nmsu.edu (Mark Leisher) + * 10 October 1997 + */ + +#ifndef MLGETOPT_H_ +#define MLGETOPT_H_ + +#ifdef VMS +#include +#define getopt local_getopt +#define optind local_optind +#define opterr local_opterr +#define optarg local_optarg +#endif + +#ifdef __cplusplus + extern "C" { +#endif + + extern int opterr; + extern int optind; + extern char* optarg; + + extern int getopt( +#ifdef __STDC__ + int argc, + char* const* argv, + const char* pattern +#endif + ); + +#ifdef __cplusplus + } +#endif + +#endif /* MLGETOPT_H_ */ + + +/* End */