blob: 8c41b83d22babf4a4dde264c34886e088eed7f6d (
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
package org.eclipse.swt.internal.image;
import org.eclipse.swt.*;
import org.eclipse.swt.graphics.*;
/*
* Licensed Materials - Property of IBM,
* (c) Copyright IBM Corp. 1998, 2000 All Rights Reserved
*/
class PngPlteChunk extends PngChunk {
PngPlteChunk(byte[] reference){
super(reference);
}
/**
* Get the number of colors in this palette.
*/
int getPaletteSize() {
return getLength() / 3;
}
/**
* Get a PaletteData object representing the colors
* stored in this PLTE chunk.
* The result should be cached as the PLTE chunk
* does not store the palette data created.
*/
PaletteData getPaletteData() {
RGB[] rgbs = new RGB[getPaletteSize()];
int start = DATA_OFFSET;
int end = DATA_OFFSET + getLength();
for (int i = 0; i < rgbs.length; i++) {
int offset = DATA_OFFSET + (i * 3);
int red = reference[offset] & 0xFF;
int green = reference[offset + 1] & 0xFF;
int blue = reference[offset + 2] & 0xFF;
rgbs[i] = new RGB(red, green, blue);
}
return new PaletteData(rgbs);
}
/**
* Answer whether the chunk is a valid PLTE chunk.
*/
void validate(PngFileReadState readState, PngIhdrChunk headerChunk) {
// A PLTE chunk is invalid if no IHDR has been read or if any PLTE,
// IDAT, or IEND chunk has been read.
if (!readState.readIHDR
|| readState.readPLTE
|| readState.readTRNS
|| readState.readBKGD
|| readState.readIDAT
|| readState.readIEND)
{
SWT.error(SWT.ERROR_INVALID_IMAGE);
} else {
readState.readPLTE = true;
}
super.validate(readState, headerChunk);
// Palettes cannot be included in grayscale images.
if (!headerChunk.getCanHavePalette()) SWT.error(SWT.ERROR_INVALID_IMAGE);
// Palette chunks' data fields must be event multiples
// of 3. Each 3-byte group represents an RGB value.
if (getLength() % 3 != 0) SWT.error(SWT.ERROR_INVALID_IMAGE);
// Palettes cannot have more entries than 2^bitDepth
// where bitDepth is the bit depth of the image given
// in the IHDR chunk.
if (Math.pow(2, headerChunk.getBitDepth()) < getPaletteSize()) {
SWT.error(SWT.ERROR_INVALID_IMAGE);
}
// Palettes cannot have more than 256 entries.
if (256 < getPaletteSize()) SWT.error(SWT.ERROR_INVALID_IMAGE);
}
void contributeToString(StringBuffer buffer) {
buffer.append("\n\tPalette size:");
buffer.append(getPaletteSize());
}
}
|