#include <iff.h>
#include <graphics/view.h>
#include <stdio.h>


const char amiga_version[] = "\0$VER: dumpBMHD 1.0";


const char *maskmode[] = { "None", "HasMask", "HasTransparentColor", "Lasso" };
const char *cprmode[]  = { "None", "ByteRun1" };
#define UNKNOWN     (const char *)"Unknown"
#define MASKTABSZ   sizeof(maskmode)/sizeof(const char *)
#define CPRTABSZ    sizeof(cprmode)/sizeof(const char *)

const struct vmodestruct {
    USHORT mode;
    const char *name;
} viewmode[] = {
    { GENLOCK_VIDEO  , "GENLOCK_VIDEO"   },
    { LACE           , "LACE"            },
    { DOUBLESCAN     , "DOUBLESCAN"      },
    { SUPERHIRES     , "SUPERHIRES"      },
    { PFBA           , "PFBA"            },
    { EXTRA_HALFBRITE, "EXTRA_HALFBRITE" },
    { GENLOCK_AUDIO  , "GENLOCK_AUDIO"   },
    { DUALPF         , "DUALPF"          },
    { HAM            , "HAM"             },
    { EXTENDED_MODE  , "EXTENDED_MODE"   },
    { VP_HIDE        , "VP_HIDE"         },
    { SPRITES        , "SPRITES"         },
    { HIRES          , "HIRES"           }
};
#define VMTABSZ     sizeof(viewmode)/sizeof(struct vmodestruct)


void dumpBMHD(filename)
    char *filename;
{
    IFFL_HANDLE ifh;
    struct IFFL_BMHD *bmhd;
    ULONG *camg;

    if( ifh = IFFL_OpenIFF(filename, IFFL_MODE_READ) ) {

        printf("\nFile: %s\n\n", filename);

        if( bmhd = IFFL_GetBMHD(ifh) ) {
            int x;

            printf("width: %d    height: %d\n", bmhd->w, bmhd->h);
            printf("pixel position  x: %d    y: %d\n", bmhd->x, bmhd->y);
            printf("planes: %d\n", bmhd->nPlanes);

            x = bmhd->masking;
            printf("masking: %s (%d)\n", x < MASKTABSZ ? maskmode[x] : UNKNOWN, x);
            x = bmhd->compression;
            printf("compression: %s (%d)\n", x < CPRTABSZ ? cprmode[x] : UNKNOWN, x);

            printf("transparent color: %d\n", bmhd->transparentColor);
            printf("xAspect: %d    yAspect: %d\n", bmhd->xAspect, bmhd->yAspect);
            printf("pageWidth: %d    pageHeight: %d\n", bmhd->pageWidth, bmhd->pageHeight);
        }
        else
            printf("no BMHD chunk found\n");

        if( camg = IFFL_FindChunk(ifh, ID_CAMG) ) {
            camg++;
            if( *camg == 4 ) {
                ULONG id;
                id = *++camg & 0x0000ffff;
                int i;

                printf("\nViewModes (lower word): 0x%04lx =", id);

                for( i = 0; i < VMTABSZ; i++ ) {
                    if( id & viewmode[i].mode ) {
                        printf(" %s", viewmode[i].name);
                        id &= ~viewmode[i].mode;
                    }
                }
                if( id )
                    printf(" 0x%04lx\n", id);
                printf("\n");

                id = (*camg & 0xffff0000) >> 16;
                printf("ViewModes (upper word): 0x%04lx\n", id);
            }
            else
                printf("\nError reading CAMG chunk: chunksize %d ??\n", *camg);
        }
        else
            printf("\nno CAMG chunk found\n");

        IFFL_CloseIFF(ifh);
    }
    else
        printf("\ncannot open %s\n", filename);

    printf("\n\n");
}


main(argc, argv)
    int argc;
    char *argv[];
{
    int i;

    if( argc > 1) {
        for( i = 1; i < argc; i++ ) {
            dumpBMHD(argv[i]);
        }
    }
    else
        printf("usage: %s <ilbm-files>\n", argv[0]);
}

