/* * 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.FullyQualifiedNameTriplet; import org.apache.fop.afp.util.BinaryUtils; /** * The Preprocess Presentation Object structured field specifies presentation * parameters for a data object that has been mapped as a resource. */ public class PreprocessPresentationObject extends AbstractTripletStructuredObject { private static final byte TYPE_OTHER = (byte)0x92; private static final byte TYPE_OVERLAY = (byte)0xDF; private static final byte TYPE_IMAGE = (byte)0xFB; private byte objType = TYPE_OTHER; private byte objOrent; // object always processed at 0 degree orientation private int objXOffset = -1; private int objYOffset = -1; /** * Main constructor * * @param prePresObj the presentation object to be preprocessed */ public PreprocessPresentationObject(AbstractTripletStructuredObject prePresObj) { if (prePresObj instanceof ImageObject || prePresObj instanceof Overlay) { if (prePresObj instanceof ImageObject) { this.objType = TYPE_IMAGE; } else { this.objType = TYPE_OVERLAY; } setFullyQualifiedName( FullyQualifiedNameTriplet.TYPE_BEGIN_RESOURCE_OBJECT_REF, FullyQualifiedNameTriplet.FORMAT_CHARSTR, prePresObj.getFullyQualifiedName()); } else { this.objType = TYPE_OTHER; } } /** 0 degrees orientation */ public static final byte ORIENTATION_ZERO_DEGREES = 1; /** 90 degrees orientation */ public static final byte ORIENTATION_90_DEGREES = 2; /** 180 degrees orientation */ public static final byte ORIENTATION_180_DEGREES = 4; /** 270 degrees orientation */ public static final byte ORIENTATION_270_DEGREES = 8; /** * Sets the object orientations relative to media leading edge * * @param orientation the object orientations relative to media leading edge */ public void setOrientation(byte orientation) { objOrent = orientation; } /** * Sets the X axis origin for object content * * @param xOffset the X axis origin for object content */ public void setXOffset(int xOffset) { this.objXOffset = xOffset; } /** * Sets the Y axis origin for object content * * @param yOffset the Y axis origin for object content */ public void setYOffset(int yOffset) { this.objYOffset = yOffset; } /** {@inheritDoc} */ public void writeStart(OutputStream os) throws IOException { super.writeStart(os); byte[] data = new byte[9]; copySF(data, Type.PROCESS, Category.DATA_RESOURCE); byte[] l = BinaryUtils.convert(19 + getTripletDataLength(), 2); data[1] = l[0]; // Length byte 1 data[2] = l[1]; // Length byte 1 os.write(data); } /** {@inheritDoc} */ public void writeContent(OutputStream os) throws IOException { byte[] data = new byte[12]; byte[] l = BinaryUtils.convert(12 + getTripletDataLength(), 2); data[0] = l[0]; // RGLength data[1] = l[1]; // RGLength data[2] = objType; // ObjType data[3] = 0x00; // Reserved data[4] = 0x00; // Reserved data[5] = objOrent; // ObjOrent if (objXOffset > 0) { byte[] xOff = BinaryUtils.convert(objYOffset, 3); data[6] = xOff[0]; // XocaOset (not specified) data[7] = xOff[1]; // XocaOset data[8] = xOff[2]; // XocaOset } else { data[6] = (byte)0xFF; // XocaOset (not specified) data[7] = (byte)0xFF; // XocaOset data[8] = (byte)0xFF; // XocaOset } if (objYOffset > 0) { byte[] yOff = BinaryUtils.convert(objYOffset, 3); data[9] = yOff[0]; // YocaOset (not specified) data[10] = yOff[1]; // YocaOset data[11] = yOff[2]; // YocaOset } else { data[9] = (byte)0xFF; // YocaOset (not specified) data[10] = (byte)0xFF; // YocaOset data[11] = (byte)0xFF; // YocaOset } os.write(data); writeTriplets(os); } }