summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/vcl/print.hxx3
-rw-r--r--vcl/osx/salprn.cxx2
-rw-r--r--vcl/source/gdi/print.cxx58
-rw-r--r--vcl/source/gdi/print3.cxx14
-rw-r--r--vcl/unx/generic/print/genprnpsp.cxx2
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