]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/metafile.cpp
Deallocate wxThreadSpecificInfo when wxThread ends.
[wxWidgets.git] / src / os2 / metafile.cpp
index bb9fa9719daeff1a67de340500636c397211b6d1..fa53786d372d432f923ef2f1e34f7d9f9f34a695 100644 (file)
@@ -1,10 +1,9 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        metafile.cpp
+// Name:        src/os2/metafile.cpp
 // Purpose:     wxMetaFile, wxMetaFileDC etc. These classes are optional.
 // Author:      David Webster
 // Modified by:
 // Created:     10/10/99
-// RCS-ID:      $Id$
 // Copyright:   (c) David Webster
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
-#ifndef WX_PRECOMP
-#include "wx/setup.h"
-#endif
-
 #if wxUSE_METAFILE
 
 #ifndef WX_PRECOMP
-#include "wx/utils.h"
-#include "wx/app.h"
+    #include "wx/utils.h"
+    #include "wx/app.h"
 #endif
 
 #include "wx/metafile.h"
@@ -44,7 +39,7 @@ IMPLEMENT_ABSTRACT_CLASS(wxMetafileDC, wxDC)
 wxMetafileRefData::wxMetafileRefData(void)
 {
     m_metafile = 0;
-    m_windowsMappingMode = wxMM_ANISOTROPIC;
+    m_windowsMappingMode = MM_ANISOTROPIC;
 }
 
 wxMetafileRefData::~wxMetafileRefData(void)
@@ -60,9 +55,9 @@ wxMetafile::wxMetafile(const wxString& file)
 {
     m_refData = new wxMetafileRefData;
 
-    M_METAFILEDATA->m_windowsMappingMode = wxMM_ANISOTROPIC;
+    M_METAFILEDATA->m_windowsMappingMode = MM_ANISOTROPIC;
     M_METAFILEDATA->m_metafile = 0;
-    if (!file.IsNull() && (file.Cmp(wxT("")) == 0))
+    if (!file.empty())
         M_METAFILEDATA->m_metafile = (WXHANDLE)0; // TODO: GetMetaFile(file);
 }
 
@@ -70,35 +65,47 @@ wxMetafile::~wxMetafile(void)
 {
 }
 
+wxGDIRefData *wxMetafile::CreateGDIRefData() const
+{
+    return new wxMetafileRefData;
+}
+
+wxGDIRefData *wxMetafile::CloneGDIRefData(const wxGDIRefData *data) const
+{
+    return new wxMetafileRefData(*static_cast<const wxMetafileRefData *>(data));
+}
+
 bool wxMetafile::SetClipboard(int width, int height)
 {
+#if !wxUSE_CLIPBOARD
+    wxUnusedVar(width);
+    wxUnusedVar(height);
+    return false;
+#else
     if (!m_refData)
-        return FALSE;
+        return false;
 
     bool alreadyOpen=wxClipboardOpen();
     if (!alreadyOpen)
     {
         wxOpenClipboard();
-        if (!wxEmptyClipboard()) return FALSE;
+        if (!wxEmptyClipboard()) return false;
     }
     bool success = wxSetClipboardData(wxDF_METAFILE, this, width,height);
     if (!alreadyOpen) wxCloseClipboard();
     return (bool) success;
+#endif
 }
 
 bool wxMetafile::Play(wxDC *dc)
 {
     if (!m_refData)
-        return FALSE;
-
-    dc->BeginDrawing();
+        return false;
 
  //   if (dc->GetHDC() && M_METAFILEDATA->m_metafile)
  //       PlayMetaFile((HDC) dc->GetHDC(), (HMETAFILE) M_METAFILEDATA->m_metafile);
 
-    dc->EndDrawing();
-
-    return TRUE;
+    return true;
 }
 
 void wxMetafile::SetHMETAFILE(WXHANDLE mf)
@@ -124,7 +131,8 @@ void wxMetafile::SetWindowsMappingMode(int mm)
 
 // Original constructor that does not takes origin and extent. If you use this,
 // *DO* give origin/extent arguments to wxMakeMetafilePlaceable.
