}
return size;
}
public void write(ImageOutputStream out) throws IOException {
ChannelList chlist = getChannelList();
long start = out.getStreamPosition();
out.setByteOrder(ByteOrder.LITTLE_ENDIAN);
out.writeInt(MAGIC);
out.writeInt(VERSION);
for (Map.Entry<String, Attribute> entry : attributes.entrySet()) {
Attribute attr = entry.getValue();
String name = entry.getKey();
String type = attr.getClass().getAnnotation(OpenEXRAttributeType.class).value();
out.writeBytes(name);
out.writeByte(0);
out.writeBytes(type);
out.writeByte(0);
out.flush();
long attrStart = out.getStreamPosition() + 4;
out.seek(attrStart);
attr.write(out);
long attrEnd = out.getStreamPosition();
out.seek(out.getFlushedPosition());
out.writeInt((int) (attrEnd - attrStart));
out.seek(attrEnd);
out.flush();
}
out.writeByte(0);
CompressionMethod cm = getCompressionMethod();
Box2i dw = getDataWindow();
int xmin = dw.getXMin();
int ymin = dw.getYMin();
int xmax = dw.getXMax();
int ymax = dw.getYMax();
int numBlocks = dw.getYSize() / cm.getScanLinesPerBlock();
long blockPtrPos = out.getStreamPosition();
long blockPos = blockPtrPos + 8 * numBlocks;
int maximumBlockSize = computeMaximumTileSize(new V2i(dw.getXSize(),
Math.min(dw.getYSize(), cm.getScanLinesPerBlock())));
byte[] blockData = new byte[maximumBlockSize];
IIOByteBuffer buf = new IIOByteBuffer(null, 0, 0);
ByteBuffer bytes = ByteBuffer.wrap(blockData).order(ByteOrder.LITTLE_ENDIAN);
int firstBlock;
int lastBlock;
int blockIncr;
switch (getLineOrder()) {
case INCREASING_Y:
case RANDOM_Y:
firstBlock = 0;
lastBlock = numBlocks;
blockIncr = 1;
break;
case DECREASING_Y:
firstBlock = numBlocks - 1;
lastBlock = -1;
blockIncr = -1;
break;
default:
throw new UnexpectedException("Invalid line order");
}
for (int i = firstBlock; i != lastBlock; i += blockIncr) {
out.seek(blockPtrPos + 8 * i);
out.writeLong(blockPos - start);
out.seek(blockPos);
bytes.rewind();
// TODO write the next block here
int x0 = dw.getXMin();
int x1 = dw.getXMax();
int y0 = dw.getYMin() + i * cm.getScanLinesPerBlock();
int y1 = Math.min(y0 + cm.getScanLinesPerBlock() - 1, dw.getYMax());
Box2i block = new Box2i(x0, y0, x1, y1);
int blockSize = computeTileSize(block);
for (int y = y0; y <= y1; y++) {
for (Channel channel : chlist.channels()) {
String name = channel.getName();
int sx = channel.getxSampling();
int sy = channel.getySampling();
if (y % sy == 0) {
int nx = 1 + (x1 - x0 - (x1 % sx)) / sx;