/*
 * @(#)BaselineTagSet.java  1.0.2  2011-01-28
 *
 * Copyright (c) 2010 Werner Randelshofer, Immensee, Switzerland.
 * All rights reserved.
 *
 * You may not use, copy or modify this file, except in compliance with the
 * license agreement you entered into with Werner Randelshofer.
 * For details see accompanying license terms.
 */
package org.monte.media.tiff;

import static org.monte.media.tiff.TIFFTag.*;

/**
 * A class representing the set of tags found in the baseline TIFF specification
 * as well as some common additional tags.
 * @author Werner Randelshofer
 * @version 1.0.2 2011-01-28 Added some constants.
 * <br>1.0 2010-07-24 Created.
 */
public class BaselineTagSet extends TagSet {

    private static BaselineTagSet instance;
    public final static int TAG_EXIF = 0x8769;
    public final static int TAG_GPS = 0x8825;
    public final static int TAG_Interoperability = 0xa005;
    public final static int TAG_JPEGInterchangeFormat = 0x201;
    public final static int TAG_JPEGInterchangeFormatLength = 0x202;
    public final static TIFFTag ImageWidth = new TIFFTag("ImageWidth", 0x100, SHORT_MASK | LONG_MASK);
    public final static TIFFTag ImageHeight = new TIFFTag("ImageLength", 0x101, SHORT_MASK | LONG_MASK);
    public final static TIFFTag Make = new TIFFTag("Make", 0x10f, ASCII_MASK);
    public final static TIFFTag Model = new TIFFTag("Model", 0x110, ASCII_MASK);
    public final static TIFFTag DateTime = new TIFFTag("DateTime", 0x132, ASCII_MASK, new DateValueFormatter());
    public final static TIFFTag BitsPerSample=new TIFFTag("BitsPerSample", 0x102, SHORT_MASK);
   public final static TIFFTag SamplesPerPixel= new TIFFTag("SamplesPerPixel", 0x115, SHORT_MASK);
    /** Synthetic tags. */
    public final static int TAG_JPEGThumbnailImage = -1;
    public final static TIFFTag JPEGThumbnailImage = new TIFFTag("JPEGThumbnailImage", TAG_JPEGThumbnailImage, UNDEFINED_MASK);

    private BaselineTagSet(TIFFTag[] tags) {
        super("Baseline", tags);
    }

