下面列出了java.awt.image.ComponentSampleModel#getBandOffsets() 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
/*** Analyzes a ComponentSampleModel to determine if it can function
* as a PixelInterleavedSampleModel. In order to do so, it must use
* only bank 0 of its DataBuffer, and the data offsets must span a range
* of less than pixelStride.
*
* <p> These properties are trivially true for a 1-banded SampleModel.
*/
private boolean isInterleaved(ComponentSampleModel sm) {
// Analyze ComponentSampleModel to determine if it has the
// properties of a PixelInterleavedSampleModel
int numBands = sampleModel.getNumBands();
if (numBands == 1) {
return true;
}
// Determine banks used
int[] bankIndices = sm.getBankIndices();
for (int i = 0; i < numBands; i++) {
if (bankIndices[i] != 0) {
return false;
}
}
// Determine range of band offsets
int[] bandOffsets = sm.getBandOffsets();
int minOffset = bandOffsets[0];
int maxOffset = minOffset;
for (int i = 1; i < numBands; i++) {
int offset = bandOffsets[i];
if (offset < minOffset) {
minOffset = offset;
}
if (offset > maxOffset) {
maxOffset = offset;
}
}
if (maxOffset - minOffset >= sm.getPixelStride()) {
return false;
}
return true;
}
/*** Analyzes a ComponentSampleModel to determine if it can function
* as a PixelInterleavedSampleModel. In order to do so, it must use
* only bank 0 of its DataBuffer, and the data offsets must span a range
* of less than pixelStride.
*
* <p> These properties are trivially true for a 1-banded SampleModel.
*/
private boolean isInterleaved(ComponentSampleModel sm) {
// Analyze ComponentSampleModel to determine if it has the
// properties of a PixelInterleavedSampleModel
int numBands = sampleModel.getNumBands();
if (numBands == 1) {
return true;
}
// Determine banks used
int[] bankIndices = sm.getBankIndices();
for (int i = 0; i < numBands; i++) {
if (bankIndices[i] != 0) {
return false;
}
}
// Determine range of band offsets
int[] bandOffsets = sm.getBandOffsets();
int minOffset = bandOffsets[0];
int maxOffset = minOffset;
for (int i = 1; i < numBands; i++) {
int offset = bandOffsets[i];
if (offset < minOffset) {
minOffset = offset;
}
if (offset > maxOffset) {
maxOffset = offset;
}
}
if (maxOffset - minOffset >= sm.getPixelStride()) {
return false;
}
return true;
}
/*** Analyzes a ComponentSampleModel to determine if it can function
* as a PixelInterleavedSampleModel. In order to do so, it must use
* only bank 0 of its DataBuffer, and the data offsets must span a range
* of less than pixelStride.
*
* <p> These properties are trivially true for a 1-banded SampleModel.
*/
private boolean isInterleaved(ComponentSampleModel sm) {
// Analyze ComponentSampleModel to determine if it has the
// properties of a PixelInterleavedSampleModel
int numBands = sampleModel.getNumBands();
if (numBands == 1) {
return true;
}
// Determine banks used
int[] bankIndices = sm.getBankIndices();
for (int i = 0; i < numBands; i++) {
if (bankIndices[i] != 0) {
return false;
}
}
// Determine range of band offsets
int[] bandOffsets = sm.getBandOffsets();
int minOffset = bandOffsets[0];
int maxOffset = minOffset;
for (int i = 1; i < numBands; i++) {
int offset = bandOffsets[i];
if (offset < minOffset) {
minOffset = offset;
}
if (offset > maxOffset) {
maxOffset = offset;
}
}
if (maxOffset - minOffset >= sm.getPixelStride()) {
return false;
}
return true;
}
/*** Analyzes a ComponentSampleModel to determine if it can function
* as a PixelInterleavedSampleModel. In order to do so, it must use
* only bank 0 of its DataBuffer, and the data offsets must span a range
* of less than pixelStride.
*
* <p> These properties are trivially true for a 1-banded SampleModel.
*/
private boolean isInterleaved(ComponentSampleModel sm) {
// Analyze ComponentSampleModel to determine if it has the
// properties of a PixelInterleavedSampleModel
int numBands = sampleModel.getNumBands();
if (numBands == 1) {
return true;
}
// Determine banks used
int[] bankIndices = sm.getBankIndices();
for (int i = 0; i < numBands; i++) {
if (bankIndices[i] != 0) {
return false;
}
}
// Determine range of band offsets
int[] bandOffsets = sm.getBandOffsets();
int minOffset = bandOffsets[0];
int maxOffset = minOffset;
for (int i = 1; i < numBands; i++) {
int offset = bandOffsets[i];
if (offset < minOffset) {
minOffset = offset;
}
if (offset > maxOffset) {
maxOffset = offset;
}
}
if (maxOffset - minOffset >= sm.getPixelStride()) {
return false;
}
return true;
}
/*** Analyzes a ComponentSampleModel to determine if it can function
* as a PixelInterleavedSampleModel. In order to do so, it must use
* only bank 0 of its DataBuffer, and the data offsets must span a range
* of less than pixelStride.
*
* <p> These properties are trivially true for a 1-banded SampleModel.
*/
private boolean isInterleaved(ComponentSampleModel sm) {
// Analyze ComponentSampleModel to determine if it has the
// properties of a PixelInterleavedSampleModel
int numBands = sampleModel.getNumBands();
if (numBands == 1) {
return true;
}
// Determine banks used
int[] bankIndices = sm.getBankIndices();
for (int i = 0; i < numBands; i++) {
if (bankIndices[i] != 0) {
return false;
}
}
// Determine range of band offsets
int[] bandOffsets = sm.getBandOffsets();
int minOffset = bandOffsets[0];
int maxOffset = minOffset;
for (int i = 1; i < numBands; i++) {
int offset = bandOffsets[i];
if (offset < minOffset) {
minOffset = offset;
}
if (offset > maxOffset) {
maxOffset = offset;
}
}
if (maxOffset - minOffset >= sm.getPixelStride()) {
return false;
}
return true;
}
/**
* Returns whether the image has contiguous data across rows.
*/
public static final boolean imageIsContiguous(RenderedImage image) {
SampleModel sm;
if(image instanceof BufferedImage) {
WritableRaster ras = ((BufferedImage)image).getRaster();
sm = ras.getSampleModel();
} else {
sm = image.getSampleModel();
}
if (sm instanceof ComponentSampleModel) {
// Ensure image rows samples are stored contiguously
// in a single bank.
ComponentSampleModel csm = (ComponentSampleModel)sm;
if (csm.getPixelStride() != csm.getNumBands()) {
return false;
}
int[] bandOffsets = csm.getBandOffsets();
for (int i = 0; i < bandOffsets.length; i++) {
if (bandOffsets[i] != i) {
return false;
}
}
int[] bankIndices = csm.getBankIndices();
for (int i = 0; i < bandOffsets.length; i++) {
if (bankIndices[i] != 0) {
return false;
}
}
return true;
}
// Otherwise true if and only if it's a bilevel image with
// a MultiPixelPackedSampleModel, 1 bit per pixel, and 1 bit
// pixel stride.
return ImageUtil.isBinary(sm);
}
/**
* Returns whether the image has contiguous data across rows.
*/
public static final boolean imageIsContiguous(RenderedImage image) {
SampleModel sm;
if(image instanceof BufferedImage) {
WritableRaster ras = ((BufferedImage)image).getRaster();
sm = ras.getSampleModel();
} else {
sm = image.getSampleModel();
}
if (sm instanceof ComponentSampleModel) {
// Ensure image rows samples are stored contiguously
// in a single bank.
ComponentSampleModel csm = (ComponentSampleModel)sm;
if (csm.getPixelStride() != csm.getNumBands()) {
return false;
}
int[] bandOffsets = csm.getBandOffsets();
for (int i = 0; i < bandOffsets.length; i++) {
if (bandOffsets[i] != i) {
return false;
}
}
int[] bankIndices = csm.getBankIndices();
for (int i = 0; i < bandOffsets.length; i++) {
if (bankIndices[i] != 0) {
return false;
}
}
return true;
}
// Otherwise true if and only if it's a bilevel image with
// a MultiPixelPackedSampleModel, 1 bit per pixel, and 1 bit
// pixel stride.
return ImageUtil.isBinary(sm);
}
/**
* Constructs a ByteInterleavedRaster with the given SampleModel,
* DataBuffer, and parent. DataBuffer must be a DataBufferByte and
* SampleModel must be of type SinglePixelPackedSampleModel
* or InterleavedSampleModel.
* When translated into the base Raster's
* coordinate system, aRegion must be contained by the base Raster.
* Origin is the coordinate in the new Raster's coordinate system of
* the origin of the base Raster. (The base Raster is the Raster's
* ancestor which has no parent.)
*
* Note that this constructor should generally be called by other
* constructors or create methods, it should not be used directly.
* @param sampleModel The SampleModel that specifies the layout.
* @param dataBuffer The DataBufferShort that contains the image data.
* @param aRegion The Rectangle that specifies the image area.
* @param origin The Point that specifies the origin.
* @param parent The parent (if any) of this raster.
*/
public ByteInterleavedRaster(SampleModel sampleModel,
DataBuffer dataBuffer,
Rectangle aRegion,
Point origin,
ByteInterleavedRaster parent) {
super(sampleModel, dataBuffer, aRegion, origin, parent);
this.maxX = minX + width;
this.maxY = minY + height;
if (!(dataBuffer instanceof DataBufferByte)) {
throw new RasterFormatException("ByteInterleavedRasters must have " +
"byte DataBuffers");
}
DataBufferByte dbb = (DataBufferByte)dataBuffer;
this.data = stealData(dbb, 0);
int xOffset = aRegion.x - origin.x;
int yOffset = aRegion.y - origin.y;
if (sampleModel instanceof PixelInterleavedSampleModel ||
(sampleModel instanceof ComponentSampleModel &&
isInterleaved((ComponentSampleModel)sampleModel))) {
ComponentSampleModel csm = (ComponentSampleModel)sampleModel;
this.scanlineStride = csm.getScanlineStride();
this.pixelStride = csm.getPixelStride();
this.dataOffsets = csm.getBandOffsets();
for (int i = 0; i < getNumDataElements(); i++) {
dataOffsets[i] += xOffset*pixelStride+yOffset*scanlineStride;
}
} else if (sampleModel instanceof SinglePixelPackedSampleModel) {
SinglePixelPackedSampleModel sppsm =
(SinglePixelPackedSampleModel)sampleModel;
this.packed = true;
this.bitMasks = sppsm.getBitMasks();
this.bitOffsets = sppsm.getBitOffsets();
this.scanlineStride = sppsm.getScanlineStride();
this.pixelStride = 1;
this.dataOffsets = new int[1];
this.dataOffsets[0] = dbb.getOffset();
dataOffsets[0] += xOffset*pixelStride+yOffset*scanlineStride;
} else {
throw new RasterFormatException("ByteInterleavedRasters must " +
"have PixelInterleavedSampleModel, SinglePixelPackedSampleModel"+
" or interleaved ComponentSampleModel. Sample model is " +
sampleModel);
}
this.bandOffset = this.dataOffsets[0];
this.dbOffsetPacked = dataBuffer.getOffset() -
sampleModelTranslateY*scanlineStride -
sampleModelTranslateX*pixelStride;
this.dbOffset = dbOffsetPacked -
(xOffset*pixelStride+yOffset*scanlineStride);
// Set inOrder to true if the data elements are in order and
// have no gaps between them
this.inOrder = false;
if (numDataElements == pixelStride) {
inOrder = true;
for (int i = 1; i < numDataElements; i++) {
if (dataOffsets[i] - dataOffsets[0] != i) {
inOrder = false;
break;
}
}
}
verify();
}
public static LCMSImageLayout createImageLayout(Raster r) {
LCMSImageLayout l = new LCMSImageLayout();
if (r instanceof ByteComponentRaster &&
r.getSampleModel() instanceof ComponentSampleModel) {
ByteComponentRaster br = (ByteComponentRaster)r;
ComponentSampleModel csm = (ComponentSampleModel)r.getSampleModel();
l.pixelType = CHANNELS_SH(br.getNumBands()) | BYTES_SH(1);
int[] bandOffsets = csm.getBandOffsets();
BandOrder order = BandOrder.getBandOrder(bandOffsets);
int firstBand = 0;
switch (order) {
case INVERTED:
l.pixelType |= DOSWAP;
firstBand = csm.getNumBands() - 1;
break;
case DIRECT:
// do nothing
break;
default:
// unable to create the image layout;
return null;
}
l.nextRowOffset = br.getScanlineStride();
l.nextPixelOffset = br.getPixelStride();
l.offset = br.getDataOffset(firstBand);
l.dataArray = br.getDataStorage();
l.dataType = DT_BYTE;
l.width = br.getWidth();
l.height = br.getHeight();
if (l.nextRowOffset == l.width * br.getPixelStride()) {
l.imageAtOnce = true;
}
return l;
}
return null;
}
public static LCMSImageLayout createImageLayout(Raster r) {
LCMSImageLayout l = new LCMSImageLayout();
if (r instanceof ByteComponentRaster &&
r.getSampleModel() instanceof ComponentSampleModel) {
ByteComponentRaster br = (ByteComponentRaster)r;
ComponentSampleModel csm = (ComponentSampleModel)r.getSampleModel();
l.pixelType = CHANNELS_SH(br.getNumBands()) | BYTES_SH(1);
int[] bandOffsets = csm.getBandOffsets();
BandOrder order = BandOrder.getBandOrder(bandOffsets);
int firstBand = 0;
switch (order) {
case INVERTED:
l.pixelType |= DOSWAP;
firstBand = csm.getNumBands() - 1;
break;
case DIRECT:
// do nothing
break;
default:
// unable to create the image layout;
return null;
}
l.nextRowOffset = br.getScanlineStride();
l.nextPixelOffset = br.getPixelStride();
l.offset = br.getDataOffset(firstBand);
l.dataArray = br.getDataStorage();
l.dataType = DT_BYTE;
l.width = br.getWidth();
l.height = br.getHeight();
if (l.nextRowOffset == l.width * br.getPixelStride()) {
l.imageAtOnce = true;
}
return l;
}
return null;
}
/**
* Constructs a ByteInterleavedRaster with the given SampleModel,
* DataBuffer, and parent. DataBuffer must be a DataBufferByte and
* SampleModel must be of type SinglePixelPackedSampleModel
* or InterleavedSampleModel.
* When translated into the base Raster's
* coordinate system, aRegion must be contained by the base Raster.
* Origin is the coordinate in the new Raster's coordinate system of
* the origin of the base Raster. (The base Raster is the Raster's
* ancestor which has no parent.)
*
* Note that this constructor should generally be called by other
* constructors or create methods, it should not be used directly.
* @param sampleModel The SampleModel that specifies the layout.
* @param dataBuffer The DataBufferByte that contains the image data.
* @param aRegion The Rectangle that specifies the image area.
* @param origin The Point that specifies the origin.
* @param parent The parent (if any) of this raster.
*/
public ByteInterleavedRaster(SampleModel sampleModel,
DataBufferByte dataBuffer,
Rectangle aRegion,
Point origin,
ByteInterleavedRaster parent)
{
super(sampleModel, dataBuffer, aRegion, origin, parent);
this.maxX = minX + width;
this.maxY = minY + height;
this.data = stealData(dataBuffer, 0);
int xOffset = aRegion.x - origin.x;
int yOffset = aRegion.y - origin.y;
if (sampleModel instanceof PixelInterleavedSampleModel ||
(sampleModel instanceof ComponentSampleModel &&
isInterleaved((ComponentSampleModel)sampleModel))) {
ComponentSampleModel csm = (ComponentSampleModel)sampleModel;
this.scanlineStride = csm.getScanlineStride();
this.pixelStride = csm.getPixelStride();
this.dataOffsets = csm.getBandOffsets();
for (int i = 0; i < getNumDataElements(); i++) {
dataOffsets[i] += xOffset*pixelStride+yOffset*scanlineStride;
}
} else if (sampleModel instanceof SinglePixelPackedSampleModel) {
SinglePixelPackedSampleModel sppsm =
(SinglePixelPackedSampleModel)sampleModel;
this.packed = true;
this.bitMasks = sppsm.getBitMasks();
this.bitOffsets = sppsm.getBitOffsets();
this.scanlineStride = sppsm.getScanlineStride();
this.pixelStride = 1;
this.dataOffsets = new int[1];
this.dataOffsets[0] = dataBuffer.getOffset();
dataOffsets[0] += xOffset*pixelStride+yOffset*scanlineStride;
} else {
throw new RasterFormatException("ByteInterleavedRasters must " +
"have PixelInterleavedSampleModel, SinglePixelPackedSampleModel"+
" or interleaved ComponentSampleModel. Sample model is " +
sampleModel);
}
this.bandOffset = this.dataOffsets[0];
this.dbOffsetPacked = dataBuffer.getOffset() -
sampleModelTranslateY*scanlineStride -
sampleModelTranslateX*pixelStride;
this.dbOffset = dbOffsetPacked -
(xOffset*pixelStride+yOffset*scanlineStride);
// Set inOrder to true if the data elements are in order and
// have no gaps between them
this.inOrder = false;
if (numDataElements == pixelStride) {
inOrder = true;
for (int i = 1; i < numDataElements; i++) {
if (dataOffsets[i] - dataOffsets[0] != i) {
inOrder = false;
break;
}
}
}
verify();
}
/**
* Constructs a ByteInterleavedRaster with the given SampleModel,
* DataBuffer, and parent. DataBuffer must be a DataBufferByte and
* SampleModel must be of type SinglePixelPackedSampleModel
* or InterleavedSampleModel.
* When translated into the base Raster's
* coordinate system, aRegion must be contained by the base Raster.
* Origin is the coordinate in the new Raster's coordinate system of
* the origin of the base Raster. (The base Raster is the Raster's
* ancestor which has no parent.)
*
* Note that this constructor should generally be called by other
* constructors or create methods, it should not be used directly.
* @param sampleModel The SampleModel that specifies the layout.
* @param dataBuffer The DataBufferShort that contains the image data.
* @param aRegion The Rectangle that specifies the image area.
* @param origin The Point that specifies the origin.
* @param parent The parent (if any) of this raster.
*/
public ByteInterleavedRaster(SampleModel sampleModel,
DataBuffer dataBuffer,
Rectangle aRegion,
Point origin,
ByteInterleavedRaster parent) {
super(sampleModel, dataBuffer, aRegion, origin, parent);
this.maxX = minX + width;
this.maxY = minY + height;
if (!(dataBuffer instanceof DataBufferByte)) {
throw new RasterFormatException("ByteInterleavedRasters must have " +
"byte DataBuffers");
}
DataBufferByte dbb = (DataBufferByte)dataBuffer;
this.data = stealData(dbb, 0);
int xOffset = aRegion.x - origin.x;
int yOffset = aRegion.y - origin.y;
if (sampleModel instanceof PixelInterleavedSampleModel ||
(sampleModel instanceof ComponentSampleModel &&
isInterleaved((ComponentSampleModel)sampleModel))) {
ComponentSampleModel csm = (ComponentSampleModel)sampleModel;
this.scanlineStride = csm.getScanlineStride();
this.pixelStride = csm.getPixelStride();
this.dataOffsets = csm.getBandOffsets();
for (int i = 0; i < getNumDataElements(); i++) {
dataOffsets[i] += xOffset*pixelStride+yOffset*scanlineStride;
}
} else if (sampleModel instanceof SinglePixelPackedSampleModel) {
SinglePixelPackedSampleModel sppsm =
(SinglePixelPackedSampleModel)sampleModel;
this.packed = true;
this.bitMasks = sppsm.getBitMasks();
this.bitOffsets = sppsm.getBitOffsets();
this.scanlineStride = sppsm.getScanlineStride();
this.pixelStride = 1;
this.dataOffsets = new int[1];
this.dataOffsets[0] = dbb.getOffset();
dataOffsets[0] += xOffset*pixelStride+yOffset*scanlineStride;
} else {
throw new RasterFormatException("ByteInterleavedRasters must " +
"have PixelInterleavedSampleModel, SinglePixelPackedSampleModel"+
" or interleaved ComponentSampleModel. Sample model is " +
sampleModel);
}
this.bandOffset = this.dataOffsets[0];
this.dbOffsetPacked = dataBuffer.getOffset() -
sampleModelTranslateY*scanlineStride -
sampleModelTranslateX*pixelStride;
this.dbOffset = dbOffsetPacked -
(xOffset*pixelStride+yOffset*scanlineStride);
// Set inOrder to true if the data elements are in order and
// have no gaps between them
this.inOrder = false;
if (numDataElements == pixelStride) {
inOrder = true;
for (int i = 1; i < numDataElements; i++) {
if (dataOffsets[i] - dataOffsets[0] != i) {
inOrder = false;
break;
}
}
}
verify();
}
/**
* Returns whether the image has contiguous data across rows.
*/
public static final boolean imageIsContiguous(RenderedImage image) {
SampleModel sm;
if(image instanceof BufferedImage) {
WritableRaster ras = ((BufferedImage)image).getRaster();
sm = ras.getSampleModel();
} else {
sm = image.getSampleModel();
}
if (sm instanceof ComponentSampleModel) {
// Ensure image rows samples are stored contiguously
// in a single bank.
ComponentSampleModel csm = (ComponentSampleModel)sm;
if (csm.getPixelStride() != csm.getNumBands()) {
return false;
}
int[] bandOffsets = csm.getBandOffsets();
for (int i = 0; i < bandOffsets.length; i++) {
if (bandOffsets[i] != i) {
return false;
}
}
int[] bankIndices = csm.getBankIndices();
for (int i = 0; i < bandOffsets.length; i++) {
if (bankIndices[i] != 0) {
return false;
}
}
return true;
}
// Otherwise true if and only if it's a bilevel image with
// a MultiPixelPackedSampleModel, 1 bit per pixel, and 1 bit
// pixel stride.
return ImageUtil.isBinary(sm);
}
/**
* Constructs a ByteInterleavedRaster with the given SampleModel,
* DataBuffer, and parent. DataBuffer must be a DataBufferByte and
* SampleModel must be of type SinglePixelPackedSampleModel
* or InterleavedSampleModel.
* When translated into the base Raster's
* coordinate system, aRegion must be contained by the base Raster.
* Origin is the coordinate in the new Raster's coordinate system of
* the origin of the base Raster. (The base Raster is the Raster's
* ancestor which has no parent.)
*
* Note that this constructor should generally be called by other
* constructors or create methods, it should not be used directly.
* @param sampleModel The SampleModel that specifies the layout.
* @param dataBuffer The DataBufferShort that contains the image data.
* @param aRegion The Rectangle that specifies the image area.
* @param origin The Point that specifies the origin.
* @param parent The parent (if any) of this raster.
*/
public ByteInterleavedRaster(SampleModel sampleModel,
DataBuffer dataBuffer,
Rectangle aRegion,
Point origin,
ByteInterleavedRaster parent) {
super(sampleModel, dataBuffer, aRegion, origin, parent);
this.maxX = minX + width;
this.maxY = minY + height;
if (!(dataBuffer instanceof DataBufferByte)) {
throw new RasterFormatException("ByteInterleavedRasters must have " +
"byte DataBuffers");
}
DataBufferByte dbb = (DataBufferByte)dataBuffer;
this.data = stealData(dbb, 0);
int xOffset = aRegion.x - origin.x;
int yOffset = aRegion.y - origin.y;
if (sampleModel instanceof PixelInterleavedSampleModel ||
(sampleModel instanceof ComponentSampleModel &&
isInterleaved((ComponentSampleModel)sampleModel))) {
ComponentSampleModel csm = (ComponentSampleModel)sampleModel;
this.scanlineStride = csm.getScanlineStride();
this.pixelStride = csm.getPixelStride();
this.dataOffsets = csm.getBandOffsets();
for (int i = 0; i < getNumDataElements(); i++) {
dataOffsets[i] += xOffset*pixelStride+yOffset*scanlineStride;
}
} else if (sampleModel instanceof SinglePixelPackedSampleModel) {
SinglePixelPackedSampleModel sppsm =
(SinglePixelPackedSampleModel)sampleModel;
this.packed = true;
this.bitMasks = sppsm.getBitMasks();
this.bitOffsets = sppsm.getBitOffsets();
this.scanlineStride = sppsm.getScanlineStride();
this.pixelStride = 1;
this.dataOffsets = new int[1];
this.dataOffsets[0] = dbb.getOffset();
dataOffsets[0] += xOffset*pixelStride+yOffset*scanlineStride;
} else {
throw new RasterFormatException("ByteInterleavedRasters must " +
"have PixelInterleavedSampleModel, SinglePixelPackedSampleModel"+
" or interleaved ComponentSampleModel. Sample model is " +
sampleModel);
}
this.bandOffset = this.dataOffsets[0];
this.dbOffsetPacked = dataBuffer.getOffset() -
sampleModelTranslateY*scanlineStride -
sampleModelTranslateX*pixelStride;
this.dbOffset = dbOffsetPacked -
(xOffset*pixelStride+yOffset*scanlineStride);
// Set inOrder to true if the data elements are in order and
// have no gaps between them
this.inOrder = false;
if (numDataElements == pixelStride) {
inOrder = true;
for (int i = 1; i < numDataElements; i++) {
if (dataOffsets[i] - dataOffsets[0] != i) {
inOrder = false;
break;
}
}
}
verify();
}
/**
* Returns whether the image has contiguous data across rows.
*/
public static final boolean imageIsContiguous(RenderedImage image) {
SampleModel sm;
if(image instanceof BufferedImage) {
WritableRaster ras = ((BufferedImage)image).getRaster();
sm = ras.getSampleModel();
} else {
sm = image.getSampleModel();
}
if (sm instanceof ComponentSampleModel) {
// Ensure image rows samples are stored contiguously
// in a single bank.
ComponentSampleModel csm = (ComponentSampleModel)sm;
if (csm.getPixelStride() != csm.getNumBands()) {
return false;
}
int[] bandOffsets = csm.getBandOffsets();
for (int i = 0; i < bandOffsets.length; i++) {
if (bandOffsets[i] != i) {
return false;
}
}
int[] bankIndices = csm.getBankIndices();
for (int i = 0; i < bandOffsets.length; i++) {
if (bankIndices[i] != 0) {
return false;
}
}
return true;
}
// Otherwise true if and only if it's a bilevel image with
// a MultiPixelPackedSampleModel, 1 bit per pixel, and 1 bit
// pixel stride.
return ImageUtil.isBinary(sm);
}
public static LCMSImageLayout createImageLayout(Raster r) {
LCMSImageLayout l = new LCMSImageLayout();
if (r instanceof ByteComponentRaster &&
r.getSampleModel() instanceof ComponentSampleModel) {
ByteComponentRaster br = (ByteComponentRaster)r;
ComponentSampleModel csm = (ComponentSampleModel)r.getSampleModel();
l.pixelType = CHANNELS_SH(br.getNumBands()) | BYTES_SH(1);
int[] bandOffsets = csm.getBandOffsets();
BandOrder order = BandOrder.getBandOrder(bandOffsets);
int firstBand = 0;
switch (order) {
case INVERTED:
l.pixelType |= DOSWAP;
firstBand = csm.getNumBands() - 1;
break;
case DIRECT:
// do nothing
break;
default:
// unable to create the image layout;
return null;
}
l.nextRowOffset = br.getScanlineStride();
l.nextPixelOffset = br.getPixelStride();
l.offset = br.getDataOffset(firstBand);
l.dataArray = br.getDataStorage();
l.dataType = DT_BYTE;
l.width = br.getWidth();
l.height = br.getHeight();
if (l.nextRowOffset == l.width * br.getPixelStride()) {
l.imageAtOnce = true;
}
return l;
}
return null;
}
/**
* Constructs a ByteInterleavedRaster with the given SampleModel,
* DataBuffer, and parent. DataBuffer must be a DataBufferByte and
* SampleModel must be of type SinglePixelPackedSampleModel
* or InterleavedSampleModel.
* When translated into the base Raster's
* coordinate system, aRegion must be contained by the base Raster.
* Origin is the coordinate in the new Raster's coordinate system of
* the origin of the base Raster. (The base Raster is the Raster's
* ancestor which has no parent.)
*
* Note that this constructor should generally be called by other
* constructors or create methods, it should not be used directly.
* @param sampleModel The SampleModel that specifies the layout.
* @param dataBuffer The DataBufferShort that contains the image data.
* @param aRegion The Rectangle that specifies the image area.
* @param origin The Point that specifies the origin.
* @param parent The parent (if any) of this raster.
*/
public ByteInterleavedRaster(SampleModel sampleModel,
DataBuffer dataBuffer,
Rectangle aRegion,
Point origin,
ByteInterleavedRaster parent) {
super(sampleModel, dataBuffer, aRegion, origin, parent);
this.maxX = minX + width;
this.maxY = minY + height;
if (!(dataBuffer instanceof DataBufferByte)) {
throw new RasterFormatException("ByteInterleavedRasters must have " +
"byte DataBuffers");
}
DataBufferByte dbb = (DataBufferByte)dataBuffer;
this.data = stealData(dbb, 0);
int xOffset = aRegion.x - origin.x;
int yOffset = aRegion.y - origin.y;
if (sampleModel instanceof PixelInterleavedSampleModel ||
(sampleModel instanceof ComponentSampleModel &&
isInterleaved((ComponentSampleModel)sampleModel))) {
ComponentSampleModel csm = (ComponentSampleModel)sampleModel;
this.scanlineStride = csm.getScanlineStride();
this.pixelStride = csm.getPixelStride();
this.dataOffsets = csm.getBandOffsets();
for (int i = 0; i < getNumDataElements(); i++) {
dataOffsets[i] += xOffset*pixelStride+yOffset*scanlineStride;
}
} else if (sampleModel instanceof SinglePixelPackedSampleModel) {
SinglePixelPackedSampleModel sppsm =
(SinglePixelPackedSampleModel)sampleModel;
this.packed = true;
this.bitMasks = sppsm.getBitMasks();
this.bitOffsets = sppsm.getBitOffsets();
this.scanlineStride = sppsm.getScanlineStride();
this.pixelStride = 1;
this.dataOffsets = new int[1];
this.dataOffsets[0] = dbb.getOffset();
dataOffsets[0] += xOffset*pixelStride+yOffset*scanlineStride;
} else {
throw new RasterFormatException("ByteInterleavedRasters must " +
"have PixelInterleavedSampleModel, SinglePixelPackedSampleModel"+
" or interleaved ComponentSampleModel. Sample model is " +
sampleModel);
}
this.bandOffset = this.dataOffsets[0];
this.dbOffsetPacked = dataBuffer.getOffset() -
sampleModelTranslateY*scanlineStride -
sampleModelTranslateX*pixelStride;
this.dbOffset = dbOffsetPacked -
(xOffset*pixelStride+yOffset*scanlineStride);
// Set inOrder to true if the data elements are in order and
// have no gaps between them
this.inOrder = false;
if (numDataElements == pixelStride) {
inOrder = true;
for (int i = 1; i < numDataElements; i++) {
if (dataOffsets[i] - dataOffsets[0] != i) {
inOrder = false;
break;
}
}
}
verify();
}
/**
* Returns whether the image has contiguous data across rows.
*/
public static final boolean imageIsContiguous(RenderedImage image) {
SampleModel sm;
if(image instanceof BufferedImage) {
WritableRaster ras = ((BufferedImage)image).getRaster();
sm = ras.getSampleModel();
} else {
sm = image.getSampleModel();
}
if (sm instanceof ComponentSampleModel) {
// Ensure image rows samples are stored contiguously
// in a single bank.
ComponentSampleModel csm = (ComponentSampleModel)sm;
if (csm.getPixelStride() != csm.getNumBands()) {
return false;
}
int[] bandOffsets = csm.getBandOffsets();
for (int i = 0; i < bandOffsets.length; i++) {
if (bandOffsets[i] != i) {
return false;
}
}
int[] bankIndices = csm.getBankIndices();
for (int i = 0; i < bandOffsets.length; i++) {
if (bankIndices[i] != 0) {
return false;
}
}
return true;
}
// Otherwise true if and only if it's a bilevel image with
// a MultiPixelPackedSampleModel, 1 bit per pixel, and 1 bit
// pixel stride.
return ImageUtil.isBinary(sm);
}
public static LCMSImageLayout createImageLayout(Raster r) {
LCMSImageLayout l = new LCMSImageLayout();
if (r instanceof ByteComponentRaster &&
r.getSampleModel() instanceof ComponentSampleModel) {
ByteComponentRaster br = (ByteComponentRaster)r;
ComponentSampleModel csm = (ComponentSampleModel)r.getSampleModel();
l.pixelType = CHANNELS_SH(br.getNumBands()) | BYTES_SH(1);
int[] bandOffsets = csm.getBandOffsets();
BandOrder order = BandOrder.getBandOrder(bandOffsets);
int firstBand = 0;
switch (order) {
case INVERTED:
l.pixelType |= DOSWAP;
firstBand = csm.getNumBands() - 1;
break;
case DIRECT:
// do nothing
break;
default:
// unable to create the image layout;
return null;
}
l.nextRowOffset = br.getScanlineStride();
l.nextPixelOffset = br.getPixelStride();
l.offset = br.getDataOffset(firstBand);
l.dataArray = br.getDataStorage();
l.dataType = DT_BYTE;
l.width = br.getWidth();
l.height = br.getHeight();
if (l.nextRowOffset == l.width * br.getPixelStride()) {
l.imageAtOnce = true;
}
return l;
}
return null;
}
/**
* Constructs a ByteInterleavedRaster with the given SampleModel,
* DataBuffer, and parent. DataBuffer must be a DataBufferByte and
* SampleModel must be of type SinglePixelPackedSampleModel
* or InterleavedSampleModel.
* When translated into the base Raster's
* coordinate system, aRegion must be contained by the base Raster.
* Origin is the coordinate in the new Raster's coordinate system of
* the origin of the base Raster. (The base Raster is the Raster's
* ancestor which has no parent.)
*
* Note that this constructor should generally be called by other
* constructors or create methods, it should not be used directly.
* @param sampleModel The SampleModel that specifies the layout.
* @param dataBuffer The DataBufferShort that contains the image data.
* @param aRegion The Rectangle that specifies the image area.
* @param origin The Point that specifies the origin.
* @param parent The parent (if any) of this raster.
*/
public ByteInterleavedRaster(SampleModel sampleModel,
DataBuffer dataBuffer,
Rectangle aRegion,
Point origin,
ByteInterleavedRaster parent) {
super(sampleModel, dataBuffer, aRegion, origin, parent);
this.maxX = minX + width;
this.maxY = minY + height;
if (!(dataBuffer instanceof DataBufferByte)) {
throw new RasterFormatException("ByteInterleavedRasters must have " +
"byte DataBuffers");
}
DataBufferByte dbb = (DataBufferByte)dataBuffer;
this.data = stealData(dbb, 0);
int xOffset = aRegion.x - origin.x;
int yOffset = aRegion.y - origin.y;
if (sampleModel instanceof PixelInterleavedSampleModel ||
(sampleModel instanceof ComponentSampleModel &&
isInterleaved((ComponentSampleModel)sampleModel))) {
ComponentSampleModel csm = (ComponentSampleModel)sampleModel;
this.scanlineStride = csm.getScanlineStride();
this.pixelStride = csm.getPixelStride();
this.dataOffsets = csm.getBandOffsets();
for (int i = 0; i < getNumDataElements(); i++) {
dataOffsets[i] += xOffset*pixelStride+yOffset*scanlineStride;
}
} else if (sampleModel instanceof SinglePixelPackedSampleModel) {
SinglePixelPackedSampleModel sppsm =
(SinglePixelPackedSampleModel)sampleModel;
this.packed = true;
this.bitMasks = sppsm.getBitMasks();
this.bitOffsets = sppsm.getBitOffsets();
this.scanlineStride = sppsm.getScanlineStride();
this.pixelStride = 1;
this.dataOffsets = new int[1];
this.dataOffsets[0] = dbb.getOffset();
dataOffsets[0] += xOffset*pixelStride+yOffset*scanlineStride;
} else {
throw new RasterFormatException("ByteInterleavedRasters must " +
"have PixelInterleavedSampleModel, SinglePixelPackedSampleModel"+
" or interleaved ComponentSampleModel. Sample model is " +
sampleModel);
}
this.bandOffset = this.dataOffsets[0];
this.dbOffsetPacked = dataBuffer.getOffset() -
sampleModelTranslateY*scanlineStride -
sampleModelTranslateX*pixelStride;
this.dbOffset = dbOffsetPacked -
(xOffset*pixelStride+yOffset*scanlineStride);
// Set inOrder to true if the data elements are in order and
// have no gaps between them
this.inOrder = false;
if (numDataElements == pixelStride) {
inOrder = true;
for (int i = 1; i < numDataElements; i++) {
if (dataOffsets[i] - dataOffsets[0] != i) {
inOrder = false;
break;
}
}
}
verify();
}