Package com.google.code.appengine.awt.image

Source Code of com.google.code.appengine.awt.image.SinglePixelPackedSampleModel

/*
*  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 Igor V. Stolyarov
*/
package com.google.code.appengine.awt.image;

import java.util.Arrays;

import org.apache.harmony.awt.internal.nls.Messages;

import com.google.code.appengine.awt.image.DataBuffer;
import com.google.code.appengine.awt.image.DataBufferByte;
import com.google.code.appengine.awt.image.DataBufferInt;
import com.google.code.appengine.awt.image.DataBufferUShort;
import com.google.code.appengine.awt.image.RasterFormatException;
import com.google.code.appengine.awt.image.SampleModel;
import com.google.code.appengine.awt.image.SinglePixelPackedSampleModel;


public class SinglePixelPackedSampleModel extends SampleModel {

    private int bitMasks[];

    private int bitOffsets[];

    private int bitSizes[];

    private int scanlineStride;

    private int maxBitSize;

    public SinglePixelPackedSampleModel(int dataType, int w, int h,
            int bitMasks[]) {
        this(dataType, w, h, w, bitMasks);
    }

    public SinglePixelPackedSampleModel(int dataType, int w, int h,
            int scanlineStride, int bitMasks[]) {

        super(dataType, w, h, bitMasks.length);

        if (dataType != DataBuffer.TYPE_BYTE &&
                dataType != DataBuffer.TYPE_USHORT &&
                dataType != DataBuffer.TYPE_INT) {
            // awt.61=Unsupported data type: {0}
            throw new IllegalArgumentException(Messages.getString("awt.61", //$NON-NLS-1$
                    dataType));
        }

        this.scanlineStride = scanlineStride;
        this.bitMasks = bitMasks.clone();
        this.bitOffsets = new int[this.numBands];
        this.bitSizes = new int[this.numBands];

        this.maxBitSize = 0;

        for (int i = 0; i < this.numBands; i++) {
            int offset = 0;
            int size = 0;
            int mask = bitMasks[i];

            if (mask != 0) {
                while ((mask & 1) == 0) {
                    mask >>>= 1;
                    offset++;
                }

                while ((mask & 1) == 1) {
                    mask >>>= 1;
                    size++;
                }

                if (mask != 0) {
                    // awt.62=Wrong mask : {0}
                    throw new IllegalArgumentException(Messages.getString(
                            "awt.62", bitMasks[i])); //$NON-NLS-1$
                }
            }

            this.bitOffsets[i] = offset;
            this.bitSizes[i] = size;

            if (this.maxBitSize < size) {
                this.maxBitSize = size;
            }

        }

    }

    @Override
    public Object getDataElements(int x, int y, Object obj, DataBuffer data) {
        if (x < 0 || y < 0 || x >= this.width || y >= this.height) {
            // awt.63=Coordinates are not in bounds
            throw new ArrayIndexOutOfBoundsException(Messages.getString("awt.63")); //$NON-NLS-1$
        }
        switch (getTransferType()) {
        case DataBuffer.TYPE_BYTE:
            byte bdata[];
            if (obj == null) {
                bdata = new byte[1];
            } else {
                bdata = (byte[]) obj;
            }

            bdata[0] = (byte) data.getElem(y * scanlineStride + x);
            obj = bdata;
            break;
        case DataBuffer.TYPE_USHORT:
            short sdata[];
            if (obj == null) {
                sdata = new short[1];
            } else {
                sdata = (short[]) obj;
            }

            sdata[0] = (short) data.getElem(y * scanlineStride + x);
            obj = sdata;
            break;
        case DataBuffer.TYPE_INT:
            int idata[];
            if (obj == null) {
                idata = new int[1];
            } else {
                idata = (int[]) obj;
            }

            idata[0] = data.getElem(y * scanlineStride + x);
            obj = idata;
            break;
        }
        return obj;
    }

    @Override
    public void setDataElements(int x, int y, Object obj, DataBuffer data) {
        if (x < 0 || y < 0 || x >= this.width || y >= this.height) {
            // awt.63=Coordinates are not in bounds
            throw new ArrayIndexOutOfBoundsException(Messages.getString("awt.63")); //$NON-NLS-1$
        }
        switch (getTransferType()) {
        case DataBuffer.TYPE_BYTE:
            data.setElem(y * scanlineStride + x, ((byte[]) obj)[0] & 0xff);
            break;
        case DataBuffer.TYPE_USHORT:
            data.setElem(y * scanlineStride + x, ((short[]) obj)[0] & 0xffff);
            break;
        case DataBuffer.TYPE_INT:
            data.setElem(y * scanlineStride + x, ((int[]) obj)[0]);
            break;
        }
    }

