Skip to main content
summaryrefslogtreecommitdiffstats
blob: 48a9adb86b77974997d7cdc2b09301b7211b9940 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package org.eclipse.swt.internal.image;

/*
 * (c) Copyright IBM Corp. 2000, 2001.
 * All Rights Reserved
 */

import org.eclipse.swt.*;

public class PngChunkReader {
	LEDataInputStream inputStream;
	PngFileReadState readState;
	PngIhdrChunk headerChunk;
	PngPlteChunk paletteChunk;
	
PngChunkReader(LEDataInputStream inputStream) {
	this.inputStream = inputStream;
	readState = new PngFileReadState();
	headerChunk = null;
}

PngIhdrChunk getIhdrChunk() {
	if (headerChunk == null) {
		try { 
			PngChunk chunk = PngChunk.readNextFromStream(inputStream);
			headerChunk = (PngIhdrChunk) chunk;
			headerChunk.validate(readState, null);
		} catch (ClassCastException e) {
			SWT.error(SWT.ERROR_INVALID_IMAGE);
		}
	}
	return headerChunk;
}

PngChunk readNextChunk() {
	if (headerChunk == null) return getIhdrChunk();
	
	PngChunk chunk = PngChunk.readNextFromStream(inputStream);
	switch (chunk.getChunkType()) {
		case PngChunk.CHUNK_tRNS:
			((PngTrnsChunk) chunk).validate(readState, headerChunk, paletteChunk);
			break;
		case PngChunk.CHUNK_PLTE:
			chunk.validate(readState, headerChunk);
			paletteChunk = (PngPlteChunk) chunk;
			break;
		default:
			chunk.validate(readState, headerChunk);
	}
	if (readState.readIDAT && !(chunk.getChunkType() == PngChunk.CHUNK_IDAT)) {
		readState.readPixelData = true;
	}
	return chunk;
}

boolean readPixelData() {
	return readState.readPixelData;
}

boolean hasMoreChunks() {
	return !readState.readIEND;
}

}

Back to the top