blob: 07f9da88068feb3316c50fa66d41ca705640d4b4 [file] [log] [blame]
/* 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 java.awt.*;
/**
* @author Rolf W. Rasmussen <rolfwr@ii.uib.no>
*/
public class Raster
{
protected SampleModel sampleModel;
protected DataBuffer dataBuffer;
protected int minX;
protected int minY;
protected int width;
protected int height;
protected int sampleModelTranslateX;
protected int sampleModelTranslateY;
protected int numBands;
protected int numDataElements;
protected Raster parent;
protected Raster(SampleModel sampleModel, Point origin)
{
this(sampleModel, sampleModel.createDataBuffer(), origin);
}
protected Raster(SampleModel sampleModel, DataBuffer dataBuffer,
Point origin)
{
this(sampleModel, dataBuffer,
new Rectangle(origin.x, origin.y,
sampleModel.getWidth(), sampleModel.getHeight()),
origin, null);
}
protected Raster(SampleModel sampleModel, DataBuffer dataBuffer,
Rectangle aRegion,
Point sampleModelTranslate, Raster parent)
{
this.sampleModel = sampleModel;
this.dataBuffer = dataBuffer;
this.minX = aRegion.x;
this.minY = aRegion.y;
this.width = aRegion.width;
this.height = aRegion.height;
this.sampleModelTranslateX = sampleModelTranslate.x;
this.sampleModelTranslateY = sampleModelTranslate.y;
this.numBands = sampleModel.getNumBands();
this.numDataElements = sampleModel.getNumDataElements();
this.parent = parent;
}
public static WritableRaster createInterleavedRaster(int dataType,
int w, int h,
int bands,
Point location)
{
int[] bandOffsets = new int[bands];
// TODO: Maybe not generate this every time.
for (int b=0; b<bands; b++) bandOffsets[b] = b;
int scanlineStride = bands*w;
return createInterleavedRaster(dataType, w, h, scanlineStride, bands,
bandOffsets, location);
}
public static WritableRaster createInterleavedRaster(int dataType,
int w, int h,
int scanlineStride,
int pixelStride,
int[] bandOffsets,
Point location)
{
SampleModel sm = new ComponentSampleModel(dataType,
w, h,
pixelStride,
scanlineStride,
bandOffsets);
return createWritableRaster(sm, location);
}
public static WritableRaster createBandedRaster(int dataType,
int w, int h, int bands,
Point location)
{
// FIXME: Implement;
throw new UnsupportedOperationException("not implemented yet");
}
public static WritableRaster createBandedRaster(int dataType,
int w, int h,
int scanlineStride,
int[] bankIndices,
int[] bandOffsets,
Point location)
{
// FIXME: Implement;
throw new UnsupportedOperationException("not implemented yet");
}
public static WritableRaster createPackedRaster(int dataType,
int w, int h,
int[] bandMasks,
Point location)
{
SampleModel sm = new SinglePixelPackedSampleModel(dataType,
w, h,
bandMasks);
return createWritableRaster(sm, location);
}
public static WritableRaster
createInterleavedRaster(DataBuffer dataBuffer, int w, int h,
int scanlineStride, int pixelStride,
int[] bandOffsets, Point location)
{
SampleModel sm = new ComponentSampleModel(dataBuffer.getDataType(),
w, h,
scanlineStride,
pixelStride,
bandOffsets);
return createWritableRaster(sm, dataBuffer, location);
}
public static
WritableRaster createBandedRaster(DataBuffer dataBuffer,
int w, int h,
int scanlineStride,
int[] bankIndices,
int[] bandOffsets,
Point location)
{
// FIXME: Implement;
throw new UnsupportedOperationException("not implemented yet");
}
public static WritableRaster
createPackedRaster(DataBuffer dataBuffer,
int w, int h,
int scanlineStride,
int[] bandMasks,
Point location) {
SampleModel sm =
new SinglePixelPackedSampleModel(dataBuffer.getDataType(),
w, h,
scanlineStride,
bandMasks);
return createWritableRaster(sm, dataBuffer, location);
}
public static Raster createRaster(SampleModel sm, DataBuffer db,
Point location)
{
return new Raster(sm, db, location);
}
public static WritableRaster createWritableRaster(SampleModel sm,
Point location)
{
return new WritableRaster(sm, location);
}
public static WritableRaster createWritableRaster(SampleModel sm,
DataBuffer db,
Point location)
{
return new WritableRaster(sm, db, location);
}
public Raster getParent()
{
return parent;
}
public final int getSampleModelTranslateX()
{
return sampleModelTranslateX;
}
public final int getSampleModelTranslateY()
{
return sampleModelTranslateY;
}
public WritableRaster createCompatibleWritableRaster()
{
return new WritableRaster(getSampleModel(), new Point(minX, minY));
}
public WritableRaster createCompatibleWritableRaster(int w, int h)
{
return createCompatibleWritableRaster(minX, minY, w, h);
}
public WritableRaster createCompatibleWritableRaster(Rectangle rect)
{
return createCompatibleWritableRaster(rect.x, rect.y,
rect.width, rect.height);
}
public WritableRaster createCompatibleWritableRaster(int x, int y,
int w, int h)
{
SampleModel sm = getSampleModel().createCompatibleSampleModel(w, h);
return new WritableRaster(sm, sm.createDataBuffer(),
new Point(x, y));
}
public Raster createTranslatedChild(int childMinX, int childMinY) {
int tcx = sampleModelTranslateX - minX + childMinX;
int tcy = sampleModelTranslateY - minY + childMinY;
return new Raster(sampleModel, dataBuffer,
new Rectangle(childMinX, childMinY,
width, height),
new Point(tcx, tcy),
this);
}
public Raster createChild(int parentX, int parentY, int width,
int height, int childMinX, int childMinY,
int[] bandList)
{
/* FIXME: Throw RasterFormatException if child bounds extends
beyond the bounds of this raster. */
SampleModel sm = (bandList == null) ?
sampleModel :
sampleModel.createSubsetSampleModel(bandList);
/*
data origin
/
+-------------------------
|\. __ parent trans
| \`.
| \ `. parent origin
| \ `. /
| /\ +-------- - -
|trans\ /<\-- deltaTrans
|child +-+-\---- - -
| /|`| \__ parent [x, y]
|child | |`. \
|origin| : `.\
| | / `\
| : / +
| child [x, y]
parent_xy - parent_trans = child_xy - child_trans
child_trans = parent_trans + child_xy - parent_xy
*/
return new Raster(sm, dataBuffer,
new Rectangle(childMinX, childMinY,
width, height),
new Point(sampleModelTranslateX+childMinX-parentX,
sampleModelTranslateY+childMinY-parentY),
this);
}
public Rectangle getBounds()
{
return new Rectangle(minX, minY, width, height);
}
public final int getMinX()
{
return minX;
}
public final int getMinY()
{
return minY;
}
public final int getWidth()
{
return width;
}
public final int getHeight()
{
return height;
}
public final int getNumDataElements()
{
return numDataElements;
}
public final int getTransferType()
{
return sampleModel.getTransferType();
}
public DataBuffer getDataBuffer()
{
return dataBuffer;
}
public SampleModel getSampleModel()
{
return sampleModel;
}
public Object getDataElements(int x, int y, Object outData)
{
return sampleModel.getDataElements(x-sampleModelTranslateX,
y-sampleModelTranslateY,
outData, dataBuffer);
}
public Object getDataElements(int x, int y, int w, int h,
Object outData)
{
return sampleModel.getDataElements(x-sampleModelTranslateX,
y-sampleModelTranslateY,
w, h, outData, dataBuffer);
}
public int[] getPixel(int x, int y, int[] iArray)
{
return sampleModel.getPixel(x-sampleModelTranslateX,
y-sampleModelTranslateY,
iArray, dataBuffer);
}
public float[] getPixel(int x, int y, float[] fArray)
{
return sampleModel.getPixel(x-sampleModelTranslateX,
y-sampleModelTranslateY,
fArray, dataBuffer);
}
public double[] getPixel(int x, int y, double[] dArray)
{
return sampleModel.getPixel(x-sampleModelTranslateX,
y-sampleModelTranslateY,
dArray, dataBuffer);
}
public int[] getPixels(int x, int y, int w, int h, int[] iArray)
{
return sampleModel.getPixels(x-sampleModelTranslateX,
y-sampleModelTranslateY,
w, h, iArray, dataBuffer);
}
public float[] getPixels(int x, int y, int w, int h,
float[] fArray)
{
return sampleModel.getPixels(x-sampleModelTranslateX,
y-sampleModelTranslateY,
w, h, fArray, dataBuffer);
}
public double[] getPixels(int x, int y, int w, int h,
double[] dArray)
{
return sampleModel.getPixels(x-sampleModelTranslateX,
y-sampleModelTranslateY,
w, h, dArray, dataBuffer);
}
public int getSample(int x, int y, int b)
{
return sampleModel.getSample(x-sampleModelTranslateX,
y-sampleModelTranslateY,
b, dataBuffer);
}
public float getSampleFloat(int x, int y, int b)
{
return sampleModel.getSampleFloat(x-sampleModelTranslateX,
y-sampleModelTranslateY,
b, dataBuffer);
}
public double getSampleDouble(int x, int y, int b)
{
return sampleModel.getSampleDouble(x-sampleModelTranslateX,
y-sampleModelTranslateY,
b, dataBuffer);
}
public int[] getSamples(int x, int y, int w, int h, int b,
int[] iArray)
{
return sampleModel.getSamples(x-sampleModelTranslateX,
y-sampleModelTranslateY,
w, h, b, iArray, dataBuffer);
}
public float[] getSamples(int x, int y, int w, int h, int b,
float[] fArray)
{
return sampleModel.getSamples(x-sampleModelTranslateX,
y-sampleModelTranslateY,
w, h, b, fArray, dataBuffer);
}
public double[] getSamples(int x, int y, int w, int h, int b,
double[] dArray)
{
return sampleModel.getSamples(x-sampleModelTranslateX,
y-sampleModelTranslateY,
w, h, b, dArray, dataBuffer);
}
}