/* * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package com.sun.imageio.plugins.tiff; import java.io.IOException; import javax.imageio.ImageWriter; import javax.imageio.metadata.IIOMetadata; import javax.imageio.stream.ImageOutputStream; /** * An abstract superclass for pluggable TIFF compressors. */ public abstract class TIFFCompressor { /** * The {@code ImageWriter} calling this * {@code TIFFCompressor}. */ protected ImageWriter writer; /** * The {@code IIOMetadata} object containing metadata for the * current image. */ protected IIOMetadata metadata; /** * The name of the compression type supported by this compressor. */ protected String compressionType; /** * The value to be assigned to the TIFF <i>Compression</i> tag in the * TIFF image metadata. */ protected int compressionTagValue; /** * Whether the compression is lossless. */ protected boolean isCompressionLossless; /** * The {@code ImageOutputStream} to be written. */ protected ImageOutputStream stream; /** * Creates a compressor object for use in compressing TIFF data. This * object may be passed to the * {@link TIFFImageWriteParam#setTIFFCompressor(TIFFCompressor)} * method to override the compressor of a supported compression type or * to provide the implementation of the compression algorithm of an * unsupported compression type. * * <p>The parameters {@code compressionTagValue} and * {@code isCompressionLossless} are provided to accomodate * compression types which are unknown. A compression type is * "known" if it is either among those already supported by the * TIFF writer (see {@link TIFFImageWriteParam}), or is listed in * the TIFF 6.0 specification but not supported. If the compression * type is unknown, the {@code compressionTagValue} and * {@code isCompressionLossless} parameters are ignored.</p> * * @param compressionType The name of the compression type. * @param compressionTagValue The value to be assigned to the TIFF * <i>Compression</i> tag in the TIFF image metadata; ignored if * {@code compressionType} is a known type. * @param isCompressionLossless Whether the compression is lossless; * ignored if {@code compressionType} is a known type. * * @throws NullPointerException if {@code compressionType} is * {@code null}. * @throws IllegalArgumentException if {@code compressionTagValue} is * less {@code 1}. */ public TIFFCompressor(String compressionType, int compressionTagValue, boolean isCompressionLossless) { if(compressionType == null) { throw new NullPointerException("compressionType == null"); } else if(compressionTagValue < 1) { throw new IllegalArgumentException("compressionTagValue < 1"); } // Set the compression type. this.compressionType = compressionType; // Determine whether this type is either defined in the TIFF 6.0 // specification or is already supported. int compressionIndex = -1; String[] compressionTypes = TIFFImageWriter.compressionTypes; int len = compressionTypes.length; for(int i = 0; i < len; i++) { if(compressionTypes[i].equals(compressionType)) { // Save the index of the supported type. compressionIndex = i; break; } } if(compressionIndex != -1) { // Known compression type. this.compressionTagValue = TIFFImageWriter.compressionNumbers[compressionIndex]; this.isCompressionLossless = TIFFImageWriter.isCompressionLossless[compressionIndex]; } else { // Unknown compression type. this.compressionTagValue = compressionTagValue; this.isCompressionLossless = isCompressionLossless; } } /** * Retrieve the name of the compression type supported by this compressor. * * @return The compression type name. */ public String getCompressionType() { return compressionType; } /** * Retrieve the value to be assigned to the TIFF <i>Compression</i> tag * in the TIFF image metadata. * * @return The <i>Compression</i> tag value. */ public int getCompressionTagValue() { return compressionTagValue; } /** * Retrieves a value indicating whether the compression is lossless. * * @return Whether the compression is lossless. */ public boolean isCompressionLossless() { return isCompressionLossless; } /** * Sets the {@code ImageOutputStream} to be written. * * @param stream an {@code ImageOutputStream} to be written. * * @see #getStream */ public void setStream(ImageOutputStream stream) { this.stream = stream; } /** * Returns the {@code ImageOutputStream} that will be written. * * @return an {@code ImageOutputStream}. * * @see #setStream(ImageOutputStream) */ public ImageOutputStream getStream() { return stream; } /** * Sets the value of the {@code writer} field. * * @param writer the current {@code ImageWriter}. * * @see #getWriter() */ public void setWriter(ImageWriter writer) { this.writer = writer; } /** * Returns the current {@code ImageWriter}. * * @return an {@code ImageWriter}. * * @see #setWriter(ImageWriter) */ public ImageWriter getWriter() { return this.writer; } /** * Sets the value of the {@code metadata} field. * * @param metadata the {@code IIOMetadata} object for the * image being written. * * @see #getMetadata() */ public void setMetadata(IIOMetadata metadata) { this.metadata = metadata; } /** * Returns the current {@code IIOMetadata} object. * * @return the {@code IIOMetadata} object for the image being * written. * * @see #setMetadata(IIOMetadata) */ public IIOMetadata getMetadata() { return this.metadata; } /** * Encodes the supplied image data, writing to the currently set * {@code ImageOutputStream}. * * @param b an array of {@code byte}s containing the packed * but uncompressed image data. * @param off the starting offset of the data to be written in the * array {@code b}. * @param width the width of the rectangle of pixels to be written. * @param height the height of the rectangle of pixels to be written. * @param bitsPerSample an array of {@code int}s indicting * the number of bits used to represent each image sample within * a pixel. * @param scanlineStride the number of bytes separating each * row of the input data. * * @return the number of bytes written. * * @throws IOException if the supplied data cannot be encoded by * this {@code TIFFCompressor}, or if any I/O error occurs * during writing. */ public abstract int encode(byte[] b, int off, int width, int height, int[] bitsPerSample, int scanlineStride) throws IOException; }