1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: Metafile utillities
4 // Author: Julian Smart
8 // Copyright: (c) Julian Smart
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
13 #pragma implementation "mfutils.h"
16 // For compilers that support precompilation, includes "wx.h".
17 #include "wx/wxprec.h"
27 #include <wx/metafile.h>
30 #include "wx/ogl/ogl.h"
34 static char _buf
[1024]; // a temp buffer to use inplace of wxBuffer, which is deprecated.
36 // 16-bit unsigned integer
37 static unsigned int getshort(FILE *fp
)
40 c
= getc(fp
); c1
= getc(fp
);
41 unsigned int res
= ((unsigned int) c
) + (((unsigned int) c1
) << 8);
45 // 16-bit signed integer
46 static int getsignedshort(FILE *fp
)
49 c
= getc(fp
); c1
= getc(fp
);
51 // this is not used value, no need to execute it
52 int testRes
= ((unsigned int) c
) + (((unsigned int) c1
) << 8);
54 unsigned long res1
= ((unsigned int) c
) + (((unsigned int) c1
) << 8);
57 res
= (int)(res1
- 65536);
64 static long getint(FILE *fp
)
67 c
= getc(fp
); c1
= getc(fp
); c2
= getc(fp
); c3
= getc(fp
);
68 long res
= (long)((long) c
) +
76 /* Placeable metafile header
77 struct mfPLACEABLEHEADER {
80 RECT bbox; // 4x16 bit
82 DWORD reserved; // 32-bit
83 WORD checksum; // 16-bit
87 wxMetaRecord::~wxMetaRecord(void)
89 if (points
) delete[] points
;
90 if (stringParam
) delete[] stringParam
;
93 wxXMetaFile::wxXMetaFile(const wxChar
*file
)
106 Handle table gdiObjects
107 ------------ ----------
109 [1]----param2--- wxBrush
113 The handle table works as follows.
114 When a GDI object is created whilst reading in the
115 metafile, the (e.g.) createpen record is added to the
116 first free entry in the handle table. The createpen
117 record's param1 is a pointer to the actual wxPen, and
118 its param2 is the index into the gdiObjects list, which only
119 grows and never shrinks (unlike the handle table.)
121 When SelectObject(index) is found, the index in the file
122 refers to the position in the handle table. BUT we then
123 set param2 to be the position of the wxPen in gdiObjects,
124 i.e. to param2 of the CreatePen record, itself found in
127 When an object is deleted, the entry in the handletable is
128 NULLed but the gdiObjects entry is not removed (no point, and
129 allows us to create all GDI objects in advance of playing the
134 static wxMetaRecord
*HandleTable
[100];
135 static int HandleTableSize
= 0;
137 void DeleteMetaRecordHandle(int index
)
139 HandleTable
[index
] = NULL
;
142 int AddMetaRecordHandle(wxMetaRecord
*record
)
144 for (int i
= 0; i
< HandleTableSize
; i
++)
147 HandleTable
[i
] = record
;
150 // No free spaces in table, so append.
152 HandleTable
[HandleTableSize
] = record
;
154 return (HandleTableSize
- 1);
157 bool wxXMetaFile::ReadFile(const wxChar
*file
)
161 FILE *handle
= wxFopen(file
, wxT("rb"));
162 if (!handle
) return FALSE
;
164 // Read placeable metafile header, if any
165 long key
= getint(handle
);
167 if (key
== (long) 0x9AC6CDD7)
169 /* long hmf = */ getshort(handle
);
170 int iLeft
, iTop
, iRight
, iBottom
;
171 iLeft
= getsignedshort(handle
);
172 iTop
= getsignedshort(handle
);
173 iRight
= getsignedshort(handle
);
174 iBottom
= getsignedshort(handle
);
176 left
= (double)iLeft
;
178 right
= (double)iRight
;
179 bottom
= (double)iBottom
;
181 /* int inch = */ getshort(handle
);
182 /* long reserved = */ getint(handle
);
183 /* int checksum = */ getshort(handle
);
185 double widthInUnits = (double)right - left;
186 double heightInUnits = (double)bottom - top;
187 *width = (int)((widthInUnits*1440.0)/inch);
188 *height = (int)((heightInUnits*1440.0)/inch);
194 int mtType
= getshort(handle
);
196 if (mtType
!= 1 && mtType
!= 2)
202 /* int mtHeaderSize = */ getshort(handle
);
203 int mtVersion
= getshort(handle
);
205 if (mtVersion
!= 0x0300 && mtVersion
!= 0x0100)
211 /* long mtSize = */ getint(handle
);
212 /* int mtNoObjects = */ getshort(handle
);
213 /* long mtMaxRecord = */ getint(handle
);
214 /* int mtNoParameters = */ getshort(handle
);
216 while (!feof(handle
))
218 long rdSize
= getint(handle
); // 4 bytes
219 int rdFunction
= getshort(handle
); // 2 bytes
225 case META_SETBKCOLOR
:
227 wxMetaRecord
*rec
= new wxMetaRecord(META_SETBKCOLOR
);
228 long colorref
= getint(handle
); // COLORREF
229 rec
->param1
= GetRValue(colorref
);
230 rec
->param2
= GetGValue(colorref
);
231 rec
->param3
= GetBValue(colorref
);
232 metaRecords
.Append(rec
);
237 wxMetaRecord
*rec
= new wxMetaRecord(META_SETBKMODE
);
238 rec
->param1
= getshort(handle
); // Background mode
239 if (rec
->param1
== OPAQUE
) rec
->param1
= wxSOLID
;
240 else rec
->param1
= wxTRANSPARENT
;
241 metaRecords
.Append(rec
);
244 case META_SETMAPMODE
:
246 wxMetaRecord
*rec
= new wxMetaRecord(META_SETMAPMODE
);
247 rec
->param1
= getshort(handle
);
248 metaRecords
.Append(rec
);
251 // case META_SETROP2:
252 // case META_SETRELABS:
253 // case META_SETPOLYFILLMODE:
254 // case META_SETSTRETCHBLTMODE:
255 // case META_SETTEXTCHAREXTRA:
256 case META_SETTEXTCOLOR
:
258 wxMetaRecord
*rec
= new wxMetaRecord(META_SETTEXTCOLOR
);
259 long colorref
= getint(handle
); // COLORREF
260 rec
->param1
= GetRValue(colorref
);
261 rec
->param2
= GetGValue(colorref
);
262 rec
->param3
= GetBValue(colorref
);
263 metaRecords
.Append(rec
);
266 // case META_SETTEXTJUSTIFICATION:
267 case META_SETWINDOWORG
:
269 wxMetaRecord
*rec
= new wxMetaRecord(META_SETWINDOWORG
);
270 rec
->param2
= getshort(handle
);
271 rec
->param1
= getshort(handle
);
272 metaRecords
.Append(rec
);
275 case META_SETWINDOWEXT
:
277 wxMetaRecord
*rec
= new wxMetaRecord(META_SETWINDOWEXT
);
278 rec
->param2
= getshort(handle
);
279 rec
->param1
= getshort(handle
);
280 metaRecords
.Append(rec
);
283 // case META_SETVIEWPORTORG:
284 // case META_SETVIEWPORTEXT:
285 // case META_OFFSETWINDOWORG:
286 // case META_SCALEWINDOWEXT:
287 // case META_OFFSETVIEWPORTORG:
288 // case META_SCALEVIEWPORTEXT:
291 wxMetaRecord
*rec
= new wxMetaRecord(META_LINETO
);
292 rec
->param1
= getshort(handle
); // x1
293 rec
->param2
= getshort(handle
); // y1
294 metaRecords
.Append(rec
);
299 wxMetaRecord
*rec
= new wxMetaRecord(META_MOVETO
);
300 rec
->param1
= getshort(handle
); // x1
301 rec
->param2
= getshort(handle
); // y1
302 metaRecords
.Append(rec
);
305 case META_EXCLUDECLIPRECT
:
307 wxMetaRecord
*rec
= new wxMetaRecord(META_EXCLUDECLIPRECT
);
308 rec
->param4
= getshort(handle
); // y2
309 rec
->param3
= getshort(handle
); // x2
310 rec
->param2
= getshort(handle
); // y1
311 rec
->param1
= getshort(handle
); // x1
312 metaRecords
.Append(rec
);
315 case META_INTERSECTCLIPRECT
:
317 wxMetaRecord
*rec
= new wxMetaRecord(META_INTERSECTCLIPRECT
);
318 rec
->param4
= getshort(handle
); // y2
319 rec
->param3
= getshort(handle
); // x2
320 rec
->param2
= getshort(handle
); // y1
321 rec
->param1
= getshort(handle
); // x1
322 metaRecords
.Append(rec
);
325 // case META_ARC: // DO!!!
328 wxMetaRecord
*rec
= new wxMetaRecord(META_ELLIPSE
);
329 rec
->param4
= getshort(handle
); // y2
330 rec
->param3
= getshort(handle
); // x2
331 rec
->param2
= getshort(handle
); // y1
332 rec
->param1
= getshort(handle
); // x1
333 metaRecords
.Append(rec
);
336 // case META_FLOODFILL:
337 // case META_PIE: // DO!!!
340 wxMetaRecord
*rec
= new wxMetaRecord(META_RECTANGLE
);
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
);
350 wxMetaRecord
*rec
= new wxMetaRecord(META_ROUNDRECT
);
351 rec
->param6
= getshort(handle
); // width
352 rec
->param5
= getshort(handle
); // height
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
);
364 wxMetaRecord
*rec
= new wxMetaRecord(META_SETPIXEL
);
365 rec
->param1
= getshort(handle
); // x1
366 rec
->param2
= getshort(handle
); // y1
367 rec
->param3
= getint(handle
); // COLORREF
368 metaRecords
.Append(rec
);
371 // case META_OFFSETCLIPRGN:
374 wxMetaRecord
*rec
= new wxMetaRecord(META_TEXTOUT
);
375 int count
= getshort(handle
);
376 rec
->stringParam
= new wxChar
[count
+1];
377 fread((void *)rec
->stringParam
, sizeof(wxChar
), count
, handle
);
378 rec
->stringParam
[count
] = 0;
379 rec
->param2
= getshort(handle
); // Y
380 rec
->param1
= getshort(handle
); // X
381 metaRecords
.Append(rec
);
385 case META_EXTTEXTOUT:
387 wxMetaRecord *rec = new wxMetaRecord(META_EXTTEXTOUT);
388 int cellSpacing = getshort(handle);
389 int count = getshort(handle);
390 rec->stringParam = new char[count+1];
391 fread((void *)rec->stringParam, sizeof(char), count, handle);
392 rec->stringParam[count] = 0;
394 int rectY2 = getshort(handle);
395 int rectX2 = getshort(handle);
396 int rectY1 = getshort(handle);
397 int rectX1 = getshort(handle);
398 int rectType = getshort(handle);
399 rec->param2 = getshort(handle); // Y
400 rec->param1 = getshort(handle); // X
401 metaRecords.Append(rec);
406 // case META_STRETCHBLT:
409 wxMetaRecord
*rec
= new wxMetaRecord(META_POLYGON
);
410 rec
->param1
= getshort(handle
);
411 rec
->points
= new wxRealPoint
[(int)rec
->param1
];
412 for (int i
= 0; i
< rec
->param1
; i
++)
414 rec
->points
[i
].x
= getshort(handle
);
415 rec
->points
[i
].y
= getshort(handle
);
418 metaRecords
.Append(rec
);
423 wxMetaRecord
*rec
= new wxMetaRecord(META_POLYLINE
);
424 rec
->param1
= (long)getshort(handle
);
425 rec
->points
= new wxRealPoint
[(int)rec
->param1
];
426 for (int i
= 0; i
< rec
->param1
; i
++)
428 rec
->points
[i
].x
= getshort(handle
);
429 rec
->points
[i
].y
= getshort(handle
);
432 metaRecords
.Append(rec
);
436 // case META_RESTOREDC:
437 // case META_FILLREGION:
438 // case META_FRAMEREGION:
439 // case META_INVERTREGION:
440 // case META_PAINTREGION:
441 // case META_SELECTCLIPREGION: // DO THIS!
442 case META_SELECTOBJECT
:
444 wxMetaRecord
*rec
= new wxMetaRecord(META_SELECTOBJECT
);
445 rec
->param1
= (long)getshort(handle
); // Position of object in gdiObjects list
446 metaRecords
.Append(rec
);
447 // param2 gives the index into gdiObjects, which is different from
448 // the index into the handle table.
449 rec
->param2
= HandleTable
[(int)rec
->param1
]->param2
;
452 // case META_SETTEXTALIGN:
453 // case META_DRAWTEXT:
455 // case META_SETMAPPERFLAGS:
456 // case META_EXTTEXTOUT:
457 // case META_SETDIBTODEV:
458 // case META_SELECTPALETTE:
459 // case META_REALIZEPALETTE:
460 // case META_ANIMATEPALETTE:
461 // case META_SETPALENTRIES:
462 // case META_POLYPOLYGON:
463 // case META_RESIZEPALETTE:
464 // case META_DIBBITBLT:
465 // case META_DIBSTRETCHBLT:
466 case META_DIBCREATEPATTERNBRUSH
:
468 wxMetaRecord
*rec
= new wxMetaRecord(META_DIBCREATEPATTERNBRUSH
);
469 fread((void *)_buf
, sizeof(char), (int)((2*rdSize
) - 6), handle
);
471 metaRecords
.Append(rec
);
472 gdiObjects
.Append(rec
);
473 AddMetaRecordHandle(rec
);
474 rec
->param2
= (long)(gdiObjects
.GetCount() - 1);
477 // case META_STRETCHDIB:
478 // case META_EXTFLOODFILL:
479 // case META_RESETDC:
480 // case META_STARTDOC:
481 // case META_STARTPAGE:
482 // case META_ENDPAGE:
483 // case META_ABORTDOC:
485 case META_DELETEOBJECT
:
487 int index
= getshort(handle
);
488 DeleteMetaRecordHandle(index
);
491 case META_CREATEPALETTE
:
493 wxMetaRecord
*rec
= new wxMetaRecord(META_CREATEPALETTE
);
494 fread((void *)_buf
, sizeof(char), (int)((2*rdSize
) - 6), handle
);
496 metaRecords
.Append(rec
);
497 gdiObjects
.Append(rec
);
498 AddMetaRecordHandle(rec
);
499 rec
->param2
= (long)(gdiObjects
.GetCount() - 1);
502 case META_CREATEBRUSH
:
504 wxMetaRecord
*rec
= new wxMetaRecord(META_CREATEBRUSH
);
505 fread((void *)_buf
, sizeof(char), (int)((2*rdSize
) - 6), handle
);
506 metaRecords
.Append(rec
);
507 gdiObjects
.Append(rec
);
508 AddMetaRecordHandle(rec
);
509 rec
->param2
= (long)(gdiObjects
.GetCount() - 1);
512 case META_CREATEPATTERNBRUSH
:
514 wxMetaRecord
*rec
= new wxMetaRecord(META_CREATEPATTERNBRUSH
);
515 fread((void *)_buf
, sizeof(char), (int)((2*rdSize
) - 6), handle
);
516 metaRecords
.Append(rec
);
517 gdiObjects
.Append(rec
);
518 AddMetaRecordHandle(rec
);
519 rec
->param2
= (long)(gdiObjects
.GetCount() - 1);
522 case META_CREATEPENINDIRECT
:
524 wxMetaRecord
*rec
= new wxMetaRecord(META_CREATEPENINDIRECT
);
525 int msStyle
= getshort(handle
); // Style: 2 bytes
526 int x
= getshort(handle
); // X: 2 bytes
527 /* int y = */ getshort(handle
); // Y: 2 bytes
528 long colorref
= getint(handle
); // COLORREF 4 bytes
531 if (msStyle
== PS_DOT
)
533 else if (msStyle
== PS_DASH
)
534 style
= wxSHORT_DASH
;
535 else if (msStyle
== PS_NULL
)
536 style
= wxTRANSPARENT
;
537 else style
= wxSOLID
;
539 wxColour
colour(GetRValue(colorref
), GetGValue(colorref
), GetBValue(colorref
));
540 rec
->param1
= (long)wxThePenList
->FindOrCreatePen(colour
, x
, style
);
541 metaRecords
.Append(rec
);
542 gdiObjects
.Append(rec
);
544 AddMetaRecordHandle(rec
);
545 rec
->param2
= (long)(gdiObjects
.GetCount() - 1);
547 // For some reason, the size of this record is sometimes 9 words!!!
548 // instead of the usual 8. So read 2 characters extra.
551 (void) getshort(handle
);
555 case META_CREATEFONTINDIRECT
:
557 wxMetaRecord
*rec
= new wxMetaRecord(META_CREATEFONTINDIRECT
);
558 int lfHeight
= getshort(handle
); // 2 bytes
559 /* int lfWidth = */ getshort(handle
); // 2 bytes
560 /* int lfEsc = */ getshort(handle
); // 2 bytes
561 /* int lfOrient = */ getshort(handle
); // 2 bytes
562 int lfWeight
= getshort(handle
); // 2 bytes
563 char lfItalic
= getc(handle
); // 1 byte
564 char lfUnderline
= getc(handle
); // 1 byte
565 /* char lfStrikeout = */ getc(handle
); // 1 byte
566 /* char lfCharSet = */ getc(handle
); // 1 byte
567 /* char lfOutPrecision = */ getc(handle
); // 1 byte
568 /* char lfClipPrecision = */ getc(handle
); // 1 byte
569 /* char lfQuality = */ getc(handle
); // 1 byte
570 char lfPitchAndFamily
= getc(handle
); // 1 byte (18th)
572 // Read the rest of the record, which is total record size
573 // minus the number of bytes already read (18 record, 6 metarecord
575 fread((void *)lfFacename
, sizeof(char), (int)((2*rdSize
) - 18 - 6), handle
);
578 if (lfPitchAndFamily
& FF_MODERN
)
580 else if (lfPitchAndFamily
& FF_MODERN
)
582 else if (lfPitchAndFamily
& FF_ROMAN
)
584 else if (lfPitchAndFamily
& FF_SWISS
)
586 else if (lfPitchAndFamily
& FF_DECORATIVE
)
587 family
= wxDECORATIVE
;
594 else if (lfWeight
== 400)
596 else if (lfWeight
== 900)
598 else weight
= wxNORMAL
;
606 // About how many pixels per inch???
607 int logPixelsY
= 100;
608 int pointSize
= (int)(lfHeight
*72.0/logPixelsY
);
611 wxTheFontList
->FindOrCreateFont(pointSize
, family
, style
, weight
, (lfUnderline
!= 0));
613 rec
->param1
= (long) theFont
;
614 metaRecords
.Append(rec
);
615 gdiObjects
.Append(rec
);
616 AddMetaRecordHandle(rec
);
617 rec
->param2
= (long)(gdiObjects
.GetCount() - 1);
620 case META_CREATEBRUSHINDIRECT
:
622 wxMetaRecord
*rec
= new wxMetaRecord(META_CREATEBRUSHINDIRECT
);
623 int msStyle
= getshort(handle
); // Style: 2 bytes
624 long colorref
= getint(handle
); // COLORREF: 4 bytes
625 int hatchStyle
= getshort(handle
); // Hatch style 2 bytes
635 style
= wxBDIAGONAL_HATCH
;
638 style
= wxCROSSDIAG_HATCH
;
641 style
= wxFDIAGONAL_HATCH
;
644 style
= wxHORIZONTAL_HATCH
;
647 style
= wxVERTICAL_HATCH
;
651 style
= wxCROSS_HATCH
;
656 #if PS_DOT != BS_HATCHED
658 /* in microsoft/include/wingdi.h both are the same */
659 /* in fact I'm not sure why pen related PS_XXX and */
660 /* BS_XXX constants are all mixed into single style */
666 style
= wxSHORT_DASH
;
669 style
= wxTRANSPARENT
;
677 wxColour
colour(GetRValue(colorref
), GetGValue(colorref
), GetBValue(colorref
));
678 rec
->param1
= (long)wxTheBrushList
->FindOrCreateBrush(colour
, style
);
679 metaRecords
.Append(rec
);
680 gdiObjects
.Append(rec
);
681 AddMetaRecordHandle(rec
);
682 rec
->param2
= (long)(gdiObjects
.GetCount() - 1);
685 case META_CREATEBITMAPINDIRECT
:
687 wxMetaRecord
*rec
= new wxMetaRecord(META_CREATEBITMAPINDIRECT
);
688 fread((void *)_buf
, sizeof(char), (int)((2*rdSize
) - 6), handle
);
690 metaRecords
.Append(rec
);
691 gdiObjects
.Append(rec
);
692 AddMetaRecordHandle(rec
);
693 rec
->param2
= (long)(gdiObjects
.GetCount() - 1);
696 case META_CREATEBITMAP
:
698 wxMetaRecord
*rec
= new wxMetaRecord(META_CREATEBITMAP
);
699 fread((void *)_buf
, sizeof(char), (int)((2*rdSize
) - 6), handle
);
701 metaRecords
.Append(rec
);
702 gdiObjects
.Append(rec
);
703 AddMetaRecordHandle(rec
);
704 rec
->param2
= (long)(gdiObjects
.GetCount() - 1);
707 case META_CREATEREGION
:
709 wxMetaRecord
*rec
= new wxMetaRecord(META_CREATEREGION
);
710 fread((void *)_buf
, sizeof(char), (int)((2*rdSize
) - 6), handle
);
712 metaRecords
.Append(rec
);
713 gdiObjects
.Append(rec
);
714 AddMetaRecordHandle(rec
);
715 rec
->param2
= (long)(gdiObjects
.GetCount() - 1);
720 fread((void *)_buf
, sizeof(char), (int)((2*rdSize
) - 6), handle
);
729 wxXMetaFile::~wxXMetaFile(void)
731 wxNode
*node
= metaRecords
.GetFirst();
734 wxMetaRecord
*rec
= (wxMetaRecord
*)node
->GetData();
736 wxNode
*next
= node
->GetNext();
742 bool wxXMetaFile::SetClipboard(int WXUNUSED(width
), int WXUNUSED(height
))
747 bool wxXMetaFile::Play(wxDC
*dc
)
749 wxNode
*node
= metaRecords
.GetFirst();
752 wxMetaRecord
*rec
= (wxMetaRecord
*)node
->GetData();
753 int rdFunction
= rec
->metaFunction
;
757 case META_SETBKCOLOR
:
765 case META_SETMAPMODE
:
769 // case META_SETROP2:
770 // case META_SETRELABS:
771 // case META_SETPOLYFILLMODE:
772 // case META_SETSTRETCHBLTMODE:
773 // case META_SETTEXTCHAREXTRA:
774 case META_SETTEXTCOLOR
:
778 // case META_SETTEXTJUSTIFICATION:
779 case META_SETWINDOWORG
:
783 case META_SETWINDOWEXT
:
787 // case META_SETVIEWPORTORG:
788 // case META_SETVIEWPORTEXT:
789 // case META_OFFSETWINDOWORG:
790 // case META_SCALEWINDOWEXT:
791 // case META_OFFSETVIEWPORTORG:
792 // case META_SCALEVIEWPORTEXT:
795 long x1
= rec
->param1
;
796 long y1
= rec
->param2
;
797 dc
->DrawLine((long) lastX
, (long) lastY
, x1
, y1
);
802 lastX
= (double)rec
->param1
;
803 lastY
= (double)rec
->param2
;
806 case META_EXCLUDECLIPRECT
:
810 case META_INTERSECTCLIPRECT
:
814 // case META_ARC: // DO!!!
819 // case META_FLOODFILL:
820 // case META_PIE: // DO!!!
823 dc
->DrawRectangle((long)rec
->param1
, (long)rec
->param2
,
824 (long)rec
->param3
- rec
->param1
,
825 (long)rec
->param4
- rec
->param2
);
830 dc
->DrawRoundedRectangle((long)rec
->param1
, (long)rec
->param2
,
831 (long)rec
->param3
- rec
->param1
,
832 (long)rec
->param4
- rec
->param2
,
840 // rec->param1 = getshort(handle); // x1
841 // rec->param2 = getshort(handle); // y1
842 // rec->param3 = getint(handle); // COLORREF
845 // case META_OFFSETCLIPRGN:
849 int count = getshort(handle);
850 rec->stringParam = new char[count+1];
851 fread((void *)rec->stringParam, sizeof(char), count, handle);
852 rec->stringParam[count] = 0;
853 rec->param2 = getshort(handle); // Y
854 rec->param1 = getshort(handle); // X
859 // case META_STRETCHBLT:
863 rec->param1 = getshort(handle);
864 rec->points = new wxRealPoint[(int)rec->param1];
865 for (int i = 0; i < rec->param1; i++)
867 rec->points[i].x = getshort(handle);
868 rec->points[i].y = getshort(handle);
876 wxMetaRecord *rec = new wxMetaRecord(META_POLYLINE);
877 rec->param1 = (long)getshort(handle);
878 rec->points = new wxRealPoint[(int)rec->param1];
879 for (int i = 0; i < rec->param1; i++)
881 rec->points[i].x = getshort(handle);
882 rec->points[i].y = getshort(handle);
888 // case META_RESTOREDC:
889 // case META_FILLREGION:
890 // case META_FRAMEREGION:
891 // case META_INVERTREGION:
892 // case META_PAINTREGION:
893 // case META_SELECTCLIPREGION: // DO THIS!
894 case META_SELECTOBJECT
:
897 wxMetaRecord *rec = new wxMetaRecord(META_SELECTOBJECT);
898 rec->param1 = (long)getshort(handle); // Position of object in gdiObjects list
902 // case META_SETTEXTALIGN:
903 // case META_DRAWTEXT:
905 // case META_SETMAPPERFLAGS:
906 // case META_EXTTEXTOUT:
907 // case META_SETDIBTODEV:
908 // case META_SELECTPALETTE:
909 // case META_REALIZEPALETTE:
910 // case META_ANIMATEPALETTE:
911 // case META_SETPALENTRIES:
912 // case META_POLYPOLYGON:
913 // case META_RESIZEPALETTE:
914 // case META_DIBBITBLT:
915 // case META_DIBSTRETCHBLT:
916 case META_DIBCREATEPATTERNBRUSH
:
919 fread((void *)wxBuffer, sizeof(char), (int)(rdSize - 3), handle);
923 // case META_STRETCHDIB:
924 // case META_EXTFLOODFILL:
925 // case META_RESETDC:
926 // case META_STARTDOC:
927 // case META_STARTPAGE:
928 // case META_ENDPAGE:
929 // case META_ABORTDOC:
931 // case META_DELETEOBJECT: // DO!!
932 case META_CREATEPALETTE
:
935 wxMetaRecord *rec = new wxMetaRecord(META_CREATEPALETTE);
936 fread((void *)wxBuffer, sizeof(char), (int)(rdSize - 3), handle);
940 case META_CREATEBRUSH
:
943 fread((void *)wxBuffer, sizeof(char), (int)(rdSize - 3), handle);
947 case META_CREATEPATTERNBRUSH
:
950 fread((void *)wxBuffer, sizeof(char), (int)(rdSize - 3), handle);
954 case META_CREATEPENINDIRECT
:
957 int msStyle = getshort(handle); // Style: 2 bytes
958 int x = getshort(handle); // X: 2 bytes
959 int y = getshort(handle); // Y: 2 bytes
960 int colorref = getint(handle); // COLORREF 4 bytes
963 if (msStyle == PS_DOT)
965 else if (msStyle == PS_DASH)
966 style = wxSHORT_DASH;
967 else if (msStyle == PS_NULL)
968 style = wxTRANSPARENT;
969 else style = wxSOLID;
971 wxColour colour(GetRValue(colorref), GetGValue(colorref), GetBValue(colorref));
972 rec->param1 = (long)wxThePenList->FindOrCreatePen(&colour, x, style);
976 case META_CREATEFONTINDIRECT
:
979 int lfHeight = getshort(handle);
980 int lfWidth = getshort(handle);
981 int lfEsc = getshort(handle);
982 int lfOrient = getshort(handle);
983 int lfWeight = getshort(handle);
984 char lfItalic = getc(handle);
985 char lfUnderline = getc(handle);
986 char lfStrikeout = getc(handle);
987 char lfCharSet = getc(handle);
988 char lfOutPrecision = getc(handle);
989 char lfClipPrecision = getc(handle);
990 char lfQuality = getc(handle);
991 char lfPitchAndFamily = getc(handle);
993 fread((void *)lfFacename, sizeof(char), 32, handle);
996 if (lfPitchAndFamily & FF_MODERN)
998 else if (lfPitchAndFamily & FF_MODERN)
1000 else if (lfPitchAndFamily & FF_ROMAN)
1002 else if (lfPitchAndFamily & FF_SWISS)
1004 else if (lfPitchAndFamily & FF_DECORATIVE)
1005 family = wxDECORATIVE;
1010 if (lfWeight == 300)
1012 else if (lfWeight == 400)
1014 else if (lfWeight == 900)
1016 else weight = wxNORMAL;
1024 // About how many pixels per inch???
1025 int logPixelsY = 100;
1026 int pointSize = (int)(lfHeight*72.0/logPixelsY);
1029 wxTheFontList->FindOrCreateFont(pointSize, family, style, weight, (bool)lfUnderline);
1031 rec->param1 = (long)theFont;
1035 case META_CREATEBRUSHINDIRECT
:
1038 int msStyle = getshort(handle); // Style: 2 bytes
1039 int colorref = getint(handle); // COLORREF: 4 bytes
1040 int hatchStyle = getshort(handle); // Hatch style 2 bytes
1043 if (msStyle == PS_DOT)
1045 else if (msStyle == PS_DASH)
1046 style = wxSHORT_DASH;
1047 else if (msStyle == PS_NULL)
1048 style = wxTRANSPARENT;
1049 else style = wxSOLID;
1051 wxColour colour(GetRValue(colorref), GetGValue(colorref), GetBValue(colorref));
1052 rec->param1 = (long)wxTheBrushList->FindOrCreateBrush(&colour, wxSOLID);
1056 case META_CREATEBITMAPINDIRECT
:
1059 fread((void *)wxBuffer, sizeof(char), (int)(rdSize - 3), handle);
1063 case META_CREATEBITMAP
:
1066 fread((void *)wxBuffer, sizeof(char), (int)(rdSize - 3), handle);
1070 case META_CREATEREGION
:
1072 dc
->DestroyClippingRegion();
1074 rec->param1 = getshort(handle); // Style: 2 bytes
1083 node
= node
->GetNext();