JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
* pnmoutline.c: actually works now. Stupid, stupid libnetpbm.
authorJoshua Grams <josh@qualdan.com>
Wed, 6 Apr 2005 20:59:31 +0000 (20:59 +0000)
committerJoshua Grams <josh@qualdan.com>
Wed, 6 Apr 2005 20:59:31 +0000 (20:59 +0000)
pnmoutline.c

index 8a718bb..1315da5 100644 (file)
@@ -6,7 +6,7 @@ tuple *inrows[3];
 tuple *outrow;
 
 void
-clear_inrow(struct pam *p, tuple *row)
+row_fill_black(struct pam *p, tuple *row)
 {
        int i, j;
        
@@ -15,16 +15,6 @@ clear_inrow(struct pam *p, tuple *row)
                        row[i][j]=0;
 }
 
-void
-clear_outrow(struct pam *p, tuple *row)
-{
-       int i,j;
-
-       for(i=0; i<p->width; i++)
-               for(j=0; j<3; j++)
-                       row[i][j]=p->maxval;
-}
-
 int
 is_black(unsigned int row, unsigned int column)
 {
@@ -40,44 +30,52 @@ is_edge(unsigned int column)
        unsigned int n = 0;
        if(is_black(0,column)) n++;
        if(is_black(2,column)) n++;
-       if(is_black(1,column-1)) n++;
-       if(is_black(1,column+1)) n++;
-       return n==2 || n==3;
+       if(column == 0 || is_black(1, column-1)) n++;
+       if(column == outpam.width-1 || is_black(1, column+1)) n++;
+       return n>1 && n<4;
 }
 
 void
-set_white(unsigned int column)
+set_black(unsigned int column)
 {
        sample *s = outrow[column];
-       s[0]=255; s[1]=255; s[2]=255;
+       s[0]=0; s[1]=0; s[2]=0;
 }
 
 void
-set_black(unsigned int column)
+set_white(unsigned int column)
 {
        sample *s = outrow[column];
-       s[0]=0; s[1]=0; s[2]=0;
+       s[0]=255; s[1]=255; s[2]=255;
 }
 
 void
-copy_tuple(unsigned int column)
+copy_tuple(sample *dest, sample *src)
 {
-       sample *src, *dest;
-
-       src = inrows[1][column];
-       dest = outrow[column];
        dest[0] = src[0];
        dest[1] = src[1];
        dest[2] = src[2];
 }
 
 void
-read_row(unsigned int q)
+copy_row(struct pam *p, tuple *dest, tuple *src) 
+{
+       int i;
+
+       for(i=0; i<p->width; i++) copy_tuple(dest[i], src[i]);
+}
+
+void
+next_row(unsigned int read)
 {
+       copy_row(&outpam, inrows[0], inrows[1]);
+       copy_row(&outpam, inrows[1], inrows[2]);
+       /*
        memcpy(inrows[0], inrows[1], outpam.width*sizeof(sample)*3);
        memcpy(inrows[1], inrows[2], outpam.width*sizeof(sample)*3);
-       if(q) pnm_readpamrow(&inpam, inrows[2]+1);
-       else clear_inrow(&outpam, inrows[2]);
+       */
+       if(read) pnm_readpamrow(&inpam, inrows[2]+1);
+       else row_fill_black(&outpam, inrows[2]);
 }
 
 
@@ -94,28 +92,24 @@ main(int argc, char **argv)
        outpam.file = stdout;
        pnm_writepaminit(&outpam);
 
-       outrow = pnm_allocpamrow(&outpam);
-       for(i=0; i<3; i++) inrows[i] = pnm_allocpamrow(&outpam);
-       for(i=0; i<3; i++) clear_inrow(&outpam, inrows[i]);
+       for(i=0; i<3; i++) {
+               inrows[i] = pnm_allocpamrow(&outpam);
+               row_fill_black(&outpam, inrows[i]);
+       }
 
-       clear_outrow(&outpam, outrow);
-       pnm_writepamrow(&outpam, inrows[0]);
+       outrow = pnm_allocpamrow(&outpam);
 
-       pnm_readpamrow(&inpam, inrows[1]+1);
-       for(row=0; row < inpam.height; row++) {
-               for(column=1; column<=inpam.width; column++) {
+       for(row=0; row < outpam.height; row++) {
+               next_row(row < inpam.height);
+               for(column=0; column<outpam.width; column++) {
                        if(is_black(1,column)) {
                                if(is_edge(column)) set_black(column);
                                else set_white(column);
-                       } else copy_tuple(column);
+                       } else copy_tuple(outrow[column], inrows[1][column]);
                }
                pnm_writepamrow(&outpam, outrow);
-               read_row(row != inpam.height-1);
        }
 
-       clear_outrow(&outpam, outrow);
-       pnm_writepamrow(&outpam, inrows[2]);
-
        pnm_freepamrow(outrow);
        for(i=0; i<3; i++) pnm_freepamrow(inrows[i]);
        return 0;