1
2 package org.freehep.graphicsio.emf;
3
4 import java.awt.Color;
5 import java.awt.Dimension;
6 import java.awt.Point;
7 import java.awt.Rectangle;
8 import java.awt.geom.AffineTransform;
9 import java.io.IOException;
10 import java.io.OutputStream;
11
12 import org.freehep.util.io.ActionHeader;
13 import org.freehep.util.io.Tag;
14 import org.freehep.util.io.TagHeader;
15 import org.freehep.util.io.TaggedOutputStream;
16
17
18
19
20
21
22
23
24 public class EMFOutputStream extends TaggedOutputStream {
25
26 private String application;
27
28 private String name;
29
30 private int recordCount;
31
32 private Rectangle imageBounds;
33
34 private int version;
35
36 private EMFHandleManager handles;
37
38 private Dimension device;
39
40 public EMFOutputStream(OutputStream os, Rectangle imageBounds,
41 EMFHandleManager handles, String application, String name,
42 Dimension device, int version) throws IOException {
43
44
45 super(os, new EMFTagSet(version), null, true);
46 this.recordCount = 0;
47 this.version = version;
48 this.imageBounds = imageBounds;
49 this.handles = handles;
50 this.application = application;
51 this.name = name;
52 this.device = device;
53
54
55 pushBuffer();
56 }
57
58 public EMFOutputStream(OutputStream os, Rectangle imageBounds,
59 EMFHandleManager handles, String application, String name,
60 Dimension device) throws IOException {
61
62 this(os, imageBounds, handles, application, name, device, 1);
63 }
64
65 public void close() throws IOException {
66 int len = popBuffer();
67 recordCount++;
68 EMFHeader header = new EMFHeader(imageBounds, getVersion(), 0, len,
69 recordCount, handles.maxHandlesUsed(), application, name,
70 device);
71 writeHeader(header);
72 append();
73
74 super.close();
75 }
76
77
78 public void writeDWORD(int i) throws IOException {
79 writeUnsignedInt(i);
80 }
81
82
83 public void writeDWORD(int[] w) throws IOException {
84 for (int i = 0; i < w.length; i++) {
85 writeDWORD(w[i]);
86 }
87 }
88
89
90 public void writeWORD(int s) throws IOException {
91 writeUnsignedShort(s);
92 }
93
94 public void writeFLOAT(float f) throws IOException {
95 writeFloat(f);
96 }
97
98 public void writeCOLORREF(Color c) throws IOException {
99 writeByte(c.getRed());
100 writeByte(c.getGreen());
101 writeByte(c.getBlue());
102
103 writeByte(0x00);
104 }
105
106
107 public void writeCOLOR16(Color c) throws IOException {
108 writeShort(c.getRed() << 8);
109 writeShort(c.getGreen() << 8);
110 writeShort(c.getBlue() << 8);
111 writeShort(c.getAlpha() << 8);
112 }
113
114 public void writeXFORM(AffineTransform t) throws IOException {
115 writeFLOAT((float) t.getScaleX());
116 writeFLOAT((float) t.getShearY());
117 writeFLOAT((float) t.getShearX());
118 writeFLOAT((float) t.getScaleY());
119 writeFLOAT((float) t.getTranslateX());
120 writeFLOAT((float) t.getTranslateY());
121 }
122
123
124 public void writePOINTS(Point[] p) throws IOException {
125 writePOINTS(p.length, p);
126 }
127
128 public void writePOINTS(int n, Point[] p) throws IOException {
129 for (int i = 0; i < n; i++) {
130 writePOINTS(p[i]);
131 }
132 }
133
134 public void writePOINTS(Point p) throws IOException {
135 writeSHORT((short) p.x);
136 writeSHORT((short) p.y);
137 }
138
139
140 public void writePOINTL(Point[] p) throws IOException {
141 writePOINTL(p.length, p);
142 }
143
144 public void writePOINTL(int n, Point[] p) throws IOException {
145 for (int i = 0; i < n; i++) {
146 writePOINTL(p[i]);
147 }
148 }
149
150
151 public void writePOINTL(Point p) throws IOException {
152 writeLONG(p.x);
153 writeLONG(p.y);
154 }
155
156
157 public void writeRECTL(Rectangle r) throws IOException {
158 writeLONG(r.x);
159 writeLONG(r.y);
160 writeLONG(r.x + r.width);
161 writeLONG(r.y + r.height);
162 }
163
164
165 public void writeSIZEL(Dimension d) throws IOException {
166 writeLONG(d.width);
167 writeLONG(d.height);
168 }
169
170
171 public void writeUINT(int i) throws IOException {
172 writeUnsignedInt(i);
173 }
174
175
176 public void writeULONG(int i) throws IOException {
177 writeUnsignedInt(i);
178 }
179
180
181 public void writeLONG(int i) throws IOException {
182 writeInt(i);
183 }
184
185 public void writeSHORT(short i) throws IOException {
186 writeShort(i);
187 }
188
189
190 public void writeBYTE(byte[] b) throws IOException {
191 writeByte(b);
192 }
193
194
195 public void writeBYTE(byte b) throws IOException {
196 writeByte(b);
197 }
198
199
200 public void writeBYTE(int b) throws IOException {
201 writeByte(b);
202 }
203
204 public void writeBYTE(boolean b) throws IOException {
205 writeBYTE((b) ? 1 : 0);
206 }
207
208 public void writeWORD(boolean b) throws IOException {
209 writeWORD((b) ? 1 : 0);
210 }
211
212 public void writeDWORD(boolean b) throws IOException {
213 writeDWORD((b) ? 1 : 0);
214 }
215
216 public void writeWCHAR(String s) throws IOException {
217 writeByte(s.getBytes("UTF-16LE"));
218 }
219
220 public void writeWCHAR(String s, int size) throws IOException {
221 writeWCHAR(s);
222 for (int i = size - s.length(); i > 0; i--) {
223 writeWORD(0);
224 }
225 }
226
227 protected int getTagAlignment() {
228 return 4;
229 }
230
231 protected void writeTagHeader(TagHeader header) throws IOException {
232
233 int tagID = header.getTag();
234 long length = header.getLength();
235 writeUnsignedInt(tagID);
236 writeUnsignedInt(length + 8);
237 }
238
239 public void writeTag(Tag tag) throws IOException {
240
241 recordCount++;
242 super.writeTag(tag);
243 }
244
245 protected void writeActionHeader(ActionHeader header) throws IOException {
246
247 }
248
249 public void writeHeader(EMFHeader header) throws IOException {
250 header.write(this);
251 }
252
253 public int getVersion() {
254 return version;
255 }
256 }