]> git.saurik.com Git - wxWidgets.git/commitdiff
using 64bit APIs, closes #10184
authorStefan Csomor <csomor@advancedconcepts.ch>
Mon, 30 Nov 2009 17:47:37 +0000 (17:47 +0000)
committerStefan Csomor <csomor@advancedconcepts.ch>
Mon, 30 Nov 2009 17:47:37 +0000 (17:47 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@62749 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/osx/carbon/dcprint.cpp
src/osx/core/printmac.cpp

index 40b1543e608ce56dc6da7727e52d98c349c27acb..3c400a2aba62ddeb647eb8286150bc1d3761f235 100644 (file)
@@ -74,39 +74,43 @@ wxMacCarbonPrinterDC::wxMacCarbonPrinterDC( wxPrintData* data )
 {
     m_err = noErr ;
     wxOSXPrintData *native = (wxOSXPrintData*) data->GetNativeData() ;
-
+    
     PMRect rPage;
     m_err = PMGetAdjustedPageRect(native->GetPageFormat(), &rPage);
     if ( m_err != noErr )
         return;
-
+    
     m_maxX = wxCoord(rPage.right - rPage.left) ;
     m_maxY = wxCoord(rPage.bottom - rPage.top);
-
+    
     PMResolution res;
-
+    PMPrinter printer;
+    m_err = PMSessionGetCurrentPrinter(native->GetPrintSession(), &printer);
+    if ( m_err == noErr )
+    {    
 #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
-    if ( PMPrinterGetOutputResolution != NULL )
-    {
-        PMPrinter printer;
-        m_err = PMSessionGetCurrentPrinter(native->GetPrintSession(), &printer);
-        if ( m_err == noErr )
+        if ( PMPrinterGetOutputResolution != NULL )
         {
-            m_err = PMPrinterGetOutputResolution( printer, native->GetPrintSettings(), &res) ;
-            if ( m_err == -9589 /* kPMKeyNotFound */ )
             {
-                m_err = noErr ;
-                res.hRes = res.vRes = 300;
+                m_err = PMPrinterGetOutputResolution( printer, native->GetPrintSettings(), &res) ;
+                if ( m_err == -9589 /* kPMKeyNotFound */ )
+                {
+                    m_err = noErr ;
+                    res.hRes = res.vRes = 300;
+                }
             }
         }
-    }
-    else
+        else
 #endif
-    {
+        {
 #if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5
-        m_err = PMGetResolution((PMPageFormat) (native->GetPageFormat()), &res);
+            m_err = PMPrinterGetPrinterResolution(printer, kPMCurrentValue, &res);
 #endif
+        }
     }
+    
+    m_maxX = wxCoord((double)m_maxX * res.hRes / 72.0);
+    m_maxY = wxCoord((double)m_maxY * res.vRes / 72.0);
 
     m_ppi = wxSize(int(res.hRes), int(res.vRes));
 }
@@ -128,10 +132,7 @@ bool wxMacCarbonPrinterDC::StartDoc(  wxPrinterDC* dc , const wxString& message
     wxPrinterDCImpl *impl = (wxPrinterDCImpl*) dc->GetImpl();
     wxOSXPrintData *native = (wxOSXPrintData*) impl->GetPrintData().GetNativeData() ;
 
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
-    if ( PMPrintSettingsSetJobName != NULL )
-        PMPrintSettingsSetJobName(native->GetPrintSettings(), wxCFStringRef(message));
-#endif
+    PMPrintSettingsSetJobName(native->GetPrintSettings(), wxCFStringRef(message));
 
     m_err = PMSessionBeginCGDocumentNoDialog(native->GetPrintSession(),
               native->GetPrintSettings(),
@@ -148,12 +149,13 @@ bool wxMacCarbonPrinterDC::StartDoc(  wxPrinterDC* dc , const wxString& message
     m_maxY = wxCoord(rPage.bottom - rPage.top);
 
     PMResolution res;
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
-    if ( PMPrinterGetOutputResolution != NULL )
+    PMPrinter printer;
+
+    m_err = PMSessionGetCurrentPrinter(native->GetPrintSession(), &printer);
+    if (m_err == noErr)
     {
-        PMPrinter printer;
-        m_err = PMSessionGetCurrentPrinter(native->GetPrintSession(), &printer);
-        if ( m_err == noErr )
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
+        if ( PMPrinterGetOutputResolution != NULL )
         {
             m_err = PMPrinterGetOutputResolution( printer, native->GetPrintSettings(), &res) ;
             if ( m_err == -9589 /* kPMKeyNotFound */ )
@@ -162,14 +164,17 @@ bool wxMacCarbonPrinterDC::StartDoc(  wxPrinterDC* dc , const wxString& message
                 res.hRes = res.vRes = 300;
             }
         }
-    }
-    else
+        else
 #endif
-    {
+        {
 #if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5
-       m_err = PMGetResolution((PMPageFormat) (native->GetPageFormat()), &res);
+            m_err = PMPrinterGetPrinterResolution(printer, kPMCurrentValue, &res);
 #endif
+        }
     }
+    
+    m_maxX = wxCoord((double)m_maxX * res.hRes / 72.0);
+    m_maxY = wxCoord((double)m_maxY * res.vRes / 72.0);
 
     m_ppi = wxSize(int(res.hRes), int(res.vRes));
     return true ;
@@ -196,7 +201,7 @@ void wxMacCarbonPrinterDC::StartPage( wxPrinterDC* dc )
 
     m_err = PMSessionBeginPageNoDialog(native->GetPrintSession(),
                  native->GetPageFormat(),
-                 nil);
+                 NULL);
 
     CGContextRef pageContext;
 
@@ -213,22 +218,24 @@ void wxMacCarbonPrinterDC::StartPage( wxPrinterDC* dc )
     }
     else
     {
-        PMRect rPage;
-
-        m_err = PMGetAdjustedPageRect(native->GetPageFormat(), &rPage);
+        PMRect paperRect ;
+        m_err = PMGetAdjustedPaperRect( native->GetPageFormat() , &paperRect ) ;
+        // make sure (0,0) is at the upper left of the printable area (wx conventions)
+        // Core Graphics initially has the lower left of the paper as 0,0
         if ( !m_err )
-        {
-            PMRect paperRect ;
-            PMGetAdjustedPaperRect( native->GetPageFormat() , &paperRect ) ;
-            // make sure (0,0) is at the upper left of the printable area (wx conventions)
-            // Core Graphics initially has the lower left of the paper as 0,0
             CGContextTranslateCTM( pageContext , (CGFloat) -paperRect.left , (CGFloat) paperRect.bottom ) ;
-            CGContextScaleCTM( pageContext , 1 , -1 ) ;
-        }
+        
         // since this is a non-critical error, we set the flag back
         m_err = noErr ;
+
+        // Leopard deprecated PMSetResolution() which will not be available in 64 bit mode, so we avoid using it.
+        // To set the proper drawing resolution, the docs suggest the use of CGContextScaleCTM(), so here we go; as a
+        // consequence though, PMGetAdjustedPaperRect() and PMGetAdjustedPageRect() return unscaled rects, so we
+        // have to manually scale them later.
+        CGContextScaleCTM( pageContext, 72.0 / (double)m_ppi.x, -72.0 / (double)m_ppi.y);
+
+        impl->SetGraphicsContext( wxGraphicsContext::CreateFromNative( pageContext ) );
     }
-    impl->SetGraphicsContext( wxGraphicsContext::CreateFromNative( pageContext ) );
 }
 
 void wxMacCarbonPrinterDC::EndPage( wxPrinterDC* dc )
@@ -355,6 +362,13 @@ wxRect wxPrinterDCImpl::GetPaperRect() const
     err = PMGetAdjustedPaperRect(native->GetPageFormat(), &rPaper);
     if ( err != noErr )
         return pageRect;
+
+    wxSize ppi = GetOwner()->GetPPI();
+    rPaper.right *= (ppi.x / 72.0);
+    rPaper.bottom *= (ppi.y / 72.0);
+    rPaper.left *= (ppi.x / 72.0);
+    rPaper.top *= (ppi.y / 72.0);
+
     return wxRect(wxCoord(rPaper.left), wxCoord(rPaper.top),
         wxCoord(rPaper.right - rPaper.left), wxCoord(rPaper.bottom - rPaper.top));
 }
index 8d43808e5e92f042ffe735dac25a7afce837c77e..3ed74451c3a1e440393ee30d663ab841c3c91a22 100644 (file)
 // move to print_osx.cpp
 //
 
+static int ResolutionSorter(const void *e1, const void *e2)
+{
+    const PMResolution *res1 = (const PMResolution *)e1;
+    const PMResolution *res2 = (const PMResolution *)e2;
+    int area1 = res1->hRes * res1->vRes;
+    int area2 = res2->hRes * res2->vRes;
+    
+    if (area1 < area2)
+        return -1;
+    else if (area1 > area2)
+        return 1;
+    else
+        return 0;
+}
+
+static PMResolution *GetSupportedResolutions(PMPrinter printer, UInt32 *count)
+{
+    PMResolution res, *resolutions = NULL;
+    OSStatus status = PMPrinterGetPrinterResolutionCount(printer, count);
+    if (status == kPMNotImplemented)
+    {
+#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5
+        resolutions = (PMResolution *)malloc(sizeof(PMResolution) * 4);
+        *count = 0;
+        if (PMPrinterGetPrinterResolution(printer, kPMMinRange, &res) == noErr)
+            resolutions[(*count)++] = res;
+        if (PMPrinterGetPrinterResolution(printer, kPMMinSquareResolution, &res) == noErr)
+            resolutions[(*count)++] = res;
+        if (PMPrinterGetPrinterResolution(printer, kPMMaxSquareResolution, &res) == noErr)
+            resolutions[(*count)++] = res;
+        if (PMPrinterGetPrinterResolution(printer, kPMMaxRange, &res) == noErr)
+            resolutions[(*count)++] = res;
+        if (*count == 0)
+        {
+            if (PMPrinterGetPrinterResolution(printer, kPMDefaultResolution, &res) == noErr)
+                resolutions[(*count)++] = res;
+        }
+#endif
+    }
+    else if (status == noErr)
+    {
+        resolutions = (PMResolution *)malloc(sizeof(PMResolution) * (*count));
+        UInt32 realCount = 0;
+        for (UInt32 i = 0; i < *count; i++)
+        {
+            if (PMPrinterGetIndexedPrinterResolution(printer, i + 1, &res) == noErr)
+                resolutions[realCount++] = res;
+        }
+        qsort(resolutions, realCount, sizeof(PMResolution), ResolutionSorter);
+        
+        *count = realCount;
+    }
+    if ((*count == 0) && (resolutions))
+    {
+        free(resolutions);
+        resolutions = NULL;
+    }
+    return resolutions;
+}
+
+
+
 IMPLEMENT_DYNAMIC_CLASS(wxOSXPrintData, wxPrintNativeDataBase)
 
 bool wxOSXPrintData::IsOk() const
@@ -71,6 +133,32 @@ void wxOSXPrintData::UpdateToPMState()
 
 bool wxOSXPrintData::TransferFrom( const wxPrintData &data )
 {
+    CFArrayRef printerList;
+    CFIndex index, count;
+    CFStringRef name;
+    
+    if (PMServerCreatePrinterList(kPMServerLocal, &printerList) == noErr)
+    {
+        PMPrinter printer = NULL;
+        count = CFArrayGetCount(printerList);
+        for (index = 0; index < count; index++)
+        {
+            printer = (PMPrinter)CFArrayGetValueAtIndex(printerList, index);
+            if ((data.GetPrinterName().empty()) && (PMPrinterIsDefault(printer)))
+                break;
+            else
+            {
+                name = PMPrinterGetName(printer);
+                CFRetain(name);
+                if (data.GetPrinterName() == wxCFStringRef(name).AsString())
+                    break;
+            }
+        }
+        if (index < count)
+            PMSessionSetCurrentPMPrinter(m_macPrintSession, printer);
+        CFRelease(printerList);
+    }
+    
     PMPrinter printer;
     PMSessionGetCurrentPrinter(m_macPrintSession, &printer);
 
@@ -156,31 +244,6 @@ bool wxOSXPrintData::TransferFrom( const wxPrintData &data )
         }
     }
 
