blob: ae8d25d88474b8d635d4d5710f5a05b34add167c (
plain)
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
/*******************************************************************************
* Copyright (c) 2000, 2005 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.swt.internal.image;
import org.eclipse.swt.*;
final class JPEGScanHeader extends JPEGVariableSizeSegment {
public int[][] componentParameters;
public JPEGScanHeader(byte[] reference) {
super(reference);
}
public JPEGScanHeader(LEDataInputStream byteStream) {
super(byteStream);
initializeComponentParameters();
}
public int getApproxBitPositionHigh() {
return reference[(2 * getNumberOfImageComponents()) + 7] >> 4;
}
public int getApproxBitPositionLow() {
return reference[(2 * getNumberOfImageComponents()) + 7] & 0xF;
}
public int getEndOfSpectralSelection() {
return reference[(2 * getNumberOfImageComponents()) + 6];
}
public int getNumberOfImageComponents() {
return reference[4];
}
public int getStartOfSpectralSelection() {
return reference[(2 * getNumberOfImageComponents()) + 5];
}
/* Used when decoding. */
void initializeComponentParameters() {
int compCount = getNumberOfImageComponents();
componentParameters = new int[0][];
for (int i = 0; i < compCount; i++) {
int ofs = 5 + i * 2;
int cid = reference[ofs] & 0xFF;
int dc = (reference[ofs + 1] & 0xFF) >> 4;
int ac = reference[ofs + 1] & 0xF;
if (componentParameters.length <= cid) {
int[][] newParams = new int[cid + 1][];
System.arraycopy(componentParameters, 0, newParams, 0, componentParameters.length);
componentParameters = newParams;
}
componentParameters[cid] = new int[] { dc, ac };
}
}
/* Used when encoding. */
public void initializeContents() {
int compCount = getNumberOfImageComponents();
int[][] compSpecParams = componentParameters;
if (compCount == 0 || compCount != compSpecParams.length) {
SWT.error(SWT.ERROR_INVALID_IMAGE);
}
for (int i = 0; i < compCount; i++) {
int ofs = i * 2 + 5;
int[] compParams = compSpecParams[i];
reference[ofs] = (byte)(i + 1);
reference[ofs + 1] = (byte)(compParams[0] * 16 + compParams[1]);
}
}
public void setEndOfSpectralSelection(int anInteger) {
reference[(2 * getNumberOfImageComponents()) + 6] = (byte)anInteger;
}
public void setNumberOfImageComponents(int anInteger) {
reference[4] = (byte)(anInteger & 0xFF);
}
public void setStartOfSpectralSelection(int anInteger) {
reference[(2 * getNumberOfImageComponents()) + 5] = (byte)anInteger;
}
public int signature() {
return JPEGFileFormat.SOS;
}
public boolean verifyProgressiveScan() {
int start = getStartOfSpectralSelection();
int end = getEndOfSpectralSelection();
int low = getApproxBitPositionLow();
int high = getApproxBitPositionHigh();
int count = getNumberOfImageComponents();
if ((start == 0 && end == 00) || (start <= end && end <= 63)) {
if (low <= 13 && high <= 13 && (high == 0 || high == low + 1)) {
return start == 0 || (start > 0 && count == 1);
}
}
return false;
}
public boolean isACProgressiveScan() {
return getStartOfSpectralSelection() != 0 && getEndOfSpectralSelection() != 0;
}
public boolean isDCProgressiveScan() {
return getStartOfSpectralSelection() == 0 && getEndOfSpectralSelection() == 0;
}
public boolean isFirstScan() {
return getApproxBitPositionHigh() == 0;
}
}
|