/*====================================================================*
 -  Copyright (C) 2001 Leptonica.  All rights reserved.
 -
 -  Redistribution and use in source and binary forms, with or without
 -  modification, are permitted provided that the following conditions
 -  are met:
 -  1. Redistributions of source code must retain the above copyright
 -     notice, this list of conditions and the following disclaimer.
 -  2. Redistributions in binary form must reproduce the above
 -     copyright notice, this list of conditions and the following
 -     disclaimer in the documentation and/or other materials
 -     provided with the distribution.
 -
 -  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 -  ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 -  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 -  A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL ANY
 -  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 -  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 -  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 -  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 -  OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 -  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 -  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *====================================================================*/

/*
 * fileinfo.c
 *
 *   Returns information about the image data file
 */

#include "allheaders.h"

LEPT_DLL extern const char *ImageFileFormatExtensions[];

int main(int    argc,
         char **argv)
{
char        *text;
l_int32      w, h, d, wpl, count, npages, color;
l_int32      format, bps, spp, iscmap, xres, yres, transparency;
FILE        *fp;
PIX         *pix, *pixt;
PIXCMAP     *cmap;
char        *filein;
static char  mainName[] = "fileinfo";

    if (argc != 2)
        return ERROR_INT(" Syntax:  fileinfo filein", mainName, 1);
    filein = argv[1];

    l_pngSetReadStrip16To8(1);  /* to preserve 16 bpp if format is png */

        /* Read the header */
    if (pixReadHeader(filein, &format, &w, &h, &bps, &spp, &iscmap)) {
        fprintf(stderr, "Failure to read header!\n");
        return 1;
    }
    fprintf(stderr, "==========================\nReading the header:\n");
    fprintf(stderr, "  input image format type: %s\n",
            ImageFileFormatExtensions[format]);
    fprintf(stderr,
            "  w = %d, h = %d, bps = %d, spp = %d, iscmap = %d\n",
            w, h, bps, spp, iscmap);

    findFileFormat(filein, &format);
    if (format == IFF_JP2) {
        fp = lept_fopen(filein, "rb");
        fgetJp2kResolution(fp, &xres, &yres);
        fclose(fp);
        fprintf(stderr, "  xres = %d, yres = %d\n", xres, yres);
    } else if (format == IFF_PNG) {
        fp = lept_fopen(filein, "rb");
        fgetPngResolution(fp, &xres, &yres);
        fclose(fp);
        fprintf(stderr, "  xres = %d, yres = %d\n", xres, yres);
        if (iscmap) {
            fp = lept_fopen(filein, "rb");
            fgetPngColormapInfo(fp, &cmap, &transparency);
            fclose(fp);
            if (transparency)
                fprintf(stderr, "  colormap has transparency\n");
            else
                fprintf(stderr, "  colormap does not have transparency\n");
            pixcmapWriteStream(stderr, cmap);
            pixcmapDestroy(&cmap);
        }
    } else if (format == IFF_JFIF_JPEG) {
        fp = lept_fopen(filein, "rb");
        fgetJpegResolution(fp, &xres, &yres);
        fclose(fp);
        fprintf(stderr, "  xres = %d, yres = %d\n", xres, yres);
    }

        /* Read the full image.  Note that when we read an image that
         * has transparency in a colormap, we convert it to RGBA. */
    fprintf(stderr, "==========================\nReading the full image:\n");
    if ((pix = pixRead(filein)) == NULL)
        return ERROR_INT("image not returned from file", mainName, 1);

    format = pixGetInputFormat(pix);
    pixGetDimensions(pix, &w, &h, &d);
    wpl = pixGetWpl(pix);
    spp = pixGetSpp(pix);
    fprintf(stderr, "  input image format type: %s\n",
            ImageFileFormatExtensions[format]);
    fprintf(stderr, "  w = %d, h = %d, d = %d, spp = %d, wpl = %d\n",
            w, h, d, spp, wpl);
    fprintf(stderr, "  xres = %d, yres = %d\n",
            pixGetXRes(pix), pixGetYRes(pix));

    text = pixGetText(pix);
    if (text)  /*  not null */
        fprintf(stderr, "  text: %s\n", text);

    cmap = pixGetColormap(pix);
    if (cmap) {
        pixcmapHasColor(cmap, &color);
        if (color)
            fprintf(stderr, "  colormap exists and has color values:");
        else
            fprintf(stderr, "  colormap exists and has only gray values:");
        pixcmapWriteStream(stderr, pixGetColormap(pix));
    }
    else
        fprintf(stderr, "  colormap does not exist\n");

    if (format == IFF_TIFF || format == IFF_TIFF_G4 ||
        format == IFF_TIFF_G3 || format == IFF_TIFF_PACKBITS) {
        fprintf(stderr, "  Tiff header information:\n");
        fp = lept_fopen(filein, "rb");
        tiffGetCount(fp, &npages);
        lept_fclose(fp);
        if (npages == 1)
            fprintf(stderr, "    One page in file\n");
        else
            fprintf(stderr, "    %d pages in file\n", npages);
        fprintTiffInfo(stderr, filein);
    }

    if (d == 1) {
        pixCountPixels(pix, &count, NULL);
        fprintf(stderr, "  1 bpp: pixel ratio ON/OFF = %6.3f\n",
          (l_float32)count / (l_float32)(pixGetWidth(pix) * pixGetHeight(pix)));
    }

        /* If there is an alpha component, visualize it.  Note that when
         * alpha == 0, the rgb layer is transparent.  We visualize the
         * result when a white background is visible through the
         * transparency layer. */
    if (pixGetSpp(pix) == 4) {
        pixt = pixDisplayLayersRGBA(pix, 0xffffff00, 600.0);
        pixDisplay(pixt, 100, 100);
        pixDestroy(&pixt);
    }

    pixDestroy(&pix);
    return 0;
}
