X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/31c1cbc7bc2cff4db5f1bf1c7765ceb23e2b3a59..0c1cc9483ecba053bc9a0983a4a8d48898e334f2:/src/mac/carbon/metafile.cpp diff --git a/src/mac/carbon/metafile.cpp b/src/mac/carbon/metafile.cpp index 2b2a199821..73d5b77f9a 100644 --- a/src/mac/carbon/metafile.cpp +++ b/src/mac/carbon/metafile.cpp @@ -26,94 +26,76 @@ #include "wx/clipbrd.h" #include "wx/mac/uma.h" #include "wx/graphics.h" +#include "wx/mac/carbon/metafile.h" #include #include IMPLEMENT_DYNAMIC_CLASS(wxMetafile, wxObject) IMPLEMENT_ABSTRACT_CLASS(wxMetafileDC, wxDC) +IMPLEMENT_ABSTRACT_CLASS(wxMetafileDCImpl, wxGCDCImpl) #define M_METAFILEREFDATA( a ) ((wxMetafileRefData*)(a).GetRefData()) -class wxMetafileRefData: public wxGDIRefData +class wxMetafileRefData : public wxGDIRefData { public: -#if wxMAC_USE_CORE_GRAPHICS + // default ctor needed for CreateGDIRefData(), must be initialized later + wxMetafileRefData() { Init(); } + // creates a metafile from memory, assumes ownership wxMetafileRefData(CFDataRef data); -#else - // creates a metafile from memory, assumes ownership - wxMetafileRefData(PicHandle data); -#endif + // prepares a recording metafile wxMetafileRefData( int width, int height); + // prepares a metafile to be read from a file (if filename is not empty) wxMetafileRefData( const wxString& filename); + virtual ~wxMetafileRefData(); + virtual bool IsOk() const { return m_data != NULL; } + void Init(); int GetWidth() const { return m_width; } int GetHeight() const { return m_height; } -#if wxMAC_USE_CORE_GRAPHICS CGPDFDocumentRef GetPDFDocument() const { return m_pdfDoc; } void UpdateDocumentFromData() ; const wxCFDataRef& GetData() const { return m_data; } CGContextRef GetContext() const { return m_context; } -#else - PicHandle GetHandle() const { return m_metafile; } -#endif + // ends the recording void Close(); private: -#if wxMAC_USE_CORE_GRAPHICS wxCFDataRef m_data; wxCFRef m_pdfDoc; CGContextRef m_context; -#else - PicHandle m_metafile; -#endif + int m_width ; int m_height ; }; -#if !wxMAC_USE_CORE_GRAPHICS -wxMetafileRefData::wxMetafileRefData(PicHandle pict) -{ - Init(); - m_metafile = pict; - - Rect r; - wxMacGetPictureBounds( m_metafile, &r ); - m_width = r.right - r.left; - m_height = r.bottom - r.top; -} -#else wxMetafileRefData::wxMetafileRefData(CFDataRef data) : m_data(data) { Init(); UpdateDocumentFromData(); } -#endif wxMetafileRefData::wxMetafileRefData( const wxString& filename ) { Init(); -#if wxMAC_USE_CORE_GRAPHICS + if ( !filename.empty() ) { - wxCFRef cfMutableString(CFStringCreateMutableCopy(NULL, 0, wxMacCFStringHolder(filename))); + wxCFRef cfMutableString(CFStringCreateMutableCopy(NULL, 0, wxCFStringRef(filename))); CFStringNormalize(cfMutableString,kCFStringNormalizationFormD); wxCFRef url(CFURLCreateWithFileSystemPath(kCFAllocatorDefault, cfMutableString , kCFURLPOSIXPathStyle, false)); m_pdfDoc.reset(CGPDFDocumentCreateWithURL(url)); } -#else - wxASSERT_MSG( filename.empty(), wxT("no file-based metafile support yet") ); - m_metafile = NULL; -#endif } @@ -123,22 +105,17 @@ wxMetafileRefData::wxMetafileRefData( int width, int height) m_width = width; m_height = height; -#if wxMAC_USE_CORE_GRAPHICS + CGRect r = CGRectMake( 0 , 0 , width , height ); CFMutableDataRef data = CFDataCreateMutable(kCFAllocatorDefault, 0); m_data.reset(data); - CGDataConsumerRef dataConsumer = UMACGDataConsumerCreateWithCFData(data); + CGDataConsumerRef dataConsumer = wxMacCGDataConsumerCreateWithCFData(data); m_context = CGPDFContextCreate( dataConsumer, (width != 0 && height != 0) ? &r : NULL , NULL ); CGDataConsumerRelease( dataConsumer ); if ( m_context ) { -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4 - if ( &CGPDFContextBeginPage != NULL ) - CGPDFContextBeginPage(m_context, NULL); - else -#endif - CGContextBeginPage(m_context, &r); + CGPDFContextBeginPage(m_context, NULL); CGColorSpaceRef genericColorSpace = wxMacGetGenericRGBColorSpace(); @@ -148,57 +125,32 @@ wxMetafileRefData::wxMetafileRefData( int width, int height) CGContextTranslateCTM( m_context , 0 , height ) ; CGContextScaleCTM( m_context , 1 , -1 ) ; } -#else - Rect r = { 0, 0, height, width }; - m_metafile = OpenPicture( &r ) ; -#endif } wxMetafileRefData::~wxMetafileRefData() { -#if! wxMAC_USE_CORE_GRAPHICS - if (m_metafile) - { - KillPicture( (PicHandle)m_metafile ); - m_metafile = NULL; - } -#endif } void wxMetafileRefData::Init() { -#if wxMAC_USE_CORE_GRAPHICS m_context = NULL; -#else - m_metafile = NULL; -#endif m_width = -1; m_height = -1; } void wxMetafileRefData::Close() { -#if wxMAC_USE_CORE_GRAPHICS -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4 - if ( &CGPDFContextEndPage != NULL ) - CGPDFContextEndPage(m_context); - else -#endif - CGContextEndPage(m_context); + CGPDFContextEndPage(m_context); CGContextRelease(m_context); m_context = NULL; UpdateDocumentFromData(); -#else - ClosePicture(); -#endif } -#if wxMAC_USE_CORE_GRAPHICS void wxMetafileRefData::UpdateDocumentFromData() { - wxCFRef provider(UMACGDataProviderCreateWithCFData(m_data)); + wxCFRef provider(wxMacCGDataProviderCreateWithCFData(m_data)); m_pdfDoc.reset(CGPDFDocumentCreateWithProvider(provider)); if ( m_pdfDoc != NULL ) { @@ -208,7 +160,6 @@ void wxMetafileRefData::UpdateDocumentFromData() m_height = wx_static_cast(int, rect.size.height); } } -#endif wxMetaFile::wxMetaFile(const wxString& file) { @@ -219,22 +170,19 @@ wxMetaFile::~wxMetaFile() { } -bool wxMetaFile::IsOk() const +wxGDIRefData *wxMetaFile::CreateGDIRefData() const { -#if wxMAC_USE_CORE_GRAPHICS - return (M_METAFILEDATA && (M_METAFILEDATA->GetData() != NULL)); -#else - return (M_METAFILEDATA && (M_METAFILEDATA->GetHandle() != NULL)); -#endif + return new wxMetafileRefData; +} + +wxGDIRefData *wxMetaFile::CloneGDIRefData(const wxGDIRefData *data) const +{ + return new wxMetafileRefData(*wx_static_cast(const wxMetafileRefData *, data)); } WXHMETAFILE wxMetaFile::GetHMETAFILE() const { -#if wxMAC_USE_CORE_GRAPHICS return (WXHMETAFILE) (CFDataRef) M_METAFILEDATA->GetData(); -#else - return (WXHMETAFILE) M_METAFILEDATA->GetHandle(); -#endif } bool wxMetaFile::SetClipboard(int WXUNUSED(width), int WXUNUSED(height)) @@ -265,22 +213,18 @@ void wxMetafile::SetHMETAFILE(WXHMETAFILE mf) { UnRef(); -#if wxMAC_USE_CORE_GRAPHICS m_refData = new wxMetafileRefData((CFDataRef)mf); -#else - m_refData = new wxMetafileRefData((PicHandle)mf); -#endif } +#ifndef __LP64__ void wxMetafile::SetPICT(void* pictHandle) { UnRef(); -#if wxMAC_USE_CORE_GRAPHICS Handle picHandle = (Handle) pictHandle; HLock(picHandle); CFDataRef data = CFDataCreateWithBytesNoCopy( kCFAllocatorDefault, (const UInt8*) *picHandle, GetHandleSize(picHandle), kCFAllocatorNull); - wxCFRef provider(UMACGDataProviderCreateWithCFData(data)); + wxCFRef provider(wxMacCGDataProviderCreateWithCFData(data)); QDPictRef pictRef = QDPictCreateWithProvider(provider); CGRect rect = QDPictGetBounds(pictRef); m_refData = new wxMetafileRefData(wx_static_cast(int, rect.size.width), @@ -289,34 +233,30 @@ void wxMetafile::SetPICT(void* pictHandle) CFRelease( data ); QDPictRelease( pictRef ); ((wxMetafileRefData*) m_refData)->Close(); -#else - m_refData = new wxMetafileRefData((PicHandle)pictHandle); -#endif } +#endif bool wxMetaFile::Play(wxDC *dc) { if (!m_refData) return false; - if (!dc->Ok()) + if (!dc->IsOk()) return false; { -#if wxMAC_USE_CORE_GRAPHICS - CGContextRef cg = (CGContextRef) dc->GetGraphicsContext()->GetNativeContext(); - CGPDFDocumentRef doc = M_METAFILEDATA->GetPDFDocument(); - CGPDFPageRef page = CGPDFDocumentGetPage( doc, 1 ); - wxMacCGContextStateSaver save(cg); - CGContextDrawPDFPage( cg, page ); + wxDCImpl *impl = dc->GetImpl(); + wxGCDCImpl *gc_impl = wxDynamicCast(impl, wxGCDCImpl); + if (gc_impl) + { + CGContextRef cg = (CGContextRef) (gc_impl->GetGraphicsContext()->GetNativeContext()); + CGPDFDocumentRef doc = M_METAFILEDATA->GetPDFDocument(); + CGPDFPageRef page = CGPDFDocumentGetPage( doc, 1 ); + wxMacCGContextStateSaver save(cg); + CGContextDrawPDFPage( cg, page ); + } // CGContextTranslateCTM( cg, 0, bounds.size.width ); // CGContextScaleCTM( cg, 1, -1 ); -#else - PicHandle pict = (PicHandle)GetHMETAFILE(); - wxMacPortSetter helper( dc ); - Rect picFrame; - DrawPicture( pict, wxMacGetPictureBounds( pict, &picFrame ) ); -#endif } return true; @@ -340,10 +280,12 @@ wxSize wxMetaFile::GetSize() const // New constructor that takes origin and extent. If you use this, don't // give origin/extent arguments to wxMakeMetaFilePlaceable. -wxMetaFileDC::wxMetaFileDC( +wxMetafileDCImpl::wxMetafileDCImpl( + wxDC *owner, const wxString& filename, int width, int height, - const wxString& WXUNUSED(description) ) + const wxString& WXUNUSED(description) ) : + wxGCDCImpl( owner ) { wxASSERT_MSG( width != 0 || height != 0, wxT("no arbitration of metafile size supported") ); wxASSERT_MSG( filename.empty(), wxT("no file based metafile support yet")); @@ -352,25 +294,18 @@ wxMetaFileDC::wxMetaFileDC( wxMetafileRefData* metafiledata = new wxMetafileRefData(width, height); m_metaFile->UnRef(); m_metaFile->SetRefData( metafiledata ); -#if wxMAC_USE_CORE_GRAPHICS + SetGraphicsContext( wxGraphicsContext::CreateFromNative(metafiledata->GetContext())); m_ok = (m_graphicContext != NULL) ; -#else - Rect r = { 0, 0, height, width }; - RectRgn( (RgnHandle)m_macBoundaryClipRgn, &r ); - CopyRgn( (RgnHandle)m_macBoundaryClipRgn, (RgnHandle)m_macCurrentClipRgn ); - ::GetPort( (GrafPtr*)&m_macPort ); - m_ok = true; -#endif SetMapMode( wxMM_TEXT ); } -wxMetaFileDC::~wxMetaFileDC() +wxMetafileDCImpl::~wxMetafileDCImpl() { } -void wxMetaFileDC::DoGetSize(int *width, int *height) const +void wxMetafileDCImpl::DoGetSize(int *width, int *height) const { wxCHECK_RET( m_metaFile, wxT("GetSize() doesn't work without a metafile") ); @@ -381,13 +316,11 @@ void wxMetaFileDC::DoGetSize(int *width, int *height) const (*height) = sz.y; } -wxMetaFile *wxMetaFileDC::Close() +wxMetaFile *wxMetafileDCImpl::Close() { -#if wxMAC_USE_CORE_GRAPHICS delete m_graphicContext; m_graphicContext = NULL; m_ok = false; -#endif M_METAFILEREFDATA(*m_metaFile)->Close(); @@ -397,21 +330,17 @@ wxMetaFile *wxMetaFileDC::Close() #if wxUSE_DATAOBJ size_t wxMetafileDataObject::GetDataSize() const { -#if wxMAC_USE_CORE_GRAPHICS CFIndex length = 0; wxMetafileRefData* refData = M_METAFILEREFDATA(m_metafile); if ( refData ) length = refData->GetData().GetLength(); return length; -#else - return GetHandleSize( (Handle) (*((wxMetafile*)&m_metafile)).GetHMETAFILE() ); -#endif } bool wxMetafileDataObject::GetDataHere(void *buf) const { bool result = false; -#if wxMAC_USE_CORE_GRAPHICS + wxMetafileRefData* refData = M_METAFILEREFDATA(m_metafile); if ( refData ) { @@ -422,29 +351,14 @@ bool wxMetafileDataObject::GetDataHere(void *buf) const refData->GetData().GetBytes(CFRangeMake(0,length), (UInt8 *) buf); } } -#else - Handle pictH = (Handle)(*((wxMetafile*)&m_metafile)).GetHMETAFILE(); - result = (pictH != NULL); - - if (result) - memcpy( buf, *pictH, GetHandleSize( pictH ) ); - -#endif return result; } bool wxMetafileDataObject::SetData(size_t len, const void *buf) { -#if wxMAC_USE_CORE_GRAPHICS wxMetafileRefData* metafiledata = new wxMetafileRefData(wxCFRefFromGet(wxCFDataRef((UInt8*)buf, len).get())); m_metafile.UnRef(); m_metafile.SetRefData( metafiledata ); -#else - Handle handle = NewHandle( len ); - SetHandleSize( handle, len ); - memcpy( *handle, buf, len ); - m_metafile.SetHMETAFILE( (WXHMETAFILE) handle ); -#endif return true; } #endif