    /** Returns a shared instance of a BaselineTagSet. */
    public static BaselineTagSet getInstance() {
        if (instance == null) {
            TIFFTag[] tags = {//
                // Color:
                new TIFFTag("PhotometricInterpretation", 0x106, SHORT_MASK, new EnumValueFormatter(
                "WhiteIsZero", (0x0), //
                "BlackIsZero", (0x1), //
                "RGB", (0x2), //
                "RGBPalette", (0x3), //
                "TransparencyMask", (0x4), //
                "CMYK", (0x5), //
                "YCbCR", (0x6), //
                "CIELab", (0x8))),
                // Compression: See CompressionValue enum.
                new TIFFTag("Compression", 0x103, SHORT_MASK, new EnumValueFormatter(
                "Uncompressed", (0x1), //
                "CCITT1D", (0x2), //
                "Group3Fax", (0x3), //
                "Group4Fax", (0x4), //
                "LZW", (0x5), //
                "JPEG", (0x6), //
                "PackBits", (0x8005) //
                )),
                // Rows and columns:
                ImageWidth,ImageHeight,
                
                // Physical Dimensions
                new TIFFTag("ResolutionUnit", 0x128, SHORT_MASK, new EnumValueFormatter( //
                "noAbsoluteUnitOfMeasurement", 1,//
                "inch", 2,//
                "centimeter", 3//
                )),
                new TIFFTag("XResolution", 0x11a, RATIONAL_MASK),
                new TIFFTag("YResolution", 0x11b, RATIONAL_MASK),
                // Location of the data
                new TIFFTag("RowsPerStrip", 0x116, SHORT_MASK | LONG_MASK),
                new TIFFTag("StripOffsets", 0x111, SHORT_MASK | LONG_MASK),
                new TIFFTag("StripByteCounts", 0x117, SHORT_MASK | LONG_MASK),
                //
                new TIFFTag("Artist", 0x13b, ASCII_MASK),
                BitsPerSample,
                new TIFFTag("CellWidth", 0x108, SHORT_MASK),
                new TIFFTag("CellLength", 0x109, SHORT_MASK),
                new TIFFTag("ColorMap", 0x140, SHORT_MASK),
                new TIFFTag("NewSubfileType", 0xfe, LONG_MASK, new SetValueFormatter( //
                "reducedResolutionVersion", 1,//
                "singlePageOfMultiPageImage", 2,//
                "transparencyMask", 4//
                )),
                new TIFFTag("SubfileType", 0xff, SHORT_MASK, new EnumValueFormatter( //todo
                "fullResolutionVersion", 1,//
                "reducedResolutionVersion", 2,//
                "singlePageOfMultiPageImage", 3//
                )),
                new TIFFTag("Threshholding", 0x107, SHORT_MASK, new EnumValueFormatter( //
                "noDitheringWasApplied", 1,//
                "orderedDither", 2,//
                "errorDiffusion", 3//
                )),
                new TIFFTag("FillOrder", 0x10a, SHORT_MASK, new EnumValueFormatter( // the logical order of bits whithin a byte
                "bigEndian", 1,//
                "littleEndian", 2//
                )),
                new TIFFTag("DocumentName", 0x10d, ASCII_MASK),
                new TIFFTag("ImageDescription", 0x10e, ASCII_MASK),
                Make, Model,
                new TIFFTag("Orientation", 0x112, SHORT_MASK, new EnumValueFormatter(
                "topLeft", (0x1), //
                "topRight", (0x2), //
                "bottomRight", (0x3), //
                "bottomLeft", (0x4), //
                "leftTop", (0x5), //
                "rightTop", (0x6), //
                "rightBottom", (0x7), //
                "leftBottom", (0x8) //
                )),
                SamplesPerPixel,
                new TIFFTag("MinSampleValue", 0x118, SHORT_MASK),
                new TIFFTag("MaxSampleValue", 0x119, SHORT_MASK),
                new TIFFTag("PlanarConfiguration", 0x11c, SHORT_MASK, new EnumValueFormatter(
                "chunky", 1,//
                "planar", 2//
                )),
                new TIFFTag("PageName", 0x11d, ASCII_MASK),
                new TIFFTag("XPosition", 0x11e, RATIONAL_MASK),
                new TIFFTag("YPosition", 0x11f, RATIONAL_MASK),
                new TIFFTag("FreeOffsets", 0x120, LONG_MASK),
                new TIFFTag("FreeByteCounts", 0x1219, LONG_MASK),
                new TIFFTag("GrayResponseUnit", 0x122, SHORT_MASK, new EnumValueFormatter( //
                "tenths", 1,//
                "hundredths", 2,//
                "thousandths", 3,//
                "then-thousandths", 4,//
                "hundred-thousandths", 5//
                )),
                new TIFFTag("GrayResponseCurve", 0x123, SHORT_MASK),
                new TIFFTag("T4Options", 0x124, LONG_MASK, new SetValueFormatter( //
                "2dimensionalCoding", 1,//
                "uncompressed", 2,//
                "fillBitsBeforeEOL", 4//
                )),
                new TIFFTag("T6Options", 0x125, LONG_MASK, new SetValueFormatter( //
                "uncompressed", 2//
                )),
                new TIFFTag("PageNumber", 0x129, SHORT_MASK),
                new TIFFTag("TransferFunction", 0x12d, SHORT_MASK),
                new TIFFTag("Software", 0x131, ASCII_MASK),
                DateTime,
                new TIFFTag("HostComputer", 0x13c, ASCII_MASK),
                new TIFFTag("Predictor", 0x13d, SHORT_MASK, new EnumValueFormatter( //
                "noPredictionScheme", 1,//
                "horizontalDifferencing", 2//
                )),
                new TIFFTag("WhitePoint", 0x13e, RATIONAL_MASK),
                new TIFFTag("PrimaryChromaticities", 0x13f, RATIONAL_MASK),
                new TIFFTag("HalftoneHints", 0x141, SHORT_MASK),
                new TIFFTag("TileWidth", 0x142, SHORT_MASK | LONG_MASK),
                new TIFFTag("TileLength", 0x143, SHORT_MASK | LONG_MASK),
                new TIFFTag("TileOffsets", 0x144, LONG_MASK),
                new TIFFTag("TileByteCounts", 0x145, SHORT_MASK | LONG_MASK),
                new TIFFTag("InkSet", 0x14c, SHORT_MASK),
                new TIFFTag("InkNames", 0x14d, ASCII_MASK),
                new TIFFTag("NumberOfInks", 0x14e, SHORT_MASK),
                new TIFFTag("DotRange", 0x150, BYTE_MASK | SHORT_MASK),
                new TIFFTag("TargetPrinter", 0x151, ASCII_MASK),
                new TIFFTag("ExtraSamples", 0x152, SHORT_MASK, new EnumValueFormatter( //
                "unspecifiedData", 0,//
                "associatedAlphaData", 1,//
                "unassociatedAlphaData", 2//
                )),
                new TIFFTag("SampleFormat", 0x153, SHORT_MASK, new EnumValueFormatter( //
                "unsignedInteger", 1,//
                "signedInteger", 2,//
                "floatingPoint", 3,//
                "undefinedDataFormat", 4//
                )),
                new TIFFTag("SMinSampleValue", 0x154, BYTE_MASK | SHORT_MASK | LONG_MASK | SBYTE_MASK | SSHORT_MASK | SLONG_MASK),
                new TIFFTag("SMaxSampleValue", 0x155, BYTE_MASK | SHORT_MASK | LONG_MASK | SBYTE_MASK | SSHORT_MASK | SLONG_MASK),
                new TIFFTag("TransferRange", 0x156, SHORT_MASK),
                new TIFFTag("JPEGProc", 0x200, SHORT_MASK, new EnumValueFormatter( //
                "baselineSequential", 1,//
                "losslessHuffman", 14//
                )),
                new TIFFTag("JPEGInterchangeFormat", TAG_JPEGInterchangeFormat, LONG_MASK),
                new TIFFTag("JPEGInterchangeFormatLength", TAG_JPEGInterchangeFormatLength, LONG_MASK),
                JPEGThumbnailImage,
                new TIFFTag("JPEGRestartInterval", 0x203, SHORT_MASK),
                new TIFFTag("JPEGLosslessPredictors", 0x205, SHORT_MASK),
                new TIFFTag("JPEGPointTransforms", 0x206, SHORT_MASK),
                new TIFFTag("JPEGQTables", 0x207, LONG_MASK),
                new TIFFTag("JPEGDCTables", 0x208, LONG_MASK),
                new TIFFTag("JPEGACTables", 0x209, LONG_MASK),
                new TIFFTag("YCbCrCoefficients", 0x211, RATIONAL_MASK),
                new TIFFTag("YCbCrSubSampling", 0x212, SHORT_MASK),
                new TIFFTag("YCbCrPositioning", 0x213, SHORT_MASK, new EnumValueFormatter( //
                "centered", 1,//
                "cosited", 2//
                )),
                new TIFFTag("ReferenceBlackWhite", 0x214, RATIONAL_MASK),
                //
                new TIFFTag("Copyright", 0x8298, ASCII_MASK),
                // EXIF-specific IFD. See JEITA CP-3451, Page 15

                new TIFFTag("EXIF", TAG_EXIF, IFD_MASK | LONG_MASK), /* EXIF IFD Pointer */
                new TIFFTag("GPS", TAG_GPS, IFD_MASK | LONG_MASK), /* GPS IFD Pointer */
                new TIFFTag("Interoperability", TAG_Interoperability, IFD_MASK | LONG_MASK), /* Interoperability IFD Pointer */ //
            };
            instance = new BaselineTagSet(tags);

        }
        return instance;
    }
}
