From 785ce40aa6ac940286d201e7240db7a3f8fee8e2 Mon Sep 17 00:00:00 2001 From: Kushal K S V S Date: Thu, 27 Jul 2017 13:36:10 +0530 Subject: [PATCH] Aligning glyphs and adding white rows/columns --- tests/make_png/README | 82 +++++++------ tests/make_png/bitmap.c | 231 +++++++++++++++++++++++------------ tests/make_png/bitmap.h | 12 +- tests/make_png/make_sprite.c | 8 +- 4 files changed, 206 insertions(+), 127 deletions(-) diff --git a/tests/make_png/README b/tests/make_png/README index eb8a2abec..0c661ce7f 100644 --- a/tests/make_png/README +++ b/tests/make_png/README @@ -2,13 +2,47 @@ NOTE: First make freetype library (in the ../../ directory) make devel make -TODO: Generate HTML page (testing going on) +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. + +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) + +It displays the whole sprite sheet right now (will be used later) +Hashes will be diplayed (To be implemented) + +First compile and install two versions of the FreeType libray +in different folders (with SUBPIXEL_RENDERING enabled in ftoption.h) + + +1) make sprite + (set resoluton in DPI by passing argument + example: make DPI=100, if not specified,default is 72) + +2) Usage ./sprite + + ( is the libfreetype.so from the base vesion ) + ( is the libfreetype.so from the test vesion ) + + The path to the "shared library" in usage should be absolute. + + Sprite Sheets will be saved as sprite_$(glyph_index).png + + 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. -Testing Right Now: Aligning 'base' and 'test' glyphs -1. Using the bottom-left non-white pixel as reference. -2. Using the similarity between the glyphs ( maintaining a score based - on the number of non-white pixels overlapping ) - /*******************************************************************/ (DEPRECATED) To generate hashes and store it in the ./hashes folder, @@ -30,7 +64,7 @@ To generate hashes and store it in the ./hashes folder, 3 - lcd vertical /*******************************************************************/ - +(DEPRECATED) To generate 32-bit RGBA PNG(s) of all glyphs in a font\n 1) make png @@ -51,39 +85,7 @@ To generate 32-bit RGBA PNG(s) of all glyphs in a font\n 4 - lcd vertical-RGB 5 - lcd vertical-BGR -/*******************************************************************/ - -To generate sprite sheets in the /images folder and to generate the -"index.html" (List-View) of the glyphs. - -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) - -It displays the whole sprite sheet right now (will be used later) -Hashes will be dsplayed (To be implemented) - -First compile and install two versions of the FreeType libray -in different folders (with SUBPIXEL_RENDERING enabled in ftoption.h) - - -1) make sprite - (set resoluton in DPI by passing argument - example: make DPI=100, if not specified,default is 72) - -2) Usage ./sprite - - ( is the libfreetype.so from the base vesion ) - ( is the libfreetype.so from the test vesion ) - - The path to the "shared library" in usage should be absolute. - - Sprite Sheets will be saved as sprite_$(glyph_index).png - - Render modes similar to generating PNG(s). + diff --git a/tests/make_png/bitmap.c b/tests/make_png/bitmap.c index 8284eba8c..6f7cbb9ef 100644 --- a/tests/make_png/bitmap.c +++ b/tests/make_png/bitmap.c @@ -334,85 +334,6 @@ void Read_PNG(char *filename, IMAGE * after_effect) { fclose(fp); } -IMAGE* Adjust_Height(IMAGE* small, IMAGE* big){ - - int h_delta; - IMAGE* result = (IMAGE*)malloc(sizeof(IMAGE)); - - result->height = big->height; - result->width = small->width; - result->pixels = - (PIXEL*) malloc(result->width * result->height * sizeof(PIXEL)); - - h_delta = big->height - small->height; - - for (int y = 0; y < h_delta; ++y) - { - for (int x = 0; x < result->width; ++x) - { - PIXEL * pixel_result = Pixel_At ( result, x, y); - - pixel_result->red = 255; - pixel_result->green = 255; - pixel_result->blue = 255; - pixel_result->alpha = 255; - } - } - - for (int y = h_delta; y < result->height; ++y) - { - for (int x = 0; x < result->width; ++x) - { - PIXEL * pixel_small = Pixel_At ( small, x, y - h_delta); - PIXEL * pixel_result = Pixel_At ( result, x, y); - - pixel_result->red = pixel_small->red; - pixel_result->green = pixel_small->green; - pixel_result->blue = pixel_small->blue; - pixel_result->alpha = pixel_small->alpha; - } - } - return result; -} - -IMAGE* Adjust_Width(IMAGE* small, IMAGE* big){ - - IMAGE* result = (IMAGE*)malloc(sizeof(IMAGE)); - - result->height = small->height; - result->width = big->width; - result->pixels = - (PIXEL*) malloc(result->width * result->height * sizeof(PIXEL)); - - for (int x = small->width; x < big->width; ++x) - { - for (int y = 0; y < result->height; ++y) - { - PIXEL * pixel_result = Pixel_At ( result, x, y); - - pixel_result->red = 255; - pixel_result->green = 255; - pixel_result->blue = 255; - pixel_result->alpha = 255; - } - } - - for (int y = 0; y < result->height; ++y) - { - for (int x = 0; x < small->width; ++x) - { - PIXEL * pixel_small = Pixel_At ( small, x, y); - PIXEL * pixel_result = Pixel_At ( result, x, y); - - pixel_result->red = pixel_small->red; - pixel_result->green = pixel_small->green; - pixel_result->blue = pixel_small->blue; - pixel_result->alpha = pixel_small->alpha; - } - } - return result; -} - int Add_effect(IMAGE* base, IMAGE* test, IMAGE* out, int Effect_ID) { int pixel_diff = 0; @@ -540,3 +461,155 @@ void Print_Row( FILE* fp, int index, char* name, int diff, hash_t->hash[2], hash_t->hash[3], index); } + +int First_Column(IMAGE* input){ + + for (int x = 0; x < input->width; ++x) + { + for (int y = 0; y < input->height; ++y) + { + PIXEL * pixel_result = Pixel_At ( input, x, y); + + if ( pixel_result->red == 255 && + pixel_result->green == 255 && + pixel_result->blue == 255 && + pixel_result->alpha == 255 ) + { + continue; + }else{ + return x; + } + } + } + return input->width; +} + +int First_Row(IMAGE* input){ + + for (int y = 0; y < input->height; ++y) + { + for (int x = 0; x < input->width; ++x) + { + PIXEL * pixel_result = Pixel_At ( input, x, y); + + if ( pixel_result->red == 255 && + pixel_result->green == 255 && + pixel_result->blue == 255 && + pixel_result->alpha == 255 ) + { + continue; + }else{ + return y; + } + } + } + return input->height; +} + +IMAGE* Append_Columns(IMAGE* small, IMAGE* big){ + + IMAGE* result = (IMAGE*)malloc(sizeof(IMAGE)); + + result->height = small->height; + result->width = big->width; + result->pixels = + (PIXEL*) malloc(result->width * result->height * sizeof(PIXEL)); + + int first_col = First_Column(big); + + for (int x = 0; x < first_col; ++x) + { + for (int y = 0; y < result->height; ++y) + { + PIXEL * pixel_result = Pixel_At ( result, x, y); + + pixel_result->red = 255; + pixel_result->green = 255; + pixel_result->blue = 255; + pixel_result->alpha = 255; + } + } + + for (int y = 0; y < result->height; ++y) + { + for (int x = first_col; x < first_col + small->width; ++x) + { + PIXEL * pixel_small = Pixel_At ( small, (x - first_col), y); + PIXEL * pixel_result = Pixel_At ( result, x, y); + + pixel_result->red = pixel_small->red; + pixel_result->green = pixel_small->green; + pixel_result->blue = pixel_small->blue; + pixel_result->alpha = pixel_small->alpha; + } + } + + for (int x = first_col + small->width; x < result->width; ++x) + { + for (int y = 0; y < result->height; ++y) + { + PIXEL * pixel_result = Pixel_At ( result, x, y); + + pixel_result->red = 255; + pixel_result->green = 255; + pixel_result->blue = 255; + pixel_result->alpha = 255; + } + } + + return result; +} + +IMAGE* Append_Rows(IMAGE* small, IMAGE* big){ + + IMAGE* result = (IMAGE*)malloc(sizeof(IMAGE)); + + result->height = big->height; + result->width = small->width; + result->pixels = + (PIXEL*) malloc(result->width * result->height * sizeof(PIXEL)); + + int first_row = First_Row(big); + + for (int y = 0; y < first_row; ++y) + { + for (int x = 0; x < result->width; ++x) + { + PIXEL * pixel_result = Pixel_At ( result, x, y); + + pixel_result->red = 255; + pixel_result->green = 255; + pixel_result->blue = 255; + pixel_result->alpha = 255; + } + } + + for (int y = first_row; y < first_row + small->height; ++y) + { + for (int x = 0; x < result->width; ++x) + { + PIXEL * pixel_small = Pixel_At ( small, x, y - first_row); + PIXEL * pixel_result = Pixel_At ( result, x, y); + + pixel_result->red = pixel_small->red; + pixel_result->green = pixel_small->green; + pixel_result->blue = pixel_small->blue; + pixel_result->alpha = pixel_small->alpha; + } + } + + for (int y = first_row + small->height; y < result->height; ++y) + { + for (int x = 0; x < result->width; ++x) + { + PIXEL * pixel_result = Pixel_At ( result, x, y); + + pixel_result->red = 255; + pixel_result->green = 255; + pixel_result->blue = 255; + pixel_result->alpha = 255; + } + } + + return result; +} diff --git a/tests/make_png/bitmap.h b/tests/make_png/bitmap.h index d009a689e..ef0da295b 100644 --- a/tests/make_png/bitmap.h +++ b/tests/make_png/bitmap.h @@ -78,9 +78,13 @@ int Add_effect(IMAGE* base, IMAGE* test, IMAGE* out, int Effect_ID); // Stitch 2 PNG files void Stitch(IMAGE* left, IMAGE* right, IMAGE* result); // Make the Height of both the PNG(s) same by filling with white pixels -IMAGE* Adjust_Height(IMAGE* small, IMAGE* big ); -// Make the Width of both the PNG(s) same by filling with white pixels -IMAGE* Adjust_Width(IMAGE* small, IMAGE* big ); -// Print Row in a HTML file void Print_Row( FILE* fp, int index, char* name, int diff, HASH_128* hash_b, HASH_128* hash_t); +// Finding the first non-empty (non-white) column +int First_Column(IMAGE* input); +// Finding the first non-empty (non-white) row +int First_Row(IMAGE* input); +// Appening white columns with image alignment +IMAGE* Append_Columns(IMAGE* small, IMAGE* big); +// Appening white columns with image alignment +IMAGE* Append_Rows(IMAGE* small, IMAGE* big); diff --git a/tests/make_png/make_sprite.c b/tests/make_png/make_sprite.c index 5a9a27b82..1f19e76d9 100644 --- a/tests/make_png/make_sprite.c +++ b/tests/make_png/make_sprite.c @@ -434,18 +434,18 @@ int main(int argc, char const *argv[]) if (base_png->height < test_png->height) { - base_png = Adjust_Height(base_png, test_png); + base_png = Append_Rows(base_png, test_png); }else if (base_png->height > test_png->height) { - test_png = Adjust_Height(test_png, base_png); + test_png = Append_Rows(test_png, base_png); } if (base_png->width < test_png->width) { - base_png = Adjust_Width(base_png, test_png); + base_png = Append_Columns(base_png, test_png); }else if (base_png->width > test_png->width) { - test_png = Adjust_Width(test_png, base_png); + test_png = Append_Columns(test_png, base_png); } Add_effect( base_png, test_png, after_effect_1, 1);