    @Override
    public boolean equals(Object o) {
        if ((o == null) || !(o instanceof SinglePixelPackedSampleModel)) {
            return false;
        }

        SinglePixelPackedSampleModel model = (SinglePixelPackedSampleModel) o;
        return this.width == model.width &&
                this.height == model.height &&
                this.numBands == model.numBands &&
                this.dataType == model.dataType &&
                Arrays.equals(this.bitMasks, model.bitMasks) &&
                Arrays.equals(this.bitOffsets, model.bitOffsets) &&
                Arrays.equals(this.bitSizes, model.bitSizes) &&
                this.scanlineStride == model.scanlineStride;
    }

    @Override
    public SampleModel createSubsetSampleModel(int bands[]) {
        if (bands.length > this.numBands) {
            // awt.64=The number of the bands in the subset is greater than the number of bands in the sample model
            throw new RasterFormatException(Messages.getString("awt.64")); //$NON-NLS-1$
        }

        int masks[] = new int[bands.length];
        for (int i = 0; i < bands.length; i++) {
            masks[i] = this.bitMasks[bands[i]];
        }
        return new SinglePixelPackedSampleModel(this.dataType, this.width,
                this.height, this.scanlineStride, masks);
    }

    @Override
    public SampleModel createCompatibleSampleModel(int w, int h) {
        return new SinglePixelPackedSampleModel(this.dataType, w, h,
                this.bitMasks);
    }

    @Override
    public int[] getPixel(int x, int y, int iArray[], DataBuffer data) {
        if (x < 0 || y < 0 || x >= this.width || y >= this.height) {
            // awt.63=Coordinates are not in bounds
            throw new ArrayIndexOutOfBoundsException(Messages.getString("awt.63")); //$NON-NLS-1$
        }
        int pixel[];
        if (iArray == null) {
            pixel = new int[this.numBands];
        } else {
            pixel = iArray;
        }

        for (int i = 0; i < this.numBands; i++) {
            pixel[i] = getSample(x, y, i, data);
        }

        return pixel;
    }

    @Override
    public void setPixel(int x, int y, int iArray[], DataBuffer data) {
        if (x < 0 || y < 0 || x >= this.width || y >= this.height) {
            // awt.63=Coordinates are not in bounds
            throw new ArrayIndexOutOfBoundsException(Messages.getString("awt.63")); //$NON-NLS-1$
        }
        for (int i = 0; i < this.numBands; i++) {
            setSample(x, y, i, iArray[i], data);
        }
    }

    @Override
    public int getSample(int x, int y, int b, DataBuffer data) {
        if (x < 0 || y < 0 || x >= this.width || y >= this.height) {
            // awt.63=Coordinates are not in bounds
            throw new ArrayIndexOutOfBoundsException(Messages.getString("awt.63")); //$NON-NLS-1$
        }
        int sample = data.getElem(y * scanlineStride + x);
        return ((sample & this.bitMasks[b]) >>> this.bitOffsets[b]);
    }

    @Override
    public int[] getPixels(int x, int y, int w, int h, int iArray[],
            DataBuffer data) {
        if ((x < 0) || (y < 0) || ((long) x + (long) w > this.width)
                || ((long) y + (long) h > this.height)) {
            // awt.63=Coordinates are not in bounds
            throw new ArrayIndexOutOfBoundsException(Messages.getString("awt.63")); //$NON-NLS-1$
        }

        int pixels[];

        if (iArray == null) {
            pixels = new int[w * h * this.numBands];
        } else {
            pixels = iArray;
        }

        int idx = 0;

        for (int i = y; i < y + h; i++) {
            for (int j = x; j < x + w; j++) {
                for (int n = 0; n < this.numBands; n++) {
                    pixels[idx++] = getSample(j, i, n, data);
                }
            }
        }
        return pixels;
    }

    @Override
    public void setPixels(int x, int y, int w, int h, int iArray[],
            DataBuffer data) {
        if ((x < 0) || (y < 0) || ((long) x + (long) w > this.width)
                || ((long) y + (long) h > this.height)) {
            // awt.63=Coordinates are not in bounds
            throw new ArrayIndexOutOfBoundsException(Messages
                    .getString("awt.63")); //$NON-NLS-1$
        }

        int idx = 0;

        for (int i = y; i < y + h; i++) {
            for (int j = x; j < x + w; j++) {
                for (int n = 0; n < this.numBands; n++) {
                    setSample(j, i, n, iArray[idx++], data);
                }
            }
        }
    }

