001: /*******************************************************************************
002: * Copyright (c) 2000, 2005 IBM Corporation and others.
003: * All rights reserved. This program and the accompanying materials
004: * are made available under the terms of the Eclipse Public License v1.0
005: * which accompanies this distribution, and is available at
006: * http://www.eclipse.org/legal/epl-v10.html
007: *
008: * Contributors:
009: * IBM Corporation - initial API and implementation
010: *******************************************************************************/package org.eclipse.swt.internal.image;
011:
012: import org.eclipse.swt.*;
013:
014: final class JPEGScanHeader extends JPEGVariableSizeSegment {
015: public int[][] componentParameters;
016:
017: public JPEGScanHeader(byte[] reference) {
018: super (reference);
019: }
020:
021: public JPEGScanHeader(LEDataInputStream byteStream) {
022: super (byteStream);
023: initializeComponentParameters();
024: }
025:
026: public int getApproxBitPositionHigh() {
027: return reference[(2 * getNumberOfImageComponents()) + 7] >> 4;
028: }
029:
030: public int getApproxBitPositionLow() {
031: return reference[(2 * getNumberOfImageComponents()) + 7] & 0xF;
032: }
033:
034: public int getEndOfSpectralSelection() {
035: return reference[(2 * getNumberOfImageComponents()) + 6];
036: }
037:
038: public int getNumberOfImageComponents() {
039: return reference[4];
040: }
041:
042: public int getStartOfSpectralSelection() {
043: return reference[(2 * getNumberOfImageComponents()) + 5];
044: }
045:
046: /* Used when decoding. */
047: void initializeComponentParameters() {
048: int compCount = getNumberOfImageComponents();
049: componentParameters = new int[0][];
050: for (int i = 0; i < compCount; i++) {
051: int ofs = 5 + i * 2;
052: int cid = reference[ofs] & 0xFF;
053: int dc = (reference[ofs + 1] & 0xFF) >> 4;
054: int ac = reference[ofs + 1] & 0xF;
055: if (componentParameters.length <= cid) {
056: int[][] newParams = new int[cid + 1][];
057: System.arraycopy(componentParameters, 0, newParams, 0,
058: componentParameters.length);
059: componentParameters = newParams;
060: }
061: componentParameters[cid] = new int[] { dc, ac };
062: }
063: }
064:
065: /* Used when encoding. */
066: public void initializeContents() {
067: int compCount = getNumberOfImageComponents();
068: int[][] compSpecParams = componentParameters;
069: if (compCount == 0 || compCount != compSpecParams.length) {
070: SWT.error(SWT.ERROR_INVALID_IMAGE);
071: }
072: for (int i = 0; i < compCount; i++) {
073: int ofs = i * 2 + 5;
074: int[] compParams = compSpecParams[i];
075: reference[ofs] = (byte) (i + 1);
076: reference[ofs + 1] = (byte) (compParams[0] * 16 + compParams[1]);
077: }
078: }
079:
080: public void setEndOfSpectralSelection(int anInteger) {
081: reference[(2 * getNumberOfImageComponents()) + 6] = (byte) anInteger;
082: }
083:
084: public void setNumberOfImageComponents(int anInteger) {
085: reference[4] = (byte) (anInteger & 0xFF);
086: }
087:
088: public void setStartOfSpectralSelection(int anInteger) {
089: reference[(2 * getNumberOfImageComponents()) + 5] = (byte) anInteger;
090: }
091:
092: public int signature() {
093: return JPEGFileFormat.SOS;
094: }
095:
096: public boolean verifyProgressiveScan() {
097: int start = getStartOfSpectralSelection();
098: int end = getEndOfSpectralSelection();
099: int low = getApproxBitPositionLow();
100: int high = getApproxBitPositionHigh();
101: int count = getNumberOfImageComponents();
102: if ((start == 0 && end == 00) || (start <= end && end <= 63)) {
103: if (low <= 13 && high <= 13
104: && (high == 0 || high == low + 1)) {
105: return start == 0 || (start > 0 && count == 1);
106: }
107: }
108: return false;
109: }
110:
111: public boolean isACProgressiveScan() {
112: return getStartOfSpectralSelection() != 0
113: && getEndOfSpectralSelection() != 0;
114: }
115:
116: public boolean isDCProgressiveScan() {
117: return getStartOfSpectralSelection() == 0
118: && getEndOfSpectralSelection() == 0;
119: }
120:
121: public boolean isFirstScan() {
122: return getApproxBitPositionHigh() == 0;
123: }
124:
125: }
|