001: /*
002: * $Id: JPEGHelper.java,v 1.2 2002/02/15 23:44:28 skavish Exp $
003: *
004: * ===========================================================================
005: *
006: * The JGenerator Software License, Version 1.0
007: *
008: * Copyright (c) 2000 Dmitry Skavish (skavish@usa.net). All rights reserved.
009: *
010: * Redistribution and use in source and binary forms, with or without
011: * modification, are permitted provided that the following conditions are met:
012: *
013: * 1. Redistributions of source code must retain the above copyright
014: * notice, this list of conditions and the following disclaimer.
015: *
016: * 2. Redistributions in binary form must reproduce the above copyright
017: * notice, this list of conditions and the following disclaimer in
018: * the documentation and/or other materials provided with the
019: * distribution.
020: *
021: * 3. The end-user documentation included with the redistribution, if
022: * any, must include the following acknowlegement:
023: * "This product includes software developed by Dmitry Skavish
024: * (skavish@usa.net, http://www.flashgap.com/)."
025: * Alternately, this acknowlegement may appear in the software itself,
026: * if and wherever such third-party acknowlegements normally appear.
027: *
028: * 4. The name "The JGenerator" must not be used to endorse or promote
029: * products derived from this software without prior written permission.
030: * For written permission, please contact skavish@usa.net.
031: *
032: * 5. Products derived from this software may not be called "The JGenerator"
033: * nor may "The JGenerator" appear in their names without prior written
034: * permission of Dmitry Skavish.
035: *
036: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
037: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
038: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
039: * DISCLAIMED. IN NO EVENT SHALL DMITRY SKAVISH OR THE OTHER
040: * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
041: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
042: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
043: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
044: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
045: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
046: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
047: * SUCH DAMAGE.
048: *
049: */
050:
051: package org.openlaszlo.iv.flash.util;
052:
053: import org.openlaszlo.iv.flash.api.*;
054: import org.openlaszlo.iv.flash.api.image.*;
055: import java.io.*;
056:
057: /**
058: * Simple JPEG scanner helping in extracting image's width and height.
059: *
060: * @author Dmitry Skavish
061: */
062: public class JPEGHelper {
063:
064: public static final int M_SOF0 = 0xC0;
065: public static final int M_SOF1 = 0xC1;
066: public static final int M_SOF2 = 0xC2;
067: public static final int M_SOF3 = 0xC3;
068: public static final int M_SOF5 = 0xC5;
069: public static final int M_SOF6 = 0xC6;
070: public static final int M_SOF7 = 0xC7;
071: public static final int M_SOF9 = 0xC9;
072: public static final int M_SOF10 = 0xCA;
073: public static final int M_SOF11 = 0xCB;
074: public static final int M_SOF13 = 0xCD;
075: public static final int M_SOF14 = 0xCE;
076: public static final int M_SOF15 = 0xCF;
077: public static final int M_SOI = 0xD8;
078: public static final int M_EOI = 0xD9;
079: public static final int M_SOS = 0xDA;
080: public static final int M_APP14 = 0xEE;
081:
082: public static JPEGBitmap.JPEGInfo getInfo(byte[] b, int p, int end) {
083: if (Util.getUByte(b[p]) != 0xff
084: || Util.getUByte(b[p + 1]) != M_SOI)
085: return null;
086:
087: JPEGBitmap.JPEGInfo info = new JPEGBitmap.JPEGInfo();
088: // Default to progressive
089: info.type = 1;
090:
091: p += 2; // skip SOI
092: // Find SOF0 marker
093: while (p < end) {
094: if (Util.getUByte(b[p]) == 0xff) {
095: int id = Util.getUByte(b[p + 1]);
096: int len = Util.getUWord(b[p + 3], b[p + 2]);
097: switch (id) {
098: case M_EOI:
099: return info; // no SOF0
100: case M_SOF0:
101: case M_SOF1:
102: case M_SOF3:
103: case M_SOF5:
104: case M_SOF7:
105: case M_SOF9:
106: case M_SOF11:
107: case M_SOF13:
108: case M_SOF15:
109: // Not progressive
110: info.type = 0;
111: // Fall through
112: case M_SOF2:
113: case M_SOF6:
114: case M_SOF10:
115: case M_SOF14: {
116: info.precision = b[p + 4];
117: info.height = Util.getUWord(b[p + 6], b[p + 5]);
118: info.width = Util.getUWord(b[p + 8], b[p + 7]);
119: info.num_comps = Util.getUByte(b[p + 9]);
120: //compID[0] = GB(fp+10);
121: //compID[1] = GB(fp+13);
122: //compID[2] = GB(fp+16);
123: return info;
124: }
125: }
126: p += len + 2;
127: } else {
128: p++;
129: }
130: }
131:
132: return info;
133: }
134: }
|