//========================================================================
//
// NetPBMWriter.h
//
// Copyright 1998-2003 Glyph & Cog, LLC
//
//========================================================================
//
//========================================================================
//
// Modified under the Poppler project - http://poppler.freedesktop.org
//
// All changes made under the Poppler project to this file are licensed
// under GPL version 2 or later
//
// Copyright (C) 2005, 2007, 2011, 2022 Albert Astals Cid <aacid@kde.org>
// Copyright (C) 2006 Rainer Keller <class321@gmx.de>
// Copyright (C) 2008 Timothy Lee <timothy.lee@siriushk.com>
// Copyright (C) 2008 Vasile Gaburici <gaburici@cs.umd.edu>
// Copyright (C) 2009 Carlos Garcia Campos <carlosgc@gnome.org>
// Copyright (C) 2009 William Bader <williambader@hotmail.com>
// Copyright (C) 2010 Jakob Voss <jakob.voss@gbv.de>
// Copyright (C) 2012, 2013 Adrian Johnson <ajohnson@redneon.com>
// Copyright (C) 2013 Thomas Fischer <fischer@unix-ag.uni-kl.de>
//
// To see a description of the changes please see the Changelog file that
// came with your tarball or type make ChangeLog if you are building from git
//
//========================================================================

#include "poppler-config.h"

#include "NetPBMWriter.h"

// Writer for the NetPBM formats (PBM and PPM)
// This format is documented at:
//   http://netpbm.sourceforge.net/doc/pbm.html
//   http://netpbm.sourceforge.net/doc/ppm.html

NetPBMWriter::NetPBMWriter(Format formatA) : format(formatA) { }

bool NetPBMWriter::init(FILE *f, int widthA, int heightA, double /*hDPI*/, double /*vDPI*/)
{
    file = f;
    width = widthA;
    if (format == MONOCHROME) {
        fprintf(file, "P4\n");
        fprintf(file, "%d %d\n", widthA, heightA);
    } else {
        fprintf(file, "P6\n");
        fprintf(file, "%d %d\n", widthA, heightA);
        fprintf(file, "255\n");
    }
    return true;
}

bool NetPBMWriter::writePointers(unsigned char **rowPointers, int rowCount)
{
    for (int i = 0; i < rowCount; i++) {
        writeRow(&rowPointers[i]);
    }
    return true;
}

bool NetPBMWriter::writeRow(unsigned char **row)
{
    if (format == MONOCHROME) {
        // PBM uses 0 = white, 1 = black so we need to invert the colors
        int size = (width + 7) / 8;
        for (int i = 0; i < size; i++) {
            fputc((*row)[i] ^ 0xff, file);
        }
    } else {
        fwrite(*row, 1, width * 3, file);
    }
    return true;
}

bool NetPBMWriter::close()
{
    return true;
}
