blob: 90b8ad6640a2fbb0688767bf0ce181f8369fa5bc [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.
*/
/* $Id$ */
package org.apache.fop.afp.modca;
import java.io.IOException;
import java.io.OutputStream;
import org.apache.fop.afp.modca.triplets.MappingOptionTriplet;
import org.apache.fop.afp.modca.triplets.MeasurementUnitsTriplet;
import org.apache.fop.afp.modca.triplets.ObjectAreaSizeTriplet;
import org.apache.fop.afp.util.BinaryUtils;
/**
* An Include Object structured field references an object on a page or overlay.
* It optionally contains parameters that identify the object and that specify
* presentation parameters such as object position, size, orientation, mapping,
* and default color.
* <p>
* Where the presentation parameters conflict with parameters specified in the
* object's environment group (OEG), the parameters in the Include Object
* structured field override. If the referenced object is a page segment, the
* IOB parameters override the corresponding environment group parameters on all
* data objects in the page segment.
* </p>
*/
public class IncludeObject extends AbstractNamedAFPObject {
/** the object referenced is of type page segment */
public static final byte TYPE_PAGE_SEGMENT = (byte)0x5F;
/** the object referenced is of type other */
public static final byte TYPE_OTHER = (byte)0x92;
/** the object referenced is of type graphic */
public static final byte TYPE_GRAPHIC = (byte)0xBB;
/** the object referenced is of type barcode */
public static final byte TYPE_BARCODE = (byte)0xEB;
/** the object referenced is of type image */
public static final byte TYPE_IMAGE = (byte)0xFB;
/** the object type referenced (default is other) */
private byte objectType = TYPE_OTHER;
/** the X-axis origin of the object area */
private int xoaOset;
/** the Y-axis origin of the object area */
private int yoaOset;
/** the orientation of the referenced object */
private AxisOrientation oaOrent = AxisOrientation.RIGHT_HANDED_0;
/** the X-axis origin defined in the object */
private int xocaOset = -1;
/** the Y-axis origin defined in the object */
private int yocaOset = -1;
/**
* Constructor for the include object with the specified name, the name must
* be a fixed length of eight characters and is the name of the referenced
* object.
*
* @param name the name of this include object
*/
public IncludeObject(String name) {
super(name);
}
/**
* Sets the orientation to use for the Include Object.
*
* @param orientation
* The orientation (0,90, 180, 270)
*/
public void setObjectAreaOrientation(int orientation) {
this.oaOrent = AxisOrientation.getRightHandedAxisOrientationFor(orientation);
}
/**
* Sets the x and y offset to the origin in the object area
*
* @param x the X-axis origin of the object area
* @param y the Y-axis origin of the object area
*/
public void setObjectAreaOffset(int x, int y) {
this.xoaOset = x;
this.yoaOset = y;
}
/**
* Sets the x and y offset of the content area to the object area
* used in conjunction with the
* {@link MappingOptionTriplet#POSITION} and
* {@link MappingOptionTriplet#POSITION_AND_TRIM}.
*
* @param x the X-axis origin defined in the object
* @param y the Y-axis origin defined in the object
*/
public void setContentAreaOffset(int x, int y) {
this.xocaOset = x;
this.yocaOset = y;
}
/**
* Sets the data object type
*
* @param type the data object type
*/
public void setObjectType(byte type) {
this.objectType = type;
}
/** {@inheritDoc} */
public void writeToStream(OutputStream os) throws IOException {
byte[] data = new byte[36];
super.copySF(data, Type.INCLUDE, Category.DATA_RESOURCE);
// Set the total record length
int tripletDataLength = getTripletDataLength();
byte[] len = BinaryUtils.convert(35 + tripletDataLength, 2); //Ignore first byte
data[1] = len[0];
data[2] = len[1];
data[17] = 0x00; // reserved
data[18] = objectType;
writeOsetTo(data, 19, xoaOset);
writeOsetTo(data, 22, yoaOset);
oaOrent.writeTo(data, 25);
writeOsetTo(data, 29, xocaOset);
writeOsetTo(data, 32, yocaOset);
// RefCSys (Reference coordinate system)
data[35] = 0x01; // Page or overlay coordinate system
// Write structured field data
os.write(data);
// Write triplet for FQN internal/external object reference
writeTriplets(os);
}
private static void writeOsetTo(byte[] out, int offset, int oset) {
if (oset > -1) {
byte[] y = BinaryUtils.convert(oset, 3);
out[offset] = y[0];
out[offset + 1] = y[1];
out[offset + 2] = y[2];
} else {
out[offset] = (byte)0xFF;
out[offset + 1] = (byte)0xFF;
out[offset + 2] = (byte)0xFF;
}
}
private String getObjectTypeName() {
String objectTypeName = null;
if (objectType == TYPE_PAGE_SEGMENT) {
objectTypeName = "page segment";
} else if (objectType == TYPE_OTHER) {
objectTypeName = "other";
} else if (objectType == TYPE_GRAPHIC) {
objectTypeName = "graphic";
} else if (objectType == TYPE_BARCODE) {
objectTypeName = "barcode";
} else if (objectType == TYPE_IMAGE) {
objectTypeName = "image";
}
return objectTypeName;
}
/** {@inheritDoc} */
public String toString() {
return "IncludeObject{name=" + this.getName()
+ ", objectType=" + getObjectTypeName()
+ ", xoaOset=" + xoaOset
+ ", yoaOset=" + yoaOset
+ ", oaOrent" + oaOrent
+ ", xocaOset=" + xocaOset
+ ", yocaOset=" + yocaOset
+ "}";
}
/**
* Sets the mapping option
*
* @param optionValue the mapping option value
*/
public void setMappingOption(byte optionValue) {
addTriplet(new MappingOptionTriplet(optionValue));
}
/**
* Sets the extent of an object area in the X and Y directions
*
* @param x the x direction extent
* @param y the y direction extent
*/
public void setObjectAreaSize(int x, int y) {
addTriplet(new ObjectAreaSizeTriplet(x, y));
}
/**
* Sets the measurement units used to specify the units of measure
*
* @param xRes units per base on the x-axis
* @param yRes units per base on the y-axis
*/
public void setMeasurementUnits(int xRes, int yRes) {
addTriplet(new MeasurementUnitsTriplet(xRes, xRes));
}
}