diff options
-rw-r--r-- | include/vcl/print.hxx | 3 | ||||
-rw-r--r-- | vcl/osx/salprn.cxx | 2 | ||||
-rw-r--r-- | vcl/source/gdi/print.cxx | 58 | ||||
-rw-r--r-- | vcl/source/gdi/print3.cxx | 14 | ||||
-rw-r--r-- | vcl/unx/generic/print/genprnpsp.cxx | 2 |
5 files changed, 65 insertions, 14 deletions
diff --git a/include/vcl/print.hxx b/include/vcl/print.hxx index cfb981bef073..631c38a5ab42 100644 --- a/include/vcl/print.hxx +++ b/include/vcl/print.hxx @@ -210,7 +210,7 @@ private: ImplGetQueueInfo( const OUString& rPrinterName, const OUString* pDriver ); VCL_DLLPRIVATE void ImplUpdatePageData(); VCL_DLLPRIVATE void ImplUpdateFontList(); - VCL_DLLPRIVATE void ImplFindPaperFormatForUserSize( JobSetup& ); + VCL_DLLPRIVATE void ImplFindPaperFormatForUserSize( JobSetup&, bool bMatchNearest ); VCL_DLLPRIVATE bool StartJob( const OUString& rJobName, std::shared_ptr<vcl::PrinterController> const & ); @@ -310,6 +310,7 @@ public: sal_uInt16 GetPaperBin() const; void SetPaper( Paper ePaper ); bool SetPaperSizeUser( const Size& rSize ); + bool SetPaperSizeUser( const Size& rSize, bool bMatchNearest ); Paper GetPaper() const; static OUString GetPaperName( Paper ePaper ); diff --git a/vcl/osx/salprn.cxx b/vcl/osx/salprn.cxx index 1cbb72e9baad..08f696345aa2 100644 --- a/vcl/osx/salprn.cxx +++ b/vcl/osx/salprn.cxx @@ -447,7 +447,7 @@ bool AquaSalInfoPrinter::StartJob( const OUString* i_pFileName, // platform independent paper matching algorithm VclPtr<Printer> pPrinter( i_rController.getPrinter() ); pPrinter->SetMapMode( MapMode( MapUnit::Map100thMM ) ); - pPrinter->SetPaperSizeUser( aCurSize ); + pPrinter->SetPaperSizeUser( aCurSize, true ); // create view NSView* pPrintView = [[AquaPrintView alloc] initWithController: &i_rController withInfoPrinter: this]; diff --git a/vcl/source/gdi/print.cxx b/vcl/source/gdi/print.cxx index 38a985807dfe..3e9ce5d64b9c 100644 --- a/vcl/source/gdi/print.cxx +++ b/vcl/source/gdi/print.cxx @@ -1220,13 +1220,16 @@ void Printer::SetPrinterSettingsPreferred( bool bPaperSizeFromSetup) } // Map user paper format to a available printer paper formats -void Printer::ImplFindPaperFormatForUserSize( JobSetup& aJobSetup ) +void Printer::ImplFindPaperFormatForUserSize( JobSetup& aJobSetup, bool bMatchNearest ) { ImplJobSetup& rData = aJobSetup.ImplGetData(); // The angle that a landscape page will be turned counterclockwise wrt to portrait. int nLandscapeAngle = mpInfoPrinter ? mpInfoPrinter->GetLandscapeAngle( &maJobSetup.ImplGetConstData() ) : 900; + int nPaperCount = GetPaperInfoCount(); + bool bFound = false; + PaperInfo aInfo(rData.GetPaperWidth(), rData.GetPaperHeight()); // Compare all paper formats and get the appropriate one @@ -1240,7 +1243,8 @@ void Printer::ImplFindPaperFormatForUserSize( JobSetup& aJobSetup ) ImplGetPaperFormat( rPaperInfo.getWidth(), rPaperInfo.getHeight() )); rData.SetOrientation( Orientation::Portrait ); - return; + bFound = true; + break; } } @@ -1265,10 +1269,49 @@ void Printer::ImplFindPaperFormatForUserSize( JobSetup& aJobSetup ) ImplGetPaperFormat( rPaperInfo.getWidth(), rPaperInfo.getHeight() )); rData.SetOrientation( Orientation::Landscape ); - return; + bFound = true; + break; } } } + + if( ! bFound && bMatchNearest ) + { + sal_Int64 nBestMatch = SAL_MAX_INT64; + int nBestIndex = 0; + Orientation eBestOrientation = Orientation::Portrait; + for( int i = 0; i < nPaperCount; i++ ) + { + const PaperInfo& rPaperInfo = GetPaperInfo( i ); + + // check portrait match + sal_Int64 nDX = rData.GetPaperWidth() - rPaperInfo.getWidth(); + sal_Int64 nDY = rData.GetPaperHeight() - rPaperInfo.getHeight(); + sal_Int64 nMatch = nDX*nDX + nDY*nDY; + if( nMatch < nBestMatch ) + { + nBestMatch = nMatch; + nBestIndex = i; + eBestOrientation = Orientation::Portrait; + } + + // check landscape match + nDX = rData.GetPaperWidth() - rPaperInfo.getHeight(); + nDY = rData.GetPaperHeight() - rPaperInfo.getWidth(); + nMatch = nDX*nDX + nDY*nDY; + if( nMatch < nBestMatch ) + { + nBestMatch = nMatch; + nBestIndex = i; + eBestOrientation = Orientation::Landscape; + } + } + const PaperInfo& rBestInfo = GetPaperInfo( nBestIndex ); + rData.SetPaperFormat( + ImplGetPaperFormat( rBestInfo.getWidth(), + rBestInfo.getHeight() )); + rData.SetOrientation(eBestOrientation); + } } void Printer::SetPaper( Paper ePaper ) @@ -1298,7 +1341,7 @@ void Printer::SetPaper( Paper ePaper ) ReleaseGraphics(); if ( ePaper == PAPER_USER ) - ImplFindPaperFormatForUserSize( aJobSetup ); + ImplFindPaperFormatForUserSize( aJobSetup, false ); if ( mpInfoPrinter->SetData( JobSetFlags::PAPERSIZE | JobSetFlags::ORIENTATION, &rData )) { ImplUpdateJobSetupPaper( aJobSetup ); @@ -1312,6 +1355,11 @@ void Printer::SetPaper( Paper ePaper ) bool Printer::SetPaperSizeUser( const Size& rSize ) { + return SetPaperSizeUser( rSize, false ); +} + +bool Printer::SetPaperSizeUser( const Size& rSize, bool bMatchNearest ) +{ if ( mbInPrintPage ) return false; @@ -1349,7 +1397,7 @@ bool Printer::SetPaperSizeUser( const Size& rSize ) } ReleaseGraphics(); - ImplFindPaperFormatForUserSize( aJobSetup ); + ImplFindPaperFormatForUserSize( aJobSetup, bMatchNearest ); // Changing the paper size can also change the orientation! if ( mpInfoPrinter->SetData( JobSetFlags::PAPERSIZE | JobSetFlags::ORIENTATION, &rData )) diff --git a/vcl/source/gdi/print3.cxx b/vcl/source/gdi/print3.cxx index dbcd3d5b581a..ab7cef6d6d75 100644 --- a/vcl/source/gdi/print3.cxx +++ b/vcl/source/gdi/print3.cxx @@ -203,6 +203,8 @@ public: return maMultiPage.aPaperSize; return i_rPageSize; } + bool isFixedPageSize() const + { return mbPapersizeFromSetup; } PrinterController::PageSize modifyJobSetup( const css::uno::Sequence< css::beans::PropertyValue >& i_rProps ); void resetPaperToLastConfigured(); }; @@ -854,7 +856,7 @@ void PrinterController::setupPrinter( weld::Window* i_pParent ) { //restore to whatever it was before we entered this method if (aPaperSize != aNewPaperSize) - xPrinter->SetPaperSizeUser(aPaperSize); + xPrinter->SetPaperSizeUser(aPaperSize, !mpImplData->isFixedPageSize()); } xPrinter->Pop(); } @@ -907,7 +909,7 @@ PrinterController::PageSize vcl::ImplPrinterControllerData::modifyJobSetup( cons Size aRealPaperSize( getRealPaperSize( aPageSize.aSize, true/*bNoNUP*/ ) ); if( aRealPaperSize != aCurSize ) - mxPrinter->SetPaperSizeUser( aRealPaperSize ); + mxPrinter->SetPaperSizeUser( aRealPaperSize, ! isFixedPageSize() ); } // paper bin set from properties in print dialog overrides @@ -936,7 +938,7 @@ void vcl::ImplPrinterControllerData::resetPaperToLastConfigured() mxPrinter->SetMapMode(MapMode(MapUnit::Map100thMM)); Size aCurSize(mxPrinter->GetPaperSize()); if (aCurSize != maDefaultPageSize) - mxPrinter->SetPaperSizeUser(maDefaultPageSize); + mxPrinter->SetPaperSizeUser(maDefaultPageSize, !isFixedPageSize()); mxPrinter->Pop(); } @@ -1083,7 +1085,7 @@ PrinterController::PageSize PrinterController::getFilteredPageFile( int i_nFilte } Size aPaperSize = mpImplData->getRealPaperSize( aPageSize.aSize, true ); mpImplData->mxPrinter->SetMapMode( MapMode( MapUnit::Map100thMM ) ); - mpImplData->mxPrinter->SetPaperSizeUser( aPaperSize ); + mpImplData->mxPrinter->SetPaperSizeUser( aPaperSize, ! mpImplData->isFixedPageSize() ); if( aPaperSize != aPageSize.aSize ) { // user overridden page size, center Metafile @@ -1193,7 +1195,7 @@ PrinterController::PageSize PrinterController::getFilteredPageFile( int i_nFilte // subsequent getPageFile calls have changed the paper, reset it to current value mpImplData->mxPrinter->SetMapMode( MapMode( MapUnit::Map100thMM ) ); - mpImplData->mxPrinter->SetPaperSizeUser( aPaperSize ); + mpImplData->mxPrinter->SetPaperSizeUser( aPaperSize, ! mpImplData->isFixedPageSize() ); return PrinterController::PageSize( aPaperSize, true ); } @@ -1289,7 +1291,7 @@ void PrinterController::printFilteredPage( int i_nPage ) // in N-Up printing set the correct page size mpImplData->mxPrinter->SetMapMode(MapMode(MapUnit::Map100thMM)); // aPageSize was filtered through mpImplData->getRealPaperSize already by getFilteredPageFile() - mpImplData->mxPrinter->SetPaperSizeUser( aPageSize.aSize ); + mpImplData->mxPrinter->SetPaperSizeUser( aPageSize.aSize, ! mpImplData->isFixedPageSize() ); if( mpImplData->mnFixedPaperBin != -1 && mpImplData->mxPrinter->GetPaperBin() != mpImplData->mnFixedPaperBin ) { diff --git a/vcl/unx/generic/print/genprnpsp.cxx b/vcl/unx/generic/print/genprnpsp.cxx index 350128ef3372..376da8fcf51f 100644 --- a/vcl/unx/generic/print/genprnpsp.cxx +++ b/vcl/unx/generic/print/genprnpsp.cxx @@ -1059,7 +1059,7 @@ bool PspSalPrinter::StartJob( const OUString* i_pFileName, const OUString& i_rJo else { xPrinter->SetMapMode( MapMode( MapUnit::Map100thMM ) ); - xPrinter->SetPaperSizeUser( aPageSize.aSize ); + xPrinter->SetPaperSizeUser( aPageSize.aSize, true ); PDFNewJobParameters aNewParm(xPrinter->GetPaperSize(), xPrinter->GetPaperBin()); // create PDF writer on demand |