sc/inc/docuno.hxx | 3 sc/source/ui/unoobj/docuno.cxx | 154 ++++++++++++++----- svtools/source/filter/DocumentToGraphicRenderer.cxx | 8 svtools/source/filter/GraphicExportOptionsDialog.cxx | 7 4 files changed, 130 insertions(+), 42 deletions(-)
New commits: commit 8c0c897c8cb92285e6461cc99ab0f2bbe15be65f Author: Eike Rathke <er...@redhat.com> Date: Tue Aug 29 11:15:57 2017 +0200 Export to PNG: init DPI with screen resolution, tdf#108317 This whole concept of "use a JPG dialog for PNG export" is nonsense anyway, but.. as long as there isn't anything better at least have sensible defaults. Change-Id: I0c074f7bb2989122aed039c739fd1813f371cbca diff --git a/svtools/source/filter/GraphicExportOptionsDialog.cxx b/svtools/source/filter/GraphicExportOptionsDialog.cxx index cb7928ad104e..cb7cb64c919e 100644 --- a/svtools/source/filter/GraphicExportOptionsDialog.cxx +++ b/svtools/source/filter/GraphicExportOptionsDialog.cxx @@ -18,6 +18,7 @@ */ #include <svtools/GraphicExportOptionsDialog.hxx> +#include <vcl/svapp.hxx> using namespace css::beans; using namespace css::lang; @@ -61,6 +62,12 @@ void GraphicExportOptionsDialog::initialize() { mCurrentPage = mRenderer.getCurrentPageWriter(); mSize100mm = mRenderer.getDocumentSizeIn100mm(mCurrentPage); + // Init DPI with screen resolution, taking width. This may lead to unusual + // DPI values but ensures a size in pixels that matches the actual screen + // content, which is vital for example for Calc with drawing layer and + // pixel images. + Size aSizePixels = Application::GetDefaultDevice()->LogicToPixel( mSize100mm, MapUnit::Map100thMM ); + mResolution = aSizePixels.Width() / getViewWidthInch(); } IMPL_LINK_NOARG( GraphicExportOptionsDialog, widthModifiedHandle, Edit&, void ) commit d34fa1fc643cc49253e7340b3de1c87a49875e8a Author: Eike Rathke <er...@redhat.com> Date: Tue Aug 29 11:09:34 2017 +0200 Export to PNG: export selected cell range only, not as page, tdf#108317 Change-Id: If662f4ed360c702e572fc5d7b473eb53b9cb14d2 diff --git a/sc/inc/docuno.hxx b/sc/inc/docuno.hxx index 00ff88999bd0..67ee07440884 100644 --- a/sc/inc/docuno.hxx +++ b/sc/inc/docuno.hxx @@ -106,7 +106,8 @@ private: bool FillRenderMarkData( const css::uno::Any& aSelection, const css::uno::Sequence< css::beans::PropertyValue >& rOptions, - ScMarkData& rMark, ScPrintSelectionStatus& rStatus, OUString& rPagesStr ) const; + ScMarkData& rMark, ScPrintSelectionStatus& rStatus, OUString& rPagesStr, + bool& rbRenderToGraphic ) const; css::uno::Reference<css::uno::XAggregation> const & GetFormatter(); void HandleCalculateEvents(); diff --git a/sc/source/ui/unoobj/docuno.cxx b/sc/source/ui/unoobj/docuno.cxx index 67659f7076e4..b7b55293edd9 100644 --- a/sc/source/ui/unoobj/docuno.cxx +++ b/sc/source/ui/unoobj/docuno.cxx @@ -1432,7 +1432,8 @@ static bool lcl_ParseTarget( const OUString& rTarget, ScRange& rTargetRange, too bool ScModelObj::FillRenderMarkData( const uno::Any& aSelection, const uno::Sequence< beans::PropertyValue >& rOptions, ScMarkData& rMark, - ScPrintSelectionStatus& rStatus, OUString& rPagesStr ) const + ScPrintSelectionStatus& rStatus, OUString& rPagesStr, + bool& rbRenderToGraphic ) const { OSL_ENSURE( !rMark.IsMarked() && !rMark.IsMultiMarked(), "FillRenderMarkData: MarkData must be empty" ); OSL_ENSURE( pDocShell, "FillRenderMarkData: DocShell must be set" ); @@ -1477,6 +1478,10 @@ bool ScModelObj::FillRenderMarkData( const uno::Any& aSelection, { rOptions[i].Value >>= xView; } + else if ( rOptions[i].Name == "RenderToGraphic" ) + { + rOptions[i].Value >>= rbRenderToGraphic; + } } // "Print Content" selection wins over "Selected Sheets" option @@ -1613,7 +1618,8 @@ sal_Int32 SAL_CALL ScModelObj::getRendererCount(const uno::Any& aSelection, ScMarkData aMark; ScPrintSelectionStatus aStatus; OUString aPagesStr; - if ( !FillRenderMarkData( aSelection, rOptions, aMark, aStatus, aPagesStr ) ) + bool bRenderToGraphic = false; + if ( !FillRenderMarkData( aSelection, rOptions, aMark, aStatus, aPagesStr, bRenderToGraphic ) ) return 0; // The same ScPrintFuncCache object in pPrintFuncCache is used as long as @@ -1650,6 +1656,11 @@ static sal_Int32 lcl_GetRendererNum( sal_Int32 nSelRenderer, const OUString& rPa return *aIter; // returns -1 if reached the end } +static bool lcl_renderSelectionToGraphic( bool bRenderToGraphic, const ScPrintSelectionStatus& rStatus ) +{ + return bRenderToGraphic && rStatus.GetMode() == SC_PRINTSEL_RANGE; +} + uno::Sequence<beans::PropertyValue> SAL_CALL ScModelObj::getRenderer( sal_Int32 nSelRenderer, const uno::Any& aSelection, const uno::Sequence<beans::PropertyValue>& rOptions ) { @@ -1665,7 +1676,8 @@ uno::Sequence<beans::PropertyValue> SAL_CALL ScModelObj::getRenderer( sal_Int32 OUString aPagesStr; // #i115266# if FillRenderMarkData fails, keep nTotalPages at 0, but still handle getRenderer(0) below long nTotalPages = 0; - if ( FillRenderMarkData( aSelection, rOptions, aMark, aStatus, aPagesStr ) ) + bool bRenderToGraphic = false; + if ( FillRenderMarkData( aSelection, rOptions, aMark, aStatus, aPagesStr, bRenderToGraphic ) ) { if ( !pPrintFuncCache || !pPrintFuncCache->IsSameSelection( aStatus ) ) { @@ -1681,10 +1693,26 @@ uno::Sequence<beans::PropertyValue> SAL_CALL ScModelObj::getRenderer( sal_Int32 { // getRenderer(0) is used to query the settings, so it must always return something - SCTAB const nCurTab = 0; //! use current sheet from view? - ScPrintFunc aDefaultFunc( pDocShell, pDocShell->GetPrinter(), nCurTab ); - Size aTwips = aDefaultFunc.GetPageSize(); - awt::Size aPageSize( TwipsToHMM( aTwips.Width() ), TwipsToHMM( aTwips.Height() ) ); + awt::Size aPageSize; + if (lcl_renderSelectionToGraphic( bRenderToGraphic, aStatus)) + { + assert( aMark.IsMarked()); + ScRange aRange; + aMark.GetMarkArea( aRange ); + tools::Rectangle aMMRect( pDocShell->GetDocument().GetMMRect( + aRange.aStart.Col(), aRange.aStart.Row(), + aRange.aEnd.Col(), aRange.aEnd.Row(), aRange.aStart.Tab())); + aPageSize.Width = aMMRect.GetWidth(); + aPageSize.Height = aMMRect.GetHeight(); + } + else + { + SCTAB const nCurTab = 0; //! use current sheet from view? + ScPrintFunc aDefaultFunc( pDocShell, pDocShell->GetPrinter(), nCurTab ); + Size aTwips = aDefaultFunc.GetPageSize(); + aPageSize.Width = TwipsToHMM( aTwips.Width()); + aPageSize.Height = TwipsToHMM( aTwips.Height()); + } uno::Sequence<beans::PropertyValue> aSequence( comphelper::InitPropertySequence({ { SC_UNONAME_PAGESIZE, uno::Any(aPageSize) } @@ -1712,24 +1740,41 @@ uno::Sequence<beans::PropertyValue> SAL_CALL ScModelObj::getRenderer( sal_Int32 aMark.GetMarkArea( aRange ); pSelRange = &aRange; } - ScPrintFunc aFunc( pDocShell, pDocShell->GetPrinter(), nTab, - pPrintFuncCache->GetFirstAttr(nTab), nTotalPages, pSelRange, &aStatus.GetOptions() ); - aFunc.SetRenderFlag( true ); - Range aPageRange( nRenderer+1, nRenderer+1 ); - MultiSelection aPage( aPageRange ); - aPage.SetTotalRange( Range(0,RANGE_MAX) ); - aPage.Select( aPageRange ); + awt::Size aPageSize; + bool bWasCellRange = false; + ScRange aCellRange; + if (lcl_renderSelectionToGraphic( bRenderToGraphic, aStatus)) + { + bWasCellRange = true; + aCellRange = aRange; + tools::Rectangle aMMRect( pDocShell->GetDocument().GetMMRect( + aRange.aStart.Col(), aRange.aStart.Row(), + aRange.aEnd.Col(), aRange.aEnd.Row(), aRange.aStart.Tab())); + aPageSize.Width = aMMRect.GetWidth(); + aPageSize.Height = aMMRect.GetHeight(); + } + else + { + ScPrintFunc aFunc( pDocShell, pDocShell->GetPrinter(), nTab, + pPrintFuncCache->GetFirstAttr(nTab), nTotalPages, pSelRange, &aStatus.GetOptions() ); + aFunc.SetRenderFlag( true ); - long nDisplayStart = pPrintFuncCache->GetDisplayStart( nTab ); - long nTabStart = pPrintFuncCache->GetTabStart( nTab ); + Range aPageRange( nRenderer+1, nRenderer+1 ); + MultiSelection aPage( aPageRange ); + aPage.SetTotalRange( Range(0,RANGE_MAX) ); + aPage.Select( aPageRange ); - (void)aFunc.DoPrint( aPage, nTabStart, nDisplayStart, false, nullptr ); + long nDisplayStart = pPrintFuncCache->GetDisplayStart( nTab ); + long nTabStart = pPrintFuncCache->GetTabStart( nTab ); - ScRange aCellRange; - bool bWasCellRange = aFunc.GetLastSourceRange( aCellRange ); - Size aTwips = aFunc.GetPageSize(); - awt::Size aPageSize( TwipsToHMM( aTwips.Width() ), TwipsToHMM( aTwips.Height() ) ); + (void)aFunc.DoPrint( aPage, nTabStart, nDisplayStart, false, nullptr ); + + bWasCellRange = aFunc.GetLastSourceRange( aCellRange ); + Size aTwips = aFunc.GetPageSize(); + aPageSize.Width = TwipsToHMM( aTwips.Width()); + aPageSize.Height = TwipsToHMM( aTwips.Height()); + } long nPropCount = bWasCellRange ? 3 : 2; uno::Sequence<beans::PropertyValue> aSequence(nPropCount); @@ -1769,7 +1814,8 @@ void SAL_CALL ScModelObj::render( sal_Int32 nSelRenderer, const uno::Any& aSelec ScMarkData aMark; ScPrintSelectionStatus aStatus; OUString aPagesStr; - if ( !FillRenderMarkData( aSelection, rOptions, aMark, aStatus, aPagesStr ) ) + bool bRenderToGraphic = false; + if ( !FillRenderMarkData( aSelection, rOptions, aMark, aStatus, aPagesStr, bRenderToGraphic ) ) throw lang::IllegalArgumentException(); if ( !pPrintFuncCache || !pPrintFuncCache->IsSameSelection( aStatus ) ) @@ -1786,9 +1832,38 @@ void SAL_CALL ScModelObj::render( sal_Int32 nSelRenderer, const uno::Any& aSelec if ( !pDev ) throw lang::IllegalArgumentException(); - SCTAB nTab = pPrintFuncCache->GetTabForPage( nRenderer ); ScDocument& rDoc = pDocShell->GetDocument(); + ScRange aRange; + const ScRange* pSelRange = nullptr; + if ( aMark.IsMarked() ) + { + aMark.GetMarkArea( aRange ); + pSelRange = &aRange; + } + + if (lcl_renderSelectionToGraphic( bRenderToGraphic, aStatus)) + { + // Similar to as in and when calling ScTransferObj::PaintToDev() + + Point aPoint; + tools::Rectangle aBound( aPoint, pDev->GetOutputSize()); + + ScViewData aViewData(nullptr,nullptr); + aViewData.InitData( &rDoc ); + + aViewData.SetTabNo( aRange.aStart.Tab() ); + aViewData.SetScreen( aRange.aStart.Col(), aRange.aStart.Row(), aRange.aEnd.Col(), aRange.aEnd.Row() ); + + const double nPrintFactor = 1.0; /* XXX: currently (2017-08-28) is not evaluated */ + // The bMetaFile argument maybe could be + // pDev->GetConnectMetaFile() != nullptr + // but for some yet unknow reason does not draw cell content if true. + ScPrintFunc::DrawToDev( &rDoc, pDev, nPrintFactor, aBound, &aViewData, false /*bMetaFile*/ ); + + return; + } + struct DrawViewKeeper { FmFormView* mpDrawView; @@ -1803,6 +1878,7 @@ void SAL_CALL ScModelObj::render( sal_Int32 nSelRenderer, const uno::Any& aSelec } } aDrawViewKeeper; + SCTAB nTab = pPrintFuncCache->GetTabForPage( nRenderer ); ScDrawLayer* pModel = rDoc.GetDrawLayer(); if( pModel ) @@ -1812,14 +1888,6 @@ void SAL_CALL ScModelObj::render( sal_Int32 nSelRenderer, const uno::Any& aSelec aDrawViewKeeper.mpDrawView->SetPrintPreview(); } - ScRange aRange; - const ScRange* pSelRange = nullptr; - if ( aMark.IsMarked() ) - { - aMark.GetMarkArea( aRange ); - pSelRange = &aRange; - } - // to increase performance, ScPrintState might be used here for subsequent // pages of the same sheet diff --git a/svtools/source/filter/DocumentToGraphicRenderer.cxx b/svtools/source/filter/DocumentToGraphicRenderer.cxx index 9c23168b209a..6c95747ef09d 100644 --- a/svtools/source/filter/DocumentToGraphicRenderer.cxx +++ b/svtools/source/filter/DocumentToGraphicRenderer.cxx @@ -89,13 +89,15 @@ Size DocumentToGraphicRenderer::getDocumentSizeIn100mm(sal_Int32 aCurrentPage) PropertyValues renderProperties; - renderProperties.realloc( 3 ); + renderProperties.realloc( 4 ); renderProperties[0].Name = "IsPrinter"; renderProperties[0].Value <<= true; renderProperties[1].Name = "RenderDevice"; renderProperties[1].Value <<= xDevice; renderProperties[2].Name = "View"; renderProperties[2].Value <<= mxController; + renderProperties[3].Name = "RenderToGraphic"; + renderProperties[3].Value <<= true; awt::Size aSize; @@ -133,13 +135,15 @@ Graphic DocumentToGraphicRenderer::renderToGraphic( double fScaleY = aTargetSizePixel.Height() / (double) aDocumentSizePixel.Height(); PropertyValues renderProps; - renderProps.realloc( 3 ); + renderProps.realloc( 4 ); renderProps[0].Name = "IsPrinter"; renderProps[0].Value <<= true; renderProps[1].Name = "RenderDevice"; renderProps[1].Value <<= xDevice; renderProps[2].Name = "View"; renderProps[2].Value <<= mxController; + renderProps[3].Name = "RenderToGraphic"; + renderProps[3].Value <<= true; GDIMetaFile aMtf; commit 408b260c4f2873439473d8520352c1b3acaa157a Author: Eike Rathke <er...@redhat.com> Date: Mon Aug 28 15:54:41 2017 +0200 Add keeper for FmFormView* pDrawView So later we can bail out at any point without having to manually keep track of it. Change-Id: I4414456b870d4a82b4baf8209bdabcc5a8b63c35 diff --git a/sc/source/ui/unoobj/docuno.cxx b/sc/source/ui/unoobj/docuno.cxx index c532ed6b3fda..67659f7076e4 100644 --- a/sc/source/ui/unoobj/docuno.cxx +++ b/sc/source/ui/unoobj/docuno.cxx @@ -1789,15 +1789,27 @@ void SAL_CALL ScModelObj::render( sal_Int32 nSelRenderer, const uno::Any& aSelec SCTAB nTab = pPrintFuncCache->GetTabForPage( nRenderer ); ScDocument& rDoc = pDocShell->GetDocument(); - FmFormView* pDrawView = nullptr; + struct DrawViewKeeper + { + FmFormView* mpDrawView; + DrawViewKeeper() : mpDrawView(nullptr) {} + ~DrawViewKeeper() + { + if (mpDrawView) + { + mpDrawView->HideSdrPage(); + delete mpDrawView; + } + } + } aDrawViewKeeper; ScDrawLayer* pModel = rDoc.GetDrawLayer(); if( pModel ) { - pDrawView = new FmFormView( pModel, pDev ); - pDrawView->ShowSdrPage(pDrawView->GetModel()->GetPage(nTab)); - pDrawView->SetPrintPreview(); + aDrawViewKeeper.mpDrawView = new FmFormView( pModel, pDev ); + aDrawViewKeeper.mpDrawView->ShowSdrPage(aDrawViewKeeper.mpDrawView->GetModel()->GetPage(nTab)); + aDrawViewKeeper.mpDrawView->SetPrintPreview(); } ScRange aRange; @@ -1812,7 +1824,7 @@ void SAL_CALL ScModelObj::render( sal_Int32 nSelRenderer, const uno::Any& aSelec // pages of the same sheet ScPrintFunc aFunc( pDev, pDocShell, nTab, pPrintFuncCache->GetFirstAttr(nTab), nTotalPages, pSelRange, &aStatus.GetOptions() ); - aFunc.SetDrawView( pDrawView ); + aFunc.SetDrawView( aDrawViewKeeper.mpDrawView ); aFunc.SetRenderFlag( true ); if( aStatus.GetMode() == SC_PRINTSEL_RANGE_EXCLUSIVELY_OLE_AND_DRAW_OBJECTS ) aFunc.SetExclusivelyDrawOleAndDrawObjects(); @@ -1945,10 +1957,6 @@ void SAL_CALL ScModelObj::render( sal_Int32 nSelRenderer, const uno::Any& aSelec } rBookmarks.clear(); } - - if ( pDrawView ) - pDrawView->HideSdrPage(); - delete pDrawView; } // XLinkTargetSupplier _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits