summaryrefslogtreecommitdiffstats
path: root/awt/com/android/internal/awt/AndroidImageDecoder.java
diff options
context:
space:
mode:
Diffstat (limited to 'awt/com/android/internal/awt/AndroidImageDecoder.java')
-rw-r--r--awt/com/android/internal/awt/AndroidImageDecoder.java274
1 files changed, 0 insertions, 274 deletions
diff --git a/awt/com/android/internal/awt/AndroidImageDecoder.java b/awt/com/android/internal/awt/AndroidImageDecoder.java
deleted file mode 100644
index 81b2e1a..0000000
--- a/awt/com/android/internal/awt/AndroidImageDecoder.java
+++ /dev/null
@@ -1,274 +0,0 @@
-/*
- * Copyright 2007, The Android Open Source Project
- *
- * Licensed 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.
- */
-package com.android.internal.awt;
-
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-
-import java.awt.Transparency;
-import java.awt.color.ColorSpace;
-//import java.awt.image.BufferedImage;
-import java.awt.image.ColorModel;
-import java.awt.image.ComponentColorModel;
-import java.awt.image.DataBuffer;
-import java.awt.image.DirectColorModel;
-import java.awt.image.ImageConsumer;
-import java.awt.image.IndexColorModel;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Hashtable;
-
-import org.apache.harmony.awt.gl.image.DecodingImageSource;
-import org.apache.harmony.awt.gl.image.ImageDecoder;
-import org.apache.harmony.awt.internal.nls.Messages;
-
-public class AndroidImageDecoder extends ImageDecoder {
-
- private static final int hintflags =
- ImageConsumer.SINGLEFRAME | // PNG is a static image
- ImageConsumer.TOPDOWNLEFTRIGHT | // This order is only one possible
- ImageConsumer.COMPLETESCANLINES; // Don't deliver incomplete scanlines
-
- // Each pixel is a grayscale sample.
- private static final int PNG_COLOR_TYPE_GRAY = 0;
- // Each pixel is an R,G,B triple.
- private static final int PNG_COLOR_TYPE_RGB = 2;
- // Each pixel is a palette index, a PLTE chunk must appear.
- private static final int PNG_COLOR_TYPE_PLTE = 3;
- // Each pixel is a grayscale sample, followed by an alpha sample.
- private static final int PNG_COLOR_TYPE_GRAY_ALPHA = 4;
- // Each pixel is an R,G,B triple, followed by an alpha sample.
- private static final int PNG_COLOR_TYPE_RGBA = 6;
-
- private static final int NB_OF_LINES_PER_CHUNK = 1; // 0 = full image
-
- Bitmap bm; // The image as decoded by Android
-
- // Header information
- int imageWidth; // Image size
- int imageHeight;
- int colorType; // One of the PNG_ constants from above
- int bitDepth; // Number of bits per color
- byte cmap[]; // The color palette for index color models
- ColorModel model; // The corresponding AWT color model
-
- boolean transferInts; // Is transfer of type int or byte?
- int dataElementsPerPixel;
-
- // Buffers for decoded image data
- byte byteOut[];
- int intOut[];
-
-
- public AndroidImageDecoder(DecodingImageSource src, InputStream is) {
- super(src, is);
- dataElementsPerPixel = 1;
- }
-
- @Override
- /**
- * All the decoding is done in Android
- *
- * AWT???: Method returns only once the image is completly
- * decoded; decoding is not done asynchronously
- */
- public void decodeImage() throws IOException {
- try {
- bm = BitmapFactory.decodeStream(inputStream);
- if (bm == null) {
- throw new IOException("Input stream empty and no image cached");
- }
-
- // Check size
- imageWidth = bm.getWidth();
- imageHeight = bm.getHeight();
- if (imageWidth < 0 || imageHeight < 0 ) {
- throw new RuntimeException("Illegal image size: "
- + imageWidth + ", " + imageHeight);
- }
-
- // We got the image fully decoded; now send all image data to AWT
- setDimensions(imageWidth, imageHeight);
- model = createColorModel();
- setColorModel(model);
- setHints(hintflags);
- setProperties(new Hashtable<Object, Object>()); // Empty
- sendPixels(NB_OF_LINES_PER_CHUNK != 0 ? NB_OF_LINES_PER_CHUNK : imageHeight);
- imageComplete(ImageConsumer.STATICIMAGEDONE);
- } catch (IOException e) {
- throw e;
- } catch (RuntimeException e) {
- imageComplete(ImageConsumer.IMAGEERROR);
- throw e;
- } finally {
- closeStream();
- }
- }
-
- /**
- * Create the AWT color model
- *
- * ???AWT: Android Bitmaps are always of type: ARGB-8888-Direct color model
- *
- * However, we leave the code here for a more powerfull decoder
- * that returns a native model, and the conversion is then handled
- * in AWT. With such a decoder, we would need to get the colorType,
- * the bitDepth, (and the color palette for an index color model)
- * from the image and construct the correct color model here.
- */
- private ColorModel createColorModel() {
- ColorModel cm = null;
- int bmModel = 5; // TODO This doesn't exist: bm.getColorModel();
- cmap = null;
-
- switch (bmModel) {
- // A1_MODEL
- case 1:
- colorType = PNG_COLOR_TYPE_GRAY;
- bitDepth = 1;
- break;
-
- // A8_MODEL
- case 2:
- colorType = PNG_COLOR_TYPE_GRAY_ALPHA;
- bitDepth = 8;
- break;
-
- // INDEX8_MODEL
- // RGB_565_MODEL
- // ARGB_8888_MODEL
- case 3:
- case 4:
- case 5:
- colorType = bm.hasAlpha() ? PNG_COLOR_TYPE_RGBA : PNG_COLOR_TYPE_RGB;
- bitDepth = 8;
- break;
-
- default:
- // awt.3C=Unknown PNG color type
- throw new IllegalArgumentException(Messages.getString("awt.3C")); //$NON-NLS-1$
- }
-
- switch (colorType) {
-
- case PNG_COLOR_TYPE_GRAY: {
- if (bitDepth != 8 && bitDepth != 4 && bitDepth != 2 && bitDepth != 1) {
- // awt.3C=Unknown PNG color type
- throw new IllegalArgumentException(Messages.getString("awt.3C")); //$NON-NLS-1$
- }
-
- // Create gray color model
- int numEntries = 1 << bitDepth;
- int scaleFactor = 255 / (numEntries-1);
- byte comps[] = new byte[numEntries];
- for (int i = 0; i < numEntries; i++) {
- comps[i] = (byte) (i * scaleFactor);
- }
- cm = new IndexColorModel(bitDepth, numEntries, comps, comps, comps);
-
- transferInts = false;
- break;
- }
-
- case PNG_COLOR_TYPE_RGB: {
- if (bitDepth != 8) {
- // awt.3C=Unknown PNG color type
- throw new IllegalArgumentException(Messages.getString("awt.3C")); //$NON-NLS-1$
- }
-
- cm = new DirectColorModel(24, 0xff0000, 0xFF00, 0xFF);
-
- transferInts = true;
- break;
- }
-
- case PNG_COLOR_TYPE_PLTE: {
- if (bitDepth != 8 && bitDepth != 4 && bitDepth != 2 && bitDepth != 1) {
- // awt.3C=Unknown PNG color type
- throw new IllegalArgumentException(Messages.getString("awt.3C")); //$NON-NLS-1$
- }
-
- if (cmap == null) {
- throw new IllegalStateException("Palette color type is not supported");
- }
-
- cm = new IndexColorModel(bitDepth, cmap.length / 3, cmap, 0, false);
-
- transferInts = false;
- break;
- }
-
- case PNG_COLOR_TYPE_GRAY_ALPHA: {
- if (bitDepth != 8) {
- // awt.3C=Unknown PNG color type
- throw new IllegalArgumentException(Messages.getString("awt.3C")); //$NON-NLS-1$
- }
-
- cm = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_GRAY),
- true, false,
- Transparency.TRANSLUCENT,
- DataBuffer.TYPE_BYTE);
-
- transferInts = false;
- dataElementsPerPixel = 2;
- break;
- }
-
- case PNG_COLOR_TYPE_RGBA: {
- if (bitDepth != 8) {
- // awt.3C=Unknown PNG color type
- throw new IllegalArgumentException(Messages.getString("awt.3C")); //$NON-NLS-1$
- }
-
- cm = ColorModel.getRGBdefault();
-
- transferInts = true;
- break;
- }
- default:
- // awt.3C=Unknown PNG color type
- throw new IllegalArgumentException(Messages.getString("awt.3C")); //$NON-NLS-1$
- }
-
- return cm;
- }
-
- private void sendPixels(int nbOfLinesPerChunk) {
- int w = imageWidth;
- int h = imageHeight;
- int n = 1;
- if (nbOfLinesPerChunk > 0 && nbOfLinesPerChunk <= h) {
- n = nbOfLinesPerChunk;
- }
-
- if (transferInts) {
- // Create output buffer
- intOut = new int[w * n];
- for (int yi = 0; yi < h; yi += n) {
- // Last chunk might contain less liness
- if (n > 1 && h - yi < n ) {
- n = h - yi;
- }
- bm.getPixels(intOut, 0, w, 0, yi, w, n);
- setPixels(0, yi, w, n, model, intOut, 0, w);
- }
- } else {
- // Android bitmaps always store ints (ARGB-8888 direct model)
- throw new RuntimeException("Byte transfer not supported");
- }
- }
-
-}