2 * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3 * Copyright (C) $$Year-Rel$$ The Jalview Authors
5 * This file is part of Jalview.
7 * Jalview is free software: you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation, either version 3
10 * of the License, or (at your option) any later version.
12 * Jalview is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty
14 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
19 * The Jalview Authors are detailed in the 'AUTHORS' file.
21 package org.jibble.epsgraphics;
23 import jalview.util.MessageManager;
25 import java.io.BufferedWriter;
26 import java.io.IOException;
27 import java.io.OutputStream;
28 import java.io.OutputStreamWriter;
29 import java.io.StringWriter;
30 import java.io.Writer;
31 import java.util.Date;
34 * This represents an EPS document. Several EpsGraphics2D objects may point to
35 * the same EpsDocument.
37 * Copyright Paul Mutton, <a
38 * href="http://www.jibble.org/">http://www.jibble.org/</a>
41 public class EpsDocument
45 * Constructs an empty EpsDevice.
47 public EpsDocument(String title)
50 minX = Float.POSITIVE_INFINITY;
51 minY = Float.POSITIVE_INFINITY;
52 maxX = Float.NEGATIVE_INFINITY;
53 maxY = Float.NEGATIVE_INFINITY;
54 _stringWriter = new StringWriter();
55 _bufferedWriter = new BufferedWriter(_stringWriter);
59 * Constructs an empty EpsDevice that writes directly to a file. Bounds must
62 public EpsDocument(String title, OutputStream outputStream, int minX,
63 int minY, int maxX, int maxY) throws IOException
70 _bufferedWriter = new BufferedWriter(new OutputStreamWriter(
72 write(_bufferedWriter);
76 * Returns the title of the EPS document.
78 public synchronized String getTitle()
84 * Updates the bounds of the current EPS document.
86 public synchronized void updateBounds(double x, double y)
107 * Appends a line to the EpsDocument. A new line character is added to the end
108 * of the line when it is added.
110 public synchronized void append(EpsGraphics2D g, String line)
116 else if (g != _lastG)
118 EpsGraphics2D lastG = _lastG;
120 // We are being drawn on with a different EpsGraphics2D context.
121 // We may need to update the clip, etc from this new context.
122 if (g.getClip() != lastG.getClip())
124 g.setClip(g.getClip());
126 if (!g.getColor().equals(lastG.getColor()))
128 g.setColor(g.getColor());
130 if (!g.getBackground().equals(lastG.getBackground()))
132 g.setBackground(g.getBackground());
134 // We don't need this, as this only affects the stroke and font,
135 // which are dealt with separately later on.
136 // if (!g.getTransform().equals(lastG.getTransform())) {
137 // g.setTransform(g.getTransform());
139 if (!g.getPaint().equals(lastG.getPaint()))
141 g.setPaint(g.getPaint());
143 if (!g.getComposite().equals(lastG.getComposite()))
145 g.setComposite(g.getComposite());
147 if (!g.getComposite().equals(lastG.getComposite()))
149 g.setComposite(g.getComposite());
151 if (!g.getFont().equals(lastG.getFont()))
153 g.setFont(g.getFont());
155 if (!g.getStroke().equals(lastG.getStroke()))
157 g.setStroke(g.getStroke());
164 _bufferedWriter.write(line + "\n");
165 } catch (IOException e)
167 throw new EpsException(MessageManager.formatMessage(
168 "exception.eps_coudnt_write_output_file",
169 new String[] { e.getMessage() }));
174 * Outputs the contents of the EPS document to the specified Writer, complete
175 * with headers and bounding box.
177 public synchronized void write(Writer writer) throws IOException
179 float offsetX = -minX;
180 float offsetY = -minY;
182 writer.write("%!PS-Adobe-3.0 EPSF-3.0\n");
183 writer.write("%%Creator: Jalview "
184 + jalview.bin.Cache.getProperty("VERSION") + " \n");
185 writer.write("%%Title: " + _title + "\n");
186 writer.write("%%CreationDate: " + new Date() + "\n");
187 writer.write("%%BoundingBox: 0 0 " + ((int) Math.ceil(maxX + offsetX))
188 + " " + ((int) Math.ceil(maxY + offsetY)) + "\n");
189 writer.write("%%DocumentData: Clean7Bit\n");
190 writer.write("%%DocumentProcessColors: Black\n");
191 writer.write("%%ColorUsage: Color\n");
192 writer.write("%%Origin: 0 0\n");
193 writer.write("%%Pages: 1\n");
194 writer.write("%%Page: 1 1\n");
195 writer.write("%%EndComments\n\n");
197 writer.write("gsave\n");
199 if (_stringWriter != null)
201 writer.write(offsetX + " " + (offsetY) + " translate\n");
203 _bufferedWriter.flush();
204 StringBuffer buffer = _stringWriter.getBuffer();
205 for (int i = 0; i < buffer.length(); i++)
207 writer.write(buffer.charAt(i));
214 writer.write(offsetX + " " + ((maxY - minY) - offsetY)
221 private void writeFooter(Writer writer) throws IOException
223 writer.write("grestore\n");
226 writer.write("grestore\n");
228 writer.write("showpage\n");
230 writer.write("%%EOF");
234 public synchronized void flush() throws IOException
236 _bufferedWriter.flush();
239 public synchronized void close() throws IOException
241 if (_stringWriter == null)
243 writeFooter(_bufferedWriter);
244 _bufferedWriter.flush();
245 _bufferedWriter.close();
249 public boolean isClipSet()
254 public void setClipSet(boolean isClipSet)
256 _isClipSet = isClipSet;
267 private boolean _isClipSet = false;
269 private String _title;
271 private StringWriter _stringWriter;
273 private BufferedWriter _bufferedWriter = null;
275 // We need to remember which was the last EpsGraphics2D object to use
276 // us, as we need to replace the clipping region if another EpsGraphics2D
277 // object tries to use us.
278 private EpsGraphics2D _lastG = null;