Package org.apache.sanselan.formats.tiff.write

Source Code of org.apache.sanselan.formats.tiff.write.TiffOutputDirectory

/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements.  See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License.  You may obtain a copy of the License at
*
*      http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.sanselan.formats.tiff.write;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import org.apache.sanselan.ImageWriteException;
import org.apache.sanselan.common.BinaryOutputStream;
import org.apache.sanselan.formats.tiff.JpegImageData;
import org.apache.sanselan.formats.tiff.TiffDirectory;
import org.apache.sanselan.formats.tiff.TiffElement;
import org.apache.sanselan.formats.tiff.TiffImageData;
import org.apache.sanselan.formats.tiff.constants.TagConstantsUtils;
import org.apache.sanselan.formats.tiff.constants.TagInfo;
import org.apache.sanselan.formats.tiff.constants.TiffConstants;
import org.apache.sanselan.formats.tiff.fieldtypes.FieldType;

public final class TiffOutputDirectory extends TiffOutputItem implements
        TiffConstants
{
    public final int type;
    private final ArrayList fields = new ArrayList();

    private TiffOutputDirectory nextDirectory = null;

    public void setNextDirectory(TiffOutputDirectory nextDirectory)
    {
        this.nextDirectory = nextDirectory;
    }

    public TiffOutputDirectory(final int type)
    {
        this.type = type;
    }

    public void add(TiffOutputField field)
    {
        fields.add(field);
    }

    public ArrayList getFields()
    {
        return new ArrayList(fields);
    }

    public void removeField(TagInfo tagInfo)
    {
        removeField(tagInfo.tag);
    }

    public void removeField(int tag)
    {
        ArrayList matches = new ArrayList();
        for (int i = 0; i < fields.size(); i++)
        {
            TiffOutputField field = (TiffOutputField) fields.get(i);
            if (field.tag == tag)
                matches.add(field);
        }
        fields.removeAll(matches);
    }

    public TiffOutputField findField(TagInfo tagInfo)
    {
        return findField(tagInfo.tag);
    }

    public TiffOutputField findField(int tag)
    {
        for (int i = 0; i < fields.size(); i++)
        {
            TiffOutputField field = (TiffOutputField) fields.get(i);
            if (field.tag == tag)
                return field;
        }
        return null;
    }

    public void sortFields()
    {
        Comparator comparator = new Comparator() {
            public int compare(Object o1, Object o2)
            {
                TiffOutputField e1 = (TiffOutputField) o1;
                TiffOutputField e2 = (TiffOutputField) o2;

                if (e1.tag != e2.tag)
                    return e1.tag - e2.tag;
                return e1.getSortHint() - e2.getSortHint();
            }
        };
        Collections.sort(fields, comparator);
    }

    public String description()
    {
        return TiffDirectory.description(type);
    }

    public void writeItem(BinaryOutputStream bos) throws IOException,
            ImageWriteException
    {
        // Write Directory Field Count
        bos.write2Bytes(fields.size()); // DirectoryFieldCount

        // Write Fields
        for (int i = 0; i < fields.size(); i++)
        {
            TiffOutputField field = (TiffOutputField) fields.get(i);
            field.writeField(bos);

//             Debug.debug("\t" + "writing field (" + field.tag + ", 0x" +
//             Integer.toHexString(field.tag) + ")", field.tagInfo);
//             if(field.tagInfo.isOffset())
//             Debug.debug("\t\tOFFSET!", field.bytes);
        }

        int nextDirectoryOffset = 0;
        if (nextDirectory != null)
            nextDirectoryOffset = nextDirectory.getOffset();

        // Write nextDirectoryOffset
        if (nextDirectoryOffset == UNDEFINED_VALUE)
            bos.write4Bytes(0);
        else
            bos.write4Bytes(nextDirectoryOffset);
    }

    private JpegImageData jpegImageData = null;

    public void setJpegImageData(JpegImageData rawJpegImageData)
    {
        this.jpegImageData = rawJpegImageData;
    }

    public JpegImageData getRawJpegImageData()
    {
        return jpegImageData;
    }

    private TiffImageData tiffImageData = null;

    public void setTiffImageData(TiffImageData rawTiffImageData)
    {
        this.tiffImageData = rawTiffImageData;
    }

    public TiffImageData getRawTiffImageData()
    {
        return tiffImageData;
    }

    public int getItemLength()
    {
        return TIFF_ENTRY_LENGTH * fields.size() + TIFF_DIRECTORY_HEADER_LENGTH
                + TIFF_DIRECTORY_FOOTER_LENGTH;
    }

    public String getItemDescription()
    {
        ExifDirectoryType dirType = TagConstantsUtils
                .getExifDirectoryType(type);
        return "Directory: " + dirType.name + " (" + type + ")";
    }

    private void removeFieldIfPresent(TagInfo tagInfo)
    {
        TiffOutputField field = findField(tagInfo);
        if (null != field)
            fields.remove(field);
    }

    protected List getOutputItems(TiffOutputSummary outputSummary)
            throws ImageWriteException
    {
        // first validate directory fields.

        removeFieldIfPresent(TIFF_TAG_JPEG_INTERCHANGE_FORMAT);
        removeFieldIfPresent(TIFF_TAG_JPEG_INTERCHANGE_FORMAT_LENGTH);

        TiffOutputField jpegOffsetField = null;
        if (null != jpegImageData)
        {
            jpegOffsetField = new TiffOutputField(
                    TIFF_TAG_JPEG_INTERCHANGE_FORMAT, FIELD_TYPE_LONG, 1,
                    FieldType.getStubLocalValue());
            add(jpegOffsetField);

            byte lengthValue[] = FIELD_TYPE_LONG.writeData(
                    new int[] { jpegImageData.length, },
                    outputSummary.byteOrder);

            TiffOutputField jpegLengthField = new TiffOutputField(
                    TIFF_TAG_JPEG_INTERCHANGE_FORMAT_LENGTH, FIELD_TYPE_LONG,
                    1, lengthValue);
            add(jpegLengthField);

        }

        // --------------------------------------------------------------

        removeFieldIfPresent(TIFF_TAG_STRIP_OFFSETS);
        removeFieldIfPresent(TIFF_TAG_STRIP_BYTE_COUNTS);
        removeFieldIfPresent(TIFF_TAG_TILE_OFFSETS);
        removeFieldIfPresent(TIFF_TAG_TILE_BYTE_COUNTS);

        TiffOutputField imageDataOffsetField;
        ImageDataOffsets imageDataInfo = null;
        if (null != tiffImageData)
        {
            boolean stripsNotTiles = tiffImageData.stripsNotTiles();

            TagInfo offsetTag;
            TagInfo byteCountsTag;
            if (stripsNotTiles)
            {
                offsetTag = TIFF_TAG_STRIP_OFFSETS;
                byteCountsTag = TIFF_TAG_STRIP_BYTE_COUNTS;
            } else
            {
                offsetTag = TIFF_TAG_TILE_OFFSETS;
                byteCountsTag = TIFF_TAG_TILE_BYTE_COUNTS;
            }

            // --------

            TiffElement.DataElement imageData[] = tiffImageData.getImageData();

            int imageDataOffsets[] = null;
            int imageDataByteCounts[] = null;
            // TiffOutputField imageDataOffsetsField = null;

            imageDataOffsets = new int[imageData.length];
            imageDataByteCounts = new int[imageData.length];
            for (int i = 0; i < imageData.length; i++)
            {
                imageDataByteCounts[i] = imageData[i].length;
            }

            // --------

            // Append imageData-related fields to first directory
            imageDataOffsetField = new TiffOutputField(offsetTag,
                    FIELD_TYPE_LONG, imageDataOffsets.length, FIELD_TYPE_LONG
                            .writeData(imageDataOffsets,
                                    outputSummary.byteOrder));
            add(imageDataOffsetField);

            // --------

            byte data[] = FIELD_TYPE_LONG.writeData(imageDataByteCounts,
                    outputSummary.byteOrder);
            TiffOutputField byteCountsField = new TiffOutputField(
                    byteCountsTag, FIELD_TYPE_LONG, imageDataByteCounts.length,
                    data);
            add(byteCountsField);

            // --------

            imageDataInfo = new ImageDataOffsets(imageData, imageDataOffsets,
                    imageDataOffsetField);
        }

        // --------------------------------------------------------------

        List result = new ArrayList();
        result.add(this);
        sortFields();

        for (int i = 0; i < fields.size(); i++)
        {
            TiffOutputField field = (TiffOutputField) fields.get(i);
            if (field.isLocalValue())
                continue;

            TiffOutputItem item = field.getSeperateValue();
            result.add(item);
            // outputSummary.add(item, field);
        }

        if (null != imageDataInfo)
        {
            for (int i = 0; i < imageDataInfo.outputItems.length; i++)
                result.add(imageDataInfo.outputItems[i]);

            outputSummary.addTiffImageData(imageDataInfo);
        }

        if (null != jpegImageData)
        {
            TiffOutputItem item = new TiffOutputItem.Value("JPEG image data",
                    jpegImageData.data);
            result.add(item);
            outputSummary.add(item, jpegOffsetField);
        }

        return result;
    }
}
TOP

Related Classes of org.apache.sanselan.formats.tiff.write.TiffOutputDirectory

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.