diff options
-rw-r--r-- | desktop/source/lib/init.cxx | 1 | ||||
-rw-r--r-- | filter/source/svg/svgexport.cxx | 6 | ||||
-rw-r--r-- | filter/source/svg/svgfilter.cxx | 10 | ||||
-rw-r--r-- | filter/source/svg/svgfilter.hxx | 1 | ||||
-rw-r--r-- | filter/source/svg/svgwriter.cxx | 22 | ||||
-rw-r--r-- | filter/source/svg/svgwriter.hxx | 2 | ||||
-rw-r--r-- | sfx2/source/doc/objstor.cxx | 16 | ||||
-rw-r--r-- | sw/inc/cmdid.h | 1 | ||||
-rw-r--r-- | sw/inc/unoprnms.hxx | 1 | ||||
-rw-r--r-- | sw/source/core/unocore/unoframe.cxx | 16 | ||||
-rw-r--r-- | sw/source/core/unocore/unomap1.cxx | 1 |
11 files changed, 74 insertions, 3 deletions
diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx index f9b1d3e0ea96..45aa9ad4cbfb 100644 --- a/desktop/source/lib/init.cxx +++ b/desktop/source/lib/init.cxx @@ -3953,6 +3953,7 @@ static size_t doc_renderShapeSelection(LibreOfficeKitDocument* pThis, char** pOu } aMediaDescriptor["SelectionOnly"] <<= true; aMediaDescriptor["OutputStream"] <<= xOut; + aMediaDescriptor["IsPreview"] <<= true; // will down-scale graphics xStorable->storeToURL("private:stream", aMediaDescriptor.getAsConstPropertyValueList()); diff --git a/filter/source/svg/svgexport.cxx b/filter/source/svg/svgexport.cxx index ef0c1ea37a80..c21b041b1bbc 100644 --- a/filter/source/svg/svgexport.cxx +++ b/filter/source/svg/svgexport.cxx @@ -796,7 +796,9 @@ bool SVGFilter::implExportWriterTextGraphic( const Reference< view::XSelectionSu const Graphic aOriginalGraphic(xOriginalGraphic); uno::Reference<graphic::XGraphic> xTransformedGraphic; - xPropertySet->getPropertyValue("TransformedGraphic") >>= xTransformedGraphic; + xPropertySet->getPropertyValue( + mbIsPreview ? OUString("GraphicPreview") : OUString("TransformedGraphic")) + >>= xTransformedGraphic; if (!xTransformedGraphic.is()) return false; @@ -971,6 +973,8 @@ bool SVGFilter::implExportDocument() mpSVGWriter->SetEmbeddedBitmapRefs( &maBitmapActionMap ); implExportTiledBackground(); } + if( mbIsPreview ) + mpSVGWriter->SetPreviewMode(); // #i124608# export a given object selection, so no MasterPage export at all if (!mbExportShapeSelection) diff --git a/filter/source/svg/svgfilter.cxx b/filter/source/svg/svgfilter.cxx index 4c3f033d02eb..c6677bf0c9dc 100644 --- a/filter/source/svg/svgfilter.cxx +++ b/filter/source/svg/svgfilter.cxx @@ -77,6 +77,7 @@ SVGFilter::SVGFilter( const Reference< XComponentContext >& rxCtx ) : mnVisiblePage( -1 ), mpObjects( nullptr ), mbExportShapeSelection(false), + mbIsPreview(false), mbWriterFilter(false), mbCalcFilter(false), mbImpressFilter(false), @@ -108,6 +109,15 @@ sal_Bool SAL_CALL SVGFilter::filter( const Sequence< PropertyValue >& rDescripto for (const PropertyValue& rProp : rDescriptor) { + if (rProp.Name == "IsPreview") + { + rProp.Value >>= mbIsPreview; + break; + } + } + + for (const PropertyValue& rProp : rDescriptor) + { if (rProp.Name == "FilterName") { OUString sFilterName; diff --git a/filter/source/svg/svgfilter.hxx b/filter/source/svg/svgfilter.hxx index eb889e81662e..93e14ec41671 100644 --- a/filter/source/svg/svgfilter.hxx +++ b/filter/source/svg/svgfilter.hxx @@ -209,6 +209,7 @@ private: Sequence< PropertyValue > maFilterData; Reference< css::drawing::XDrawPage > mxDefaultPage; std::vector< Reference< css::drawing::XDrawPage > > mSelectedPages; + bool mbIsPreview; bool mbWriterFilter; bool mbCalcFilter; diff --git a/filter/source/svg/svgwriter.cxx b/filter/source/svg/svgwriter.cxx index 3d8183ebb2fd..f849315ce823 100644 --- a/filter/source/svg/svgwriter.cxx +++ b/filter/source/svg/svgwriter.cxx @@ -2942,7 +2942,27 @@ void SVGActionWriter::ImplWriteBmp( const BitmapEx& rBmpEx, } } - if( !(bCached || GraphicConverter::Export( aOStm, rBmpEx, ConvertDataFormat::PNG ) == ERRCODE_NONE) ) + const BitmapEx* pBitmap = &rBmpEx; + std::unique_ptr<BitmapEx> pNewBitmap; + + // for preview we generate downscaled images (1280x720 max) + if (mbIsPreview) + { + Size aSize = rBmpEx.GetSizePixel(); + double fX = static_cast<double>(aSize.getWidth()) / 1280; + double fY = static_cast<double>(aSize.getHeight()) / 720; + double fFactor = fX > fY ? fX : fY; + if (fFactor > 1.0) + { + aSize.setWidth(aSize.getWidth() / fFactor); + aSize.setHeight(aSize.getHeight() / fFactor); + pNewBitmap = std::make_unique<BitmapEx>(rBmpEx); + pNewBitmap->Scale(aSize); + pBitmap = pNewBitmap.get(); + } + } + + if( !(bCached || GraphicConverter::Export( aOStm, *pBitmap, ConvertDataFormat::PNG ) == ERRCODE_NONE) ) return; Point aPt; diff --git a/filter/source/svg/svgwriter.hxx b/filter/source/svg/svgwriter.hxx index fdfcd24d32b2..d48d68bdec72 100644 --- a/filter/source/svg/svgwriter.hxx +++ b/filter/source/svg/svgwriter.hxx @@ -318,6 +318,7 @@ private: bool mbClipAttrChanged; bool mbIsPlaceholderShape; const MetaBitmapActionMap* mpEmbeddedBitmapsMap; + bool mbIsPreview; tools::Long ImplMap( sal_Int32 nVal ) const; @@ -377,6 +378,7 @@ public: void SetEmbeddedBitmapRefs( const MetaBitmapActionMap* pEmbeddedBitmapsMap ); void StartMask(const Point& rDestPt, const Size& rDestSize, const Gradient& rGradient, sal_uInt32 nWriteFlags, OUString* pTextStyle = nullptr); + void SetPreviewMode(bool bState = true) { mbIsPreview = bState; } }; diff --git a/sfx2/source/doc/objstor.cxx b/sfx2/source/doc/objstor.cxx index d07d406ec271..c5ad72f500ae 100644 --- a/sfx2/source/doc/objstor.cxx +++ b/sfx2/source/doc/objstor.cxx @@ -2411,6 +2411,7 @@ bool SfxObjectShell::ExportTo( SfxMedium& rMedium ) bool bHasBaseURL = false; bool bHasFilterName = false; bool bIsRedactMode = false; + bool bIsPreview = false; sal_Int32 nEnd = aOldArgs.getLength(); for ( sal_Int32 i = 0; i < nEnd; i++ ) @@ -2428,6 +2429,13 @@ bool SfxObjectShell::ExportTo( SfxMedium& rMedium ) bHasFilterName = true; } + const css::uno::Sequence<css::beans::PropertyValue>& rMediumArgs = rMedium.GetArgs(); + for ( sal_Int32 i = 0; i < rMediumArgs.getLength(); i++ ) + { + if( rMediumArgs[i].Name == "IsPreview" ) + rMediumArgs[i].Value >>= bIsPreview; + } + // FIXME: Handle this inside TransformItems() if (pItems->GetItemState(SID_IS_REDACT_MODE) == SfxItemState::SET) bIsRedactMode = true; @@ -2473,6 +2481,14 @@ bool SfxObjectShell::ExportTo( SfxMedium& rMedium ) pArgs[nEnd-1].Value <<= bIsRedactMode; } + if (bIsPreview) + { + aArgs.realloc( ++nEnd ); + auto pArgs = aArgs.getArray(); + pArgs[nEnd-1].Name = "IsPreview"; + pArgs[nEnd-1].Value <<= bIsPreview; + } + return xFilter->filter( aArgs ); }catch(...) {} diff --git a/sw/inc/cmdid.h b/sw/inc/cmdid.h index 419fceb99c79..1e66072d3b37 100644 --- a/sw/inc/cmdid.h +++ b/sw/inc/cmdid.h @@ -633,6 +633,7 @@ #define FN_UNO_VISIBLE_AREA_HEIGHT (FN_EXTRA2 + 126) #define FN_UNO_TRANSFORMED_GRAPHIC (FN_EXTRA2 + 127) +#define FN_UNO_GRAPHIC_PREVIEW (FN_EXTRA2 + 128) // Area: Help // Region: Traveling & Selection diff --git a/sw/inc/unoprnms.hxx b/sw/inc/unoprnms.hxx index 1e16bc413d01..8e982a84c4ac 100644 --- a/sw/inc/unoprnms.hxx +++ b/sw/inc/unoprnms.hxx @@ -161,6 +161,7 @@ #define UNO_NAME_FILE_LINK "FileLink" #define UNO_NAME_GRAPHIC "Graphic" #define UNO_NAME_TRANSFORMED_GRAPHIC "TransformedGraphic" +#define UNO_NAME_GRAPHIC_PREVIEW "GraphicPreview" #define UNO_NAME_IS_PROTECTED "IsProtected" #define UNO_NAME_PARA_KEEP_TOGETHER "ParaKeepTogether" #define UNO_NAME_KEEP_TOGETHER "KeepTogether" diff --git a/sw/source/core/unocore/unoframe.cxx b/sw/source/core/unocore/unoframe.cxx index fff6c1c66b41..ad9638cd570f 100644 --- a/sw/source/core/unocore/unoframe.cxx +++ b/sw/source/core/unocore/unoframe.cxx @@ -2109,7 +2109,8 @@ uno::Any SwXFrame::getPropertyValue(const OUString& rPropertyName) aAny <<= pGrfNode->GetGrf().GetXGraphic(); } } - else if( FN_UNO_TRANSFORMED_GRAPHIC == pEntry->nWID ) + else if( FN_UNO_TRANSFORMED_GRAPHIC == pEntry->nWID + || FN_UNO_GRAPHIC_PREVIEW == pEntry->nWID ) { const SwNodeIndex* pIdx = pFormat->GetContent().GetContentIdx(); if(pIdx) @@ -2133,6 +2134,19 @@ uno::Any SwXFrame::getPropertyValue(const OUString& rPropertyName) awt::Size aFrameSize = getSize(); Size aSize100thmm(aFrameSize.Width, aFrameSize.Height); Size aSize = OutputDevice::LogicToLogic(aSize100thmm, MapMode(MapUnit::Map100thMM), aGraphicObj.GetPrefMapMode()); + + if (FN_UNO_GRAPHIC_PREVIEW == pEntry->nWID) + { + double fX = static_cast<double>(aSize.getWidth()) / 1280; + double fY = static_cast<double>(aSize.getHeight()) / 720; + double fFactor = fX > fY ? fX : fY; + if (fFactor > 1.0) + { + aSize.setWidth(aSize.getWidth() / fFactor); + aSize.setHeight(aSize.getHeight() / fFactor); + } + } + Graphic aGraphic = aGraphicObj.GetTransformedGraphic(aSize, aGraphicObj.GetPrefMapMode(), aGraphicAttr); aAny <<= aGraphic.GetXGraphic(); } diff --git a/sw/source/core/unocore/unomap1.cxx b/sw/source/core/unocore/unomap1.cxx index 6ad2af013402..543bee1363f9 100644 --- a/sw/source/core/unocore/unomap1.cxx +++ b/sw/source/core/unocore/unomap1.cxx @@ -818,6 +818,7 @@ const SfxItemPropertyMapEntry* SwUnoPropertyMapProvider::GetGraphicPropertyMap( { u"" UNO_NAME_GRAPHIC, FN_UNO_GRAPHIC, cppu::UnoType<css::graphic::XGraphic>::get(), 0, 0 }, { u"" UNO_NAME_GRAPHIC_URL, FN_UNO_GRAPHIC_URL, cppu::UnoType<css::uno::Any>::get(), 0, 0 }, { u"" UNO_NAME_TRANSFORMED_GRAPHIC, FN_UNO_TRANSFORMED_GRAPHIC, cppu::UnoType<css::graphic::XGraphic>::get(), 0, 0 }, + { u"" UNO_NAME_GRAPHIC_PREVIEW, FN_UNO_GRAPHIC_PREVIEW, cppu::UnoType<css::graphic::XGraphic>::get(), 0, 0 }, { u"" UNO_NAME_ACTUAL_SIZE, FN_UNO_ACTUAL_SIZE, cppu::UnoType<css::awt::Size>::get(), PropertyAttribute::READONLY, CONVERT_TWIPS}, { u"" UNO_NAME_CONTOUR_POLY_POLYGON, FN_PARAM_CONTOUR_PP, cppu::UnoType<css::drawing::PointSequenceSequence>::get(), PropertyAttribute::MAYBEVOID, 0 }, { u"" UNO_NAME_IS_PIXEL_CONTOUR, FN_UNO_IS_PIXEL_CONTOUR, cppu::UnoType<bool>::get(), PROPERTY_NONE, 0 }, |