]> git.saurik.com Git - wxWidgets.git/blame - contrib/src/ogl/mfutils.cpp
added .chm support for Unix (Markus Sinner)
[wxWidgets.git] / contrib / src / ogl / mfutils.cpp
CommitLineData
1fc25a89
JS
1/////////////////////////////////////////////////////////////////////////////
2// Name: mfutils.cpp
3// Purpose: Metafile utillities
4// Author: Julian Smart
5// Modified by:
6// Created: 12/07/98
7// RCS-ID: $Id$
8// Copyright: (c) Julian Smart
9// Licence: wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12#ifdef __GNUG__
13#pragma implementation "mfutils.h"
14#endif
15
16// For compilers that support precompilation, includes "wx.h".
92a19c2e 17#include "wx/wxprec.h"
1fc25a89
JS
18
19#ifdef __BORLANDC__
20#pragma hdrstop
21#endif
22
23#ifndef WX_PRECOMP
24#include <wx/wx.h>
25#endif
26
27#include <wx/metafile.h>
28#include <wx/utils.h>
29
5f331691
RD
30#include "wx/ogl/ogl.h"
31
1fc25a89
JS
32#include <stdio.h>
33
59840ba3
RD
34static char _buf[1024]; // a temp buffer to use inplace of wxBuffer, which is deprecated.
35
1fc25a89
JS
36static char hexArray[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B',
37 'C', 'D', 'E', 'F' };
38
39static void DecToHex(int dec, char *buf)
40{
41 int firstDigit = (int)(dec/16.0);
42 int secondDigit = (int)(dec - (firstDigit*16.0));
43 buf[0] = hexArray[firstDigit];
44 buf[1] = hexArray[secondDigit];
45 buf[2] = 0;
46}
59840ba3 47
1fc25a89
JS
48// 16-bit unsigned integer
49static unsigned int getshort(FILE *fp)
50{
51 int c, c1;
52 c = getc(fp); c1 = getc(fp);
53 unsigned int res = ((unsigned int) c) + (((unsigned int) c1) << 8);
54 return res;
55}
56
57// 16-bit signed integer
58static int getsignedshort(FILE *fp)
59{
60 int c, c1;
61 c = getc(fp); c1 = getc(fp);
1484b5cc
VS
62#if 0
63 // this is not used value, no need to execute it
1fc25a89 64 int testRes = ((unsigned int) c) + (((unsigned int) c1) << 8);
1484b5cc 65#endif
1fc25a89
JS
66 unsigned long res1 = ((unsigned int) c) + (((unsigned int) c1) << 8);
67 int res = 0;
68 if (res1 > 32767)
69 res = (int)(res1 - 65536);
70 else
71 res = (int)(res1);
72 return res;
73}
74
75// 32-bit integer
76static long getint(FILE *fp)
77{
78 int c, c1, c2, c3;
79 c = getc(fp); c1 = getc(fp); c2 = getc(fp); c3 = getc(fp);
80 long res = (long)((long) c) +
59840ba3 81 (((long) c1) << 8) +
1fc25a89
JS
82 (((long) c2) << 16) +
83 (((long) c3) << 24);
84 return res;
85}
86
87
88/* Placeable metafile header
89struct mfPLACEABLEHEADER {
90 DWORD key; // 32-bit
91 HANDLE hmf; // 16-bit
92 RECT bbox; // 4x16 bit
93 WORD inch; // 16-bit
94 DWORD reserved; // 32-bit
95 WORD checksum; // 16-bit
96};
97*/
98
99wxMetaRecord::~wxMetaRecord(void)
100{
101 if (points) delete[] points;
102 if (stringParam) delete[] stringParam;
103}
104
9e053640 105wxXMetaFile::wxXMetaFile(const wxChar *file)
1fc25a89
JS
106{
107 ok = FALSE;
108 top = 0.0;
109 bottom = 0.0;
110 left = 0.0;
111 right = 0.0;
59840ba3 112
1fc25a89
JS
113 if (file)
114 ok = ReadFile(file);
115}
116
117/*
118 Handle table gdiObjects
119 ------------ ----------
120 [0] wxPen
121 [1]----param2--- wxBrush
122 [2] | wxFont
123 [3] | -> wxPen
59840ba3 124
1fc25a89
JS
125 The handle table works as follows.
126 When a GDI object is created whilst reading in the
127 metafile, the (e.g.) createpen record is added to the
128 first free entry in the handle table. The createpen
129 record's param1 is a pointer to the actual wxPen, and
130 its param2 is the index into the gdiObjects list, which only
131 grows and never shrinks (unlike the handle table.)
59840ba3 132
1fc25a89
JS
133 When SelectObject(index) is found, the index in the file
134 refers to the position in the handle table. BUT we then
135 set param2 to be the position of the wxPen in gdiObjects,
136 i.e. to param2 of the CreatePen record, itself found in
137 the handle table.
138
139 When an object is deleted, the entry in the handletable is
140 NULLed but the gdiObjects entry is not removed (no point, and
141 allows us to create all GDI objects in advance of playing the
142 metafile).
143*/
59840ba3 144
1fc25a89
JS
145
146static wxMetaRecord *HandleTable[100];
147static int HandleTableSize = 0;
148
149void DeleteMetaRecordHandle(int index)
150{
151 HandleTable[index] = NULL;
152}
153
154int AddMetaRecordHandle(wxMetaRecord *record)
155{
156 for (int i = 0; i < HandleTableSize; i++)
157 if (!HandleTable[i])
158 {
159 HandleTable[i] = record;
160 return i;
161 }
162 // No free spaces in table, so append.
59840ba3 163
1fc25a89
JS
164 HandleTable[HandleTableSize] = record;
165 HandleTableSize ++;
166 return (HandleTableSize - 1);
167}
168
9e053640 169bool wxXMetaFile::ReadFile(const wxChar *file)
1fc25a89
JS
170{
171 HandleTableSize = 0;
59840ba3 172
9e053640 173 FILE *handle = wxFopen(file, wxT("rb"));
1fc25a89
JS
174 if (!handle) return FALSE;
175
176 // Read placeable metafile header, if any
177 long key = getint(handle);
59840ba3 178
1fc25a89
JS
179 if (key == (long) 0x9AC6CDD7)
180 {
1484b5cc 181 /* long hmf = */ getshort(handle);
1fc25a89
JS
182 int iLeft, iTop, iRight, iBottom;
183 iLeft = getsignedshort(handle);
184 iTop = getsignedshort(handle);
185 iRight = getsignedshort(handle);
186 iBottom = getsignedshort(handle);
187
188 left = (double)iLeft;
189 top = (double)iTop;
190 right = (double)iRight;
191 bottom = (double)iBottom;
192
1484b5cc
VS
193 /* int inch = */ getshort(handle);
194 /* long reserved = */ getint(handle);
195 /* int checksum = */ getshort(handle);
1fc25a89
JS
196/*
197 double widthInUnits = (double)right - left;
198 double heightInUnits = (double)bottom - top;
199 *width = (int)((widthInUnits*1440.0)/inch);
200 *height = (int)((heightInUnits*1440.0)/inch);
201*/
202 }
203 else rewind(handle);
204
205 // Read METAHEADER
206 int mtType = getshort(handle);
207
208 if (mtType != 1 && mtType != 2)
209 {
210 fclose(handle);
211 return FALSE;
212 }
213
1484b5cc 214 /* int mtHeaderSize = */ getshort(handle);
1fc25a89
JS
215 int mtVersion = getshort(handle);
216
217 if (mtVersion != 0x0300 && mtVersion != 0x0100)
218 {
219 fclose(handle);
220 return FALSE;
221 }
59840ba3 222
1484b5cc
VS
223 /* long mtSize = */ getint(handle);
224 /* int mtNoObjects = */ getshort(handle);
225 /* long mtMaxRecord = */ getint(handle);
226 /* int mtNoParameters = */ getshort(handle);
1fc25a89
JS
227
228 while (!feof(handle))
229 {
230 long rdSize = getint(handle); // 4 bytes
231 int rdFunction = getshort(handle); // 2 bytes
232 if (feof(handle))
233 break;
234
235 switch (rdFunction)
236 {
237 case META_SETBKCOLOR:
238 {
239 wxMetaRecord *rec = new wxMetaRecord(META_SETBKCOLOR);
240 long colorref = getint(handle); // COLORREF
241 rec->param1 = GetRValue(colorref);
242 rec->param2 = GetGValue(colorref);
243 rec->param3 = GetBValue(colorref);
244 metaRecords.Append(rec);
245 break;
246 }
247 case META_SETBKMODE:
248 {
249 wxMetaRecord *rec = new wxMetaRecord(META_SETBKMODE);
250 rec->param1 = getshort(handle); // Background mode
251 if (rec->param1 == OPAQUE) rec->param1 = wxSOLID;
252 else rec->param1 = wxTRANSPARENT;
253 metaRecords.Append(rec);
254 break;
255 }
256 case META_SETMAPMODE:
257 {
258 wxMetaRecord *rec = new wxMetaRecord(META_SETMAPMODE);
259 rec->param1 = getshort(handle);
260 metaRecords.Append(rec);
261 break;
262 }
263// case META_SETROP2:
264// case META_SETRELABS:
265// case META_SETPOLYFILLMODE:
266// case META_SETSTRETCHBLTMODE:
267// case META_SETTEXTCHAREXTRA:
268 case META_SETTEXTCOLOR:
269 {
270 wxMetaRecord *rec = new wxMetaRecord(META_SETTEXTCOLOR);
271 long colorref = getint(handle); // COLORREF
272 rec->param1 = GetRValue(colorref);
273 rec->param2 = GetGValue(colorref);
274 rec->param3 = GetBValue(colorref);
275 metaRecords.Append(rec);
276 break;
277 }
278// case META_SETTEXTJUSTIFICATION:
279 case META_SETWINDOWORG:
280 {
281 wxMetaRecord *rec = new wxMetaRecord(META_SETWINDOWORG);
282 rec->param2 = getshort(handle);
283 rec->param1 = getshort(handle);
284 metaRecords.Append(rec);
285 break;
286 }
287 case META_SETWINDOWEXT:
288 {
289 wxMetaRecord *rec = new wxMetaRecord(META_SETWINDOWEXT);
290 rec->param2 = getshort(handle);
291 rec->param1 = getshort(handle);
292 metaRecords.Append(rec);
293 break;
294 }
295// case META_SETVIEWPORTORG:
296// case META_SETVIEWPORTEXT:
297// case META_OFFSETWINDOWORG:
298// case META_SCALEWINDOWEXT:
299// case META_OFFSETVIEWPORTORG:
300// case META_SCALEVIEWPORTEXT:
301 case META_LINETO:
302 {
303 wxMetaRecord *rec = new wxMetaRecord(META_LINETO);
304 rec->param1 = getshort(handle); // x1
305 rec->param2 = getshort(handle); // y1
306 metaRecords.Append(rec);
307 break;
308 }
309 case META_MOVETO:
310 {
311 wxMetaRecord *rec = new wxMetaRecord(META_MOVETO);
312 rec->param1 = getshort(handle); // x1
313 rec->param2 = getshort(handle); // y1
314 metaRecords.Append(rec);
315 break;
316 }
317 case META_EXCLUDECLIPRECT:
318 {
319 wxMetaRecord *rec = new wxMetaRecord(META_EXCLUDECLIPRECT);
320 rec->param4 = getshort(handle); // y2
321 rec->param3 = getshort(handle); // x2
322 rec->param2 = getshort(handle); // y1
323 rec->param1 = getshort(handle); // x1
324 metaRecords.Append(rec);
325 break;
326 }
327 case META_INTERSECTCLIPRECT:
328 {
329 wxMetaRecord *rec = new wxMetaRecord(META_INTERSECTCLIPRECT);
330 rec->param4 = getshort(handle); // y2
331 rec->param3 = getshort(handle); // x2
332 rec->param2 = getshort(handle); // y1
333 rec->param1 = getshort(handle); // x1
334 metaRecords.Append(rec);
335 break;
336 }
337// case META_ARC: // DO!!!
338 case META_ELLIPSE:
339 {
340 wxMetaRecord *rec = new wxMetaRecord(META_ELLIPSE);
341 rec->param4 = getshort(handle); // y2
342 rec->param3 = getshort(handle); // x2
343 rec->param2 = getshort(handle); // y1
344 rec->param1 = getshort(handle); // x1
345 metaRecords.Append(rec);
346 break;
347 }
348// case META_FLOODFILL:
349// case META_PIE: // DO!!!
350 case META_RECTANGLE:
351 {
352 wxMetaRecord *rec = new wxMetaRecord(META_RECTANGLE);
353 rec->param4 = getshort(handle); // y2
354 rec->param3 = getshort(handle); // x2
355 rec->param2 = getshort(handle); // y1
356 rec->param1 = getshort(handle); // x1
357 metaRecords.Append(rec);
358 break;
359 }
360 case META_ROUNDRECT:
361 {
362 wxMetaRecord *rec = new wxMetaRecord(META_ROUNDRECT);
363 rec->param6 = getshort(handle); // width
364 rec->param5 = getshort(handle); // height
365 rec->param4 = getshort(handle); // y2
366 rec->param3 = getshort(handle); // x2
367 rec->param2 = getshort(handle); // y1
368 rec->param1 = getshort(handle); // x1
369 metaRecords.Append(rec);
370 break;
371 }
372// case META_PATBLT:
373// case META_SAVEDC:
374 case META_SETPIXEL:
375 {
376 wxMetaRecord *rec = new wxMetaRecord(META_SETPIXEL);
377 rec->param1 = getshort(handle); // x1
378 rec->param2 = getshort(handle); // y1
379 rec->param3 = getint(handle); // COLORREF
380 metaRecords.Append(rec);
381 break;
382 }
383// case META_OFFSETCLIPRGN:
384 case META_TEXTOUT:
385 {
386 wxMetaRecord *rec = new wxMetaRecord(META_TEXTOUT);
387 int count = getshort(handle);
c1fa2fda
RD
388 rec->stringParam = new wxChar[count+1];
389 fread((void *)rec->stringParam, sizeof(wxChar), count, handle);
1fc25a89
JS
390 rec->stringParam[count] = 0;
391 rec->param2 = getshort(handle); // Y
392 rec->param1 = getshort(handle); // X
393 metaRecords.Append(rec);
394 break;
395 }
396/*
397 case META_EXTTEXTOUT:
398 {
399 wxMetaRecord *rec = new wxMetaRecord(META_EXTTEXTOUT);
400 int cellSpacing = getshort(handle);
401 int count = getshort(handle);
402 rec->stringParam = new char[count+1];
403 fread((void *)rec->stringParam, sizeof(char), count, handle);
404 rec->stringParam[count] = 0;
405 // Rectangle
406 int rectY2 = getshort(handle);
407 int rectX2 = getshort(handle);
408 int rectY1 = getshort(handle);
409 int rectX1 = getshort(handle);
410 int rectType = getshort(handle);
411 rec->param2 = getshort(handle); // Y
412 rec->param1 = getshort(handle); // X
413 metaRecords.Append(rec);
414 break;
415 }
416*/
417// case META_BITBLT:
418// case META_STRETCHBLT:
419 case META_POLYGON:
420 {
421 wxMetaRecord *rec = new wxMetaRecord(META_POLYGON);
422 rec->param1 = getshort(handle);
423 rec->points = new wxRealPoint[(int)rec->param1];
424 for (int i = 0; i < rec->param1; i++)
425 {
426 rec->points[i].x = getshort(handle);
427 rec->points[i].y = getshort(handle);
428 }
59840ba3 429
1fc25a89
JS
430 metaRecords.Append(rec);
431 break;
432 }
433 case META_POLYLINE:
434 {
435 wxMetaRecord *rec = new wxMetaRecord(META_POLYLINE);
436 rec->param1 = (long)getshort(handle);
437 rec->points = new wxRealPoint[(int)rec->param1];
438 for (int i = 0; i < rec->param1; i++)
439 {
440 rec->points[i].x = getshort(handle);
441 rec->points[i].y = getshort(handle);
442 }
59840ba3 443
1fc25a89
JS
444 metaRecords.Append(rec);
445 break;
446 }
447// case META_ESCAPE:
448// case META_RESTOREDC:
449// case META_FILLREGION:
450// case META_FRAMEREGION:
451// case META_INVERTREGION:
452// case META_PAINTREGION:
453// case META_SELECTCLIPREGION: // DO THIS!
454 case META_SELECTOBJECT:
455 {
456 wxMetaRecord *rec = new wxMetaRecord(META_SELECTOBJECT);
457 rec->param1 = (long)getshort(handle); // Position of object in gdiObjects list
458 metaRecords.Append(rec);
459 // param2 gives the index into gdiObjects, which is different from
460 // the index into the handle table.
461 rec->param2 = HandleTable[(int)rec->param1]->param2;
462 break;
463 }
464// case META_SETTEXTALIGN:
465// case META_DRAWTEXT:
466// case META_CHORD:
467// case META_SETMAPPERFLAGS:
468// case META_EXTTEXTOUT:
469// case META_SETDIBTODEV:
470// case META_SELECTPALETTE:
471// case META_REALIZEPALETTE:
472// case META_ANIMATEPALETTE:
473// case META_SETPALENTRIES:
474// case META_POLYPOLYGON:
475// case META_RESIZEPALETTE:
476// case META_DIBBITBLT:
477// case META_DIBSTRETCHBLT:
478 case META_DIBCREATEPATTERNBRUSH:
479 {
480 wxMetaRecord *rec = new wxMetaRecord(META_DIBCREATEPATTERNBRUSH);
59840ba3
RD
481 fread((void *)_buf, sizeof(char), (int)((2*rdSize) - 6), handle);
482
1fc25a89
JS
483 metaRecords.Append(rec);
484 gdiObjects.Append(rec);
485 AddMetaRecordHandle(rec);
b9ac87bc 486 rec->param2 = (long)(gdiObjects.GetCount() - 1);
1fc25a89
JS
487 break;
488 }
489// case META_STRETCHDIB:
490// case META_EXTFLOODFILL:
491// case META_RESETDC:
492// case META_STARTDOC:
493// case META_STARTPAGE:
494// case META_ENDPAGE:
495// case META_ABORTDOC:
496// case META_ENDDOC:
497 case META_DELETEOBJECT:
498 {
499 int index = getshort(handle);
500 DeleteMetaRecordHandle(index);
501 break;
502 }
503 case META_CREATEPALETTE:
504 {
505 wxMetaRecord *rec = new wxMetaRecord(META_CREATEPALETTE);
59840ba3
RD
506 fread((void *)_buf, sizeof(char), (int)((2*rdSize) - 6), handle);
507
1fc25a89
JS
508 metaRecords.Append(rec);
509 gdiObjects.Append(rec);
510 AddMetaRecordHandle(rec);
b9ac87bc 511 rec->param2 = (long)(gdiObjects.GetCount() - 1);
1fc25a89
JS
512 break;
513 }
514 case META_CREATEBRUSH:
515 {
516 wxMetaRecord *rec = new wxMetaRecord(META_CREATEBRUSH);
59840ba3 517 fread((void *)_buf, sizeof(char), (int)((2*rdSize) - 6), handle);
1fc25a89
JS
518 metaRecords.Append(rec);
519 gdiObjects.Append(rec);
520 AddMetaRecordHandle(rec);
b9ac87bc 521 rec->param2 = (long)(gdiObjects.GetCount() - 1);
1fc25a89
JS
522 break;
523 }
524 case META_CREATEPATTERNBRUSH:
525 {
526 wxMetaRecord *rec = new wxMetaRecord(META_CREATEPATTERNBRUSH);
59840ba3 527 fread((void *)_buf, sizeof(char), (int)((2*rdSize) - 6), handle);
1fc25a89
JS
528 metaRecords.Append(rec);
529 gdiObjects.Append(rec);
530 AddMetaRecordHandle(rec);
b9ac87bc 531 rec->param2 = (long)(gdiObjects.GetCount() - 1);
1fc25a89
JS
532 break;
533 }
534 case META_CREATEPENINDIRECT:
535 {
536 wxMetaRecord *rec = new wxMetaRecord(META_CREATEPENINDIRECT);
537 int msStyle = getshort(handle); // Style: 2 bytes
538 int x = getshort(handle); // X: 2 bytes
1484b5cc 539 /* int y = */ getshort(handle); // Y: 2 bytes
1fc25a89
JS
540 long colorref = getint(handle); // COLORREF 4 bytes
541
542 int style;
543 if (msStyle == PS_DOT)
544 style = wxDOT;
545 else if (msStyle == PS_DASH)
546 style = wxSHORT_DASH;
547 else if (msStyle == PS_NULL)
548 style = wxTRANSPARENT;
549 else style = wxSOLID;
550
551 wxColour colour(GetRValue(colorref), GetGValue(colorref), GetBValue(colorref));
552 rec->param1 = (long)wxThePenList->FindOrCreatePen(colour, x, style);
553 metaRecords.Append(rec);
554 gdiObjects.Append(rec);
555
556 AddMetaRecordHandle(rec);
b9ac87bc 557 rec->param2 = (long)(gdiObjects.GetCount() - 1);
59840ba3 558
1fc25a89
JS
559 // For some reason, the size of this record is sometimes 9 words!!!
560 // instead of the usual 8. So read 2 characters extra.
561 if (rdSize == 9)
562 {
563 (void) getshort(handle);
564 }
565 break;
566 }
567 case META_CREATEFONTINDIRECT:
568 {
569 wxMetaRecord *rec = new wxMetaRecord(META_CREATEFONTINDIRECT);
570 int lfHeight = getshort(handle); // 2 bytes
1484b5cc
VS
571 /* int lfWidth = */ getshort(handle); // 2 bytes
572 /* int lfEsc = */ getshort(handle); // 2 bytes
573 /* int lfOrient = */ getshort(handle); // 2 bytes
1fc25a89
JS
574 int lfWeight = getshort(handle); // 2 bytes
575 char lfItalic = getc(handle); // 1 byte
576 char lfUnderline = getc(handle); // 1 byte
1484b5cc
VS
577 /* char lfStrikeout = */ getc(handle); // 1 byte
578 /* char lfCharSet = */ getc(handle); // 1 byte
579 /* char lfOutPrecision = */ getc(handle); // 1 byte
580 /* char lfClipPrecision = */ getc(handle); // 1 byte
581 /* char lfQuality = */ getc(handle); // 1 byte
1fc25a89
JS
582 char lfPitchAndFamily = getc(handle); // 1 byte (18th)
583 char lfFacename[32];
584 // Read the rest of the record, which is total record size
585 // minus the number of bytes already read (18 record, 6 metarecord
586 // header)
587 fread((void *)lfFacename, sizeof(char), (int)((2*rdSize) - 18 - 6), handle);
588
589 int family;
590 if (lfPitchAndFamily & FF_MODERN)
591 family = wxMODERN;
592 else if (lfPitchAndFamily & FF_MODERN)
593 family = wxMODERN;
594 else if (lfPitchAndFamily & FF_ROMAN)
595 family = wxROMAN;
596 else if (lfPitchAndFamily & FF_SWISS)
597 family = wxSWISS;
598 else if (lfPitchAndFamily & FF_DECORATIVE)
599 family = wxDECORATIVE;
600 else
601 family = wxDEFAULT;
602
603 int weight;
604 if (lfWeight == 300)
605 weight = wxLIGHT;
606 else if (lfWeight == 400)
607 weight = wxNORMAL;
608 else if (lfWeight == 900)
609 weight = wxBOLD;
610 else weight = wxNORMAL;
611
612 int style;
613 if (lfItalic != 0)
614 style = wxITALIC;
615 else
616 style = wxNORMAL;
617
618 // About how many pixels per inch???
619 int logPixelsY = 100;
620 int pointSize = (int)(lfHeight*72.0/logPixelsY);
621
622 wxFont *theFont =
623 wxTheFontList->FindOrCreateFont(pointSize, family, style, weight, (lfUnderline != 0));
624
625 rec->param1 = (long) theFont;
626 metaRecords.Append(rec);
627 gdiObjects.Append(rec);
628 AddMetaRecordHandle(rec);
b9ac87bc 629 rec->param2 = (long)(gdiObjects.GetCount() - 1);
1fc25a89
JS
630 break;
631 }
632 case META_CREATEBRUSHINDIRECT:
633 {
634 wxMetaRecord *rec = new wxMetaRecord(META_CREATEBRUSHINDIRECT);
635 int msStyle = getshort(handle); // Style: 2 bytes
636 long colorref = getint(handle); // COLORREF: 4 bytes
637 int hatchStyle = getshort(handle); // Hatch style 2 bytes
638
639 int style;
640 switch (msStyle)
641 {
642 case BS_HATCHED:
643 {
644 switch (hatchStyle)
645 {
646 case HS_BDIAGONAL:
647 style = wxBDIAGONAL_HATCH;
648 break;
649 case HS_DIAGCROSS:
650 style = wxCROSSDIAG_HATCH;
651 break;
652 case HS_FDIAGONAL:
653 style = wxFDIAGONAL_HATCH;
654 break;
655 case HS_HORIZONTAL:
656 style = wxHORIZONTAL_HATCH;
657 break;
658 case HS_VERTICAL:
659 style = wxVERTICAL_HATCH;
660 break;
661 default:
662 case HS_CROSS:
663 style = wxCROSS_HATCH;
664 break;
665 }
666 break;
667 }
668 case BS_SOLID:
669 default:
670 style = wxSOLID;
671 break;
672 }
673 if (msStyle == PS_DOT)
674 style = wxDOT;
675 else if (msStyle == PS_DASH)
676 style = wxSHORT_DASH;
677 else if (msStyle == PS_NULL)
678 style = wxTRANSPARENT;
679 else style = wxSOLID;
680
681 wxColour colour(GetRValue(colorref), GetGValue(colorref), GetBValue(colorref));
682 rec->param1 = (long)wxTheBrushList->FindOrCreateBrush(colour, style);
683 metaRecords.Append(rec);
684 gdiObjects.Append(rec);
685 AddMetaRecordHandle(rec);
b9ac87bc 686 rec->param2 = (long)(gdiObjects.GetCount() - 1);
1fc25a89
JS
687 break;
688 }
689 case META_CREATEBITMAPINDIRECT:
690 {
691 wxMetaRecord *rec = new wxMetaRecord(META_CREATEBITMAPINDIRECT);
59840ba3
RD
692 fread((void *)_buf, sizeof(char), (int)((2*rdSize) - 6), handle);
693
1fc25a89
JS
694 metaRecords.Append(rec);
695 gdiObjects.Append(rec);
696 AddMetaRecordHandle(rec);
b9ac87bc 697 rec->param2 = (long)(gdiObjects.GetCount() - 1);
1fc25a89
JS
698 break;
699 }
700 case META_CREATEBITMAP:
701 {
702 wxMetaRecord *rec = new wxMetaRecord(META_CREATEBITMAP);
59840ba3
RD
703 fread((void *)_buf, sizeof(char), (int)((2*rdSize) - 6), handle);
704
1fc25a89
JS
705 metaRecords.Append(rec);
706 gdiObjects.Append(rec);
707 AddMetaRecordHandle(rec);
b9ac87bc 708 rec->param2 = (long)(gdiObjects.GetCount() - 1);
1fc25a89
JS
709 break;
710 }
711 case META_CREATEREGION:
712 {
713 wxMetaRecord *rec = new wxMetaRecord(META_CREATEREGION);
59840ba3 714 fread((void *)_buf, sizeof(char), (int)((2*rdSize) - 6), handle);
1fc25a89
JS
715
716 metaRecords.Append(rec);
717 gdiObjects.Append(rec);
718 AddMetaRecordHandle(rec);
b9ac87bc 719 rec->param2 = (long)(gdiObjects.GetCount() - 1);
1fc25a89
JS
720 break;
721 }
722 default:
723 {
59840ba3 724 fread((void *)_buf, sizeof(char), (int)((2*rdSize) - 6), handle);
1fc25a89
JS
725 break;
726 }
727 }
728 }
729 fclose(handle);
730 return TRUE;
731}
732
733wxXMetaFile::~wxXMetaFile(void)
734{
b9ac87bc 735 wxNode *node = metaRecords.GetFirst();
1fc25a89
JS
736 while (node)
737 {
b9ac87bc 738 wxMetaRecord *rec = (wxMetaRecord *)node->GetData();
1fc25a89 739 delete rec;
b9ac87bc 740 wxNode *next = node->GetNext();
1fc25a89
JS
741 delete node;
742 node = next;
743 }
744}
745
1484b5cc 746bool wxXMetaFile::SetClipboard(int WXUNUSED(width), int WXUNUSED(height))
1fc25a89
JS
747{
748 return FALSE;
749}
750
751bool wxXMetaFile::Play(wxDC *dc)
752{
b9ac87bc 753 wxNode *node = metaRecords.GetFirst();
1fc25a89
JS
754 while (node)
755 {
b9ac87bc 756 wxMetaRecord *rec = (wxMetaRecord *)node->GetData();
1fc25a89
JS
757 int rdFunction = rec->metaFunction;
758
759 switch (rdFunction)
760 {
761 case META_SETBKCOLOR:
762 {
763 break;
764 }
765 case META_SETBKMODE:
766 {
767 break;
768 }
769 case META_SETMAPMODE:
770 {
771 break;
772 }
773// case META_SETROP2:
774// case META_SETRELABS:
775// case META_SETPOLYFILLMODE:
776// case META_SETSTRETCHBLTMODE:
777// case META_SETTEXTCHAREXTRA:
778 case META_SETTEXTCOLOR:
779 {
780 break;
781 }
782// case META_SETTEXTJUSTIFICATION:
783 case META_SETWINDOWORG:
784 {
785 break;
786 }
787 case META_SETWINDOWEXT:
788 {
789 break;
790 }
791// case META_SETVIEWPORTORG:
792// case META_SETVIEWPORTEXT:
793// case META_OFFSETWINDOWORG:
794// case META_SCALEWINDOWEXT:
795// case META_OFFSETVIEWPORTORG:
796// case META_SCALEVIEWPORTEXT:
797 case META_LINETO:
798 {
799 long x1 = rec->param1;
800 long y1 = rec->param2;
801 dc->DrawLine((long) lastX, (long) lastY, x1, y1);
802 break;
803 }
804 case META_MOVETO:
805 {
806 lastX = (double)rec->param1;
807 lastY = (double)rec->param2;
808 break;
809 }
810 case META_EXCLUDECLIPRECT:
811 {
812 break;
813 }
814 case META_INTERSECTCLIPRECT:
815 {
816 break;
817 }
818// case META_ARC: // DO!!!
819 case META_ELLIPSE:
820 {
821 break;
822 }
823// case META_FLOODFILL:
824// case META_PIE: // DO!!!
825 case META_RECTANGLE:
826 {
827 dc->DrawRectangle((long)rec->param1, (long)rec->param2,
828 (long)rec->param3 - rec->param1,
829 (long)rec->param4 - rec->param2);
830 break;
831 }
832 case META_ROUNDRECT:
833 {
834 dc->DrawRoundedRectangle((long)rec->param1, (long)rec->param2,
835 (long)rec->param3 - rec->param1,
836 (long)rec->param4 - rec->param2,
837 (long)rec->param5);
838 break;
839 }
840// case META_PATBLT:
841// case META_SAVEDC:
842 case META_SETPIXEL:
843 {
844// rec->param1 = getshort(handle); // x1
845// rec->param2 = getshort(handle); // y1
846// rec->param3 = getint(handle); // COLORREF
847 break;
848 }
849// case META_OFFSETCLIPRGN:
850 case META_TEXTOUT:
851 {
852/*
853 int count = getshort(handle);
854 rec->stringParam = new char[count+1];
855 fread((void *)rec->stringParam, sizeof(char), count, handle);
856 rec->stringParam[count] = 0;
857 rec->param2 = getshort(handle); // Y
858 rec->param1 = getshort(handle); // X
859*/
860 break;
861 }
862// case META_BITBLT:
863// case META_STRETCHBLT:
864 case META_POLYGON:
865 {
866/*
867 rec->param1 = getshort(handle);
868 rec->points = new wxRealPoint[(int)rec->param1];
869 for (int i = 0; i < rec->param1; i++)
870 {
871 rec->points[i].x = getshort(handle);
872 rec->points[i].y = getshort(handle);
873 }
59840ba3 874*/
1fc25a89
JS
875 break;
876 }
877 case META_POLYLINE:
878 {
879/*
880 wxMetaRecord *rec = new wxMetaRecord(META_POLYLINE);
881 rec->param1 = (long)getshort(handle);
882 rec->points = new wxRealPoint[(int)rec->param1];
883 for (int i = 0; i < rec->param1; i++)
884 {
885 rec->points[i].x = getshort(handle);
886 rec->points[i].y = getshort(handle);
887 }
59840ba3 888*/
1fc25a89
JS
889 break;
890 }
891// case META_ESCAPE:
892// case META_RESTOREDC:
893// case META_FILLREGION:
894// case META_FRAMEREGION:
895// case META_INVERTREGION:
896// case META_PAINTREGION:
897// case META_SELECTCLIPREGION: // DO THIS!
898 case META_SELECTOBJECT:
899 {
900/*
901 wxMetaRecord *rec = new wxMetaRecord(META_SELECTOBJECT);
902 rec->param1 = (long)getshort(handle); // Position of object in gdiObjects list
903*/
904 break;
905 }
906// case META_SETTEXTALIGN:
907// case META_DRAWTEXT:
908// case META_CHORD:
909// case META_SETMAPPERFLAGS:
910// case META_EXTTEXTOUT:
911// case META_SETDIBTODEV:
912// case META_SELECTPALETTE:
913// case META_REALIZEPALETTE:
914// case META_ANIMATEPALETTE:
915// case META_SETPALENTRIES:
916// case META_POLYPOLYGON:
917// case META_RESIZEPALETTE:
918// case META_DIBBITBLT:
919// case META_DIBSTRETCHBLT:
920 case META_DIBCREATEPATTERNBRUSH:
921 {
922/*
923 fread((void *)wxBuffer, sizeof(char), (int)(rdSize - 3), handle);
59840ba3 924*/
1fc25a89
JS
925 break;
926 }
927// case META_STRETCHDIB:
928// case META_EXTFLOODFILL:
929// case META_RESETDC:
930// case META_STARTDOC:
931// case META_STARTPAGE:
932// case META_ENDPAGE:
933// case META_ABORTDOC:
934// case META_ENDDOC:
935// case META_DELETEOBJECT: // DO!!
936 case META_CREATEPALETTE:
937 {
938/*
939 wxMetaRecord *rec = new wxMetaRecord(META_CREATEPALETTE);
940 fread((void *)wxBuffer, sizeof(char), (int)(rdSize - 3), handle);
941*/
942 break;
943 }
944 case META_CREATEBRUSH:
945 {
946/*
947 fread((void *)wxBuffer, sizeof(char), (int)(rdSize - 3), handle);
948*/
949 break;
950 }
951 case META_CREATEPATTERNBRUSH:
952 {
953/*
954 fread((void *)wxBuffer, sizeof(char), (int)(rdSize - 3), handle);
955*/
956 break;
957 }
958 case META_CREATEPENINDIRECT:
959 {
960/*
961 int msStyle = getshort(handle); // Style: 2 bytes
962 int x = getshort(handle); // X: 2 bytes
963 int y = getshort(handle); // Y: 2 bytes
964 int colorref = getint(handle); // COLORREF 4 bytes
965
966 int style;
967 if (msStyle == PS_DOT)
968 style = wxDOT;
969 else if (msStyle == PS_DASH)
970 style = wxSHORT_DASH;
971 else if (msStyle == PS_NULL)
972 style = wxTRANSPARENT;
973 else style = wxSOLID;
974
975 wxColour colour(GetRValue(colorref), GetGValue(colorref), GetBValue(colorref));
976 rec->param1 = (long)wxThePenList->FindOrCreatePen(&colour, x, style);
977*/
978 break;
979 }
980 case META_CREATEFONTINDIRECT:
981 {
982/*
983 int lfHeight = getshort(handle);
984 int lfWidth = getshort(handle);
985 int lfEsc = getshort(handle);
986 int lfOrient = getshort(handle);
987 int lfWeight = getshort(handle);
988 char lfItalic = getc(handle);
989 char lfUnderline = getc(handle);
990 char lfStrikeout = getc(handle);
991 char lfCharSet = getc(handle);
992 char lfOutPrecision = getc(handle);
993 char lfClipPrecision = getc(handle);
994 char lfQuality = getc(handle);
995 char lfPitchAndFamily = getc(handle);
996 char lfFacename[32];
997 fread((void *)lfFacename, sizeof(char), 32, handle);
998
999 int family;
1000 if (lfPitchAndFamily & FF_MODERN)
1001 family = wxMODERN;
1002 else if (lfPitchAndFamily & FF_MODERN)
1003 family = wxMODERN;
1004 else if (lfPitchAndFamily & FF_ROMAN)
1005 family = wxROMAN;
1006 else if (lfPitchAndFamily & FF_SWISS)
1007 family = wxSWISS;
1008 else if (lfPitchAndFamily & FF_DECORATIVE)
1009 family = wxDECORATIVE;
1010 else
1011 family = wxDEFAULT;
1012
1013 int weight;
1014 if (lfWeight == 300)
1015 weight = wxLIGHT;
1016 else if (lfWeight == 400)
1017 weight = wxNORMAL;
1018 else if (lfWeight == 900)
1019 weight = wxBOLD;
1020 else weight = wxNORMAL;
1021
1022 int style;
1023 if ((bool)lfItalic)
1024 style = wxITALIC;
1025 else
1026 style = wxNORMAL;
1027
1028 // About how many pixels per inch???
1029 int logPixelsY = 100;
1030 int pointSize = (int)(lfHeight*72.0/logPixelsY);
1031
1032 wxFont *theFont =
1033 wxTheFontList->FindOrCreateFont(pointSize, family, style, weight, (bool)lfUnderline);
1034
1035 rec->param1 = (long)theFont;
1036*/
1037 break;
1038 }
1039 case META_CREATEBRUSHINDIRECT:
1040 {
1041/*
1042 int msStyle = getshort(handle); // Style: 2 bytes
1043 int colorref = getint(handle); // COLORREF: 4 bytes
1044 int hatchStyle = getshort(handle); // Hatch style 2 bytes
1045
1046 int style;
1047 if (msStyle == PS_DOT)
1048 style = wxDOT;
1049 else if (msStyle == PS_DASH)
1050 style = wxSHORT_DASH;
1051 else if (msStyle == PS_NULL)
1052 style = wxTRANSPARENT;
1053 else style = wxSOLID;
1054
1055 wxColour colour(GetRValue(colorref), GetGValue(colorref), GetBValue(colorref));
1056 rec->param1 = (long)wxTheBrushList->FindOrCreateBrush(&colour, wxSOLID);
1057*/
1058 break;
1059 }
1060 case META_CREATEBITMAPINDIRECT:
1061 {
1062/*
1063 fread((void *)wxBuffer, sizeof(char), (int)(rdSize - 3), handle);
59840ba3 1064*/
1fc25a89
JS
1065 break;
1066 }
1067 case META_CREATEBITMAP:
1068 {
1069/*
1070 fread((void *)wxBuffer, sizeof(char), (int)(rdSize - 3), handle);
59840ba3 1071*/
1fc25a89
JS
1072 break;
1073 }
1074 case META_CREATEREGION:
1075 {
1076 dc->DestroyClippingRegion();
1077/*
1078 rec->param1 = getshort(handle); // Style: 2 bytes
1079*/
1080 break;
1081 }
1082 default:
1083 {
1084 break;
1085 }
1086 }
b9ac87bc 1087 node = node->GetNext();
1fc25a89
JS
1088 }
1089 return TRUE;
1090}
1091