X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/655719367ac5e131d9642e5783f3ecf64d1a3385..d66d050088ee2012542a2d2607b5329ff5f3a491:/src/msw/enhmeta.cpp diff --git a/src/msw/enhmeta.cpp b/src/msw/enhmeta.cpp index 73c04b84db..a3931c976f 100644 --- a/src/msw/enhmeta.cpp +++ b/src/msw/enhmeta.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////////// -// Name: msw/enhmeta.cpp +// Name: src/msw/enhmeta.cpp // Purpose: implementation of wxEnhMetaFileXXX classes // Author: Vadim Zeitlin // Modified by: @@ -17,10 +17,6 @@ // headers // ---------------------------------------------------------------------------- -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) - #pragma implementation "enhmeta.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -33,8 +29,12 @@ #ifndef WX_PRECOMP #include "wx/string.h" #include "wx/log.h" + #include "wx/intl.h" #endif //WX_PRECOMP +#include "wx/dc.h" +#include "wx/msw/dc.h" + #include "wx/metafile.h" #include "wx/clipbrd.h" @@ -45,7 +45,6 @@ // ---------------------------------------------------------------------------- IMPLEMENT_DYNAMIC_CLASS(wxEnhMetaFile, wxObject) -IMPLEMENT_ABSTRACT_CLASS(wxEnhMetaFileDC, wxDC) // ---------------------------------------------------------------------------- // macros @@ -60,7 +59,7 @@ IMPLEMENT_ABSTRACT_CLASS(wxEnhMetaFileDC, wxDC) // we must pass NULL if the string is empty to metafile functions static inline const wxChar *GetMetaFileName(const wxString& fn) - { return !fn ? (wxChar *)NULL : fn.c_str(); } + { return !fn ? (const wxChar *)NULL : (const wxChar*)fn.wx_str(); } // ============================================================================ // implementation @@ -70,6 +69,36 @@ static inline const wxChar *GetMetaFileName(const wxString& fn) // wxEnhMetaFile // ---------------------------------------------------------------------------- +wxGDIRefData *wxEnhMetaFile::CreateGDIRefData() const +{ + wxFAIL_MSG( _T("must be implemented if used") ); + + return NULL; +} + +wxGDIRefData * +wxEnhMetaFile::CloneGDIRefData(const wxGDIRefData *WXUNUSED(data)) const +{ + wxFAIL_MSG( _T("must be implemented if used") ); + + return NULL; +} + +void wxEnhMetaFile::Init() +{ + if ( m_filename.empty() ) + { + m_hMF = 0; + } + else // have valid file name, load metafile from it + { + m_hMF = (WXHANDLE)::GetEnhMetaFile(m_filename.fn_str()); + if ( !m_hMF ) + wxLogSysError(_("Failed to load metafile from file \"%s\"."), + m_filename.c_str()); + } +} + void wxEnhMetaFile::Assign(const wxEnhMetaFile& mf) { if ( &mf == this ) @@ -103,8 +132,8 @@ void wxEnhMetaFile::Free() bool wxEnhMetaFile::Play(wxDC *dc, wxRect *rectBound) { - wxCHECK_MSG( Ok(), FALSE, _T("can't play invalid enhanced metafile") ); - wxCHECK_MSG( dc, FALSE, _T("invalid wxDC in wxEnhMetaFile::Play") ); + wxCHECK_MSG( Ok(), false, _T("can't play invalid enhanced metafile") ); + wxCHECK_MSG( dc, false, _T("invalid wxDC in wxEnhMetaFile::Play") ); RECT rect; if ( rectBound ) @@ -124,14 +153,19 @@ bool wxEnhMetaFile::Play(wxDC *dc, wxRect *rectBound) rect.bottom = size.y; } - if ( !::PlayEnhMetaFile(GetHdcOf(*dc), GetEMF(), &rect) ) + wxDCImpl *impl = dc->GetImpl(); + wxMSWDCImpl *msw_impl = wxDynamicCast( impl, wxMSWDCImpl ); + if (!msw_impl) + return false; + + if ( !::PlayEnhMetaFile(GetHdcOf(*msw_impl), GetEMF(), &rect) ) { wxLogLastError(_T("PlayEnhMetaFile")); - return FALSE; + return false; } - return TRUE; + return true; } wxSize wxEnhMetaFile::GetSize() const @@ -164,27 +198,52 @@ wxSize wxEnhMetaFile::GetSize() const bool wxEnhMetaFile::SetClipboard(int WXUNUSED(width), int WXUNUSED(height)) { -#if wxUSE_DRAG_AND_DROP - wxCHECK_MSG( m_hMF, FALSE, _T("can't copy invalid metafile to clipboard") ); +#if wxUSE_DRAG_AND_DROP && wxUSE_CLIPBOARD + wxCHECK_MSG( m_hMF, false, _T("can't copy invalid metafile to clipboard") ); return wxTheClipboard->AddData(new wxEnhMetaFileDataObject(*this)); #else // !wxUSE_DRAG_AND_DROP wxFAIL_MSG(_T("not implemented")); - return FALSE; + return false; #endif // wxUSE_DRAG_AND_DROP/!wxUSE_DRAG_AND_DROP } // ---------------------------------------------------------------------------- -// wxEnhMetaFileDC +// wxEnhMetaFileDCImpl // ---------------------------------------------------------------------------- -wxEnhMetaFileDC::wxEnhMetaFileDC(const wxString& filename, +class wxEnhMetaFileDCImpl : public wxMSWDCImpl +{ +public: + wxEnhMetaFileDCImpl( wxEnhMetaFileDC *owner, + const wxString& filename, int width, int height, + const wxString& description ); + virtual ~wxEnhMetaFileDCImpl(); + + // obtain a pointer to the new metafile (caller should delete it) + wxEnhMetaFile *Close(); + +protected: + virtual void DoGetSize(int *width, int *height) const; + +private: + // size passed to ctor and returned by DoGetSize() + int m_width, + m_height; +}; + + +wxEnhMetaFileDCImpl::wxEnhMetaFileDCImpl( wxEnhMetaFileDC* owner, + const wxString& filename, int width, int height, - const wxString& description) + const wxString& description ) + : wxMSWDCImpl( owner ) { - ScreenHDC hdcRef; + m_width = width; + m_height = height; + RECT rect; - RECT *pRect; + RECT *pRect; if ( width && height ) { rect.top = @@ -194,7 +253,7 @@ wxEnhMetaFileDC::wxEnhMetaFileDC(const wxString& filename, // CreateEnhMetaFile() wants them in HIMETRIC PixelToHIMETRIC(&rect.right, &rect.bottom); - + pRect = ▭ } else @@ -203,17 +262,26 @@ wxEnhMetaFileDC::wxEnhMetaFileDC(const wxString& filename, pRect = (LPRECT)NULL; } + ScreenHDC hdcRef; m_hDC = (WXHDC)::CreateEnhMetaFile(hdcRef, GetMetaFileName(filename), - pRect, description); + pRect, description.wx_str()); if ( !m_hDC ) { wxLogLastError(_T("CreateEnhMetaFile")); } } -wxEnhMetaFile *wxEnhMetaFileDC::Close() +void wxEnhMetaFileDCImpl::DoGetSize(int *width, int *height) const +{ + if ( width ) + *width = m_width; + if ( height ) + *height = m_height; +} + +wxEnhMetaFile *wxEnhMetaFileDCImpl::Close() { - wxCHECK_MSG( Ok(), NULL, _T("invalid wxEnhMetaFileDC") ); + wxCHECK_MSG( IsOk(), NULL, _T("invalid wxEnhMetaFileDC") ); HENHMETAFILE hMF = ::CloseEnhMetaFile(GetHdc()); if ( !hMF ) @@ -228,12 +296,37 @@ wxEnhMetaFile *wxEnhMetaFileDC::Close() return mf; } -wxEnhMetaFileDC::~wxEnhMetaFileDC() +wxEnhMetaFileDCImpl::~wxEnhMetaFileDCImpl() { // avoid freeing it in the base class dtor m_hDC = 0; } +// ---------------------------------------------------------------------------- +// wxEnhMetaFileDC +// ---------------------------------------------------------------------------- + +IMPLEMENT_ABSTRACT_CLASS(wxEnhMetaFileDC, wxDC) + +wxEnhMetaFileDC::wxEnhMetaFileDC(const wxString& filename, + int width, int height, + const wxString& description) + : wxDC(new wxEnhMetaFileDCImpl(this, + filename, + width, height, + description)) +{ +} + +wxEnhMetaFile *wxEnhMetaFileDC::Close() +{ + wxEnhMetaFileDCImpl * const + impl = wx_static_cast(wxEnhMetaFileDCImpl *, GetImpl()); + wxCHECK_MSG( impl, NULL, _T("no wxEnhMetaFileDC implementation") ); + + return impl->Close(); +} + #if wxUSE_DRAG_AND_DROP // ---------------------------------------------------------------------------- @@ -276,7 +369,7 @@ size_t wxEnhMetaFileDataObject::GetDataSize(const wxDataFormat& format) const bool wxEnhMetaFileDataObject::GetDataHere(const wxDataFormat& format, void *buf) const { - wxCHECK_MSG( m_metafile.Ok(), FALSE, _T("copying invalid enh metafile") ); + wxCHECK_MSG( m_metafile.Ok(), false, _T("copying invalid enh metafile") ); HENHMETAFILE hEMF = (HENHMETAFILE)m_metafile.GetHENHMETAFILE(); @@ -287,7 +380,7 @@ bool wxEnhMetaFileDataObject::GetDataHere(const wxDataFormat& format, void *buf) { wxLogLastError(_T("CopyEnhMetaFile")); - return FALSE; + return false; } *(HENHMETAFILE *)buf = hEMFCopy; @@ -302,7 +395,7 @@ bool wxEnhMetaFileDataObject::GetDataHere(const wxDataFormat& format, void *buf) // first get the buffer size and alloc memory size_t size = ::GetWinMetaFileBits(hEMF, 0, NULL, MM_ANISOTROPIC, hdc); - wxCHECK_MSG( size, FALSE, _T("GetWinMetaFileBits() failed") ); + wxCHECK_MSG( size, false, _T("GetWinMetaFileBits() failed") ); BYTE *bits = (BYTE *)malloc(size); @@ -313,7 +406,7 @@ bool wxEnhMetaFileDataObject::GetDataHere(const wxDataFormat& format, void *buf) free(bits); - return FALSE; + return false; } // and finally convert them to the WMF @@ -323,7 +416,7 @@ bool wxEnhMetaFileDataObject::GetDataHere(const wxDataFormat& format, void *buf) { wxLogLastError(_T("SetMetaFileBitsEx")); - return FALSE; + return false; } METAFILEPICT *mfpict = (METAFILEPICT *)buf; @@ -337,7 +430,7 @@ bool wxEnhMetaFileDataObject::GetDataHere(const wxDataFormat& format, void *buf) PixelToHIMETRIC(&mfpict->xExt, &mfpict->yExt); } - return TRUE; + return true; } bool wxEnhMetaFileDataObject::SetData(const wxDataFormat& format, @@ -350,7 +443,7 @@ bool wxEnhMetaFileDataObject::SetData(const wxDataFormat& format, { hEMF = *(HENHMETAFILE *)buf; - wxCHECK_MSG( hEMF, FALSE, _T("pasting invalid enh metafile") ); + wxCHECK_MSG( hEMF, false, _T("pasting invalid enh metafile") ); } else { @@ -361,7 +454,7 @@ bool wxEnhMetaFileDataObject::SetData(const wxDataFormat& format, // first get the buffer size size_t size = ::GetMetaFileBitsEx(mfpict->hMF, 0, NULL); - wxCHECK_MSG( size, FALSE, _T("GetMetaFileBitsEx() failed") ); + wxCHECK_MSG( size, false, _T("GetMetaFileBitsEx() failed") ); // then get metafile bits BYTE *bits = (BYTE *)malloc(size); @@ -371,7 +464,7 @@ bool wxEnhMetaFileDataObject::SetData(const wxDataFormat& format, free(bits); - return FALSE; + return false; } ScreenHDC hdcRef; @@ -383,13 +476,13 @@ bool wxEnhMetaFileDataObject::SetData(const wxDataFormat& format, { wxLogLastError(_T("SetWinMetaFileBits")); - return FALSE; + return false; } } m_metafile.SetHENHMETAFILE((WXHANDLE)hEMF); - return TRUE; + return true; } // ---------------------------------------------------------------------------- @@ -404,7 +497,7 @@ size_t wxEnhMetaFileSimpleDataObject::GetDataSize() const bool wxEnhMetaFileSimpleDataObject::GetDataHere(void *buf) const { - wxCHECK_MSG( m_metafile.Ok(), FALSE, _T("copying invalid enh metafile") ); + wxCHECK_MSG( m_metafile.Ok(), false, _T("copying invalid enh metafile") ); HENHMETAFILE hEMF = (HENHMETAFILE)m_metafile.GetHENHMETAFILE(); @@ -413,11 +506,11 @@ bool wxEnhMetaFileSimpleDataObject::GetDataHere(void *buf) const { wxLogLastError(_T("CopyEnhMetaFile")); - return FALSE; + return false; } *(HENHMETAFILE *)buf = hEMFCopy; - return TRUE; + return true; } bool wxEnhMetaFileSimpleDataObject::SetData(size_t WXUNUSED(len), @@ -425,10 +518,10 @@ bool wxEnhMetaFileSimpleDataObject::SetData(size_t WXUNUSED(len), { HENHMETAFILE hEMF = *(HENHMETAFILE *)buf; - wxCHECK_MSG( hEMF, FALSE, _T("pasting invalid enh metafile") ); + wxCHECK_MSG( hEMF, false, _T("pasting invalid enh metafile") ); m_metafile.SetHENHMETAFILE((WXHANDLE)hEMF); - return TRUE; + return true; }