-    CFArrayRef printerList;
-    CFIndex index, count;
-    CFStringRef name;
-
-    if (PMServerCreatePrinterList(kPMServerLocal, &printerList) == noErr)
-    {
-        count = CFArrayGetCount(printerList);
-        for (index = 0; index < count; index++)
-        {
-            printer = (PMPrinter)CFArrayGetValueAtIndex(printerList, index);
-            if ((data.GetPrinterName().empty()) && (PMPrinterIsDefault(printer)))
-                break;
-            else
-            {
-                name = PMPrinterGetName(printer);
-                CFRetain(name);
-                if (data.GetPrinterName() == wxCFStringRef(name).AsString())
-                    break;
-            }
-        }
-        if (index < count)
-            PMSessionSetCurrentPMPrinter(m_macPrintSession, printer);
-        CFRelease(printerList);
-    }
-
     PMSetCopies( m_macPrintSettings , data.GetNoCopies() , false ) ;
     PMSetCollate(m_macPrintSettings, data.GetCollate());
     if ( data.IsOrientationReversed() )
@@ -206,8 +269,6 @@ bool wxOSXPrintData::TransferFrom( const wxPrintData &data )
     }
     PMSetDuplex(  m_macPrintSettings, mode ) ;
 
-    // PMQualityMode not yet accessible via API
-
 
     if ( data.IsOrientationReversed() )
         PMSetOrientation(  m_macPageFormat , ( data.GetOrientation() == wxLANDSCAPE ) ?
@@ -216,15 +277,28 @@ bool wxOSXPrintData::TransferFrom( const wxPrintData &data )
         PMSetOrientation(  m_macPageFormat , ( data.GetOrientation() == wxLANDSCAPE ) ?
             kPMLandscape : kPMPortrait , false ) ;
 
-#ifndef __LP64__
-    // PMQualityMode not accessible via API
-    // TODO: use our quality property to determine optimal resolution
-    PMResolution res;
-    PMTag tag = kPMMaxSquareResolution;
-    PMPrinterGetPrinterResolution(printer, tag, &res);
-    PMSetResolution( m_macPageFormat, &res);
+    UInt32 resCount;
+    PMResolution *resolutions = GetSupportedResolutions(printer, &resCount);
+    if (resolutions)
+    {
+        wxPrintQuality quality = data.GetQuality();
+        if (quality >= 0)
+            quality = wxPRINT_QUALITY_HIGH;
+        
+        PMResolution res = resolutions[((quality - wxPRINT_QUALITY_DRAFT) * (resCount - 1)) / 3];
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
+        if ( PMPrinterSetOutputResolution != NULL )
+            PMPrinterSetOutputResolution(printer, m_macPrintSettings, &res);
+        else
 #endif
+        {
+#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5
+            PMSetResolution( m_macPageFormat, &res);
+#endif
+        }
 
+        free(resolutions);
+    }
     // after setting the new resolution the format has to be updated, otherwise the page rect remains
     // at the 'old' scaling
 
@@ -297,8 +371,42 @@ bool wxOSXPrintData::TransferTo( wxPrintData &data )
             data.SetDuplex(wxDUPLEX_SIMPLEX);
             break ;
     }
