From 44e9d12f0f39f910f2be0653b1bc91be48d40f72 Mon Sep 17 00:00:00 2001 From: Anuj Verma Date: Thu, 20 Aug 2020 09:20:26 +0530 Subject: [bsdf] Added function to find edge pixels given a grid of alpha values. * src/sdf/ftbsdf.c (bsdf_is_edge): The function find the edge pixel in a distance map which is basically a 2D array of alpha values which represent coverage in the original input bitmap. --- src/sdf/ftbsdf.c | 111 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) diff --git a/src/sdf/ftbsdf.c b/src/sdf/ftbsdf.c index db95e7c82..1a33331fd 100644 --- a/src/sdf/ftbsdf.c +++ b/src/sdf/ftbsdf.c @@ -123,5 +123,116 @@ static const ED zero_ed = { 0, { 0, 0 }, 0 }; + /************************************************************************** + * + * rasterizer functions + * + */ + + #ifdef CHECK_NEIGHBOR + #undef CHECK_NEIGHBOR + #endif + + /* Use the macro only in `bsdf_is_edge' function. */ + #define CHECK_NEIGHBOR( x_offset, y_offset ) \ + if ( x + x_offset >= 0 && x + x_offset < w && \ + y + y_offset >= 0 && y + y_offset < r ) \ + { \ + num_neighbour++; \ + to_check = dm + y_offset * w + x_offset; \ + if ( to_check->alpha == 0 ) \ + { \ + is_edge = 1; \ + goto Done; \ + } \ + } + + /************************************************************************** + * + * @Function: + * bsdf_is_edge + * + * @Description: + * This function checks weather a pixel is an edge pixel. A pixel + * is edge bixel if it surrounded by a completely black pixel ( 0 + * alpha ) and the current pixel is not a completely black pixel. + * + * @Input: + * dm :: + * Array of distances. The parameter must point to the current + * pixel i.e. the pixel that is to be checked for edge. + * + * x :: + * The x position of the current pixel. + * + * y :: + * The y position of the current pixel. + * + * w :: + * Width of the bitmap. + * + * r :: + * Number of rows in the bitmap. + * + * @Return: + * FT_Bool :: + * 1 if the current pixel is an edge pixel, 0 otherwise. + * + */ + static FT_Bool + bsdf_is_edge( ED* dm, /* distance map */ + FT_Int x, /* x index of point to check */ + FT_Int y, /* y index of point to check */ + FT_Int w, /* width */ + FT_Int r ) /* rows */ + { + FT_Bool is_edge = 0; + ED* to_check = NULL; + FT_Int num_neighbour = 0; + + + if ( dm->alpha == 0 ) + goto Done; + + if ( dm->alpha > 0 && dm->alpha < 255 ) + { + is_edge = 1; + goto Done; + } + + /* up */ + CHECK_NEIGHBOR( 0, -1 ); + + /* down */ + CHECK_NEIGHBOR( 0, 1 ); + + /* left */ + CHECK_NEIGHBOR( -1, 0 ); + + /* right */ + CHECK_NEIGHBOR( 1, 0 ); + + /* up left */ + CHECK_NEIGHBOR( -1, -1 ); + + /* up right */ + CHECK_NEIGHBOR( 1, -1 ); + + /* down left */ + CHECK_NEIGHBOR( -1, 1 ); + + /* down right */ + CHECK_NEIGHBOR( 1, 1 ); + + if ( num_neighbour != 8 ) + is_edge = 1; + + Done: + return is_edge; + + } + + #undef CHECK_NEIGHBOR + /* END */ -- cgit v1.2.1