1
//////////////////////////////////////////////////////////////////////////
3
// pgAdmin III - PostgreSQL Tools
5
// Portions Copyright (C) 1998 - 2011, Julian Smart
6
// Portions Copyright (C) 2011, The pgAdmin Development Team
7
// This software is released under the PostgreSQL Licence
9
// mfutils.cpp - Metafile utillities
11
//////////////////////////////////////////////////////////////////////////
15
#include <wx/metafile.h>
22
static char _buf[1024]; // a temp buffer to use inplace of wxBuffer, which is deprecated.
24
// 16-bit unsigned integer
25
static unsigned int getshort(FILE *fp)
30
unsigned int res = ((unsigned int) c) + (((unsigned int) c1) << 8);
34
// 16-bit signed integer
35
static int getsignedshort(FILE *fp)
41
// this is not used value, no need to execute it
42
int testRes = ((unsigned int) c) + (((unsigned int) c1) << 8);
44
unsigned long res1 = ((unsigned int) c) + (((unsigned int) c1) << 8);
47
res = (int)(res1 - 65536);
54
static long getint(FILE *fp)
61
long res = (long)((long) c) +
69
/* Placeable metafile header
70
struct mfPLACEABLEHEADER {
73
RECT bbox; // 4x16 bit
75
DWORD reserved; // 32-bit
76
WORD checksum; // 16-bit
80
wxMetaRecord::~wxMetaRecord(void)
82
if (points) delete[] points;
83
if (stringParam) delete[] stringParam;
86
wxXMetaFile::wxXMetaFile(const wxChar *file)
99
Handle table gdiObjects
100
------------ ----------
102
[1]----param2--- wxBrush
106
The handle table works as follows.
107
When a GDI object is created whilst reading in the
108
metafile, the (e.g.) createpen record is added to the
109
first free entry in the handle table. The createpen
110
record's param1 is a pointer to the actual wxPen, and
111
its param2 is the index into the gdiObjects list, which only
112
grows and never shrinks (unlike the handle table.)
114
When SelectObject(index) is found, the index in the file
115
refers to the position in the handle table. BUT we then
116
set param2 to be the position of the wxPen in gdiObjects,
117
i.e. to param2 of the CreatePen record, itself found in
120
When an object is deleted, the entry in the handletable is
121
NULLed but the gdiObjects entry is not removed (no point, and
122
allows us to create all GDI objects in advance of playing the
127
static wxMetaRecord *HandleTable[100];
128
static int HandleTableSize = 0;
130
void DeleteMetaRecordHandle(int index)
132
HandleTable[index] = NULL;
135
int AddMetaRecordHandle(wxMetaRecord *record)
137
for (int i = 0; i < HandleTableSize; i++)
140
HandleTable[i] = record;
143
// No free spaces in table, so append.
145
HandleTable[HandleTableSize] = record;
147
return (HandleTableSize - 1);
150
bool wxXMetaFile::ReadFile(const wxChar *file)
154
FILE *handle = wxFopen(file, wxT("rb"));
155
if (!handle) return FALSE;
157
// Read placeable metafile header, if any
158
long key = getint(handle);
160
if (key == (long) 0x9AC6CDD7)
162
/* long hmf = */ getshort(handle);
163
int iLeft, iTop, iRight, iBottom;
164
iLeft = getsignedshort(handle);
165
iTop = getsignedshort(handle);
166
iRight = getsignedshort(handle);
167
iBottom = getsignedshort(handle);
169
left = (double)iLeft;
171
right = (double)iRight;
172
bottom = (double)iBottom;
176
/* long reserved = */
181
double widthInUnits = (double)right - left;
182
double heightInUnits = (double)bottom - top;
183
*width = (int)((widthInUnits*1440.0)/inch);
184
*height = (int)((heightInUnits*1440.0)/inch);
190
int mtType = getshort(handle);
192
if (mtType != 1 && mtType != 2)
198
/* int mtHeaderSize = */ getshort(handle);
199
int mtVersion = getshort(handle);
201
if (mtVersion != 0x0300 && mtVersion != 0x0100)
207
/* long mtSize = */ getint(handle);
208
/* int mtNoObjects = */
210
/* long mtMaxRecord = */
212
/* int mtNoParameters = */
215
while (!feof(handle))
217
long rdSize = getint(handle); // 4 bytes
218
int rdFunction = getshort(handle); // 2 bytes
224
case META_SETBKCOLOR:
226
wxMetaRecord *rec = new wxMetaRecord(META_SETBKCOLOR);
227
long colorref = getint(handle); // COLORREF
228
rec->param1 = GetRValue(colorref);
229
rec->param2 = GetGValue(colorref);
230
rec->param3 = GetBValue(colorref);
231
metaRecords.Append(rec);
236
wxMetaRecord *rec = new wxMetaRecord(META_SETBKMODE);
237
rec->param1 = getshort(handle); // Background mode
238
if (rec->param1 == OPAQUE) rec->param1 = wxSOLID;
239
else rec->param1 = wxTRANSPARENT;
240
metaRecords.Append(rec);
243
case META_SETMAPMODE:
245
wxMetaRecord *rec = new wxMetaRecord(META_SETMAPMODE);
246
rec->param1 = getshort(handle);
247
metaRecords.Append(rec);
250
// case META_SETROP2:
251
// case META_SETRELABS:
252
// case META_SETPOLYFILLMODE:
253
// case META_SETSTRETCHBLTMODE:
254
// case META_SETTEXTCHAREXTRA:
255
case META_SETTEXTCOLOR:
257
wxMetaRecord *rec = new wxMetaRecord(META_SETTEXTCOLOR);
258
long colorref = getint(handle); // COLORREF
259
rec->param1 = GetRValue(colorref);
260
rec->param2 = GetGValue(colorref);
261
rec->param3 = GetBValue(colorref);
262
metaRecords.Append(rec);
265
// case META_SETTEXTJUSTIFICATION:
266
case META_SETWINDOWORG:
268
wxMetaRecord *rec = new wxMetaRecord(META_SETWINDOWORG);
269
rec->param2 = getshort(handle);
270
rec->param1 = getshort(handle);
271
metaRecords.Append(rec);
274
case META_SETWINDOWEXT:
276
wxMetaRecord *rec = new wxMetaRecord(META_SETWINDOWEXT);
277
rec->param2 = getshort(handle);
278
rec->param1 = getshort(handle);
279
metaRecords.Append(rec);
282
// case META_SETVIEWPORTORG:
283
// case META_SETVIEWPORTEXT:
284
// case META_OFFSETWINDOWORG:
285
// case META_SCALEWINDOWEXT:
286
// case META_OFFSETVIEWPORTORG:
287
// case META_SCALEVIEWPORTEXT:
290
wxMetaRecord *rec = new wxMetaRecord(META_LINETO);
291
rec->param1 = getshort(handle); // x1
292
rec->param2 = getshort(handle); // y1
293
metaRecords.Append(rec);
298
wxMetaRecord *rec = new wxMetaRecord(META_MOVETO);
299
rec->param1 = getshort(handle); // x1
300
rec->param2 = getshort(handle); // y1
301
metaRecords.Append(rec);
304
case META_EXCLUDECLIPRECT:
306
wxMetaRecord *rec = new wxMetaRecord(META_EXCLUDECLIPRECT);
307
rec->param4 = getshort(handle); // y2
308
rec->param3 = getshort(handle); // x2
309
rec->param2 = getshort(handle); // y1
310
rec->param1 = getshort(handle); // x1
311
metaRecords.Append(rec);
314
case META_INTERSECTCLIPRECT:
316
wxMetaRecord *rec = new wxMetaRecord(META_INTERSECTCLIPRECT);
317
rec->param4 = getshort(handle); // y2
318
rec->param3 = getshort(handle); // x2
319
rec->param2 = getshort(handle); // y1
320
rec->param1 = getshort(handle); // x1
321
metaRecords.Append(rec);
324
// case META_ARC: // DO!!!
327
wxMetaRecord *rec = new wxMetaRecord(META_ELLIPSE);
328
rec->param4 = getshort(handle); // y2
329
rec->param3 = getshort(handle); // x2
330
rec->param2 = getshort(handle); // y1
331
rec->param1 = getshort(handle); // x1
332
metaRecords.Append(rec);
335
// case META_FLOODFILL:
336
// case META_PIE: // DO!!!
339
wxMetaRecord *rec = new wxMetaRecord(META_RECTANGLE);
340
rec->param4 = getshort(handle); // y2
341
rec->param3 = getshort(handle); // x2
342
rec->param2 = getshort(handle); // y1
343
rec->param1 = getshort(handle); // x1
344
metaRecords.Append(rec);
349
wxMetaRecord *rec = new wxMetaRecord(META_ROUNDRECT);
350
rec->param6 = getshort(handle); // width
351
rec->param5 = getshort(handle); // height
352
rec->param4 = getshort(handle); // y2
353
rec->param3 = getshort(handle); // x2
354
rec->param2 = getshort(handle); // y1
355
rec->param1 = getshort(handle); // x1
356
metaRecords.Append(rec);
363
wxMetaRecord *rec = new wxMetaRecord(META_SETPIXEL);
364
rec->param1 = getshort(handle); // x1
365
rec->param2 = getshort(handle); // y1
366
rec->param3 = getint(handle); // COLORREF
367
metaRecords.Append(rec);
370
// case META_OFFSETCLIPRGN:
373
wxMetaRecord *rec = new wxMetaRecord(META_TEXTOUT);
374
int count = getshort(handle);
375
rec->stringParam = new wxChar[count + 1];
376
fread((void *)rec->stringParam, sizeof(wxChar), count, handle);
377
rec->stringParam[count] = 0;
378
rec->param2 = getshort(handle); // Y
379
rec->param1 = getshort(handle); // X
380
metaRecords.Append(rec);
384
case META_EXTTEXTOUT:
386
wxMetaRecord *rec = new wxMetaRecord(META_EXTTEXTOUT);
387
int cellSpacing = getshort(handle);
388
int count = getshort(handle);
389
rec->stringParam = new char[count+1];
390
fread((void *)rec->stringParam, sizeof(char), count, handle);
391
rec->stringParam[count] = 0;
393
int rectY2 = getshort(handle);
394
int rectX2 = getshort(handle);
395
int rectY1 = getshort(handle);
396
int rectX1 = getshort(handle);
397
int rectType = getshort(handle);
398
rec->param2 = getshort(handle); // Y
399
rec->param1 = getshort(handle); // X
400
metaRecords.Append(rec);
405
// case META_STRETCHBLT:
408
wxMetaRecord *rec = new wxMetaRecord(META_POLYGON);
409
rec->param1 = getshort(handle);
410
rec->points = new wxRealPoint[(int)rec->param1];
411
for (int i = 0; i < rec->param1; i++)
413
rec->points[i].x = getshort(handle);
414
rec->points[i].y = getshort(handle);
417
metaRecords.Append(rec);
422
wxMetaRecord *rec = new wxMetaRecord(META_POLYLINE);
423
rec->param1 = (long)getshort(handle);
424
rec->points = new wxRealPoint[(int)rec->param1];
425
for (int i = 0; i < rec->param1; i++)
427
rec->points[i].x = getshort(handle);
428
rec->points[i].y = getshort(handle);
431
metaRecords.Append(rec);
435
// case META_RESTOREDC:
436
// case META_FILLREGION:
437
// case META_FRAMEREGION:
438
// case META_INVERTREGION:
439
// case META_PAINTREGION:
440
// case META_SELECTCLIPREGION: // DO THIS!
441
case META_SELECTOBJECT:
443
wxMetaRecord *rec = new wxMetaRecord(META_SELECTOBJECT);
444
rec->param1 = (long)getshort(handle); // Position of object in gdiObjects list
445
metaRecords.Append(rec);
446
// param2 gives the index into gdiObjects, which is different from
447
// the index into the handle table.
448
rec->param2 = HandleTable[(int)rec->param1]->param2;
451
// case META_SETTEXTALIGN:
452
// case META_DRAWTEXT:
454
// case META_SETMAPPERFLAGS:
455
// case META_EXTTEXTOUT:
456
// case META_SETDIBTODEV:
457
// case META_SELECTPALETTE:
458
// case META_REALIZEPALETTE:
459
// case META_ANIMATEPALETTE:
460
// case META_SETPALENTRIES:
461
// case META_POLYPOLYGON:
462
// case META_RESIZEPALETTE:
463
// case META_DIBBITBLT:
464
// case META_DIBSTRETCHBLT:
465
case META_DIBCREATEPATTERNBRUSH:
467
wxMetaRecord *rec = new wxMetaRecord(META_DIBCREATEPATTERNBRUSH);
468
fread((void *)_buf, sizeof(char), (int)((2 * rdSize) - 6), handle);
470
metaRecords.Append(rec);
471
gdiObjects.Append(rec);
472
AddMetaRecordHandle(rec);
473
rec->param2 = (long)(gdiObjects.GetCount() - 1);
476
// case META_STRETCHDIB:
477
// case META_EXTFLOODFILL:
478
// case META_RESETDC:
479
// case META_STARTDOC:
480
// case META_STARTPAGE:
481
// case META_ENDPAGE:
482
// case META_ABORTDOC:
484
case META_DELETEOBJECT:
486
int index = getshort(handle);
487
DeleteMetaRecordHandle(index);
490
case META_CREATEPALETTE:
492
wxMetaRecord *rec = new wxMetaRecord(META_CREATEPALETTE);
493
fread((void *)_buf, sizeof(char), (int)((2 * rdSize) - 6), handle);
495
metaRecords.Append(rec);
496
gdiObjects.Append(rec);
497
AddMetaRecordHandle(rec);
498
rec->param2 = (long)(gdiObjects.GetCount() - 1);
501
case META_CREATEBRUSH:
503
wxMetaRecord *rec = new wxMetaRecord(META_CREATEBRUSH);
504
fread((void *)_buf, sizeof(char), (int)((2 * rdSize) - 6), handle);
505
metaRecords.Append(rec);
506
gdiObjects.Append(rec);
507
AddMetaRecordHandle(rec);
508
rec->param2 = (long)(gdiObjects.GetCount() - 1);
511
case META_CREATEPATTERNBRUSH:
513
wxMetaRecord *rec = new wxMetaRecord(META_CREATEPATTERNBRUSH);
514
fread((void *)_buf, sizeof(char), (int)((2 * rdSize) - 6), handle);
515
metaRecords.Append(rec);
516
gdiObjects.Append(rec);
517
AddMetaRecordHandle(rec);
518
rec->param2 = (long)(gdiObjects.GetCount() - 1);
521
case META_CREATEPENINDIRECT:
523
wxMetaRecord *rec = new wxMetaRecord(META_CREATEPENINDIRECT);
524
int msStyle = getshort(handle); // Style: 2 bytes
525
int x = getshort(handle); // X: 2 bytes
527
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
560
getshort(handle); // 2 bytes
562
getshort(handle); // 2 bytes
564
getshort(handle); // 2 bytes
565
int lfWeight = getshort(handle); // 2 bytes
566
char lfItalic = getc(handle); // 1 byte
567
char lfUnderline = getc(handle); // 1 byte
568
/* char lfStrikeout = */
569
getc(handle); // 1 byte
570
/* char lfCharSet = */
571
getc(handle); // 1 byte
572
/* char lfOutPrecision = */
573
getc(handle); // 1 byte
574
/* char lfClipPrecision = */
575
getc(handle); // 1 byte
576
/* char lfQuality = */
577
getc(handle); // 1 byte
578
char lfPitchAndFamily = getc(handle); // 1 byte (18th)
580
// Read the rest of the record, which is total record size
581
// minus the number of bytes already read (18 record, 6 metarecord
583
fread((void *)lfFacename, sizeof(char), (int)((2 * rdSize) - 18 - 6), handle);
586
if (lfPitchAndFamily & FF_MODERN)
588
else if (lfPitchAndFamily & FF_MODERN)
590
else if (lfPitchAndFamily & FF_ROMAN)
592
else if (lfPitchAndFamily & FF_SWISS)
594
else if (lfPitchAndFamily & FF_DECORATIVE)
595
family = wxDECORATIVE;
602
else if (lfWeight == 400)
604
else if (lfWeight == 900)
606
else weight = wxNORMAL;
614
// About how many pixels per inch???
615
int logPixelsY = 100;
616
int pointSize = (int)(lfHeight * 72.0 / logPixelsY);
619
wxTheFontList->FindOrCreateFont(pointSize, family, style, weight, (lfUnderline != 0));
621
rec->param1 = (long) theFont;
622
metaRecords.Append(rec);
623
gdiObjects.Append(rec);
624
AddMetaRecordHandle(rec);
625
rec->param2 = (long)(gdiObjects.GetCount() - 1);
628
case META_CREATEBRUSHINDIRECT:
630
wxMetaRecord *rec = new wxMetaRecord(META_CREATEBRUSHINDIRECT);
631
int msStyle = getshort(handle); // Style: 2 bytes
632
long colorref = getint(handle); // COLORREF: 4 bytes
633
int hatchStyle = getshort(handle); // Hatch style 2 bytes
643
style = wxBDIAGONAL_HATCH;
646
style = wxCROSSDIAG_HATCH;
649
style = wxFDIAGONAL_HATCH;
652
style = wxHORIZONTAL_HATCH;
655
style = wxVERTICAL_HATCH;
659
style = wxCROSS_HATCH;
669
if (msStyle == PS_DOT)
671
else if (msStyle == PS_DASH)
672
style = wxSHORT_DASH;
673
else if (msStyle == PS_NULL)
674
style = wxTRANSPARENT;
675
else style = wxSOLID;
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();