| /* |
| * 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.xmlgraphics.ps; |
| |
| import java.awt.geom.AffineTransform; |
| import java.awt.geom.Dimension2D; |
| import java.awt.geom.Rectangle2D; |
| import java.io.IOException; |
| |
| /** |
| * Abstract helper class for generating PostScript forms. |
| */ |
| public abstract class FormGenerator { |
| |
| private String formName; |
| private String title; |
| private Dimension2D dimensions; |
| |
| /** |
| * Main constructor. |
| * @param formName the form's name |
| * @param title the form's title or null |
| * @param dimensions the form's dimensions |
| */ |
| public FormGenerator(String formName, String title, Dimension2D dimensions) { |
| this.formName = formName; |
| this.title = title; |
| this.dimensions = dimensions; |
| } |
| |
| /** |
| * Returns the form's name. |
| * @return the form's name |
| */ |
| public String getFormName() { |
| return this.formName; |
| } |
| |
| /** |
| * Returns the form's title. |
| * @return the form's title or null if there's no title |
| */ |
| public String getTitle() { |
| return this.title; |
| } |
| |
| /** |
| * returns the form's dimensions. |
| * @return the form's dimensions |
| */ |
| public Dimension2D getDimensions() { |
| return this.dimensions; |
| } |
| |
| /** |
| * Generates the PostScript code for the PaintProc of the form. |
| * @param gen the PostScript generator |
| * @throws IOException if an I/O error occurs |
| */ |
| protected abstract void generatePaintProc(PSGenerator gen) throws IOException; |
| |
| /** |
| * Generates some PostScript code right after the form definition (used primarily for |
| * bitmap data). |
| * @param gen the PostScript generator |
| * @throws IOException if an I/O error occurs |
| */ |
| protected void generateAdditionalDataStream(PSGenerator gen) throws IOException { |
| //nop |
| } |
| |
| /** |
| * Returns the matrix for use in the form. |
| * @return the matrix |
| */ |
| protected AffineTransform getMatrix() { |
| return new AffineTransform(); |
| } |
| |
| /** |
| * Returns the form's bounding box. |
| * @return the form's bounding box |
| */ |
| protected Rectangle2D getBBox() { |
| return new Rectangle2D.Double(0, 0, dimensions.getWidth(), dimensions.getHeight()); |
| } |
| |
| /** |
| * Generates the PostScript form. |
| * @param gen the PostScript generator |
| * @return a PSResource instance representing the form |
| * @throws IOException if an I/O error occurs |
| */ |
| public PSResource generate(PSGenerator gen) throws IOException { |
| if (gen.getPSLevel() < 2) { |
| throw new UnsupportedOperationException( |
| "Forms require at least Level 2 PostScript"); |
| } |
| gen.writeDSCComment(DSCConstants.BEGIN_RESOURCE, |
| new Object[] {PSResource.TYPE_FORM, getFormName()}); |
| if (title != null) { |
| gen.writeDSCComment(DSCConstants.TITLE, title); |
| } |
| gen.writeln("/" + formName); |
| gen.writeln("<< /FormType 1"); |
| gen.writeln(" /BBox " + gen.formatRectangleToArray(getBBox())); |
| gen.writeln(" /Matrix " + gen.formatMatrix(getMatrix())); |
| gen.writeln(" /PaintProc {"); |
| gen.writeln(" pop"); |
| gen.writeln(" gsave"); |
| generatePaintProc(gen); |
| gen.writeln(" grestore"); |
| gen.writeln(" } bind"); |
| gen.writeln(">> def"); |
| generateAdditionalDataStream(gen); |
| gen.writeDSCComment(DSCConstants.END_RESOURCE); |
| PSResource res = new PSResource(PSResource.TYPE_FORM, formName); |
| gen.getResourceTracker().registerSuppliedResource(res); |
| return res; |
| } |
| } |