summaryrefslogtreecommitdiffstats
path: root/awt/org/apache/harmony/awt/gl/image/JpegDecoder.java
diff options
context:
space:
mode:
Diffstat (limited to 'awt/org/apache/harmony/awt/gl/image/JpegDecoder.java')
-rw-r--r--awt/org/apache/harmony/awt/gl/image/JpegDecoder.java231
1 files changed, 0 insertions, 231 deletions
diff --git a/awt/org/apache/harmony/awt/gl/image/JpegDecoder.java b/awt/org/apache/harmony/awt/gl/image/JpegDecoder.java
deleted file mode 100644
index 2e64427..0000000
--- a/awt/org/apache/harmony/awt/gl/image/JpegDecoder.java
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
-* Licensed to the Apache Software Foundation (ASF) under one or more
-* contributor license agreements. See the NOTICE file distributed with
-* this work for additional information regarding copyright ownership.
-* The ASF licenses this file to You under the Apache License, Version 2.0
-* (the "License"); you may not use this file except in compliance with
-* the License. You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-/**
- * @author Oleg V. Khaschansky
- * @version $Revision$
- */
-package org.apache.harmony.awt.gl.image;
-
-import java.awt.image.*;
-import java.awt.color.ColorSpace;
-import java.awt.*;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Hashtable;
-
-import org.apache.harmony.awt.internal.nls.Messages;
-
-public class JpegDecoder extends ImageDecoder {
- // Only 2 output colorspaces expected. Others are converted into
- // these ones.
- // 1. Grayscale
- public static final int JCS_GRAYSCALE = 1;
- // 2. RGB
- public static final int JCS_RGB = 2;
-
- // Flags for the consumer, progressive JPEG
- private static final int hintflagsProgressive =
- ImageConsumer.SINGLEFRAME | // JPEG is a static image
- ImageConsumer.TOPDOWNLEFTRIGHT | // This order is only one possible
- ImageConsumer.COMPLETESCANLINES; // Don't deliver incomplete scanlines
- // Flags for the consumer, singlepass JPEG
- private static final int hintflagsSingle =
- ImageConsumer.SINGLEPASS |
- hintflagsProgressive;
-
- // Buffer for the stream
- private static final int BUFFER_SIZE = 1024;
- private byte buffer[] = new byte[BUFFER_SIZE];
-
- // 3 possible color models only
- private static ColorModel cmRGB;
- private static ColorModel cmGray;
-
- // initializes proper field IDs
- private static native void initIDs();
-
- // Pointer to native structure which store decoding state
- // between subsequent decoding/IO-suspension cycles
- private long hNativeDecoder = 0; // NULL initially
-
- private boolean headerDone = false;
-
- // Next 4 members are filled by the native method (decompress).
- // We can simply check if imageWidth is still negative to find
- // out if they are already filled.
- private int imageWidth = -1;
- private int imageHeight = -1;
- private boolean progressive = false;
- private int jpegColorSpace = 0;
-
- // Stores number of bytes consumed by the native decoder
- private int bytesConsumed = 0;
- // Stores current scanline returned by the decoder
- private int currScanline = 0;
-
- private ColorModel cm = null;
-
- static {
- System.loadLibrary("jpegdecoder"); //$NON-NLS-1$
-
- cmGray = new ComponentColorModel(
- ColorSpace.getInstance(ColorSpace.CS_GRAY),
- false, false,
- Transparency.OPAQUE, DataBuffer.TYPE_BYTE
- );
-
- // Create RGB color model
- cmRGB = new DirectColorModel(24, 0xFF0000, 0xFF00, 0xFF);
-
- initIDs();
- }
-
- public JpegDecoder(DecodingImageSource src, InputStream is) {
- super(src, is);
- }
-
- /*
- public JpegDecoder(InputStream iStream, ImageConsumer iConsumer) {
- inputStream = iStream;
- consumer = iConsumer;
- }
- */
-
- /**
- * @return - not NULL if call is successful
- */
- private native Object decode(
- byte[] input,
- int bytesInBuffer,
- long hDecoder);
-
- private static native void releaseNativeDecoder(long hDecoder);
-
- @Override
- public void decodeImage() throws IOException {
- try {
- int bytesRead = 0, dataLength = 0;
- boolean eosReached = false;
- int needBytes, offset, bytesInBuffer = 0;
- byte byteOut[] = null;
- int intOut[] = null;
- // Read from the input stream
- for (;;) {
- needBytes = BUFFER_SIZE - bytesInBuffer;
- offset = bytesInBuffer;
-
- bytesRead = inputStream.read(buffer, offset, needBytes);
-
- if (bytesRead < 0) {
- bytesRead = 0;//break;
- eosReached = true;
- } // Don't break, maybe something left in buffer
-
- // Keep track on how much bytes left in buffer
- bytesInBuffer += bytesRead;
-
- // Here we pass overall number of bytes left in the java buffer
- // (bytesInBuffer) since jpeg decoder has its own buffer and consumes
- // as many bytes as it can. If there are any unconsumed bytes
- // it didn't add them to its buffer...
- Object arr = decode(
- buffer,
- bytesInBuffer,
- hNativeDecoder);
-
- // Keep track on how much bytes left in buffer
- bytesInBuffer -= bytesConsumed;
-
- if (!headerDone && imageWidth != -1) {
- returnHeader();
- headerDone = true;
- }
-
- if (bytesConsumed < 0) {
- break; // Error exit
- }
-
- if (arr instanceof byte[]) {
- byteOut = (byte[]) arr;
- dataLength = byteOut.length;
- returnData(byteOut, currScanline);
- } else if (arr instanceof int[]) {
- intOut = (int[]) arr;
- dataLength = intOut.length;
- returnData(intOut, currScanline);
- } else {
- dataLength = 0;
- }
-
- if (hNativeDecoder == 0) {
- break;
- }
-
- if (dataLength == 0 && eosReached) {
- releaseNativeDecoder(hNativeDecoder);
- break; // Probably image is truncated
- }
- }
- imageComplete(ImageConsumer.STATICIMAGEDONE);
- } catch (IOException e) {
- throw e;
- } finally {
- closeStream();
- }
- }
-
- public void returnHeader() {
- setDimensions(imageWidth, imageHeight);
-
- switch (jpegColorSpace) {
- case JCS_GRAYSCALE: cm = cmGray; break;
- case JCS_RGB: cm = cmRGB; break;
- default:
- // awt.3D=Unknown colorspace
- throw new IllegalArgumentException(Messages.getString("awt.3D")); //$NON-NLS-1$
- }
- setColorModel(cm);
-
- setHints(progressive ? hintflagsProgressive : hintflagsSingle);
-
- setProperties(new Hashtable<Object, Object>()); // Empty
- }
-
- // Send the data to the consumer
- public void returnData(int data[], int currScanLine) {
- // Send 1 or more scanlines to the consumer.
- int numScanlines = data.length / imageWidth;
- if (numScanlines > 0) {
- setPixels(
- 0, currScanLine - numScanlines,
- imageWidth, numScanlines,
- cm, data, 0, imageWidth
- );
- }
- }
-
- public void returnData(byte data[], int currScanLine) {
- int numScanlines = data.length / imageWidth;
- if (numScanlines > 0) {
- setPixels(
- 0, currScanLine - numScanlines,
- imageWidth, numScanlines,
- cm, data, 0, imageWidth
- );
- }
- }
-}