123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- /*
- * 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.render.afp.modca.goca;
-
- import java.io.IOException;
- import java.io.OutputStream;
-
- import org.apache.fop.render.afp.modca.PreparedAFPObject;
- import org.apache.fop.render.afp.tools.BinaryUtils;
-
- /**
- * A GOCA graphics segment
- */
- public final class GraphicsChainedSegment extends AbstractGraphicsContainer {
-
- /**
- * The maximum segment data length
- */
- protected static final int MAX_DATA_LEN = 8192;
-
- /** the current area */
- private GraphicsArea currentArea = null;
-
- /** the previous segment in the chain */
- private GraphicsChainedSegment previous = null;
-
- /** the next segment in the chain */
- private GraphicsChainedSegment next = null;
-
- /**
- * Main constructor
- *
- * @param name
- * the name of this graphics segment
- */
- public GraphicsChainedSegment(String name) {
- super(name);
- }
-
- /**
- * Constructor
- *
- * @param name
- * the name of this graphics segment
- * @param previous
- * the previous graphics segment in this chain
- */
- public GraphicsChainedSegment(String name, GraphicsChainedSegment previous) {
- super(name);
- previous.next = this;
- this.previous = previous;
- }
-
- /**
- * {@inheritDoc}
- */
- public int getDataLength() {
- int dataLen = 14 + super.getDataLength();
- if (previous == null) {
- GraphicsChainedSegment current = this.next;
- while (current != null) {
- dataLen += current.getDataLength();
- current = current.next;
- }
- }
- return dataLen;
- }
-
- /**
- * {@inheritDoc}
- */
- protected int getNameLength() {
- return 4;
- }
-
- private static final byte APPEND_NEW_SEGMENT = 0;
-
- private static final byte PROLOG = 4;
-
- private static final byte APPEND_TO_EXISING = 48;
-
- /**
- * {@inheritDoc}
- */
- protected void writeStart(OutputStream os) throws IOException {
- super.writeStart(os);
- int len = super.getDataLength();
- byte[] segLen = BinaryUtils.convert(len, 2);
- byte[] data = new byte[] {
- 0x70, // BEGIN_SEGMENT
- 0x0C, // Length of following parameters
- this.nameBytes[0],
- this.nameBytes[1],
- this.nameBytes[2],
- this.nameBytes[3],
- 0x00, // FLAG1 (ignored)
- APPEND_NEW_SEGMENT,
- segLen[0], // SEGL
- segLen[1],
- 0x00,
- 0x00,
- 0x00,
- 0x00
- };
- // P/S NAME (predecessor name)
- if (previous != null) {
- data[10] = previous.nameBytes[0];
- data[11] = previous.nameBytes[1];
- data[12] = previous.nameBytes[2];
- data[13] = previous.nameBytes[3];
- }
- os.write(data);
- }
-
- /**
- * {@inheritDoc}
- */
- protected void writeEnd(OutputStream os) throws IOException {
- // I am the first segment in the chain so write out the rest
- if (previous == null) {
- GraphicsChainedSegment current = this.next;
- while (current != null) {
- current.writeDataStream(os);
- current = current.next;
- }
- }
- }
-
- /**
- * Begins a graphics area (start of fill)
- */
- protected void beginArea() {
- this.currentArea = new GraphicsArea();
- super.addDrawingOrder(currentArea);
- }
-
- /**
- * Ends a graphics area (end of fill)
- */
- protected void endArea() {
- this.currentArea = null;
- }
-
- /**
- * {@inheritDoc}
- */
- protected PreparedAFPObject addDrawingOrder(PreparedAFPObject drawingOrder) {
- if (currentArea != null) {
- currentArea.addDrawingOrder(drawingOrder);
- } else {
- super.addDrawingOrder(drawingOrder);
- }
- return drawingOrder;
- }
-
- /**
- * {@inheritDoc}
- */
- public String toString() {
- return "GraphicsChainedSegment(name=" + super.name + ")";
- }
- }
|