package org.apache.fop.afp.modca;
import java.io.IOException;
import java.io.OutputStream;
import org.apache.fop.afp.AFPDataObjectInfo;
import org.apache.fop.afp.AFPObjectAreaInfo;
import org.apache.fop.afp.AFPResourceInfo;
import org.apache.fop.afp.AFPResourceLevel;
import org.apache.fop.afp.Factory;
import org.apache.fop.afp.modca.triplets.MappingOptionTriplet;
import org.apache.fop.afp.util.BinaryUtils;
public class ObjectContainer extends AbstractDataObject {
private static final int MAX_DATA_LEN = 8192;
private byte[] data;
public ObjectContainer(Factory factory, String name) {
super(factory, name);
}
protected void writeStart(OutputStream os) throws IOException {
byte[] headerData = new byte[17];
copySF(headerData, Type.BEGIN, Category.OBJECT_CONTAINER);
int containerLen = headerData.length + getTripletDataLength() - 1;
byte[] len = BinaryUtils.convert(containerLen, 2);
headerData[1] = len[0];
headerData[2] = len[1];
os.write(headerData);
}
protected void writeContent(OutputStream os) throws IOException {
super.writeContent(os);
byte[] dataHeader = new byte[9];
copySF(dataHeader, SF_CLASS, Type.DATA, Category.OBJECT_CONTAINER);
final int lengthOffset = 1;
if (data != null) {
writeChunksToStream(data, dataHeader, lengthOffset, MAX_DATA_LEN, os);
}
}
protected void writeEnd(OutputStream os) throws IOException {
byte[] data = new byte[17];
copySF(data, Type.END, Category.OBJECT_CONTAINER);
os.write(data);
}
public void setViewport(AFPDataObjectInfo dataObjectInfo) {
AFPResourceInfo resourceInfo = dataObjectInfo.getResourceInfo();
AFPResourceLevel resourceLevel = resourceInfo.getLevel();
if (resourceLevel.isInline()) {
super.setViewport(dataObjectInfo);
MapContainerData mapContainerData
= factory.createMapContainerData(MappingOptionTriplet.SCALE_TO_FIT);
getObjectEnvironmentGroup().setMapContainerData(mapContainerData);
int dataWidth = dataObjectInfo.getDataWidth();
int dataHeight = dataObjectInfo.getDataHeight();
AFPObjectAreaInfo objectAreaInfo = dataObjectInfo.getObjectAreaInfo();
int widthRes = objectAreaInfo.getWidthRes();
int heightRes = objectAreaInfo.getHeightRes();
ContainerDataDescriptor containerDataDescriptor
= factory.createContainerDataDescriptor(
dataWidth, dataHeight, widthRes, heightRes);
getObjectEnvironmentGroup().setDataDescriptor(containerDataDescriptor);
}
}
public void setData(byte[] data) {
this.data = data;
}
}