Kaydet (Commit) b149201a authored tarafından Eike Rathke's avatar Eike Rathke

Export to PNG: use proper dialog and filter options, tdf#108317

... and not the crude JPG ones.

The com.sun.star.svtools.SvFilterOptionsDialog service has all we need,
so teach it to cope with non-Graphics source documents and let
ExportDialog handle that as well, just the actual rendering needs to go
via GraphicExportFilter (and effectively DocumentToGraphicRenderer), so
don't let that overwrite the properties set by the filter dialog.
Switching to the dialog then is just a matter of changing the
UIComponent in filter/source/config/fragments/filters/calc_png_Export

The same mechanism probably could be used by Writer as well by adjusting
filter/source/config/fragments/filters/writer_png_Export.xcu and maybe
filter/source/config/fragments/filters/writer_jpg_Export.xcu
in which case the GraphicExportOptionsDialog likely would be moot
then.

Also, it looks like a
filter/source/config/fragments/filters/calc_jpg_Export.xcu
(which doesn't exist yet) could be possible using the same mechanism.

Change-Id: I1fb9b33a6490dc39d7591b2b5913be182bb820e5
Reviewed-on: https://gerrit.libreoffice.org/42421Reviewed-by: 's avatarEike Rathke <erack@redhat.com>
Tested-by: 's avatarEike Rathke <erack@redhat.com>
üst 7654183a
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
--> -->
<node oor:name="calc_png_Export" oor:op="replace"> <node oor:name="calc_png_Export" oor:op="replace">
<prop oor:name="Flags"><value>EXPORT ALIEN 3RDPARTYFILTER SUPPORTSSELECTION</value></prop> <prop oor:name="Flags"><value>EXPORT ALIEN 3RDPARTYFILTER SUPPORTSSELECTION</value></prop>
<prop oor:name="UIComponent"><value>com.sun.star.comp.GraphicExportDialog</value></prop> <prop oor:name="UIComponent"><value>com.sun.star.svtools.SvFilterOptionsDialog</value></prop>
<prop oor:name="FilterService"><value>com.sun.star.comp.GraphicExportFilter</value></prop> <prop oor:name="FilterService"><value>com.sun.star.comp.GraphicExportFilter</value></prop>
<prop oor:name="UserData"><value></value></prop> <prop oor:name="UserData"><value></value></prop>
<prop oor:name="UIName"> <prop oor:name="UIName">
......
...@@ -73,6 +73,22 @@ void GraphicExportFilter::gatherProperties( const Sequence<PropertyValue>& rProp ...@@ -73,6 +73,22 @@ void GraphicExportFilter::gatherProperties( const Sequence<PropertyValue>& rProp
{ {
mFilterDataSequence[i].Value >>= mTargetHeight; mFilterDataSequence[i].Value >>= mTargetHeight;
} }
else if ( mFilterDataSequence[i].Name == "Compression" )
{
maCompression = mFilterDataSequence[i].Value;
}
else if ( mFilterDataSequence[i].Name == "Interlaced" )
{
maInterlaced = mFilterDataSequence[i].Value;
}
else if ( mFilterDataSequence[i].Name == "Translucent" )
{
maTranslucent = mFilterDataSequence[i].Value;
}
else if ( mFilterDataSequence[i].Name == "Quality" )
{
maQuality = mFilterDataSequence[i].Value;
}
} }
if ( !aInternalFilterName.isEmpty() ) if ( !aInternalFilterName.isEmpty() )
...@@ -111,13 +127,46 @@ sal_Bool SAL_CALL GraphicExportFilter::filter( const Sequence<PropertyValue>& rD ...@@ -111,13 +127,46 @@ sal_Bool SAL_CALL GraphicExportFilter::filter( const Sequence<PropertyValue>& rD
GraphicFilter& rFilter = GraphicFilter::GetGraphicFilter(); GraphicFilter& rFilter = GraphicFilter::GetGraphicFilter();
Sequence< PropertyValue > aFilterData( 3 ); Sequence< PropertyValue > aFilterData( mFilterDataSequence );
aFilterData[ 0 ].Name = "Interlaced"; sal_Int32 nAdd = 0;
aFilterData[ 0 ].Value <<= (sal_Int32) 0; if (!maCompression.hasValue())
aFilterData[ 1 ].Name = "Compression"; ++nAdd;
aFilterData[ 1 ].Value <<= (sal_Int32) 9; if (!maInterlaced.hasValue())
aFilterData[ 2 ].Name = "Quality"; ++nAdd;
aFilterData[ 2 ].Value <<= (sal_Int32) 99; if (!maTranslucent.hasValue())
++nAdd;
if (!maQuality.hasValue())
++nAdd;
if (nAdd)
{
sal_Int32 nLen = aFilterData.getLength();
aFilterData.realloc( nLen + nAdd);
if (!maCompression.hasValue())
{ // PNG,JPG
aFilterData[ nLen ].Name = "Compression";
aFilterData[ nLen ].Value <<= (sal_Int32) 9;
++nLen;
}
if (!maInterlaced.hasValue())
{ // PNG,JPG
aFilterData[ nLen ].Name = "Interlaced";
aFilterData[ nLen ].Value <<= (sal_Int32) 0;
++nLen;
}
if (!maTranslucent.hasValue())
{ // PNG
aFilterData[ nLen ].Name = "Translucent";
aFilterData[ nLen ].Value <<= (sal_Int32) 0;
++nLen;
}
if (!maQuality.hasValue())
{ // JPG
aFilterData[ nLen ].Name = "Quality";
aFilterData[ nLen ].Value <<= (sal_Int32) 99;
++nLen;
}
assert( nLen == aFilterData.getLength());
}
sal_uInt16 nFilterFormat = rFilter.GetExportFormatNumberForShortName( mFilterExtension ); sal_uInt16 nFilterFormat = rFilter.GetExportFormatNumberForShortName( mFilterExtension );
......
...@@ -50,6 +50,11 @@ class GraphicExportFilter : ...@@ -50,6 +50,11 @@ class GraphicExportFilter :
sal_Int32 mTargetHeight; sal_Int32 mTargetHeight;
bool mbSelectionOnly; bool mbSelectionOnly;
css::uno::Any maCompression;
css::uno::Any maInterlaced;
css::uno::Any maTranslucent;
css::uno::Any maQuality;
public: public:
explicit GraphicExportFilter( const Reference<XComponentContext>& rxContext ); explicit GraphicExportFilter( const Reference<XComponentContext>& rxContext );
virtual ~GraphicExportFilter() override; virtual ~GraphicExportFilter() override;
......
...@@ -72,7 +72,8 @@ class SvFilterOptionsDialog : public cppu::WeakImplHelper ...@@ -72,7 +72,8 @@ class SvFilterOptionsDialog : public cppu::WeakImplHelper
OUString maDialogTitle; OUString maDialogTitle;
FieldUnit meFieldUnit; FieldUnit meFieldUnit;
bool mbExportSelection; bool mbExportSelection;
bool mbGraphicsSource;
public: public:
...@@ -106,7 +107,8 @@ public: ...@@ -106,7 +107,8 @@ public:
SvFilterOptionsDialog::SvFilterOptionsDialog( const uno::Reference< uno::XComponentContext >& rxContext ) : SvFilterOptionsDialog::SvFilterOptionsDialog( const uno::Reference< uno::XComponentContext >& rxContext ) :
mxContext ( rxContext ), mxContext ( rxContext ),
meFieldUnit ( FUNIT_CM ), meFieldUnit ( FUNIT_CM ),
mbExportSelection ( false ) mbExportSelection ( false ),
mbGraphicsSource ( true )
{ {
} }
...@@ -198,8 +200,9 @@ sal_Int16 SvFilterOptionsDialog::execute() ...@@ -198,8 +200,9 @@ sal_Int16 SvFilterOptionsDialog::execute()
OUString aStr; OUString aStr;
maMediaDescriptor[ j ].Value >>= aStr; maMediaDescriptor[ j ].Value >>= aStr;
aInternalFilterName = aStr; aInternalFilterName = aStr;
aInternalFilterName = aInternalFilterName.replaceAll( "draw_", "" ); aInternalFilterName = aInternalFilterName.replaceFirst( "draw_", "" );
aInternalFilterName = aInternalFilterName.replaceAll( "impress_", "" ); aInternalFilterName = aInternalFilterName.replaceFirst( "impress_", "" );
aInternalFilterName = aInternalFilterName.replaceFirst( "calc_", "" );
break; break;
} }
else if ( rName == "Graphic" ) else if ( rName == "Graphic" )
...@@ -223,7 +226,8 @@ sal_Int16 SvFilterOptionsDialog::execute() ...@@ -223,7 +226,8 @@ sal_Int16 SvFilterOptionsDialog::execute()
aFltCallDlgPara.aFilterData = maFilterDataSequence; aFltCallDlgPara.aFilterData = maFilterDataSequence;
aFltCallDlgPara.aFilterExt = aGraphicFilter.GetExportFormatShortName( nFormat ); aFltCallDlgPara.aFilterExt = aGraphicFilter.GetExportFormatShortName( nFormat );
bool bIsPixelFormat( aGraphicFilter.IsExportPixelFormat( nFormat ) ); bool bIsPixelFormat( aGraphicFilter.IsExportPixelFormat( nFormat ) );
if ( ScopedVclPtrInstance<ExportDialog>( aFltCallDlgPara, mxContext, mxSourceDocument, mbExportSelection, bIsPixelFormat, xGraphic )->Execute() == RET_OK ) if ( ScopedVclPtrInstance<ExportDialog>( aFltCallDlgPara, mxContext, mxSourceDocument, mbExportSelection,
bIsPixelFormat, mbGraphicsSource, xGraphic )->Execute() == RET_OK )
nRet = ui::dialogs::ExecutableDialogResults::OK; nRet = ui::dialogs::ExecutableDialogResults::OK;
// taking the out parameter from the dialog // taking the out parameter from the dialog
...@@ -238,6 +242,8 @@ void SvFilterOptionsDialog::setSourceDocument( const uno::Reference< lang::XComp ...@@ -238,6 +242,8 @@ void SvFilterOptionsDialog::setSourceDocument( const uno::Reference< lang::XComp
{ {
mxSourceDocument = xDoc; mxSourceDocument = xDoc;
mbGraphicsSource = true; // default Draw and Impress like it was before
// try to set the corresponding metric unit // try to set the corresponding metric unit
OUString aConfigPath; OUString aConfigPath;
uno::Reference< lang::XServiceInfo > xServiceInfo uno::Reference< lang::XServiceInfo > xServiceInfo
...@@ -248,6 +254,12 @@ void SvFilterOptionsDialog::setSourceDocument( const uno::Reference< lang::XComp ...@@ -248,6 +254,12 @@ void SvFilterOptionsDialog::setSourceDocument( const uno::Reference< lang::XComp
aConfigPath = "Office.Impress/Layout/Other/MeasureUnit"; aConfigPath = "Office.Impress/Layout/Other/MeasureUnit";
else if ( xServiceInfo->supportsService("com.sun.star.drawing.DrawingDocument") ) else if ( xServiceInfo->supportsService("com.sun.star.drawing.DrawingDocument") )
aConfigPath = "Office.Draw/Layout/Other/MeasureUnit"; aConfigPath = "Office.Draw/Layout/Other/MeasureUnit";
else
{
mbGraphicsSource = false;
if ( xServiceInfo->supportsService("com.sun.star.sheet.SpreadsheetDocument") )
aConfigPath = "Office.Calc/Layout/Other/MeasureUnit";
}
if ( !aConfigPath.isEmpty() ) if ( !aConfigPath.isEmpty() )
{ {
FilterConfigItem aConfigItem( aConfigPath ); FilterConfigItem aConfigItem( aConfigPath );
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include <vcl/FilterConfigItem.hxx> #include <vcl/FilterConfigItem.hxx>
#include <svtools/strings.hrc> #include <svtools/strings.hrc>
#include <svtools/svtresid.hxx> #include <svtools/svtresid.hxx>
#include <svtools/DocumentToGraphicRenderer.hxx>
#include <com/sun/star/awt/Size.hpp> #include <com/sun/star/awt/Size.hpp>
#include <com/sun/star/drawing/GraphicExportFilter.hpp> #include <com/sun/star/drawing/GraphicExportFilter.hpp>
#include <com/sun/star/drawing/XDrawView.hpp> #include <com/sun/star/drawing/XDrawView.hpp>
...@@ -316,7 +317,7 @@ awt::Size ExportDialog::GetOriginalSize() ...@@ -316,7 +317,7 @@ awt::Size ExportDialog::GetOriginalSize()
aShapesRange = basegfx::B2DRange( 0, 0, nWidth, nHeight ); aShapesRange = basegfx::B2DRange( 0, 0, nWidth, nHeight );
} }
} }
else else if (mxShapes.is() || mxShape.is())
{ {
uno::Reference< graphic::XPrimitiveFactory2D > xPrimitiveFactory = graphic::PrimitiveFactory2D::create( mxContext ); uno::Reference< graphic::XPrimitiveFactory2D > xPrimitiveFactory = graphic::PrimitiveFactory2D::create( mxContext );
...@@ -347,6 +348,13 @@ awt::Size ExportDialog::GetOriginalSize() ...@@ -347,6 +348,13 @@ awt::Size ExportDialog::GetOriginalSize()
} }
} }
} }
else if (!mbGraphicsSource)
{
DocumentToGraphicRenderer aRenderer( mxSourceDocument, mbExportSelection);
const sal_Int32 nCurrentPage = aRenderer.getCurrentPageWriter();
const Size aSize = aRenderer.getDocumentSizeIn100mm( nCurrentPage);
return awt::Size( aSize.Width(), aSize.Height());
}
return awt::Size( static_cast<sal_Int32>(aShapesRange.getWidth()), static_cast<sal_Int32>(aShapesRange.getHeight()) ); return awt::Size( static_cast<sal_Int32>(aShapesRange.getWidth()), static_cast<sal_Int32>(aShapesRange.getHeight()) );
} }
...@@ -369,11 +377,13 @@ void ExportDialog::GetGraphicSource() ...@@ -369,11 +377,13 @@ void ExportDialog::GetGraphicSource()
if ( xSelectionSupplier.is() ) if ( xSelectionSupplier.is() )
{ {
uno::Any aAny( xSelectionSupplier->getSelection() ); uno::Any aAny( xSelectionSupplier->getSelection() );
if ( ! ( aAny >>= mxShapes ) ) if ( aAny >>= mxShapes )
aAny >>= mxShape; mbGraphicsSource = true;
else if ( aAny >>= mxShape )
mbGraphicsSource = true;
} }
} }
if ( !mxShape.is() && !mxShapes.is() ) if ( !mxShape.is() && !mxShapes.is() && mbGraphicsSource )
{ {
uno::Reference< drawing::XDrawView > xDrawView( xController, uno::UNO_QUERY ); uno::Reference< drawing::XDrawView > xDrawView( xController, uno::UNO_QUERY );
if ( xDrawView.is() ) if ( xDrawView.is() )
...@@ -385,6 +395,9 @@ void ExportDialog::GetGraphicSource() ...@@ -385,6 +395,9 @@ void ExportDialog::GetGraphicSource()
} }
} }
} }
// For !mbGraphicsSource the mxSourceDocument is used, from
// which XRenderable can query XController and
// XSelectionSupplier the same.
} }
} }
} }
...@@ -417,9 +430,26 @@ void ExportDialog::GetGraphicStream() ...@@ -417,9 +430,26 @@ void ExportDialog::GetGraphicStream()
mpTempStream = new SvMemoryStream(); mpTempStream = new SvMemoryStream();
maBitmap = Bitmap(); maBitmap = Bitmap();
if ( mxGraphic.is() ) uno::Reference< graphic::XGraphic > xGraphic;
if (!mbGraphicsSource && !mxGraphic.is())
{
// Create a Graphic to be used below.
DocumentToGraphicRenderer aRenderer( mxSourceDocument, mbExportSelection);
const sal_Int32 nCurrentPage = aRenderer.getCurrentPageWriter();
const Size aDocumentSizePixel = aRenderer.getDocumentSizeInPixels( nCurrentPage);
const Size aTargetSizePixel( mbIsPixelFormat ?
Size( maSize.Width, maSize.Height) :
aDocumentSizePixel );
Graphic aGraphic( aRenderer.renderToGraphic( nCurrentPage,
aDocumentSizePixel, aTargetSizePixel, COL_WHITE));
xGraphic = aGraphic.GetXGraphic();
}
if ( mxGraphic.is() || xGraphic.is() )
{ {
Graphic aGraphic( mxGraphic ); Graphic aGraphic( mxGraphic.is() ? mxGraphic : xGraphic );
if ( aGraphic.GetType() == GraphicType::Bitmap ) if ( aGraphic.GetType() == GraphicType::Bitmap )
{ {
...@@ -554,7 +584,7 @@ bool ExportDialog::IsTempExportAvailable() const ...@@ -554,7 +584,7 @@ bool ExportDialog::IsTempExportAvailable() const
ExportDialog::ExportDialog(FltCallDialogParameter& rPara, ExportDialog::ExportDialog(FltCallDialogParameter& rPara,
const css::uno::Reference< css::uno::XComponentContext >& rxContext, const css::uno::Reference< css::uno::XComponentContext >& rxContext,
const css::uno::Reference< css::lang::XComponent >& rxSourceDocument, const css::uno::Reference< css::lang::XComponent >& rxSourceDocument,
bool bExportSelection, bool bIsPixelFormat, bool bExportSelection, bool bIsPixelFormat, bool bGraphicsSource,
const css::uno::Reference< css::graphic::XGraphic >& rxGraphic) const css::uno::Reference< css::graphic::XGraphic >& rxGraphic)
: ModalDialog(rPara.pWindow, "GraphicExportDialog", "svt/ui/graphicexport.ui") : ModalDialog(rPara.pWindow, "GraphicExportDialog", "svt/ui/graphicexport.ui")
, mrFltCallPara(rPara) , mrFltCallPara(rPara)
...@@ -580,6 +610,7 @@ ExportDialog::ExportDialog(FltCallDialogParameter& rPara, ...@@ -580,6 +610,7 @@ ExportDialog::ExportDialog(FltCallDialogParameter& rPara,
, maOriginalSize(awt::Size(0, 0)) , maOriginalSize(awt::Size(0, 0))
, mbIsPixelFormat(bIsPixelFormat) , mbIsPixelFormat(bIsPixelFormat)
, mbExportSelection(bExportSelection) , mbExportSelection(bExportSelection)
, mbGraphicsSource(bGraphicsSource)
{ {
get(mpMfSizeX, "widthmf-nospin"); get(mpMfSizeX, "widthmf-nospin");
get(mpMfSizeY, "heightmf-nospin"); get(mpMfSizeY, "heightmf-nospin");
......
...@@ -126,6 +126,7 @@ private: ...@@ -126,6 +126,7 @@ private:
bool mbIsPixelFormat; bool mbIsPixelFormat;
bool mbExportSelection; bool mbExportSelection;
bool mbGraphicsSource; // whether source document is graphics (Draw, Impress) or not (Calc, Writer)
sal_Int32 mnInitialResolutionUnit; sal_Int32 mnInitialResolutionUnit;
...@@ -173,7 +174,7 @@ public: ...@@ -173,7 +174,7 @@ public:
ExportDialog( FltCallDialogParameter& rPara, ExportDialog( FltCallDialogParameter& rPara,
const css::uno::Reference< css::uno::XComponentContext >& rxContext, const css::uno::Reference< css::uno::XComponentContext >& rxContext,
const css::uno::Reference< css::lang::XComponent >& rxSourceDocument, const css::uno::Reference< css::lang::XComponent >& rxSourceDocument,
bool bExportSelection, bool bIsExportVectorFormat, bool bExportSelection, bool bIsExportVectorFormat, bool bGraphicsSource,
const css::uno::Reference< css::graphic::XGraphic >& rxGraphic = nullptr); const css::uno::Reference< css::graphic::XGraphic >& rxGraphic = nullptr);
virtual ~ExportDialog() override; virtual ~ExportDialog() override;
virtual void dispose() override; virtual void dispose() override;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment