Changeset 2653


Ignore:
Timestamp:
Aug 3, 2008, 5:30:53 AM (14 years ago)
Author:
Sam Hocevar
Message:
  • floydsteinberg.c: perform Floyd-Steinberg dithering on a serpentine path.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libpipi/trunk/pipi/dither/floydsteinberg.c

    r2637 r2653  
    4545        {
    4646            float p, q, e;
     47            int x2 = (y & 1) ? x : w - 1 - x;
     48            int s = (y & 1) ? 1 : -1;
    4749
    48             p = srcdata[y * w + x];
     50            p = srcdata[y * w + x2];
    4951            q = p < 0.5 ? 0. : 1.;
    50             dstdata[y * w + x] = q;
     52            dstdata[y * w + x2] = q;
    5153
     54            /* FIXME: according to our 2008 paper, [7 4 5 0] is a better
     55             * error diffusion kernel for serpentine scan. */
    5256            e = p - q;
    5357            if(x < w - 1)
    54                 srcdata[y * w + x + 1] += e * .4375;
     58                srcdata[y * w + x2 + s] += e * .4375;
    5559            if(y < h - 1)
    5660            {
    5761                if(x > 0)
    58                     srcdata[(y + 1) * w + x - 1] += e * .1875;
    59                 srcdata[(y + 1) * w + x] += e * .3125;
     62                    srcdata[(y + 1) * w + x2 - s] += e * .1875;
     63                srcdata[(y + 1) * w + x2] += e * .3125;
    6064                if(x < w - 1)
    61                     srcdata[(y + 1) * w + x + 1] += e * .0625;
     65                    srcdata[(y + 1) * w + x2 + s] += e * .0625;
    6266            }
    6367        }
Note: See TracChangeset for help on using the changeset viewer.