Clover icon

Coverage Report

  1. Project Clover database Thu Nov 7 2024 17:01:39 GMT
  2. Package org.jibble.epsgraphics

File EpsDocument.java

 

Coverage histogram

../../../img/srcFileCovDistChart0.png
0% of files have more coverage

Code metrics

36
86
11
1
276
187
30
0.35
7.82
11
2.73

Classes

Class Line # Actions
EpsDocument 39 86 30
0.00%
 

Contributing tests

No tests hitting this source file were found.

Source view

1    /*
2    * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3    * Copyright (C) $$Year-Rel$$ The Jalview Authors
4    *
5    * This file is part of Jalview.
6    *
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.
11    *
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.
16    *
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.
20    */
21    package org.jibble.epsgraphics;
22   
23    import java.io.BufferedWriter;
24    import java.io.IOException;
25    import java.io.OutputStream;
26    import java.io.OutputStreamWriter;
27    import java.io.StringWriter;
28    import java.io.Writer;
29    import java.util.Date;
30   
31    /**
32    * This represents an EPS document. Several EpsGraphics2D objects may point to
33    * the same EpsDocument.
34    * <p>
35    * Copyright Paul Mutton,
36    * <a href="http://www.jibble.org/">http://www.jibble.org/</a>
37    *
38    */
 
