#include "config.h"
#include "common.h"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <pipi.h>

int main(int argc, char *argv[])
{
    char *srcname = NULL, *dstname = NULL;
    pipi_image_t *img, *newimg;

    if(argc < 3)
    {
        fprintf(stderr, "%s: too few arguments\n", argv[0]);
        fprintf(stderr, "Usage: %s <src> <method> <dest>\n", argv[0]);
        fprintf(stderr, "Where <method> is one of:\n");
        fprintf(stderr, "  1   Floyd-Steinberg (raster)\n");
        fprintf(stderr, "  2   Floyd-Steinberg (serpentine)\n");
        fprintf(stderr, "  3   Ostromoukhov (raster)\n");
        fprintf(stderr, "  4   Ostromoukhov (serpentine)\n");
        fprintf(stderr, "  5   Direct binary search\n");
        return EXIT_FAILURE;
    }

    srcname = argv[1];
    dstname = argv[3];

    img = pipi_load(srcname);

    switch(atoi(argv[2]))
    {
        case 5:
            newimg = pipi_dbs(img); break;
        case 4:
            newimg = pipi_ostromoukhov(img, PIPI_SCAN_SERPENTINE); break;
        case 3:
            newimg = pipi_ostromoukhov(img, PIPI_SCAN_RASTER); break;
        case 2:
            newimg = pipi_floydsteinberg(img, PIPI_SCAN_SERPENTINE); break;
        case 1:
        default:
            newimg = pipi_floydsteinberg(img, PIPI_SCAN_RASTER); break;
    }

    pipi_free(img);

    pipi_save(newimg, dstname);
    pipi_free(newimg);

    return 0;
}