/* Copyright (C) 2000 Free Software Foundation This file is part of libgcj. This software is copyrighted work licensed under the terms of the Libgcj License. Please consult the file "LIBGCJ_LICENSE" for details. */ package java.awt.image; import gnu.gcj.awt.BitMaskExtent; import gnu.gcj.awt.Buffers; /** * @author Rolf W. Rasmussen */ public class SinglePixelPackedSampleModel extends SampleModel { private int scanlineStride; private int[] bitMasks; private int[] bitOffsets; private int[] sampleSize;; 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); this.scanlineStride = scanlineStride; this.bitMasks = bitMasks; bitOffsets = new int[numBands]; sampleSize = new int[numBands]; BitMaskExtent extent = new BitMaskExtent(); for (int b=0; b>> bitOffsets[b]; return iArray; } public int[] getPixels(int x, int y, int w, int h, int[] iArray, DataBuffer data) { int offset = scanlineStride*y + x; if (iArray == null) iArray = new int[numBands*w*h]; int outOffset = 0; for (y=0; y>> bitOffsets[b]; } offset += scanlineStride; } return iArray; } public int getSample(int x, int y, int b, DataBuffer data) { int offset = scanlineStride*y + x; int samples = data.getElem(offset); return (samples & bitMasks[b]) >>> bitOffsets[b]; } public void setDataElements(int x, int y, Object obj, DataBuffer data) { int offset = scanlineStride*y + x + data.getOffset(); int transferType = getTransferType(); if (getTransferType() != data.getDataType()) { throw new IllegalArgumentException("transfer type ("+ getTransferType()+"), "+ "does not match data "+ "buffer type (" + data.getDataType() + ")."); } try { switch (transferType) { case DataBuffer.TYPE_BYTE: { DataBufferByte out = (DataBufferByte) data; byte[] in = (byte[]) obj; out.getData()[offset] = in[0]; return; } case DataBuffer.TYPE_USHORT: { DataBufferUShort out = (DataBufferUShort) data; short[] in = (short[]) obj; out.getData()[offset] = in[0]; return; } case DataBuffer.TYPE_INT: { DataBufferInt out = (DataBufferInt) data; int[] in = (int[]) obj; out.getData()[offset] = in[0]; return; } // FIXME: Fill in the other possible types. default: throw new InternalError(); } } catch (ArrayIndexOutOfBoundsException aioobe) { String msg = "While writing data elements" + ", x="+x+", y="+y+ ", width="+width+", height="+height+ ", scanlineStride="+scanlineStride+ ", offset="+offset+ ", data.getSize()="+data.getSize()+ ", data.getOffset()="+data.getOffset()+ ": " + aioobe; throw new ArrayIndexOutOfBoundsException(msg); } } public void setPixel(int x, int y, int[] iArray, DataBuffer data) { int offset = scanlineStride*y + x; int samples = 0; for (int b=0; b