001: /*
002: * $RCSfile: TIFFCodecLibT4Compressor.java,v $
003: *
004: *
005: * Copyright (c) 2005 Sun Microsystems, Inc. All Rights Reserved.
006: *
007: * Redistribution and use in source and binary forms, with or without
008: * modification, are permitted provided that the following conditions
009: * are met:
010: *
011: * - Redistribution of source code must retain the above copyright
012: * notice, this list of conditions and the following disclaimer.
013: *
014: * - Redistribution in binary form must reproduce the above copyright
015: * notice, this list of conditions and the following disclaimer in
016: * the documentation and/or other materials provided with the
017: * distribution.
018: *
019: * Neither the name of Sun Microsystems, Inc. or the names of
020: * contributors may be used to endorse or promote products derived
021: * from this software without specific prior written permission.
022: *
023: * This software is provided "AS IS," without a warranty of any
024: * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
025: * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
026: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
027: * EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
028: * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
029: * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
030: * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
031: * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
032: * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
033: * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
034: * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
035: * POSSIBILITY OF SUCH DAMAGES.
036: *
037: * You acknowledge that this software is not designed or intended for
038: * use in the design, construction, operation or maintenance of any
039: * nuclear facility.
040: *
041: * $Revision: 1.2 $
042: * $Date: 2006/01/30 23:22:03 $
043: * $State: Exp $
044: */
045: package com.sun.media.imageioimpl.plugins.tiff;
046:
047: public class TIFFCodecLibT4Compressor extends TIFFT4Compressor {
048:
049: private static final boolean DEBUG = false; // XXX 'false' for release!!!
050:
051: Object encoder;
052:
053: public TIFFCodecLibT4Compressor() {
054: super ();
055:
056: try {
057: com.sun.medialib.codec.g3fax.Encoder encoder = new com.sun.medialib.codec.g3fax.Encoder();
058: this .encoder = encoder;
059: } catch (Throwable t) {
060: throw new RuntimeException("CodecLib not available");
061: }
062: }
063:
064: /**
065: * Encode a buffer of data using CCITT T.4 Compression also known as
066: * Group 3 facsimile compression.
067: *
068: * @param is1DMode Whether to perform one-dimensional encoding.
069: * @param isEOLAligned Whether EOL bit sequences should be padded.
070: * @param data The row of data to compress.
071: * @param lineStride Byte step between the same sample in different rows.
072: * @param colOffset Bit offset within first <code>data[rowOffset]</code>.
073: * @param width Number of bits in the row.
074: * @param height Number of rows in the buffer.
075: * @param compData The compressed data.
076: *
077: * @return The number of bytes saved in the compressed data array.
078: */
079: public final int encodeT4(boolean is1DMode, boolean isEOLAligned,
080: byte[] data, int lineStride, int colOffset, int width,
081: int height, byte[] compData) {
082:
083: // Defer to superclass if bit offset is not byte-aligned.
084: if (colOffset % 8 != 0) {
085: return super .encodeT4(is1DMode, isEOLAligned, data,
086: lineStride, colOffset, width, height, compData);
087: }
088:
089: // Set image to data if possible; otherwise copy.
090: int bytesPerRow = (width + 7) / 8;
091: byte[] image = null;
092:
093: if (colOffset == 0 && bytesPerRow == lineStride) {
094: image = data;
095: } else {
096: image = new byte[bytesPerRow * height];
097: int dataOffset = colOffset / 8;
098: int imageOffset = 0;
099: for (int row = 0; row < height; row++) {
100: System.arraycopy(data, dataOffset, image, imageOffset,
101: bytesPerRow);
102: dataOffset += lineStride;
103: imageOffset += bytesPerRow;
104: }
105: }
106:
107: // Attempt the codecLib encoder.
108: com.sun.medialib.codec.g3fax.Encoder clibEncoder = (com.sun.medialib.codec.g3fax.Encoder) encoder;
109: //System.out.println("Using codecLib G3 encoder");
110:
111: // Set encoding flags.
112: int encodingFlags = is1DMode ? com.sun.medialib.codec.g3fax.Constants.G3FAX_HORIZONTAL_CODING
113: : com.sun.medialib.codec.g3fax.Constants.G3FAX_VERTICAL_CODING;
114: if (isEOLAligned) {
115: encodingFlags |= com.sun.medialib.codec.g3fax.Constants.G3FAX_EOLPADDING;
116: }
117: if (inverseFill) {
118: encodingFlags |= com.sun.medialib.codec.g3fax.Constants.G3FAX_LSB2MSB;
119: }
120:
121: int result = com.sun.medialib.codec.g3fax.Constants.G3FAX_FAILURE;
122: try {
123: if (DEBUG) {
124: System.out.println("Using MediaLib G3 encoder");
125: }
126: result = clibEncoder.encode(compData, image, width, height,
127: 2, // k parameter
128: encodingFlags);
129: } catch (Throwable t) {
130: if (DEBUG) {
131: System.out.println("MediaLib G3 encoder failed: " + t);
132: }
133: // XXX Should write a warning to listeners here.
134: result = com.sun.medialib.codec.g3fax.Constants.G3FAX_FAILURE;
135: }
136:
137: // If the codecLib encoder failed, try the superclass.
138: if (result == com.sun.medialib.codec.g3fax.Constants.G3FAX_FAILURE) {
139: if (DEBUG) {
140: System.out.println("Falling back to Java G3 encoder");
141: }
142: result = super.encodeT4(is1DMode, isEOLAligned, data,
143: lineStride, colOffset, width, height, compData);
144: }
145:
146: return result;
147: }
148: }
|