-wxMetafileDC::wxMetafileDC(const wxString& file)
+wxMetafileDCImpl::wxMetafileDCImpl(wxDC *owner, const wxString& file)
+    : wxPMDCImpl(owner)
 {
   m_metaFile = NULL;
   m_minX = 10000;
@@ -133,12 +141,12 @@ wxMetafileDC::wxMetafileDC(const wxString& file)
   m_maxY = -10000;
 //  m_title = NULL;
 
-  if (!file.IsNull() && wxFileExists(file))
+  if ( wxFileExists(file) )
     wxRemoveFile(file);
 
   // TODO
 /*
-  if (!file.IsNull() && (file != wxT("")))
+  if (!file.empty())
     m_hDC = (WXHDC) CreateMetaFile(file);
   else
     m_hDC = (WXHDC) CreateMetaFile(NULL);
@@ -154,61 +162,72 @@ wxMetafileDC::wxMetafileDC(const wxString& file)
 
 // New constructor that takes origin and extent. If you use this, don't
 // give origin/extent arguments to wxMakeMetafilePlaceable.
-wxMetafileDC::wxMetafileDC(const wxString& file, int xext, int yext, int xorg, int yorg)
+wxMetafileDCImpl::wxMetafileDCImpl( wxDC *owner, const wxString& file,
+                                    int WXUNUSED(xext),
+                                    int WXUNUSED(yext),
+                                    int WXUNUSED(xorg),
+                                    int WXUNUSED(yorg) )
+    : wxPMDCImpl(owner)
 {
-  m_minX = 10000;
-  m_minY = 10000;
-  m_maxX = -10000;
-  m_maxY = -10000;
-  if (file != wxT("") && wxFileExists(file)) wxRemoveFile(file);
+    m_minX = 10000;
+    m_minY = 10000;
+    m_maxX = -10000;
+    m_maxY = -10000;
+    if (!file.empty() && wxFileExists(file))
+        wxRemoveFile(file);
+
 //  m_hDC = (WXHDC) CreateMetaFile(file);
 
-  m_ok = TRUE;
+    m_ok = true;
 
 //  ::SetWindowOrgEx((HDC) m_hDC,xorg,yorg, NULL);
 //  ::SetWindowExtEx((HDC) m_hDC,xext,yext, NULL);
 
-  // Actual Windows mapping mode, for future reference.
-  m_windowsMappingMode = wxMM_ANISOTROPIC;
+    // Actual Windows mapping mode, for future reference.
+    m_windowsMappingMode = MM_ANISOTROPIC;
 
-  SetMapMode(wxMM_TEXT); // NOTE: does not set HDC mapmode (this is correct)
+    SetMapMode(wxMM_TEXT); // NOTE: does not set HDC mapmode (this is correct)
 }
 
-wxMetafileDC::~wxMetafileDC(void)
+wxMetafileDCImpl::~wxMetafileDCImpl(void)
 {
   m_hDC = 0;
 }
 
-void wxMetafileDC::GetTextExtent(const wxString& string, long *x, long *y,
-                                 long *descent, long *externalLeading, wxFont *theFont, bool use16bit) const
+void wxMetafileDCImpl::DoGetTextExtent(const wxString& WXUNUSED(string),
+                                     wxCoord *WXUNUSED(x),
+                                     wxCoord *WXUNUSED(y),
+                                     wxCoord *WXUNUSED(descent),
+                                     wxCoord *WXUNUSED(externalLeading),
+                                     const wxFont *theFont) const
 {
-  wxFont *fontToUse = theFont;
-  if (!fontToUse)
-    fontToUse = (wxFont*) &m_font;
+    const wxFont *fontToUse = theFont;
+    if (!fontToUse)
+        fontToUse = &m_font;
 
-  // TODO:
+    // TODO:
 /*
-  HDC dc = GetDC(NULL);
-
-  SIZE sizeRect;
-  TEXTMETRIC tm;
-  GetTextExtentPoint(dc, WXSTRINGCAST string, wxStrlen(WXSTRINGCAST string), &sizeRect);
-  GetTextMetrics(dc, &tm);
-
-  ReleaseDC(NULL, dc);
-
-  if ( x )
-      *x = sizeRect.cx;
-  if ( y )
-    *y = sizeRect.cy;
-  if ( descent )
-      *descent = tm.tmDescent;
-  if ( externalLeading )
-      *externalLeading = tm.tmExternalLeading;
+    HDC dc = GetDC(NULL);
+
+    SIZE sizeRect;
+    TEXTMETRIC tm;
+    GetTextExtentPoint(dc, WXSTRINGCAST string, wxStrlen(WXSTRINGCAST string), &sizeRect);
+    GetTextMetrics(dc, &tm);
+
+    ReleaseDC(NULL, dc);
+
+    if ( x )
+        *x = sizeRect.cx;
+    if ( y )
+        *y = sizeRect.cy;
+    if ( descent )
+        *descent = tm.tmDescent;
+    if ( externalLeading )
+        *externalLeading = tm.tmExternalLeading;
 */
 }
 
-wxMetafile *wxMetafileDC::Close(void)
+wxMetafile *wxMetafileDCImpl::Close(void)
 {
   SelectOldObjects(m_hDC);
   HANDLE mf = 0; // TODO: CloseMetaFile((HDC) m_hDC);
@@ -223,7 +242,7 @@ wxMetafile *wxMetafileDC::Close(void)
   return NULL;
 }
 
