]>
git.saurik.com Git - wxWidgets.git/blob - src/motif/metafile.cpp
   1 ///////////////////////////////////////////////////////////////////////////// 
   3 // Purpose:     wxMetaFile, wxMetaFileDC etc. These classes are optional. 
   4 // Author:      Julian Smart 
   8 // Copyright:   (c) Julian Smart 
   9 // Licence:     wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  13 #pragma implementation "metafile.h" 
  16 #include "wx/object.h" 
  17 #include "wx/string.h" 
  19 #include "wx/motif/metafile.h" 
  20 #include "wx/clipbrd.h" 
  22 extern bool wxClipboardIsOpen
; 
  24 #if !USE_SHARED_LIBRARY 
  25 IMPLEMENT_DYNAMIC_CLASS(wxMetaFile
, wxObject
) 
  26 IMPLEMENT_ABSTRACT_CLASS(wxMetaFileDC
, wxDC
) 
  29 wxMetaFile::wxMetaFile(const wxString
& file
) 
  34 wxMetaFile::~wxMetaFile() 
  39 bool wxMetaFile::SetClipboard(int width
, int height
) 
  41     bool alreadyOpen
=wxClipboardOpen(); 
  45         if (!wxEmptyClipboard()) return FALSE
; 
  47     bool success 
= wxSetClipboardData(wxDF_METAFILE
,this, width
,height
); 
  48     if (!alreadyOpen
) wxCloseClipboard(); 
  49     return (bool) success
; 
  52 bool wxMetaFile::Play(wxDC 
*dc
) 
  59  * Metafile device context 
  63 // Original constructor that does not takes origin and extent. If you use this, 
  64 // *DO* give origin/extent arguments to wxMakeMetaFilePlaceable. 
  65 wxMetaFileDC::wxMetaFileDC(const wxString
& file
) 
  70 // New constructor that takes origin and extent. If you use this, don't 
  71 // give origin/extent arguments to wxMakeMetaFilePlaceable. 
  72 wxMetaFileDC::wxMetaFileDC(const wxString
& file
, int xext
, int yext
, int xorg
, int yorg
) 
  77 wxMetaFileDC::~wxMetaFileDC() 
  81 void wxMetaFileDC::GetTextExtent(const wxString
& string
, float *x
, float *y
, 
  82                                  float *descent
, float *externalLeading
, wxFont 
*theFont
, bool use16bit
) 
  87 wxMetaFile 
*wxMetaFileDC::Close() 
  93 void wxMetaFileDC::SetMapMode(int mode
) 
 109 struct mfPLACEABLEHEADER 
{ 
 118 struct mfPLACEABLEHEADER 
{ 
 129  * Pass filename of existing non-placeable metafile, and bounding box. 
 130  * Adds a placeable metafile header, sets the mapping mode to anisotropic, 
 131  * and sets the window origin and extent to mimic the wxMM_TEXT mapping mode. 
 135 bool wxMakeMetaFilePlaceable(const wxString
& filename
, float scale
) 
 137   return wxMakeMetaFilePlaceable(filename
, 0, 0, 0, 0, scale
, FALSE
); 
 140 bool wxMakeMetaFilePlaceable(const wxString
& filename
, int x1
, int y1
, int x2
, int y2
, float scale
, bool useOriginAndExtent
) 
 142   // I'm not sure if this is the correct way of suggesting a scale 
 143   // to the client application, but it's the only way I can find. 
 144   int unitsPerInch 
= (int)(576/scale
); 
 146   mfPLACEABLEHEADER header
; 
 147   header
.key 
= 0x9AC6CDD7L
; 
 149   header
.bbox
.left 
= (int)(x1
); 
 150   header
.bbox
.top 
= (int)(y1
); 
 151   header
.bbox
.right 
= (int)(x2
); 
 152   header
.bbox
.bottom 
= (int)(y2
); 
 153   header
.inch 
= unitsPerInch
; 
 156   // Calculate checksum   
 158   mfPLACEABLEHEADER 
*pMFHead 
= &header
; 
 159   for (p 
=(WORD 
*)pMFHead
,pMFHead 
-> checksum 
= 0; 
 160         p 
< (WORD 
*)&pMFHead 
->checksum
; ++p
) 
 161        pMFHead 
->checksum 
^= *p
; 
 163   FILE *fd 
= fopen((char *)(const char *)filename
, "rb"); 
 164   if (!fd
) return FALSE
; 
 166   char tempFileBuf
[256]; 
 167   wxGetTempFileName("mf", tempFileBuf
); 
 168   FILE *fHandle 
= fopen(tempFileBuf
, "wb"); 
 171   fwrite((void *)&header
, sizeof(unsigned char), sizeof(mfPLACEABLEHEADER
), fHandle
); 
 173   // Calculate origin and extent 
 176   int extentX 
= x2 
- x1
; 
 177   int extentY 
= (y2 
- y1
); 
 179   // Read metafile header and write 
 180   METAHEADER metaHeader
; 
 181   fread((void *)&metaHeader
, sizeof(unsigned char), sizeof(metaHeader
), fd
); 
 183   if (useOriginAndExtent
) 
 184     metaHeader
.mtSize 
+= 15; 
 186     metaHeader
.mtSize 
+= 5; 
 188   fwrite((void *)&metaHeader
, sizeof(unsigned char), sizeof(metaHeader
), fHandle
); 
 190   // Write SetMapMode, SetWindowOrigin and SetWindowExt records 
 192   char originBuffer
[10]; 
 193   char extentBuffer
[10]; 
 194   METARECORD 
*modeRecord 
= (METARECORD 
*)&modeBuffer
; 
 196   METARECORD 
*originRecord 
= (METARECORD 
*)&originBuffer
; 
 197   METARECORD 
*extentRecord 
= (METARECORD 
*)&extentBuffer
; 
 199   modeRecord
->rdSize 
= 4; 
 200   modeRecord
->rdFunction 
= META_SETMAPMODE
; 
 201   modeRecord
->rdParm
[0] = wxMM_ANISOTROPIC
; 
 203   originRecord
->rdSize 
= 5; 
 204   originRecord
->rdFunction 
= META_SETWINDOWORG
; 
 205   originRecord
->rdParm
[0] = originY
; 
 206   originRecord
->rdParm
[1] = originX
; 
 208   extentRecord
->rdSize 
= 5; 
 209   extentRecord
->rdFunction 
= META_SETWINDOWEXT
; 
 210   extentRecord
->rdParm
[0] = extentY
; 
 211   extentRecord
->rdParm
[1] = extentX
; 
 213   fwrite((void *)modeBuffer
, sizeof(char), 8, fHandle
); 
 215   if (useOriginAndExtent
) 
 217     fwrite((void *)originBuffer
, sizeof(char), 10, fHandle
); 
 218     fwrite((void *)extentBuffer
, sizeof(char), 10, fHandle
); 
 232   wxRemoveFile(filename
); 
 233   wxCopyFile(tempFileBuf
, filename
); 
 234   wxRemoveFile(tempFileBuf
);