blob: 8e646f80b9d769916f979bd6c1f90ca1d02f23ca [file] [log] [blame]
/*
* 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
* @version $Revision$
*/
package java.awt.image;
import org.apache.harmony.awt.internal.nls.Messages;
/**
* The PixelInterleavedSampleModel class represents image data as represented as
* interleaved pixels and for which each sample of a pixel takes one data
* element of the DataBuffer.
*
* @since Android 1.0
*/
public class PixelInterleavedSampleModel extends ComponentSampleModel {
/**
* Instantiates a new PixelInterleavedSampleModel with the specified
* parameters.
*
* @param dataType
* the data type of the samples.
* @param w
* the width of the image data.
* @param h
* the height of the image data.
* @param pixelStride
* the pixel stride of the image data.
* @param scanlineStride
* the scanline stride of the of the image data.
* @param bandOffsets
* the array of the band offsets.
*/
public PixelInterleavedSampleModel(int dataType, int w, int h, int pixelStride,
int scanlineStride, int bandOffsets[]) {
super(dataType, w, h, pixelStride, scanlineStride, bandOffsets);
int maxOffset = bandOffsets[0];
int minOffset = bandOffsets[0];
for (int i = 1; i < bandOffsets.length; i++) {
if (bandOffsets[i] > maxOffset) {
maxOffset = bandOffsets[i];
}
if (bandOffsets[i] < minOffset) {
minOffset = bandOffsets[i];
}
}
maxOffset -= minOffset;
if (maxOffset > scanlineStride) {
// awt.241=Any offset between bands is greater than the Scanline
// stride
throw new IllegalArgumentException(Messages.getString("awt.241")); //$NON-NLS-1$
}
if (maxOffset > pixelStride) {
// awt.242=Pixel stride is less than any offset between bands
throw new IllegalArgumentException(Messages.getString("awt.242")); //$NON-NLS-1$
}
if (pixelStride * w > scanlineStride) {
// awt.243=Product of Pixel stride and w is greater than Scanline
// stride
throw new IllegalArgumentException(Messages.getString("awt.243")); //$NON-NLS-1$
}
}
@Override
public SampleModel createSubsetSampleModel(int bands[]) {
int newOffsets[] = new int[bands.length];
for (int i = 0; i < bands.length; i++) {
newOffsets[i] = bandOffsets[bands[i]];
}
return new PixelInterleavedSampleModel(dataType, width, height, pixelStride,
scanlineStride, newOffsets);
}
@Override
public SampleModel createCompatibleSampleModel(int w, int h) {
int newOffsets[];
int minOffset = bandOffsets[0];
for (int i = 1; i < numBands; i++) {
if (bandOffsets[i] < minOffset) {
minOffset = bandOffsets[i];
}
}
if (minOffset > 0) {
newOffsets = new int[numBands];
for (int i = 0; i < numBands; i++) {
newOffsets[i] = bandOffsets[i] - minOffset;
}
} else {
newOffsets = bandOffsets;
}
return new PixelInterleavedSampleModel(dataType, w, h, pixelStride, pixelStride * w,
newOffsets);
}
@Override
public int hashCode() {
int hash = super.hashCode();
int tmp = hash >>> 8;
hash <<= 8;
hash |= tmp;
return hash ^ 0x66;
}
}