20#include <config_folders.h>
42#include <osl/file.hxx>
70#include <osl/module.hxx>
71#include <com/sun/star/uno/Reference.h>
72#include <com/sun/star/awt/Size.hpp>
73#include <com/sun/star/uno/XInterface.hpp>
74#include <com/sun/star/io/XActiveDataSource.hpp>
75#include <com/sun/star/io/XOutputStream.hpp>
76#include <com/sun/star/svg/XSVGWriter.hpp>
77#include <com/sun/star/xml/sax/XDocumentHandler.hpp>
78#include <com/sun/star/xml/sax/Writer.hpp>
80#include <rtl/bootstrap.hxx>
103 const char*
const testname = getenv(
"LO_TESTNAME");
104 if(testname ==
nullptr)
107 if( std::string_view(
"_anonymous_namespace___GraphicTest__testUnloadedGraphicLoading_") == testname
108 || std::string_view(
"VclFiltersTest__testExportImport_") == testname
118 static std::mutex s_aListProtection;
119 return s_aListProtection;
124class ImpFilterOutputStream :
public ::cppu::WeakImplHelper< css::io::XOutputStream >
128 virtual void SAL_CALL writeBytes(
const css::uno::Sequence< sal_Int8 >& rData )
override
129 { mrStm.
WriteBytes(rData.getConstArray(), rData.getLength()); }
130 virtual void SAL_CALL flush()
override
132 virtual void SAL_CALL closeOutput()
override {}
136 explicit ImpFilterOutputStream(
SvStream& rStm ) : mrStm( rStm ) {}
147 aExt =
aURL.GetFileExtension().toAsciiUpperCase();
176 aTmpStr = aTmpStr.toAsciiUpperCase();
186 FilterConfigItem aFilterConfigItem(
u"Office.Common/Filter/Graphic/Import/PCD" );
187 aFilterConfigItem.
WriteInt32(
"Resolution", nBase );
198 sal_Int32 nLogicalWidth = rConfigItem.
ReadInt32(
"LogicalWidth", 0 );
199 sal_Int32 nLogicalHeight = rConfigItem.
ReadInt32(
"LogicalHeight", 0 );
203 sal_Int32 nMode = rConfigItem.
ReadInt32(
"ExportMode", -1 );
208 if ( nLogicalWidth || nLogicalHeight )
215 if (aPrefMapMode.
GetMapUnit() == MapUnit::MapPixel)
219 if ( !nLogicalWidth )
220 nLogicalWidth = aOriginalSize.
Width();
221 if ( !nLogicalHeight )
222 nLogicalHeight = aOriginalSize.
Height();
232 sal_Int32 nDPI = rConfigItem.
ReadInt32(
"Resolution", 75 );
233 Fraction aFrac( 1, std::clamp( nDPI, sal_Int32(75), sal_Int32(600) ) );
235 aMap.SetScaleX( aFrac );
236 aMap.SetScaleY( aFrac );
242 aOldSize.
Height() * 100 ) );
245 else if( nMode == 2 )
254 sal_Int32 nColors = rConfigItem.
ReadInt32(
"Color", 0 );
264 if( ( nMode == 1 ) || ( nMode == 2 ) )
289 : bUseConfig(bConfig)
324 OUString url(
"$BRAND_BASE_DIR/" LIBO_LIB_FOLDER);
325 rtl::Bootstrap::expandMacros(url);
326 osl::FileBase::getSystemPathFromFileURL(url,
aFilterPath);
369OUString GraphicFilter::GetImportFormatMediaType( sal_uInt16 nFormat )
441 sal_uInt16 nFormat, sal_uInt16* pDeterminedFormat )
444 SAL_WARN_IF( rPath.
GetProtocol() == INetProtocol::NotValid,
"vcl.filter",
"GraphicFilter::CanImportGraphic() : ProtType == INetProtocol::NotValid" );
456 sal_uInt16 nFormat, sal_uInt16* pDeterminedFormat )
458 sal_uInt64 nStreamPos = rIStream.
Tell();
461 rIStream.
Seek(nStreamPos);
464 *pDeterminedFormat = nFormat;
474 SAL_WARN_IF( rPath.
GetProtocol() == INetProtocol::NotValid,
"vcl.filter",
"GraphicFilter::ImportGraphic() : ProtType == INetProtocol::NotValid" );
480 nRetValue =
ImportGraphic( rGraphic, aMainUrl, *
xStream, nFormat, pDeterminedFormat, nImportFlags );
489struct GraphicImportContext
494 std::shared_ptr<Graphic> m_pGraphic;
496 std::unique_ptr<BitmapScopedWriteAccess> m_pAccess;
497 std::unique_ptr<AlphaScopedWriteAccess> m_pAlphaAccess;
505 sal_uInt64 m_nStreamBegin = 0;
515 GraphicImportTask(
const std::shared_ptr<comphelper::ThreadTaskTag>& pTag, GraphicImportContext& rContext);
518 static void doImport(GraphicImportContext& rContext);
523GraphicImportTask::GraphicImportTask(
const std::shared_ptr<comphelper::ThreadTaskTag>& pTag, GraphicImportContext& rContext)
529void GraphicImportTask::doWork()
531 GraphicImportTask::doImport(m_rContext);
534void GraphicImportTask::doImport(GraphicImportContext& rContext)
545 rContext.m_pAccess.get(), rContext.m_pAlphaAccess.get()))
554 static bool bThreads = !getenv(
"VCL_NO_THREAD_IMPORT");
555 std::vector<GraphicImportContext> aContexts;
556 aContexts.reserve(vStreams.size());
560 for (
auto& pStream : vStreams)
562 aContexts.emplace_back();
563 GraphicImportContext& rContext = aContexts.back();
567 rContext.m_pStream = std::move(pStream);
568 rContext.m_pGraphic = std::make_shared<Graphic>();
573 rContext.m_nStreamBegin = rContext.m_pStream->Tell();
576 rContext.m_pStream->Seek(rContext.m_nStreamBegin);
579 if (rContext.m_nStatus ==
ERRCODE_NONE && !rContext.m_pStream->GetError())
583 if (aFilterName.equalsIgnoreAsciiCase(
IMP_JPEG))
590 Bitmap& rBitmap =
const_cast<Bitmap&
>(rContext.m_pGraphic->GetBitmapExRef().GetBitmap());
591 rContext.m_pAccess = std::make_unique<BitmapScopedWriteAccess>(rBitmap);
592 rContext.m_pStream->Seek(rContext.m_nStreamBegin);
594 rSharedPool.
pushTask(std::make_unique<GraphicImportTask>(pTag, rContext));
596 GraphicImportTask::doImport(rContext);
601 else if (aFilterName.equalsIgnoreAsciiCase(
IMP_PNG))
607 const BitmapEx& rBitmapEx = rContext.m_pGraphic->GetBitmapExRef();
609 rContext.m_pAccess = std::make_unique<BitmapScopedWriteAccess>(rBitmap);
620 rContext.m_pAlphaAccess = std::make_unique<AlphaScopedWriteAccess>(rContext.mAlphaMask);
622 rContext.m_pStream->Seek(rContext.m_nStreamBegin);
624 rSharedPool.
pushTask(std::make_unique<GraphicImportTask>(pTag, rContext));
626 GraphicImportTask::doImport(rContext);
640 for (
auto& rContext : aContexts)
642 if(rContext.m_pAlphaAccess)
643 *rContext.m_pGraphic =
BitmapEx( rContext.m_pGraphic->GetBitmapExRef().GetBitmap(), rContext.mAlphaMask );
644 rContext.m_pAccess.reset();
645 rContext.m_pAlphaAccess.reset();
651 const sal_uInt64 nStreamEnd = rContext.m_pStream->Tell();
652 sal_Int32 nGraphicContentSize = nStreamEnd - rContext.m_nStreamBegin;
654 if (nGraphicContentSize > 0)
658 rContext.m_pStream->Seek(rContext.m_nStreamBegin);
661 catch (
const std::bad_alloc&)
668 rContext.m_pGraphic->SetGfxLink(std::make_shared<GfxLink>(aGraphicContent, rContext.m_eLinkType));
672 rContext.m_pGraphic =
nullptr;
674 rGraphics.push_back(rContext.m_pGraphic);
683 std::vector< Graphic* > toLoad;
684 for(
auto graphic : graphics)
687 if(!graphic->isAvailable() && graphic->IsGfxLink()
688 && graphic->GetSharedGfxLink()->GetDataSize() != 0
693 const auto predicate = [graphic](
Graphic* item) {
return item->ImplGetImpGraphic() == graphic->ImplGetImpGraphic(); };
694 if( std::none_of(toLoad.begin(), toLoad.end(), predicate ))
695 toLoad.push_back( graphic );
700 std::vector< std::unique_ptr<SvStream>> streams;
701 for(
auto graphic : toLoad )
703 streams.push_back( std::make_unique<SvMemoryStream>(
const_cast<sal_uInt8*
>(graphic->GetSharedGfxLink()->GetData()),
704 graphic->GetSharedGfxLink()->GetDataSize(), StreamMode::READ | StreamMode::WRITE));
706 std::vector< std::shared_ptr<Graphic>> loadedGraphics;
708 assert(loadedGraphics.size() == toLoad.size());
709 for(
size_t i = 0;
i < toLoad.size(); ++
i )
711 if(loadedGraphics[
i ] !=
nullptr)
712 toLoad[
i ]->ImplGetImpGraphic()->updateFromLoadedGraphic(loadedGraphics[
i ]->ImplGetImpGraphic());
717 const Size* pSizeHint)
725 const sal_uInt64 nStreamBegin = rIStream.
Tell();
727 rIStream.
Seek(nStreamBegin);
731 rIStream.
Seek(nStreamBegin);
733 if (sizeLimit && sizeLimit < nStreamLength)
734 nStreamLength = sizeLimit;
742 if (aFilterName.equalsIgnoreAsciiCase(
IMP_GIF))
746 else if (aFilterName.equalsIgnoreAsciiCase(
IMP_PNG))
750 if (!aGraphicContent.
isEmpty())
755 else if (aFilterName.equalsIgnoreAsciiCase(
IMP_JPEG))
759 else if (aFilterName.equalsIgnoreAsciiCase(
IMP_SVG))
763 if (nStreamLength > 0)
765 std::vector<sal_uInt8> aTwoBytes(2);
767 rIStream.
Seek(nStreamBegin);
769 if (aTwoBytes[0] == 0x1F && aTwoBytes[1] == 0x8B)
776 nMemoryLength = aCodec.
Decompress(rIStream, aMemStream);
779 if (!rIStream.
GetError() && nMemoryLength >= 0)
804 else if (aFilterName.equalsIgnoreAsciiCase(
IMP_BMP))
808 else if (aFilterName.equalsIgnoreAsciiCase(
IMP_MOV))
812 else if (aFilterName.equalsIgnoreAsciiCase(
IMP_WMF) ||
813 aFilterName.equalsIgnoreAsciiCase(
IMP_EMF) ||
814 aFilterName.equalsIgnoreAsciiCase(
IMP_WMZ) ||
815 aFilterName.equalsIgnoreAsciiCase(
IMP_EMZ))
817 rIStream.
Seek(nStreamBegin);
824 nMemoryLength = aCodec.
Decompress(rIStream, aMemStream);
827 if (!rIStream.
GetError() && nMemoryLength >= 0)
846 else if (aFilterName ==
IMP_PDF)
858 else if (aFilterName ==
IMP_MET)
862 else if (aFilterName.equalsIgnoreAsciiCase(
IMP_WEBP))
879 if (nStreamLength > 0)
883 rIStream.
Seek(nStreamBegin);
886 catch (
const std::bad_alloc&)
895 bool bAnimated =
false;
899 std::shared_ptr<SvStream> pMemoryStream = aGraphicContent.
getAsStream();
903 pSizeHint = &aLogicSize;
906 aGraphic.
SetGfxLink(std::make_shared<GfxLink>(aGraphicContent, eLinkType));
915 rIStream.
Seek(nStreamBegin);
939 std::shared_ptr<SvStream> pIStrm(aMSGifChunk.getAsStream());
942 rpGraphicContent = aMSGifChunk;
951 rGraphic = aBitmapEx;
971 sal_uInt64 nPosition = rStream.
Tell();
978 rStream.
Seek(nPosition);
992 const sal_uInt64 nStreamPosition(rStream.
Tell());
997 if (nStreamLength > 0)
999 std::vector<sal_uInt8> aTwoBytes(2);
1001 rStream.
Seek(nStreamPosition);
1003 if (aTwoBytes[0] == 0x1F && aTwoBytes[1] == 0x8B)
1010 nMemoryLength = aCodec.
Decompress(rStream, aMemStream);
1013 if (!rStream.
GetError() && nMemoryLength >= 0)
1022 rGraphic =
Graphic(aVectorGraphicDataPtr);
1034 rGraphic =
Graphic(aVectorGraphicDataPtr);
1081 auto nDecompressLength = aCodec.
Decompress(rStream, aMemStream);
1084 if (nDecompressLength >= 0)
1086 nStreamLength = nDecompressLength;
1087 aNewStream = &aMemStream;
1093 auto aVectorGraphicDataPtr = std::make_shared<VectorGraphicData>(aNewData,
eType);
1095 rGraphic =
Graphic(aVectorGraphicDataPtr);
1231 std::unique_ptr<FilterConfigItem> pFilterConfigItem;
1234 OUString aFilterConfigPath(
"Office.Common/Filter/Graphic/Import/PCD" );
1235 pFilterConfigItem = std::make_unique<FilterConfigItem>(aFilterConfigPath);
1275 OUString aFilterName;
1276 sal_uInt64 nStreamBegin;
1279 const bool bLinkSet = rGraphic.
IsGfxLink();
1287 if( !pContext || bDummyContext )
1295 nStreamBegin = rIStream.
Tell();
1303 rIStream.
Seek( nStreamBegin );
1307 rIStream.
Seek( nStreamBegin );
1312 if( pDeterminedFormat )
1313 *pDeterminedFormat = nFormat;
1319 aFilterName = pContext->GetUpperFilterName();
1327 if (aFilterName.equalsIgnoreAsciiCase(
IMP_GIF))
1329 nStatus =
readGIF(rIStream, rGraphic, eLinkType);
1331 else if (aFilterName.equalsIgnoreAsciiCase(
IMP_PNG))
1333 nStatus =
readPNG(rIStream, rGraphic, eLinkType, aGraphicContent);
1335 else if (aFilterName.equalsIgnoreAsciiCase(
IMP_JPEG))
1337 nStatus =
readJPEG(rIStream, rGraphic, eLinkType, nImportFlags);
1339 else if (aFilterName.equalsIgnoreAsciiCase(
IMP_SVG) || aFilterName.equalsIgnoreAsciiCase(
IMP_SVGZ))
1341 nStatus =
readSVG(rIStream, rGraphic, eLinkType, aGraphicContent);
1343 else if( aFilterName.equalsIgnoreAsciiCase(
IMP_XBM ) )
1345 nStatus =
readXBM(rIStream, rGraphic);
1347 else if( aFilterName.equalsIgnoreAsciiCase(
IMP_XPM ) )
1349 nStatus =
readXPM(rIStream, rGraphic);
1351 else if (aFilterName.equalsIgnoreAsciiCase(
IMP_BMP))
1353 nStatus =
readBMP(rIStream, rGraphic, eLinkType);
1359 else if( aFilterName.equalsIgnoreAsciiCase(
IMP_MOV))
1363 else if (aFilterName.equalsIgnoreAsciiCase(
IMP_WMF) || aFilterName.equalsIgnoreAsciiCase(
IMP_WMZ))
1365 nStatus =
readWMF(rIStream, rGraphic, eLinkType);
1367 else if (aFilterName.equalsIgnoreAsciiCase(
IMP_EMF) || aFilterName.equalsIgnoreAsciiCase(
IMP_EMZ))
1369 nStatus =
readEMF(rIStream, rGraphic, eLinkType);
1371 else if (aFilterName.equalsIgnoreAsciiCase(
IMP_PDF))
1373 nStatus =
readPDF(rIStream, rGraphic, eLinkType);
1375 else if (aFilterName.equalsIgnoreAsciiCase(
IMP_TIFF) )
1377 nStatus =
readTIFF(rIStream, rGraphic, eLinkType);
1379 else if (aFilterName.equalsIgnoreAsciiCase(
IMP_TGA) )
1381 nStatus =
readTGA(rIStream, rGraphic);
1383 else if (aFilterName.equalsIgnoreAsciiCase(
IMP_PICT))
1385 nStatus =
readPICT(rIStream, rGraphic, eLinkType);
1387 else if (aFilterName.equalsIgnoreAsciiCase(
IMP_MET))
1389 nStatus =
readMET(rIStream, rGraphic, eLinkType);
1391 else if (aFilterName.equalsIgnoreAsciiCase(
IMP_RAS))
1393 nStatus =
readRAS(rIStream, rGraphic);
1395 else if (aFilterName.equalsIgnoreAsciiCase(
IMP_PCX))
1397 nStatus =
readPCX(rIStream, rGraphic);
1399 else if (aFilterName.equalsIgnoreAsciiCase(
IMP_EPS))
1401 nStatus =
readEPS(rIStream, rGraphic);
1403 else if (aFilterName.equalsIgnoreAsciiCase(
IMP_PSD))
1405 nStatus =
readPSD(rIStream, rGraphic);
1407 else if (aFilterName.equalsIgnoreAsciiCase(
IMP_PCD))
1409 nStatus =
readPCD(rIStream, rGraphic);
1411 else if (aFilterName.equalsIgnoreAsciiCase(
IMP_PBM))
1413 nStatus =
readPBM(rIStream, rGraphic);
1415 else if (aFilterName.equalsIgnoreAsciiCase(
IMP_DXF))
1417 nStatus =
readDXF(rIStream, rGraphic);
1419 else if (aFilterName.equalsIgnoreAsciiCase(
IMP_WEBP))
1421 nStatus =
readWEBP(rIStream, rGraphic, eLinkType);
1429 if (aGraphicContent.
isEmpty())
1431 const sal_uInt64 nStreamEnd = rIStream.
Tell();
1432 const sal_uInt64 nGraphicContentSize = nStreamEnd - nStreamBegin;
1434 if (nGraphicContentSize > 0)
1438 rIStream.
Seek(nStreamBegin);
1441 catch (
const std::bad_alloc&)
1449 rGraphic.
SetGfxLink(std::make_shared<GfxLink>(aGraphicContent, eLinkType));
1457 rIStream.
Seek( nStreamBegin );
1465 sal_uInt16 nFormat,
const css::uno::Sequence< css::beans::PropertyValue >* pFilterData )
1467 SAL_INFO(
"vcl.filter",
"GraphicFilter::ExportGraphic() (thb)" );
1469 SAL_WARN_IF( rPath.
GetProtocol() == INetProtocol::NotValid,
"vcl.filter",
"GraphicFilter::ExportGraphic() : ProtType == INetProtocol::NotValid" );
1487 SvStream& rOStm, sal_uInt16 nFormat,
const css::uno::Sequence< css::beans::PropertyValue >* pFilterData )
1489 SAL_INFO(
"vcl.filter",
"GraphicFilter::ExportGraphic() (thb)" );
1493 bool bShouldCompress =
false;
1499 for( sal_uInt16
i = 0;
i < nFormatCount;
i++ )
1508 if( nFormat >= nFormatCount )
1523 sal_uLong nBitsPerPixel,nNeededMem,nMaxMem;
1533 nBitsPerPixel=aVirDev->GetBitCount();
1537 if (nMaxMem<nNeededMem)
1539 double fFak=sqrt(
static_cast<double>(nMaxMem)/
static_cast<double>(nNeededMem));
1544 aVirDev->SetMapMode(
MapMode(MapUnit::MapPixel));
1545 aVirDev->SetOutputSizePixel(aSizePixel);
1547 aGraphic2.
Draw(*aVirDev,
Point(0, 0), aSizePixel);
1548 aVirDev->SetMapMode(
MapMode(MapUnit::MapPixel));
1549 aGraphic=
Graphic(aVirDev->GetBitmapEx(
Point(0,0),aSizePixel));
1556 if( aFilterName.equalsIgnoreAsciiCase(
EXP_BMP ) )
1558 if (!
BmpWriter(rOStm, aGraphic, &aConfigItem))
1563 else if (aFilterName.equalsIgnoreAsciiCase(
EXP_TIFF))
1571 else if (aFilterName.equalsIgnoreAsciiCase(
EXP_GIF))
1589 aWriter.
Write( aMTF );
1594 else if ( aFilterName.equalsIgnoreAsciiCase(
EXP_WMF ) || aFilterName.equalsIgnoreAsciiCase(
EXP_WMZ ) )
1598 if (aFilterName.equalsIgnoreAsciiCase(
EXP_WMZ))
1602 rTempStm = &rCompressableStm;
1603 bShouldCompress =
true;
1612 if (rVectorGraphicDataPtr
1614 && !rVectorGraphicDataPtr->getBinaryDataContainer().isEmpty()
1617 rVectorGraphicDataPtr->getBinaryDataContainer().writeToStream(*rTempStm);
1638 else if ( aFilterName.equalsIgnoreAsciiCase(
EXP_EMF ) || aFilterName.equalsIgnoreAsciiCase(
EXP_EMZ ) )
1642 if (aFilterName.equalsIgnoreAsciiCase(
EXP_EMZ))
1646 rTempStm = &rCompressableStm;
1647 bShouldCompress =
true;
1652 if (rVectorGraphicDataPtr
1654 && !rVectorGraphicDataPtr->getBinaryDataContainer().isEmpty())
1656 rVectorGraphicDataPtr->getBinaryDataContainer().writeToStream(*rTempStm);
1677 else if( aFilterName.equalsIgnoreAsciiCase(
EXP_JPEG ) )
1679 bool bExportedGrayJPEG =
false;
1680 if( !
ExportJPEG( rOStm, aGraphic, pFilterData, &bExportedGrayJPEG ) )
1686 else if (aFilterName.equalsIgnoreAsciiCase(
EXP_EPS))
1694 else if ( aFilterName.equalsIgnoreAsciiCase(
EXP_PNG ) )
1700 aPNGWriter.
write( aBitmapEx );
1705 else if( aFilterName.equalsIgnoreAsciiCase(
EXP_SVG ) || aFilterName.equalsIgnoreAsciiCase(
EXP_SVGZ ) )
1709 if (aFilterName.equalsIgnoreAsciiCase(
EXP_SVGZ))
1713 rTempStm = &rCompressableStm;
1714 bShouldCompress =
true;
1720 if (rVectorGraphicDataPtr
1722 && !rVectorGraphicDataPtr->getBinaryDataContainer().isEmpty())
1724 rVectorGraphicDataPtr->getBinaryDataContainer().writeToStream(*rTempStm);
1740 css::uno::Reference< css::uno::XComponentContext > xContext( ::comphelper::getProcessComponentContext() );
1742 css::uno::Reference< css::xml::sax::XDocumentHandler > xSaxWriter(
1743 css::xml::sax::Writer::create( xContext ), css::uno::UNO_QUERY_THROW);
1744 css::uno::Sequence< css::uno::Any >
aArguments{ css::uno::Any(
1746 css::uno::Reference< css::svg::XSVGWriter > xSVGWriter(
1747 xContext->getServiceManager()->createInstanceWithArgumentsAndContext(
"com.sun.star.svg.SVGWriter",
aArguments, xContext),
1748 css::uno::UNO_QUERY );
1749 if( xSaxWriter.is() && xSVGWriter.is() )
1751 css::uno::Reference< css::io::XActiveDataSource > xActiveDataSource(
1752 xSaxWriter, css::uno::UNO_QUERY );
1754 if( xActiveDataSource.is() )
1756 const css::uno::Reference< css::uno::XInterface > xStmIf(
1757 getXWeak(
new ImpFilterOutputStream( *rTempStm ) ) );
1765 xActiveDataSource->setOutputStream( css::uno::Reference< css::io::XOutputStream >(
1766 xStmIf, css::uno::UNO_QUERY ) );
1767 css::uno::Sequence< sal_Int8 > aMtfSeq(
static_cast<sal_Int8 const *
>(aMemStm.
GetData()), aMemStm.
Tell() );
1768 xSVGWriter->write( xSaxWriter, aMtfSeq );
1772 catch(
const css::uno::Exception&)
1778 else if (aFilterName.equalsIgnoreAsciiCase(
EXP_WEBP))
1793 else if ( bShouldCompress )
1795 sal_uInt32 nUncompressedCRC32
1796 = rtl_crc32( 0, rCompressableStm.
GetData(), rCompressableStm.
GetSize() );
1798 rCompressableStm.
Seek( 0 );
1803 aCodec.
Compress( rCompressableStm, rOStm );
1805 if ( rOStm.
GetError() || nCompressedLength <= 0 )
1828 OUString aShortName;
1829 css::uno::Sequence< css::beans::PropertyValue > aFilterData;
1830 switch( rData.mnFormat )
1848 if(
GraphicType::NONE == rData.maGraphic.GetType() || rData.maGraphic.GetReaderContext() )
1851 nFormat = GetImportFormatNumberForShortName( aShortName );
1852 bRet = ImportGraphic( rData.maGraphic,
u"", rData.mrStm, nFormat ) ==
ERRCODE_NONE;
1854 else if( !aShortName.isEmpty() )
1857#if defined(IOS) || defined(ANDROID)
1860 aFilterData.realloc(aFilterData.getLength() + 1);
1861 auto pFilterData = aFilterData.getArray();
1862 pFilterData[aFilterData.getLength() - 1].Name =
"Compression";
1864 pFilterData[aFilterData.getLength() - 1].Value <<=
static_cast<sal_Int32
>(1);
1867 nFormat = GetExportFormatNumberForShortName( aShortName );
1868 bRet = ExportGraphic( rData.maGraphic,
u"", rData.mrStm, nFormat, &aFilterData ) ==
ERRCODE_NONE;
1876 class StandardGraphicFilter
1879 StandardGraphicFilter()
1881 m_aFilter.GetImportFormatCount();
1889 static StandardGraphicFilter gStandardFilter;
1890 return gStandardFilter.m_aFilter;
1895 sal_uInt16* pDeterminedFormat )
1905 if (
aURL.HasError() )
1907 aURL.SetSmartProtocol( INetProtocol::File );
1908 aURL.SetSmartURL( rPath );
1911 std::unique_ptr<SvStream> pStream;
1912 if ( INetProtocol::File !=
aURL.GetProtocol() )
1919 nRes = pFilter->
ImportGraphic( rGraphic, rPath, *pStream, nFilter, pDeterminedFormat );
1922 OUString aReturnString;
1925 aReturnString=
"open error";
1927 aReturnString=
"IO error";
1929 aReturnString=
"format error";
1931 aReturnString=
"version error";
1933 aReturnString=
"filter error";
1935 aReturnString=
"graphic is too big";
1937 SAL_INFO_IF( nRes,
"vcl.filter",
"Problem importing graphic " << rPath <<
". Reason: " << aReturnString );
1946 "Compression", sal_uInt32(9)) };
1949 return ExportGraphic(rGraphic,
u"", rOutputStream, nFilterFormat, &aFilterData);
bool BmpReader(SvStream &rStream, Graphic &rGraphic)
bool BmpWriter(SvStream &rStream, const Graphic &rGraphic, FilterConfigItem *pFilterConfigItem)
oslInterlockedCount m_nStatus
static OutputDevice * GetDefaultDevice()
Get the default "device" (in this case the default window).
Container for the binary data, whose responsibility is to manage the make it as simple as possible to...
std::shared_ptr< SvStream > getAsStream()
const AlphaMask & GetAlphaMask() const
bool Convert(BmpConversion eConversion)
Convert bitmap format.
Bitmap GetBitmap(Color aTransparentReplaceColor) const
const Size & GetSizePixel() const
Cache to keep list of graphic filters + the filters themselves.
bool IsExportPixelFormat(sal_uInt16 nFormat)
sal_uInt16 GetExportFormatNumberForShortName(std::u16string_view rShortName)
OUString GetImportFormatName(sal_uInt16 nFormat)
sal_uInt16 GetImportFormatNumber(std::u16string_view rFormatName)
sal_uInt16 GetExportFormatNumber(std::u16string_view rFormatName)
sal_uInt16 GetImportFormatNumberForShortName(std::u16string_view rShortName)
OUString GetExportWildcard(sal_uInt16 nFormat, sal_Int32 nEntry)
OUString GetImportFormatShortName(sal_uInt16 nFormat)
sal_uInt16 GetImportFormatNumberForExtension(std::u16string_view rExt)
get the index of the filter that matches this extension
OUString GetImportWildcard(sal_uInt16 nFormat, sal_Int32 nEntry)
OUString GetImportFilterTypeName(sal_uInt16 nFormat)
OUString GetExportFilterName(sal_uInt16 nFormat)
OUString GetExportFormatShortName(sal_uInt16 nFormat)
OUString GetExportFormatName(sal_uInt16 nFormat)
OUString GetExportFormatExtension(sal_uInt16 nFormat, sal_Int32 nEntry=0)
OUString GetImportFilterName(sal_uInt16 nFormat)
sal_uInt16 GetExportFormatNumberForTypeName(std::u16string_view rType)
sal_uInt16 GetImportFormatCount() const
sal_uInt16 GetExportFormatNumberForMediaType(std::u16string_view rMediaType)
sal_uInt16 GetImportFormatNumberForTypeName(std::u16string_view rType)
OUString GetImportFormatExtension(sal_uInt16 nFormat, sal_Int32 nEntry=0)
OUString GetImportFilterType(sal_uInt16 nFormat)
sal_uInt16 GetExportFormatCount() const
OUString GetExportFormatMediaType(sal_uInt16 nFormat)
OUString GetImportFormatMediaType(sal_uInt16 nFormat)
OUString GetExportInternalFilterName(sal_uInt16 nFormat)
void WriteInt32(const OUString &rKey, sal_Int32 nValue)
sal_Int32 ReadInt32(const OUString &rKey, sal_Int32 nDefault)
const css::uno::Sequence< css::beans::PropertyValue > & GetFilterData() const
Class to import and export graphic formats.
OUString GetImportFormatShortName(sal_uInt16 nFormat)
static ErrCode readEPS(SvStream &rStream, Graphic &rGraphic)
sal_uInt16 GetExportFormatNumberForShortName(std::u16string_view rShortName)
static ErrCode readPSD(SvStream &rStream, Graphic &rGraphic)
static ErrCode readWithTypeSerializer(SvStream &rStream, Graphic &rGraphic, GfxLinkType &rLinkType, std::u16string_view aFilterName)
ErrCode ImplSetError(ErrCode nError, const SvStream *pStm=nullptr)
sal_uInt16 GetExportFormatNumberForTypeName(std::u16string_view rType)
Graphic ImportUnloadedGraphic(SvStream &rIStream, sal_uInt64 sizeLimit=0, const Size *pSizeHint=nullptr)
void MakeGraphicsAvailableThreaded(std::vector< Graphic * > &rGraphics)
Tries to ensure all Graphic objects are available (Graphic::isAvailable()).
static ErrCode readPCD(SvStream &rStream, Graphic &rGraphic)
sal_uInt16 GetImportFormatNumberForTypeName(std::u16string_view rType)
static ErrCode readWEBP(SvStream &rStream, Graphic &rGraphic, GfxLinkType &rLinkType)
OUString GetExportWildcard(sal_uInt16 nFormat)
static GraphicFilter & GetGraphicFilter()
Link< ConvertData &, bool > GetFilterCallback() const
static ErrCode readDXF(SvStream &rStream, Graphic &rGraphic)
bool IsExportPixelFormat(sal_uInt16 nFormat)
static ErrCode readBMP(SvStream &rStream, Graphic &rGraphic, GfxLinkType &rLinkType)
static ErrCode readPDF(SvStream &rStream, Graphic &rGraphic, GfxLinkType &rLinkType)
static ErrCode readXPM(SvStream &rStream, Graphic &rGraphic)
sal_uInt16 GetExportFormatNumber(std::u16string_view rFormatName)
static ErrCode readJPEG(SvStream &rStream, Graphic &rGraphic, GfxLinkType &rLinkType, GraphicFilterImportFlags nImportFlags)
static ErrCode readMET(SvStream &rStream, Graphic &rGraphic, GfxLinkType &rLinkType)
static ErrCode readXBM(SvStream &rStream, Graphic &rGraphic)
sal_uInt16 GetExportFormatNumberForMediaType(std::u16string_view rShortName)
sal_uInt16 GetImportFormatNumber(std::u16string_view rFormatName)
ErrCode CanImportGraphic(const INetURLObject &rPath, sal_uInt16 nFormat, sal_uInt16 *pDeterminedFormat)
OUString GetExportFormatName(sal_uInt16 nFormat)
OUString GetImportFormatName(sal_uInt16 nFormat)
static ErrCode readEMF(SvStream &rStream, Graphic &rGraphic, GfxLinkType &rLinkType)
ErrCode ExportGraphic(const Graphic &rGraphic, const INetURLObject &rPath, sal_uInt16 nFormat, const css::uno::Sequence< css::beans::PropertyValue > *pFilterData=nullptr)
static ErrCode readPICT(SvStream &rStream, Graphic &rGraphic, GfxLinkType &rLinkType)
static ErrCode readWMF_EMF(SvStream &rStream, Graphic &rGraphic, GfxLinkType &rLinkType, VectorGraphicDataType eType)
sal_uInt16 GetImportFormatCount() const
sal_uInt16 GetExportFormatCount() const
static ErrCode readWMF(SvStream &rStream, Graphic &rGraphic, GfxLinkType &rLinkType)
OUString GetExportFormatShortName(sal_uInt16 nFormat)
static ErrCode readTGA(SvStream &rStream, Graphic &rGraphic)
sal_uInt16 GetImportFormatNumberForShortName(std::u16string_view rShortName)
static ErrCode readPBM(SvStream &rStream, Graphic &rGraphic)
ErrCode ImpTestOrFindFormat(std::u16string_view rPath, SvStream &rStream, sal_uInt16 &rFormat)
static ErrCode readRAS(SvStream &rStream, Graphic &rGraphic)
GraphicFilter(bool bUseConfig=true)
OUString GetImportWildcard(sal_uInt16 nFormat, sal_Int32 nEntry)
ErrCode ImportGraphic(Graphic &rGraphic, const INetURLObject &rPath, sal_uInt16 nFormat=GRFILTER_FORMAT_DONTKNOW, sal_uInt16 *pDeterminedFormat=nullptr, GraphicFilterImportFlags nImportFlags=GraphicFilterImportFlags::NONE)
static ErrCode readPCX(SvStream &rStream, Graphic &rGraphic)
FilterConfigCache * pConfig
OUString GetExportFormatMediaType(sal_uInt16 nFormat)
static ErrCode readGIF(SvStream &rStream, Graphic &rGraphic, GfxLinkType &rLinkType)
static ErrCode LoadGraphic(const OUString &rPath, const OUString &rFilter, Graphic &rGraphic, GraphicFilter *pFilter=nullptr, sal_uInt16 *pDeterminedFormat=nullptr)
OUString GetExportInternalFilterName(sal_uInt16 nFormat)
std::optional< ErrCode > mxErrorEx
Information about errors during the GraphicFilter operation.
OUString GetImportFormatTypeName(sal_uInt16 nFormat)
ErrCode compressAsPNG(const Graphic &rGraphic, SvStream &rOutputStream)
static ErrCode readSVG(SvStream &rStream, Graphic &rGraphic, GfxLinkType &rLinkType, BinaryDataContainer &rpGraphicContent)
static ErrCode readTIFF(SvStream &rStream, Graphic &rGraphic, GfxLinkType &rLinkType)
void ImportGraphics(std::vector< std::shared_ptr< Graphic > > &rGraphics, std::vector< std::unique_ptr< SvStream > > vStreams)
Imports multiple graphics.
static ErrCode readPNG(SvStream &rStream, Graphic &rGraphic, GfxLinkType &rLinkType, BinaryDataContainer &rpGraphicContent)
void SetPrefMapMode(const MapMode &rPrefMapMode)
void SetDummyContext(bool value)
const GDIMetaFile & GetGDIMetaFile() const
bool IsDummyContext() const
GraphicType GetType() const
void SetGfxLink(const std::shared_ptr< GfxLink > &rGfxLink)
GfxLink GetGfxLink() const
const BitmapEx & GetBitmapExRef() const
Gives direct access to the contained BitmapEx.
BitmapEx GetBitmapEx(const GraphicConversionParameters &rParameters=GraphicConversionParameters()) const
MapMode GetPrefMapMode() const
void Draw(OutputDevice &rOutDev, const Point &rDestPt) const
std::shared_ptr< GraphicReader > & GetReaderContext()
void SetPrefSize(const Size &rPrefSize)
const std::shared_ptr< VectorGraphicData > & getVectorGraphicData() const
SAL_DLLPRIVATE ImpGraphic * ImplGetImpGraphic() const
OUString GetMainURL(DecodeMechanism eMechanism, rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8) const
INetProtocol GetProtocol() const
void setPrepared(bool bAnimated, const Size *pSizeHint)
MapUnit GetMapUnit() const
SAL_WARN_UNUSED_RESULT Point PixelToLogic(const Point &rDevicePt) const
SAL_WARN_UNUSED_RESULT Point LogicToLogic(const Point &rPtSource, const MapMode *pMapModeSource, const MapMode *pMapModeDest) const
constexpr tools::Long getHeight() const
constexpr tools::Long Height() const
constexpr tools::Long getWidth() const
void setWidth(tools::Long nWidth)
void setHeight(tools::Long nHeight)
constexpr tools::Long Width() const
virtual void ResetError()
void SetBufferSize(sal_uInt16 m_nBufSize)
sal_uInt16 GetBufferSize() const
std::size_t WriteBytes(const void *pData, std::size_t nSize)
void SetVersion(sal_Int32 n)
sal_uInt64 Seek(sal_uInt64 nPos)
std::size_t ReadBytes(void *pData, std::size_t nSize)
sal_uInt64 remainingSize()
SvStream & Write(const GDIMetaFile &rMetaFile)
void readGraphic(Graphic &rGraphic)
tools::Long Decompress(SvStream &rIStm, SvStream &rOStm)
void SetCompressionMetadata(const OString &sFilename, sal_uInt32 nLastModifiedTime, sal_uInt32 nInBufCRC32)
static bool IsZCompressed(SvStream &rIStm)
tools::Long EndCompression()
void BeginCompression(int nCompressLevel=ZCODEC_DEFAULT_COMPRESSION, bool gzLib=false)
void Compress(SvStream &rIStm, SvStream &rOStm)
static ThreadPool & getSharedOptimalPool()
void waitUntilDone(const std::shared_ptr< ThreadTaskTag > &, bool bJoin=true)
static std::shared_ptr< ThreadTaskTag > createThreadTaskTag()
void pushTask(std::unique_ptr< ThreadTask > pTask)
static std::unique_ptr< SvStream > CreateStream(const OUString &rFileName, StreamMode eOpenMode, css::uno::Reference< css::awt::XWindow > xParentWin=nullptr)
bool read(BitmapEx &rBitmap)
static BinaryDataContainer getMicrosoftGifChunk(SvStream &rStream)
void setParameters(css::uno::Sequence< css::beans::PropertyValue > const &rParameters)
bool write(const BitmapEx &rBitmap)
This template handles BitmapAccess the RAII way.
bool ExportGifGraphic(SvStream &rStream, const Graphic &rGraphic, FilterConfigItem *pConfigItem)
#define ERRCODE_IO_PENDING
bool ExportTiffGraphicImport(SvStream &rStream, const Graphic &rGraphic, const FilterConfigItem *pFilterConfigItem)
bool ExportEpsGraphic(SvStream &rStream, const Graphic &rGraphic, FilterConfigItem *pFilterConfigItem)
GfxLinkType
GfxLink graphic types that are supported by GfxLink.
VCL_DLLPUBLIC bool ImportGIF(SvStream &rStm, Graphic &rGraphic)
bool IsGIFAnimated(SvStream &rStm, Size &rLogicSize)
static OUString ImpGetExtension(std::u16string_view rPath)
static Graphic ImpGetScaledGraphic(const Graphic &rGraphic, FilterConfigItem &rConfigItem)
static bool supportNativeWebp()
static std::mutex & getListMutex()
static std::vector< GraphicFilter * > gaFilterHdlList
IMPL_LINK(GraphicFilter, FilterCallback, ConvertData &, rData, bool)
constexpr OUStringLiteral SVG_SHORTNAME
#define GRFILTER_FORMAT_DONTKNOW
constexpr OUStringLiteral MET_SHORTNAME
constexpr OUStringLiteral PCT_SHORTNAME
#define ERRCODE_GRFILTER_OPENERROR
constexpr OUStringLiteral GIF_SHORTNAME
constexpr OUStringLiteral WEBP_SHORTNAME
constexpr OUStringLiteral TIF_SHORTNAME
constexpr OUStringLiteral WMF_SHORTNAME
constexpr OUStringLiteral BMP_SHORTNAME
#define ERRCODE_GRFILTER_TOOBIG
#define ERRCODE_GRFILTER_FORMATERROR
#define ERRCODE_GRFILTER_FILTERERROR
#define ERRCODE_GRFILTER_IOERROR
@ UseExistingBitmap
Read pixel data into an existing bitmap.
@ OnlyCreateBitmap
Only create a bitmap, do not read pixel data.
constexpr OUStringLiteral JPG_SHORTNAME
#define ERRCODE_GRFILTER_VERSIONERROR
constexpr OUStringLiteral EMF_SHORTNAME
constexpr OUStringLiteral PNG_SHORTNAME
constexpr OUStringLiteral SVM_SHORTNAME
GtkMediaStream * m_pStream
bool ImportDxfGraphic(SvStream &rStream, Graphic &rGraphic)
bool ImportEpsGraphic(SvStream &rStream, Graphic &rGraphic)
Sequence< PropertyValue > aArguments
bool ImportMetGraphic(SvStream &rStream, Graphic &rGraphic)
bool ImportPbmGraphic(SvStream &rStream, Graphic &rGraphic)
bool ImportPcdGraphic(SvStream &rStream, Graphic &rGraphic, FilterConfigItem *pConfigItem)
bool ImportPcxGraphic(SvStream &rStream, Graphic &rGraphic)
bool ImportPictGraphic(SvStream &rIStm, Graphic &rGraphic)
bool ImportPsdGraphic(SvStream &rStream, Graphic &rGraphic)
bool ImportRasGraphic(SvStream &rStream, Graphic &rGraphic)
bool ImportTgaGraphic(SvStream &rStream, Graphic &rGraphic)
bool ImportTiffGraphicImport(SvStream &rTIFF, Graphic &rGraphic)
bool ExportJPEG(SvStream &rOutputStream, const Graphic &rGraphic, const css::uno::Sequence< css::beans::PropertyValue > *pFilterData, bool *pExportWasGrey)
VCL_DLLPUBLIC bool ImportJPEG(SvStream &rInputStream, Graphic &rGraphic, GraphicFilterImportFlags nImportFlags, BitmapScopedWriteAccess *ppAccess)
#define LINK(Instance, Class, Member)
#define SAL_INFO_IF(condition, area, stream)
#define SAL_WARN_IF(condition, area, stream)
#define SAL_INFO(area, stream)
css::beans::PropertyValue makePropertyValue(const OUString &rName, T &&rValue)
bool equalsIgnoreAsciiCase(std::u16string_view s1, std::u16string_view s2)
constexpr bool starts_with(std::basic_string_view< charT, traits > sv, std::basic_string_view< charT, traits > x) noexcept
UNOTOOLS_DLLPUBLIC bool IsDocument(OUString const &url)
UNOTOOLS_DLLPUBLIC bool Kill(OUString const &url)
bool ImportPDF(SvStream &rStream, Graphic &rGraphic)
Imports a PDF stream into rGraphic.
bool ImportPNG(SvStream &rInputStream, Graphic &rGraphic, GraphicFilterImportFlags nImportFlags, BitmapScopedWriteAccess *pAccess, AlphaScopedWriteAccess *pAlphaAccess)
bool peekGraphicFormat(SvStream &rStream, OUString &rFormatExtension, bool bTest)
HashMap_OWString_Interface aMap
bool ImportWebpGraphic(SvStream &rStream, Graphic &rGraphic)
#define STREAM_SEEK_TO_END
#define STREAM_SEEK_TO_BEGIN
const Reference< XComponentContext > & m_rContext
bool ConvertGraphicToWMF(const Graphic &rGraphic, SvStream &rTargetStream, FilterConfigItem const *pConfigItem, bool bPlaceable)
bool ConvertGDIMetaFileToEMF(const GDIMetaFile &rMTF, SvStream &rTargetStream)
bool ExportWebpGraphic(SvStream &rStream, const Graphic &rGraphic, FilterConfigItem *pFilterConfigItem)
VCL_DLLPUBLIC bool ImportXBM(SvStream &rStm, Graphic &rGraphic)
VCL_DLLPUBLIC bool ImportXPM(SvStream &rStm, Graphic &rGraphic)
#define ZCODEC_DEFAULT_COMPRESSION