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 }