-    // PMQualityMode not yet accessible via API
 
+    /* assume high quality, will change below if we are able to */
+    data.SetQuality(wxPRINT_QUALITY_HIGH);
+    
+    PMResolution *resolutions;
+    UInt32 resCount;
+    resolutions = GetSupportedResolutions(printer, &resCount);
+    if (resolutions)
+    {
+        bool valid = false;
+        PMResolution res;
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
+        if ( PMPrinterGetOutputResolution != NULL )
+        {
+            if ( PMPrinterGetOutputResolution(printer, m_macPrintSettings, &res) == noErr )
+                valid = true;
+        }
+#endif
+#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5
+        if (PMPrinterGetPrinterResolution(printer, kPMCurrentValue, &res) == noErr)
+            valid = true;
+#endif
+        if ( valid )
+        {
+            UInt32 i;
+            for (i = 0; i < resCount; i++)
+            {
+                if ((resolutions[i].hRes == res.hRes) && (resolutions[i].vRes = res.vRes))
+                    break;
+            }
+            if (i < resCount)
+                data.SetQuality((((i + 1) * 3) / resCount) + wxPRINT_QUALITY_DRAFT);
+        }
+        free(resolutions);
+    }    
+    
     double height, width;
     PMPaperGetHeight(m_macPaper, &height);
     PMPaperGetWidth(m_macPaper, &width);