39    public class EpsDocument
40    {
41   
42    /**
43    * Constructs an empty EpsDevice.
44    */
 
45  0 toggle public EpsDocument(String title)
46    {
47  0 _title = title;
48  0 minX = Float.POSITIVE_INFINITY;
49  0 minY = Float.POSITIVE_INFINITY;
50  0 maxX = Float.NEGATIVE_INFINITY;
51  0 maxY = Float.NEGATIVE_INFINITY;
52  0 _stringWriter = new StringWriter();
53  0 _bufferedWriter = new BufferedWriter(_stringWriter);
54    }
55   
56    /**
57    * Constructs an empty EpsDevice that writes directly to a file. Bounds must
58    * be set before use.
59    */
 
60  0 toggle public EpsDocument(String title, OutputStream outputStream, int minX,
61    int minY, int maxX, int maxY) throws IOException
62    {
63  0 _title = title;
64  0 this.minX = minX;
65  0 this.minY = minY;
66  0 this.maxX = maxX;
67  0 this.maxY = maxY;
68  0 _bufferedWriter = new BufferedWriter(
69    new OutputStreamWriter(outputStream));
70  0 write(_bufferedWriter);
71    }
72   
73    /**
74    * Returns the title of the EPS document.
75    */
 
76  0 toggle public synchronized String getTitle()
77    {
78  0 return _title;
79    }
80   
81    /**
82    * Updates the bounds of the current EPS document.
83    */
 
84  0 toggle public synchronized void updateBounds(double x, double y)
85    {
86  0 if (x > maxX)
87    {
88  0 maxX = (float) x;
89    }
90  0 if (x < minX)
91    {
92  0 minX = (float) x;
93    }
94  0 if (y > maxY)
95    {
96  0 maxY = (float) y;
97    }
98  0 if (y < minY)
99    {
100  0 minY = (float) y;
101    }
102    }
103   
104    /**
105    * Appends a line to the EpsDocument. A new line character is added to the end
106    * of the line when it is added.
107    */
 
108  0 toggle public synchronized void append(EpsGraphics2D g, String line)
109    {
110  0 if (_lastG == null)
111    {
112  0 _lastG = g;
113    }
114  0 else if (g != _lastG)
115    {
116  0 EpsGraphics2D lastG = _lastG;
117  0 _lastG = g;
118    // We are being drawn on with a different EpsGraphics2D context.
119    // We may need to update the clip, etc from this new context.
120  0 if (g.getClip() != lastG.getClip())
121    {
122  0 g.setClip(g.getClip());
123    }
124  0 if (!g.getColor().equals(lastG.getColor()))
125    {
126  0 g.setColor(g.getColor());
127    }
128  0 if (!g.getBackground().equals(lastG.getBackground()))
129    {
130  0 g.setBackground(g.getBackground());
131    }
132    // We don't need this, as this only affects the stroke and font,
133    // which are dealt with separately later on.
134    // if (!g.getTransform().equals(lastG.getTransform())) {
135    // g.setTransform(g.getTransform());
136    // }
137  0 if (!g.getPaint().equals(lastG.getPaint()))
138    {
139  0 g.setPaint(g.getPaint());
140    }
141  0 if (!g.getComposite().equals(lastG.getComposite()))
142    {
143  0 g.setComposite(g.getComposite());
144    }
145  0 if (!g.getComposite().equals(lastG.getComposite()))
146    {
147  0 g.setComposite(g.getComposite());
148    }
149  0 if (!g.getFont().equals(lastG.getFont()))
150    {
151  0 g.setFont(g.getFont());
152    }
153  0 if (!g.getStroke().equals(lastG.getStroke()))
154    {
155  0 g.setStroke(g.getStroke());
156    }
157    }
158  0 _lastG = g;
159   
160  0 try
161    {
162  0 _bufferedWriter.write(line + "\n");
163    } catch (IOException e)
164    {
165  0 throw new EpsException("Could not write to the output file: " + e);
166    }
167    }
168   
169    /**
170    * Outputs the contents of the EPS document to the specified Writer, complete
171    * with headers and bounding box.
172    */
 
173  0 toggle public synchronized void write(Writer writer) throws IOException
174    {
175  0 float offsetX = -minX;
176  0 float offsetY = -minY;
177   
178  0 writer.write("%!PS-Adobe-3.0 EPSF-3.0\n");
179  0 writer.write("%%Creator: Jalview "
180    + jalview.bin.Cache.getProperty("VERSION") + " \n");
181  0 writer.write("%%Title: " + _title + "\n");
182  0 writer.write("%%CreationDate: " + new Date() + "\n");
183  0 writer.write("%%BoundingBox: 0 0 " + ((int) Math.ceil(maxX + offsetX))
184    + " " + ((int) Math.ceil(maxY + offsetY)) + "\n");
185  0 writer.write("%%DocumentData: Clean7Bit\n");
186  0 writer.write("%%DocumentProcessColors: Black\n");
187  0 writer.write("%%ColorUsage: Color\n");
188  0 writer.write("%%Origin: 0 0\n");
189  0 writer.write("%%Pages: 1\n");
190  0 writer.write("%%Page: 1 1\n");
191  0 writer.write("%%EndComments\n\n");
192   
193  0 writer.write("gsave\n");
194   
195  0 if (_stringWriter != null)
196    {
197  0 writer.write(offsetX + " " + (offsetY) + " translate\n");
198   
199  0 _bufferedWriter.flush();
200  0 StringBuffer buffer = _stringWriter.getBuffer();
201  0 for (int i = 0; i < buffer.length(); i++)
202    {
203  0 writer.write(buffer.charAt(i));
204    }
205   
206  0 writeFooter(writer);
207    }
208    else
209    {
210  0 writer.write(
211    offsetX + " " + ((maxY - minY) - offsetY) + " translate\n");
212    }
213   
214  0 writer.flush();
215    }
216   
 
217  0 toggle private void writeFooter(Writer writer) throws IOException
218    {
219  0 writer.write("grestore\n");
220  0 if (isClipSet())
221    {
222  0 writer.write("grestore\n");
223    }
224  0 writer.write("showpage\n");
225  0 writer.write("\n");
226  0 writer.write("%%EOF");
227  0 writer.flush();
228    }
229   
 
230  0 toggle public synchronized void flush() throws IOException
231    {
232  0 _bufferedWriter.flush();
233    }
234   
 
235  0 toggle public synchronized void close() throws IOException
236    {
237  0 if (_stringWriter == null)
238    {
239  0 writeFooter(_bufferedWriter);
240  0 _bufferedWriter.flush();
241  0 _bufferedWriter.close();
242    }
243    }
244   
 
245  0 toggle public boolean isClipSet()
246    {
247  0 return _isClipSet;
248    }
249   
 
250  0 toggle public void setClipSet(boolean isClipSet)
251    {
252  0 _isClipSet = isClipSet;
253    }
254   
255    private float minX;
256   
257    private float minY;
258   
259    private float maxX;
260   
261    private float maxY;
262   
263    private boolean _isClipSet = false;
264   
265    private String _title;
266   
267    private StringWriter _stringWriter;
268   
269    private BufferedWriter _bufferedWriter = null;
270   
271    // We need to remember which was the last EpsGraphics2D object to use
272    // us, as we need to replace the clipping region if another EpsGraphics2D
273    // object tries to use us.
274    private EpsGraphics2D _lastG = null;
275   
276    }