30 #include <com/sun/star/awt/XBitmap.hpp>
31 #include <com/sun/star/graphic/XGraphicProvider2.hpp>
32 #include <com/sun/star/io/XStream.hpp>
33 #include <com/sun/star/lang/XServiceInfo.hpp>
34 #include <com/sun/star/text/GraphicCrop.hpp>
35 #include <com/sun/star/uno/XComponentContext.hpp>
44 #include <rtl/ref.hxx>
55 class GraphicProvider :
public ::cppu::WeakImplHelper< css::graphic::XGraphicProvider2,
56 css::lang::XServiceInfo >
70 virtual css::uno::Sequence< css::uno::Type > SAL_CALL getTypes( )
override;
71 virtual css::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId( )
override;
74 virtual css::uno::Reference< css::beans::XPropertySet > SAL_CALL queryGraphicDescriptor(
const css::uno::Sequence< css::beans::PropertyValue >& MediaProperties )
override;
75 virtual css::uno::Reference< css::graphic::XGraphic > SAL_CALL queryGraphic(
const css::uno::Sequence< css::beans::PropertyValue >& MediaProperties )
override;
76 virtual void SAL_CALL storeGraphic(
const css::uno::Reference< css::graphic::XGraphic >&
Graphic,
const css::uno::Sequence< css::beans::PropertyValue >& MediaProperties )
override;
79 uno::Sequence< uno::Reference<graphic::XGraphic> > SAL_CALL queryGraphics(
const uno::Sequence< uno::Sequence<beans::PropertyValue> >& MediaPropertiesSeq )
override;
83 static css::uno::Reference< css::graphic::XGraphic > implLoadMemory(
const OUString& rResourceURL );
84 static css::uno::Reference< css::graphic::XGraphic > implLoadRepositoryImage(
const OUString& rResourceURL );
85 static css::uno::Reference< css::graphic::XGraphic > implLoadBitmap(
const css::uno::Reference< css::awt::XBitmap >& rBitmap );
86 static css::uno::Reference< css::graphic::XGraphic > implLoadStandardImage(
const OUString& rResourceURL );
89 GraphicProvider::GraphicProvider()
93 OUString SAL_CALL GraphicProvider::getImplementationName()
95 return "com.sun.star.comp.graphic.GraphicProvider";
98 sal_Bool SAL_CALL GraphicProvider::supportsService(
const OUString& ServiceName )
103 uno::Sequence< OUString > SAL_CALL GraphicProvider::getSupportedServiceNames()
105 return {
"com.sun.star.graphic.GraphicProvider" };
108 uno::Sequence< uno::Type > SAL_CALL GraphicProvider::getTypes()
110 static const uno::Sequence< uno::Type >
aTypes {
118 uno::Sequence< sal_Int8 > SAL_CALL GraphicProvider::getImplementationId()
120 return css::uno::Sequence<sal_Int8>();
123 uno::Reference< ::graphic::XGraphic > GraphicProvider::implLoadMemory(
const OUString& rResourceURL )
125 uno::Reference< ::graphic::XGraphic > xRet;
128 if( rResourceURL.getToken( 0,
'/', nIndex ) ==
"private:memorygraphic" )
130 sal_Int64 nGraphicAddress = rResourceURL.getToken( 0,
'/', nIndex ).toInt64();
132 if( nGraphicAddress )
136 pUnoGraphic->init( *reinterpret_cast< ::Graphic* >( nGraphicAddress ) );
145 uno::Reference< ::graphic::XGraphic > GraphicProvider::implLoadRepositoryImage(
const OUString& rResourceURL )
147 uno::Reference< ::graphic::XGraphic > xRet;
150 if( rResourceURL.startsWith(
"private:graphicrepository/", &sPathName) )
162 uno::Reference< ::graphic::XGraphic > GraphicProvider::implLoadStandardImage(
const OUString& rResourceURL )
164 uno::Reference< ::graphic::XGraphic > xRet;
167 if( rResourceURL.startsWith(
"private:standardimage/", &sImageName) )
169 if ( sImageName ==
"info" )
173 else if ( sImageName ==
"warning" )
177 else if ( sImageName ==
"error" )
181 else if ( sImageName ==
"query" )
190 uno::Reference< ::graphic::XGraphic > GraphicProvider::implLoadBitmap(
const uno::Reference< awt::XBitmap >& xBtm )
192 uno::Reference< ::graphic::XGraphic > xRet;
193 uno::Sequence< sal_Int8 > aBmpSeq( xBtm->getDIB() );
194 uno::Sequence< sal_Int8 > aMaskSeq( xBtm->getMaskDIB() );
195 SvMemoryStream aBmpStream( aBmpSeq.getArray(), aBmpSeq.getLength(), StreamMode::READ );
199 ReadDIB(aBmp, aBmpStream,
true);
201 if( aMaskSeq.hasElements() )
203 SvMemoryStream aMaskStream( aMaskSeq.getArray(), aMaskSeq.getLength(), StreamMode::READ );
206 ReadDIB(aMask, aMaskStream,
true);
216 pUnoGraphic->init( aBmpEx );
222 uno::Reference< beans::XPropertySet > SAL_CALL GraphicProvider::queryGraphicDescriptor(
const uno::Sequence< beans::PropertyValue >& rMediaProperties )
224 uno::Reference< beans::XPropertySet > xRet;
227 uno::Reference< io::XInputStream > xIStm;
228 uno::Reference< awt::XBitmap >xBtm;
230 for(
const auto& rMediaProperty : rMediaProperties )
235 const OUString
aName( rMediaProperty.Name );
236 const uno::Any aValue( rMediaProperty.Value );
242 else if (aName ==
"InputStream")
246 else if (aName ==
"Bitmap")
257 pDescriptor->init( xIStm, aURL );
260 else if( !aURL.isEmpty() )
262 uno::Reference< ::graphic::XGraphic >
xGraphic( implLoadMemory( aURL ) );
265 xGraphic = implLoadRepositoryImage( aURL );
268 xGraphic = implLoadStandardImage( aURL );
272 xRet.set( xGraphic, uno::UNO_QUERY );
277 pDescriptor->init( aURL );
283 uno::Reference< ::graphic::XGraphic >
xGraphic( implLoadBitmap( xBtm ) );
285 xRet.set( xGraphic, uno::UNO_QUERY );
292 uno::Reference< ::graphic::XGraphic > SAL_CALL GraphicProvider::queryGraphic(
const uno::Sequence< ::beans::PropertyValue >& rMediaProperties )
294 uno::Reference< ::graphic::XGraphic > xRet;
297 uno::Reference< io::XInputStream > xIStm;
298 uno::Reference< awt::XBitmap >xBtm;
300 uno::Sequence< ::beans::PropertyValue > aFilterData;
302 bool bLazyRead =
false;
303 bool bLoadAsLink =
false;
305 for (
const auto& rMediaProperty : rMediaProperties)
310 const OUString
aName( rMediaProperty.Name );
311 const uno::Any aValue( rMediaProperty.Value );
319 else if (aName ==
"InputStream")
323 else if (aName ==
"Bitmap")
327 else if (aName ==
"FilterData")
329 aValue >>= aFilterData;
331 else if (aName ==
"LazyRead")
333 aValue >>= bLazyRead;
335 else if (aName ==
"LoadAsLink")
337 aValue >>= bLoadAsLink;
342 sal_uInt16 nExtWidth = 0;
343 sal_uInt16 nExtHeight = 0;
344 sal_uInt16 nExtMapMode = 0;
345 for(
const auto& rProp : std::as_const(aFilterData) )
347 const OUString
aName( rProp.Name );
348 const uno::Any aValue( rProp.Value );
350 if (aName ==
"ExternalWidth")
352 aValue >>= nExtWidth;
354 else if (aName ==
"ExternalHeight")
356 aValue >>= nExtHeight;
358 else if (aName ==
"ExternalMapMode")
360 aValue >>= nExtMapMode;
366 std::unique_ptr<SvStream> pIStm;
372 else if( !aPath.isEmpty() )
374 xRet = implLoadMemory( aPath );
377 xRet = implLoadRepositoryImage( aPath );
380 xRet = implLoadStandardImage( aPath );
387 xRet = implLoadBitmap( xBtm );
399 aExtHeader.
xExt = nExtWidth;
400 aExtHeader.
yExt = nExtHeight;
401 aExtHeader.
mapMode = nExtMapMode;
403 if ( nExtMapMode > 0 )
405 pExtHeader = &aExtHeader;
414 aVCLGraphic = aGraphic;
423 if (!aPath.isEmpty() && bLoadAsLink)
428 pUnoGraphic->init( aVCLGraphic );
432 SAL_WARN(
"svtools",
"Could not create graphic: " << error);
440 uno::Sequence< uno::Reference<graphic::XGraphic> > SAL_CALL GraphicProvider::queryGraphics(
const uno::Sequence< uno::Sequence<beans::PropertyValue> >& rMediaPropertiesSeq)
445 std::vector< std::unique_ptr<SvStream> > aStreams;
446 for (
const auto& rMediaProperties : rMediaPropertiesSeq)
448 std::unique_ptr<SvStream> pStream;
449 uno::Reference<io::XInputStream>
xStream;
451 auto pProp = std::find_if(rMediaProperties.begin(), rMediaProperties.end(),
452 [](
const beans::PropertyValue& rProp) {
return rProp.Name ==
"InputStream"; });
453 if (pProp != rMediaProperties.end())
455 pProp->Value >>= xStream;
460 aStreams.push_back(std::move(pStream));
464 std::vector< std::shared_ptr<Graphic> > aGraphics;
469 std::vector< uno::Reference<graphic::XGraphic> > aRet;
470 for (
const auto& pGraphic : aGraphics)
472 uno::Reference<graphic::XGraphic>
xGraphic;
477 pUnoGraphic->init(*pGraphic);
478 xGraphic = pUnoGraphic;
481 aRet.push_back(xGraphic);
487 void ImplCalculateCropRect( ::
Graphic const & rGraphic,
const text::GraphicCrop& rGraphicCropLogic,
tools::Rectangle& rGraphicCropPixel )
489 if ( !(rGraphicCropLogic.Left || rGraphicCropLogic.Top || rGraphicCropLogic.Right || rGraphicCropLogic.Bottom) )
493 if ( !(aSourceSizePixel.Width() && aSourceSizePixel.Height()) )
496 if ( !(rGraphicCropLogic.Left || rGraphicCropLogic.Top || rGraphicCropLogic.Right || rGraphicCropLogic.Bottom) )
499 Size aSize100thMM( 0, 0 );
508 if ( aSize100thMM.Width() && aSize100thMM.Height() )
510 double fSourceSizePixelWidth =
static_cast<double>(aSourceSizePixel.Width());
511 double fSourceSizePixelHeight=
static_cast<double>(aSourceSizePixel.Height());
512 rGraphicCropPixel.
SetLeft( static_cast< sal_Int32 >((fSourceSizePixelWidth * rGraphicCropLogic.Left ) / aSize100thMM.Width()) );
513 rGraphicCropPixel.
SetTop( static_cast< sal_Int32 >((fSourceSizePixelHeight * rGraphicCropLogic.Top ) / aSize100thMM.Height()) );
514 rGraphicCropPixel.
SetRight( static_cast< sal_Int32 >(( fSourceSizePixelWidth * ( aSize100thMM.Width() - rGraphicCropLogic.Right ) ) / aSize100thMM.Width() ) );
515 rGraphicCropPixel.
SetBottom( static_cast< sal_Int32 >(( fSourceSizePixelHeight * ( aSize100thMM.Height() - rGraphicCropLogic.Bottom ) ) / aSize100thMM.Height() ) );
519 void ImplApplyBitmapScaling( ::
Graphic& rGraphic, sal_Int32 nPixelWidth, sal_Int32 nPixelHeight )
521 if ( nPixelWidth && nPixelHeight )
526 aBmpEx.
Scale(
Size( nPixelWidth, nPixelHeight ) );
533 void ImplApplyBitmapResolution( ::
Graphic& rGraphic, sal_Int32 nImageResolution,
const Size& rVisiblePixelSize,
const awt::Size& rLogicalSize )
535 if ( !(nImageResolution && rLogicalSize.Width && rLogicalSize.Height) )
538 const double fImageResolution =
static_cast<double>( nImageResolution );
539 const double fSourceDPIX = (
static_cast<double>(rVisiblePixelSize.
Width()) * 2540.0 ) /
static_cast<double>(rLogicalSize.Width);
540 const double fSourceDPIY = (
static_cast<double>(rVisiblePixelSize.
Height()) * 2540.0 ) /
static_cast<double>(rLogicalSize.Height);
543 const double fSourcePixelWidth =
static_cast<double>( nSourcePixelWidth );
544 const double fSourcePixelHeight=
static_cast<double>( nSourcePixelHeight );
546 sal_Int32 nDestPixelWidth = nSourcePixelWidth;
547 sal_Int32 nDestPixelHeight = nSourcePixelHeight;
550 if( fSourceDPIX > fImageResolution )
552 nDestPixelWidth =
static_cast<sal_Int32
>(( fSourcePixelWidth * fImageResolution ) / fSourceDPIX);
553 if ( !nDestPixelWidth || ( nDestPixelWidth > nSourcePixelWidth ) )
554 nDestPixelWidth = nSourcePixelWidth;
556 if ( fSourceDPIY > fImageResolution )
558 nDestPixelHeight=
static_cast<sal_Int32
>(( fSourcePixelHeight* fImageResolution ) / fSourceDPIY);
559 if ( !nDestPixelHeight || ( nDestPixelHeight > nSourcePixelHeight ) )
560 nDestPixelHeight = nSourcePixelHeight;
562 if ( ( nDestPixelWidth != nSourcePixelWidth ) || ( nDestPixelHeight != nSourcePixelHeight ) )
563 ImplApplyBitmapScaling( rGraphic, nDestPixelWidth, nDestPixelHeight );
566 void ImplApplyFilterData( ::
Graphic& rGraphic,
const uno::Sequence< beans::PropertyValue >& rFilterData )
573 sal_Int32 nPixelWidth = 0;
574 sal_Int32 nPixelHeight= 0;
575 sal_Int32 nImageResolution = 0;
576 awt::Size aLogicalSize( 0, 0 );
577 text::GraphicCrop aCropLogic( 0, 0, 0, 0 );
578 bool bRemoveCropArea =
true;
580 for(
const auto& rProp : rFilterData )
582 const OUString
aName( rProp.Name );
583 const uno::Any aValue( rProp.Value );
585 if (aName ==
"PixelWidth")
586 aValue >>= nPixelWidth;
587 else if (aName ==
"PixelHeight")
588 aValue >>= nPixelHeight;
589 else if (aName ==
"LogicalSize")
590 aValue >>= aLogicalSize;
591 else if (aName ==
"GraphicCropLogic")
592 aValue >>= aCropLogic;
593 else if (aName ==
"RemoveCropArea")
594 aValue >>= bRemoveCropArea;
595 else if (aName ==
"ImageResolution")
596 aValue >>= nImageResolution;
607 ImplCalculateCropRect( rGraphic, aCropLogic, aCropPixel );
608 if ( bRemoveCropArea )
611 aBmpEx.
Crop( aCropPixel );
614 Size aVisiblePixelSize( bRemoveCropArea ? rGraphic.
GetSizePixel() : aCropPixel.GetSize() );
615 ImplApplyBitmapResolution( rGraphic, nImageResolution, aVisiblePixelSize, aLogicalSize );
616 ImplApplyBitmapScaling( rGraphic, nPixelWidth, nPixelHeight );
624 if ( aMtfSize.Width() && aMtfSize.Height() )
626 MapMode aNewMapMode( MapUnit::Map100thMM );
627 aNewMapMode.SetScaleX(
Fraction( aLogicalSize.Width, aMtfSize.Width() ) );
628 aNewMapMode.SetScaleY(
Fraction( aLogicalSize.Height, aMtfSize.Height() ) );
629 aDummyVDev->EnableOutput(
false );
630 aDummyVDev->SetMapMode( aNewMapMode );
632 for(
size_t i = 0, nObjCount = aMtf.GetActionSize();
i < nObjCount;
i++ )
645 const MetaPushAction* pA =
static_cast<const MetaPushAction*
>(pAction);
646 aDummyVDev->Push( pA->GetFlags() );
666 aSize = pScaleAction->
GetSize();
674 aSize = pScaleAction->
GetSize();
677 const Size aSize100thmm( aDummyVDev->LogicToPixel( aSize ) );
678 Size aSize100thmm2( aDummyVDev->PixelToLogic(aSize100thmm,
MapMode(MapUnit::Map100thMM)) );
680 ImplApplyBitmapResolution( aGraphic, nImageResolution,
681 aGraphic.
GetSizePixel(), awt::Size( aSize100thmm2.Width(), aSize100thmm2.Height() ) );
684 aMtf.ReplaceAction( pNewAction, i );
703 void SAL_CALL GraphicProvider::storeGraphic(
const uno::Reference< ::graphic::XGraphic >& rxGraphic,
const uno::Sequence< beans::PropertyValue >& rMediaProperties )
707 std::unique_ptr<SvStream> pOStm;
710 for(
const auto& rMediaProperty : rMediaProperties )
712 const OUString
aName( rMediaProperty.Name );
713 const uno::Any aValue( rMediaProperty.Value );
723 else if (aName ==
"OutputStream")
725 uno::Reference< io::XStream > xOStm;
740 uno::Sequence< beans::PropertyValue > aFilterDataSeq;
741 const char* pFilterShortName =
nullptr;
743 for(
const auto& rMediaProperty : rMediaProperties )
745 const OUString
aName( rMediaProperty.Name );
746 const uno::Any aValue( rMediaProperty.Value );
748 if (aName ==
"FilterData")
750 aValue >>= aFilterDataSeq;
752 else if (aName ==
"MimeType")
756 aValue >>= aMimeType;
759 pFilterShortName =
"bmp";
761 pFilterShortName =
"eps";
763 pFilterShortName =
"gif";
765 pFilterShortName =
"jpg";
767 pFilterShortName =
"met";
769 pFilterShortName =
"png";
771 pFilterShortName =
"pct";
773 pFilterShortName =
"pbm";
775 pFilterShortName =
"pgm";
777 pFilterShortName =
"ppm";
779 pFilterShortName =
"ras";
781 pFilterShortName =
"svm";
783 pFilterShortName =
"tif";
785 pFilterShortName =
"emf";
787 pFilterShortName =
"wmf";
789 pFilterShortName =
"xpm";
791 pFilterShortName =
"svg";
797 if( !pFilterShortName )
803 const uno::Reference< XInterface > xIFace( rxGraphic, uno::UNO_QUERY );
804 const ::Graphic* pGraphic = comphelper::getUnoTunnelImplementation<::Graphic>( xIFace );
809 ImplApplyFilterData( aGraphic, aFilterDataSeq );
814 aMemStrm.
SetVersion( SOFFICE_FILEFORMAT_CURRENT );
818 aSerializer.writeGraphic(aGraphic);
824 ( aFilterDataSeq.hasElements() ? &aFilterDataSeq : nullptr ) );
833 extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface *
835 css::uno::XComponentContext *,
836 css::uno::Sequence<css::uno::Any>
const &)
838 return cppu::acquire(
new GraphicProvider);
Image const & GetStandardInfoBoxImage()
Image const & GetStandardWarningBoxImage()
ErrCode ImportGraphic(Graphic &rGraphic, const INetURLObject &rPath, sal_uInt16 nFormat=GRFILTER_FORMAT_DONTKNOW, sal_uInt16 *pDeterminedFormat=nullptr, GraphicFilterImportFlags nImportFlags=GraphicFilterImportFlags::NONE)
const MapMode & GetPrefMapMode() const
Point LogicToLogic(const Point &rPtSource, const MapMode *pMapModeSource, const MapMode *pMapModeDest) const
Size GetSizePixel(const OutputDevice *pRefDevice=nullptr) const
bool Scale(const Size &rNewSize, BmpScaleFlag nScaleFlag=BmpScaleFlag::Default)
Scale the bitmap.
void SetPrefMapMode(const MapMode &rPrefMapMode)
SAL_DLLPUBLIC_EXPORT css::uno::XInterface * com_sun_star_comp_graphic_GraphicProvider_get_implementation(css::uno::XComponentContext *, css::uno::Sequence< css::uno::Any > const &)
void setOriginURL(OUString const &rOriginURL)
css::uno::Sequence< OUString > getSupportedServiceNames()
OUString getImplementationName()
Class to import and export graphic formats.
css::uno::Reference< css::graphic::XGraphic > GetXGraphic() const
virtual sal_uInt64 TellEnd() override
static OutputDevice * GetDefaultDevice()
Get the default "device" (in this case the default window).
Graphic ImportUnloadedGraphic(SvStream &rIStream, sal_uInt64 sizeLimit=0, const Size *pSizeHint=nullptr)
static std::unique_ptr< SvStream > CreateStream(const OUString &rFileName, StreamMode eOpenMode, css::uno::Reference< css::awt::XWindow > xParentWin=nullptr)
const BorderLinePrimitive2D *pCandidateB assert(pCandidateA)
const Size & GetPrefSize() const
bool CPPUHELPER_DLLPUBLIC supportsService(css::lang::XServiceInfo *implementation, rtl::OUString const &name)
void ImportGraphics(std::vector< std::shared_ptr< Graphic > > &rGraphics, std::vector< std::unique_ptr< SvStream > > vStreams)
Imports multiple graphics.
const GDIMetaFile & GetGDIMetaFile() const
sal_uInt16 GetExportFormatNumberForShortName(std::u16string_view rShortName)
sal_uInt16 mapMode
One of the following values:
GraphicType GetType() const
static bool loadImage(const OUString &_rName, BitmapEx &_out_rImage)
loads an image from the application's image repository
Image const & GetStandardErrorBoxImage()
tools::Long Width() const
const char *const aMimeType[]
#define GRFILTER_FORMAT_DONTKNOW
css::uno::Type const & get()
MapUnit GetMapUnit() const
BitmapEx GetBitmapEx(const GraphicConversionParameters &rParameters=GraphicConversionParameters()) const
void SetVersion(sal_Int32 n)
ErrCode ExportGraphic(const Graphic &rGraphic, const INetURLObject &rPath, sal_uInt16 nFormat, const css::uno::Sequence< css::beans::PropertyValue > *pFilterData=nullptr)
Point PixelToLogic(const Point &rDevicePt) const
MapMode GetPrefMapMode() const
css::uno::Sequence< DstElementType > containerToSequence(const SrcType &i_Container)
void SetPrefSize(const Size &rPrefSize)
tools::Long Height() const
#define MIMETYPE_VCLGRAPHIC
static GraphicFilter & GetGraphicFilter()
reference_type * get() const
Get the body.
#define SAL_WARN(area, stream)
Image const & GetStandardQueryBoxImage()
const std::shared_ptr< VectorGraphicData > & getVectorGraphicData() const
bool Crop(const tools::Rectangle &rRectPixel)
Crop the bitmap.
Reference< XGraphic > xGraphic