New code style. No functional changes.

This commit is contained in:
Harald Kuhr
2011-02-17 17:54:50 +01:00
parent 5bd896f80f
commit 770f948e1a
78 changed files with 1401 additions and 1412 deletions

View File

@@ -95,8 +95,8 @@ public class SVGImageReader extends ImageReaderBase {
}
@Override
public void setInput(Object pInput, boolean pSeekForwardOnly, boolean pIgnoreMetadata) {
super.setInput(pInput, pSeekForwardOnly, pIgnoreMetadata);
public void setInput(Object pInput, boolean seekForwardOnly, boolean ignoreMetadata) {
super.setInput(pInput, seekForwardOnly, ignoreMetadata);
if (imageInput != null) {
TranscoderInput input = new TranscoderInput(IIOUtil.createStreamAdapter(imageInput));

View File

@@ -126,11 +126,11 @@ public class TIFFImageReader extends ImageReaderBase {
checkBounds(pIndex);
}
protected void checkBounds(int pIndex) throws IOException {
if (pIndex < getMinIndex()){
protected void checkBounds(int index) throws IOException {
if (index < getMinIndex()){
throw new IndexOutOfBoundsException("index < minIndex");
}
else if (pIndex >= getNumImages(true)) {
else if (index >= getNumImages(true)) {
throw new IndexOutOfBoundsException("index > numImages");
}
}
@@ -179,9 +179,9 @@ public class TIFFImageReader extends ImageReaderBase {
throw new UnsupportedOperationException("Method getImageTypes not implemented");// TODO: Implement
}
public int getNumImages(boolean pAllowSearch) throws IOException {
public int getNumImages(boolean allowSearch) throws IOException {
init();
if (pAllowSearch) {
if (allowSearch) {
return mDecoder.getNumPages();
}
return -1;

View File

@@ -60,9 +60,9 @@ public class TIFFImageWriter extends ImageWriterBase {
}
@Override
public void setOutput(final Object pOutput) {
public void setOutput(final Object output) {
mEncoder = null;
super.setOutput(pOutput);
super.setOutput(output);
}
public IIOMetadata getDefaultImageMetadata(final ImageTypeSpecifier imageType, final ImageWriteParam param) {

View File

@@ -71,21 +71,21 @@ public abstract class ImageReaderBase extends ImageReader {
* the extension object is unsuitable, an
* {@code IllegalArgumentException} should be thrown.
*
* @param pProvider the {@code ImageReaderSpi} that is invoking this constructor, or {@code null}.
* @param provider the {@code ImageReaderSpi} that is invoking this constructor, or {@code null}.
*/
protected ImageReaderBase(final ImageReaderSpi pProvider) {
super(pProvider);
protected ImageReaderBase(final ImageReaderSpi provider) {
super(provider);
}
/**
* Overrides {@code setInput}, to allow easy access to the input, in case
* it is an {@code ImageInputStream}.
*
* @param pInput the {@code ImageInputStream} or other
* @param input the {@code ImageInputStream} or other
* {@code Object} to use for future decoding.
* @param pSeekForwardOnly if {@code true}, images and metadata
* @param seekForwardOnly if {@code true}, images and metadata
* may only be read in ascending order from this input source.
* @param pIgnoreMetadata if {@code true}, metadata
* @param ignoreMetadata if {@code true}, metadata
* may be ignored during reads.
*
* @exception IllegalArgumentException if {@code input} is
@@ -96,11 +96,11 @@ public abstract class ImageReaderBase extends ImageReader {
* @see ImageInputStream
*/
@Override
public void setInput(final Object pInput, final boolean pSeekForwardOnly, final boolean pIgnoreMetadata) {
public void setInput(final Object input, final boolean seekForwardOnly, final boolean ignoreMetadata) {
resetMembers();
super.setInput(pInput, pSeekForwardOnly, pIgnoreMetadata);
if (pInput instanceof ImageInputStream) {
imageInput = (ImageInputStream) pInput;
super.setInput(input, seekForwardOnly, ignoreMetadata);
if (input instanceof ImageInputStream) {
imageInput = (ImageInputStream) input;
}
}
@@ -130,11 +130,11 @@ public abstract class ImageReaderBase extends ImageReader {
/**
* Default implementation that always returns {@code null}.
*
* @param pImageIndex ignored, unless overridden
* @param imageIndex ignored, unless overridden
* @return {@code null}, unless overridden
* @throws IOException never, unless overridden.
*/
public IIOMetadata getImageMetadata(int pImageIndex) throws IOException {
public IIOMetadata getImageMetadata(int imageIndex) throws IOException {
return null;
}
@@ -151,11 +151,11 @@ public abstract class ImageReaderBase extends ImageReader {
/**
* Default implementation that always returns {@code 1}.
*
* @param pAllowSearch ignored, unless overridden
* @param allowSearch ignored, unless overridden
* @return {@code 1}, unless overridden
* @throws IOException never, unless overridden
*/
public int getNumImages(boolean pAllowSearch) throws IOException {
public int getNumImages(boolean allowSearch) throws IOException {
assertInput();
return 1;
}
@@ -163,18 +163,18 @@ public abstract class ImageReaderBase extends ImageReader {
/**
* Convenience method to make sure image index is within bounds.
*
* @param pIndex the image index
* @param index the image index
*
* @throws java.io.IOException if an error occurs during reading
* @throws IndexOutOfBoundsException if not {@code minIndex <= pIndex < numImages}
* @throws IndexOutOfBoundsException if not {@code minIndex <= index < numImages}
*/
protected void checkBounds(int pIndex) throws IOException {
protected void checkBounds(int index) throws IOException {
assertInput();
if (pIndex < getMinIndex()) {
if (index < getMinIndex()) {
throw new IndexOutOfBoundsException("index < minIndex");
}
else if (getNumImages(false) != -1 && pIndex >= getNumImages(false)) {
throw new IndexOutOfBoundsException("index >= numImages (" + pIndex + " >= " + getNumImages(false) + ")");
else if (getNumImages(false) != -1 && index >= getNumImages(false)) {
throw new IndexOutOfBoundsException("index >= numImages (" + index + " >= " + getNumImages(false) + ")");
}
}

View File

@@ -65,10 +65,10 @@ public abstract class ImageWriterBase extends ImageWriter {
* the extension object is unsuitable, an
* {@code IllegalArgumentException} should be thrown.
*
* @param pProvider the {@code ImageWriterSpi} that is constructing this object, or {@code null}.
* @param provider the {@code ImageWriterSpi} that is constructing this object, or {@code null}.
*/
protected ImageWriterBase(final ImageWriterSpi pProvider) {
super(pProvider);
protected ImageWriterBase(final ImageWriterSpi provider) {
super(provider);
}
public String getFormatName() throws IOException {
@@ -76,11 +76,11 @@ public abstract class ImageWriterBase extends ImageWriter {
}
@Override
public void setOutput(final Object pOutput) {
super.setOutput(pOutput);
public void setOutput(final Object output) {
super.setOutput(output);
if (pOutput instanceof ImageOutputStream) {
imageOutput = (ImageOutputStream) pOutput;
if (output instanceof ImageOutputStream) {
imageOutput = (ImageOutputStream) output;
}
}
@@ -98,21 +98,21 @@ public abstract class ImageWriterBase extends ImageWriter {
/**
* Returns {@code null}
*
* @param pParam ignored.
* @param param ignored.
* @return {@code null}.
*/
public IIOMetadata getDefaultStreamMetadata(final ImageWriteParam pParam) {
public IIOMetadata getDefaultStreamMetadata(final ImageWriteParam param) {
return null;
}
/**
* Returns {@code null}
*
* @param pInData ignored.
* @param pParam ignored.
* @param inData ignored.
* @param param ignored.
* @return {@code null}.
*/
public IIOMetadata convertStreamMetadata(final IIOMetadata pInData, final ImageWriteParam pParam) {
public IIOMetadata convertStreamMetadata(final IIOMetadata inData, final ImageWriteParam param) {
return null;
}

View File

@@ -44,51 +44,51 @@ public abstract class ProgressListenerBase implements IIOReadProgressListener, I
protected ProgressListenerBase() {
}
public void imageComplete(ImageReader pSource) {
public void imageComplete(ImageReader source) {
}
public void imageProgress(ImageReader pSource, float pPercentageDone) {
public void imageProgress(ImageReader source, float percentageDone) {
}
public void imageStarted(ImageReader pSource, int pImageIndex) {
public void imageStarted(ImageReader source, int imageIndex) {
}
public void readAborted(ImageReader pSource) {
public void readAborted(ImageReader source) {
}
public void sequenceComplete(ImageReader pSource) {
public void sequenceComplete(ImageReader source) {
}
public void sequenceStarted(ImageReader pSource, int pMinIndex) {
public void sequenceStarted(ImageReader source, int minIndex) {
}
public void thumbnailComplete(ImageReader pSource) {
public void thumbnailComplete(ImageReader source) {
}
public void thumbnailProgress(ImageReader pSource, float pPercentageDone) {
public void thumbnailProgress(ImageReader source, float percentageDone) {
}
public void thumbnailStarted(ImageReader pSource, int pImageIndex, int pThumbnailIndex) {
public void thumbnailStarted(ImageReader source, int imageIndex, int thumbnailIndex) {
}
public void imageComplete(ImageWriter pSource) {
public void imageComplete(ImageWriter source ) {
}
public void imageProgress(ImageWriter pSource, float pPercentageDone) {
public void imageProgress(ImageWriter source, float percentageDone) {
}
public void imageStarted(ImageWriter pSource, int pImageIndex) {
public void imageStarted(ImageWriter source, int imageIndex) {
}
public void thumbnailComplete(ImageWriter pSource) {
public void thumbnailComplete(ImageWriter source) {
}
public void thumbnailProgress(ImageWriter pSource, float pPercentageDone) {
public void thumbnailProgress(ImageWriter source, float percentageDone) {
}
public void thumbnailStarted(ImageWriter pSource, int pImageIndex, int pThumbnailIndex) {
public void thumbnailStarted(ImageWriter source, int imageIndex, int thumbnailIndex) {
}
public void writeAborted(ImageWriter pSource) {
public void writeAborted(ImageWriter source) {
}
}

View File

@@ -39,34 +39,34 @@ import java.awt.image.BufferedImage;
* @version $Id: Bitmap.java,v 1.0 25.feb.2006 00:29:44 haku Exp$
*/
abstract class BitmapDescriptor {
protected final DirectoryEntry mEntry;
protected final DIBHeader mHeader;
protected final DirectoryEntry entry;
protected final DIBHeader header;
protected BufferedImage mImage;
protected BufferedImage image;
public BitmapDescriptor(final DirectoryEntry pEntry, final DIBHeader pHeader) {
Validate.notNull(pEntry, "entry");
Validate.notNull(pHeader, "header");
mEntry = pEntry;
mHeader = pHeader;
entry = pEntry;
header = pHeader;
}
abstract public BufferedImage getImage();
public final int getWidth() {
return mEntry.getWidth();
return entry.getWidth();
}
public final int getHeight() {
return mEntry.getHeight();
return entry.getHeight();
}
protected final int getColorCount() {
return mEntry.getColorCount() != 0 ? mEntry.getColorCount() : 1 << getBitCount();
return entry.getColorCount() != 0 ? entry.getColorCount() : 1 << getBitCount();
}
protected final int getBitCount() {
return mEntry.getBitCount() != 0 ? mEntry.getBitCount() : mHeader.getBitCount();
return entry.getBitCount() != 0 ? entry.getBitCount() : header.getBitCount();
}
}

View File

@@ -43,17 +43,17 @@ import java.util.Hashtable;
* @version $Id: BitmapIndexed.java,v 1.0 25.feb.2006 00:29:44 haku Exp$
*/
class BitmapIndexed extends BitmapDescriptor {
protected final int[] mBits;
protected final int[] mColors;
protected final int[] bits;
protected final int[] colors;
private BitmapMask mMask;
private BitmapMask mask;
public BitmapIndexed(final DirectoryEntry pEntry, final DIBHeader pHeader) {
super(pEntry, pHeader);
mBits = new int[getWidth() * getHeight()];
bits = new int[getWidth() * getHeight()];
// NOTE: We're adding space for one extra color, for transparency
mColors = new int[getColorCount() + 1];
colors = new int[getColorCount() + 1];
}
public BufferedImage createImageIndexed() {
@@ -64,10 +64,9 @@ class BitmapIndexed extends BitmapDescriptor {
// This is slightly obscure, and should probably be moved..
Hashtable<String, Object> properties = null;
if (mEntry instanceof DirectoryEntry.CUREntry) {
DirectoryEntry.CUREntry entry = (DirectoryEntry.CUREntry) mEntry;
if (entry instanceof DirectoryEntry.CUREntry) {
properties = new Hashtable<String, Object>(1);
properties.put("cursor_hotspot", entry.getHotspot());
properties.put("cursor_hotspot", ((DirectoryEntry.CUREntry) this.entry).getHotspot());
}
BufferedImage image = new BufferedImage(
@@ -82,13 +81,13 @@ class BitmapIndexed extends BitmapDescriptor {
final int trans = icm.getTransparentPixel();
for (int y = 0; y < getHeight(); y++) {
for (int x = 0; x < getWidth(); x++) {
if (mMask.isTransparent(x, y)) {
mBits[x + getWidth() * y] = trans;
if (mask.isTransparent(x, y)) {
bits[x + getWidth() * y] = trans;
}
}
}
raster.setSamples(0, 0, getWidth(), getHeight(), 0, mBits);
raster.setSamples(0, 0, getWidth(), getHeight(), 0, bits);
//System.out.println("Image: " + image);
@@ -102,18 +101,18 @@ class BitmapIndexed extends BitmapDescriptor {
// NOTE: This is a hack to make room for transparent pixel for mask
int bits = getBitCount();
int colors = mColors.length;
int colors = this.colors.length;
int trans = -1;
// Try to avoid USHORT transfertype, as it results in BufferedImage TYPE_CUSTOM
// NOTE: This code assumes icons are small, and is NOT optimized for performance...
if (colors > (1 << getBitCount())) {
int index = BitmapIndexed.findTransIndexMaybeRemap(mColors, mBits);
int index = BitmapIndexed.findTransIndexMaybeRemap(this.colors, this.bits);
if (index == -1) {
// No duplicate found, increase bitcount
bits++;
trans = mColors.length - 1;
trans = this.colors.length - 1;
}
else {
// Found a duplicate, use it as trans
@@ -124,7 +123,7 @@ class BitmapIndexed extends BitmapDescriptor {
// NOTE: Setting hasAlpha to true, makes things work on 1.2
return new InverseColorMapIndexColorModel(
bits, colors, mColors, 0, true, trans,
bits, colors, this.colors, 0, true, trans,
bits <= 8 ? DataBuffer.TYPE_BYTE : DataBuffer.TYPE_USHORT
);
}
@@ -170,13 +169,13 @@ class BitmapIndexed extends BitmapDescriptor {
}
public BufferedImage getImage() {
if (mImage == null) {
mImage = createImageIndexed();
if (image == null) {
image = createImageIndexed();
}
return mImage;
return image;
}
public void setMask(final BitmapMask pMask) {
mMask = pMask;
mask = pMask;
}
}

View File

@@ -38,19 +38,19 @@ import java.awt.image.BufferedImage;
* @version $Id: BitmapMask.java,v 1.0 25.feb.2006 00:29:44 haku Exp$
*/
class BitmapMask extends BitmapDescriptor {
protected final BitmapIndexed mMask;
protected final BitmapIndexed mask;
public BitmapMask(final DirectoryEntry pParent, final DIBHeader pHeader) {
super(pParent, pHeader);
mMask = new BitmapIndexed(pParent, pHeader);
mask = new BitmapIndexed(pParent, pHeader);
}
boolean isTransparent(final int pX, final int pY) {
// NOTE: 1: Fully transparent, 0: Opaque...
return mMask.mBits[pX + pY * getWidth()] != 0;
return mask.bits[pX + pY * getWidth()] != 0;
}
public BufferedImage getImage() {
return mMask.getImage();
return mask.getImage();
}
}

View File

@@ -43,6 +43,6 @@ class BitmapRGB extends BitmapDescriptor {
}
public BufferedImage getImage() {
return mImage;
return image;
}
}

View File

@@ -38,15 +38,15 @@ import java.awt.image.BufferedImage;
* @version $Id: BitmapUnsupported.java,v 1.0 25.feb.2006 00:29:44 haku Exp$
*/
class BitmapUnsupported extends BitmapDescriptor {
private String mMessage;
private String message;
public BitmapUnsupported(final DirectoryEntry pEntry, final String pMessage) {
super(pEntry, null);
mMessage = pMessage;
message = pMessage;
}
public BufferedImage getImage() {
throw new IllegalStateException(mMessage);
throw new IllegalStateException(message);
}
}

View File

@@ -41,16 +41,16 @@ import java.io.IOException;
* @see <a href="http://en.wikipedia.org/wiki/BMP_file_format">BMP file format (Wikipedia)</a>
*/
abstract class DIBHeader {
protected int mSize;
protected int size;
protected int mWidth;
protected int width;
// NOTE: If a bitmask is present, this value includes the height of the mask
// (so often header.height = entry.height * 2)
protected int mHeight;
protected int height;
protected int mPlanes;
protected int mBitCount;
protected int planes;
protected int bitCount;
/**
* 0 = BI_RGB: No compression
@@ -58,18 +58,18 @@ abstract class DIBHeader {
* 2 = BI_RLE4: 4 bit RLE Compression (4 bit only)
* 3 = BI_BITFIELDS: No compression (16 & 32 bit only)
*/
protected int mCompression;
protected int compression;
// May be 0 if not known
protected int mImageSize;
protected int imageSize;
protected int mXPixelsPerMeter;
protected int mYPixelsPerMeter;
protected int xPixelsPerMeter;
protected int yPixelsPerMeter;
protected int mColorsUsed;
protected int colorsUsed;
// 0 means all colors are important
protected int mColorsImportant;
protected int colorsImportant;
protected DIBHeader() {
}
@@ -102,47 +102,47 @@ abstract class DIBHeader {
protected abstract void read(int pSize, DataInput pStream) throws IOException;
public final int getSize() {
return mSize;
return size;
}
public final int getWidth() {
return mWidth;
return width;
}
public final int getHeight() {
return mHeight;
return height;
}
public final int getPlanes() {
return mPlanes;
return planes;
}
public final int getBitCount() {
return mBitCount;
return bitCount;
}
public int getCompression() {
return mCompression;
return compression;
}
public int getImageSize() {
return mImageSize;
return imageSize;
}
public int getXPixelsPerMeter() {
return mXPixelsPerMeter;
return xPixelsPerMeter;
}
public int getYPixelsPerMeter() {
return mYPixelsPerMeter;
return yPixelsPerMeter;
}
public int getColorsUsed() {
return mColorsUsed;
return colorsUsed;
}
public int getColorsImportant() {
return mColorsImportant;
return colorsImportant;
}
public String toString() {
@@ -176,22 +176,22 @@ abstract class DIBHeader {
throw new IIOException(String.format("Size: %s !=: %s", pSize, DIB.WINDOWS_V3_HEADER_SIZE));
}
mSize = pSize;
size = pSize;
mWidth = pStream.readInt();
mHeight = pStream.readInt();
width = pStream.readInt();
height = pStream.readInt();
mPlanes = pStream.readUnsignedShort();
mBitCount = pStream.readUnsignedShort();
mCompression = pStream.readInt();
planes = pStream.readUnsignedShort();
bitCount = pStream.readUnsignedShort();
compression = pStream.readInt();
mImageSize = pStream.readInt();
imageSize = pStream.readInt();
mXPixelsPerMeter = pStream.readInt();
mYPixelsPerMeter = pStream.readInt();
xPixelsPerMeter = pStream.readInt();
yPixelsPerMeter = pStream.readInt();
mColorsUsed = pStream.readInt();
mColorsImportant = pStream.readInt();
colorsUsed = pStream.readInt();
colorsImportant = pStream.readInt();
}
}
}

View File

@@ -41,10 +41,10 @@ import java.util.List;
* @version $Id: Directory.java,v 1.0 25.feb.2006 00:29:44 haku Exp$
*/
class Directory {
private final List<DirectoryEntry> mEntries;
private final List<DirectoryEntry> entries;
private Directory(int pImageCount) {
mEntries = Arrays.asList(new DirectoryEntry[pImageCount]);
entries = Arrays.asList(new DirectoryEntry[pImageCount]);
}
public static Directory read(final int pType, final int pImageCount, final DataInput pStream) throws IOException {
@@ -54,21 +54,21 @@ class Directory {
}
private void readEntries(final int pType, final DataInput pStream) throws IOException {
for (int i = 0; i < mEntries.size(); i++) {
mEntries.set(i, DirectoryEntry.read(pType, pStream));
for (int i = 0; i < entries.size(); i++) {
entries.set(i, DirectoryEntry.read(pType, pStream));
}
}
public DirectoryEntry getEntry(final int pEntryIndex) {
return mEntries.get(pEntryIndex);
return entries.get(pEntryIndex);
}
public int count() {
return mEntries.size();
return entries.size();
}
@Override
public String toString() {
return String.format("%s%s", getClass().getSimpleName(), mEntries);
return String.format("%s%s", getClass().getSimpleName(), entries);
}
}

View File

@@ -31,7 +31,6 @@ package com.twelvemonkeys.imageio.plugins.ico;
import javax.imageio.IIOException;
import java.io.DataInput;
import java.io.IOException;
import java.awt.image.BufferedImage;
import java.awt.*;
/**
@@ -43,13 +42,13 @@ import java.awt.*;
* @see <a href="http://en.wikipedia.org/wiki/ICO_(icon_image_file_format)#Directory">Wikipedia</a>
*/
abstract class DirectoryEntry {
private int mWidth;
private int mHeight;
private int mColorCount;
int mPlanes;
int mBitCount;
private int mSize;
private int mOffset;
private int width;
private int height;
private int colorCount;
int planes;
int bitCount;
private int size;
private int offset;
private DirectoryEntry() {
}
@@ -79,58 +78,58 @@ abstract class DirectoryEntry {
protected void read(final DataInput pStream) throws IOException {
// Width/height = 0, means 256
int w = pStream.readUnsignedByte();
mWidth = w == 0 ? 256 : w;
width = w == 0 ? 256 : w;
int h = pStream.readUnsignedByte();
mHeight = h == 0 ? 256 : h;
height = h == 0 ? 256 : h;
// Color count = 0, means 256 or more colors
mColorCount = pStream.readUnsignedByte();
colorCount = pStream.readUnsignedByte();
// Ignore. Should be 0, but .NET (System.Drawing.Icon.Save) sets this value to 255, according to Wikipedia
pStream.readUnsignedByte();
mPlanes = pStream.readUnsignedShort(); // Should be 0 or 1 for ICO, x hotspot for CUR
mBitCount = pStream.readUnsignedShort(); // bit count for ICO, y hotspot for CUR
planes = pStream.readUnsignedShort(); // Should be 0 or 1 for ICO, x hotspot for CUR
bitCount = pStream.readUnsignedShort(); // bit count for ICO, y hotspot for CUR
// Size of bitmap in bytes
mSize = pStream.readInt();
mOffset = pStream.readInt();
size = pStream.readInt();
offset = pStream.readInt();
}
public String toString() {
return String.format(
"%s: width: %d, height: %d, colors: %d, planes: %d, bit count: %d, size: %d, offset: %d",
getClass().getSimpleName(),
mWidth, mHeight, mColorCount, mPlanes, mBitCount, mSize, mOffset
width, height, colorCount, planes, bitCount, size, offset
);
}
public int getBitCount() {
return mBitCount;
return bitCount;
}
public int getColorCount() {
return mColorCount;
return colorCount;
}
public int getHeight() {
return mHeight;
return height;
}
public int getOffset() {
return mOffset;
return offset;
}
public int getPlanes() {
return mPlanes;
return planes;
}
public int getSize() {
return mSize;
return size;
}
public int getWidth() {
return mWidth;
return width;
}
/**
@@ -145,11 +144,11 @@ abstract class DirectoryEntry {
super.read(pStream);
// NOTE: This is a hack...
mXHotspot = mPlanes;
mYHotspot = mBitCount;
mXHotspot = planes;
mYHotspot = bitCount;
mPlanes = 1; // Always 1 for all BMP types
mBitCount = 0;
planes = 1; // Always 1 for all BMP types
bitCount = 0;
}
public Point getHotspot() {

View File

@@ -69,13 +69,13 @@ import java.util.List;
// Known issue: 256x256 PNG encoded icons does not have IndexColorModel even if stated in DirectoryEntry (seem impossible as the PNGs are all true color)
public class ICOImageReader extends ImageReaderBase {
// TODO: Consider moving the reading to inner classes (subclasses of BitmapDescriptor)
private Directory mDirectory;
private Directory directory;
// TODO: Review these, make sure we don't have a memory leak
private Map<DirectoryEntry, DIBHeader> mHeaders = new WeakHashMap<DirectoryEntry, DIBHeader>();
private Map<DirectoryEntry, BitmapDescriptor> mDescriptors = new WeakWeakMap<DirectoryEntry, BitmapDescriptor>();
private Map<DirectoryEntry, DIBHeader> headers = new WeakHashMap<DirectoryEntry, DIBHeader>();
private Map<DirectoryEntry, BitmapDescriptor> descriptors = new WeakWeakMap<DirectoryEntry, BitmapDescriptor>();
private ImageReader mPNGImageReader;
private ImageReader pngImageReader;
public ICOImageReader() {
this(DIB.TYPE_ICO);
@@ -101,14 +101,14 @@ public class ICOImageReader extends ImageReaderBase {
}
protected void resetMembers() {
mDirectory = null;
directory = null;
mHeaders.clear();
mDescriptors.clear();
headers.clear();
descriptors.clear();
if (mPNGImageReader != null) {
mPNGImageReader.dispose();
mPNGImageReader = null;
if (pngImageReader != null) {
pngImageReader.dispose();
pngImageReader = null;
}
}
@@ -158,7 +158,7 @@ public class ICOImageReader extends ImageReaderBase {
}
@Override
public int getNumImages(final boolean pAllowSearch) throws IOException {
public int getNumImages(final boolean allowSearch) throws IOException {
return getDirectory().count();
}
@@ -260,38 +260,38 @@ public class ICOImageReader extends ImageReaderBase {
private ImageReader getPNGReader() throws IIOException {
// TODO: Prefer Sun's std JDK PNGImagerReader, because it has known behaviour?
if (mPNGImageReader == null) {
if (pngImageReader == null) {
Iterator<ImageReader> readers = ImageIO.getImageReadersByFormatName("PNG");
if (readers.hasNext()) {
mPNGImageReader = readers.next();
pngImageReader = readers.next();
}
else {
throw new IIOException("No PNGImageReader found using ImageIO, can't read PNG encoded ICO format.");
}
}
else {
mPNGImageReader.reset();
pngImageReader.reset();
}
return mPNGImageReader;
return pngImageReader;
}
private DIBHeader getHeader(final DirectoryEntry pEntry) throws IOException {
if (!mHeaders.containsKey(pEntry)) {
if (!headers.containsKey(pEntry)) {
imageInput.seek(pEntry.getOffset());
DIBHeader header = DIBHeader.read(imageInput);
mHeaders.put(pEntry, header);
headers.put(pEntry, header);
}
return mHeaders.get(pEntry);
return headers.get(pEntry);
}
private BufferedImage readBitmap(final DirectoryEntry pEntry) throws IOException {
// TODO: Get rid of the caching, as the images are mutable
BitmapDescriptor descriptor = mDescriptors.get(pEntry);
BitmapDescriptor descriptor = descriptors.get(pEntry);
if (descriptor == null || !mDescriptors.containsKey(pEntry)) {
if (descriptor == null || !descriptors.containsKey(pEntry)) {
DIBHeader header = getHeader(pEntry);
int offset = pEntry.getOffset() + header.getSize();
@@ -333,7 +333,7 @@ public class ICOImageReader extends ImageReaderBase {
}
}
mDescriptors.put(pEntry, descriptor);
descriptors.put(pEntry, descriptor);
}
return descriptor.getImage();
@@ -354,8 +354,8 @@ public class ICOImageReader extends ImageReaderBase {
break;
}
BitmapMask mask = new BitmapMask(pBitmap.mEntry, pBitmap.mHeader);
readBitmapIndexed1(mask.mMask, true);
BitmapMask mask = new BitmapMask(pBitmap.entry, pBitmap.header);
readBitmapIndexed1(mask.mask, true);
pBitmap.setMask(mask);
}
@@ -364,7 +364,7 @@ public class ICOImageReader extends ImageReaderBase {
for (int i = 0; i < colorCount; i++) {
// aRGB (a is "Reserved")
pBitmap.mColors[i] = (imageInput.readInt() & 0xffffff) | 0xff000000;
pBitmap.colors[i] = (imageInput.readInt() & 0xffffff) | 0xff000000;
}
}
@@ -379,7 +379,7 @@ public class ICOImageReader extends ImageReaderBase {
int pos = (pBitmap.getHeight() - y - 1) * pBitmap.getWidth();
for (int x = 0; x < pBitmap.getWidth(); x++) {
pBitmap.mBits[pos++] = ((row[rowPos] & xOrVal) / xOrVal) & 0xFF;
pBitmap.bits[pos++] = ((row[rowPos] & xOrVal) / xOrVal) & 0xFF;
if (xOrVal == 1) {
xOrVal = 0x80;
@@ -423,7 +423,7 @@ public class ICOImageReader extends ImageReaderBase {
rowPos++;
}
pBitmap.mBits[pos++] = value & 0xFF;
pBitmap.bits[pos++] = value & 0xFF;
high4 = !high4;
}
@@ -447,7 +447,7 @@ public class ICOImageReader extends ImageReaderBase {
int pos = (pBitmap.getHeight() - y - 1) * pBitmap.getWidth();
for (int x = 0; x < pBitmap.getWidth(); x++) {
pBitmap.mBits[pos++] = row[rowPos++] & 0xFF;
pBitmap.bits[pos++] = row[rowPos++] & 0xFF;
}
if (abortRequested()) {
@@ -480,7 +480,7 @@ public class ICOImageReader extends ImageReaderBase {
WritableRaster raster = Raster.createPackedRaster(
buffer, pBitmap.getWidth(), pBitmap.getHeight(), pBitmap.getWidth(), cm.getMasks(), null
);
pBitmap.mImage = new BufferedImage(cm, raster, cm.isAlphaPremultiplied(), null);
pBitmap.image = new BufferedImage(cm, raster, cm.isAlphaPremultiplied(), null);
for (int y = 0; y < pBitmap.getHeight(); y++) {
int offset = (pBitmap.getHeight() - y - 1) * pBitmap.getWidth();
@@ -516,7 +516,7 @@ public class ICOImageReader extends ImageReaderBase {
WritableRaster raster = Raster.createInterleavedRaster(
buffer, pBitmap.getWidth(), pBitmap.getHeight(), pBitmap.getWidth(), 3, bOffs, null
);
pBitmap.mImage = new BufferedImage(cm, raster, cm.isAlphaPremultiplied(), null);
pBitmap.image = new BufferedImage(cm, raster, cm.isAlphaPremultiplied(), null);
for (int y = 0; y < pBitmap.getHeight(); y++) {
int offset = (pBitmap.getHeight() - y - 1) * pBitmap.getWidth();
@@ -542,7 +542,7 @@ public class ICOImageReader extends ImageReaderBase {
WritableRaster raster = Raster.createPackedRaster(
buffer, pBitmap.getWidth(), pBitmap.getHeight(), pBitmap.getWidth(), cm.getMasks(), null
);
pBitmap.mImage = new BufferedImage(cm, raster, cm.isAlphaPremultiplied(), null);
pBitmap.image = new BufferedImage(cm, raster, cm.isAlphaPremultiplied(), null);
for (int y = 0; y < pBitmap.getHeight(); y++) {
int offset = (pBitmap.getHeight() - y - 1) * pBitmap.getWidth();
@@ -559,11 +559,11 @@ public class ICOImageReader extends ImageReaderBase {
private Directory getDirectory() throws IOException {
assertInput();
if (mDirectory == null) {
if (directory == null) {
readFileHeader();
}
return mDirectory;
return directory;
}
private void readFileHeader() throws IOException {
@@ -577,7 +577,7 @@ public class ICOImageReader extends ImageReaderBase {
int imageCount = imageInput.readUnsignedShort();
// Read directory
mDirectory = Directory.read(type, imageCount, imageInput);
directory = Directory.read(type, imageCount, imageInput);
}
final DirectoryEntry getEntry(final int pImageIndex) throws IOException {

View File

@@ -81,100 +81,98 @@ class BMHDChunk extends IFFChunk {
// words. The number of words per row is words=((w+15)/16)
// Dimensions of raster
int mWidth;
int mHeight;
int width;
int height;
// Source offsets
// Hmm.. Consider making these Image.properties?
int mXPos;
int mYPos;
int xPos;
int yPos;
// The number of source bitplanes in the BODY chunk (see below) is stored in
// nPlanes. An ILBM with a CMAP but no BODY and nPlanes = 0 is the
// recommended way to store a color map.
int mBitplanes;
int bitplanes;
int mMaskType;
int mCompressionType;
int maskType;
int compressionType;
int mTransparentIndex;
int transparentIndex;
// NOTE: Typical values are 10:11 (320 x 200)
int mXAspect;
int mYAspect;
int xAspect;
int yAspect;
// Source page dimension
// NOTE: The image may be larger than the page, probably ignore these
int mPageWidth;
int mPageHeight;
int pageWidth;
int pageHeight;
protected BMHDChunk(int pChunkLength) {
super(IFF.CHUNK_BMHD, pChunkLength);
}
protected BMHDChunk(int pWidth, int pHeight, int pBitplanes,
int pMaskType, int pCompressionType,
int pTransparentIndex) {
protected BMHDChunk(int pWidth, int pHeight, int pBitplanes, int pMaskType, int pCompressionType, int pTransparentIndex) {
super(IFF.CHUNK_BMHD, 20);
mWidth = pWidth;
mHeight = pHeight;
mXPos = 0;
mYPos = 0;
mBitplanes = pBitplanes;
mMaskType = pMaskType;
mCompressionType = pCompressionType;
mTransparentIndex = pTransparentIndex;
mXAspect = 1;
mYAspect = 1;
mPageWidth = Math.min(pWidth, Short.MAX_VALUE); // For some reason, these are signed?
mPageHeight = Math.min(pHeight, Short.MAX_VALUE);
width = pWidth;
height = pHeight;
xPos = 0;
yPos = 0;
bitplanes = pBitplanes;
maskType = pMaskType;
compressionType = pCompressionType;
transparentIndex = pTransparentIndex;
xAspect = 1;
yAspect = 1;
pageWidth = Math.min(pWidth, Short.MAX_VALUE); // For some reason, these are signed?
pageHeight = Math.min(pHeight, Short.MAX_VALUE);
}
void readChunk(DataInput pInput) throws IOException {
if (mChunkLength != 20) {
throw new IIOException("Unknown BMHD chunk length: " + mChunkLength);
if (chunkLength != 20) {
throw new IIOException("Unknown BMHD chunk length: " + chunkLength);
}
mWidth = pInput.readUnsignedShort();
mHeight = pInput.readUnsignedShort();
mXPos = pInput.readShort();
mYPos = pInput.readShort();
mBitplanes = pInput.readUnsignedByte();
mMaskType = pInput.readUnsignedByte();
mCompressionType = pInput.readUnsignedByte();
width = pInput.readUnsignedShort();
height = pInput.readUnsignedShort();
xPos = pInput.readShort();
yPos = pInput.readShort();
bitplanes = pInput.readUnsignedByte();
maskType = pInput.readUnsignedByte();
compressionType = pInput.readUnsignedByte();
pInput.readByte(); // PAD
mTransparentIndex = pInput.readUnsignedShort();
mXAspect = pInput.readUnsignedByte();
mYAspect = pInput.readUnsignedByte();
mPageWidth = pInput.readShort();
mPageHeight = pInput.readShort();
transparentIndex = pInput.readUnsignedShort();
xAspect = pInput.readUnsignedByte();
yAspect = pInput.readUnsignedByte();
pageWidth = pInput.readShort();
pageHeight = pInput.readShort();
}
void writeChunk(DataOutput pOutput) throws IOException {
pOutput.writeInt(mChunkId);
pOutput.writeInt(mChunkLength);
pOutput.writeInt(chunkId);
pOutput.writeInt(chunkLength);
pOutput.writeShort(mWidth);
pOutput.writeShort(mHeight);
pOutput.writeShort(mXPos);
pOutput.writeShort(mYPos);
pOutput.writeByte(mBitplanes);
pOutput.writeByte(mMaskType);
pOutput.writeByte(mCompressionType);
pOutput.writeShort(width);
pOutput.writeShort(height);
pOutput.writeShort(xPos);
pOutput.writeShort(yPos);
pOutput.writeByte(bitplanes);
pOutput.writeByte(maskType);
pOutput.writeByte(compressionType);
pOutput.writeByte(0); // PAD
pOutput.writeShort(mTransparentIndex);
pOutput.writeByte(mXAspect);
pOutput.writeByte(mYAspect);
pOutput.writeShort(mPageWidth);
pOutput.writeShort(mPageHeight);
pOutput.writeShort(transparentIndex);
pOutput.writeByte(xAspect);
pOutput.writeByte(yAspect);
pOutput.writeShort(pageWidth);
pOutput.writeShort(pageHeight);
}
public String toString() {
return super.toString()
+ " {w=" + mWidth + ", h=" + mHeight
+ ", x=" + mXPos + ", y=" + mYPos
+ ", planes=" + mBitplanes + ", mask=" + mMaskType
+ ", compression=" + mCompressionType + ", trans=" + mTransparentIndex
+ ", xAspect=" + mXAspect + ", yAspect=" + mYAspect
+ ", pageWidth=" + mPageWidth + ", pageHeight=" + mPageHeight + "}";
+ " {w=" + width + ", h=" + height
+ ", x=" + xPos + ", y=" + yPos
+ ", planes=" + bitplanes + ", mask=" + maskType
+ ", compression=" + compressionType + ", trans=" + transparentIndex
+ ", xAspect=" + xAspect + ", yAspect=" + yAspect
+ ", pageWidth=" + pageWidth + ", pageHeight=" + pageHeight + "}";
}
}

View File

@@ -40,7 +40,6 @@ import java.io.DataOutput;
* @version $Id: BODYChunk.java,v 1.0 28.feb.2006 01:25:49 haku Exp$
*/
class BODYChunk extends IFFChunk {
protected BODYChunk(int pChunkLength) {
super(IFF.CHUNK_BODY, pChunkLength);
}

View File

@@ -41,22 +41,21 @@ import java.io.IOException;
* @version $Id: CAMGChunk.java,v 1.0 28.feb.2006 02:10:07 haku Exp$
*/
class CAMGChunk extends IFFChunk {
// HIRES=0x8000, LACE=0x4
// #define CAMG_HAM 0x800 /* hold and modify */
// #define CAMG_EHB 0x80 /* extra halfbrite */
private int mCAMG;
private int camg;
public CAMGChunk(int pLength) {
super(IFF.CHUNK_CAMG, pLength);
}
void readChunk(DataInput pInput) throws IOException {
if (mChunkLength != 4) {
throw new IIOException("Unknown CAMG chunk length: " + mChunkLength);
if (chunkLength != 4) {
throw new IIOException("Unknown CAMG chunk length: " + chunkLength);
}
mCAMG = pInput.readInt();
camg = pInput.readInt();
}
void writeChunk(DataOutput pOutput) throws IOException {
@@ -64,11 +63,11 @@ class CAMGChunk extends IFFChunk {
}
boolean isHAM() {
return (mCAMG & 0x800) != 0;
return (camg & 0x800) != 0;
}
boolean isEHB() {
return (mCAMG & 0x80) != 0;
return (camg & 0x80) != 0;
}
public String toString() {

View File

@@ -54,34 +54,34 @@ class CMAPChunk extends IFFChunk {
// typedef ColorRegister ColorMap[n]; /* size = 3n bytes */
byte[] mReds;
byte[] mGreens;
byte[] mBlues;
byte[] reds;
byte[] greens;
byte[] blues;
boolean mEHB;
boolean ehb;
final private BMHDChunk mHeader;
final private CAMGChunk mCamg;
private IndexColorModel mModel;
final private BMHDChunk header;
final private CAMGChunk camg;
private IndexColorModel model;
protected CMAPChunk(int pChunkLength, BMHDChunk pHeader, CAMGChunk pCamg) {
super(IFF.CHUNK_CMAP, pChunkLength);
mHeader = pHeader;
mCamg = pCamg;
header = pHeader;
camg = pCamg;
}
public CMAPChunk(IndexColorModel pModel) {
super(IFF.CHUNK_CMAP, pModel.getMapSize() * 3);
mModel = pModel;
mHeader = null;
mCamg = null;
model = pModel;
header = null;
camg = null;
}
void readChunk(DataInput pInput) throws IOException {
int numColors = mChunkLength / 3;
int numColors = chunkLength / 3;
int paletteSize = numColors;
boolean isEHB = mCamg != null && mCamg.isEHB();
boolean isEHB = camg != null && camg.isEHB();
if (isEHB) {
if (numColors == 32) {
paletteSize = 64;
@@ -91,22 +91,22 @@ class CMAPChunk extends IFFChunk {
}
}
mReds = new byte[paletteSize];
mGreens = mReds.clone();
mBlues = mReds.clone();
reds = new byte[paletteSize];
greens = reds.clone();
blues = reds.clone();
for (int i = 0; i < numColors; i++) {
mReds[i] = pInput.readByte();
mGreens[i] = pInput.readByte();
mBlues[i] = pInput.readByte();
reds[i] = pInput.readByte();
greens[i] = pInput.readByte();
blues[i] = pInput.readByte();
}
if (isEHB && numColors == 32) {
// Create the half-brite colors
for (int i = 0; i < numColors; i++) {
mReds[i + numColors] = (byte) ((mReds[i] & 0xff) / 2);
mGreens[i + numColors] = (byte) ((mGreens[i] & 0xff) / 2);
mBlues[i + numColors] = (byte) ((mBlues[i] & 0xff) / 2);
reds[i + numColors] = (byte) ((reds[i] & 0xff) / 2);
greens[i + numColors] = (byte) ((greens[i] & 0xff) / 2);
blues[i + numColors] = (byte) ((blues[i] & 0xff) / 2);
}
}
@@ -120,7 +120,7 @@ class CMAPChunk extends IFFChunk {
// R8 := (Rn x 255 ) / maxColor
// All chunks are WORD aligned (even sized), may need to read pad...
if (mChunkLength % 2 != 0) {
if (chunkLength % 2 != 0) {
pInput.readByte();
}
@@ -128,33 +128,33 @@ class CMAPChunk extends IFFChunk {
// Would it work to double to numbers of colors, and create an indexcolormodel,
// with alpha, where all colors above the original color is all transparent?
// This is a waste of time and space, of course...
int trans = mHeader.mMaskType == BMHDChunk.MASK_TRANSPARENT_COLOR ? mHeader.mTransparentIndex : -1;
mModel = new InverseColorMapIndexColorModel(mHeader.mBitplanes, mReds.length, mReds, mGreens, mBlues, trans);
int trans = header.maskType == BMHDChunk.MASK_TRANSPARENT_COLOR ? header.transparentIndex : -1;
model = new InverseColorMapIndexColorModel(header.bitplanes, reds.length, reds, greens, blues, trans);
}
void writeChunk(DataOutput pOutput) throws IOException {
pOutput.writeInt(mChunkId);
pOutput.writeInt(mChunkLength);
pOutput.writeInt(chunkId);
pOutput.writeInt(chunkLength);
final int length = mModel.getMapSize();
final int length = model.getMapSize();
for (int i = 0; i < length; i++) {
pOutput.writeByte(mModel.getRed(i));
pOutput.writeByte(mModel.getGreen(i));
pOutput.writeByte(mModel.getBlue(i));
pOutput.writeByte(model.getRed(i));
pOutput.writeByte(model.getGreen(i));
pOutput.writeByte(model.getBlue(i));
}
if (mChunkLength % 2 != 0) {
if (chunkLength % 2 != 0) {
pOutput.writeByte(0); // PAD
}
}
public String toString() {
return super.toString() + " {colorMap=" + mModel + "}";
return super.toString() + " {colorMap=" + model + "}";
}
IndexColorModel getIndexColorModel() {
return mModel;
return model;
}
public BufferedImage createPaletteImage() {

View File

@@ -47,7 +47,7 @@ class GRABChunk extends IFFChunk {
// WORD x, y; /* relative coordinates (pixels) */
// } Point2D;
Point2D mPoint;
Point2D point;
protected GRABChunk(int pChunkLength) {
super(IFF.CHUNK_GRAB, pChunkLength);
@@ -55,22 +55,22 @@ class GRABChunk extends IFFChunk {
protected GRABChunk(Point2D pPoint) {
super(IFF.CHUNK_GRAB, 4);
mPoint = pPoint;
point = pPoint;
}
void readChunk(DataInput pInput) throws IOException {
if (mChunkLength != 4) {
throw new IIOException("Unknown GRAB chunk size: " + mChunkLength);
if (chunkLength != 4) {
throw new IIOException("Unknown GRAB chunk size: " + chunkLength);
}
mPoint = new Point(pInput.readShort(), pInput.readShort());
point = new Point(pInput.readShort(), pInput.readShort());
}
void writeChunk(DataOutput pOutput) throws IOException {
pOutput.writeShort((int) mPoint.getX());
pOutput.writeShort((int) mPoint.getY());
pOutput.writeShort((int) point.getX());
pOutput.writeShort((int) point.getY());
}
public String toString() {
return super.toString() + " {point=" + mPoint + "}";
return super.toString() + " {point=" + point + "}";
}
}

View File

@@ -41,45 +41,45 @@ import java.io.DataOutput;
*/
class GenericChunk extends IFFChunk {
byte[] mData;
byte[] data;
protected GenericChunk(int pChunkId, int pChunkLength) {
super(pChunkId, pChunkLength);
mData = new byte[pChunkLength <= 50 ? pChunkLength : 47];
data = new byte[pChunkLength <= 50 ? pChunkLength : 47];
}
protected GenericChunk(int pChunkId, byte[] pChunkData) {
super(pChunkId, pChunkData.length);
mData = pChunkData;
data = pChunkData;
}
void readChunk(DataInput pInput) throws IOException {
pInput.readFully(mData, 0, mData.length);
pInput.readFully(data, 0, data.length);
int toSkip = mChunkLength - mData.length;
int toSkip = chunkLength - data.length;
while (toSkip > 0) {
toSkip -= pInput.skipBytes(toSkip);
}
// Read pad
if (mChunkLength % 2 != 0) {
if (chunkLength % 2 != 0) {
pInput.readByte();
}
}
void writeChunk(DataOutput pOutput) throws IOException {
pOutput.writeInt(mChunkId);
pOutput.writeInt(mChunkLength);
pOutput.write(mData, 0, mData.length);
pOutput.writeInt(chunkId);
pOutput.writeInt(chunkLength);
pOutput.write(data, 0, data.length);
if (mData.length % 2 != 0) {
if (data.length % 2 != 0) {
pOutput.writeByte(0); // PAD
}
}
public String toString() {
return super.toString() + " {value=\""
+ new String(mData, 0, mData.length <= 50 ? mData.length : 47)
+ (mChunkLength <= 50 ? "" : "...") + "\"}";
+ new String(data, 0, data.length <= 50 ? data.length : 47)
+ (chunkLength <= 50 ? "" : "...") + "\"}";
}
}

View File

@@ -40,12 +40,12 @@ import java.io.DataOutput;
* @version $Id: IFFChunk.java,v 1.0 28.feb.2006 00:00:45 haku Exp$
*/
abstract class IFFChunk {
int mChunkId;
int mChunkLength;
int chunkId;
int chunkLength;
protected IFFChunk(int pChunkId, int pChunkLength) {
mChunkId = pChunkId;
mChunkLength = pChunkLength;
chunkId = pChunkId;
chunkLength = pChunkLength;
}
abstract void readChunk(DataInput pInput) throws IOException;
@@ -53,6 +53,6 @@ abstract class IFFChunk {
abstract void writeChunk(DataOutput pOutput) throws IOException;
public String toString() {
return IFFUtil.toChunkStr(mChunkId) + " chunk (" + mChunkLength + " bytes)";
return IFFUtil.toChunkStr(chunkId) + " chunk (" + chunkLength + " bytes)";
}
}

View File

@@ -96,16 +96,17 @@ public class IFFImageReader extends ImageReaderBase {
// - Contains definitions of some "new" chunks, as well as alternative FORM types
// http://amigan.1emu.net/reg/iff.html
private BMHDChunk mHeader;
private CMAPChunk mColorMap;
private BODYChunk mBody;
private GRABChunk mGrab;
private CAMGChunk mViewPort;
private int mFormType;
private long mBodyStart;
private BMHDChunk header;
private CMAPChunk colorMap;
private BODYChunk body;
@SuppressWarnings({"FieldCanBeLocal"})
private GRABChunk grab;
private CAMGChunk viewPort;
private int formType;
private long bodyStart;
private BufferedImage mImage;
private DataInputStream mByteRunStream;
private BufferedImage image;
private DataInputStream byteRunStream;
public IFFImageReader() {
super(IFFImageReaderSpi.sharedProvider());
@@ -118,20 +119,20 @@ public class IFFImageReader extends ImageReaderBase {
private void init(int pIndex) throws IOException {
checkBounds(pIndex);
if (mHeader == null) {
if (header == null) {
readMeta();
}
}
protected void resetMembers() {
mHeader = null;
mColorMap = null;
mBody = null;
mViewPort = null;
mFormType = 0;
header = null;
colorMap = null;
body = null;
viewPort = null;
formType = 0;
mImage = null;
mByteRunStream = null;
image = null;
byteRunStream = null;
}
private void readMeta() throws IOException {
@@ -141,15 +142,15 @@ public class IFFImageReader extends ImageReaderBase {
int remaining = imageInput.readInt() - 4; // We'll read 4 more in a sec
mFormType = imageInput.readInt();
if (mFormType != IFF.TYPE_ILBM && mFormType != IFF.TYPE_PBM) {
throw new IIOException("Only IFF (FORM) type ILBM and PBM supported: " + IFFUtil.toChunkStr(mFormType));
formType = imageInput.readInt();
if (formType != IFF.TYPE_ILBM && formType != IFF.TYPE_PBM) {
throw new IIOException("Only IFF (FORM) type ILBM and PBM supported: " + IFFUtil.toChunkStr(formType));
}
//System.out.println("IFF type FORM " + toChunkStr(type));
mGrab = null;
mViewPort = null;
grab = null;
viewPort = null;
while (remaining > 0) {
int chunkId = imageInput.readInt();
@@ -163,49 +164,49 @@ public class IFFImageReader extends ImageReaderBase {
switch (chunkId) {
case IFF.CHUNK_BMHD:
if (mHeader != null) {
if (header != null) {
throw new IIOException("Multiple BMHD chunks not allowed");
}
mHeader = new BMHDChunk(length);
mHeader.readChunk(imageInput);
header = new BMHDChunk(length);
header.readChunk(imageInput);
//System.out.println(mHeader);
//System.out.println(header);
break;
case IFF.CHUNK_CMAP:
if (mColorMap != null) {
if (colorMap != null) {
throw new IIOException("Multiple CMAP chunks not allowed");
}
mColorMap = new CMAPChunk(length, mHeader, mViewPort);
mColorMap.readChunk(imageInput);
colorMap = new CMAPChunk(length, header, viewPort);
colorMap.readChunk(imageInput);
//System.out.println(mColorMap);
//System.out.println(colorMap);
break;
case IFF.CHUNK_GRAB:
if (mGrab != null) {
if (grab != null) {
throw new IIOException("Multiple GRAB chunks not allowed");
}
mGrab = new GRABChunk(length);
mGrab.readChunk(imageInput);
grab = new GRABChunk(length);
grab.readChunk(imageInput);
//System.out.println(mGrab);
//System.out.println(grab);
break;
case IFF.CHUNK_CAMG:
if (mViewPort != null) {
if (viewPort != null) {
throw new IIOException("Multiple CAMG chunks not allowed");
}
mViewPort = new CAMGChunk(length);
mViewPort.readChunk(imageInput);
viewPort = new CAMGChunk(length);
viewPort.readChunk(imageInput);
//System.out.println(mViewPort);
//System.out.println(viewPort);
break;
case IFF.CHUNK_BODY:
if (mBody != null) {
if (body != null) {
throw new IIOException("Multiple BODY chunks not allowed");
}
mBody = new BODYChunk(length);
mBodyStart = imageInput.getStreamPosition();
body = new BODYChunk(length);
bodyStart = imageInput.getStreamPosition();
// NOTE: We don't read the body here, it's done later in the read(int, ImageReadParam) method
@@ -228,23 +229,23 @@ public class IFFImageReader extends ImageReaderBase {
processImageStarted(pIndex);
mImage = getDestination(pParam, getImageTypes(pIndex), mHeader.mWidth, mHeader.mHeight);
//System.out.println(mBody);
if (mBody != null) {
image = getDestination(pParam, getImageTypes(pIndex), header.width, header.height);
//System.out.println(body);
if (body != null) {
//System.out.println("Read body");
readBody(pParam);
}
else {
// TODO: Remove this hack when we have metadata
// In the rare case of an ILBM containing nothing but a CMAP
//System.out.println(mColorMap);
if (mColorMap != null) {
//System.out.println(colorMap);
if (colorMap != null) {
//System.out.println("Creating palette!");
mImage = mColorMap.createPaletteImage();
image = colorMap.createPaletteImage();
}
}
BufferedImage result = mImage;
BufferedImage result = image;
processImageComplete();
@@ -253,12 +254,12 @@ public class IFFImageReader extends ImageReaderBase {
public int getWidth(int pIndex) throws IOException {
init(pIndex);
return mHeader.mWidth;
return header.width;
}
public int getHeight(int pIndex) throws IOException {
init(pIndex);
return mHeader.mHeight;
return header.height;
}
public Iterator<ImageTypeSpecifier> getImageTypes(int pIndex) throws IOException {
@@ -266,8 +267,8 @@ public class IFFImageReader extends ImageReaderBase {
List<ImageTypeSpecifier> types = Arrays.asList(
getRawImageType(pIndex),
ImageTypeSpecifier.createFromBufferedImageType(mHeader.mBitplanes == 32 ? BufferedImage.TYPE_4BYTE_ABGR : BufferedImage.TYPE_3BYTE_BGR)
// TODO: ImageTypeSpecifier.createFromBufferedImageType(mHeader.mBitplanes == 32 ? BufferedImage.TYPE_INT_ARGB : BufferedImage.TYPE_INT_RGB),
ImageTypeSpecifier.createFromBufferedImageType(header.bitplanes == 32 ? BufferedImage.TYPE_4BYTE_ABGR : BufferedImage.TYPE_3BYTE_BGR)
// TODO: ImageTypeSpecifier.createFromBufferedImageType(header.bitplanes == 32 ? BufferedImage.TYPE_INT_ARGB : BufferedImage.TYPE_INT_RGB),
// TODO: Allow 32 bit always. Allow RGB and discard alpha, if present?
);
return types.iterator();
@@ -278,9 +279,9 @@ public class IFFImageReader extends ImageReaderBase {
init(pIndex);
// TODO: Stay DRY...
// TODO: Use this for creating the Image/Buffer in the read code below...
// NOTE: mColorMap may be null for 8 bit (gray), 24 bit or 32 bit only
// NOTE: colorMap may be null for 8 bit (gray), 24 bit or 32 bit only
ImageTypeSpecifier specifier;
switch (mHeader.mBitplanes) {
switch (header.bitplanes) {
case 1:
// 1 bit
case 2:
@@ -297,8 +298,8 @@ public class IFFImageReader extends ImageReaderBase {
// 8 bit
// May be HAM8
if (!isHAM()) {
if (mColorMap != null) {
IndexColorModel cm = mColorMap.getIndexColorModel();
if (colorMap != null) {
IndexColorModel cm = colorMap.getIndexColorModel();
specifier = IndexedImageTypeSpecifier.createFromIndexColorModel(cm);
break;
}
@@ -317,18 +318,18 @@ public class IFFImageReader extends ImageReaderBase {
specifier = ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_4BYTE_ABGR);
break;
default:
throw new IIOException(String.format("Bit depth not implemented: %d", mHeader.mBitplanes));
throw new IIOException(String.format("Bit depth not implemented: %d", header.bitplanes));
}
return specifier;
}
private void readBody(final ImageReadParam pParam) throws IOException {
imageInput.seek(mBodyStart);
mByteRunStream = null;
imageInput.seek(bodyStart);
byteRunStream = null;
// NOTE: mColorMap may be null for 8 bit (gray), 24 bit or 32 bit only
if (mColorMap != null) {
IndexColorModel cm = mColorMap.getIndexColorModel();
// NOTE: colorMap may be null for 8 bit (gray), 24 bit or 32 bit only
if (colorMap != null) {
IndexColorModel cm = colorMap.getIndexColorModel();
readIndexed(pParam, imageInput, cm);
}
else {
@@ -338,8 +339,8 @@ public class IFFImageReader extends ImageReaderBase {
}
private void readIndexed(final ImageReadParam pParam, final ImageInputStream pInput, final IndexColorModel pModel) throws IOException {
final int width = mHeader.mWidth;
final int height = mHeader.mHeight;
final int width = header.width;
final int height = header.height;
final Rectangle aoi = getSourceRegion(pParam, width, height);
final Point offset = pParam == null ? new Point(0, 0) : pParam.getDestinationOffset();
@@ -360,9 +361,9 @@ public class IFFImageReader extends ImageReaderBase {
}
// Ensure band settings from param are compatible with images
checkReadParamBandSettings(pParam, isHAM() ? 3 : 1, mImage.getSampleModel().getNumBands());
checkReadParamBandSettings(pParam, isHAM() ? 3 : 1, image.getSampleModel().getNumBands());
WritableRaster destination = mImage.getRaster();
WritableRaster destination = image.getRaster();
if (destinationBands != null || offset.x != 0 || offset.y != 0) {
destination = destination.createWritableChild(0, 0, destination.getWidth(), destination.getHeight(), offset.x, offset.y, destinationBands);
}
@@ -403,7 +404,7 @@ public class IFFImageReader extends ImageReaderBase {
final byte[] data = ((DataBufferByte) raster.getDataBuffer()).getData();
final int planes = mHeader.mBitplanes;
final int planes = header.bitplanes;
Object dataElements = null;
Object outDataElements = null;
@@ -422,7 +423,7 @@ public class IFFImageReader extends ImageReaderBase {
return;
}
if (mFormType == IFF.TYPE_ILBM) {
if (formType == IFF.TYPE_ILBM) {
int pixelPos = 0;
for (int planePos = 0; planePos < planeWidth; planePos++) {
IFFUtil.bitRotateCW(planeData, planePos, planeWidth, row, pixelPos, 1);
@@ -436,13 +437,13 @@ public class IFFImageReader extends ImageReaderBase {
raster.setDataElements(0, 0, width, 1, row);
}
}
else if (mFormType == IFF.TYPE_PBM) {
else if (formType == IFF.TYPE_PBM) {
// TODO: Arraycopy might not be necessary, if it's okay with row larger than width
System.arraycopy(planeData, 0, row, 0, mHeader.mBitplanes * planeWidth);
System.arraycopy(planeData, 0, row, 0, header.bitplanes * planeWidth);
raster.setDataElements(0, 0, width, 1, row);
}
else {
throw new AssertionError(String.format("Unsupported FORM type: %s", mFormType));
throw new AssertionError(String.format("Unsupported FORM type: %s", formType));
}
int dstY = (srcY - aoi.y) / sourceYSubsampling;
@@ -470,7 +471,7 @@ public class IFFImageReader extends ImageReaderBase {
for (int srcX = 0; srcX < sourceRow.getWidth(); srcX += sourceXSubsampling) {
dataElements = sourceRow.getDataElements(srcX, 0, dataElements);
int rgb = icm.getRGB(dataElements);
outDataElements = mImage.getColorModel().getDataElements(rgb, outDataElements);
outDataElements = image.getColorModel().getDataElements(rgb, outDataElements);
int dstX = srcX / sourceXSubsampling;
destination.setDataElements(dstX, dstY, outDataElements);
}
@@ -479,7 +480,7 @@ public class IFFImageReader extends ImageReaderBase {
// TODO: This branch is never tested, and is probably "dead"
// ColorConvertOp
if (converter == null) {
converter = new ColorConvertOp(cm.getColorSpace(), mImage.getColorModel().getColorSpace(), null);
converter = new ColorConvertOp(cm.getColorSpace(), image.getColorModel().getColorSpace(), null);
}
converter.filter(
raster.createChild(aoi.x, 0, aoi.width, 1, 0, 0, null),
@@ -488,7 +489,7 @@ public class IFFImageReader extends ImageReaderBase {
}
}
processImageProgress(srcY * 100f / mHeader.mWidth);
processImageProgress(srcY * 100f / header.width);
if (abortRequested()) {
processReadAborted();
break;
@@ -502,8 +503,8 @@ public class IFFImageReader extends ImageReaderBase {
// bit of the red value for each pixel, and the last holds the most
// significant bit of the blue value.
private void readTrueColor(ImageReadParam pParam, final ImageInputStream pInput) throws IOException {
final int width = mHeader.mWidth;
final int height = mHeader.mHeight;
final int width = header.width;
final int height = header.height;
final Rectangle aoi = getSourceRegion(pParam, width, height);
final Point offset = pParam == null ? new Point(0, 0) : pParam.getDestinationOffset();
@@ -524,23 +525,23 @@ public class IFFImageReader extends ImageReaderBase {
}
// Ensure band settings from param are compatible with images
checkReadParamBandSettings(pParam, mHeader.mBitplanes / 8, mImage.getSampleModel().getNumBands());
checkReadParamBandSettings(pParam, header.bitplanes / 8, image.getSampleModel().getNumBands());
// NOTE: Each row of the image is stored in an integral number of 16 bit words.
// The number of words per row is words=((w+15)/16)
int planeWidth = 2 * ((width + 15) / 16);
final byte[] planeData = new byte[8 * planeWidth];
WritableRaster destination = mImage.getRaster();
WritableRaster destination = image.getRaster();
if (destinationBands != null || offset.x != 0 || offset.y != 0) {
destination = destination.createWritableChild(0, 0, destination.getWidth(), destination.getHeight(), offset.x, offset.y, destinationBands);
}
// WritableRaster raster = mImage.getRaster().createCompatibleWritableRaster(width, 1);
WritableRaster raster = mImage.getRaster().createCompatibleWritableRaster(8 * planeWidth, 1);
// WritableRaster raster = image.getRaster().createCompatibleWritableRaster(width, 1);
WritableRaster raster = image.getRaster().createCompatibleWritableRaster(8 * planeWidth, 1);
Raster sourceRow = raster.createChild(aoi.x, 0, aoi.width, 1, 0, 0, sourceBands);
final byte[] data = ((DataBufferByte) raster.getDataBuffer()).getData();
final int channels = (mHeader.mBitplanes + 7) / 8;
final int channels = (header.bitplanes + 7) / 8;
final int planesPerChannel = 8;
Object dataElements = null;
@@ -559,7 +560,7 @@ public class IFFImageReader extends ImageReaderBase {
return;
}
if (mFormType == IFF.TYPE_ILBM) {
if (formType == IFF.TYPE_ILBM) {
// NOTE: Using (channels - c - 1) instead of just c,
// effectively reverses the channel order from RGBA to ABGR
int off = (channels - c - 1);
@@ -570,11 +571,11 @@ public class IFFImageReader extends ImageReaderBase {
pixelPos += 8;
}
}
else if (mFormType == IFF.TYPE_PBM) {
else if (formType == IFF.TYPE_PBM) {
System.arraycopy(planeData, 0, data, srcY * 8 * planeWidth, planeWidth);
}
else {
throw new AssertionError(String.format("Unsupported FORM type: %s", mFormType));
throw new AssertionError(String.format("Unsupported FORM type: %s", formType));
}
}
@@ -594,7 +595,7 @@ public class IFFImageReader extends ImageReaderBase {
}
}
processImageProgress(srcY * 100f / mHeader.mWidth);
processImageProgress(srcY * 100f / header.width);
if (abortRequested()) {
processReadAborted();
break;
@@ -605,11 +606,11 @@ public class IFFImageReader extends ImageReaderBase {
private void readPlaneData(final ImageInputStream pInput, final byte[] pData, final int pOffset, final int pPlaneWidth)
throws IOException {
switch (mHeader.mCompressionType) {
switch (header.compressionType) {
case BMHDChunk.COMPRESSION_NONE:
pInput.readFully(pData, pOffset, pPlaneWidth);
// Uncompressed rows must have even number of bytes
if ((mHeader.mBitplanes * pPlaneWidth) % 2 != 0) {
if ((header.bitplanes * pPlaneWidth) % 2 != 0) {
pInput.readByte();
}
break;
@@ -620,27 +621,27 @@ public class IFFImageReader extends ImageReaderBase {
// However, we don't know how long each compressed row is, without decoding it...
// The workaround below, is to use a decode buffer size of pPlaneWidth,
// to make sure we don't decode anything we don't have to (shouldn't).
if (mByteRunStream == null) {
mByteRunStream = new DataInputStream(
if (byteRunStream == null) {
byteRunStream = new DataInputStream(
new DecoderStream(
IIOUtil.createStreamAdapter(pInput, mBody.mChunkLength),
IIOUtil.createStreamAdapter(pInput, body.chunkLength),
new PackBitsDecoder(true),
pPlaneWidth * mHeader.mBitplanes
pPlaneWidth * header.bitplanes
)
);
}
mByteRunStream.readFully(pData, pOffset, pPlaneWidth);
byteRunStream.readFully(pData, pOffset, pPlaneWidth);
break;
default:
throw new IIOException(String.format("Unknown compression type: %d", mHeader.mCompressionType));
throw new IIOException(String.format("Unknown compression type: %d", header.compressionType));
}
}
private void hamToRGB(final byte[] pIndexed, final IndexColorModel pModel,
final byte[] pDest, final int pDestOffset) {
final int bits = mHeader.mBitplanes;
final int width = mHeader.mWidth;
final int bits = header.bitplanes;
final int width = header.width;
int lastRed = 0;
int lastGreen = 0;
int lastBlue = 0;
@@ -679,7 +680,7 @@ public class IFFImageReader extends ImageReaderBase {
}
private boolean isHAM() {
return mViewPort != null && mViewPort.isHAM();
return viewPort != null && viewPort.isHAM();
}
public static void main(String[] pArgs) throws IOException {

View File

@@ -208,9 +208,9 @@ public class IFFImageWriter extends ImageWriterBase {
}
// ILBM(4) + anno(8+len) + header(8+20) + cmap(8+len)? + body(8+len);
int size = 4 + 8 + anno.mChunkLength + 28 + 8 + pBodyLength;
int size = 4 + 8 + anno.chunkLength + 28 + 8 + pBodyLength;
if (cmap != null) {
size += 8 + cmap.mChunkLength;
size += 8 + cmap.chunkLength;
}
imageOutput.writeInt(IFF.CHUNK_FORM);

View File

@@ -51,7 +51,6 @@ public class IFFImageWriterSpi extends ImageWriterSpi {
*/
public IFFImageWriterSpi() {
this(IIOUtil.getProviderInfo(IFFImageWriterSpi.class));
}
private IFFImageWriterSpi(final ProviderInfo pProviderInfo) {

View File

@@ -41,17 +41,17 @@ import java.util.List;
* @version $Id: AbstractDirectory.java,v 1.0 Nov 11, 2009 5:31:04 PM haraldk Exp$
*/
public abstract class AbstractDirectory implements Directory {
private final List<Entry> mEntries = new ArrayList<Entry>();
private final List<Entry> entries = new ArrayList<Entry>();
protected AbstractDirectory(final Collection<? extends Entry> pEntries) {
if (pEntries != null) {
mEntries.addAll(pEntries);
entries.addAll(pEntries);
}
}
public Entry getEntryById(final Object pIdentifier) {
public Entry getEntryById(final Object identifier) {
for (Entry entry : this) {
if (entry.getIdentifier().equals(pIdentifier)) {
if (entry.getIdentifier().equals(identifier)) {
return entry;
}
}
@@ -59,9 +59,9 @@ public abstract class AbstractDirectory implements Directory {
return null;
}
public Entry getEntryByFieldName(final String pFieldName) {
public Entry getEntryByFieldName(final String fieldName) {
for (Entry entry : this) {
if (entry.getFieldName() != null && entry.getFieldName().equals(pFieldName)) {
if (entry.getFieldName() != null && entry.getFieldName().equals(fieldName)) {
return entry;
}
}
@@ -70,7 +70,7 @@ public abstract class AbstractDirectory implements Directory {
}
public Iterator<Entry> iterator() {
return mEntries.iterator();
return entries.iterator();
}
/**
@@ -85,23 +85,23 @@ public abstract class AbstractDirectory implements Directory {
}
}
public boolean add(final Entry pEntry) {
public boolean add(final Entry entry) {
assertMutable();
// TODO: Replace if entry is already present?
// Some directories may need special ordering, or may/may not support multiple entries for certain ids...
return mEntries.add(pEntry);
return entries.add(entry);
}
@SuppressWarnings({"SuspiciousMethodCalls"})
public boolean remove(final Object pEntry) {
public boolean remove(final Object entry) {
assertMutable();
return mEntries.remove(pEntry);
return entries.remove(entry);
}
public int size() {
return mEntries.size();
return entries.size();
}
/**
@@ -118,7 +118,7 @@ public abstract class AbstractDirectory implements Directory {
@Override
public int hashCode() {
return mEntries.hashCode();
return entries.hashCode();
}
@Override
@@ -134,11 +134,11 @@ public abstract class AbstractDirectory implements Directory {
// Safe cast, as it must be a subclass for the classes to be equal
AbstractDirectory other = (AbstractDirectory) pOther;
return mEntries.equals(other.mEntries);
return entries.equals(other.entries);
}
@Override
public String toString() {
return String.format("%s%s", getClass().getSimpleName(), mEntries.toString());
return String.format("%s%s", getClass().getSimpleName(), entries.toString());
}
}

View File

@@ -42,18 +42,18 @@ import java.util.Arrays;
*/
public abstract class AbstractEntry implements Entry {
private final Object mIdentifier;
private final Object mValue; // TODO: Might need to be mutable..
private final Object identifier;
private final Object value; // TODO: Might need to be mutable..
protected AbstractEntry(final Object pIdentifier, final Object pValue) {
Validate.notNull(pIdentifier, "identifier");
protected AbstractEntry(final Object identifier, final Object value) {
Validate.notNull(identifier, "identifier");
mIdentifier = pIdentifier;
mValue = pValue;
this.identifier = identifier;
this.value = value;
}
public final Object getIdentifier() {
return mIdentifier;
return identifier;
}
/**
@@ -66,64 +66,64 @@ public abstract class AbstractEntry implements Entry {
}
public Object getValue() {
return mValue;
return value;
}
public String getValueAsString() {
if (valueCount() > 1) {
if (valueCount() < 16) {
Class<?> type = mValue.getClass().getComponentType();
Class<?> type = value.getClass().getComponentType();
if (type.isPrimitive()) {
if (type.equals(boolean.class)) {
return Arrays.toString((boolean[]) mValue);
return Arrays.toString((boolean[]) value);
}
else if (type.equals(byte.class)) {
return Arrays.toString((byte[]) mValue);
return Arrays.toString((byte[]) value);
}
else if (type.equals(char.class)) {
return new String((char[]) mValue);
return new String((char[]) value);
}
else if (type.equals(double.class)) {
return Arrays.toString((double[]) mValue);
return Arrays.toString((double[]) value);
}
else if (type.equals(float.class)) {
return Arrays.toString((float[]) mValue);
return Arrays.toString((float[]) value);
}
else if (type.equals(int.class)) {
return Arrays.toString((int[]) mValue);
return Arrays.toString((int[]) value);
}
else if (type.equals(long.class)) {
return Arrays.toString((long[]) mValue);
return Arrays.toString((long[]) value);
}
else if (type.equals(short.class)) {
return Arrays.toString((short[]) mValue);
return Arrays.toString((short[]) value);
}
// Fall through should never happen
}
else {
return Arrays.toString((Object[]) mValue);
return Arrays.toString((Object[]) value);
}
}
return String.valueOf(mValue) + " (" + valueCount() + ")";
return String.valueOf(value) + " (" + valueCount() + ")";
}
return String.valueOf(mValue);
return String.valueOf(value);
}
public String getTypeName() {
if (mValue == null) {
if (value == null) {
return null;
}
return mValue.getClass().getSimpleName();
return value.getClass().getSimpleName();
}
public int valueCount() {
// TODO: Collection support?
if (mValue != null && mValue.getClass().isArray()) {
return Array.getLength(mValue);
if (value != null && value.getClass().isArray()) {
return Array.getLength(value);
}
return 1;
@@ -135,7 +135,7 @@ public abstract class AbstractEntry implements Entry {
@Override
public int hashCode() {
return mIdentifier.hashCode() + 31 * mValue.hashCode();
return identifier.hashCode() + 31 * value.hashCode();
}
@Override
@@ -149,8 +149,8 @@ public abstract class AbstractEntry implements Entry {
AbstractEntry other = (AbstractEntry) pOther;
return mIdentifier.equals(other.mIdentifier) && (
mValue == null && other.mValue == null || mValue != null && mValue.equals(other.mValue)
return identifier.equals(other.identifier) && (
value == null && other.value == null || value != null && value.equals(other.value)
);
}

View File

@@ -38,9 +38,9 @@ package com.twelvemonkeys.imageio.metadata;
public interface Directory extends Iterable<Entry> {
// TODO: Spec when more entries exist? Or make Entry support multi-values!?
// For multiple entries with same id in directory, the first entry (using the order from the stream) will be returned
Entry getEntryById(Object pIdentifier);
Entry getEntryById(Object identifier);
Entry getEntryByFieldName(String pName);
Entry getEntryByFieldName(String fieldName);
// Iterator containing the entries in
//Iterator<Entry> getBestEntries(Object pIdentifier, Object pQualifier, String pLanguage);
@@ -51,9 +51,9 @@ public interface Directory extends Iterable<Entry> {
// boolean replace(Entry pEntry)??
// boolean contains(Object pIdentifier)?
boolean add(Entry pEntry);
boolean add(Entry entry);
boolean remove(Object pEntry); // Object in case we retro-fit Collection/Map..
boolean remove(Object entry); // Object in case we retro-fit Collection/Map..
int size();

View File

@@ -39,5 +39,5 @@ import java.io.IOException;
* @version $Id: MetadataReader.java,v 1.0 Nov 13, 2009 8:38:11 PM haraldk Exp$
*/
public abstract class MetadataReader {
public abstract Directory read(ImageInputStream pInput) throws IOException;
public abstract Directory read(ImageInputStream input) throws IOException;
}

View File

@@ -41,7 +41,7 @@ import java.util.Collection;
* @version $Id: EXIFDirectory.java,v 1.0 Nov 11, 2009 5:02:59 PM haraldk Exp$
*/
final class EXIFDirectory extends AbstractDirectory {
EXIFDirectory(final Collection<? extends Entry> pEntries) {
super(pEntries);
EXIFDirectory(final Collection<? extends Entry> entries) {
super(entries);
}
}

View File

@@ -38,20 +38,20 @@ import com.twelvemonkeys.imageio.metadata.AbstractEntry;
* @version $Id: EXIFEntry.java,v 1.0 Nov 13, 2009 5:47:35 PM haraldk Exp$
*/
final class EXIFEntry extends AbstractEntry {
final private short mType;
final private short type;
EXIFEntry(final int pIdentifier, final Object pValue, final short pType) {
super(pIdentifier, pValue);
EXIFEntry(final int identifier, final Object value, final short type) {
super(identifier, value);
// if (pType < 1 || pType > TIFF.TYPE_NAMES.length) {
// throw new IllegalArgumentException(String.format("Illegal EXIF type: %s", pType));
// if (type < 1 || type > TIFF.TYPE_NAMES.length) {
// throw new IllegalArgumentException(String.format("Illegal EXIF type: %s", type));
// }
mType = pType;
this.type = type;
}
public short getType() {
return mType;
return type;
}
@Override
@@ -110,6 +110,6 @@ final class EXIFEntry extends AbstractEntry {
@Override
public String getTypeName() {
return TIFF.TYPE_NAMES[mType - 1];
return TIFF.TYPE_NAMES[type - 1];
}
}

View File

@@ -56,14 +56,14 @@ public final class EXIFReader extends MetadataReader {
static final Collection<Integer> KNOWN_IFDS = Arrays.asList(TIFF.TAG_EXIF_IFD, TIFF.TAG_GPS_IFD, TIFF.TAG_INTEROP_IFD);
@Override
public Directory read(final ImageInputStream pInput) throws IOException {
public Directory read(final ImageInputStream input) throws IOException {
byte[] bom = new byte[2];
pInput.readFully(bom);
input.readFully(bom);
if (bom[0] == 'I' && bom[1] == 'I') {
pInput.setByteOrder(ByteOrder.LITTLE_ENDIAN);
input.setByteOrder(ByteOrder.LITTLE_ENDIAN);
}
else if (bom[0] == 'M' && bom[1] == 'M') {
pInput.setByteOrder(ByteOrder.BIG_ENDIAN);
input.setByteOrder(ByteOrder.BIG_ENDIAN);
}
else {
throw new IIOException(String.format("Invalid TIFF byte order mark '%s', expected: 'II' or 'MM'", StringUtil.decode(bom, 0, bom.length, "ASCII")));
@@ -71,14 +71,14 @@ public final class EXIFReader extends MetadataReader {
// TODO: BigTiff uses version 43 instead of TIFF's 42, and header is slightly different, see
// http://www.awaresystems.be/imaging/tiff/bigtiff.html
int magic = pInput.readUnsignedShort();
int magic = input.readUnsignedShort();
if (magic != TIFF.TIFF_MAGIC) {
throw new IIOException(String.format("Wrong TIFF magic in EXIF data: %04x, expected: %04x", magic, TIFF.TIFF_MAGIC));
}
long directoryOffset = pInput.readUnsignedInt();
long directoryOffset = input.readUnsignedInt();
return readDirectory(pInput, directoryOffset);
return readDirectory(input, directoryOffset);
}
private EXIFDirectory readDirectory(final ImageInputStream pInput, final long pOffset) throws IOException {

View File

@@ -54,8 +54,8 @@ public final class Rational extends Number implements Comparable<Rational> {
// Inspired by http://www.cs.princeton.edu/introcs/92symbolic/Rational.java.html and java.lang.Integer
static final Rational ZERO = new Rational(0, 1);
private final long mNumerator;
private final long mDenominator;
private final long numerator;
private final long denominator;
public Rational(final long pNumber) {
this(pNumber, 1);
@@ -74,8 +74,8 @@ public final class Rational extends Number implements Comparable<Rational> {
long num = pNumerator / gcd;
long den = pDenominator / gcd;
mNumerator = pDenominator >= 0 ? num : -num;
mDenominator = pDenominator >= 0 ? den : -den;
numerator = pDenominator >= 0 ? num : -num;
denominator = pDenominator >= 0 ? den : -den;
}
private static long gcd(final long m, final long n) {
@@ -95,11 +95,11 @@ public final class Rational extends Number implements Comparable<Rational> {
}
public long numerator() {
return mNumerator;
return numerator;
}
public long denominator() {
return mDenominator;
return denominator;
}
/// Number implementation
@@ -121,7 +121,7 @@ public final class Rational extends Number implements Comparable<Rational> {
@Override
public double doubleValue() {
return mNumerator / (double) mDenominator;
return numerator / (double) denominator;
}
/// Comparable implementation
@@ -147,7 +147,7 @@ public final class Rational extends Number implements Comparable<Rational> {
@Override
public String toString() {
return mDenominator == 1 ? Long.toString(mNumerator) : String.format("%s/%s", mNumerator, mDenominator);
return denominator == 1 ? Long.toString(numerator) : String.format("%s/%s", numerator, denominator);
}
/// Operations (adapted from http://www.cs.princeton.edu/introcs/92symbolic/Rational.java.html)
@@ -161,10 +161,10 @@ public final class Rational extends Number implements Comparable<Rational> {
}
// reduce p1/q2 and p2/q1, then multiply, where a = p1/q1 and b = p2/q2
Rational c = new Rational(mNumerator, pOther.mDenominator);
Rational d = new Rational(pOther.mNumerator, mDenominator);
Rational c = new Rational(numerator, pOther.denominator);
Rational d = new Rational(pOther.numerator, denominator);
return new Rational(c.mNumerator * d.mNumerator, c.mDenominator * d.mDenominator);
return new Rational(c.numerator * d.numerator, c.denominator * d.denominator);
}
// return a + b, staving off overflow
@@ -178,20 +178,20 @@ public final class Rational extends Number implements Comparable<Rational> {
}
// Find gcd of numerators and denominators
long f = gcd(mNumerator, pOther.mNumerator);
long g = gcd(mDenominator, pOther.mDenominator);
long f = gcd(numerator, pOther.numerator);
long g = gcd(denominator, pOther.denominator);
// add cross-product terms for numerator
// multiply back in
return new Rational(
((mNumerator / f) * (pOther.mDenominator / g) + (pOther.mNumerator / f) * (mDenominator / g)) * f,
lcm(mDenominator, pOther.mDenominator)
((numerator / f) * (pOther.denominator / g) + (pOther.numerator / f) * (denominator / g)) * f,
lcm(denominator, pOther.denominator)
);
}
// return -a
public Rational negate() {
return new Rational(-mNumerator, mDenominator);
return new Rational(-numerator, denominator);
}
// return a - b
@@ -200,7 +200,7 @@ public final class Rational extends Number implements Comparable<Rational> {
}
public Rational reciprocal() {
return new Rational(mDenominator, mNumerator);
return new Rational(denominator, numerator);
}
// return a / b

View File

@@ -41,7 +41,7 @@ import java.util.Collection;
* @version $Id: IPTCDirectory.java,v 1.0 Nov 11, 2009 5:02:59 PM haraldk Exp$
*/
final class IPTCDirectory extends AbstractDirectory {
IPTCDirectory(final Collection<? extends Entry> pEntries) {
super(pEntries);
IPTCDirectory(final Collection<? extends Entry> entries) {
super(entries);
}
}

View File

@@ -38,8 +38,8 @@ import com.twelvemonkeys.imageio.metadata.AbstractEntry;
* @version $Id: IPTCEntry.java,v 1.0 Nov 13, 2009 8:57:04 PM haraldk Exp$
*/
class IPTCEntry extends AbstractEntry {
public IPTCEntry(final int pTagId, final Object pValue) {
super(pTagId, pValue);
public IPTCEntry(final int tagId, final Object value) {
super(tagId, value);
}
@Override

View File

@@ -57,18 +57,18 @@ public final class IPTCReader extends MetadataReader {
private static final int ENCODING_UNSPECIFIED = 0;
private static final int ENCODING_UTF_8 = 0x1b2547;
private int mEncoding = ENCODING_UNSPECIFIED;
private int encoding = ENCODING_UNSPECIFIED;
@Override
public Directory read(final ImageInputStream pInput) throws IOException {
public Directory read(final ImageInputStream input) throws IOException {
final List<Entry> entries = new ArrayList<Entry>();
// 0x1c identifies start of a tag
while (pInput.read() == 0x1c) {
short tagId = pInput.readShort();
int tagByteCount = pInput.readUnsignedShort();
Entry entry = readEntry(pInput, tagId, tagByteCount);
while (input.read() == 0x1c) {
short tagId = input.readShort();
int tagByteCount = input.readUnsignedShort();
Entry entry = readEntry(input, tagId, tagByteCount);
if (entry != null) {
entries.add(entry);
@@ -85,7 +85,7 @@ public final class IPTCReader extends MetadataReader {
case IPTC.TAG_CODED_CHARACTER_SET:
// TODO: Mapping from ISO 646 to Java supported character sets?
// TODO: Move somewhere else?
mEncoding = parseEncoding(pInput, pLength);
encoding = parseEncoding(pInput, pLength);
return null;
case IPTC.TAG_RECORD_VERSION:
// A single unsigned short value
@@ -140,7 +140,7 @@ public final class IPTCReader extends MetadataReader {
return chars.toString();
}
catch (CharacterCodingException notUTF8) {
if (mEncoding == ENCODING_UTF_8) {
if (encoding == ENCODING_UTF_8) {
throw new IIOException("Wrong encoding of IPTC data, explicitly set to UTF-8 in DataSet 1:90", notUTF8);
}

View File

@@ -45,7 +45,7 @@ final class XMPDirectory extends AbstractDirectory {
// TODO: XMPDirectory, maybe not even an AbstractDirectory
// - Keeping the Document would allow for easier serialization
// TODO: Or use direct SAX parsing
public XMPDirectory(List<Entry> pEntries) {
super(pEntries);
public XMPDirectory(List<Entry> entries) {
super(entries);
}
}

View File

@@ -38,20 +38,20 @@ import com.twelvemonkeys.imageio.metadata.AbstractEntry;
* @version $Id: XMPEntry.java,v 1.0 Nov 17, 2009 9:38:39 PM haraldk Exp$
*/
final class XMPEntry extends AbstractEntry {
private final String mFieldName;
private final String fieldName;
public XMPEntry(final String pIdentifier, final Object pValue) {
this(pIdentifier, null, pValue);
public XMPEntry(final String identifier, final Object pValue) {
this(identifier, null, pValue);
}
public XMPEntry(final String pIdentifier, final String pFieldName, final Object pValue) {
super(pIdentifier, pValue);
mFieldName = pFieldName;
public XMPEntry(final String identifier, final String fieldName, final Object value) {
super(identifier, value);
this.fieldName = fieldName;
}
@SuppressWarnings({"SuspiciousMethodCalls"})
@Override
public String getFieldName() {
return mFieldName != null ? mFieldName : XMP.DEFAULT_NS_MAPPING.get(getIdentifier());
return fieldName != null ? fieldName : XMP.DEFAULT_NS_MAPPING.get(getIdentifier());
}
}

View File

@@ -56,7 +56,7 @@ import java.util.*;
*/
public final class XMPReader extends MetadataReader {
@Override
public Directory read(final ImageInputStream pInput) throws IOException {
public Directory read(final ImageInputStream input) throws IOException {
// pInput.mark();
//
// BufferedReader reader = new BufferedReader(new InputStreamReader(IIOUtil.createStreamAdapter(pInput), Charset.forName("UTF-8")));
@@ -75,7 +75,7 @@ public final class XMPReader extends MetadataReader {
// TODO: Determine encoding and parse using a Reader...
// TODO: Refactor scanner to return inputstream?
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new InputSource(IIOUtil.createStreamAdapter(pInput)));
Document document = builder.parse(new InputSource(IIOUtil.createStreamAdapter(input)));
// XMLSerializer serializer = new XMLSerializer(System.err, System.getProperty("file.encoding"));
// serializer.serialize(document);

View File

@@ -110,23 +110,23 @@ public class PICTImageReader extends ImageReaderBase {
static boolean DEBUG = false;
// Private fields
private QuickDrawContext mContext;
private Rectangle mFrame;
private QuickDrawContext context;
private Rectangle frame;
private int mVersion;
private int version;
// Variables for storing draw status
private Point mPenPosition = new Point(0, 0);
private Rectangle mLastRectangle = new Rectangle(0, 0);
private Point penPosition = new Point(0, 0);
private Rectangle lastRectangle = new Rectangle(0, 0);
// Ratio between the screen resolution and the image resolution
private double mScreenImageXRatio;
private double mScreenImageYRatio;
private double screenImageXRatio;
private double screenImageYRatio;
// List of images created during image import
private List<BufferedImage> mImages = new ArrayList<BufferedImage>();
private long mImageStartStreamPos;
protected int mPicSize;
private List<BufferedImage> images = new ArrayList<BufferedImage>();
private long imageStartStreamPos;
protected int picSize;
public PICTImageReader() {
this(null);
@@ -137,9 +137,9 @@ public class PICTImageReader extends ImageReaderBase {
}
protected void resetMembers() {
mContext = null;
mFrame = null;
mImages.clear();
context = null;
frame = null;
images.clear();
}
/**
@@ -149,14 +149,16 @@ public class PICTImageReader extends ImageReaderBase {
* @throws IOException if an I/O error occurs while reading the image.
*/
private Rectangle getPICTFrame() throws IOException {
if (mFrame == null) {
if (frame == null) {
// Read in header information
readPICTHeader(imageInput);
if (DEBUG) {
System.out.println("Done reading PICT header!");
}
}
return mFrame;
return frame;
}
/**
@@ -184,9 +186,10 @@ public class PICTImageReader extends ImageReaderBase {
private void readPICTHeader0(final ImageInputStream pStream) throws IOException {
// Get size
mPicSize = pStream.readUnsignedShort();
picSize = pStream.readUnsignedShort();
if (DEBUG) {
System.out.println("picSize: " + mPicSize);
System.out.println("picSize: " + picSize);
}
// Get frame at 72 dpi
@@ -197,17 +200,17 @@ public class PICTImageReader extends ImageReaderBase {
int h = pStream.readUnsignedShort();
int w = pStream.readUnsignedShort();
mFrame = new Rectangle(x, y, w - x, h - y);
if (mFrame.width < 0 || mFrame.height < 0) {
throw new IIOException("Error in PICT header: Invalid frame " + mFrame);
frame = new Rectangle(x, y, w - x, h - y);
if (frame.width < 0 || frame.height < 0) {
throw new IIOException("Error in PICT header: Invalid frame " + frame);
}
if (DEBUG) {
System.out.println("mFrame: " + mFrame);
System.out.println("frame: " + frame);
}
// Set default display ratios. 72 dpi is the standard Macintosh resolution.
mScreenImageXRatio = 1.0;
mScreenImageYRatio = 1.0;
screenImageXRatio = 1.0;
screenImageYRatio = 1.0;
// Get the version, since the way of reading the rest depends on it
boolean isExtendedV2 = false;
@@ -217,10 +220,10 @@ public class PICTImageReader extends ImageReaderBase {
}
if (version == (PICT.OP_VERSION << 8) + 0x01) {
mVersion = 1;
this.version = 1;
}
else if (version == PICT.OP_VERSION && pStream.readShort() == PICT.OP_VERSION_2) {
mVersion = 2;
this.version = 2;
// Read in version 2 header op and test that it is valid: HeaderOp 0x0C00
if (pStream.readShort() != PICT.OP_HEADER_OP) {
@@ -249,10 +252,10 @@ public class PICTImageReader extends ImageReaderBase {
// int h (fixed point)
double h2 = PICTUtil.readFixedPoint(pStream);
mScreenImageXRatio = (w - x) / (w2 - x2);
mScreenImageYRatio = (h - y) / (h2 - y2);
screenImageXRatio = (w - x) / (w2 - x2);
screenImageYRatio = (h - y) / (h2 - y2);
if (mScreenImageXRatio < 0 || mScreenImageYRatio < 0) {
if (screenImageXRatio < 0 || screenImageYRatio < 0) {
throw new IIOException("Error in PICT header: Invalid bounds " + new Rectangle.Double(x2, y2, w2 - x2, h2 - y2));
}
if (DEBUG) {
@@ -288,10 +291,10 @@ public class PICTImageReader extends ImageReaderBase {
// short w
short w2 = pStream.readShort();
mScreenImageXRatio = (w - x) / (double) (w2 - x2);
mScreenImageYRatio = (h - y) / (double) (h2 - y2);
screenImageXRatio = (w - x) / (double) (w2 - x2);
screenImageYRatio = (h - y) / (double) (h2 - y2);
if (mScreenImageXRatio < 0 || mScreenImageYRatio < 0) {
if (screenImageXRatio < 0 || screenImageYRatio < 0) {
throw new IIOException("Error in PICT header: Invalid bounds " + new Rectangle.Double(x2, y2, w2 - x2, h2 - y2));
}
if (DEBUG) {
@@ -303,8 +306,8 @@ public class PICTImageReader extends ImageReaderBase {
}
if (DEBUG) {
System.out.println("screenImageXRatio: " + mScreenImageXRatio);
System.out.println("screenImageYRatio: " + mScreenImageYRatio);
System.out.println("screenImageXRatio: " + screenImageXRatio);
System.out.println("screenImageYRatio: " + screenImageYRatio);
}
}
else {
@@ -313,13 +316,13 @@ public class PICTImageReader extends ImageReaderBase {
}
if (DEBUG) {
System.out.println("Version: " + mVersion + (isExtendedV2 ? " extended" : ""));
System.out.println("Version: " + this.version + (isExtendedV2 ? " extended" : ""));
}
mImageStartStreamPos = pStream.getStreamPosition();
imageStartStreamPos = pStream.getStreamPosition();
// Won't need header data again (NOTE: We'll only get here if no exception is thrown)
pStream.flushBefore(mImageStartStreamPos);
pStream.flushBefore(imageStartStreamPos);
}
static void skipNullHeader(final ImageInputStream pStream) throws IOException {
@@ -341,7 +344,7 @@ public class PICTImageReader extends ImageReaderBase {
* @throws IOException if an I/O error occurs while reading the image.
*/
private void drawOnto(Graphics2D pGraphics) throws IOException {
mContext = new QuickDrawContext(pGraphics);
context = new QuickDrawContext(pGraphics);
readPICTopcodes(imageInput);
if (DEBUG) {
@@ -360,7 +363,7 @@ public class PICTImageReader extends ImageReaderBase {
* @throws java.io.IOException if an I/O error occurs while reading the image.
*/
private void readPICTopcodes(ImageInputStream pStream) throws IOException {
pStream.seek(mImageStartStreamPos);
pStream.seek(imageStartStreamPos);
int opCode, dh, dv, dataLength;
byte[] colorBuffer = new byte[3 * PICT.COLOR_COMP_SIZE];
@@ -386,7 +389,7 @@ public class PICTImageReader extends ImageReaderBase {
// Read from file until we read the end of picture opcode
do {
// Read opcode, version 1: byte, version 2: short
if (mVersion == 1) {
if (version == 1) {
opCode = pStream.readUnsignedByte();
}
else {
@@ -431,7 +434,7 @@ public class PICTImageReader extends ImageReaderBase {
case PICT.OP_BK_PAT:
// Get the data
mContext.setBackgroundPattern(PICTUtil.readPattern(pStream));
context.setBackgroundPattern(PICTUtil.readPattern(pStream));
if (DEBUG) {
System.out.println("bkPat");
}
@@ -490,7 +493,7 @@ public class PICTImageReader extends ImageReaderBase {
// Get the two words
// NOTE: This is out of order, compared to other Points
Dimension pnsize = new Dimension(pStream.readUnsignedShort(), pStream.readUnsignedShort());
mContext.setPenSize(pnsize);
context.setPenSize(pnsize);
if (DEBUG) {
System.out.println("pnsize: " + pnsize);
}
@@ -503,12 +506,12 @@ public class PICTImageReader extends ImageReaderBase {
System.out.println("pnMode: " + mode);
}
mContext.setPenMode(mode);
context.setPenMode(mode);
break;
case PICT.OP_PN_PAT:
mContext.setPenPattern(PICTUtil.readPattern(pStream));
context.setPenPattern(PICTUtil.readPattern(pStream));
if (DEBUG) {
System.out.println("pnPat");
}
@@ -557,7 +560,7 @@ public class PICTImageReader extends ImageReaderBase {
// currentFont = mGraphics.getFont();
// mGraphics.setFont(new Font(currentFont.getName(), currentFont.getStyle(), tx_size));
//}
mContext.setTextSize(tx_size);
context.setTextSize(tx_size);
if (DEBUG) {
System.out.println("txSize: " + tx_size);
}
@@ -599,15 +602,15 @@ public class PICTImageReader extends ImageReaderBase {
case 0x0012: // BkPixPat
bg = PICTUtil.readColorPattern(pStream);
mContext.setBackgroundPattern(bg);
context.setBackgroundPattern(bg);
break;
case 0x0013: // PnPixPat
pen = PICTUtil.readColorPattern(pStream);
mContext.setBackgroundPattern(pen);
context.setBackgroundPattern(pen);
break;
case 0x0014: // FillPixPat
fill = PICTUtil.readColorPattern(pStream);
mContext.setBackgroundPattern(fill);
context.setBackgroundPattern(fill);
break;
case PICT.OP_PN_LOC_H_FRAC:// TO BE DONE???
@@ -650,7 +653,7 @@ public class PICTImageReader extends ImageReaderBase {
case PICT.OP_HILITE_MODE:
// Change color to hilite color
mContext.setPenPattern(new BitMapPattern(hilight));
context.setPenPattern(new BitMapPattern(hilight));
if (DEBUG) {
System.out.println("opHiliteMode");
}
@@ -691,14 +694,14 @@ public class PICTImageReader extends ImageReaderBase {
y = getYPtCoord(pStream.readUnsignedShort());
x = getXPtCoord(pStream.readUnsignedShort());
mPenPosition.setLocation(x, y);
penPosition.setLocation(x, y);
// Move pen to new position, draw line
mContext.moveTo(origin);
mContext.lineTo(mPenPosition);
context.moveTo(origin);
context.lineTo(penPosition);
if (DEBUG) {
System.out.println("line from: " + origin + " to: " + mPenPosition);
System.out.println("line from: " + origin + " to: " + penPosition);
}
break;
@@ -708,10 +711,10 @@ public class PICTImageReader extends ImageReaderBase {
x = getXPtCoord(pStream.readUnsignedShort());
// Draw line
mContext.line(x, y);
context.line(x, y);
if (DEBUG) {
System.out.println("lineFrom to: " + mPenPosition);
System.out.println("lineFrom to: " + penPosition);
}
break;
@@ -726,8 +729,8 @@ public class PICTImageReader extends ImageReaderBase {
dh_dv = new Point(x, y);
// Move pen to new position, draw line if we have a graphics
mPenPosition.setLocation(origin.x + dh_dv.x, origin.y + dh_dv.y);
mContext.lineTo(mPenPosition);
penPosition.setLocation(origin.x + dh_dv.x, origin.y + dh_dv.y);
context.lineTo(penPosition);
if (DEBUG) {
System.out.println("Short line origin: " + origin + ", dh,dv: " + dh_dv);
@@ -740,7 +743,7 @@ public class PICTImageReader extends ImageReaderBase {
x = getXPtCoord(pStream.readByte());
// Draw line
mContext.line(x, y);
context.line(x, y);
if (DEBUG) {
System.out.println("Short line from dh,dv: " + x + "," + y);
@@ -765,30 +768,30 @@ public class PICTImageReader extends ImageReaderBase {
y = getYPtCoord(pStream.readUnsignedShort());
x = getXPtCoord(pStream.readUnsignedShort());
origin = new Point(x, y);
mPenPosition = origin;
mContext.moveTo(mPenPosition);
penPosition = origin;
context.moveTo(penPosition);
text = PICTUtil.readPascalString(pStream);
// TODO
//if (mGraphics != null) {
// mGraphics.drawString(text, mPenPosition.x, mPenPosition.y);
// mGraphics.drawString(text, penPosition.x, penPosition.y);
//}
mContext.drawString(text);
context.drawString(text);
if (DEBUG) {
System.out.println("longText origin: " + mPenPosition + ", text:" + text);
System.out.println("longText origin: " + penPosition + ", text:" + text);
}
break;
case PICT.OP_DH_TEXT:// OK, not tested
// Get dh
dh = getXPtCoord(pStream.readByte());
mPenPosition.translate(dh, 0);
mContext.moveTo(mPenPosition);
penPosition.translate(dh, 0);
context.moveTo(penPosition);
text = PICTUtil.readPascalString(pStream);
// TODO
// if (mGraphics != null) {
// mGraphics.drawString(text, mPenPosition.x, mPenPosition.y);
// mGraphics.drawString(text, penPosition.x, penPosition.y);
// }
mContext.drawString(text);
context.drawString(text);
if (DEBUG) {
System.out.println("DHText dh: " + dh + ", text:" + text);
}
@@ -797,14 +800,14 @@ public class PICTImageReader extends ImageReaderBase {
case PICT.OP_DV_TEXT:// OK, not tested
// Get dh
dv = getYPtCoord(pStream.readByte());
mPenPosition.translate(0, dv);
mContext.moveTo(mPenPosition);
penPosition.translate(0, dv);
context.moveTo(penPosition);
text = PICTUtil.readPascalString(pStream);
// TODO
//if (mGraphics != null) {
// mGraphics.drawString(text, mPenPosition.x, mPenPosition.y);
// mGraphics.drawString(text, penPosition.x, penPosition.y);
//}
mContext.drawString(text);
context.drawString(text);
if (DEBUG) {
System.out.println("DVText dv: " + dv + ", text:" + text);
}
@@ -814,16 +817,16 @@ public class PICTImageReader extends ImageReaderBase {
// Get dh, dv
y = getYPtCoord(pStream.readByte());
x = getXPtCoord(pStream.readByte());
mPenPosition.translate(x, y);
mContext.moveTo(mPenPosition);
penPosition.translate(x, y);
context.moveTo(penPosition);
text = PICTUtil.readPascalString(pStream);
// TODO
//if (mGraphics != null) {
// mGraphics.drawString(text, mPenPosition.x, mPenPosition.y);
// mGraphics.drawString(text, penPosition.x, penPosition.y);
//}
mContext.drawString(text);
context.drawString(text);
if (DEBUG) {
System.out.println("DHDVText penPosition: " + mPenPosition + ", text:" + text);
System.out.println("DHDVText penPosition: " + penPosition + ", text:" + text);
}
break;
@@ -843,7 +846,7 @@ public class PICTImageReader extends ImageReaderBase {
// mGraphics.setFont(Font.decode(text)
// .deriveFont(currentFont.getStyle(), currentFont.getSize()));
//}
mContext.drawString(text);
context.drawString(text);
if (DEBUG) {
System.out.println("fontName: \"" + text +"\"");
}
@@ -882,7 +885,7 @@ public class PICTImageReader extends ImageReaderBase {
case PICT.OP_INVERT_RECT:// OK, not tested
case PICT.OP_FILL_RECT:// OK, not tested
// Get the frame rectangle
readRectangle(pStream, mLastRectangle);
readRectangle(pStream, lastRectangle);
case PICT.OP_FRAME_SAME_RECT:// OK, not tested
case PICT.OP_PAINT_SAME_RECT:// OK, not tested
@@ -893,23 +896,23 @@ public class PICTImageReader extends ImageReaderBase {
switch (opCode) {
case PICT.OP_FRAME_RECT:
case PICT.OP_FRAME_SAME_RECT:
mContext.frameRect(mLastRectangle);
context.frameRect(lastRectangle);
break;
case PICT.OP_PAINT_RECT:
case PICT.OP_PAINT_SAME_RECT:
mContext.paintRect(mLastRectangle);
context.paintRect(lastRectangle);
break;
case PICT.OP_ERASE_RECT:
case PICT.OP_ERASE_SAME_RECT:
mContext.eraseRect(mLastRectangle);
context.eraseRect(lastRectangle);
break;
case PICT.OP_INVERT_RECT:
case PICT.OP_INVERT_SAME_RECT:
mContext.invertRect(mLastRectangle);
context.invertRect(lastRectangle);
break;
case PICT.OP_FILL_RECT:
case PICT.OP_FILL_SAME_RECT:
mContext.fillRect(mLastRectangle, fill);
context.fillRect(lastRectangle, fill);
break;
}
@@ -917,34 +920,34 @@ public class PICTImageReader extends ImageReaderBase {
if (DEBUG) {
switch (opCode) {
case PICT.OP_FRAME_RECT:
System.out.println("frameRect: " + mLastRectangle);
System.out.println("frameRect: " + lastRectangle);
break;
case PICT.OP_PAINT_RECT:
System.out.println("paintRect: " + mLastRectangle);
System.out.println("paintRect: " + lastRectangle);
break;
case PICT.OP_ERASE_RECT:
System.out.println("eraseRect: " + mLastRectangle);
System.out.println("eraseRect: " + lastRectangle);
break;
case PICT.OP_INVERT_RECT:
System.out.println("invertRect: " + mLastRectangle);
System.out.println("invertRect: " + lastRectangle);
break;
case PICT.OP_FILL_RECT:
System.out.println("fillRect: " + mLastRectangle);
System.out.println("fillRect: " + lastRectangle);
break;
case PICT.OP_FRAME_SAME_RECT:
System.out.println("frameSameRect: " + mLastRectangle);
System.out.println("frameSameRect: " + lastRectangle);
break;
case PICT.OP_PAINT_SAME_RECT:
System.out.println("paintSameRect: " + mLastRectangle);
System.out.println("paintSameRect: " + lastRectangle);
break;
case PICT.OP_ERASE_SAME_RECT:
System.out.println("eraseSameRect: " + mLastRectangle);
System.out.println("eraseSameRect: " + lastRectangle);
break;
case PICT.OP_INVERT_SAME_RECT:
System.out.println("invertSameRect: " + mLastRectangle);
System.out.println("invertSameRect: " + lastRectangle);
break;
case PICT.OP_FILL_SAME_RECT:
System.out.println("fillSameRect: " + mLastRectangle);
System.out.println("fillSameRect: " + lastRectangle);
break;
}
}
@@ -969,7 +972,7 @@ public class PICTImageReader extends ImageReaderBase {
case PICT.OP_INVERT_R_RECT:// OK, not tested
case PICT.OP_FILL_R_RECT:// OK, not tested
// Get the frame rectangle
readRectangle(pStream, mLastRectangle);
readRectangle(pStream, lastRectangle);
case PICT.OP_FRAME_SAME_R_RECT:// OK, not tested
case PICT.OP_PAINT_SAME_R_RECT:// OK, not tested
@@ -980,23 +983,23 @@ public class PICTImageReader extends ImageReaderBase {
switch (opCode) {
case PICT.OP_FRAME_R_RECT:
case PICT.OP_FRAME_SAME_R_RECT:
mContext.frameRoundRect(mLastRectangle, ovSize.x, ovSize.y);
context.frameRoundRect(lastRectangle, ovSize.x, ovSize.y);
break;
case PICT.OP_PAINT_R_RECT:
case PICT.OP_PAINT_SAME_R_RECT:
mContext.paintRoundRect(mLastRectangle, ovSize.x, ovSize.y);
context.paintRoundRect(lastRectangle, ovSize.x, ovSize.y);
break;
case PICT.OP_ERASE_R_RECT:
case PICT.OP_ERASE_SAME_R_RECT:
mContext.eraseRoundRect(mLastRectangle, ovSize.x, ovSize.y);
context.eraseRoundRect(lastRectangle, ovSize.x, ovSize.y);
break;
case PICT.OP_INVERT_R_RECT:
case PICT.OP_INVERT_SAME_R_RECT:
mContext.invertRoundRect(mLastRectangle, ovSize.x, ovSize.y);
context.invertRoundRect(lastRectangle, ovSize.x, ovSize.y);
break;
case PICT.OP_FILL_R_RECT:
case PICT.OP_FILL_SAME_R_RECT:
mContext.fillRoundRect(mLastRectangle, ovSize.x, ovSize.y, fill);
context.fillRoundRect(lastRectangle, ovSize.x, ovSize.y, fill);
break;
}
@@ -1004,34 +1007,34 @@ public class PICTImageReader extends ImageReaderBase {
if (DEBUG) {
switch (opCode) {
case PICT.OP_FRAME_R_RECT:
System.out.println("frameRRect: " + mLastRectangle);
System.out.println("frameRRect: " + lastRectangle);
break;
case PICT.OP_PAINT_R_RECT:
System.out.println("paintRRect: " + mLastRectangle);
System.out.println("paintRRect: " + lastRectangle);
break;
case PICT.OP_ERASE_R_RECT:
System.out.println("eraseRRect: " + mLastRectangle);
System.out.println("eraseRRect: " + lastRectangle);
break;
case PICT.OP_INVERT_R_RECT:
System.out.println("invertRRect: " + mLastRectangle);
System.out.println("invertRRect: " + lastRectangle);
break;
case PICT.OP_FILL_R_RECT:
System.out.println("fillRRect: " + mLastRectangle);
System.out.println("fillRRect: " + lastRectangle);
break;
case PICT.OP_FRAME_SAME_R_RECT:
System.out.println("frameSameRRect: " + mLastRectangle);
System.out.println("frameSameRRect: " + lastRectangle);
break;
case PICT.OP_PAINT_SAME_R_RECT:
System.out.println("paintSameRRect: " + mLastRectangle);
System.out.println("paintSameRRect: " + lastRectangle);
break;
case PICT.OP_ERASE_SAME_R_RECT:
System.out.println("eraseSameRRect: " + mLastRectangle);
System.out.println("eraseSameRRect: " + lastRectangle);
break;
case PICT.OP_INVERT_SAME_R_RECT:
System.out.println("invertSameRRect: " + mLastRectangle);
System.out.println("invertSameRRect: " + lastRectangle);
break;
case PICT.OP_FILL_SAME_R_RECT:
System.out.println("fillSameRRect: " + mLastRectangle);
System.out.println("fillSameRRect: " + lastRectangle);
break;
}
}
@@ -1048,7 +1051,7 @@ public class PICTImageReader extends ImageReaderBase {
case PICT.OP_INVERT_OVAL:// OK, not tested
case PICT.OP_FILL_OVAL:// OK, not tested
// Get the frame rectangle
readRectangle(pStream, mLastRectangle);
readRectangle(pStream, lastRectangle);
case PICT.OP_FRAME_SAME_OVAL:// OK, not tested
case PICT.OP_PAINT_SAME_OVAL:// OK, not tested
case PICT.OP_ERASE_SAME_OVAL:// OK, not tested
@@ -1058,23 +1061,23 @@ public class PICTImageReader extends ImageReaderBase {
switch (opCode) {
case PICT.OP_FRAME_OVAL:
case PICT.OP_FRAME_SAME_OVAL:
mContext.frameOval(mLastRectangle);
context.frameOval(lastRectangle);
break;
case PICT.OP_PAINT_OVAL:
case PICT.OP_PAINT_SAME_OVAL:
mContext.paintOval(mLastRectangle);
context.paintOval(lastRectangle);
break;
case PICT.OP_ERASE_OVAL:
case PICT.OP_ERASE_SAME_OVAL:
mContext.eraseOval(mLastRectangle);
context.eraseOval(lastRectangle);
break;
case PICT.OP_INVERT_OVAL:
case PICT.OP_INVERT_SAME_OVAL:
mContext.invertOval(mLastRectangle);
context.invertOval(lastRectangle);
break;
case PICT.OP_FILL_OVAL:
case PICT.OP_FILL_SAME_OVAL:
mContext.fillOval(mLastRectangle, fill);
context.fillOval(lastRectangle, fill);
break;
}
@@ -1082,34 +1085,34 @@ public class PICTImageReader extends ImageReaderBase {
if (DEBUG) {
switch (opCode) {
case PICT.OP_FRAME_OVAL:
System.out.println("frameOval: " + mLastRectangle);
System.out.println("frameOval: " + lastRectangle);
break;
case PICT.OP_PAINT_OVAL:
System.out.println("paintOval: " + mLastRectangle);
System.out.println("paintOval: " + lastRectangle);
break;
case PICT.OP_ERASE_OVAL:
System.out.println("eraseOval: " + mLastRectangle);
System.out.println("eraseOval: " + lastRectangle);
break;
case PICT.OP_INVERT_OVAL:
System.out.println("invertOval: " + mLastRectangle);
System.out.println("invertOval: " + lastRectangle);
break;
case PICT.OP_FILL_OVAL:
System.out.println("fillOval: " + mLastRectangle);
System.out.println("fillOval: " + lastRectangle);
break;
case PICT.OP_FRAME_SAME_OVAL:
System.out.println("frameSameOval: " + mLastRectangle);
System.out.println("frameSameOval: " + lastRectangle);
break;
case PICT.OP_PAINT_SAME_OVAL:
System.out.println("paintSameOval: " + mLastRectangle);
System.out.println("paintSameOval: " + lastRectangle);
break;
case PICT.OP_ERASE_SAME_OVAL:
System.out.println("eraseSameOval: " + mLastRectangle);
System.out.println("eraseSameOval: " + lastRectangle);
break;
case PICT.OP_INVERT_SAME_OVAL:
System.out.println("invertSameOval: " + mLastRectangle);
System.out.println("invertSameOval: " + lastRectangle);
break;
case PICT.OP_FILL_SAME_OVAL:
System.out.println("fillSameOval: " + mLastRectangle);
System.out.println("fillSameOval: " + lastRectangle);
break;
}
}
@@ -1141,7 +1144,7 @@ public class PICTImageReader extends ImageReaderBase {
case PICT.OP_INVERT_ARC:// OK, not tested
case PICT.OP_FILL_ARC:// OK, not tested
// Get the frame rectangle
readRectangle(pStream, mLastRectangle);
readRectangle(pStream, lastRectangle);
case PICT.OP_FRAME_SAME_ARC:// OK, not tested
case PICT.OP_PAINT_SAME_ARC:// OK, not tested
case PICT.OP_ERASE_SAME_ARC:// OK, not tested
@@ -1159,23 +1162,23 @@ public class PICTImageReader extends ImageReaderBase {
switch (opCode) {
case PICT.OP_FRAME_ARC:
case PICT.OP_FRAME_SAME_ARC:
mContext.frameArc(mLastRectangle, arcAngles.x, arcAngles.y);
context.frameArc(lastRectangle, arcAngles.x, arcAngles.y);
break;
case PICT.OP_PAINT_ARC:
case PICT.OP_PAINT_SAME_ARC:
mContext.paintArc(mLastRectangle, arcAngles.x, arcAngles.y);
context.paintArc(lastRectangle, arcAngles.x, arcAngles.y);
break;
case PICT.OP_ERASE_ARC:
case PICT.OP_ERASE_SAME_ARC:
mContext.eraseArc(mLastRectangle, arcAngles.x, arcAngles.y);
context.eraseArc(lastRectangle, arcAngles.x, arcAngles.y);
break;
case PICT.OP_INVERT_ARC:
case PICT.OP_INVERT_SAME_ARC:
mContext.invertArc(mLastRectangle, arcAngles.x, arcAngles.y);
context.invertArc(lastRectangle, arcAngles.x, arcAngles.y);
break;
case PICT.OP_FILL_ARC:
case PICT.OP_FILL_SAME_ARC:
mContext.fillArc(mLastRectangle, arcAngles.x, arcAngles.y, fill);
context.fillArc(lastRectangle, arcAngles.x, arcAngles.y, fill);
break;
}
@@ -1183,34 +1186,34 @@ public class PICTImageReader extends ImageReaderBase {
if (DEBUG) {
switch (opCode) {
case PICT.OP_FRAME_ARC:
System.out.println("frameArc: " + mLastRectangle + ", angles:" + arcAngles);
System.out.println("frameArc: " + lastRectangle + ", angles:" + arcAngles);
break;
case PICT.OP_PAINT_ARC:
System.out.println("paintArc: " + mLastRectangle + ", angles:" + arcAngles);
System.out.println("paintArc: " + lastRectangle + ", angles:" + arcAngles);
break;
case PICT.OP_ERASE_ARC:
System.out.println("eraseArc: " + mLastRectangle + ", angles:" + arcAngles);
System.out.println("eraseArc: " + lastRectangle + ", angles:" + arcAngles);
break;
case PICT.OP_INVERT_ARC:
System.out.println("invertArc: " + mLastRectangle + ", angles:" + arcAngles);
System.out.println("invertArc: " + lastRectangle + ", angles:" + arcAngles);
break;
case PICT.OP_FILL_ARC:
System.out.println("fillArc: " + mLastRectangle + ", angles:" + arcAngles);
System.out.println("fillArc: " + lastRectangle + ", angles:" + arcAngles);
break;
case PICT.OP_FRAME_SAME_ARC:
System.out.println("frameSameArc: " + mLastRectangle + ", angles:" + arcAngles);
System.out.println("frameSameArc: " + lastRectangle + ", angles:" + arcAngles);
break;
case PICT.OP_PAINT_SAME_ARC:
System.out.println("paintSameArc: " + mLastRectangle + ", angles:" + arcAngles);
System.out.println("paintSameArc: " + lastRectangle + ", angles:" + arcAngles);
break;
case PICT.OP_ERASE_SAME_ARC:
System.out.println("eraseSameArc: " + mLastRectangle + ", angles:" + arcAngles);
System.out.println("eraseSameArc: " + lastRectangle + ", angles:" + arcAngles);
break;
case PICT.OP_INVERT_SAME_ARC:
System.out.println("invertSameArc: " + mLastRectangle + ", angles:" + arcAngles);
System.out.println("invertSameArc: " + lastRectangle + ", angles:" + arcAngles);
break;
case PICT.OP_FILL_SAME_ARC:
System.out.println("fillSameArc: " + mLastRectangle + ", angles:" + arcAngles);
System.out.println("fillSameArc: " + lastRectangle + ", angles:" + arcAngles);
break;
}
}
@@ -1256,23 +1259,23 @@ public class PICTImageReader extends ImageReaderBase {
switch (opCode) {
case PICT.OP_FRAME_POLY:
case PICT.OP_FRAME_SAME_POLY:
mContext.framePoly(polygon);
context.framePoly(polygon);
break;
case PICT.OP_PAINT_POLY:
case PICT.OP_PAINT_SAME_POLY:
mContext.paintPoly(polygon);
context.paintPoly(polygon);
break;
case PICT.OP_ERASE_POLY:
case PICT.OP_ERASE_SAME_POLY:
mContext.erasePoly(polygon);
context.erasePoly(polygon);
break;
case PICT.OP_INVERT_POLY:
case PICT.OP_INVERT_SAME_POLY:
mContext.invertPoly(polygon);
context.invertPoly(polygon);
break;
case PICT.OP_FILL_POLY:
case PICT.OP_FILL_SAME_POLY:
mContext.fillPoly(polygon, fill);
context.fillPoly(polygon, fill);
break;
}
@@ -1346,23 +1349,23 @@ public class PICTImageReader extends ImageReaderBase {
switch (opCode) {
case PICT.OP_FRAME_RGN:
case PICT.OP_FRAME_SAME_RGN:
mContext.frameRegion(new Area(region));
context.frameRegion(new Area(region));
break;
case PICT.OP_PAINT_RGN:
case PICT.OP_PAINT_SAME_RGN:
mContext.paintRegion(new Area(region));
context.paintRegion(new Area(region));
break;
case PICT.OP_ERASE_RGN:
case PICT.OP_ERASE_SAME_RGN:
mContext.eraseRegion(new Area(region));
context.eraseRegion(new Area(region));
break;
case PICT.OP_INVERT_RGN:
case PICT.OP_INVERT_SAME_RGN:
mContext.invertRegion(new Area(region));
context.invertRegion(new Area(region));
break;
case PICT.OP_FILL_RGN:
case PICT.OP_FILL_SAME_RGN:
mContext.fillRegion(new Area(region), fill);
context.fillRegion(new Area(region), fill);
break;
}
}
@@ -1461,7 +1464,7 @@ public class PICTImageReader extends ImageReaderBase {
readRectangle(pStream, dstRect);
mode = pStream.readUnsignedShort();
mContext.setPenMode(mode); // TODO: Or parameter?
context.setPenMode(mode); // TODO: Or parameter?
if (DEBUG) {
System.out.print("bitsRect, rowBytes: " + rowBytes);
@@ -1491,7 +1494,7 @@ public class PICTImageReader extends ImageReaderBase {
// Draw pixel data
Rectangle rect = new Rectangle(srcRect);
rect.translate(-bounds.x, -bounds.y);
mContext.copyBits(image, rect, dstRect, mode, null);
context.copyBits(image, rect, dstRect, mode, null);
//mGraphics.drawImage(image,
// dstRect.x, dstRect.y,
// dstRect.x + dstRect.width, dstRect.y + dstRect.height,
@@ -1729,7 +1732,7 @@ public class PICTImageReader extends ImageReaderBase {
BufferedImage image = QuickTime.decompress(pStream);
if (image != null) {
mContext.copyBits(image, new Rectangle(image.getWidth(), image.getHeight()), destination, QuickDraw.SRC_COPY, null);
context.copyBits(image, new Rectangle(image.getWidth(), image.getHeight()), destination, QuickDraw.SRC_COPY, null);
pStream.seek(pos + dataLength); // Might be word-align mismatch here
@@ -2068,7 +2071,7 @@ public class PICTImageReader extends ImageReaderBase {
// We add all new images to it. If we are just replaying, then
// "pPixmapCount" will never be greater than the size of the vector
if (mImages.size() <= pPixmapCount) {
if (images.size() <= pPixmapCount) {
// Create BufferedImage and add buffer it for multiple reads
// DirectColorModel cm = (DirectColorModel) ColorModel.getRGBdefault();
// DataBuffer db = new DataBufferInt(pixArray, pixArray.length);
@@ -2077,15 +2080,15 @@ public class PICTImageReader extends ImageReaderBase {
WritableRaster raster = Raster.createPackedRaster(db, pBounds.width, pBounds.height, cmpSize, null); // TODO: last param should ideally be srcRect.getLocation()
BufferedImage img = new BufferedImage(colorModel, raster, colorModel.isAlphaPremultiplied(), null);
mImages.add(img);
images.add(img);
}
// Draw the image
BufferedImage img = mImages.get(pPixmapCount);
BufferedImage img = images.get(pPixmapCount);
if (img != null) {
// TODO: FixMe.. Seems impossible to create a bufferedImage with a raster not starting at 0,0
srcRect.setLocation(0, 0); // should not require this line..
mContext.copyBits(img, srcRect, dstRect, transferMode, null);
context.copyBits(img, srcRect, dstRect, transferMode, null);
}
// Line break at the end
@@ -2378,7 +2381,7 @@ public class PICTImageReader extends ImageReaderBase {
// We add all new images to it. If we are just replaying, then
// "pPixmapCount" will never be greater than the size of the vector
if (mImages.size() <= pPixmapCount) {
if (images.size() <= pPixmapCount) {
// Create BufferedImage and add buffer it for multiple reads
DirectColorModel cm;
WritableRaster raster;
@@ -2396,15 +2399,15 @@ public class PICTImageReader extends ImageReaderBase {
BufferedImage img = new BufferedImage(cm, raster, cm.isAlphaPremultiplied(), null);
mImages.add(img);
images.add(img);
}
// Draw the image
BufferedImage img = mImages.get(pPixmapCount);
BufferedImage img = images.get(pPixmapCount);
if (img != null) {
// TODO: FixMe.. Something wrong here, might be the copyBits methods.
srcRect.setLocation(0, 0); // should not require this line..
mContext.copyBits(img, srcRect, dstRect, transferMode, null);
context.copyBits(img, srcRect, dstRect, transferMode, null);
}
// Line break at the end
@@ -2551,7 +2554,7 @@ public class PICTImageReader extends ImageReaderBase {
* image resolution ratio.
*/
private int getXPtCoord(int pPoint) {
return (int) (pPoint / mScreenImageXRatio);
return (int) (pPoint / screenImageXRatio);
}
/*
@@ -2560,7 +2563,7 @@ public class PICTImageReader extends ImageReaderBase {
* image resolution ratio.
*/
private int getYPtCoord(int pPoint) {
return (int) (pPoint / mScreenImageYRatio);
return (int) (pPoint / screenImageYRatio);
}
/*
@@ -2621,7 +2624,7 @@ public class PICTImageReader extends ImageReaderBase {
try {
// TODO: Might need to clear background
g.setTransform(AffineTransform.getScaleInstance(mScreenImageXRatio / subX, mScreenImageYRatio / subY));
g.setTransform(AffineTransform.getScaleInstance(screenImageXRatio / subX, screenImageYRatio / subY));
// try {
drawOnto(g);
// }

View File

@@ -75,8 +75,8 @@ public class PICTImageReaderSpi extends ImageReaderSpi {
}
ImageInputStream stream = (ImageInputStream) pSource;
stream.mark();
try {
if (isPICT(stream)) {
// If PICT Clipping format, return true immediately
@@ -87,6 +87,7 @@ public class PICTImageReaderSpi extends ImageReaderSpi {
stream.reset();
PICTImageReader.skipNullHeader(stream);
}
return isPICT(stream);
}
catch (EOFException ignore) {

View File

@@ -86,9 +86,9 @@ import java.io.*;
public class PICTImageWriter extends ImageWriterBase {
// TODO: Inline these?
private int mRowBytes;
private byte[] mScanlineBytes;
private int mScanWidthLeft;
private int rowBytes;
private byte[] scanlineBytes;
private int scanWidthLeft;
public PICTImageWriter() {
this(null);
@@ -171,8 +171,8 @@ public class PICTImageWriter extends ImageWriterBase {
// Write rowBytes, this is 4 times the width.
// Set the high bit, to indicate a PixMap.
mRowBytes = 4 * pImage.getWidth();
imageOutput.writeShort(0x8000 | mRowBytes);
rowBytes = 4 * pImage.getWidth();
imageOutput.writeShort(0x8000 | rowBytes);
// Write bounds rectangle (same as image bounds)
imageOutput.writeShort(0);
@@ -235,14 +235,14 @@ public class PICTImageWriter extends ImageWriterBase {
// TODO: Move to writePICTData?
// TODO: Alpha support
// Set up the buffers for storing scanline bytes
mScanlineBytes = new byte[3 * pImage.getWidth()];
mScanWidthLeft = pImage.getWidth();
scanlineBytes = new byte[3 * pImage.getWidth()];
scanWidthLeft = pImage.getWidth();
}
private void writePICTData(int x, int y, int w, int h, ColorModel model,
byte[] pixels, int off, int scansize) throws IOException {
ByteArrayOutputStream bytes = new FastByteArrayOutputStream(mScanlineBytes.length / 2);
ByteArrayOutputStream bytes = new FastByteArrayOutputStream(scanlineBytes.length / 2);
int components = model.getNumComponents();
@@ -252,36 +252,36 @@ public class PICTImageWriter extends ImageWriterBase {
// lines (h > 1) and (w < width). This should never be the case.
for (int i = 0; i < h; i++) {
// Reduce the counter of bytes left on the scanline.
mScanWidthLeft -= w;
scanWidthLeft -= w;
// Treat the scanline.
for (int j = 0; j < w; j++) {
if (model instanceof ComponentColorModel && model.getColorSpace().getType() == ColorSpace.TYPE_RGB) {
// TODO: Component order?
// TODO: Alpha support
mScanlineBytes[x + j] = pixels[off + i * scansize * components + components * j + 2];
mScanlineBytes[x + w + j] = pixels[off + i * scansize * components + components * j + 1];
mScanlineBytes[x + 2 * w + j] = pixels[off + i * scansize * components + components * j];
scanlineBytes[x + j] = pixels[off + i * scansize * components + components * j + 2];
scanlineBytes[x + w + j] = pixels[off + i * scansize * components + components * j + 1];
scanlineBytes[x + 2 * w + j] = pixels[off + i * scansize * components + components * j];
}
else {
int rgb = model.getRGB(pixels[off + i * scansize + j] & 0xFF);
// Set red, green and blue components.
mScanlineBytes[x + j] = (byte) ((rgb >> 16) & 0xFF);
mScanlineBytes[x + w + j] = (byte) ((rgb >> 8) & 0xFF);
mScanlineBytes[x + 2 * w + j] = (byte) (rgb & 0xFF);
scanlineBytes[x + j] = (byte) ((rgb >> 16) & 0xFF);
scanlineBytes[x + w + j] = (byte) ((rgb >> 8) & 0xFF);
scanlineBytes[x + 2 * w + j] = (byte) (rgb & 0xFF);
}
}
// If we have a complete scanline, then pack it and write it out.
if (mScanWidthLeft == 0) {
if (scanWidthLeft == 0) {
// Pack using PackBitsEncoder/EncoderStream
bytes.reset();
DataOutput packBits = new DataOutputStream(new EncoderStream(bytes, new PackBitsEncoder(), true));
packBits.write(mScanlineBytes);
packBits.write(scanlineBytes);
if (mRowBytes > 250) {
if (rowBytes > 250) {
imageOutput.writeShort(bytes.size());
}
else {
@@ -290,7 +290,7 @@ public class PICTImageWriter extends ImageWriterBase {
bytes.writeTo(IIOUtil.createStreamAdapter(imageOutput));
mScanWidthLeft = w;
scanWidthLeft = w;
}
}
}
@@ -298,7 +298,7 @@ public class PICTImageWriter extends ImageWriterBase {
private void writePICTData(int x, int y, int w, int h, ColorModel model,
int[] pixels, int off, int scansize) throws IOException {
ByteArrayOutputStream bytes = new FastByteArrayOutputStream(mScanlineBytes.length / 2);
ByteArrayOutputStream bytes = new FastByteArrayOutputStream(scanlineBytes.length / 2);
// TODO: Clean up, as we only have complete scanlines
@@ -306,27 +306,27 @@ public class PICTImageWriter extends ImageWriterBase {
// lines (h > 1) and (w < width). This should never be the case.
for (int i = 0; i < h; i++) {
// Reduce the counter of bytes left on the scanline.
mScanWidthLeft -= w;
scanWidthLeft -= w;
// Treat the scanline.
for (int j = 0; j < w; j++) {
int rgb = model.getRGB(pixels[off + i * scansize + j]);
// Set red, green and blue components.
mScanlineBytes[x + j] = (byte) ((rgb >> 16) & 0xFF);
mScanlineBytes[x + w + j] = (byte) ((rgb >> 8) & 0xFF);
mScanlineBytes[x + 2 * w + j] = (byte) (rgb & 0xFF);
scanlineBytes[x + j] = (byte) ((rgb >> 16) & 0xFF);
scanlineBytes[x + w + j] = (byte) ((rgb >> 8) & 0xFF);
scanlineBytes[x + 2 * w + j] = (byte) (rgb & 0xFF);
}
// If we have a complete scanline, then pack it and write it out.
if (mScanWidthLeft == 0) {
if (scanWidthLeft == 0) {
// Pack using PackBitsEncoder/EncoderStream
bytes.reset();
DataOutput packBits = new DataOutputStream(new EncoderStream(bytes, new PackBitsEncoder(), true));
packBits.write(mScanlineBytes);
packBits.write(scanlineBytes);
if (mRowBytes > 250) {
if (rowBytes > 250) {
imageOutput.writeShort(bytes.size());
}
else {
@@ -335,7 +335,7 @@ public class PICTImageWriter extends ImageWriterBase {
bytes.writeTo(IIOUtil.createStreamAdapter(imageOutput));
mScanWidthLeft = w;
scanWidthLeft = w;
}
}
}

View File

@@ -42,16 +42,16 @@ import java.util.Collections;
* @version $Id: Pattern.java,v 1.0 Oct 9, 2007 1:21:38 AM haraldk Exp$
*/
abstract class Pattern implements Paint {
private final Paint mPaint;
private final Paint paint;
Pattern(final Paint pPaint) {
mPaint = pPaint;
paint = pPaint;
}
public PaintContext createContext(final ColorModel pModel, final Rectangle pDeviceBounds,
final Rectangle2D pUserBounds, final AffineTransform pTransform,
final RenderingHints pHints) {
return mPaint.createContext(
return paint.createContext(
pModel, pDeviceBounds,
pUserBounds, pTransform,
pHints != null ? pHints : new RenderingHints(Collections.<RenderingHints.Key, Object>emptyMap())
@@ -59,6 +59,6 @@ abstract class Pattern implements Paint {
}
public int getTransparency() {
return mPaint.getTransparency();
return paint.getTransparency();
}
}

View File

@@ -38,15 +38,15 @@ import java.awt.*;
* @version $Id: PenState.java,v 1.0 Oct 9, 2007 1:56:33 AM haraldk Exp$
*/
class PenState {
public final Point mPenLocation; /* pen location */
public final Dimension mPenSize; /* pen size */
public final int mPenMode; /* pen's pattern mode */
public final Pattern mPenPattern; /* pen pattern */
public final Point penLocation; /* pen location */
public final Dimension penSize; /* pen size */
public final int penMode; /* pen's pattern mode */
public final Pattern penPattern; /* pen pattern */
public PenState(final Point pPenLocation, final int pPenMode, final Pattern pPenPattern, final Dimension pPenSize) {
mPenLocation = pPenLocation;
mPenMode = pPenMode;
mPenPattern = pPenPattern;
mPenSize = pPenSize;
penLocation = pPenLocation;
penMode = pPenMode;
penPattern = pPenPattern;
penSize = pPenSize;
}
}

View File

@@ -38,17 +38,17 @@ import java.awt.*;
* @version $Id: PixMapPattern.java,v 1.0 Mar 1, 2009 11:36:10 PM haraldk Exp$
*/
final class PixMapPattern extends Pattern {
private final Pattern mFallback;
private final Pattern fallback;
PixMapPattern(final Paint pPaint, final Pattern pBitMapFallback) {
super(pPaint);
mFallback = pBitMapFallback;
fallback = pBitMapFallback;
}
/**
* @return the fallback B/W pattern
*/
public Pattern getPattern() {
return mFallback;
return fallback;
}
}

View File

@@ -28,6 +28,8 @@
package com.twelvemonkeys.imageio.plugins.pict;
import com.twelvemonkeys.lang.Validate;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.geom.*;
@@ -101,9 +103,9 @@ class QuickDrawContext {
rgnSave: Handle; {region being saved, used internally}
polySave: Handle; {polygon being saved, used internally}
*/
private final Graphics2D mGraphics;
private final Graphics2D graphics;
private Pattern mBackground;
private Pattern background;
// http://developer.apple.com/documentation/mac/quickdraw/QuickDraw-68.html#HEADING68-0
// Upon the creation of a graphics port, QuickDraw assigns these initial
@@ -113,23 +115,20 @@ class QuickDrawContext {
// graphics pen.
// TODO: Consider creating a Pen/PenState class?
private int mPenVisibility = 0;
private Point2D mPenPosition = new Point();
private Pattern mPenPattern;
private Dimension2D mPenSize = new Dimension();
private int mPenMode;
private int penVisibility = 0;
private Point2D penPosition = new Point();
private Pattern penPattern;
private Dimension2D penSize = new Dimension();
private int penMode;
QuickDrawContext(Graphics2D pGraphics) {
if (pGraphics == null) {
throw new IllegalArgumentException("graphics == null");
}
mGraphics = pGraphics;
graphics = Validate.notNull(pGraphics, "graphics");
setPenNormal();
}
protected void dispose() {
mGraphics.dispose();
graphics.dispose();
}
// ClosePicture
@@ -139,7 +138,7 @@ class QuickDrawContext {
// ClipRgn
public void setClipRegion(Shape pClip) {
mGraphics.setClip(pClip);
graphics.setClip(pClip);
}
// Font number (sic), integer
@@ -160,7 +159,7 @@ class QuickDrawContext {
}
public void setTextSize(int pSize) {
mGraphics.setFont(mGraphics.getFont().deriveFont((float) pSize));
graphics.setFont(graphics.getFont().deriveFont((float) pSize));
}
// Numerator (Point), denominator (Point)
@@ -173,16 +172,16 @@ class QuickDrawContext {
// TODO: chExtra added width for nonspace characters
public void setOrigin(Point2D pOrigin) {
mGraphics.translate(pOrigin.getX(), pOrigin.getY());
graphics.translate(pOrigin.getX(), pOrigin.getY());
}
public void setForeground(Color pColor) {
// TODO: Is this really correct? Or does it depend on pattern mode?
mPenPattern = new BitMapPattern(pColor);
penPattern = new BitMapPattern(pColor);
}
public void setBackground(Color pColor) {
mBackground = new BitMapPattern(pColor);
background = new BitMapPattern(pColor);
}
/*
@@ -197,14 +196,14 @@ class QuickDrawContext {
* HidePen Visibility (decrements visibility by one!)
*/
public void hidePen() {
mPenVisibility--;
penVisibility--;
}
/**
* ShowPen Visibility (increments visibility by one!)
*/
public void showPen() {
mPenVisibility++;
penVisibility++;
}
/**
@@ -213,7 +212,7 @@ class QuickDrawContext {
* @return {@code true} if pen is visible
*/
private boolean isPenVisible() {
return mPenVisibility >= 0;
return penVisibility >= 0;
}
/**
@@ -223,7 +222,7 @@ class QuickDrawContext {
* @return the current pen position
*/
public Point2D getPenPosition() {
return (Point2D) mPenPosition.clone();
return (Point2D) penPosition.clone();
}
/**
@@ -233,8 +232,8 @@ class QuickDrawContext {
* @param pSize the new size
*/
public void setPenSize(Dimension2D pSize) {
mPenSize.setSize(pSize);
mGraphics.setStroke(getStroke(mPenSize));
penSize.setSize(pSize);
graphics.setStroke(getStroke(penSize));
}
/**
@@ -274,7 +273,7 @@ class QuickDrawContext {
case QuickDraw.SUB_OVER:
case QuickDraw.AD_MIN:
case QuickDraw.GRAYISH_TEXT_OR:
mPenMode = pPenMode;
penMode = pPenMode;
break;
default:
@@ -288,7 +287,7 @@ class QuickDrawContext {
* @param pPattern the new pattern
*/
public void setPenPattern(final Pattern pPattern) {
mPenPattern = pPattern;
penPattern = pPattern;
}
/**
@@ -299,7 +298,7 @@ class QuickDrawContext {
// TODO: What about visibility? Probably not touch
setPenPattern(QuickDraw.BLACK);
setPenSize(new Dimension(1, 1));
mPenMode = QuickDraw.SRC_COPY;
penMode = QuickDraw.SRC_COPY;
}
/*
@@ -308,7 +307,7 @@ class QuickDrawContext {
*BackPixPat
*/
public void setBackgroundPattern(Pattern pPaint) {
mBackground = pPaint;
background = pPaint;
}
private Composite getCompositeFor(final int pMode) {
@@ -354,9 +353,9 @@ class QuickDrawContext {
* Sets up context for line drawing/painting.
*/
protected void setupForPaint() {
mGraphics.setPaint(mPenPattern);
mGraphics.setComposite(getCompositeFor(mPenMode));
//mGraphics.setStroke(getStroke(mPenSize));
graphics.setPaint(penPattern);
graphics.setComposite(getCompositeFor(penMode));
//graphics.setStroke(getStroke(penSize));
}
private Stroke getStroke(final Dimension2D pPenSize) {
@@ -373,19 +372,19 @@ class QuickDrawContext {
* @param pPattern the pattern to use for filling.
*/
protected void setupForFill(final Pattern pPattern) {
mGraphics.setPaint(pPattern);
mGraphics.setComposite(getCompositeFor(QuickDraw.PAT_COPY));
graphics.setPaint(pPattern);
graphics.setComposite(getCompositeFor(QuickDraw.PAT_COPY));
}
protected void setupForErase() {
mGraphics.setPaint(mBackground);
mGraphics.setComposite(getCompositeFor(QuickDraw.PAT_COPY)); // TODO: Check spec
graphics.setPaint(background);
graphics.setComposite(getCompositeFor(QuickDraw.PAT_COPY)); // TODO: Check spec
}
protected void setupForInvert() {
// TODO: Setup for invert
mGraphics.setColor(Color.BLACK);
mGraphics.setXORMode(Color.WHITE);
graphics.setColor(Color.BLACK);
graphics.setXORMode(Color.WHITE);
}
/*
@@ -398,7 +397,7 @@ class QuickDrawContext {
*/
public void moveTo(final double pX, final double pY) {
mPenPosition.setLocation(pX, pY);
penPosition.setLocation(pX, pY);
}
public final void moveTo(final Point2D pPosition) {
@@ -406,18 +405,18 @@ class QuickDrawContext {
}
public final void move(final double pDeltaX, final double pDeltaY) {
moveTo(mPenPosition.getX() + pDeltaX, mPenPosition.getY() + pDeltaY);
moveTo(penPosition.getX() + pDeltaX, penPosition.getY() + pDeltaY);
}
public void lineTo(final double pX, final double pY) {
Shape line = new Line2D.Double(mPenPosition.getX(), mPenPosition.getY(), pX, pY);
Shape line = new Line2D.Double(penPosition.getX(), penPosition.getY(), pX, pY);
// TODO: Add line to current shape if recording...
if (isPenVisible()) {
// NOTE: Workaround for known Mac JDK bug: Paint, not frame
//mGraphics.setStroke(getStroke(mPenSize)); // Make sure we have correct stroke
paintShape(mGraphics.getStroke().createStrokedShape(line));
//graphics.setStroke(getStroke(penSize)); // Make sure we have correct stroke
paintShape(graphics.getStroke().createStrokedShape(line));
}
@@ -429,7 +428,7 @@ class QuickDrawContext {
}
public final void line(final double pDeltaX, final double pDeltaY) {
lineTo(mPenPosition.getX() + pDeltaX, mPenPosition.getY() + pDeltaY);
lineTo(penPosition.getX() + pDeltaX, penPosition.getY() + pDeltaY);
}
/*
@@ -813,27 +812,27 @@ class QuickDrawContext {
// TODO: All other operations can delegate to these! :-)
private void frameShape(final Shape pShape) {
setupForPaint();
mGraphics.draw(pShape);
graphics.draw(pShape);
}
private void paintShape(final Shape pShape) {
setupForPaint();
mGraphics.fill(pShape);
graphics.fill(pShape);
}
private void fillShape(final Shape pShape, final Pattern pPattern) {
setupForFill(pPattern);
mGraphics.fill(pShape);
graphics.fill(pShape);
}
private void invertShape(final Shape pShape) {
setupForInvert();
mGraphics.fill(pShape);
graphics.fill(pShape);
}
private void eraseShape(final Shape pShape) {
setupForErase();
mGraphics.fill(pShape);
graphics.fill(pShape);
}
/*
@@ -862,12 +861,12 @@ class QuickDrawContext {
* @param pMaskRgn the mask region
*/
public void copyBits(BufferedImage pSrcBitmap, Rectangle pSrcRect, Rectangle pDstRect, int pMode, Shape pMaskRgn) {
mGraphics.setComposite(getCompositeFor(pMode));
graphics.setComposite(getCompositeFor(pMode));
if (pMaskRgn != null) {
setClipRegion(pMaskRgn);
}
mGraphics.drawImage(
graphics.drawImage(
pSrcBitmap,
pDstRect.x,
pDstRect.y,
@@ -927,7 +926,7 @@ class QuickDrawContext {
* @param pString a Pascal string (a string of length less than or equal to 255 chars).
*/
public void drawString(String pString) {
mGraphics.drawString(pString, (float) getPenPosition().getX(), (float) getPenPosition().getY());
graphics.drawString(pString, (float) getPenPosition().getX(), (float) getPenPosition().getY());
}
/*
@@ -953,14 +952,14 @@ class QuickDrawContext {
// Color Constants
<EFBFBD>whiteColor =<3D>30;
<EFBFBD>blackColor = 33
<EFBFBD>yellowColor = 69;
magentaColor =<3D>137;
<EFBFBD>redColor =<3D>205;
<EFBFBD>cyanColor =<3D>273;
<EFBFBD>greenColor =<3D>341;
<EFBFBD>blueColor =<3D>409;
<EFBFBD>whiteColor =<3D>30;
<EFBFBD>blackColor = 33
<EFBFBD>yellowColor = 69;
magentaColor =<3D>137;
<EFBFBD>redColor =<3D>205;
<EFBFBD>cyanColor =<3D>273;
<EFBFBD>greenColor =<3D>341;
<EFBFBD>blueColor =<3D>409;
*/
// TODO: Simplify! Extract to upper level class

View File

@@ -62,12 +62,12 @@ public class TestPICTClippingApp {
}
private static class ImageDropHandler extends TransferHandler {
private final JLabel mLabel;
private final ExecutorService mExecutor = Executors.newSingleThreadExecutor();
private final JLabel label;
private final ExecutorService executor = Executors.newSingleThreadExecutor();
public ImageDropHandler(JLabel pLabel) {
super(null);
mLabel = pLabel;
label = pLabel;
}
private DataFlavor getSupportedFlavor(final DataFlavor[] transferFlavors) {
@@ -126,7 +126,7 @@ public class TestPICTClippingApp {
if (readers.hasNext()) {
final ImageReader imageReader = readers.next();
mExecutor.execute(new Runnable() {
executor.execute(new Runnable() {
public void run() {
try {
readAndInstallImage(stream, imageReader);
@@ -186,7 +186,7 @@ public class TestPICTClippingApp {
System.out.print("Scaling image... ");
BufferedImage scaled = box(image, maxDimension);
System.out.printf("Done (%dx%d).%n", scaled.getWidth(), scaled.getHeight());
mLabel.setIcon(new BufferedImageIcon(scaled));
label.setIcon(new BufferedImageIcon(scaled));
}
});
}

View File

@@ -43,7 +43,7 @@ import java.io.InputStream;
* @version $Id: ICCProfile.java,v 1.0 May 20, 2008 6:24:10 PM haraldk Exp$
*/
class ICCProfile extends PSDImageResource {
private ICC_Profile mProfile;
private ICC_Profile profile;
ICCProfile(final short pId, final ImageInputStream pInput) throws IOException {
super(pId, pInput);
@@ -51,9 +51,9 @@ class ICCProfile extends PSDImageResource {
@Override
protected void readData(ImageInputStream pInput) throws IOException {
InputStream stream = IIOUtil.createStreamAdapter(pInput, mSize);
InputStream stream = IIOUtil.createStreamAdapter(pInput, size);
try {
mProfile = ICC_Profile.getInstance(stream);
profile = ICC_Profile.getInstance(stream);
}
finally {
// Make sure stream has correct position after read
@@ -62,14 +62,14 @@ class ICCProfile extends PSDImageResource {
}
public ICC_Profile getProfile() {
return mProfile;
return profile;
}
@Override
public String toString() {
StringBuilder builder = toStringBuilder();
builder.append(", profile: ").append(mProfile);
builder.append(", profile: ").append(profile);
builder.append("]");
return builder.toString();

View File

@@ -41,7 +41,7 @@ import java.util.List;
* @version $Id: PSDAlphaChannelInfo.java,v 1.0 May 2, 2008 5:33:40 PM haraldk Exp$
*/
class PSDAlphaChannelInfo extends PSDImageResource {
List<String> mNames;
List<String> names;
public PSDAlphaChannelInfo(short pId, final ImageInputStream pInput) throws IOException {
super(pId, pInput);
@@ -49,12 +49,12 @@ class PSDAlphaChannelInfo extends PSDImageResource {
@Override
protected void readData(final ImageInputStream pInput) throws IOException {
mNames = new ArrayList<String>();
names = new ArrayList<String>();
long left = mSize;
long left = size;
while (left > 0) {
String name = PSDUtil.readPascalString(pInput);
mNames.add(name);
names.add(name);
left -= name.length() + 1;
}
}
@@ -62,7 +62,7 @@ class PSDAlphaChannelInfo extends PSDImageResource {
@Override
public String toString() {
StringBuilder builder = toStringBuilder();
builder.append(", alpha channels: ").append(mNames).append("]");
builder.append(", alpha channels: ").append(names).append("]");
return builder.toString();
}
}

View File

@@ -36,8 +36,8 @@ package com.twelvemonkeys.imageio.plugins.psd;
* @version $Id: PSDChannelInfo.java,v 1.0 May 6, 2008 2:46:23 PM haraldk Exp$
*/
class PSDChannelInfo {
final short mChannelId;
final long mLength;
final short channelId;
final long length;
// typedef struct _CLI
// {
@@ -45,16 +45,16 @@ class PSDChannelInfo {
// LONG LengthOfChannelData; /* Channel Length Info field two */
// } CLI;
public PSDChannelInfo(short pChannelId, long pLength) {
mChannelId = pChannelId;
mLength = pLength;
channelId = pChannelId;
length = pLength;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder(getClass().getSimpleName());
builder.append("[");
builder.append("channelId: ").append(mChannelId);
builder.append(", length: ").append(mLength);
builder.append("channelId: ").append(channelId);
builder.append(", length: ").append(length);
builder.append("]");
return builder.toString();
}

View File

@@ -39,29 +39,29 @@ import java.io.IOException;
* @version $Id: PSDChannelSourceDestinationRange.java,v 1.0 May 6, 2008 5:14:13 PM haraldk Exp$
*/
class PSDChannelSourceDestinationRange {
private String mChannel;
private short mSourceBlack;
private short mSourceWhite;
private short mDestBlack;
private short mDestWhite;
private String channel;
private short sourceBlack;
private short sourceWhite;
private short destBlack;
private short destWhite;
public PSDChannelSourceDestinationRange(ImageInputStream pInput, String pChannel) throws IOException {
mChannel = pChannel;
mSourceBlack = pInput.readShort();
mSourceWhite = pInput.readShort();
mDestBlack = pInput.readShort();
mDestWhite = pInput.readShort();
channel = pChannel;
sourceBlack = pInput.readShort();
sourceWhite = pInput.readShort();
destBlack = pInput.readShort();
destWhite = pInput.readShort();
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder(getClass().getSimpleName());
builder.append("[(").append(mChannel);
builder.append("): sourceBlack: ").append(Integer.toHexString(mSourceBlack & 0xffff));
builder.append(", sourceWhite: ").append(Integer.toHexString(mSourceWhite & 0xffff));
builder.append(", destBlack: ").append(Integer.toHexString(mDestBlack & 0xffff));
builder.append(", destWhite: ").append(Integer.toHexString(mDestWhite & 0xffff));
builder.append("[(").append(channel);
builder.append("): sourceBlack: ").append(Integer.toHexString(sourceBlack & 0xffff));
builder.append(", sourceWhite: ").append(Integer.toHexString(sourceWhite & 0xffff));
builder.append(", destBlack: ").append(Integer.toHexString(destBlack & 0xffff));
builder.append(", destWhite: ").append(Integer.toHexString(destWhite & 0xffff));
builder.append("]");
return builder.toString();

View File

@@ -44,8 +44,8 @@ import java.io.IOException;
* @version $Id: PSDColorData.java,v 1.0 Apr 29, 2008 5:33:01 PM haraldk Exp$
*/
class PSDColorData {
final byte[] mColors;
private IndexColorModel mColorModel;
final byte[] colors;
private IndexColorModel colorModel;
PSDColorData(final ImageInputStream pInput) throws IOException {
int length = pInput.readInt();
@@ -57,19 +57,19 @@ class PSDColorData {
}
// NOTE: Spec says length may only be 768 bytes (256 RGB triplets)
mColors = new byte[length];
pInput.readFully(mColors);
colors = new byte[length];
pInput.readFully(colors);
// NOTE: Could be a padding byte here, if not even..
}
IndexColorModel getIndexColorModel() {
if (mColorModel == null) {
int[] rgb = toInterleavedRGB(mColors);
mColorModel = new InverseColorMapIndexColorModel(8, rgb.length, rgb, 0, false, -1, DataBuffer.TYPE_BYTE);
if (colorModel == null) {
int[] rgb = toInterleavedRGB(colors);
colorModel = new InverseColorMapIndexColorModel(8, rgb.length, rgb, 0, false, -1, DataBuffer.TYPE_BYTE);
}
return mColorModel;
return colorModel;
}
private static int[] toInterleavedRGB(final byte[] pColors) {

View File

@@ -65,10 +65,10 @@ class PSDDisplayInfo extends PSDImageResource {
// BYTE Padding; /* Always zero */
//} DISPLAYINFO;
int mColorSpace;
short[] mColors;
short mOpacity;
byte mKind;
int colorSpace;
short[] colors;
short opacity;
byte kind;
PSDDisplayInfo(final short pId, final ImageInputStream pInput) throws IOException {
super(pId, pInput);
@@ -76,46 +76,46 @@ class PSDDisplayInfo extends PSDImageResource {
@Override
protected void readData(ImageInputStream pInput) throws IOException {
if (mSize % 14 != 0) {
throw new IIOException("Display info length expected to be mod 14: " + mSize);
if (size % 14 != 0) {
throw new IIOException("Display info length expected to be mod 14: " + size);
}
// long left = mSize;
// long left = size;
// while (left > 0) {
mColorSpace = pInput.readShort();
colorSpace = pInput.readShort();
// Color[4]...?
mColors = new short[4];
mColors[0] = pInput.readShort();
mColors[1] = pInput.readShort();
mColors[2] = pInput.readShort();
mColors[3] = pInput.readShort();
colors = new short[4];
colors[0] = pInput.readShort();
colors[1] = pInput.readShort();
colors[2] = pInput.readShort();
colors[3] = pInput.readShort();
mOpacity = pInput.readShort();
opacity = pInput.readShort();
mKind = pInput.readByte();
kind = pInput.readByte();
pInput.readByte(); // Pad
// left -= 14;
// }
pInput.skipBytes(mSize - 14);
pInput.skipBytes(size - 14);
}
@Override
public String toString() {
StringBuilder builder = toStringBuilder();
builder.append(", ColorSpace: ").append(mColorSpace);
builder.append(", ColorSpace: ").append(colorSpace);
builder.append(", Colors: {");
builder.append(mColors[0]);
builder.append(colors[0]);
builder.append(", ");
builder.append(mColors[1]);
builder.append(colors[1]);
builder.append(", ");
builder.append(mColors[2]);
builder.append(colors[2]);
builder.append(", ");
builder.append(mColors[3]);
builder.append("}, Opacity: ").append(mOpacity);
builder.append(", Kind: ").append(kind(mKind));
builder.append(colors[3]);
builder.append("}, Opacity: ").append(opacity);
builder.append(", Kind: ").append(kind(kind));
builder.append("]");

View File

@@ -18,7 +18,7 @@ import java.io.IOException;
* @see <a href="http://partners.adobe.com/public/developer/tiff/index.html">Adobe TIFF developer resources</a>
*/
final class PSDEXIF1Data extends PSDImageResource {
protected Directory mDirectory;
protected Directory directory;
PSDEXIF1Data(final short pId, final ImageInputStream pInput) throws IOException {
super(pId, pInput);
@@ -28,13 +28,13 @@ final class PSDEXIF1Data extends PSDImageResource {
protected void readData(final ImageInputStream pInput) throws IOException {
// This is in essence an embedded TIFF file.
// TODO: Instead, read the byte data, store for later parsing (or better yet, store offset, and read on request)
mDirectory = new EXIFReader().read(pInput);
directory = new EXIFReader().read(pInput);
}
@Override
public String toString() {
StringBuilder builder = toStringBuilder();
builder.append(", ").append(mDirectory);
builder.append(", ").append(directory);
builder.append("]");
return builder.toString();

View File

@@ -39,25 +39,25 @@ import java.io.IOException;
* @version $Id: PSDGlobalLayerMask.java,v 1.0 May 8, 2008 5:33:48 PM haraldk Exp$
*/
class PSDGlobalLayerMask {
final int mColorSpace;
final int mColor1;
final int mColor2;
final int mColor3;
final int mColor4;
final int mOpacity;
final int mKind;
final int colorSpace;
final int color1;
final int color2;
final int color3;
final int color4;
final int opacity;
final int kind;
PSDGlobalLayerMask(final ImageInputStream pInput) throws IOException {
mColorSpace = pInput.readUnsignedShort(); // Undocumented
colorSpace = pInput.readUnsignedShort(); // Undocumented
mColor1 = pInput.readUnsignedShort();
mColor2 = pInput.readUnsignedShort();
mColor3 = pInput.readUnsignedShort();
mColor4 = pInput.readUnsignedShort();
color1 = pInput.readUnsignedShort();
color2 = pInput.readUnsignedShort();
color3 = pInput.readUnsignedShort();
color4 = pInput.readUnsignedShort();
mOpacity = pInput.readUnsignedShort(); // 0-100
opacity = pInput.readUnsignedShort(); // 0-100
mKind = pInput.readUnsignedByte(); // 0: Selected (ie inverted), 1: Color protected, 128: Use value stored per layer
kind = pInput.readUnsignedByte(); // 0: Selected (ie inverted), 1: Color protected, 128: Use value stored per layer
// TODO: Variable: Filler zeros
@@ -68,13 +68,13 @@ class PSDGlobalLayerMask {
public String toString() {
StringBuilder builder = new StringBuilder(getClass().getSimpleName());
builder.append("[");
builder.append("color space: 0x").append(Integer.toHexString(mColorSpace));
builder.append(", colors: [0x").append(Integer.toHexString(mColor1));
builder.append(", 0x").append(Integer.toHexString(mColor2));
builder.append(", 0x").append(Integer.toHexString(mColor3));
builder.append(", 0x").append(Integer.toHexString(mColor4));
builder.append("], opacity: ").append(mOpacity);
builder.append(", kind: ").append(mKind);
builder.append("color space: 0x").append(Integer.toHexString(colorSpace));
builder.append(", colors: [0x").append(Integer.toHexString(color1));
builder.append(", 0x").append(Integer.toHexString(color2));
builder.append(", 0x").append(Integer.toHexString(color3));
builder.append(", 0x").append(Integer.toHexString(color4));
builder.append("], opacity: ").append(opacity);
builder.append(", kind: ").append(kind);
builder.append("]");
return builder.toString();
}

View File

@@ -25,12 +25,12 @@ final class PSDGridAndGuideInfo extends PSDImageResource {
// gchar fDirection; /* Guide orientation */
//} GuideResource;
int mVersion;
int mGridCycleVertical;
int mGridCycleHorizontal;
int mGuideCount;
int version;
int gridCycleVertical;
int gridCycleHorizontal;
int guideCount;
GuideResource[] mGuides;
GuideResource[] guides;
PSDGridAndGuideInfo(final short pId, final ImageInputStream pInput) throws IOException {
super(pId, pInput);
@@ -38,21 +38,21 @@ final class PSDGridAndGuideInfo extends PSDImageResource {
@Override
protected void readData(final ImageInputStream pInput) throws IOException {
mVersion = pInput.readInt();
mGridCycleVertical = pInput.readInt();
mGridCycleHorizontal = pInput.readInt();
mGuideCount = pInput.readInt();
version = pInput.readInt();
gridCycleVertical = pInput.readInt();
gridCycleHorizontal = pInput.readInt();
guideCount = pInput.readInt();
mGuides = new GuideResource[mGuideCount];
guides = new GuideResource[guideCount];
for (GuideResource guide : mGuides) {
guide.mLocation = pInput.readInt();
guide.mDirection = pInput.readByte();
for (GuideResource guide : guides) {
guide.location = pInput.readInt();
guide.direction = pInput.readByte();
}
}
static class GuideResource {
int mLocation;
byte mDirection; // 0: vertical, 1: horizontal
int location;
byte direction; // 0: vertical, 1: horizontal
}
}

View File

@@ -28,9 +28,6 @@
package com.twelvemonkeys.imageio.plugins.psd;
import org.w3c.dom.Node;
import javax.imageio.metadata.IIOMetadataNode;
import javax.imageio.stream.ImageInputStream;
import javax.imageio.IIOException;
import java.io.IOException;
@@ -58,11 +55,11 @@ class PSDHeader {
// WORD Mode; /* Color mode */
// } PSD_HEADER;
final short mChannels;
final int mWidth;
final int mHeight;
final short mBits;
final short mMode;
final short channels;
final int width;
final int height;
final short bits;
final short mode;
PSDHeader(final ImageInputStream pInput) throws IOException {
int signature = pInput.readInt();
@@ -84,27 +81,27 @@ class PSDHeader {
byte[] reserved = new byte[6];
pInput.readFully(reserved);
mChannels = pInput.readShort();
mHeight = pInput.readInt(); // Rows
mWidth = pInput.readInt(); // Columns
mBits = pInput.readShort();
mMode = pInput.readShort();
channels = pInput.readShort();
height = pInput.readInt(); // Rows
width = pInput.readInt(); // Columns
bits = pInput.readShort();
mode = pInput.readShort();
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder(getClass().getSimpleName());
builder.append("[Channels: ");
builder.append(mChannels);
builder.append(channels);
builder.append(", width: ");
builder.append(mWidth);
builder.append(width);
builder.append(", height: ");
builder.append(mHeight);
builder.append(height);
builder.append(", depth: ");
builder.append(mBits);
builder.append(bits);
builder.append(", mode: ");
builder.append(mMode);
switch (mMode) {
builder.append(mode);
switch (mode) {
case PSD.COLOR_MODE_MONOCHROME:
builder.append(" (Monochrome)");
break;

View File

@@ -14,7 +14,7 @@ import java.io.IOException;
* @version $Id: PSDIPTCData.java,v 1.0 Nov 7, 2009 9:52:14 PM haraldk Exp$
*/
final class PSDIPTCData extends PSDImageResource {
Directory mDirectory;
Directory directory;
PSDIPTCData(final short pId, final ImageInputStream pInput) throws IOException {
super(pId, pInput);
@@ -23,13 +23,13 @@ final class PSDIPTCData extends PSDImageResource {
@Override
protected void readData(final ImageInputStream pInput) throws IOException {
// Read IPTC directory
mDirectory = new IPTCReader().read(pInput);
directory = new IPTCReader().read(pInput);
}
@Override
public String toString() {
StringBuilder builder = toStringBuilder();
builder.append(", ").append(mDirectory);
builder.append(", ").append(directory);
builder.append("]");
return builder.toString();

View File

@@ -72,36 +72,30 @@ import java.util.List;
// See http://www.codeproject.com/KB/graphics/PSDParser.aspx
// See http://www.adobeforums.com/webx?14@@.3bc381dc/0
public class PSDImageReader extends ImageReaderBase {
private PSDHeader mHeader;
// private PSDColorData mColorData;
// private List<PSDImageResource> mImageResources;
// private PSDGlobalLayerMask mGlobalLayerMask;
// private List<PSDLayerInfo> mLayerInfo;
private ICC_ColorSpace mColorSpace;
protected PSDMetadata mMetadata;
private PSDHeader header;
private ICC_ColorSpace colorSpace;
protected PSDMetadata metadata;
protected PSDImageReader(final ImageReaderSpi pOriginatingProvider) {
super(pOriginatingProvider);
}
protected void resetMembers() {
mHeader = null;
// mColorData = null;
// mImageResources = null;
mMetadata = null;
mColorSpace = null;
header = null;
metadata = null;
colorSpace = null;
}
public int getWidth(final int pIndex) throws IOException {
checkBounds(pIndex);
readHeader();
return mHeader.mWidth;
return header.width;
}
public int getHeight(final int pIndex) throws IOException {
checkBounds(pIndex);
readHeader();
return mHeader.mHeight;
return header.height;
}
@Override
@@ -115,39 +109,39 @@ public class PSDImageReader extends ImageReaderBase {
ColorSpace cs;
switch (mHeader.mMode) {
switch (header.mode) {
case PSD.COLOR_MODE_MONOCHROME:
if (mHeader.mChannels == 1 && mHeader.mBits == 1) {
if (header.channels == 1 && header.bits == 1) {
return ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_BYTE_BINARY);
}
throw new IIOException(
String.format("Unsupported channel count/bit depth for Monochrome PSD: %d channels/%d bits", mHeader.mChannels, mHeader.mBits)
String.format("Unsupported channel count/bit depth for Monochrome PSD: %d channels/%d bits", header.channels, header.bits)
);
case PSD.COLOR_MODE_INDEXED:
// TODO: 16 bit indexed?! Does it exist?
if (mHeader.mChannels == 1 && mHeader.mBits == 8) {
return IndexedImageTypeSpecifier.createFromIndexColorModel(mMetadata.mColorData.getIndexColorModel());
if (header.channels == 1 && header.bits == 8) {
return IndexedImageTypeSpecifier.createFromIndexColorModel(metadata.colorData.getIndexColorModel());
}
throw new IIOException(
String.format("Unsupported channel count/bit depth for Indexed Color PSD: %d channels/%d bits", mHeader.mChannels, mHeader.mBits)
String.format("Unsupported channel count/bit depth for Indexed Color PSD: %d channels/%d bits", header.channels, header.bits)
);
case PSD.COLOR_MODE_DUOTONE:
// NOTE: Duotone (whatever that is) should be treated as gray scale
// Fall-through
case PSD.COLOR_MODE_GRAYSCALE:
if (mHeader.mChannels == 1 && mHeader.mBits == 8) {
if (header.channels == 1 && header.bits == 8) {
return ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_BYTE_GRAY);
}
else if (mHeader.mChannels == 1 && mHeader.mBits == 16) {
else if (header.channels == 1 && header.bits == 16) {
return ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_USHORT_GRAY);
}
throw new IIOException(
String.format("Unsupported channel count/bit depth for Gray Scale PSD: %d channels/%d bits", mHeader.mChannels, mHeader.mBits)
String.format("Unsupported channel count/bit depth for Gray Scale PSD: %d channels/%d bits", header.channels, header.bits)
);
case PSD.COLOR_MODE_RGB:
@@ -157,21 +151,21 @@ public class PSDImageReader extends ImageReaderBase {
cs = ColorSpace.getInstance(ColorSpace.CS_sRGB);
}
if (mHeader.mChannels == 3 && mHeader.mBits == 8) {
if (header.channels == 3 && header.bits == 8) {
return ImageTypeSpecifier.createBanded(cs, new int[] {0, 1, 2}, new int[] {0, 0, 0}, DataBuffer.TYPE_BYTE, false, false);
}
else if (mHeader.mChannels >= 4 && mHeader.mBits == 8) {
else if (header.channels >= 4 && header.bits == 8) {
return ImageTypeSpecifier.createBanded(cs, new int[] {0, 1, 2, 3}, new int[] {0, 0, 0, 0}, DataBuffer.TYPE_BYTE, true, false);
}
else if (mHeader.mChannels == 3 && mHeader.mBits == 16) {
else if (header.channels == 3 && header.bits == 16) {
return ImageTypeSpecifier.createBanded(cs, new int[] {0, 1, 2}, new int[] {0, 0, 0}, DataBuffer.TYPE_USHORT, false, false);
}
else if (mHeader.mChannels >= 4 && mHeader.mBits == 16) {
else if (header.channels >= 4 && header.bits == 16) {
return ImageTypeSpecifier.createBanded(cs, new int[] {0, 1, 2, 3}, new int[] {0, 0, 0, 0}, DataBuffer.TYPE_USHORT, true, false);
}
throw new IIOException(
String.format("Unsupported channel count/bit depth for RGB PSD: %d channels/%d bits", mHeader.mChannels, mHeader.mBits)
String.format("Unsupported channel count/bit depth for RGB PSD: %d channels/%d bits", header.channels, header.bits)
);
case PSD.COLOR_MODE_CMYK:
@@ -180,21 +174,21 @@ public class PSDImageReader extends ImageReaderBase {
cs = ColorSpaces.getColorSpace(ColorSpaces.CS_GENERIC_CMYK);
}
if (mHeader.mChannels == 4 && mHeader.mBits == 8) {
if (header.channels == 4 && header.bits == 8) {
return ImageTypeSpecifier.createBanded(cs, new int[] {0, 1, 2, 3}, new int[] {0, 0, 0, 0}, DataBuffer.TYPE_BYTE, false, false);
}
else if (mHeader.mChannels == 5 && mHeader.mBits == 8) {
else if (header.channels == 5 && header.bits == 8) {
return ImageTypeSpecifier.createBanded(cs, new int[] {0, 1, 2, 3, 4}, new int[] {0, 0, 0, 0, 0}, DataBuffer.TYPE_BYTE, true, false);
}
else if (mHeader.mChannels == 4 && mHeader.mBits == 16) {
else if (header.channels == 4 && header.bits == 16) {
return ImageTypeSpecifier.createBanded(cs, new int[] {0, 1, 2, 3}, new int[] {0, 0, 0, 0}, DataBuffer.TYPE_USHORT, false, false);
}
else if (mHeader.mChannels == 5 && mHeader.mBits == 16) {
else if (header.channels == 5 && header.bits == 16) {
return ImageTypeSpecifier.createBanded(cs, new int[] {0, 1, 2, 3, 4}, new int[] {0, 0, 0, 0, 0}, DataBuffer.TYPE_USHORT, true, false);
}
throw new IIOException(
String.format("Unsupported channel count/bit depth for CMYK PSD: %d channels/%d bits", mHeader.mChannels, mHeader.mBits)
String.format("Unsupported channel count/bit depth for CMYK PSD: %d channels/%d bits", header.channels, header.bits)
);
case PSD.COLOR_MODE_MULTICHANNEL:
@@ -204,7 +198,7 @@ public class PSDImageReader extends ImageReaderBase {
// TODO: If there's a color profile embedded, it should be easy, otherwise we're out of luck...
default:
throw new IIOException(
String.format("Unsupported PSD MODE: %s (%d channels/%d bits)", mHeader.mMode, mHeader.mChannels, mHeader.mBits)
String.format("Unsupported PSD MODE: %s (%d channels/%d bits)", header.mode, header.channels, header.bits)
);
}
}
@@ -219,10 +213,10 @@ public class PSDImageReader extends ImageReaderBase {
ColorSpace cs = rawType.getColorModel().getColorSpace();
List<ImageTypeSpecifier> types = new ArrayList<ImageTypeSpecifier>();
switch (mHeader.mMode) {
switch (header.mode) {
case PSD.COLOR_MODE_RGB:
// Prefer interleaved versions as they are much faster to display
if (mHeader.mChannels == 3 && mHeader.mBits == 8) {
if (header.channels == 3 && header.bits == 8) {
// TODO: ColorConvertOp to CS_sRGB
// TODO: Integer raster
// types.add(ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.INT_RGB));
@@ -233,7 +227,7 @@ public class PSDImageReader extends ImageReaderBase {
types.add(ImageTypeSpecifier.createInterleaved(cs, new int[] {2, 1, 0}, DataBuffer.TYPE_BYTE, false, false));
}
}
else if (mHeader.mChannels >= 4 && mHeader.mBits == 8) {
else if (header.channels >= 4 && header.bits == 8) {
// TODO: ColorConvertOp to CS_sRGB
// TODO: Integer raster
// types.add(ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.INT_ARGB));
@@ -244,10 +238,10 @@ public class PSDImageReader extends ImageReaderBase {
types.add(ImageTypeSpecifier.createInterleaved(cs, new int[] {3, 2, 1, 0}, DataBuffer.TYPE_BYTE, true, false));
}
}
else if (mHeader.mChannels == 3 && mHeader.mBits == 16) {
else if (header.channels == 3 && header.bits == 16) {
types.add(ImageTypeSpecifier.createInterleaved(cs, new int[] {2, 1, 0}, DataBuffer.TYPE_USHORT, false, false));
}
else if (mHeader.mChannels >= 4 && mHeader.mBits == 16) {
else if (header.channels >= 4 && header.bits == 16) {
types.add(ImageTypeSpecifier.createInterleaved(cs, new int[] {3, 2, 1, 0}, DataBuffer.TYPE_USHORT, true, false));
}
break;
@@ -258,16 +252,16 @@ public class PSDImageReader extends ImageReaderBase {
// as Java2D is extremely slow displaying custom images.
// Converting to RGB is also correct behaviour, according to the docs.
// Doing this, will require rewriting the image reading, as the raw image data is channelled, not interleaved :-/
if (mHeader.mChannels == 4 && mHeader.mBits == 8) {
if (header.channels == 4 && header.bits == 8) {
types.add(ImageTypeSpecifier.createInterleaved(cs, new int[] {3, 2, 1, 0}, DataBuffer.TYPE_BYTE, false, false));
}
else if (mHeader.mChannels == 5 && mHeader.mBits == 8) {
else if (header.channels == 5 && header.bits == 8) {
types.add(ImageTypeSpecifier.createInterleaved(cs, new int[] {4, 3, 2, 1, 0}, DataBuffer.TYPE_BYTE, true, false));
}
else if (mHeader.mChannels == 4 && mHeader.mBits == 16) {
else if (header.channels == 4 && header.bits == 16) {
types.add(ImageTypeSpecifier.createInterleaved(cs, new int[]{3, 2, 1, 0}, DataBuffer.TYPE_USHORT, false, false));
}
else if (mHeader.mChannels == 5 && mHeader.mBits == 16) {
else if (header.channels == 5 && header.bits == 16) {
types.add(ImageTypeSpecifier.createInterleaved(cs, new int[] {4, 3, 2, 1, 0}, DataBuffer.TYPE_USHORT, true, false));
}
break;
@@ -286,19 +280,19 @@ public class PSDImageReader extends ImageReaderBase {
// TODO: Skip this, requires storing some stream offsets
readLayerAndMaskInfo(false);
if (mColorSpace == null) {
if (colorSpace == null) {
ICC_Profile profile = null;
for (PSDImageResource resource : mMetadata.mImageResources) {
for (PSDImageResource resource : metadata.imageResources) {
if (resource instanceof ICCProfile) {
profile = ((ICCProfile) resource).getProfile();
break;
}
}
mColorSpace = profile == null ? null : ColorSpaces.createColorSpace(profile);
colorSpace = profile == null ? null : ColorSpaces.createColorSpace(profile);
}
return mColorSpace;
return colorSpace;
}
public BufferedImage read(final int pIndex, final ImageReadParam pParam) throws IOException {
@@ -309,13 +303,13 @@ public class PSDImageReader extends ImageReaderBase {
readImageResources(false);
readLayerAndMaskInfo(false);
BufferedImage image = getDestination(pParam, getImageTypes(pIndex), mHeader.mWidth, mHeader.mHeight);
BufferedImage image = getDestination(pParam, getImageTypes(pIndex), header.width, header.height);
ImageTypeSpecifier rawType = getRawImageType(pIndex);
checkReadParamBandSettings(pParam, rawType.getNumBands(), image.getSampleModel().getNumBands());
final Rectangle source = new Rectangle();
final Rectangle dest = new Rectangle();
computeRegions(pParam, mHeader.mWidth, mHeader.mHeight, image, source, dest);
computeRegions(pParam, header.width, header.height, image, source, dest);
/*
NOTE: It seems safe to just leave this out for now. The only thing we need is to support sub sampling.
@@ -360,14 +354,14 @@ public class PSDImageReader extends ImageReaderBase {
int[] byteCounts = null;
int compression = imageInput.readShort();
// TODO: Need to make sure compression is set in metadata, even without reading the image data!
mMetadata.mCompression = compression;
metadata.compression = compression;
switch (compression) {
case PSD.COMPRESSION_NONE:
break;
case PSD.COMPRESSION_RLE:
// NOTE: Byte counts will allow us to easily skip rows before AOI
byteCounts = new int[mHeader.mChannels * mHeader.mHeight];
byteCounts = new int[header.channels * header.height];
for (int i = 0; i < byteCounts.length; i++) {
byteCounts[i] = imageInput.readUnsignedShort();
}
@@ -410,7 +404,7 @@ public class PSDImageReader extends ImageReaderBase {
final ColorModel destCM = pImage.getColorModel();
// TODO: This raster is 3-5 times longer than needed, depending on number of channels...
final WritableRaster rowRaster = pSourceCM.createCompatibleWritableRaster(mHeader.mWidth, 1);
final WritableRaster rowRaster = pSourceCM.createCompatibleWritableRaster(header.width, 1);
final int channels = rowRaster.getNumBands();
final boolean banded = raster.getDataBuffer().getNumBanks() > 1;
@@ -419,21 +413,21 @@ public class PSDImageReader extends ImageReaderBase {
for (int c = 0; c < channels; c++) {
int bandOffset = banded ? 0 : interleavedBands - 1 - c;
switch (mHeader.mBits) {
switch (header.bits) {
case 1:
byte[] row1 = ((DataBufferByte) rowRaster.getDataBuffer()).getData();
read1bitChannel(c, mHeader.mChannels, raster.getDataBuffer(), interleavedBands, bandOffset, pSourceCM, row1, pSource, pDest, pXSub, pYSub, mHeader.mWidth, mHeader.mHeight, pByteCounts, pCompression == PSD.COMPRESSION_RLE);
read1bitChannel(c, header.channels, raster.getDataBuffer(), interleavedBands, bandOffset, pSourceCM, row1, pSource, pDest, pXSub, pYSub, header.width, header.height, pByteCounts, pCompression == PSD.COMPRESSION_RLE);
break;
case 8:
byte[] row8 = ((DataBufferByte) rowRaster.getDataBuffer()).getData();
read8bitChannel(c, mHeader.mChannels, raster.getDataBuffer(), interleavedBands, bandOffset, pSourceCM, row8, pSource, pDest, pXSub, pYSub, mHeader.mWidth, mHeader.mHeight, pByteCounts, c * mHeader.mHeight, pCompression == PSD.COMPRESSION_RLE);
read8bitChannel(c, header.channels, raster.getDataBuffer(), interleavedBands, bandOffset, pSourceCM, row8, pSource, pDest, pXSub, pYSub, header.width, header.height, pByteCounts, c * header.height, pCompression == PSD.COMPRESSION_RLE);
break;
case 16:
short[] row16 = ((DataBufferUShort) rowRaster.getDataBuffer()).getData();
read16bitChannel(c, mHeader.mChannels, raster.getDataBuffer(), interleavedBands, bandOffset, pSourceCM, row16, pSource, pDest, pXSub, pYSub, mHeader.mWidth, mHeader.mHeight, pByteCounts, c * mHeader.mHeight, pCompression == PSD.COMPRESSION_RLE);
read16bitChannel(c, header.channels, raster.getDataBuffer(), interleavedBands, bandOffset, pSourceCM, row16, pSource, pDest, pXSub, pYSub, header.width, header.height, pByteCounts, c * header.height, pCompression == PSD.COMPRESSION_RLE);
break;
default:
throw new IIOException(String.format("Unknown PSD bit depth: %s", mHeader.mBits));
throw new IIOException(String.format("Unknown PSD bit depth: %s", header.bits));
}
if (abortRequested()) {
@@ -441,7 +435,7 @@ public class PSDImageReader extends ImageReaderBase {
}
}
if (mHeader.mBits == 8) {
if (header.bits == 8) {
// Compose out the background of the semi-transparent pixels, as PS somehow has the background composed in
decomposeAlpha(destCM, raster.getDataBuffer(), pDest.width, pDest.height, raster.getNumBands());
}
@@ -713,11 +707,11 @@ public class PSDImageReader extends ImageReaderBase {
private void readHeader() throws IOException {
assertInput();
if (mHeader == null) {
mHeader = new PSDHeader(imageInput);
if (header == null) {
header = new PSDHeader(imageInput);
mMetadata = new PSDMetadata();
mMetadata.mHeader = mHeader;
metadata = new PSDMetadata();
metadata.header = header;
/*
Contains the required data to define the color mode.
@@ -730,8 +724,8 @@ public class PSDImageReader extends ImageReaderBase {
the duotone image as a grayscale image, and keep the duotone specification
around as a black box for use when saving the file.
*/
if (mHeader.mMode == PSD.COLOR_MODE_INDEXED) {
mMetadata.mColorData = new PSDColorData(imageInput);
if (header.mode == PSD.COLOR_MODE_INDEXED) {
metadata.colorData = new PSDColorData(imageInput);
}
else {
// TODO: We need to store the duotone spec if we decide to create a writer...
@@ -755,14 +749,14 @@ public class PSDImageReader extends ImageReaderBase {
long length = imageInput.readUnsignedInt();
if (pParseData && length > 0) {
if (mMetadata.mImageResources == null) {
mMetadata.mImageResources = new ArrayList<PSDImageResource>();
if (metadata.imageResources == null) {
metadata.imageResources = new ArrayList<PSDImageResource>();
long expectedEnd = imageInput.getStreamPosition() + length;
while (imageInput.getStreamPosition() < expectedEnd) {
// TODO: Have PSDImageResources defer actual parsing? (Just store stream offsets)
PSDImageResource resource = PSDImageResource.read(imageInput);
mMetadata.mImageResources.add(resource);
metadata.imageResources.add(resource);
}
if (imageInput.getStreamPosition() != expectedEnd) {
@@ -796,7 +790,7 @@ public class PSDImageReader extends ImageReaderBase {
for (int i = 0; i < layerInfos.length; i++) {
layerInfos[i] = new PSDLayerInfo(imageInput);
}
mMetadata.mLayerInfo = Arrays.asList(layerInfos);
metadata.layerInfo = Arrays.asList(layerInfos);
// TODO: Clean-up
imageInput.mark();
@@ -810,7 +804,7 @@ public class PSDImageReader extends ImageReaderBase {
// TODO: Don't show! Store in meta data somehow...
// if (layer != null) {
// showIt(layer, layerInfo.mLayerName + " " + layerInfo.mBlendMode.toString());
// showIt(layer, layerInfo.layerName + " " + layerInfo.blendMode.toString());
// }
}
@@ -825,8 +819,8 @@ public class PSDImageReader extends ImageReaderBase {
long layerMaskInfoLength = imageInput.readUnsignedInt();
// System.out.println("GlobalLayerMaskInfo length: " + layerMaskInfoLength);
if (layerMaskInfoLength > 0) {
mMetadata.mGlobalLayerMask = new PSDGlobalLayerMask(imageInput);
// System.out.println("mGlobalLayerMask: " + mGlobalLayerMask);
metadata.globalLayerMask = new PSDGlobalLayerMask(imageInput);
// System.out.println("globalLayerMask: " + globalLayerMask);
}
read = imageInput.getStreamPosition() - pos;
@@ -842,8 +836,8 @@ public class PSDImageReader extends ImageReaderBase {
}
private BufferedImage readLayerData(final PSDLayerInfo pLayerInfo, final ImageTypeSpecifier pRawType, final ImageTypeSpecifier pImageType) throws IOException {
final int width = pLayerInfo.mRight - pLayerInfo.mLeft;
final int height = pLayerInfo.mBottom - pLayerInfo.mTop;
final int width = pLayerInfo.right - pLayerInfo.left;
final int height = pLayerInfo.bottom - pLayerInfo.top;
// Even if raw/imageType has no alpha, the layers may still have alpha...
ImageTypeSpecifier imageType = getImageTypeForLayer(pImageType, pLayerInfo);
@@ -869,19 +863,19 @@ public class PSDImageReader extends ImageReaderBase {
final boolean banded = raster.getDataBuffer().getNumBanks() > 1;
final int interleavedBands = banded ? 1 : raster.getNumBands();
for (PSDChannelInfo channelInfo : pLayerInfo.mChannelInfo) {
for (PSDChannelInfo channelInfo : pLayerInfo.channelInfo) {
int compression = imageInput.readUnsignedShort();
// Skip layer if we can't read it
// channelId == -2 means "user supplied layer mask", whatever that is...
if (width <= 0 || height <= 0 || channelInfo.mChannelId == -2 ||
if (width <= 0 || height <= 0 || channelInfo.channelId == -2 ||
(compression != PSD.COMPRESSION_NONE && compression != PSD.COMPRESSION_RLE)) {
imageInput.skipBytes(channelInfo.mLength - 2);
imageInput.skipBytes(channelInfo.length - 2);
}
else {
// 0 = red, 1 = green, etc
// -1 = transparency mask; -2 = user supplied layer mask
int c = channelInfo.mChannelId == -1 ? pLayerInfo.mChannelInfo.length - 1 : channelInfo.mChannelId;
int c = channelInfo.channelId == -1 ? pLayerInfo.channelInfo.length - 1 : channelInfo.channelId;
// NOTE: For layers, byte counts are written per channel, while for the composite data
// byte counts are written for all channels before the image data.
@@ -896,7 +890,7 @@ public class PSDImageReader extends ImageReaderBase {
// If RLE, the the image data starts with the byte counts
// for all the scan lines in the channel (LayerBottom-LayerTop), with
// each count stored as a two*byte value.
byteCounts = new int[pLayerInfo.mBottom - pLayerInfo.mTop];
byteCounts = new int[pLayerInfo.bottom - pLayerInfo.top];
for (int i = 0; i < byteCounts.length; i++) {
byteCounts[i] = imageInput.readUnsignedShort();
}
@@ -911,7 +905,7 @@ public class PSDImageReader extends ImageReaderBase {
int bandOffset = banded ? 0 : interleavedBands - 1 - c;
switch (mHeader.mBits) {
switch (header.bits) {
case 1:
byte[] row1 = ((DataBufferByte) rowRaster.getDataBuffer()).getData();
// DataBufferByte buffer1 = (DataBufferByte) raster.getDataBuffer();
@@ -935,7 +929,7 @@ public class PSDImageReader extends ImageReaderBase {
read16bitChannel(c, imageType.getNumBands(), raster.getDataBuffer(), interleavedBands, bandOffset, sourceCM, row16, area, area, xsub, ysub, width, height, byteCounts, 0, compression == PSD.COMPRESSION_RLE);
break;
default:
throw new IIOException(String.format("Unknown PSD bit depth: %s", mHeader.mBits));
throw new IIOException(String.format("Unknown PSD bit depth: %s", header.bits));
}
if (abortRequested()) {
@@ -949,17 +943,17 @@ public class PSDImageReader extends ImageReaderBase {
private ImageTypeSpecifier getImageTypeForLayer(final ImageTypeSpecifier pOriginal, final PSDLayerInfo pLayerInfo) {
// If layer has more channels than composite data, it's normally extra alpha...
if (pLayerInfo.mChannelInfo.length > pOriginal.getNumBands()) {
if (pLayerInfo.channelInfo.length > pOriginal.getNumBands()) {
// ...but, it could also be just the user mask...
boolean userMask = false;
for (PSDChannelInfo channelInfo : pLayerInfo.mChannelInfo) {
if (channelInfo.mChannelId == -2) {
for (PSDChannelInfo channelInfo : pLayerInfo.channelInfo) {
if (channelInfo.channelId == -2) {
userMask = true;
break;
}
}
int newBandNum = pLayerInfo.mChannelInfo.length - (userMask ? 1 : 0);
int newBandNum = pLayerInfo.channelInfo.length - (userMask ? 1 : 0);
// If there really is more channels, then create new imageTypeSpec
if (newBandNum > pOriginal.getNumBands()) {
@@ -1004,22 +998,22 @@ public class PSDImageReader extends ImageReaderBase {
}
@Override
public IIOMetadata getImageMetadata(final int pImageIndex) throws IOException {
public IIOMetadata getImageMetadata(final int imageIndex) throws IOException {
// TODO: Implement
checkBounds(pImageIndex);
checkBounds(imageIndex);
readHeader();
readImageResources(true);
readLayerAndMaskInfo(true);
// TODO: Need to make sure compression is set in metadata, even without reading the image data!
mMetadata.mCompression = imageInput.readShort();
metadata.compression = imageInput.readShort();
// mMetadata.mHeader = mHeader;
// mMetadata.mColorData = mColorData;
// mMetadata.mImageResources = mImageResources;
// metadata.header = header;
// metadata.colorData = colorData;
// metadata.imageResources = imageResources;
return mMetadata; // TODO: clone if we change to mutable metadata
return metadata; // TODO: clone if we change to mutable metadata
}
@Override
@@ -1041,14 +1035,14 @@ public class PSDImageReader extends ImageReaderBase {
List<PSDThumbnail> thumbnails = null;
if (mMetadata.mImageResources == null) {
if (metadata.imageResources == null) {
// TODO: Need flag here, to specify what resources to read...
readImageResources(true);
// TODO: Skip this, requires storing some stream offsets
readLayerAndMaskInfo(false);
}
for (PSDImageResource resource : mMetadata.mImageResources) {
for (PSDImageResource resource : metadata.imageResources) {
if (resource instanceof PSDThumbnail) {
if (thumbnails == null) {
thumbnails = new ArrayList<PSDThumbnail>();
@@ -1147,15 +1141,15 @@ public class PSDImageReader extends ImageReaderBase {
imageReader.setInput(stream);
imageReader.readHeader();
// System.out.println("imageReader.mHeader: " + imageReader.mHeader);
// System.out.println("imageReader.header: " + imageReader.header);
imageReader.readImageResources(true);
System.out.println("imageReader.mImageResources: " + imageReader.mMetadata.mImageResources);
System.out.println("imageReader.imageResources: " + imageReader.metadata.imageResources);
System.out.println();
imageReader.readLayerAndMaskInfo(true);
System.out.println("imageReader.mLayerInfo: " + imageReader.mMetadata.mLayerInfo);
// System.out.println("imageReader.mGlobalLayerMask: " + imageReader.mGlobalLayerMask);
System.out.println("imageReader.layerInfo: " + imageReader.metadata.layerInfo);
// System.out.println("imageReader.globalLayerMask: " + imageReader.globalLayerMask);
System.out.println();
IIOMetadata metadata = imageReader.getImageMetadata(0);

View File

@@ -47,33 +47,33 @@ public class PSDImageResource {
// TODO: Refactor image resources to separate package
// TODO: Change constructor to store stream offset and length only (+ possibly the name), defer reading
final short mId;
final String mName;
final long mSize;
final short id;
final String name;
final long size;
PSDImageResource(final short pId, final ImageInputStream pInput) throws IOException {
mId = pId;
id = pId;
mName = PSDUtil.readPascalString(pInput);
name = PSDUtil.readPascalString(pInput);
// Skip pad
int nameSize = mName.length() + 1;
int nameSize = name.length() + 1;
if (nameSize % 2 != 0) {
pInput.readByte();
}
mSize = pInput.readUnsignedInt();
size = pInput.readUnsignedInt();
long startPos = pInput.getStreamPosition();
readData(new SubImageInputStream(pInput, mSize));
readData(new SubImageInputStream(pInput, size));
// NOTE: This should never happen, however it's safer to keep it here to
if (pInput.getStreamPosition() != startPos + mSize) {
pInput.seek(startPos + mSize);
if (pInput.getStreamPosition() != startPos + size) {
pInput.seek(startPos + size);
}
// Data is even-padded (word aligned)
if (mSize % 2 != 0) {
if (size % 2 != 0) {
pInput.read();
}
}
@@ -86,7 +86,7 @@ public class PSDImageResource {
*/
protected void readData(final ImageInputStream pInput) throws IOException {
// TODO: This design is ugly, as subclasses readData is invoked BEFORE their respective constructor...
pInput.skipBytes(mSize);
pInput.skipBytes(size);
}
@Override
@@ -94,7 +94,7 @@ public class PSDImageResource {
StringBuilder builder = toStringBuilder();
builder.append(", data length: ");
builder.append(mSize);
builder.append(size);
builder.append("]");
return builder.toString();
@@ -103,16 +103,16 @@ public class PSDImageResource {
protected StringBuilder toStringBuilder() {
StringBuilder builder = new StringBuilder(getClass().getSimpleName());
String fakeType = resourceTypeForId(mId);
String fakeType = resourceTypeForId(id);
if (fakeType != null) {
builder.append("(").append(fakeType).append(")");
}
builder.append("[ID: 0x");
builder.append(Integer.toHexString(mId));
if (mName != null && mName.trim().length() != 0) {
builder.append(Integer.toHexString(id));
if (name != null && name.trim().length() != 0) {
builder.append(", name: \"");
builder.append(mName);
builder.append(name);
builder.append("\"");
}

View File

@@ -40,10 +40,10 @@ import java.io.IOException;
* @version $Id: PSDLayerBlendMode.java,v 1.0 May 8, 2008 4:34:35 PM haraldk Exp$
*/
class PSDLayerBlendMode {
final int mBlendMode;
final int mOpacity; // 0-255
final int mClipping; // 0: base, 1: non-base
final int mFlags;
final int blendMode;
final int opacity; // 0-255
final int clipping; // 0: base, 1: non-base
final int flags;
public PSDLayerBlendMode(final ImageInputStream pInput) throws IOException {
int blendModeSig = pInput.readInt();
@@ -51,11 +51,11 @@ class PSDLayerBlendMode {
throw new IIOException("Illegal PSD Blend Mode signature, expected 8BIM: " + PSDUtil.intToStr(blendModeSig));
}
mBlendMode = pInput.readInt();
blendMode = pInput.readInt();
mOpacity = pInput.readUnsignedByte();
mClipping = pInput.readUnsignedByte();
mFlags = pInput.readUnsignedByte();
opacity = pInput.readUnsignedByte();
clipping = pInput.readUnsignedByte();
flags = pInput.readUnsignedByte();
pInput.readByte(); // Pad
}
@@ -65,10 +65,10 @@ class PSDLayerBlendMode {
StringBuilder builder = new StringBuilder(getClass().getSimpleName());
builder.append("[");
builder.append("mode: \"").append(PSDUtil.intToStr(mBlendMode));
builder.append("\", opacity: ").append(mOpacity);
builder.append(", clipping: ").append(mClipping);
switch (mClipping) {
builder.append("mode: \"").append(PSDUtil.intToStr(blendMode));
builder.append("\", opacity: ").append(opacity);
builder.append(", clipping: ").append(clipping);
switch (clipping) {
case 0:
builder.append(" (base)");
break;
@@ -79,40 +79,40 @@ class PSDLayerBlendMode {
builder.append(" (unknown)");
break;
}
builder.append(", flags: ").append(byteToBinary(mFlags));
builder.append(", flags: ").append(byteToBinary(flags));
/*
bit 0 = transparency protected; bit 1 = visible; bit 2 = obsolete;
bit 3 = 1 for Photoshop 5.0 and later, tells if bit 4 has useful information;
bit 4 = pixel data irrelevant to appearance of document
*/
builder.append(" (");
if ((mFlags & 0x01) != 0) {
if ((flags & 0x01) != 0) {
builder.append("Transp. protected, ");
}
if ((mFlags & 0x02) != 0) {
if ((flags & 0x02) != 0) {
builder.append("Hidden, ");
}
if ((mFlags & 0x04) != 0) {
if ((flags & 0x04) != 0) {
builder.append("Obsolete bit, ");
}
if ((mFlags & 0x08) != 0) {
if ((flags & 0x08) != 0) {
builder.append("PS 5.0 data present, "); // "tells if next bit has useful information"...
}
if ((mFlags & 0x10) != 0) {
if ((flags & 0x10) != 0) {
builder.append("Pixel data irrelevant, ");
}
if ((mFlags & 0x20) != 0) {
if ((flags & 0x20) != 0) {
builder.append("Unknown bit 5, ");
}
if ((mFlags & 0x40) != 0) {
if ((flags & 0x40) != 0) {
builder.append("Unknown bit 6, ");
}
if ((mFlags & 0x80) != 0) {
if ((flags & 0x80) != 0) {
builder.append("Unknown bit 7, ");
}
// Stupidity...
if (mFlags != 0) {
if (flags != 0) {
builder.delete(builder.length() - 2, builder.length());
}

View File

@@ -41,34 +41,34 @@ import java.util.Arrays;
* @version $Id: PSDLayerInfo.java,v 1.0 Apr 29, 2008 6:01:12 PM haraldk Exp$
*/
class PSDLayerInfo {
final int mTop;
final int mLeft;
final int mBottom;
final int mRight;
final int top;
final int left;
final int bottom;
final int right;
final PSDChannelInfo[] mChannelInfo;
final PSDLayerBlendMode mBlendMode;
final PSDLayerMaskData mLayerMaskData;
final PSDChannelSourceDestinationRange[] mRanges;
final String mLayerName;
final PSDChannelInfo[] channelInfo;
final PSDLayerBlendMode blendMode;
final PSDLayerMaskData layerMaskData;
final PSDChannelSourceDestinationRange[] ranges;
final String layerName;
PSDLayerInfo(ImageInputStream pInput) throws IOException {
mTop = pInput.readInt();
mLeft = pInput.readInt();
mBottom = pInput.readInt();
mRight = pInput.readInt();
top = pInput.readInt();
left = pInput.readInt();
bottom = pInput.readInt();
right = pInput.readInt();
int channels = pInput.readUnsignedShort();
mChannelInfo = new PSDChannelInfo[channels];
channelInfo = new PSDChannelInfo[channels];
for (int i = 0; i < channels; i++) {
short channelId = pInput.readShort();
long length = pInput.readUnsignedInt();
mChannelInfo[i] = new PSDChannelInfo(channelId, length);
channelInfo[i] = new PSDChannelInfo(channelId, length);
}
mBlendMode = new PSDLayerBlendMode(pInput);
blendMode = new PSDLayerBlendMode(pInput);
// Lenght of layer mask data
long extraDataSize = pInput.readUnsignedInt();
@@ -78,10 +78,10 @@ class PSDLayerInfo {
// Layer mask/adjustment layer data
int layerMaskDataSize = pInput.readInt(); // May be 0, 20 or 36 bytes...
if (layerMaskDataSize != 0) {
mLayerMaskData = new PSDLayerMaskData(pInput, layerMaskDataSize);
layerMaskData = new PSDLayerMaskData(pInput, layerMaskDataSize);
}
else {
mLayerMaskData = null;
layerMaskData = null;
}
int layerBlendingDataSize = pInput.readInt();
@@ -89,15 +89,15 @@ class PSDLayerInfo {
throw new IIOException("Illegal PSD Layer Blending Data size: " + layerBlendingDataSize + ", expected multiple of 8");
}
mRanges = new PSDChannelSourceDestinationRange[layerBlendingDataSize / 8];
for (int i = 0; i < mRanges.length; i++) {
mRanges[i] = new PSDChannelSourceDestinationRange(pInput, (i == 0 ? "Gray" : "Channel " + (i - 1)));
ranges = new PSDChannelSourceDestinationRange[layerBlendingDataSize / 8];
for (int i = 0; i < ranges.length; i++) {
ranges[i] = new PSDChannelSourceDestinationRange(pInput, (i == 0 ? "Gray" : "Channel " + (i - 1)));
}
mLayerName = PSDUtil.readPascalString(pInput);
layerName = PSDUtil.readPascalString(pInput);
int layerNameSize = mLayerName.length() + 1;
int layerNameSize = layerName.length() + 1;
// Skip pad bytes for long word alignment
if (layerNameSize % 4 != 0) {
@@ -115,18 +115,18 @@ class PSDLayerInfo {
public String toString() {
StringBuilder builder = new StringBuilder(getClass().getSimpleName());
builder.append("[");
builder.append("top: ").append(mTop);
builder.append(", left: ").append(mLeft);
builder.append(", bottom: ").append(mBottom);
builder.append(", right: ").append(mRight);
builder.append("top: ").append(top);
builder.append(", left: ").append(left);
builder.append(", bottom: ").append(bottom);
builder.append(", right: ").append(right);
builder.append(", channels: ").append(Arrays.toString(mChannelInfo));
builder.append(", blend mode: ").append(mBlendMode);
if (mLayerMaskData != null) {
builder.append(", layer mask data: ").append(mLayerMaskData);
builder.append(", channels: ").append(Arrays.toString(channelInfo));
builder.append(", blend mode: ").append(blendMode);
if (layerMaskData != null) {
builder.append(", layer mask data: ").append(layerMaskData);
}
builder.append(", ranges: ").append(Arrays.toString(mRanges));
builder.append(", layer name: \"").append(mLayerName).append("\"");
builder.append(", ranges: ").append(Arrays.toString(ranges));
builder.append(", layer name: \"").append(layerName).append("\"");
builder.append("]");
return builder.toString();

View File

@@ -40,48 +40,48 @@ import java.io.IOException;
* @version $Id: PSDLayerMaskData.java,v 1.0 May 6, 2008 5:15:05 PM haraldk Exp$
*/
class PSDLayerMaskData {
private int mTop;
private int mLeft;
private int mBottom;
private int mRight;
private int mDefaultColor;
private int mFlags;
private int top;
private int left;
private int bottom;
private int right;
private int defaultColor;
private int flags;
private boolean mLarge;
private int mRealFlags;
private int mRealUserBackground;
private int mRealTop;
private int mRealLeft;
private int mRealBottom;
private int mRealRight;
private boolean large;
private int realFlags;
private int realUserBackground;
private int realTop;
private int realLeft;
private int realBottom;
private int realRight;
PSDLayerMaskData(ImageInputStream pInput, int pSize) throws IOException {
if (pSize != 20 && pSize != 36) {
throw new IIOException("Illegal PSD Layer Mask data size: " + pSize + " (expeced 20 or 36)");
}
mTop = pInput.readInt();
mLeft = pInput.readInt();
mBottom = pInput.readInt();
mRight = pInput.readInt();
top = pInput.readInt();
left = pInput.readInt();
bottom = pInput.readInt();
right = pInput.readInt();
mDefaultColor = pInput.readUnsignedByte();
defaultColor = pInput.readUnsignedByte();
mFlags = pInput.readUnsignedByte();
flags = pInput.readUnsignedByte();
if (pSize == 20) {
pInput.readShort(); // Pad
}
else {
// TODO: What to make out of this?
mLarge = true;
large = true;
mRealFlags = pInput.readUnsignedByte();
mRealUserBackground = pInput.readUnsignedByte();
realFlags = pInput.readUnsignedByte();
realUserBackground = pInput.readUnsignedByte();
mRealTop = pInput.readInt();
mRealLeft = pInput.readInt();
mRealBottom = pInput.readInt();
mRealRight = pInput.readInt();
realTop = pInput.readInt();
realLeft = pInput.readInt();
realBottom = pInput.readInt();
realRight = pInput.readInt();
}
}
@@ -89,43 +89,43 @@ class PSDLayerMaskData {
public String toString() {
StringBuilder builder = new StringBuilder(getClass().getSimpleName());
builder.append("[");
builder.append("top: ").append(mTop);
builder.append(", left: ").append(mLeft);
builder.append(", bottom: ").append(mBottom);
builder.append(", right: ").append(mRight);
builder.append(", default color: ").append(mDefaultColor);
builder.append(", flags: ").append(Integer.toBinaryString(mFlags));
builder.append("top: ").append(top);
builder.append(", left: ").append(left);
builder.append(", bottom: ").append(bottom);
builder.append(", right: ").append(right);
builder.append(", default color: ").append(defaultColor);
builder.append(", flags: ").append(Integer.toBinaryString(flags));
// TODO: Maybe the flag bits have oposite order?
builder.append(" (");
if ((mFlags & 0x01) != 0) {
if ((flags & 0x01) != 0) {
builder.append("Pos. rel. to layer");
}
else {
builder.append("Pos. abs.");
}
if ((mFlags & 0x02) != 0) {
if ((flags & 0x02) != 0) {
builder.append(", Mask disabled");
}
else {
builder.append(", Mask enabled");
}
if ((mFlags & 0x04) != 0) {
if ((flags & 0x04) != 0) {
builder.append(", Invert mask");
}
if ((mFlags & 0x08) != 0) {
if ((flags & 0x08) != 0) {
builder.append(", Unknown bit 3");
}
if ((mFlags & 0x10) != 0) {
if ((flags & 0x10) != 0) {
builder.append(", Unknown bit 4");
}
if ((mFlags & 0x20) != 0) {
if ((flags & 0x20) != 0) {
builder.append(", Unknown bit 5");
}
if ((mFlags & 0x40) != 0) {
if ((flags & 0x40) != 0) {
builder.append(", Unknown bit 6");
}
if ((mFlags & 0x80) != 0) {
if ((flags & 0x80) != 0) {
builder.append(", Unknown bit 7");
}
builder.append(")");

View File

@@ -27,12 +27,12 @@ public final class PSDMetadata extends AbstractMetadata {
static final String NATIVE_METADATA_FORMAT_NAME = "com_twelvemonkeys_imageio_psd_image_1.0";
static final String NATIVE_METADATA_FORMAT_CLASS_NAME = "com.twelvemonkeys.imageio.plugins.psd.PSDMetadataFormat";
PSDHeader mHeader;
PSDColorData mColorData;
int mCompression = -1;
List<PSDImageResource> mImageResources;
PSDGlobalLayerMask mGlobalLayerMask;
List<PSDLayerInfo> mLayerInfo;
PSDHeader header;
PSDColorData colorData;
int compression = -1;
List<PSDImageResource> imageResources;
PSDGlobalLayerMask globalLayerMask;
List<PSDLayerInfo> layerInfo;
static final String[] COLOR_MODES = {
"MONOCHROME", "GRAYSCALE", "INDEXED", "RGB", "CMYK", null, null, "MULTICHANNEL", "DUOTONE", "LAB"
@@ -70,11 +70,11 @@ public final class PSDMetadata extends AbstractMetadata {
root.appendChild(createHeaderNode());
if (mHeader.mMode == PSD.COLOR_MODE_INDEXED) {
if (header.mode == PSD.COLOR_MODE_INDEXED) {
root.appendChild(createPaletteNode());
}
if (mImageResources != null && !mImageResources.isEmpty()) {
if (imageResources != null && !imageResources.isEmpty()) {
root.appendChild(createImageResourcesNode());
}
@@ -86,11 +86,11 @@ public final class PSDMetadata extends AbstractMetadata {
header.setAttribute("type", "PSD");
header.setAttribute("version", "1");
header.setAttribute("channels", Integer.toString(mHeader.mChannels));
header.setAttribute("height", Integer.toString(mHeader.mHeight));
header.setAttribute("width", Integer.toString(mHeader.mWidth));
header.setAttribute("bits", Integer.toString(mHeader.mBits));
header.setAttribute("mode", COLOR_MODES[mHeader.mMode]);
header.setAttribute("channels", Integer.toString(this.header.channels));
header.setAttribute("height", Integer.toString(this.header.height));
header.setAttribute("width", Integer.toString(this.header.width));
header.setAttribute("bits", Integer.toString(this.header.bits));
header.setAttribute("mode", COLOR_MODES[this.header.mode]);
return header;
}
@@ -99,7 +99,7 @@ public final class PSDMetadata extends AbstractMetadata {
IIOMetadataNode resource = new IIOMetadataNode("ImageResources");
IIOMetadataNode node;
for (PSDImageResource imageResource : mImageResources) {
for (PSDImageResource imageResource : imageResources) {
// TODO: Always add name (if set) and id (as resourceId) to all nodes?
// Resource Id is useful for people with access to the PSD spec..
@@ -128,7 +128,7 @@ public final class PSDMetadata extends AbstractMetadata {
node = new IIOMetadataNode("AlphaChannelInfo");
for (String name : alphaChannelInfo.mNames) {
for (String name : alphaChannelInfo.names) {
IIOMetadataNode nameNode = new IIOMetadataNode("Name");
nameNode.setAttribute("value", name);
node.appendChild(nameNode);
@@ -138,11 +138,11 @@ public final class PSDMetadata extends AbstractMetadata {
PSDDisplayInfo displayInfo = (PSDDisplayInfo) imageResource;
node = new IIOMetadataNode("DisplayInfo");
node.setAttribute("colorSpace", DISPLAY_INFO_CS[displayInfo.mColorSpace]);
node.setAttribute("colorSpace", DISPLAY_INFO_CS[displayInfo.colorSpace]);
StringBuilder builder = new StringBuilder();
for (short color : displayInfo.mColors) {
for (short color : displayInfo.colors) {
if (builder.length() > 0) {
builder.append(" ");
}
@@ -151,79 +151,79 @@ public final class PSDMetadata extends AbstractMetadata {
}
node.setAttribute("colors", builder.toString());
node.setAttribute("opacity", Integer.toString(displayInfo.mOpacity));
node.setAttribute("kind", DISPLAY_INFO_KINDS[displayInfo.mKind]);
node.setAttribute("opacity", Integer.toString(displayInfo.opacity));
node.setAttribute("kind", DISPLAY_INFO_KINDS[displayInfo.kind]);
}
else if (imageResource instanceof PSDGridAndGuideInfo) {
PSDGridAndGuideInfo info = (PSDGridAndGuideInfo) imageResource;
node = new IIOMetadataNode("GridAndGuideInfo");
node.setAttribute("version", String.valueOf(info.mVersion));
node.setAttribute("verticalGridCycle", String.valueOf(info.mGridCycleVertical));
node.setAttribute("horizontalGridCycle", String.valueOf(info.mGridCycleHorizontal));
node.setAttribute("version", String.valueOf(info.version));
node.setAttribute("verticalGridCycle", String.valueOf(info.gridCycleVertical));
node.setAttribute("horizontalGridCycle", String.valueOf(info.gridCycleHorizontal));
for (PSDGridAndGuideInfo.GuideResource guide : info.mGuides) {
for (PSDGridAndGuideInfo.GuideResource guide : info.guides) {
IIOMetadataNode guideNode = new IIOMetadataNode("Guide");
guideNode.setAttribute("location", Integer.toString(guide.mLocation));
guideNode.setAttribute("orientation", GUIDE_ORIENTATIONS[guide.mDirection]);
guideNode.setAttribute("location", Integer.toString(guide.location));
guideNode.setAttribute("orientation", GUIDE_ORIENTATIONS[guide.direction]);
}
}
else if (imageResource instanceof PSDPixelAspectRatio) {
PSDPixelAspectRatio aspectRatio = (PSDPixelAspectRatio) imageResource;
node = new IIOMetadataNode("PixelAspectRatio");
node.setAttribute("version", String.valueOf(aspectRatio.mVersion));
node.setAttribute("aspectRatio", String.valueOf(aspectRatio.mAspect));
node.setAttribute("version", String.valueOf(aspectRatio.version));
node.setAttribute("aspectRatio", String.valueOf(aspectRatio.aspect));
}
else if (imageResource instanceof PSDPrintFlags) {
PSDPrintFlags flags = (PSDPrintFlags) imageResource;
node = new IIOMetadataNode("PrintFlags");
node.setAttribute("labels", String.valueOf(flags.mLabels));
node.setAttribute("cropMarks", String.valueOf(flags.mCropMasks));
node.setAttribute("colorBars", String.valueOf(flags.mColorBars));
node.setAttribute("registrationMarks", String.valueOf(flags.mRegistrationMarks));
node.setAttribute("negative", String.valueOf(flags.mNegative));
node.setAttribute("flip", String.valueOf(flags.mFlip));
node.setAttribute("interpolate", String.valueOf(flags.mInterpolate));
node.setAttribute("caption", String.valueOf(flags.mCaption));
node.setAttribute("labels", String.valueOf(flags.labels));
node.setAttribute("cropMarks", String.valueOf(flags.cropMasks));
node.setAttribute("colorBars", String.valueOf(flags.colorBars));
node.setAttribute("registrationMarks", String.valueOf(flags.registrationMarks));
node.setAttribute("negative", String.valueOf(flags.negative));
node.setAttribute("flip", String.valueOf(flags.flip));
node.setAttribute("interpolate", String.valueOf(flags.interpolate));
node.setAttribute("caption", String.valueOf(flags.caption));
}
else if (imageResource instanceof PSDPrintFlagsInformation) {
PSDPrintFlagsInformation information = (PSDPrintFlagsInformation) imageResource;
node = new IIOMetadataNode("PrintFlagsInformation");
node.setAttribute("version", String.valueOf(information.mVersion));
node.setAttribute("cropMarks", String.valueOf(information.mCropMasks));
node.setAttribute("field", String.valueOf(information.mField));
node.setAttribute("bleedWidth", String.valueOf(information.mBleedWidth));
node.setAttribute("bleedScale", String.valueOf(information.mBleedScale));
node.setAttribute("version", String.valueOf(information.version));
node.setAttribute("cropMarks", String.valueOf(information.cropMasks));
node.setAttribute("field", String.valueOf(information.field));
node.setAttribute("bleedWidth", String.valueOf(information.bleedWidth));
node.setAttribute("bleedScale", String.valueOf(information.bleedScale));
}
else if (imageResource instanceof PSDPrintScale) {
PSDPrintScale printScale = (PSDPrintScale) imageResource;
node = new IIOMetadataNode("PrintScale");
node.setAttribute("style", PRINT_SCALE_STYLES[printScale.mStyle]);
node.setAttribute("xLocation", String.valueOf(printScale.mXLocation));
node.setAttribute("yLocation", String.valueOf(printScale.mYlocation));
node.setAttribute("scale", String.valueOf(printScale.mScale));
node.setAttribute("style", PRINT_SCALE_STYLES[printScale.style]);
node.setAttribute("xLocation", String.valueOf(printScale.xLocation));
node.setAttribute("yLocation", String.valueOf(printScale.ylocation));
node.setAttribute("scale", String.valueOf(printScale.scale));
}
else if (imageResource instanceof PSDResolutionInfo) {
PSDResolutionInfo information = (PSDResolutionInfo) imageResource;
node = new IIOMetadataNode("ResolutionInfo");
node.setAttribute("horizontalResolution", String.valueOf(information.mHRes));
node.setAttribute("horizontalResolutionUnit", RESOLUTION_UNITS[information.mHResUnit]);
node.setAttribute("widthUnit", DIMENSION_UNITS[information.mWidthUnit]);
node.setAttribute("verticalResolution", String.valueOf(information.mVRes));
node.setAttribute("verticalResolutionUnit", RESOLUTION_UNITS[information.mVResUnit]);
node.setAttribute("heightUnit", DIMENSION_UNITS[information.mHeightUnit]);
node.setAttribute("horizontalResolution", String.valueOf(information.hRes));
node.setAttribute("horizontalResolutionUnit", RESOLUTION_UNITS[information.hResUnit]);
node.setAttribute("widthUnit", DIMENSION_UNITS[information.widthUnit]);
node.setAttribute("verticalResolution", String.valueOf(information.vRes));
node.setAttribute("verticalResolutionUnit", RESOLUTION_UNITS[information.vResUnit]);
node.setAttribute("heightUnit", DIMENSION_UNITS[information.heightUnit]);
}
else if (imageResource instanceof PSDUnicodeAlphaNames) {
PSDUnicodeAlphaNames alphaNames = (PSDUnicodeAlphaNames) imageResource;
node = new IIOMetadataNode("UnicodeAlphaNames");
for (String name : alphaNames.mNames) {
for (String name : alphaNames.names) {
IIOMetadataNode nameNode = new IIOMetadataNode("Name");
nameNode.setAttribute("value", name);
node.appendChild(nameNode);
@@ -233,11 +233,11 @@ public final class PSDMetadata extends AbstractMetadata {
PSDVersionInfo information = (PSDVersionInfo) imageResource;
node = new IIOMetadataNode("VersionInfo");
node.setAttribute("version", String.valueOf(information.mVersion));
node.setAttribute("hasRealMergedData", String.valueOf(information.mHasRealMergedData));
node.setAttribute("writer", information.mWriter);
node.setAttribute("reader", information.mReader);
node.setAttribute("fileVersion", String.valueOf(information.mFileVersion));
node.setAttribute("version", String.valueOf(information.version));
node.setAttribute("hasRealMergedData", String.valueOf(information.hasRealMergedData));
node.setAttribute("writer", information.writer);
node.setAttribute("reader", information.reader);
node.setAttribute("fileVersion", String.valueOf(information.fileVersion));
}
else if (imageResource instanceof PSDThumbnail) {
// TODO: Revise/rethink this...
@@ -253,9 +253,9 @@ public final class PSDMetadata extends AbstractMetadata {
node = new IIOMetadataNode("DirectoryResource");
node.setAttribute("type", "IPTC");
node.setUserObject(iptc.mDirectory);
node.setUserObject(iptc.directory);
appendEntries(node, "IPTC", iptc.mDirectory);
appendEntries(node, "IPTC", iptc.directory);
}
else if (imageResource instanceof PSDEXIF1Data) {
// TODO: Revise/rethink this...
@@ -264,9 +264,9 @@ public final class PSDMetadata extends AbstractMetadata {
node = new IIOMetadataNode("DirectoryResource");
node.setAttribute("type", "EXIF");
// TODO: Set byte[] data instead
node.setUserObject(exif.mDirectory);
node.setUserObject(exif.directory);
appendEntries(node, "EXIF", exif.mDirectory);
appendEntries(node, "EXIF", exif.directory);
}
else if (imageResource instanceof PSDXMPData) {
// TODO: Revise/rethink this... Would it be possible to parse XMP as IIOMetadataNodes? Or is that just stupid...
@@ -275,25 +275,25 @@ public final class PSDMetadata extends AbstractMetadata {
node = new IIOMetadataNode("DirectoryResource");
node.setAttribute("type", "XMP");
appendEntries(node, "XMP", xmp.mDirectory);
appendEntries(node, "XMP", xmp.directory);
// Set the entire XMP document as user data
node.setUserObject(xmp.mData);
node.setUserObject(xmp.data);
}
else {
// Generic resource..
node = new IIOMetadataNode("ImageResource");
String value = PSDImageResource.resourceTypeForId(imageResource.mId);
String value = PSDImageResource.resourceTypeForId(imageResource.id);
if (!"UnknownResource".equals(value)) {
node.setAttribute("name", value);
}
node.setAttribute("length", String.valueOf(imageResource.mSize));
node.setAttribute("length", String.valueOf(imageResource.size));
// TODO: Set user object: byte array
}
// TODO: More resources
node.setAttribute("resourceId", String.format("0x%04x", imageResource.mId));
node.setAttribute("resourceId", String.format("0x%04x", imageResource.id));
resource.appendChild(node);
}
@@ -343,7 +343,7 @@ public final class PSDMetadata extends AbstractMetadata {
node = new IIOMetadataNode("ColorSpaceType");
String cs;
switch (mHeader.mMode) {
switch (header.mode) {
case PSD.COLOR_MODE_MONOCHROME:
case PSD.COLOR_MODE_GRAYSCALE:
case PSD.COLOR_MODE_DUOTONE: // Rationale: Spec says treat as gray...
@@ -357,7 +357,7 @@ public final class PSDMetadata extends AbstractMetadata {
cs = "CMYK";
break;
case PSD.COLOR_MODE_MULTICHANNEL:
cs = getMultiChannelCS(mHeader.mChannels);
cs = getMultiChannelCS(header.channels);
break;
case PSD.COLOR_MODE_LAB:
cs = "Lab";
@@ -370,7 +370,7 @@ public final class PSDMetadata extends AbstractMetadata {
// TODO: Channels might be 5 for RGB + A + Mask... Probably not correct
node = new IIOMetadataNode("NumChannels");
node.setAttribute("value", Integer.toString(mHeader.mChannels));
node.setAttribute("value", Integer.toString(header.channels));
chroma_node.appendChild(node);
// TODO: Check if this is correct with bitmap (monchrome)
@@ -378,7 +378,7 @@ public final class PSDMetadata extends AbstractMetadata {
node.setAttribute("value", "true");
chroma_node.appendChild(node);
if (mHeader.mMode == PSD.COLOR_MODE_INDEXED) {
if (header.mode == PSD.COLOR_MODE_INDEXED) {
node = createPaletteNode();
chroma_node.appendChild(node);
}
@@ -411,7 +411,7 @@ public final class PSDMetadata extends AbstractMetadata {
private IIOMetadataNode createPaletteNode() {
IIOMetadataNode node = new IIOMetadataNode("Palette");
IndexColorModel cm = mColorData.getIndexColorModel();
IndexColorModel cm = colorData.getIndexColorModel();
for (int i = 0; i < cm.getMapSize(); i++) {
IIOMetadataNode entry = new IIOMetadataNode("PaletteEntry");
@@ -442,7 +442,7 @@ public final class PSDMetadata extends AbstractMetadata {
node = new IIOMetadataNode("CompressionTypeName");
String compression;
switch (mCompression) {
switch (this.compression) {
case PSD.COMPRESSION_NONE:
compression = "none";
break;
@@ -478,13 +478,13 @@ public final class PSDMetadata extends AbstractMetadata {
dataNode.appendChild(node);
node = new IIOMetadataNode("SampleFormat");
node.setAttribute("value", mHeader.mMode == PSD.COLOR_MODE_INDEXED ? "Index" : "UnsignedIntegral");
node.setAttribute("value", header.mode == PSD.COLOR_MODE_INDEXED ? "Index" : "UnsignedIntegral");
dataNode.appendChild(node);
String bitDepth = Integer.toString(mHeader.mBits); // bits per plane
String bitDepth = Integer.toString(header.bits); // bits per plane
// TODO: Channels might be 5 for RGB + A + Mask...
String[] bps = new String[mHeader.mChannels];
String[] bps = new String[header.channels];
Arrays.fill(bps, bitDepth);
node = new IIOMetadataNode("BitsPerSample");
@@ -509,7 +509,7 @@ public final class PSDMetadata extends AbstractMetadata {
Iterator<PSDPixelAspectRatio> ratios = getResources(PSDPixelAspectRatio.class);
if (ratios.hasNext()) {
PSDPixelAspectRatio ratio = ratios.next();
aspect = (float) ratio.mAspect;
aspect = (float) ratio.aspect;
}
node.setAttribute("value", Float.toString(aspect));
@@ -525,11 +525,11 @@ public final class PSDMetadata extends AbstractMetadata {
PSDResolutionInfo resolutionInfo = resolutionInfos.next();
node = new IIOMetadataNode("HorizontalPixelSize");
node.setAttribute("value", Float.toString(asMM(resolutionInfo.mHResUnit, resolutionInfo.mHRes)));
node.setAttribute("value", Float.toString(asMM(resolutionInfo.hResUnit, resolutionInfo.hRes)));
dimensionNode.appendChild(node);
node = new IIOMetadataNode("VerticalPixelSize");
node.setAttribute("value", Float.toString(asMM(resolutionInfo.mVResUnit, resolutionInfo.mVRes)));
node.setAttribute("value", Float.toString(asMM(resolutionInfo.vResUnit, resolutionInfo.vRes)));
dimensionNode.appendChild(node);
}
@@ -583,7 +583,7 @@ public final class PSDMetadata extends AbstractMetadata {
PSDEXIF1Data data = exif.next();
// Get the EXIF DateTime (aka ModifyDate) tag if present
Entry dateTime = data.mDirectory.getEntryById(TIFF.TAG_DATE_TIME);
Entry dateTime = data.directory.getEntryById(TIFF.TAG_DATE_TIME);
if (dateTime != null) {
node = new IIOMetadataNode("ImageCreationTime"); // As TIFF, but could just as well be ImageModificationTime
// Format: "YYYY:MM:DD hh:mm:ss"
@@ -629,7 +629,7 @@ public final class PSDMetadata extends AbstractMetadata {
if (textResource instanceof PSDIPTCData) {
PSDIPTCData iptc = (PSDIPTCData) textResource;
appendTextEntriesFlat(text, iptc.mDirectory, new FilterIterator.Filter<Entry>() {
appendTextEntriesFlat(text, iptc.directory, new FilterIterator.Filter<Entry>() {
public boolean accept(final Entry pEntry) {
Integer tagId = (Integer) pEntry.getIdentifier();
@@ -645,7 +645,7 @@ public final class PSDMetadata extends AbstractMetadata {
else if (textResource instanceof PSDEXIF1Data) {
PSDEXIF1Data exif = (PSDEXIF1Data) textResource;
appendTextEntriesFlat(text, exif.mDirectory, new FilterIterator.Filter<Entry>() {
appendTextEntriesFlat(text, exif.directory, new FilterIterator.Filter<Entry>() {
public boolean accept(final Entry pEntry) {
Integer tagId = (Integer) pEntry.getIdentifier();
@@ -714,14 +714,14 @@ public final class PSDMetadata extends AbstractMetadata {
}
private boolean hasAlpha() {
return mHeader.mMode == PSD.COLOR_MODE_RGB && mHeader.mChannels >= 4 ||
mHeader.mMode == PSD.COLOR_MODE_CMYK & mHeader.mChannels >= 5;
return header.mode == PSD.COLOR_MODE_RGB && header.channels >= 4 ||
header.mode == PSD.COLOR_MODE_CMYK & header.channels >= 5;
}
<T extends PSDImageResource> Iterator<T> getResources(final Class<T> pResourceType) {
// NOTE: The cast here is wrong, strictly speaking, but it does not matter...
@SuppressWarnings({"unchecked"})
Iterator<T> iterator = (Iterator<T>) mImageResources.iterator();
Iterator<T> iterator = (Iterator<T>) imageResources.iterator();
return new FilterIterator<T>(iterator, new FilterIterator.Filter<T>() {
public boolean accept(final T pElement) {
@@ -731,12 +731,12 @@ public final class PSDMetadata extends AbstractMetadata {
}
Iterator<PSDImageResource> getResources(final int... pResourceTypes) {
Iterator<PSDImageResource> iterator = mImageResources.iterator();
Iterator<PSDImageResource> iterator = imageResources.iterator();
return new FilterIterator<PSDImageResource>(iterator, new FilterIterator.Filter<PSDImageResource>() {
public boolean accept(final PSDImageResource pResource) {
for (int type : pResourceTypes) {
if (type == pResource.mId) {
if (type == pResource.id) {
return true;
}
}

View File

@@ -12,8 +12,8 @@ import java.io.IOException;
*/
final class PSDPixelAspectRatio extends PSDImageResource {
// 4 bytes (version = 1), 8 bytes double, x / y of a pixel
int mVersion;
double mAspect;
int version;
double aspect;
PSDPixelAspectRatio(final short pId, final ImageInputStream pInput) throws IOException {
super(pId, pInput);
@@ -21,7 +21,7 @@ final class PSDPixelAspectRatio extends PSDImageResource {
@Override
protected void readData(final ImageInputStream pInput) throws IOException {
mVersion = pInput.readInt();
mAspect = pInput.readDouble();
version = pInput.readInt();
aspect = pInput.readDouble();
}
}

View File

@@ -11,14 +11,14 @@ import java.io.IOException;
* @version $Id: PSDPrintFlagsInfo.java,v 1.0 Jul 28, 2009 5:16:27 PM haraldk Exp$
*/
final class PSDPrintFlags extends PSDImageResource {
boolean mLabels;
boolean mCropMasks;
boolean mColorBars;
boolean mRegistrationMarks;
boolean mNegative;
boolean mFlip;
boolean mInterpolate;
boolean mCaption;
boolean labels;
boolean cropMasks;
boolean colorBars;
boolean registrationMarks;
boolean negative;
boolean flip;
boolean interpolate;
boolean caption;
PSDPrintFlags(final short pId, final ImageInputStream pInput) throws IOException {
super(pId, pInput);
@@ -26,30 +26,30 @@ final class PSDPrintFlags extends PSDImageResource {
@Override
protected void readData(final ImageInputStream pInput) throws IOException {
mLabels = pInput.readBoolean();
mCropMasks = pInput.readBoolean();
mColorBars = pInput.readBoolean();
mRegistrationMarks = pInput.readBoolean();
mNegative = pInput.readBoolean();
mFlip = pInput.readBoolean();
mInterpolate = pInput.readBoolean();
mCaption = pInput.readBoolean();
labels = pInput.readBoolean();
cropMasks = pInput.readBoolean();
colorBars = pInput.readBoolean();
registrationMarks = pInput.readBoolean();
negative = pInput.readBoolean();
flip = pInput.readBoolean();
interpolate = pInput.readBoolean();
caption = pInput.readBoolean();
pInput.skipBytes(mSize - 8);
pInput.skipBytes(size - 8);
}
@Override
public String toString() {
StringBuilder builder = toStringBuilder();
builder.append(", labels: ").append(mLabels);
builder.append(", crop masks: ").append(mCropMasks);
builder.append(", color bars: ").append(mColorBars);
builder.append(", registration marks: ").append(mRegistrationMarks);
builder.append(", negative: ").append(mNegative);
builder.append(", flip: ").append(mFlip);
builder.append(", interpolate: ").append(mInterpolate);
builder.append(", caption: ").append(mCaption);
builder.append(", labels: ").append(labels);
builder.append(", crop masks: ").append(cropMasks);
builder.append(", color bars: ").append(colorBars);
builder.append(", registration marks: ").append(registrationMarks);
builder.append(", negative: ").append(negative);
builder.append(", flip: ").append(flip);
builder.append(", interpolate: ").append(interpolate);
builder.append(", caption: ").append(caption);
builder.append("]");

View File

@@ -11,11 +11,11 @@ import java.io.IOException;
* @version $Id: PSDPrintFlagsInfo.java,v 1.0 Jul 28, 2009 5:16:27 PM haraldk Exp$
*/
final class PSDPrintFlagsInformation extends PSDImageResource {
int mVersion;
boolean mCropMasks;
int mField;
long mBleedWidth;
int mBleedScale;
int version;
boolean cropMasks;
int field;
long bleedWidth;
int bleedScale;
PSDPrintFlagsInformation(final short pId, final ImageInputStream pInput) throws IOException {
super(pId, pInput);
@@ -23,24 +23,24 @@ final class PSDPrintFlagsInformation extends PSDImageResource {
@Override
protected void readData(final ImageInputStream pInput) throws IOException {
mVersion = pInput.readUnsignedShort();
mCropMasks = pInput.readBoolean();
mField = pInput.readUnsignedByte(); // TODO: Is this really pad?
mBleedWidth = pInput.readUnsignedInt();
mBleedScale = pInput.readUnsignedShort();
version = pInput.readUnsignedShort();
cropMasks = pInput.readBoolean();
field = pInput.readUnsignedByte(); // TODO: Is this really pad?
bleedWidth = pInput.readUnsignedInt();
bleedScale = pInput.readUnsignedShort();
pInput.skipBytes(mSize - 10);
pInput.skipBytes(size - 10);
}
@Override
public String toString() {
StringBuilder builder = toStringBuilder();
builder.append(", version: ").append(mVersion);
builder.append(", crop masks: ").append(mCropMasks);
builder.append(", field: ").append(mField);
builder.append(", bleed width: ").append(mBleedWidth);
builder.append(", bleed scale: ").append(mBleedScale);
builder.append(", version: ").append(version);
builder.append(", crop masks: ").append(cropMasks);
builder.append(", field: ").append(field);
builder.append(", bleed width: ").append(bleedWidth);
builder.append(", bleed scale: ").append(bleedScale);
builder.append("]");

View File

@@ -16,10 +16,10 @@ final class PSDPrintScale extends PSDImageResource {
// 4 bytes y location (floating point).
// 4 bytes scale (floating point)
short mStyle;
float mXLocation;
float mYlocation;
float mScale;
short style;
float xLocation;
float ylocation;
float scale;
PSDPrintScale(final short pId, final ImageInputStream pInput) throws IOException {
super(pId, pInput);
@@ -27,9 +27,9 @@ final class PSDPrintScale extends PSDImageResource {
@Override
protected void readData(final ImageInputStream pInput) throws IOException {
mStyle = pInput.readShort();
mXLocation = pInput.readFloat();
mYlocation = pInput.readFloat();
mScale = pInput.readFloat();
style = pInput.readShort();
xLocation = pInput.readFloat();
ylocation = pInput.readFloat();
scale = pInput.readFloat();
}
}

View File

@@ -50,12 +50,12 @@ class PSDResolutionInfo extends PSDImageResource {
// WORD HeightUnit; /* 1=in, 2=cm, 3=pt, 4=picas, 5=columns */
// } RESOLUTIONINFO;
float mHRes;
short mHResUnit;
short mWidthUnit;
float mVRes;
short mVResUnit;
short mHeightUnit;
float hRes;
short hResUnit;
short widthUnit;
float vRes;
short vResUnit;
short heightUnit;
PSDResolutionInfo(final short pId, final ImageInputStream pInput) throws IOException {
super(pId, pInput);
@@ -63,32 +63,32 @@ class PSDResolutionInfo extends PSDImageResource {
@Override
protected void readData(ImageInputStream pInput) throws IOException {
if (mSize != 16) {
throw new IIOException("Resolution info length expected to be 16: " + mSize);
if (size != 16) {
throw new IIOException("Resolution info length expected to be 16: " + size);
}
mHRes = PSDUtil.fixedPointToFloat(pInput.readInt());
mHResUnit = pInput.readShort();
mWidthUnit = pInput.readShort();
mVRes = PSDUtil.fixedPointToFloat(pInput.readInt());
mVResUnit = pInput.readShort();
mHeightUnit = pInput.readShort();
hRes = PSDUtil.fixedPointToFloat(pInput.readInt());
hResUnit = pInput.readShort();
widthUnit = pInput.readShort();
vRes = PSDUtil.fixedPointToFloat(pInput.readInt());
vResUnit = pInput.readShort();
heightUnit = pInput.readShort();
}
@Override
public String toString() {
StringBuilder builder = toStringBuilder();
builder.append(", hRes: ").append(mHRes);
builder.append(", hRes: ").append(hRes);
builder.append(" ");
builder.append(resUnit(mHResUnit));
builder.append(resUnit(hResUnit));
builder.append(", width unit: ");
builder.append(dimUnit(mWidthUnit));
builder.append(", vRes: ").append(mVRes);
builder.append(dimUnit(widthUnit));
builder.append(", vRes: ").append(vRes);
builder.append(" ");
builder.append(resUnit(mVResUnit));
builder.append(resUnit(vResUnit));
builder.append(", height unit: ");
builder.append(dimUnit(mHeightUnit));
builder.append(dimUnit(heightUnit));
builder.append("]");

View File

@@ -16,9 +16,9 @@ import java.io.IOException;
* @version $Id: PSDThumbnail.java,v 1.0 Jul 29, 2009 4:41:06 PM haraldk Exp$
*/
class PSDThumbnail extends PSDImageResource {
private BufferedImage mThumbnail;
private int mWidth;
private int mHeight;
private BufferedImage thumbnail;
private int width;
private int height;
public PSDThumbnail(final short pId, final ImageInputStream pInput) throws IOException {
super(pId, pInput);
@@ -50,8 +50,8 @@ class PSDThumbnail extends PSDImageResource {
throw new IIOException(String.format("Unsupported thumbnail format (%s) in PSD document", format));
}
mWidth = pInput.readInt();
mHeight = pInput.readInt();
width = pInput.readInt();
height = pInput.readInt();
// This data isn't really useful, unless we're dealing with raw bytes
int widthBytes = pInput.readInt();
@@ -59,7 +59,7 @@ class PSDThumbnail extends PSDImageResource {
// Consistency check
int sizeCompressed = pInput.readInt();
if (sizeCompressed != (mSize - 28)) {
if (sizeCompressed != (size - 28)) {
throw new IIOException("Corrupt thumbnail in PSD document");
}
@@ -72,26 +72,26 @@ class PSDThumbnail extends PSDImageResource {
// TODO: Defer decoding until getThumbnail?
// TODO: Support BGR if id == RES_THUMBNAIL_PS4? Or is that already supported in the JPEG?
mThumbnail = ImageIO.read(IIOUtil.createStreamAdapter(pInput, sizeCompressed));
thumbnail = ImageIO.read(IIOUtil.createStreamAdapter(pInput, sizeCompressed));
}
public final int getWidth() {
return mWidth;
return width;
}
public final int getHeight() {
return mHeight;
return height;
}
public final BufferedImage getThumbnail() {
return mThumbnail;
return thumbnail;
}
@Override
public String toString() {
StringBuilder builder = toStringBuilder();
builder.append(", ").append(mThumbnail);
builder.append(", ").append(thumbnail);
builder.append("]");

View File

@@ -13,7 +13,7 @@ import java.util.List;
* @version $Id: PSDUnicodeAlphaNames.java,v 1.0 Nov 7, 2009 9:16:56 PM haraldk Exp$
*/
final class PSDUnicodeAlphaNames extends PSDImageResource {
List<String> mNames;
List<String> names;
PSDUnicodeAlphaNames(final short pId, final ImageInputStream pInput) throws IOException {
super(pId, pInput);
@@ -21,12 +21,12 @@ final class PSDUnicodeAlphaNames extends PSDImageResource {
@Override
protected void readData(final ImageInputStream pInput) throws IOException {
mNames = new ArrayList<String>();
names = new ArrayList<String>();
long left = mSize;
long left = size;
while (left > 0) {
String name = PSDUtil.readUnicodeString(pInput);
mNames.add(name);
names.add(name);
left -= name.length() * 2 + 4;
}
}

View File

@@ -12,11 +12,11 @@ import java.io.IOException;
*/
final class PSDVersionInfo extends PSDImageResource {
int mVersion;
boolean mHasRealMergedData;
String mWriter;
String mReader;
int mFileVersion;
int version;
boolean hasRealMergedData;
String writer;
String reader;
int fileVersion;
PSDVersionInfo(final short pId, final ImageInputStream pInput) throws IOException {
super(pId, pInput);
@@ -32,24 +32,24 @@ final class PSDVersionInfo extends PSDImageResource {
4 bytes file version.
*/
mVersion = pInput.readInt();
mHasRealMergedData = pInput.readBoolean();
version = pInput.readInt();
hasRealMergedData = pInput.readBoolean();
mWriter = PSDUtil.readUnicodeString(pInput);
mReader = PSDUtil.readUnicodeString(pInput);
writer = PSDUtil.readUnicodeString(pInput);
reader = PSDUtil.readUnicodeString(pInput);
mFileVersion = pInput.readInt();
fileVersion = pInput.readInt();
}
@Override
public String toString() {
StringBuilder builder = toStringBuilder();
builder.append(", version: ").append(mVersion);
builder.append(", hasRealMergedData: ").append(mHasRealMergedData);
builder.append(", writer: ").append(mWriter);
builder.append(", reader: ").append(mReader);
builder.append(", file version: ").append(mFileVersion);
builder.append(", version: ").append(version);
builder.append(", hasRealMergedData: ").append(hasRealMergedData);
builder.append(", writer: ").append(writer);
builder.append(", reader: ").append(reader);
builder.append(", file version: ").append(fileVersion);
builder.append("]");
return builder.toString();

View File

@@ -22,8 +22,8 @@ import java.nio.charset.Charset;
* @see <a href="http://www.adobe.com/devnet/xmp/">Adobe XMP Developer Center</a>
*/
final class PSDXMPData extends PSDImageResource {
protected byte[] mData;
Directory mDirectory;
protected byte[] data;
Directory directory;
PSDXMPData(final short pId, final ImageInputStream pInput) throws IOException {
super(pId, pInput);
@@ -31,21 +31,21 @@ final class PSDXMPData extends PSDImageResource {
@Override
protected void readData(final ImageInputStream pInput) throws IOException {
mData = new byte[(int) mSize]; // TODO: Fix potential overflow, or document why that can't happen (read spec)
//pInput.readFully(mData);
data = new byte[(int) size]; // TODO: Fix potential overflow, or document why that can't happen (read spec)
//pInput.readFully(data);
mDirectory = new XMPReader().read(pInput);
directory = new XMPReader().read(pInput);
}
@Override
public String toString() {
StringBuilder builder = toStringBuilder();
int length = Math.min(256, mData.length);
String data = StringUtil.decode(mData, 0, length, "UTF-8").replace('\n', ' ').replaceAll("\\s+", " ");
int length = Math.min(256, data.length);
String data = StringUtil.decode(this.data, 0, length, "UTF-8").replace('\n', ' ').replaceAll("\\s+", " ");
builder.append(", data: \"").append(data);
if (length < mData.length) {
if (length < this.data.length) {
builder.append("...");
}
@@ -60,6 +60,6 @@ final class PSDXMPData extends PSDImageResource {
* @return the XMP metadata.
*/
public Reader getData() {
return new InputStreamReader(new ByteArrayInputStream(mData), Charset.forName("UTF-8"));
return new InputStreamReader(new ByteArrayInputStream(data), Charset.forName("UTF-8"));
}
}

View File

@@ -22,7 +22,7 @@ import java.io.IOException;
public class JPEGImageReaderTestCase extends ImageReaderAbstractTestCase<JPEGImageReader> {
private static final boolean IS_JAVA_6 = SystemUtil.isClassAvailable("java.util.Deque");
protected JPEGImageReaderSpi mProvider = new JPEGImageReaderSpi();
protected JPEGImageReaderSpi provider = new JPEGImageReaderSpi();
@Override
protected List<TestData> getTestData() {
@@ -33,7 +33,7 @@ public class JPEGImageReaderTestCase extends ImageReaderAbstractTestCase<JPEGIma
@Override
protected ImageReaderSpi createProvider() {
return mProvider;
return provider;
}
@Override
@@ -44,7 +44,7 @@ public class JPEGImageReaderTestCase extends ImageReaderAbstractTestCase<JPEGIma
@Override
protected JPEGImageReader createReader() {
try {
return (JPEGImageReader) mProvider.createReaderInstance();
return (JPEGImageReader) provider.createReaderInstance();
}
catch (IOException e) {
throw new RuntimeException(e);
@@ -54,17 +54,17 @@ public class JPEGImageReaderTestCase extends ImageReaderAbstractTestCase<JPEGIma
// These are NOT correct implementations, but I don't really care here
@Override
protected List<String> getFormatNames() {
return Arrays.asList(mProvider.getFormatNames());
return Arrays.asList(provider.getFormatNames());
}
@Override
protected List<String> getSuffixes() {
return Arrays.asList(mProvider.getFileSuffixes());
return Arrays.asList(provider.getFileSuffixes());
}
@Override
protected List<String> getMIMETypes() {
return Arrays.asList(mProvider.getMIMETypes());
return Arrays.asList(provider.getMIMETypes());
}
@Override

View File

@@ -19,7 +19,7 @@ import java.util.List;
* @version $Id: PNGImageReaderTestCase.java,v 1.0 Oct 9, 2009 3:37:25 PM haraldk Exp$
*/
public class PNGImageReaderTestCase extends ImageReaderAbstractTestCase<PNGImageReader> {
protected PNGImageReaderSpi mProvider = new PNGImageReaderSpi();
protected PNGImageReaderSpi provider = new PNGImageReaderSpi();
@Override
protected List<TestData> getTestData() {
@@ -30,7 +30,7 @@ public class PNGImageReaderTestCase extends ImageReaderAbstractTestCase<PNGImage
@Override
protected ImageReaderSpi createProvider() {
return mProvider;
return provider;
}
@Override
@@ -41,7 +41,7 @@ public class PNGImageReaderTestCase extends ImageReaderAbstractTestCase<PNGImage
@Override
protected PNGImageReader createReader() {
try {
return (PNGImageReader) mProvider.createReaderInstance();
return (PNGImageReader) provider.createReaderInstance();
}
catch (IOException e) {
throw new RuntimeException(e);
@@ -51,17 +51,17 @@ public class PNGImageReaderTestCase extends ImageReaderAbstractTestCase<PNGImage
// These are NOT correct implementations, but I don't really care here
@Override
protected List<String> getFormatNames() {
return Arrays.asList(mProvider.getFormatNames());
return Arrays.asList(provider.getFormatNames());
}
@Override
protected List<String> getSuffixes() {
return Arrays.asList(mProvider.getFileSuffixes());
return Arrays.asList(provider.getFileSuffixes());
}
@Override
protected List<String> getMIMETypes() {
return Arrays.asList(mProvider.getMIMETypes());
return Arrays.asList(provider.getMIMETypes());
}
@Override

View File

@@ -50,12 +50,12 @@ import java.util.Date;
// TODO: Consider moving this one to io.ole2
public final class Catalog implements Iterable<Catalog.CatalogItem> {
private final CatalogHeader mHeader;
private final CatalogItem[] mItems;
private final CatalogHeader header;
private final CatalogItem[] items;
Catalog(final CatalogHeader pHeader, final CatalogItem[] pItems) {
mHeader = pHeader;
mItems = pItems;
header = pHeader;
items = pItems;
}
/**
@@ -95,32 +95,32 @@ public final class Catalog implements Iterable<Catalog.CatalogItem> {
}
public final int getThumbnailCount() {
return mHeader.mThumbCount;
return header.mThumbCount;
}
public final int getMaxThumbnailWidth() {
return mHeader.mThumbWidth;
return header.mThumbWidth;
}
public final int getMaxThumbnailHeight() {
return mHeader.mThumbHeight;
return header.mThumbHeight;
}
final CatalogItem getItem(final int pIndex) {
return mItems[pIndex];
return items[pIndex];
}
final CatalogItem getItem(final String pName) {
return mItems[getIndex(pName)];
return items[getIndex(pName)];
}
final int getItemId(final int pIndex) {
return mItems[pIndex].getItemId();
return items[pIndex].getItemId();
}
public final int getIndex(final String pName) {
for (int i = 0; i < mItems.length; i++) {
CatalogItem item = mItems[i];
for (int i = 0; i < items.length; i++) {
CatalogItem item = items[i];
if (item.getName().equals(pName)) {
return i;
@@ -139,12 +139,12 @@ public final class Catalog implements Iterable<Catalog.CatalogItem> {
}
final String getName(int pItemId) {
return mItems[pItemId - 1].getName();
return items[pItemId - 1].getName();
}
@Override
public String toString() {
return String.format("%s[%s]", getClass().getSimpleName(), mHeader);
return String.format("%s[%s]", getClass().getSimpleName(), header);
}
public Iterator<CatalogItem> iterator() {
@@ -152,11 +152,11 @@ public final class Catalog implements Iterable<Catalog.CatalogItem> {
int mCurrentIdx;
public boolean hasNext() {
return mCurrentIdx < mItems.length;
return mCurrentIdx < items.length;
}
public CatalogItem next() {
return mItems[mCurrentIdx++];
return items[mCurrentIdx++];
}
public void remove() {

View File

@@ -64,14 +64,14 @@ import java.util.SortedSet;
*/
public class ThumbsDBImageReader extends ImageReaderBase {
private static final int THUMBNAIL_OFFSET = 12;
private Entry mRoot;
private Catalog mCatalog;
private Entry root;
private Catalog catalog;
private BufferedImage[] mThumbnails;
private final ImageReader mReader;
private int mCurrentImage = -1;
private BufferedImage[] thumbnails;
private final ImageReader reader;
private int currentImage = -1;
private boolean mLoadEagerly;
private boolean loadEagerly;
public ThumbsDBImageReader() {
this(new ThumbsDBImageReaderSpi());
@@ -79,14 +79,14 @@ public class ThumbsDBImageReader extends ImageReaderBase {
protected ThumbsDBImageReader(final ThumbsDBImageReaderSpi pProvider) {
super(pProvider);
mReader = createJPEGReader(pProvider);
reader = createJPEGReader(pProvider);
initReaderListeners();
}
protected void resetMembers() {
mRoot = null;
mCatalog = null;
mThumbnails = null;
root = null;
catalog = null;
thumbnails = null;
}
private static ImageReader createJPEGReader(final ThumbsDBImageReaderSpi pProvider) {
@@ -94,12 +94,12 @@ public class ThumbsDBImageReader extends ImageReaderBase {
}
public void dispose() {
mReader.dispose();
reader.dispose();
super.dispose();
}
public boolean isLoadEagerly() {
return mLoadEagerly;
return loadEagerly;
}
/**
@@ -113,7 +113,7 @@ public class ThumbsDBImageReader extends ImageReaderBase {
* @param pLoadEagerly {@code true} if the reader should read all thumbs on first read
*/
public void setLoadEagerly(final boolean pLoadEagerly) {
mLoadEagerly = pLoadEagerly;
loadEagerly = pLoadEagerly;
}
/**
@@ -135,19 +135,19 @@ public class ThumbsDBImageReader extends ImageReaderBase {
// Quick look-up
BufferedImage image = null;
if (pIndex < mThumbnails.length) {
image = mThumbnails[pIndex];
if (pIndex < thumbnails.length) {
image = thumbnails[pIndex];
}
if (image == null) {
// Read the image, it's a JFIF stream, inside the OLE 2 CompoundDocument
init(pIndex);
image = mReader.read(0, pParam);
mReader.reset();
image = reader.read(0, pParam);
reader.reset();
if (pParam == null) {
mThumbnails[pIndex] = image; // TODO: Caching is not kosher, as images are mutable!!
thumbnails[pIndex] = image; // TODO: Caching is not kosher, as images are mutable!!
}
}
else {
@@ -193,7 +193,7 @@ public class ThumbsDBImageReader extends ImageReaderBase {
public BufferedImage read(final String pName, final ImageReadParam pParam) throws IOException {
initCatalog();
int index = mCatalog.getIndex(pName);
int index = catalog.getIndex(pName);
if (index < 0) {
throw new FileNotFoundException("Name not found in \"Catalog\" entry: " + pName);
}
@@ -203,39 +203,40 @@ public class ThumbsDBImageReader extends ImageReaderBase {
public void abort() {
super.abort();
mReader.abort();
reader.abort();
}
@Override
public void setInput(Object pInput, boolean pSeekForwardOnly, boolean pIgnoreMetadata) {
super.setInput(pInput, pSeekForwardOnly, pIgnoreMetadata);
public void setInput(Object input, boolean seekForwardOnly, boolean ignoreMetadata) {
super.setInput(input, seekForwardOnly, ignoreMetadata);
if (imageInput != null) {
imageInput.setByteOrder(ByteOrder.LITTLE_ENDIAN);
}
}
private void init(final int pIndex) throws IOException {
if (mCurrentImage == -1 || pIndex != mCurrentImage || mReader.getInput() == null) {
if (currentImage == -1 || pIndex != currentImage || reader.getInput() == null) {
init();
checkBounds(pIndex);
mCurrentImage = pIndex;
currentImage = pIndex;
initReader(pIndex);
}
}
private void initReader(final int pIndex) throws IOException {
String name = mCatalog.getStreamName(pIndex);
Entry entry = mRoot.getChildEntry(name);
init();
String name = catalog.getStreamName(pIndex);
Entry entry = root.getChildEntry(name);
// TODO: It might be possible to speed this up, with less wrapping...
// Use in-memory input stream for max speed, images are small
ImageInputStream input = new MemoryCacheImageInputStream(entry.getInputStream());
input.skipBytes(THUMBNAIL_OFFSET);
mReader.setInput(input);
reader.setInput(input);
}
private void initReaderListeners() {
mReader.addIIOReadProgressListener(new ProgressListenerBase() {
reader.addIIOReadProgressListener(new ProgressListenerBase() {
@Override
public void imageComplete(ImageReader pSource) {
processImageComplete();
@@ -243,7 +244,7 @@ public class ThumbsDBImageReader extends ImageReaderBase {
@Override
public void imageStarted(ImageReader pSource, int pImageIndex) {
processImageStarted(mCurrentImage);
processImageStarted(currentImage);
}
@Override
@@ -262,66 +263,66 @@ public class ThumbsDBImageReader extends ImageReaderBase {
private void init() throws IOException {
assertInput();
if (mRoot == null) {
mRoot = new CompoundDocument(imageInput).getRootEntry();
SortedSet children = mRoot.getChildEntries();
if (root == null) {
root = new CompoundDocument(imageInput).getRootEntry();
SortedSet children = root.getChildEntries();
mThumbnails = new BufferedImage[children.size() - 1];
thumbnails = new BufferedImage[children.size() - 1];
initCatalog();
// NOTE: This is usually slower, unless you need all images
// TODO: Use as many threads as there are CPU cores? :-)
if (mLoadEagerly) {
for (int i = 0; i < mThumbnails.length; i++) {
if (loadEagerly) {
for (int i = 0; i < thumbnails.length; i++) {
initReader(i);
ImageReader reader = mReader;
ImageReader reader = this.reader;
// TODO: If stream was detached, we could probably create a
// new reader, then fire this off in a separate thread...
mThumbnails[i] = reader.read(0, null);
thumbnails[i] = reader.read(0, null);
}
}
}
}
private void initCatalog() throws IOException {
if (mCatalog == null) {
Entry catalog = mRoot.getChildEntry("Catalog");
if (catalog == null) {
Entry catalog = root.getChildEntry("Catalog");
if (catalog.length() <= 16L) {
// TODO: Throw exception? Return empty catalog?
}
mCatalog = Catalog.read(catalog.getInputStream());
this.catalog = Catalog.read(catalog.getInputStream());
}
}
public int getNumImages(boolean pAllowSearch) throws IOException {
if (pAllowSearch) {
public int getNumImages(boolean allowSearch) throws IOException {
if (allowSearch) {
init();
}
return mCatalog != null ? mCatalog.getThumbnailCount() : super.getNumImages(false);
return catalog != null ? catalog.getThumbnailCount() : super.getNumImages(false);
}
public int getWidth(int pIndex) throws IOException {
init(pIndex);
BufferedImage image = mThumbnails[pIndex];
return image != null ? image.getWidth() : mReader.getWidth(0);
BufferedImage image = thumbnails[pIndex];
return image != null ? image.getWidth() : reader.getWidth(0);
}
public int getHeight(int pIndex) throws IOException {
init(pIndex);
BufferedImage image = mThumbnails[pIndex];
return image != null ? image.getHeight() : mReader.getHeight(0);
BufferedImage image = thumbnails[pIndex];
return image != null ? image.getHeight() : reader.getHeight(0);
}
public Iterator<ImageTypeSpecifier> getImageTypes(int pIndex) throws IOException {
init(pIndex);
initReader(pIndex);
return mReader.getImageTypes(0);
return reader.getImageTypes(0);
}
public boolean isPresent(final String pFileName) {
@@ -344,7 +345,7 @@ public class ThumbsDBImageReader extends ImageReaderBase {
}
extension = extension.toLowerCase();
return !"psd".equals(extension) && !"svg".equals(extension) && mCatalog != null && mCatalog.getIndex(pFileName) != -1;
return !"psd".equals(extension) && !"svg".equals(extension) && catalog != null && catalog.getIndex(pFileName) != -1;
}
/// Test code below
@@ -357,7 +358,7 @@ public class ThumbsDBImageReader extends ImageReaderBase {
if (pArgs.length > 1) {
long start = System.currentTimeMillis();
reader.init();
for (Catalog.CatalogItem item : reader.mCatalog) {
for (Catalog.CatalogItem item : reader.catalog) {
reader.read(item.getName(), null);
}
long end = System.currentTimeMillis();
@@ -371,8 +372,8 @@ public class ThumbsDBImageReader extends ImageReaderBase {
long start = System.currentTimeMillis();
reader.init();
for (Catalog.CatalogItem item : reader.mCatalog) {
addImage(panel, reader, reader.mCatalog.getIndex(item.getName()), item.getName());
for (Catalog.CatalogItem item : reader.catalog) {
addImage(panel, reader, reader.catalog.getIndex(item.getName()), item.getName());
}
long end = System.currentTimeMillis();
System.out.println("Time: " + (end - start) + " ms");

View File

@@ -49,7 +49,7 @@ import java.util.Locale;
* @version $Id: ThumbsDBImageReaderSpi.java,v 1.0 28.feb.2006 19:21:05 haku Exp$
*/
public class ThumbsDBImageReaderSpi extends ImageReaderSpi {
private ImageReaderSpi mJPEGProvider;
private ImageReaderSpi jpegProvider;
/**
* Creates a {@code ThumbsDBImageReaderSpi}.
@@ -81,7 +81,7 @@ public class ThumbsDBImageReaderSpi extends ImageReaderSpi {
maybeInitJPEGProvider();
// If this is a OLE 2 CompoundDocument, we could try...
// TODO: How do we know it's thumbs.db format (structure), without reading quite a lot?
return mJPEGProvider != null && CompoundDocument.canRead(pInput);
return jpegProvider != null && CompoundDocument.canRead(pInput);
}
public ImageReader createReaderInstance(Object extension) throws IOException {
@@ -98,7 +98,7 @@ public class ThumbsDBImageReaderSpi extends ImageReaderSpi {
// - Class path lookup of properties file with reader?
// This way we could deregister immediately
if (mJPEGProvider == null) {
if (jpegProvider == null) {
ImageReaderSpi provider = null;
try {
Iterator<ImageReaderSpi> providers = getJPEGProviders();
@@ -117,7 +117,7 @@ public class ThumbsDBImageReaderSpi extends ImageReaderSpi {
// In any case, we deregister the provider if there isn't one
IIORegistry.getDefaultInstance().deregisterServiceProvider(this, ImageReaderSpi.class);
}
mJPEGProvider = provider;
jpegProvider = provider;
}
}
@@ -149,12 +149,12 @@ public class ThumbsDBImageReaderSpi extends ImageReaderSpi {
*/
ImageReader createJPEGReader() {
maybeInitJPEGProvider();
if (mJPEGProvider == null) {
if (jpegProvider == null) {
throw new IllegalStateException("No suitable JPEG reader provider found");
}
try {
return mJPEGProvider.createReaderInstance();
return jpegProvider.createReaderInstance();
}
catch (IOException e) {
// NOTE: The default Sun version never throws IOException here
@@ -170,7 +170,7 @@ public class ThumbsDBImageReaderSpi extends ImageReaderSpi {
// public void onRegistration(ServiceRegistry registry, Class<?> category) {
// System.out.println("ThumbsDBImageReaderSpi.onRegistration");
// maybeInitJPEGProvider();
// if (mJPEGProvider == null) {
// if (jpegProvider == null) {
// System.out.println("Deregistering");
// registry.deregisterServiceProvider(this, ImageReaderSpi.class);
// }