2 Copyright Paul James Mutton, 2001-2004, http://www.jibble.org/
\r
4 This file is part of EpsGraphics2D.
\r
6 This software is dual-licensed, allowing you to choose between the GNU
\r
7 General Public License (GPL) and the www.jibble.org Commercial License.
\r
8 Since the GPL may be too restrictive for use in a proprietary application,
\r
9 a commercial license is also provided. Full license information can be
\r
10 found at http://www.jibble.org/licenses/
\r
17 package org.jibble.epsgraphics;
\r
24 * This represents an EPS document. Several EpsGraphics2D objects may point
\r
25 * to the same EpsDocument.
\r
27 * Copyright Paul Mutton,
\r
28 * <a href="http://www.jibble.org/">http://www.jibble.org/</a>
\r
31 public class EpsDocument {
\r
35 * Constructs an empty EpsDevice.
\r
37 public EpsDocument(String title) {
\r
39 minX = Float.POSITIVE_INFINITY;
\r
40 minY = Float.POSITIVE_INFINITY;
\r
41 maxX = Float.NEGATIVE_INFINITY;
\r
42 maxY = Float.NEGATIVE_INFINITY;
\r
43 _stringWriter = new StringWriter();
\r
44 _bufferedWriter = new BufferedWriter(_stringWriter);
\r
48 * Constructs an empty EpsDevice that writes directly to a file.
\r
49 * Bounds must be set before use.
\r
51 public EpsDocument(String title, OutputStream outputStream, int minX, int minY, int maxX, int maxY) throws IOException {
\r
57 _bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
\r
58 write(_bufferedWriter);
\r
63 * Returns the title of the EPS document.
\r
65 public synchronized String getTitle() {
\r
71 * Updates the bounds of the current EPS document.
\r
73 public synchronized void updateBounds(double x, double y) {
\r
90 * Appends a line to the EpsDocument. A new line character is added
\r
91 * to the end of the line when it is added.
\r
93 public synchronized void append(EpsGraphics2D g, String line) {
\r
94 if (_lastG == null) {
\r
97 else if (g != _lastG) {
\r
98 EpsGraphics2D lastG = _lastG;
\r
100 // We are being drawn on with a different EpsGraphics2D context.
\r
101 // We may need to update the clip, etc from this new context.
\r
102 if (g.getClip() != lastG.getClip()) {
\r
103 g.setClip(g.getClip());
\r
105 if (!g.getColor().equals(lastG.getColor())) {
\r
106 g.setColor(g.getColor());
\r
108 if (!g.getBackground().equals(lastG.getBackground())) {
\r
109 g.setBackground(g.getBackground());
\r
111 // We don't need this, as this only affects the stroke and font,
\r
112 // which are dealt with separately later on.
\r
113 //if (!g.getTransform().equals(lastG.getTransform())) {
\r
114 // g.setTransform(g.getTransform());
\r
116 if (!g.getPaint().equals(lastG.getPaint())) {
\r
117 g.setPaint(g.getPaint());
\r
119 if (!g.getComposite().equals(lastG.getComposite())) {
\r
120 g.setComposite(g.getComposite());
\r
122 if (!g.getComposite().equals(lastG.getComposite())) {
\r
123 g.setComposite(g.getComposite());
\r
125 if (!g.getFont().equals(lastG.getFont())) {
\r
126 g.setFont(g.getFont());
\r
128 if (!g.getStroke().equals(lastG.getStroke())) {
\r
129 g.setStroke(g.getStroke());
\r
135 _bufferedWriter.write(line + "\n");
\r
137 catch (IOException e) {
\r
138 throw new EpsException("Could not write to the output file: " + e);
\r
144 * Outputs the contents of the EPS document to the specified
\r
145 * Writer, complete with headers and bounding box.
\r
147 public synchronized void write(Writer writer) throws IOException {
\r
148 float offsetX = -minX;
\r
149 float offsetY = -minY;
\r
151 writer.write("%!PS-Adobe-3.0 EPSF-3.0\n");
\r
152 writer.write("%%Creator: Jalview " + jalview.bin.Cache.getProperty("VERSION") + " \n");
\r
153 writer.write("%%Title: " + _title + "\n");
\r
154 writer.write("%%CreationDate: " + new Date() + "\n");
\r
155 writer.write("%%BoundingBox: 0 0 " + ((int) Math.ceil(maxX + offsetX)) + " " + ((int) Math.ceil(maxY + offsetY)) + "\n");
\r
156 writer.write("%%DocumentData: Clean7Bit\n");
\r
157 writer.write("%%DocumentProcessColors: Black\n");
\r
158 writer.write("%%ColorUsage: Color\n");
\r
159 writer.write("%%Origin: 0 0\n");
\r
160 writer.write("%%Pages: 1\n");
\r
161 writer.write("%%Page: 1 1\n");
\r
162 writer.write("%%EndComments\n\n");
\r
164 writer.write("gsave\n");
\r
166 if (_stringWriter != null) {
\r
167 writer.write(offsetX + " " + (offsetY) + " translate\n");
\r
169 _bufferedWriter.flush();
\r
170 StringBuffer buffer = _stringWriter.getBuffer();
\r
171 for (int i = 0; i < buffer.length(); i++) {
\r
172 writer.write(buffer.charAt(i));
\r
175 writeFooter(writer);
\r
178 writer.write(offsetX + " " + ((maxY - minY) - offsetY) + " translate\n");
\r
185 private void writeFooter(Writer writer) throws IOException {
\r
186 writer.write("grestore\n");
\r
188 writer.write("grestore\n");
\r
190 writer.write("showpage\n");
\r
191 writer.write("\n");
\r
192 writer.write("%%EOF");
\r
197 public synchronized void flush() throws IOException {
\r
198 _bufferedWriter.flush();
\r
201 public synchronized void close() throws IOException {
\r
202 if (_stringWriter == null) {
\r
203 writeFooter(_bufferedWriter);
\r
204 _bufferedWriter.flush();
\r
205 _bufferedWriter.close();
\r
210 public boolean isClipSet() {
\r
214 public void setClipSet(boolean isClipSet) {
\r
215 _isClipSet = isClipSet;
\r
219 private float minX;
\r
220 private float minY;
\r
221 private float maxX;
\r
222 private float maxY;
\r
224 private boolean _isClipSet = false;
\r
226 private String _title;
\r
227 private StringWriter _stringWriter;
\r
228 private BufferedWriter _bufferedWriter = null;
\r
230 // We need to remember which was the last EpsGraphics2D object to use
\r
231 // us, as we need to replace the clipping region if another EpsGraphics2D
\r
232 // object tries to use us.
\r
233 private EpsGraphics2D _lastG = null;
\r