-void wxMetafileDC::SetMapMode(int mode)
+void wxMetafileDCImpl::SetMapMode(wxMappingMode mode)
 {
   m_mappingMode = mode;
 
@@ -283,21 +302,21 @@ struct RECT32
 };
 
 struct mfPLACEABLEHEADER {
-       DWORD   key;
-       short   hmf;
-       RECT32  bbox;
-       WORD    inch;
-       DWORD   reserved;
-       WORD    checksum;
+    DWORD  key;
+    short  hmf;
+    RECT32 bbox;
+    WORD   inch;
+    DWORD  reserved;
+    WORD   checksum;
 };
 #else
 struct mfPLACEABLEHEADER {
-       DWORD   key;
-       HANDLE  hmf;
-       RECT    bbox;
-       WORD    inch;
-       DWORD   reserved;
-       WORD    checksum;
+    DWORD  key;
+    HANDLE hmf;
+    RECT   bbox;
+    WORD   inch;
+    DWORD  reserved;
+    WORD   checksum;
 };
 #endif
 
@@ -313,106 +332,111 @@ bool wxMakeMetafilePlaceable(const wxString& filename, float scale)
   return wxMakeMetafilePlaceable(filename, 0, 0, 0, 0, scale, FALSE);
 }
 
-bool wxMakeMetafilePlaceable(const wxString& filename, int x1, int y1, int x2, int y2, float scale, bool useOriginAndExtent)
+bool wxMakeMetafilePlaceable(const wxString& WXUNUSED(filename),
+                             int WXUNUSED(x1),
+                             int WXUNUSED(y1),
+                             int WXUNUSED(x2),
+                             int WXUNUSED(y2),
+                             float WXUNUSED(scale),
+                             bool WXUNUSED(useOriginAndExtent))
 {
 // TODO:  the OS/2 PM/MM way to do this
 /*
-  // I'm not sure if this is the correct way of suggesting a scale
-  // to the client application, but it's the only way I can find.
-  int unitsPerInch = (int)(576/scale);
-
-  mfPLACEABLEHEADER header;
-  header.key = 0x9AC6CDD7L;
-  header.hmf = 0;
-  header.bbox.xLeft = (int)(x1);
-  header.bbox.yTop = (int)(y1);
-  header.bbox.xRight = (int)(x2);
-  header.bbox.yBottom = (int)(y2);
-  header.inch = unitsPerInch;
-  header.reserved = 0;
-
-  // Calculate checksum
-  WORD *p;
-  mfPLACEABLEHEADER *pMFHead = &header;
-  for (p =(WORD *)pMFHead,pMFHead -> checksum = 0;
-       p < (WORD *)&pMFHead ->checksum; ++p)
-       pMFHead ->checksum ^= *p;
-
-  FILE *fd = fopen(filename.fn_str(), "rb");
-  if (!fd) return FALSE;
-
-  wxChar tempFileBuf[256];
-  wxGetTempFileName(wxT("mf"), tempFileBuf);
-  FILE *fHandle = fopen(wxConvFile.cWX2MB(tempFileBuf), "wb");
-  if (!fHandle)
-    return FALSE;
-  fwrite((void *)&header, sizeof(unsigned char), sizeof(mfPLACEABLEHEADER), fHandle);
-
-  // Calculate origin and extent
-  int originX = x1;
-  int originY = y1;
-  int extentX = x2 - x1;
-  int extentY = (y2 - y1);
-
-  // Read metafile header and write
-  METAHEADER metaHeader;
-  fread((void *)&metaHeader, sizeof(unsigned char), sizeof(metaHeader), fd);
-
-  if (useOriginAndExtent)
-    metaHeader.mtSize += 15;
-  else
-    metaHeader.mtSize += 5;
-
-  fwrite((void *)&metaHeader, sizeof(unsigned char), sizeof(metaHeader), fHandle);
-
-  // Write SetMapMode, SetWindowOrigin and SetWindowExt records
-  char modeBuffer[8];
-  char originBuffer[10];
-  char extentBuffer[10];
-  METARECORD *modeRecord = (METARECORD *)&modeBuffer;
-
-  METARECORD *originRecord = (METARECORD *)&originBuffer;
-  METARECORD *extentRecord = (METARECORD *)&extentBuffer;
-
-  modeRecord->rdSize = 4;
-  modeRecord->rdFunction = META_SETMAPMODE;
-  modeRecord->rdParm[0] = MM_ANISOTROPIC;
-
-  originRecord->rdSize = 5;
-  originRecord->rdFunction = META_SETWINDOWORG;
-  originRecord->rdParm[0] = originY;
-  originRecord->rdParm[1] = originX;
-
-  extentRecord->rdSize = 5;
-  extentRecord->rdFunction = META_SETWINDOWEXT;
-  extentRecord->rdParm[0] = extentY;
-  extentRecord->rdParm[1] = extentX;
-
-  fwrite((void *)modeBuffer, sizeof(char), 8, fHandle);
-
-  if (useOriginAndExtent)
-  {
-    fwrite((void *)originBuffer, sizeof(char), 10, fHandle);
-    fwrite((void *)extentBuffer, sizeof(char), 10, fHandle);
-  }
+    // I'm not sure if this is the correct way of suggesting a scale
+    // to the client application, but it's the only way I can find.
+    int unitsPerInch = (int)(576/scale);
+
+    mfPLACEABLEHEADER header;
+    header.key = 0x9AC6CDD7L;
+    header.hmf = 0;
+    header.bbox.xLeft = (int)(x1);
+    header.bbox.yTop = (int)(y1);
+    header.bbox.xRight = (int)(x2);
+    header.bbox.yBottom = (int)(y2);
+    header.inch = unitsPerInch;
+    header.reserved = 0;
+
+    // Calculate checksum
+    WORD *p;
+    mfPLACEABLEHEADER *pMFHead = &header;
+    for (p =(WORD *)pMFHead,pMFHead -> checksum = 0; p < (WORD *)&pMFHead ->checksum; ++p)
+        pMFHead ->checksum ^= *p;
+
+    FILE *fd = fopen(filename.fn_str(), "rb");
+    if (!fd)
+        return false;
+
+    wxChar tempFileBuf[256];
+    wxGetTempFileName(wxT("mf"), tempFileBuf);
+    FILE *fHandle = fopen(wxConvFile.cWX2MB(tempFileBuf), "wb");
+    if (!fHandle)
+        return false;
+    fwrite((void *)&header, sizeof(unsigned char), sizeof(mfPLACEABLEHEADER), fHandle);
+
+    // Calculate origin and extent
+    int originX = x1;
+    int originY = y1;
+    int extentX = x2 - x1;
+    int extentY = (y2 - y1);
+
+    // Read metafile header and write
+    METAHEADER metaHeader;
+    fread((void *)&metaHeader, sizeof(unsigned char), sizeof(metaHeader), fd);
+
+    if (useOriginAndExtent)
+        metaHeader.mtSize += 15;
+    else
+        metaHeader.mtSize += 5;
+
+    fwrite((void *)&metaHeader, sizeof(unsigned char), sizeof(metaHeader), fHandle);
+
+    // Write SetMapMode, SetWindowOrigin and SetWindowExt records
+    char modeBuffer[8];
+    char originBuffer[10];
+    char extentBuffer[10];
+    METARECORD *modeRecord = (METARECORD *)&modeBuffer;
+
+    METARECORD *originRecord = (METARECORD *)&originBuffer;
+    METARECORD *extentRecord = (METARECORD *)&extentBuffer;
+
+    modeRecord->rdSize = 4;
+    modeRecord->rdFunction = META_SETMAPMODE;
+    modeRecord->rdParm[0] = MM_ANISOTROPIC;
+
+    originRecord->rdSize = 5;
+    originRecord->rdFunction = META_SETWINDOWORG;
+    originRecord->rdParm[0] = originY;
+    originRecord->rdParm[1] = originX;
+
+    extentRecord->rdSize = 5;
+    extentRecord->rdFunction = META_SETWINDOWEXT;
+    extentRecord->rdParm[0] = extentY;
+    extentRecord->rdParm[1] = extentX;
+
+    fwrite((void *)modeBuffer, sizeof(char), 8, fHandle);
+
+    if (useOriginAndExtent)
+    {
+        fwrite((void *)originBuffer, sizeof(char), 10, fHandle);
+        fwrite((void *)extentBuffer, sizeof(char), 10, fHandle);
+    }
 
-  int ch = -2;
-  while (ch != EOF)
-  {
-    ch = getc(fd);
-    if (ch != EOF)
+    int ch = -2;
+    while (ch != EOF)
     {
-      putc(ch, fHandle);
+        ch = getc(fd);
+        if (ch != EOF)
+        {
+            putc(ch, fHandle);
+        }
     }
-  }
-  fclose(fHandle);
-  fclose(fd);
-  wxRemoveFile(filename);
-  wxCopyFile(tempFileBuf, filename);
-  wxRemoveFile(tempFileBuf);
+    fclose(fHandle);
+    fclose(fd);
+    wxRemoveFile(filename);
+    wxCopyFile(tempFileBuf, filename);
+    wxRemoveFile(tempFileBuf);
 */
-  return TRUE;
+    return true;
 }
 
 #endif // wxUSE_METAFILE
-