diff options
Diffstat (limited to 'converter/other/pamtosvg/thin-image.c')
-rw-r--r-- | converter/other/pamtosvg/thin-image.c | 567 |
1 files changed, 286 insertions, 281 deletions
diff --git a/converter/other/pamtosvg/thin-image.c b/converter/other/pamtosvg/thin-image.c index 364f67cc..ad15247f 100644 --- a/converter/other/pamtosvg/thin-image.c +++ b/converter/other/pamtosvg/thin-image.c @@ -27,78 +27,78 @@ #include "logreport.h" #include "message.h" #include "bitmap.h" - + #define PIXEL_SET(p, new) ((void)memcpy((p), (new), sizeof(Pixel))) #define PIXEL_EQUAL(p1, p2) \ ((p1)[0] == (p2)[0] && (p1)[1] == (p2)[1] && (p1)[2] == (p2)[2]) - -typedef unsigned char Pixel[3]; /* RGB pixel data type */ - - -void thin3(bitmap_type *image, Pixel colour); -void thin1(bitmap_type *image, unsigned char colour); - - -/* -------------------------------- ThinImage - Thin binary image. --------------------------- * - * - * Description: - * Thins the supplied binary image using Rosenfeld's parallel - * thinning algorithm. - * - * On Entry: - * image = Image to thin. - * - * -------------------------------------------------------------------------------------------- */ - - -/* Direction masks: */ -/* N S W E */ -static unsigned int masks[] = { 0200, 0002, 0040, 0010 }; - -/* True if pixel neighbor map indicates the pixel is 8-simple and */ -/* not an end point and thus can be deleted. The neighborhood */ -/* map is defined as an integer of bits abcdefghi with a non-zero */ -/* bit representing a non-zero pixel. The bit assignment for the */ -/* neighborhood is: */ -/* */ -/* a b c */ -/* d e f */ -/* g h i */ - -static unsigned char todelete[512] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; + +typedef unsigned char Pixel[3]; /* RGB pixel data type */ + + +void thin3(bitmap_type *image, Pixel colour); +void thin1(bitmap_type *image, unsigned char colour); + + +/* -------------------------------- ThinImage - Thin binary image. --------------------------- * + * + * Description: + * Thins the supplied binary image using Rosenfeld's parallel + * thinning algorithm. + * + * On Entry: + * image = Image to thin. + * + * -------------------------------------------------------------------------------------------- */ + + +/* Direction masks: */ +/* N S W E */ +static unsigned int masks[] = { 0200, 0002, 0040, 0010 }; + +/* True if pixel neighbor map indicates the pixel is 8-simple and */ +/* not an end point and thus can be deleted. The neighborhood */ +/* map is defined as an integer of bits abcdefghi with a non-zero */ +/* bit representing a non-zero pixel. The bit assignment for the */ +/* neighborhood is: */ +/* */ +/* a b c */ +/* d e f */ +/* g h i */ + +static unsigned char todelete[512] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; static pixel background; @@ -106,268 +106,273 @@ static pixel background; void thin_image(bitmap_type *image, bool bgSpec, pixel bg, at_exception_type * exp) -{ - /* This is nasty as we need to call thin once for each - * colour in the image the way I do this is to keep a second - * copy of the bitmap and to use this to keep - * track of which colours have not yet been processed, - * trades time for pathological case memory.....*/ +{ + /* This is nasty as we need to call thin once for each + * colour in the image the way I do this is to keep a second + * copy of the bitmap and to use this to keep + * track of which colours have not yet been processed, + * trades time for pathological case memory.....*/ long m, n, num_pixels; - bitmap_type bm; + bitmap_type bm; unsigned int const spp = image->np; - unsigned int const width = image->width; - unsigned int const height = image->height; + unsigned int const width = image->width; + unsigned int const height = image->height; if (bgSpec) background = bg; - else + else PPM_ASSIGN(background, 255, 255, 255); /* Clone the image */ bm.height = image->height; bm.width = image->width; bm.np = image->np; - MALLOCARRAY(bm.bitmap, height * width * spp); + MALLOCARRAY(bm.bitmap, height * width * spp); if (bm.bitmap == NULL) pm_error("Unable to get memory for thin image bitmap clone"); - memcpy(bm.bitmap, image->bitmap, height * width * spp); + memcpy(bm.bitmap, image->bitmap, height * width * spp); num_pixels = height * width; switch (spp) { - case 3: - { - Pixel *ptr = (Pixel*)bm.bitmap; - Pixel bg_color; - bg_color[0] = PPM_GETR(background); - bg_color[1] = PPM_GETG(background); - bg_color[2] = PPM_GETB(background); - - for (n = num_pixels - 1; n >= 0L; --n) - { - Pixel p; - - PIXEL_SET(p, ptr[n]); - if (!PIXEL_EQUAL(p, bg_color)) - { - /* we have a new colour in the image */ - LOG3("Thinning colour (%x, %x, %x)\n", p[0], p[1], p[2]); - for (m = n - 1; m >= 0L; --m) - { - if (PIXEL_EQUAL(ptr[m], p)) - PIXEL_SET(ptr[m], bg_color); - } - thin3(image, p); - } - } - break; - } - - case 1: - { - unsigned char * const ptr = bm.bitmap; - unsigned char bg_color; - - if (PPM_ISGRAY(background)) + case 3: + { + Pixel *ptr = (Pixel*)bm.bitmap; + Pixel bg_color; + bg_color[0] = PPM_GETR(background); + bg_color[1] = PPM_GETG(background); + bg_color[2] = PPM_GETB(background); + + for (n = num_pixels - 1; n >= 0L; --n) + { + Pixel p; + + PIXEL_SET(p, ptr[n]); + if (!PIXEL_EQUAL(p, bg_color)) + { + /* we have a new colour in the image */ + LOG3("Thinning colour (%x, %x, %x)\n", p[0], p[1], p[2]); + for (m = n - 1; m >= 0L; --m) + { + if (PIXEL_EQUAL(ptr[m], p)) + PIXEL_SET(ptr[m], bg_color); + } + thin3(image, p); + } + } + break; + } + + case 1: + { + unsigned char * const ptr = bm.bitmap; + unsigned char bg_color; + + if (PPM_ISGRAY(background)) bg_color = PPM_GETR(background); - else + else bg_color = ppm_luminosity(background); - for (n = num_pixels - 1; n >= 0L; --n) - { - unsigned char c = ptr[n]; - if (c != bg_color) - { - LOG1 ("Thinning colour %x\n", c); - for (m = n - 1; m >= 0L; --m) - if (ptr[m] == c) ptr[m] = bg_color; - thin1(image, c); - } - } - break; - } - - default: - { - LOG1 ("thin_image: Don't know how to interpret %u-plane images", spp); - at_exception_fatal(exp, "thin_image: wrong plane images are passed"); - goto cleanup; - } + for (n = num_pixels - 1; n >= 0L; --n) + { + unsigned char c = ptr[n]; + if (c != bg_color) + { + LOG1 ("Thinning colour %x\n", c); + for (m = n - 1; m >= 0L; --m) + if (ptr[m] == c) ptr[m] = bg_color; + thin1(image, c); + } + } + break; + } + + default: + { + LOG1 ("thin_image: Don't know how to interpret %u-plane images", spp); + at_exception_fatal(exp, "thin_image: wrong plane images are passed"); + goto cleanup; + } } cleanup: - free (bm.bitmap); -} + free (bm.bitmap); +} + - -void thin3(bitmap_type *image, Pixel colour) -{ + +void thin3(bitmap_type *image, Pixel colour) +{ Pixel *ptr, *y_ptr, *y1_ptr; Pixel bg_color; - unsigned int xsize, ysize; /* Image resolution */ - unsigned int x, y; /* Pixel location */ - unsigned int i; /* Pass index */ - unsigned int pc = 0; /* Pass count */ - unsigned int count = 1; /* Deleted pixel count */ - unsigned int p, q; /* Neighborhood maps of adjacent*/ - /* cells */ - unsigned char *qb; /* Neighborhood maps of previous*/ - /* scanline */ - unsigned int m; /* Deletion direction mask */ - + unsigned int xsize, ysize; /* Image resolution */ + unsigned int x, y; /* Pixel location */ + unsigned int i; /* Pass index */ + unsigned int pc = 0; /* Pass count */ + unsigned int count = 1; /* Deleted pixel count */ + unsigned int p, q; /* Neighborhood maps of adjacent*/ + /* cells */ + unsigned char *qb; /* Neighborhood maps of previous*/ + /* scanline */ + unsigned int m; /* Deletion direction mask */ + bg_color[0] = PPM_GETR(background); bg_color[1] = PPM_GETG(background); bg_color[2] = PPM_GETB(background); - LOG (" Thinning image.....\n "); + LOG (" Thinning image.....\n "); xsize = image->width; ysize = image->height; - MALLOCARRAY_NOFAIL(qb, xsize); - qb[xsize-1] = 0; /* Used for lower-right pixel */ + MALLOCARRAY_NOFAIL(qb, xsize); + qb[xsize-1] = 0; /* Used for lower-right pixel */ ptr = (Pixel*)image->bitmap; - - while ( count ) { /* Scan image while deletions */ - pc++; - count = 0; - - for ( i = 0 ; i < 4 ; i++ ) { - - m = masks[i]; - - /* Build initial previous scan buffer. */ - p = PIXEL_EQUAL(ptr[0], colour); - for ( x = 0 ; x < xsize-1 ; x++ ) + + while ( count ) { /* Scan image while deletions */ + pc++; + count = 0; + + for ( i = 0 ; i < 4 ; i++ ) { + + m = masks[i]; + + /* Build initial previous scan buffer. */ + p = PIXEL_EQUAL(ptr[0], colour); + for ( x = 0 ; x < xsize-1 ; x++ ) qb[x] = (unsigned char) (p = ((p<<1)&0006) | (unsigned int) PIXEL_EQUAL(ptr[x+1], - colour)); - - /* Scan image for pixel deletion candidates. */ - y_ptr = ptr; y1_ptr = ptr + xsize; + colour)); + + /* Scan image for pixel deletion candidates. */ + y_ptr = ptr; y1_ptr = ptr + xsize; for (y = 0; y < ysize - 1; y++, y_ptr += xsize, y1_ptr += xsize) - { - q = qb[0]; - p = ((q<<2)&0330) | (unsigned int) PIXEL_EQUAL(y1_ptr[0], colour); - - for ( x = 0 ; x < xsize-1 ; x++ ) { - q = qb[x]; - p = ((p<<1)&0666) | ((q<<3)&0110) | - (unsigned int) PIXEL_EQUAL(y1_ptr[x+1], colour); - qb[x] = (unsigned char) p; - if ((i != 2 || x != 0) && ((p&m) == 0) && todelete[p] ) { - count++; /* delete the pixel */ - PIXEL_SET(y_ptr[x], bg_color); - } - } - - /* Process right edge pixel. */ - p = (p<<1)&0666; - if (i != 3 && (p&m) == 0 && todelete[p] ) { - count++; - PIXEL_SET(y_ptr[xsize-1], bg_color); - } - } - - if (i != 1) - { - /* Process bottom scan line. */ - q = qb[0]; - p = ((q<<2)&0330); + { + q = qb[0]; + p = ((q<<2)&0330) | (unsigned int) PIXEL_EQUAL(y1_ptr[0], colour); + + for ( x = 0 ; x < xsize-1 ; x++ ) { + q = qb[x]; + p = ((p<<1)&0666) | ((q<<3)&0110) | + (unsigned int) PIXEL_EQUAL(y1_ptr[x+1], colour); + qb[x] = (unsigned char) p; + if ((i != 2 || x != 0) && ((p&m) == 0) && todelete[p] ) { + count++; /* delete the pixel */ + PIXEL_SET(y_ptr[x], bg_color); + } + } + + /* Process right edge pixel. */ + p = (p<<1)&0666; + if (i != 3 && (p&m) == 0 && todelete[p] ) { + count++; + PIXEL_SET(y_ptr[xsize-1], bg_color); + } + } + + if (i != 1) + { + /* Process bottom scan line. */ + q = qb[0]; + p = ((q<<2)&0330); y_ptr = ptr + xsize * (ysize - 1); - for ( x = 0 ; x < xsize ; x++ ) { - q = qb[x]; - p = ((p<<1)&0666) | ((q<<3)&0110); - if ((i != 2 || x != 0) && (p&m) == 0 && todelete[p]) { - count++; + for ( x = 0 ; x < xsize ; x++ ) { + q = qb[x]; + p = ((p<<1)&0666) | ((q<<3)&0110); + if ((i != 2 || x != 0) && (p&m) == 0 && todelete[p]) { + count++; PIXEL_SET(y_ptr[x], bg_color); - } - } + } + } } - } - LOG2 ("ThinImage: pass %d, %d pixels deleted\n", pc, count); - } - free (qb); -} - - -void thin1(bitmap_type *image, unsigned char colour) -{ + } + LOG2 ("ThinImage: pass %d, %d pixels deleted\n", pc, count); + } + free (qb); +} + + + +void thin1(bitmap_type *image, unsigned char colour) +{ unsigned char *ptr, *y_ptr, *y1_ptr; unsigned char bg_color; - unsigned int xsize, ysize; /* Image resolution */ - unsigned int x, y; /* Pixel location */ - unsigned int i; /* Pass index */ - unsigned int pc = 0; /* Pass count */ - unsigned int count = 1; /* Deleted pixel count */ - unsigned int p, q; /* Neighborhood maps of adjacent*/ - /* cells */ - unsigned char *qb; /* Neighborhood maps of previous*/ - /* scanline */ - unsigned int m; /* Deletion direction mask */ + unsigned int xsize, ysize; /* Image resolution */ + unsigned int x, y; /* Pixel location */ + unsigned int i; /* Pass index */ + unsigned int pc = 0; /* Pass count */ + unsigned int count = 1; /* Deleted pixel count */ + unsigned int p, q; /* Neighborhood maps of adjacent*/ + /* cells */ + unsigned char *qb; /* Neighborhood maps of previous*/ + /* scanline */ + unsigned int m; /* Deletion direction mask */ if (PPM_ISGRAY(background)) bg_color = PPM_GETR(background); else bg_color = ppm_luminosity(background); - LOG (" Thinning image.....\n "); + LOG (" Thinning image.....\n "); xsize = image->width; ysize = image->height; - MALLOCARRAY_NOFAIL(qb, xsize); - qb[xsize-1] = 0; /* Used for lower-right pixel */ + MALLOCARRAY_NOFAIL(qb, xsize); + qb[xsize-1] = 0; /* Used for lower-right pixel */ ptr = image->bitmap; - - while ( count ) { /* Scan image while deletions */ - pc++; - count = 0; - - for ( i = 0 ; i < 4 ; i++ ) { - - m = masks[i]; - - /* Build initial previous scan buffer. */ - p = (ptr[0] == colour); - for ( x = 0 ; x < xsize-1 ; x++ ) - qb[x] = (unsigned char) (p = ((p<<1)&0006) | (unsigned int)(ptr[x+1] == colour)); - - /* Scan image for pixel deletion candidates. */ - y_ptr = ptr; y1_ptr = ptr + xsize; + + while ( count ) { /* Scan image while deletions */ + pc++; + count = 0; + + for ( i = 0 ; i < 4 ; i++ ) { + + m = masks[i]; + + /* Build initial previous scan buffer. */ + p = (ptr[0] == colour); + for ( x = 0 ; x < xsize-1 ; x++ ) + qb[x] = (unsigned char) (p = ((p<<1)&0006) | (unsigned int)(ptr[x+1] == colour)); + + /* Scan image for pixel deletion candidates. */ + y_ptr = ptr; y1_ptr = ptr + xsize; for (y = 0; y < ysize - 1; y++, y_ptr += xsize, y1_ptr += xsize) - { - q = qb[0]; - p = ((q<<2)&0330) | (y1_ptr[0] == colour); - - for ( x = 0 ; x < xsize-1 ; x++ ) { - q = qb[x]; - p = ((p<<1)&0666) | ((q<<3)&0110) | (unsigned int) (y1_ptr[x+1]==colour); - qb[x] = (unsigned char) p; - if ( ((p&m) == 0) && todelete[p] ) { - count++; - y_ptr[x] = bg_color; /* delete the pixel */ - } - } - - /* Process right edge pixel. */ - p = (p<<1)&0666; - if ( (p&m) == 0 && todelete[p] ) { - count++; + { + q = qb[0]; + p = ((q<<2)&0330) | (y1_ptr[0] == colour); + + for ( x = 0 ; x < xsize-1 ; x++ ) { + q = qb[x]; + p = ((p<<1)&0666) | ((q<<3)&0110) | (unsigned int) (y1_ptr[x+1]==colour); + qb[x] = (unsigned char) p; + if ( ((p&m) == 0) && todelete[p] ) { + count++; + y_ptr[x] = bg_color; /* delete the pixel */ + } + } + + /* Process right edge pixel. */ + p = (p<<1)&0666; + if ( (p&m) == 0 && todelete[p] ) { + count++; y_ptr[xsize-1] = bg_color; - } - } - - /* Process bottom scan line. */ - q = qb[0]; - p = ((q<<2)&0330); - - y_ptr = ptr + xsize * (ysize - 1); - for ( x = 0 ; x < xsize ; x++ ) { - q = qb[x]; - p = ((p<<1)&0666) | ((q<<3)&0110); - if ( (p&m) == 0 && todelete[p] ) { - count++; + } + } + + /* Process bottom scan line. */ + q = qb[0]; + p = ((q<<2)&0330); + + y_ptr = ptr + xsize * (ysize - 1); + for ( x = 0 ; x < xsize ; x++ ) { + q = qb[x]; + p = ((p<<1)&0666) | ((q<<3)&0110); + if ( (p&m) == 0 && todelete[p] ) { + count++; y_ptr[x] = bg_color; - } - } - } - LOG2("thin1: pass %d, %d pixels deleted\n", pc, count); - } - free (qb); -} + } + } + } + LOG2("thin1: pass %d, %d pixels deleted\n", pc, count); + } + free (qb); +} + + + |