    @Override
    public void setSample(int x, int y, int b, int s, DataBuffer data) {
        if (x < 0 || y < 0 || x >= this.width || y >= this.height) {
            // awt.63=Coordinates are not in bounds
            throw new ArrayIndexOutOfBoundsException(Messages.getString("awt.63")); //$NON-NLS-1$
        }
        int tmp = data.getElem(y * scanlineStride + x);
        tmp &= ~this.bitMasks[b];
        tmp |= (s << this.bitOffsets[b]) & this.bitMasks[b];
        data.setElem(y * scanlineStride + x, tmp);
    }

    @Override
    public int[] getSamples(int x, int y, int w, int h, int b, int iArray[],
            DataBuffer data) {
        if ((x < 0) || (y < 0) || ((long) x + (long) w > this.width)
                || ((long) y + (long) h > this.height)) {
            // awt.63=Coordinates are not in bounds
            throw new ArrayIndexOutOfBoundsException(Messages
                    .getString("awt.63")); //$NON-NLS-1$
        }

        int samples[];
        int idx = 0;

        if (iArray == null) {
            samples = new int[w * h];
        } else {
            samples = iArray;
        }

        for (int i = y; i < y + h; i++) {
            for (int j = x; j < x + w; j++) {
                samples[idx++] = getSample(j, i, b, data);
            }
        }

        return samples;
    }

    @Override
    public void setSamples(int x, int y, int w, int h, int b, int iArray[],
            DataBuffer data) {
        if ((x < 0) || (y < 0) || ((long) x + (long) w > this.width)
                || ((long) y + (long) h > this.height)) {
            // awt.63=Coordinates are not in bounds
            throw new ArrayIndexOutOfBoundsException(Messages.getString("awt.63")); //$NON-NLS-1$
        }

        int idx = 0;
        for (int i = y; i < y + h; i++) {
            for (int j = x; j < x + w; j++) {
                setSample(x + j, y + i, b, iArray[idx++], data);
            }
        }
    }

    @Override
    public DataBuffer createDataBuffer() {
        DataBuffer data = null;
        int size = (this.height - 1) * scanlineStride + width;

        switch (this.dataType) {
        case DataBuffer.TYPE_BYTE:
            data = new DataBufferByte(size);
            break;
        case DataBuffer.TYPE_USHORT:
            data = new DataBufferUShort(size);
            break;
        case DataBuffer.TYPE_INT:
            data = new DataBufferInt(size);
            break;
        }
        return data;
    }

    public int getOffset(int x, int y) {
        return (y * scanlineStride + x);
    }

    @Override
    public int getSampleSize(int band) {
        return bitSizes[band];
    }

    @Override
    public int[] getSampleSize() {
        return bitSizes.clone();
    }

    public int[] getBitOffsets() {
        return bitOffsets.clone();
    }

    public int[] getBitMasks() {
        return bitMasks.clone();
    }

    @Override
    public int hashCode() {
        int hash = 0;
        int tmp = 0;

        hash = width;
        tmp = hash >>> 24;
        hash <<= 8;
        hash |= tmp;
        hash ^= height;
        tmp = hash >>> 24;
        hash <<= 8;
        hash |= tmp;
        hash ^= numBands;
        tmp = hash >>> 24;
        hash <<= 8;
        hash |= tmp;
        hash ^= dataType;
        tmp = hash >>> 24;
        hash <<= 8;
        hash |= tmp;
        for (int element : bitMasks) {
            hash ^= element;
            tmp = hash >>> 24;
            hash <<= 8;
            hash |= tmp;
        }
        for (int element : bitOffsets) {
            hash ^= element;
            tmp = hash >>> 24;
            hash <<= 8;
            hash |= tmp;
        }
        for (int element : bitSizes) {
            hash ^= element;
            tmp = hash >>> 24;
            hash <<= 8;
            hash |= tmp;
        }
        hash ^= scanlineStride;
        return hash;
    }

    public int getScanlineStride() {
        return this.scanlineStride;
    }

    @Override
    public int getNumDataElements() {
        return 1;
    }

}

TOP

Related Classes of com.google.code.appengine.awt.image.SinglePixelPackedSampleModel

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.