1
2 package org.freehep.graphicsio.emf;
3
4 import java.awt.Dimension;
5 import java.awt.Rectangle;
6 import java.io.IOException;
7
8
9
10
11
12
13
14 public class EMFHeader implements EMFConstants {
15 private static final Dimension screenMM = new Dimension(320, 240);
16
17 private Rectangle bounds;
18
19 private Rectangle frame;
20
21 private String signature;
22
23 private int versionMajor;
24
25 private int versionMinor;
26
27 private int bytes;
28
29 private int records;
30
31 private int handles;
32
33 private String description;
34
35 private int palEntries;
36
37 private Dimension device;
38
39 private Dimension millimeters;
40
41 private Dimension micrometers;
42
43 private boolean openGL;
44
45 public EMFHeader(Rectangle bounds, int versionMajor, int versionMinor,
46 int bytes, int records, int handles, String application,
47 String name, Dimension device) {
48 this.bounds = bounds;
49
50
51 double pixelWidth = (double) screenMM.width / device.width;
52 double pixelHeight = (double) screenMM.height / device.height;
53 this.frame = new Rectangle((int) (bounds.x * 100 * pixelWidth),
54 (int) (bounds.y * 100 * pixelHeight),
55 (int) (bounds.width * 100 * pixelWidth),
56 (int) (bounds.height * 100 * pixelHeight));
57
58 this.signature = " EMF";
59 this.versionMajor = versionMajor;
60 this.versionMinor = versionMinor;
61 this.bytes = bytes;
62 this.records = records;
63 this.handles = handles;
64 this.description = application.trim() + "\0" + name.trim() + "\0\0";
65
66 this.palEntries = 0;
67 this.device = device;
68 this.millimeters = screenMM;
69
70 this.openGL = false;
71 this.micrometers = new Dimension(screenMM.width * 1000,
72 screenMM.height * 1000);
73 }
74
75 EMFHeader(EMFInputStream emf) throws IOException {
76
77 emf.readUnsignedInt();
78
79 int length = emf.readDWORD();
80
81 bounds = emf.readRECTL();
82 frame = emf.readRECTL();
83 signature = new String(emf.readBYTE(4));
84
85 int version = emf.readDWORD();
86 versionMajor = version >> 16;
87 versionMinor = version & 0xFFFF;
88 bytes = emf.readDWORD();
89 records = emf.readDWORD();
90 handles = emf.readWORD();
91 emf.readWORD();
92
93 int dLen = emf.readDWORD();
94 int dOffset = emf.readDWORD();
95 palEntries = emf.readDWORD();
96 device = emf.readSIZEL();
97 millimeters = emf.readSIZEL();
98
99 int bytesRead = 88;
100 if (dOffset > 88) {
101 emf.readDWORD();
102 emf.readDWORD();
103 openGL = (emf.readDWORD() != 0) ? true : false;
104 bytesRead += 12;
105 if (dOffset > 100) {
106 micrometers = emf.readSIZEL();
107 bytesRead += 8;
108 }
109 }
110
111
112 if (bytesRead < dOffset) {
113 emf.skipBytes(dOffset - bytesRead);
114 bytesRead = dOffset;
115 }
116
117 description = emf.readWCHAR(dLen);
118 bytesRead += dLen * 2;
119
120
121 if (bytesRead < length) {
122 emf.skipBytes(length - bytesRead);
123 }
124 }
125
126 public void write(EMFOutputStream emf) throws IOException {
127 int align = emf.getTagAlignment();
128 int padding = (align - (size() % align)) % align;
129 int alignedSize = size() + padding;
130
131 emf.writeDWORD(0x00000001);
132 emf.writeDWORD(alignedSize);
133 emf.writeRECTL(bounds);
134 emf.writeRECTL(frame);
135
136 emf.writeBYTE(signature.getBytes());
137 emf.writeDWORD((versionMajor << 16) | versionMinor);
138 emf.writeDWORD(alignedSize + bytes);
139 emf.writeDWORD(records);
140 emf.writeWORD(handles);
141 emf.writeWORD(0);
142 emf.writeDWORD(description.length());
143 emf.writeDWORD(0x6C);
144 emf.writeDWORD(palEntries);
145 emf.writeSIZEL(device);
146 emf.writeSIZEL(millimeters);
147 emf.writeDWORD(0);
148 emf.writeDWORD(0);
149 emf.writeDWORD(openGL);
150 emf.writeSIZEL(micrometers);
151
152
153 emf.writeWCHAR(description);
154
155
156 for (int i = 0; i < padding; i++) {
157 emf.write(0);
158 }
159 }
160
161
162
163
164 public int size() {
165 return 108 + (2 * description.length());
166 }
167
168 public String toString() {
169 StringBuffer s = new StringBuffer("EMF Header\n");
170 s.append(" bounds: ").append(bounds).append("\n");
171 s.append(" frame: ").append(frame).append("\n");
172 s.append(" signature: ").append(signature).append("\n");
173 s.append(" versionMajor: ").append(versionMajor).append("\n");
174 s.append(" versionMinor: ").append(versionMinor).append("\n");
175 s.append(" #bytes: ").append(bytes).append("\n");
176 s.append(" #records: ").append(records).append("\n");
177 s.append(" #handles: ").append(handles).append("\n");
178 s.append(" description: ").append(description).append("\n");
179 s.append(" #palEntries: ").append(palEntries).append("\n");
180 s.append(" device: ").append(device).append("\n");
181 s.append(" millimeters: ").append(millimeters).append("\n");
182
183 s.append(" openGL: ").append(openGL).append("\n");
184 s.append(" micrometers: ").append(micrometers);
185
186 return s.toString();
187 }
188
189
190
191
192
193
194
195
196 public Rectangle getBounds() {
197 return bounds;
198 }
199
200
201
202
203
204
205
206
207 public Rectangle getFrame() {
208 return frame;
209 }
210
211
212
213
214
215
216 public String getSignature() {
217 return signature;
218 }
219
220
221
222
223 public String getDescription() {
224 return description;
225 }
226
227
228
229
230
231 public Dimension getDevice() {
232 return device;
233 }
234
235
236
237
238
239 public Dimension getMillimeters() {
240 return millimeters;
241 }
242
243
244
245
246
247
248 public Dimension getMicrometers() {
249 return micrometers;
250 }
251
252
253
254
255
256
257
258
259
260
261 public boolean isOpenGL() {
262 return openGL;
263 }
264 }