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
23 * This represents an EPS document. Several EpsGraphics2D objects may point
\r
24 * to the same EpsDocument.
\r
26 * Copyright Paul Mutton,
\r
27 * <a href="http://www.jibble.org/">http://www.jibble.org/</a>
\r
30 public class EpsDocument
\r
34 * Constructs an empty EpsDevice.
\r
36 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,
\r
52 int minY, int maxX, int maxY)
\r
60 _bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
\r
61 write(_bufferedWriter);
\r
65 * Returns the title of the EPS document.
\r
67 public synchronized String getTitle()
\r
73 * Updates the bounds of the current EPS document.
\r
75 public synchronized void updateBounds(double x, double y)
\r
96 * Appends a line to the EpsDocument. A new line character is added
\r
97 * to the end of the line when it is added.
\r
99 public synchronized void append(EpsGraphics2D g, String line)
\r
101 if (_lastG == null)
\r
105 else if (g != _lastG)
\r
107 EpsGraphics2D lastG = _lastG;
\r
109 // We are being drawn on with a different EpsGraphics2D context.
\r
110 // We may need to update the clip, etc from this new context.
\r
111 if (g.getClip() != lastG.getClip())
\r
113 g.setClip(g.getClip());
\r
115 if (!g.getColor().equals(lastG.getColor()))
\r
117 g.setColor(g.getColor());
\r
119 if (!g.getBackground().equals(lastG.getBackground()))
\r
121 g.setBackground(g.getBackground());
\r
123 // We don't need this, as this only affects the stroke and font,
\r
124 // which are dealt with separately later on.
\r
125 //if (!g.getTransform().equals(lastG.getTransform())) {
\r
126 // g.setTransform(g.getTransform());
\r
128 if (!g.getPaint().equals(lastG.getPaint()))
\r
130 g.setPaint(g.getPaint());
\r
132 if (!g.getComposite().equals(lastG.getComposite()))
\r
134 g.setComposite(g.getComposite());
\r
136 if (!g.getComposite().equals(lastG.getComposite()))
\r
138 g.setComposite(g.getComposite());
\r
140 if (!g.getFont().equals(lastG.getFont()))
\r
142 g.setFont(g.getFont());
\r
144 if (!g.getStroke().equals(lastG.getStroke()))
\r
146 g.setStroke(g.getStroke());
\r
153 _bufferedWriter.write(line + "\n");
\r
155 catch (IOException e)
\r
157 throw new EpsException("Could not write to the output file: " + e);
\r
162 * Outputs the contents of the EPS document to the specified
\r
163 * Writer, complete with headers and bounding box.
\r
165 public synchronized void write(Writer writer)
\r
168 float offsetX = -minX;
\r
169 float offsetY = -minY;
\r
171 writer.write("%!PS-Adobe-3.0 EPSF-3.0\n");
\r
172 writer.write("%%Creator: Jalview " +
\r
173 jalview.bin.Cache.getProperty("VERSION") + " \n");
\r
174 writer.write("%%Title: " + _title + "\n");
\r
175 writer.write("%%CreationDate: " + new Date() + "\n");
\r
176 writer.write("%%BoundingBox: 0 0 " + ( (int) Math.ceil(maxX + offsetX)) +
\r
177 " " + ( (int) Math.ceil(maxY + offsetY)) + "\n");
\r
178 writer.write("%%DocumentData: Clean7Bit\n");
\r
179 writer.write("%%DocumentProcessColors: Black\n");
\r
180 writer.write("%%ColorUsage: Color\n");
\r
181 writer.write("%%Origin: 0 0\n");
\r
182 writer.write("%%Pages: 1\n");
\r
183 writer.write("%%Page: 1 1\n");
\r
184 writer.write("%%EndComments\n\n");
\r
186 writer.write("gsave\n");
\r
188 if (_stringWriter != null)
\r
190 writer.write(offsetX + " " + (offsetY) + " translate\n");
\r
192 _bufferedWriter.flush();
\r
193 StringBuffer buffer = _stringWriter.getBuffer();
\r
194 for (int i = 0; i < buffer.length(); i++)
\r
196 writer.write(buffer.charAt(i));
\r
199 writeFooter(writer);
\r
203 writer.write(offsetX + " " + ( (maxY - minY) - offsetY) + " translate\n");
\r
209 private void writeFooter(Writer writer)
\r
212 writer.write("grestore\n");
\r
215 writer.write("grestore\n");
\r
217 writer.write("showpage\n");
\r
218 writer.write("\n");
\r
219 writer.write("%%EOF");
\r
223 public synchronized void flush()
\r
226 _bufferedWriter.flush();
\r
229 public synchronized void close()
\r
232 if (_stringWriter == null)
\r
234 writeFooter(_bufferedWriter);
\r
235 _bufferedWriter.flush();
\r
236 _bufferedWriter.close();
\r
240 public boolean isClipSet()
\r
245 public void setClipSet(boolean isClipSet)
\r
247 _isClipSet = isClipSet;
\r
250 private float minX;
\r
251 private float minY;
\r
252 private float maxX;
\r
253 private float maxY;
\r
255 private boolean _isClipSet = false;
\r
257 private String _title;
\r
258 private StringWriter _stringWriter;
\r
259 private BufferedWriter _bufferedWriter = null;
\r
261 // We need to remember which was the last EpsGraphics2D object to use
\r
262 // us, as we need to replace the clipping region if another EpsGraphics2D
\r
263 // object tries to use us.
\r
264 private EpsGraphics2D _lastG = null;
\r