/* ppmfloyd.h - header file for libfloyd Floyd-Steinberg routines */

#ifndef _PPM_FLOYD_H_
#define _PPM_FLOYD_H_

#include "ppm.h"


/* PRIVATE STRUCTURE - do not access any member of it directly! */
typedef struct {
    long *thisrederr, *thisgreenerr, *thisblueerr;
    long *nextrederr, *nextgreenerr, *nextblueerr;
    int lefttoright;                /* 1 for left-to-right scan, 0 for right-to-left */
    int cols, col_end;
    pixel *pixrow;
    pixval maxval;
    int flags;
    pixval red, green, blue;        /* cache: values of current pixel */
} ppm_fs_info;
#define FS_ALTERNATE    (1<<0)
#define FS_RANDOMINIT   (1<<1)


/* Declarations of routines. */

ppm_fs_info *   ppm_fs_init ARGS((int cols, pixval maxval, int flags));
void            ppm_fs_free ARGS((ppm_fs_info *fi));

int             ppm_fs_startrow ARGS((ppm_fs_info *fi, pixel *pixrow));
int             ppm_fs_next     ARGS((ppm_fs_info *fi, int col));
void            ppm_fs_endrow   ARGS((ppm_fs_info *fi));

void            ppm_fs_update  ARGS((ppm_fs_info *fi, int col, pixel *pP));
void            ppm_fs_update3 ARGS((ppm_fs_info *fs, int col, pixval r, pixval g, pixval b));


#if 0       /* EXAMPLE */
void
do_something(pixels, cols, rows, maxval, use_floyd)
    pixel **pixels;
    int cols, rows;
    pixval maxval;
    int use_floyd;
{
    ppm_fs_info *fi;
    int row, col;

    if( use_floyd )
        fi = ppm_fs_init(cols, maxval, FS_ALTERNATE);
    else
        fi = NULL;

    for( row = 0; row < rows; row++ ) {
        for( col = ppm_fs_startrow(fi, pixels[row]); col < cols; col = ppm_fs_next(fi, col) ) {
            pixel *pP = &pixrow[col];

            /* do something with the pixel */

            ppm_fs_update(fi, col, pP);
        }
        ppm_fs_endrow(fi);
    }
    ppm_fs_free(fi);
}
#endif /* 0 */






#endif /* _PPM_FLOYD_H_ */

