From 40c3ab9041f5a3682cc367f70a176185a90659ab Mon Sep 17 00:00:00 2001 From: Kushal K S V S Date: Thu, 3 Aug 2017 10:36:08 -0700 Subject: [PATCH] script to compile and run --- include/freetype/config/ftoption.h | 2 +- tests/make_png/Makefile | 5 +- tests/make_png/README | 82 +++++++++++++++++++---------- tests/make_png/bitmap.c | 16 ++---- tests/make_png/bitmap.h | 3 +- tests/make_png/make_sprite.c | 6 +-- tests/make_png/runme.sh | 30 +++++++++++ tests/make_png/test.ttf | Bin 0 -> 27296 bytes 8 files changed, 92 insertions(+), 52 deletions(-) create mode 100644 tests/make_png/runme.sh create mode 100644 tests/make_png/test.ttf diff --git a/include/freetype/config/ftoption.h b/include/freetype/config/ftoption.h index a5cb7fff2..95b1572a7 100644 --- a/include/freetype/config/ftoption.h +++ b/include/freetype/config/ftoption.h @@ -118,7 +118,7 @@ FT_BEGIN_HEADER /* rendering technology that produces excellent output without LCD */ /* filtering. */ /* */ -/* #define FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ +#define FT_CONFIG_OPTION_SUBPIXEL_RENDERING /*************************************************************************/ diff --git a/tests/make_png/Makefile b/tests/make_png/Makefile index 70187bf38..b742dbff7 100644 --- a/tests/make_png/Makefile +++ b/tests/make_png/Makefile @@ -4,12 +4,12 @@ SHELL = /bin/sh SRC_SPRITE = make_sprite.c bitmap.c murmur3.c -SRC_LIB = ../../objs/libfreetype.a +SRC_LIB = ./base/lib/libfreetype.a OBJS = $(src:.c=.o) CFLAGS = -Wall -g CC = gcc -INCLUDE = -I ../../include/ +INCLUDE = -I ./base/include/freetype2/ LIBS = -lpng -lharfbuzz -lbz2 -ldl DPI = 72 @@ -25,4 +25,3 @@ clean: - diff --git a/tests/make_png/README b/tests/make_png/README index fd426acbf..d880bbcf7 100644 --- a/tests/make_png/README +++ b/tests/make_png/README @@ -1,48 +1,72 @@ -NOTE: First make freetype library (in the ../../ directory) - make devel - make TODO: Generate HTML page for detailed comparison -/*******************************************************************/ +--------------------------------------------------------------------- -To generate sprite sheets in the /images folder and to generate the -"index.html" (List-View) of the glyphs. +INSTRUCTIONS -By clicking on the Headers of the respective columns,they can be -arranged (in increasing/decreasing order) based on --> Glyph-Index --> Name --> Difference Metric (right now it is the number of pixels that are - different between the base and the test glyph) +NOTE: One version of FreeType is referred as "base" version and the + other as the "test" version. -It displays the whole sprite sheet right now (will be used later) -Hashes will be diplayed (To be implemented) + 1. Get the two versions ready + ------------------------------------- + Make two folders named "test" and "base" preferably in the home + directory. -First compile and install two versions of the FreeType libray -in different folders (with SUBPIXEL_RENDERING enabled in ftoption.h) + Next, download an older version of FreeType (For example : 2.6.5) + ( This being the "test" version of the two) + Go to 'include/freetype/ftoption.h' and uncomment this line + #define FT_CONFIG_OPTION_SUBPIXEL_RENDERING + + 2. Install the two versions + ------------------------------------- + Go to the "test" version's folder and change the default + installation directory to the "test" folder created. -1) make sprite - (set resoluton in DPI by passing argument + ./configure --prefix= + + Compile and install the library + + make + make install + + Repeat step 2. for the "base" version as well. + + 3. Compile the code + ------------------------------------- + Return to this folder and make the binary + + make + + (set resolution in DPI by passing argument example: make DPI=100, if not specified,default is 72) -2) Usage ./sprite + 3. Run the executable + ------------------------------------- - ( is the libfreetype.so from the base vesion ) - ( is the libfreetype.so from the test vesion ) + ./sprite - The path to the "shared library" in usage should be absolute. + is the libfreetype.so from the base vesion. + is the libfreetype.so from the test vesion. - Sprite Sheets will be saved as sprite_$(glyph_index).png + ( and are in /lib/ ) + ( The path to these should be absolute. ) - Render modes similar to generating PNG(s). - -NOTE: If the dimensions of the two glyphs to be compared are -different, comparison is done after aligning the glyphs. -This alignment will effect the 'Difference Metric' based on the -number of rows/columns added. + Open index.html for "list-view" +--------------------------------------------------------------------- +FEATURES + + Generates sprite sheets in the ./images folder. + + Generates "list-view" web-page i.e index.html + + By clicking on the Headers of the respective columns,they can be + arranged (in increasing/decreasing order) based on + -> Glyph-Index + -> Name + -> Difference Metric diff --git a/tests/make_png/bitmap.c b/tests/make_png/bitmap.c index 6e1ff6df2..4ee3e564b 100644 --- a/tests/make_png/bitmap.c +++ b/tests/make_png/bitmap.c @@ -446,23 +446,15 @@ int Compare_Hash(HASH_128* hash_b, HASH_128* hash_t){ return 0; } -void Print_Row( FILE* fp, int index, char* name, int diff, - HASH_128* hash_b, HASH_128* hash_t){ +void Print_Row( FILE* fp, int index, char* name, int diff ) +{ fprintf(fp, "\n\ %04d\n\ %s\n\ %04d\n\ - %08x%08x%08x%08x
%08x%08x%08x%08x\n\ - \n\ - \n", index, name, diff,hash_b->hash[0], - hash_b->hash[1], - hash_b->hash[2], - hash_b->hash[3], - hash_t->hash[0], - hash_t->hash[1], - hash_t->hash[2], - hash_t->hash[3], index); + \n\ + \n", index, name, diff, index); } int First_Column(IMAGE* input){ diff --git a/tests/make_png/bitmap.h b/tests/make_png/bitmap.h index 51e05cdec..c7fb26b2c 100644 --- a/tests/make_png/bitmap.h +++ b/tests/make_png/bitmap.h @@ -80,8 +80,7 @@ int Add_effect(IMAGE* base, IMAGE* test, IMAGE* out, int Effect_ID); /* Stitch 2 PNG files */ void Stitch(IMAGE* left, IMAGE* right, IMAGE* result); /* Print the row in list-view webpage */ -void Print_Row( FILE* fp, int index, char* name, int diff, - HASH_128* hash_b, HASH_128* hash_t); +void Print_Row( FILE* fp, int index, char* name, int diff ); /* Finding the first non-empty (non-white) column */ int First_Column(IMAGE* input); /* Finding the first non-empty (non-white) row */ diff --git a/tests/make_png/make_sprite.c b/tests/make_png/make_sprite.c index ceb95b5ca..603aa2b54 100644 --- a/tests/make_png/make_sprite.c +++ b/tests/make_png/make_sprite.c @@ -338,9 +338,6 @@ int main(int argc, char const *argv[]) \n\
Difference\n\ \n\ - \n\ - 128-bit Hash-values\n\ - \n\ \n\ Images\n\ \n\ @@ -468,8 +465,7 @@ int main(int argc, char const *argv[]) 50 ); } - Print_Row(fp,i,glyph_name,pixel_diff, base_murmur, - test_murmur ); + Print_Row(fp,i,glyph_name,pixel_diff ); } } diff --git a/tests/make_png/runme.sh b/tests/make_png/runme.sh new file mode 100644 index 000000000..9761ad7a2 --- /dev/null +++ b/tests/make_png/runme.sh @@ -0,0 +1,30 @@ +TEST_DIR=$1 +BASE_DIR=$PWD + +cd $TEST_DIR/include/freetype/config/ +sed -i 's/\/\* #define FT_CONFIG_OPTION_SUBPIXEL_RENDERING \*\//#define FT_CONFIG_OPTION_SUBPIXEL_RENDERING /g' ftoption.h + +cd $TEST_DIR +./autogen.sh +./configure --prefix=$BASE_DIR/test/ +make +make install + +cd $BASE_DIR/../.. +./autogen.sh +./configure --prefix=$BASE_DIR/base/ +make +make install + +cd $BASE_DIR +make + +BASE_LIB=./base/lib/libfreetype.so +TEST_LIB=./test/lib/libfreetype.so + +FONT_FILE=$2 +PT_SIZE=$3 +RENDER_MODE=$4 + +./sprite $BASE_LIB $TEST_LIB $FONT_FILE $PT_SIZE $RENDER_MODE + diff --git a/tests/make_png/test.ttf b/tests/make_png/test.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d03485f0c638ba40e605a451fb6da5a907a57dd5 GIT binary patch literal 27296 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 literal 0 HcmV?d00001