X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0e320a79f187558effb04d92020b470372bbe456..55cca86849db86abe32f10db475a1e3e9bf461bb:/src/os2/metafile.cpp diff --git a/src/os2/metafile.cpp b/src/os2/metafile.cpp index 03c29bcb79..4cd1db8306 100644 --- a/src/os2/metafile.cpp +++ b/src/os2/metafile.cpp @@ -1,58 +1,120 @@ ///////////////////////////////////////////////////////////////////////////// // Name: metafile.cpp // Purpose: wxMetaFile, wxMetaFileDC etc. These classes are optional. -// Author: AUTHOR +// Author: David Webster // Modified by: -// Created: 04/01/98 +// Created: 10/10/99 // RCS-ID: $Id$ -// Copyright: (c) AUTHOR -// Licence: wxWindows licence +// Copyright: (c) David Webster +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma implementation "metafile.h" +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifndef WX_PRECOMP +#include "wx/setup.h" #endif -#include "wx/object.h" -#include "wx/string.h" -#include "wx/dc.h" -#include "wx/stubs/metafile.h" +#if wxUSE_METAFILE + +#ifndef WX_PRECOMP +#include "wx/utils.h" +#include "wx/app.h" +#endif + +#include "wx/metafile.h" #include "wx/clipbrd.h" +#include "wx/os2/private.h" + +#include +#include extern bool wxClipboardIsOpen; -#if !USE_SHARED_LIBRARY -IMPLEMENT_DYNAMIC_CLASS(wxMetaFile, wxObject) -IMPLEMENT_ABSTRACT_CLASS(wxMetaFileDC, wxDC) -#endif +IMPLEMENT_DYNAMIC_CLASS(wxMetafile, wxObject) +IMPLEMENT_ABSTRACT_CLASS(wxMetafileDC, wxDC) + +/* + * Metafiles + * Currently, the only purpose for making a metafile is to put + * it on the clipboard. + */ -wxMetaFile::wxMetaFile(const wxString& file) +wxMetafileRefData::wxMetafileRefData(void) { - // TODO + m_metafile = 0; + m_windowsMappingMode = wxMM_ANISOTROPIC; +} + +wxMetafileRefData::~wxMetafileRefData(void) +{ + if (m_metafile) + { +// TODO: DeleteMetaFile((HMETAFILE) m_metafile); + m_metafile = 0; + } +} + +wxMetafile::wxMetafile(const wxString& file) +{ + m_refData = new wxMetafileRefData; + + M_METAFILEDATA->m_windowsMappingMode = wxMM_ANISOTROPIC; + M_METAFILEDATA->m_metafile = 0; + if (!file.IsNull() && (file.Cmp(wxT("")) == 0)) + M_METAFILEDATA->m_metafile = (WXHANDLE)0; // TODO: GetMetaFile(file); } -wxMetaFile::~wxMetaFile() +wxMetafile::~wxMetafile(void) { - // TODO } -bool wxMetaFile::SetClipboard(int width, int height) +bool wxMetafile::SetClipboard(int width, int height) { + if (!m_refData) + return FALSE; + bool alreadyOpen=wxClipboardOpen(); if (!alreadyOpen) { wxOpenClipboard(); if (!wxEmptyClipboard()) return FALSE; } - bool success = wxSetClipboardData(wxDF_METAFILE,this, width,height); + bool success = wxSetClipboardData(wxDF_METAFILE, this, width,height); if (!alreadyOpen) wxCloseClipboard(); return (bool) success; } -bool wxMetaFile::Play(wxDC *dc) +bool wxMetafile::Play(wxDC *dc) { - // TODO - return FALSE; + if (!m_refData) + return FALSE; + + dc->BeginDrawing(); + + // if (dc->GetHDC() && M_METAFILEDATA->m_metafile) + // PlayMetaFile((HDC) dc->GetHDC(), (HMETAFILE) M_METAFILEDATA->m_metafile); + + dc->EndDrawing(); + + return TRUE; +} + +void wxMetafile::SetHMETAFILE(WXHANDLE mf) +{ + if (m_refData) + m_refData = new wxMetafileRefData; + + M_METAFILEDATA->m_metafile = mf; +} + +void wxMetafile::SetWindowsMappingMode(int mm) +{ + if (m_refData) + m_refData = new wxMetafileRefData; + + M_METAFILEDATA->m_windowsMappingMode = mm; } /* @@ -61,41 +123,155 @@ bool wxMetaFile::Play(wxDC *dc) */ // 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) +// *DO* give origin/extent arguments to wxMakeMetafilePlaceable. +wxMetafileDC::wxMetafileDC(const wxString& file) { - // TODO + m_metaFile = NULL; + m_minX = 10000; + m_minY = 10000; + m_maxX = -10000; + m_maxY = -10000; +// m_title = NULL; + + if (!file.IsNull() && wxFileExists(file)) + wxRemoveFile(file); + + // TODO +/* + if (!file.IsNull() && (file != wxT(""))) + m_hDC = (WXHDC) CreateMetaFile(file); + else + m_hDC = (WXHDC) CreateMetaFile(NULL); +*/ + + m_ok = (m_hDC != (WXHDC) 0) ; + + // Actual Windows mapping mode, for future reference. + m_windowsMappingMode = wxMM_TEXT; + + SetMapMode(wxMM_TEXT); // NOTE: does not set HDC mapmode (this is correct) } // 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) +// give origin/extent arguments to wxMakeMetafilePlaceable. +wxMetafileDC::wxMetafileDC(const wxString& file, int xext, int yext, int xorg, int yorg) { - // TODO + m_minX = 10000; + m_minY = 10000; + m_maxX = -10000; + m_maxY = -10000; + if (file != wxT("") && wxFileExists(file)) wxRemoveFile(file); +// m_hDC = (WXHDC) CreateMetaFile(file); + + 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; + + SetMapMode(wxMM_TEXT); // NOTE: does not set HDC mapmode (this is correct) } -wxMetaFileDC::~wxMetaFileDC() +wxMetafileDC::~wxMetafileDC(void) { + m_hDC = 0; } -void wxMetaFileDC::GetTextExtent(const wxString& string, float *x, float *y, - float *descent, float *externalLeading, wxFont *theFont, bool use16bit) +void wxMetafileDC::GetTextExtent(const wxString& string, long *x, long *y, + long *descent, long *externalLeading, wxFont *theFont, bool use16bit) const { - // TODO + wxFont *fontToUse = theFont; + if (!fontToUse) + fontToUse = (wxFont*) &m_font; + + // 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; +*/ } -wxMetaFile *wxMetaFileDC::Close() +wxMetafile *wxMetafileDC::Close(void) { - // TODO - return NULL; + SelectOldObjects(m_hDC); + HANDLE mf = 0; // TODO: CloseMetaFile((HDC) m_hDC); + m_hDC = 0; + if (mf) + { + wxMetafile *wx_mf = new wxMetafile; + wx_mf->SetHMETAFILE((WXHANDLE) mf); + wx_mf->SetWindowsMappingMode(m_windowsMappingMode); + return wx_mf; + } + return NULL; } -void wxMetaFileDC::SetMapMode(int mode) +void wxMetafileDC::SetMapMode(int mode) { - // TODO -} + m_mappingMode = mode; -#if 0 +// int pixel_width = 0; +// int pixel_height = 0; +// int mm_width = 0; +// int mm_height = 0; + + float mm2pixelsX = 10.0; + float mm2pixelsY = 10.0; + + switch (mode) + { + case wxMM_TWIPS: + { + m_logicalScaleX = (float)(twips2mm * mm2pixelsX); + m_logicalScaleY = (float)(twips2mm * mm2pixelsY); + break; + } + case wxMM_POINTS: + { + m_logicalScaleX = (float)(pt2mm * mm2pixelsX); + m_logicalScaleY = (float)(pt2mm * mm2pixelsY); + break; + } + case wxMM_METRIC: + { + m_logicalScaleX = mm2pixelsX; + m_logicalScaleY = mm2pixelsY; + break; + } + case wxMM_LOMETRIC: + { + m_logicalScaleX = (float)(mm2pixelsX/10.0); + m_logicalScaleY = (float)(mm2pixelsY/10.0); + break; + } + default: + case wxMM_TEXT: + { + m_logicalScaleX = 1.0; + m_logicalScaleY = 1.0; + break; + } + } + m_windowExtX = 100; + m_windowExtY = 100; +} #ifdef __WIN32__ struct RECT32 @@ -131,41 +307,43 @@ struct mfPLACEABLEHEADER { * and sets the window origin and extent to mimic the wxMM_TEXT mapping mode. * */ - -bool wxMakeMetaFilePlaceable(const wxString& filename, float scale) + +bool wxMakeMetafilePlaceable(const wxString& filename, float scale) { - return wxMakeMetaFilePlaceable(filename, 0, 0, 0, 0, scale, FALSE); + 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& filename, int x1, int y1, int x2, int y2, float scale, bool 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.left = (int)(x1); - header.bbox.top = (int)(y1); - header.bbox.right = (int)(x2); - header.bbox.bottom = (int)(y2); + 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 + // 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((char *)(const char *)filename, "rb"); + FILE *fd = fopen(filename.fn_str(), "rb"); if (!fd) return FALSE; - - char tempFileBuf[256]; - wxGetTempFileName("mf", tempFileBuf); - FILE *fHandle = fopen(tempFileBuf, "wb"); + + 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); @@ -179,12 +357,12 @@ bool wxMakeMetaFilePlaceable(const wxString& filename, int x1, int y1, int x2, i // 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 @@ -211,7 +389,7 @@ bool wxMakeMetaFilePlaceable(const wxString& filename, int x1, int y1, int x2, i extentRecord->rdParm[1] = extentX; fwrite((void *)modeBuffer, sizeof(char), 8, fHandle); - + if (useOriginAndExtent) { fwrite((void *)originBuffer, sizeof(char), 10, fHandle); @@ -232,8 +410,9 @@ bool wxMakeMetaFilePlaceable(const wxString& filename, int x1, int y1, int x2, i wxRemoveFile(filename); wxCopyFile(tempFileBuf, filename); wxRemoveFile(tempFileBuf); +*/ return TRUE; } -#endif +#endif // wxUSE_METAFILE