@@ -365,7 +473,7 @@ void wxOSXPrintData::TransferTo( wxPageSetupData* data )
 }
 
 void wxOSXPrintData::TransferTo( wxPrintDialogData* data )
-{
+{ 
 #if wxOSX_USE_COCOA
     UpdateToPMState();
 #endif
@@ -492,13 +600,32 @@ bool wxMacPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt)
 
     // on the mac we have always pixels as addressing mode with 72 dpi
     printout->SetPPIScreen(72, 72);
-#ifndef __LP64__
+
     PMResolution res;
+    PMPrinter printer;
     wxOSXPrintData* nativeData = (wxOSXPrintData*)
           (m_printDialogData.GetPrintData().GetNativeData());
-    PMGetResolution( (nativeData->GetPageFormat()), &res);
-    printout->SetPPIPrinter(int(res.hRes), int(res.vRes));
+
+    if (PMSessionGetCurrentPrinter(nativeData->GetPrintSession(), &printer) == noErr)
+    {
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 
+        if ( PMPrinterGetOutputResolution != NULL )
+        {
+            if (PMPrinterGetOutputResolution( printer, nativeData->GetPrintSettings(), &res) == -9589 /* kPMKeyNotFound */ )
+            {
+                res.hRes = res.vRes = 300;
+            }
+        }
+        else
 #endif
+        {
+#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 
+            PMPrinterGetPrinterResolution(printer, kPMCurrentValue, &res);
+#endif
+        }
+    }
+    printout->SetPPIPrinter(int(res.hRes), int(res.vRes));
+
     // Set printout parameters
     printout->SetDC(dc);