Changeset 2670


Ignore:
Timestamp:
Aug 4, 2008, 7:23:59 PM (14 years ago)
Author:
Sam Hocevar
Message:
  • Dithering algorithms no longer modify the original image.
Location:
libpipi/trunk/pipi/dither
Files:
4 edited

Legend:

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

    r2666 r2670  
    3636 * guaranteed stop condition here. */
    3737
    38 pipi_image_t *pipi_dither_dbs(pipi_image_t *src)
     38pipi_image_t *pipi_dither_dbs(pipi_image_t *img)
    3939{
    4040    double kernel[NN * NN];
    4141    double t = 0.;
    42     pipi_image_t *dst, *tmp1, *tmp2;
    43     pipi_pixels_t *srcp, *dstp, *tmp1p, *tmp2p;
     42    pipi_image_t *src, *dst, *tmp1, *tmp2;
     43    pipi_pixels_t *dstp, *tmp1p, *tmp2p;
    4444    int *changelist;
    45     float *srcdata, *dstdata, *tmp1data, *tmp2data;
     45    float *dstdata, *tmp1data, *tmp2data;
    4646    int i, j, x, y, w, h, cw, ch;
    4747
     
    6262            kernel[j * NN + i] /= t;
    6363
    64     w = src->w;
    65     h = src->h;
     64    w = img->w;
     65    h = img->h;
    6666
    6767    cw = (w + CELL - 1) / CELL;
     
    7070    memset(changelist, 0, cw * ch * sizeof(int));
    7171
    72     srcp = pipi_getpixels(src, PIPI_PIXELS_Y_F);
    73     srcdata = (float *)srcp->pixels;
     72    src = pipi_copy(img);
     73    pipi_getpixels(src, PIPI_PIXELS_Y_F);
    7474
    7575    tmp1 = pipi_convolution(src, NN, NN, kernel);
     
    7777    tmp1data = (float *)tmp1p->pixels;
    7878
    79     /* The initial dither is an empty image. So is its blurred version,
    80      * but I leave the pipi_convolution() call here in case we choose
    81      * to change the way to create the initial dither. */
    82     dst = pipi_new(w, h);
     79    dst = pipi_dither_floydsteinberg(src, PIPI_SCAN_SERPENTINE);
    8380    dstp = pipi_getpixels(dst, PIPI_PIXELS_Y_F);
    8481    dstdata = (float *)dstp->pixels;
    8582
    86     for(y = 0; y < h; y++)
    87         for(x = 0; x < w; x++)
    88             dstdata[y * w + x] = srcdata[y * w + x] > 0.5 ? 1.0 : 0.0;
     83    pipi_free(src);
    8984
    9085    tmp2 = pipi_convolution(dst, NN, NN, kernel);
  • libpipi/trunk/pipi/dither/floydsteinberg.c

    r2666 r2670  
    2323#include "pipi_internals.h"
    2424
    25 pipi_image_t *pipi_dither_floydsteinberg(pipi_image_t *src, pipi_scan_t scan)
     25pipi_image_t *pipi_dither_floydsteinberg(pipi_image_t *img, pipi_scan_t scan)
    2626{
    2727    pipi_image_t *dst;
    28     pipi_pixels_t *srcp, *dstp;
    29     float *srcdata, *dstdata;
     28    pipi_pixels_t *dstp;
     29    float *dstdata;
    3030    int x, y, w, h;
    3131
    32     w = src->w;
    33     h = src->h;
     32    w = img->w;
     33    h = img->h;
    3434
    35     srcp = pipi_getpixels(src, PIPI_PIXELS_Y_F);
    36     srcdata = (float *)srcp->pixels;
    37 
    38     dst = pipi_new(w, h);
     35    dst = pipi_copy(img);
    3936    dstp = pipi_getpixels(dst, PIPI_PIXELS_Y_F);
    4037    dstdata = (float *)dstp->pixels;
     
    5047            int s = reverse ? -1 : 1;
    5148
    52             p = srcdata[y * w + x2];
     49            p = dstdata[y * w + x2];
    5350            q = p < 0.5 ? 0. : 1.;
    5451            dstdata[y * w + x2] = q;
     
    5855            e = p - q;
    5956            if(x < w - 1)
    60                 srcdata[y * w + x2 + s] += e * .4375;
     57                dstdata[y * w + x2 + s] += e * .4375;
    6158            if(y < h - 1)
    6259            {
    6360                if(x > 0)
    64                     srcdata[(y + 1) * w + x2 - s] += e * .1875;
    65                 srcdata[(y + 1) * w + x2] += e * .3125;
     61                    dstdata[(y + 1) * w + x2 - s] += e * .1875;
     62                dstdata[(y + 1) * w + x2] += e * .3125;
    6663                if(x < w - 1)
    67                     srcdata[(y + 1) * w + x2 + s] += e * .0625;
     64                    dstdata[(y + 1) * w + x2 + s] += e * .0625;
    6865            }
    6966        }
  • libpipi/trunk/pipi/dither/ordered.c

    r2665 r2670  
    3535};
    3636
    37 pipi_image_t *pipi_dither_ordered(pipi_image_t *src)
     37pipi_image_t *pipi_dither_ordered(pipi_image_t *img)
    3838{
    3939    pipi_image_t *dst;
    40     pipi_pixels_t *srcp, *dstp;
    41     float *srcdata, *dstdata;
     40    pipi_pixels_t *dstp;
     41    float *dstdata;
    4242    int x, y, w, h;
    4343
    44     w = src->w;
    45     h = src->h;
     44    w = img->w;
     45    h = img->h;
    4646
    47     srcp = pipi_getpixels(src, PIPI_PIXELS_Y_F);
    48     srcdata = (float *)srcp->pixels;
    49 
    50     dst = pipi_new(w, h);
     47    dst = pipi_copy(img);
    5148    dstp = pipi_getpixels(dst, PIPI_PIXELS_Y_F);
    5249    dstdata = (float *)dstp->pixels;
     
    5855            float p, q;
    5956
    60             p = srcdata[y * w + x];
     57            p = dstdata[y * w + x];
    6158            q = p > (1. + kernel8x8[(y % 8) * 8 + (x % 8)]) / 65. ? 1. : 0.;
    6259            dstdata[y * w + x] = q;
  • libpipi/trunk/pipi/dither/ostromoukhov.c

    r2666 r2670  
    6767};
    6868
    69 pipi_image_t *pipi_dither_ostromoukhov(pipi_image_t *src, pipi_scan_t scan)
     69pipi_image_t *pipi_dither_ostromoukhov(pipi_image_t *img, pipi_scan_t scan)
    7070{
    7171    pipi_image_t *dst;
    72     pipi_pixels_t *srcp, *dstp;
    73     float *srcdata, *dstdata;
     72    pipi_pixels_t *dstp;
     73    float *dstdata;
    7474    int x, y, w, h;
    7575
    76     w = src->w;
    77     h = src->h;
     76    w = img->w;
     77    h = img->h;
    7878
    79     srcp = pipi_getpixels(src, PIPI_PIXELS_Y_F);
    80     srcdata = (float *)srcp->pixels;
    81 
    82     dst = pipi_new(w, h);
     79    dst = pipi_copy(img);
    8380    dstp = pipi_getpixels(dst, PIPI_PIXELS_Y_F);
    8481    dstdata = (float *)dstp->pixels;
     
    9693            s = reverse ? -1 : 1;
    9794
    98             p = srcdata[y * w + x2];
     95            p = dstdata[y * w + x2];
    9996            q = p < 0.5 ? 0. : 1.;
    10097            dstdata[y * w + x2] = q;
     
    107104
    108105            if(x < w - 1)
    109                 srcdata[y * w + x2 + s] += e * table[i][0];
     106                dstdata[y * w + x2 + s] += e * table[i][0];
    110107            if(y < h - 1)
    111108            {
    112109                if(x > 0)
    113                     srcdata[(y + 1) * w + x2 - s] += e * table[i][1];
    114                 srcdata[(y + 1) * w + x2] += e * table[i][2];
     110                    dstdata[(y + 1) * w + x2 - s] += e * table[i][1];
     111                dstdata[(y + 1) * w + x2] += e * table[i][2];
    115112            }
    116113        }
Note: See TracChangeset for help on using the changeset viewer.