summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--svtools/CppunitTest_svtools_graphic.mk31
-rw-r--r--svtools/qa/unit/GraphicObjectTest.cxx34
-rw-r--r--svtools/qa/unit/data/pdf.odtbin0 -> 18113 bytes
-rw-r--r--vcl/source/gdi/impgraph.cxx36
4 files changed, 65 insertions, 36 deletions
diff --git a/svtools/CppunitTest_svtools_graphic.mk b/svtools/CppunitTest_svtools_graphic.mk
index 9636c7dc33c7..17056e51d0da 100644
--- a/svtools/CppunitTest_svtools_graphic.mk
+++ b/svtools/CppunitTest_svtools_graphic.mk
@@ -45,36 +45,7 @@ $(eval $(call gb_CppunitTest_use_custom_headers,svtools_graphic,\
$(eval $(call gb_CppunitTest_use_configuration,svtools_graphic))
-$(eval $(call gb_CppunitTest_use_components,svtools_graphic,\
- basic/util/sb \
- comphelper/util/comphelp \
- configmgr/source/configmgr \
- embeddedobj/util/embobj \
- filter/source/config/cache/filterconfig1 \
- filter/source/storagefilterdetect/storagefd \
- framework/util/fwk \
- i18npool/util/i18npool \
- linguistic/source/lng \
- oox/util/oox \
- package/source/xstor/xstor \
- package/util/package2 \
- sax/source/expatwrap/expwrap \
- sfx2/util/sfx \
- starmath/util/sm \
- svl/source/fsstor/fsstorage \
- svtools/util/svt \
- sw/util/sw \
- sw/util/swd \
- toolkit/util/tk \
- ucb/source/core/ucb1 \
- ucb/source/ucp/file/ucpfile1 \
- unotools/util/utl \
- unoxml/source/service/unoxml \
- uui/util/uui \
- writerfilter/util/writerfilter \
- $(if $(filter DESKTOP,$(BUILD_TYPE)),xmlhelp/util/ucpchelp1) \
- xmloff/util/xo \
-))
+$(eval $(call gb_CppunitTest_use_rdb,svtools_graphic,services))
$(eval $(call gb_CppunitTest_add_exception_objects,svtools_graphic, \
svtools/qa/unit/GraphicObjectTest \
diff --git a/svtools/qa/unit/GraphicObjectTest.cxx b/svtools/qa/unit/GraphicObjectTest.cxx
index 22664425677f..c785fadd4890 100644
--- a/svtools/qa/unit/GraphicObjectTest.cxx
+++ b/svtools/qa/unit/GraphicObjectTest.cxx
@@ -41,6 +41,7 @@ public:
void testSizeBasedAutoSwap();
void testTdf88836();
void testTdf88935();
+ void testPdf();
virtual void setUp() override
@@ -59,6 +60,7 @@ private:
CPPUNIT_TEST(testSizeBasedAutoSwap);
CPPUNIT_TEST(testTdf88836);
CPPUNIT_TEST(testTdf88935);
+ CPPUNIT_TEST(testPdf);
CPPUNIT_TEST_SUITE_END();
};
@@ -307,6 +309,38 @@ void GraphicObjectTest::testTdf88935()
xComponent->dispose();
}
+void GraphicObjectTest::testPdf()
+{
+ uno::Reference<lang::XComponent> xComponent = loadFromDesktop(m_directories.getURLFromSrc("svtools/qa/unit/data/pdf.odt"), "com.sun.star.text.TextDocument");
+ SwXTextDocument* pTxtDoc = dynamic_cast<SwXTextDocument*>(xComponent.get());
+ CPPUNIT_ASSERT(pTxtDoc);
+ SwDoc* pDoc = pTxtDoc->GetDocShell()->GetDoc();
+ CPPUNIT_ASSERT(pDoc);
+ SwNodes& aNodes = pDoc->GetNodes();
+
+ // Find images
+ GraphicObject* pGraphicObject = nullptr;
+ for( sal_uLong nIndex = 0; nIndex < aNodes.Count(); ++nIndex)
+ {
+ if( aNodes[nIndex]->IsGrfNode() )
+ {
+ SwGrfNode* pGrfNode = aNodes[nIndex]->GetGrfNode();
+ CPPUNIT_ASSERT(pGrfNode);
+ pGraphicObject = const_cast<GraphicObject*>(&pGrfNode->GetGrfObj());
+ break;
+ }
+ }
+ CPPUNIT_ASSERT_MESSAGE("Missing image", pGraphicObject);
+
+ CPPUNIT_ASSERT(pGraphicObject->GetGraphic().getPdfData().hasElements());
+ pGraphicObject->SwapOut();
+ pGraphicObject->SwapIn();
+ // This failed, swap out + swap in lost the PDF data.
+ CPPUNIT_ASSERT(pGraphicObject->GetGraphic().getPdfData().hasElements());
+
+ xComponent->dispose();
+}
+
CPPUNIT_TEST_SUITE_REGISTRATION(GraphicObjectTest);
}
diff --git a/svtools/qa/unit/data/pdf.odt b/svtools/qa/unit/data/pdf.odt
new file mode 100644
index 000000000000..f20b389207d6
--- /dev/null
+++ b/svtools/qa/unit/data/pdf.odt
Binary files differ
diff --git a/vcl/source/gdi/impgraph.cxx b/vcl/source/gdi/impgraph.cxx
index 25d82d8fc8ac..82e6b74b6071 100644
--- a/vcl/source/gdi/impgraph.cxx
+++ b/vcl/source/gdi/impgraph.cxx
@@ -51,6 +51,8 @@
#define GRAPHIC_FORMAT_50 static_cast<sal_uInt32>(COMPAT_FORMAT( 'G', 'R', 'F', '5' ))
#define NATIVE_FORMAT_50 static_cast<sal_uInt32>(COMPAT_FORMAT( 'N', 'A', 'T', '5' ))
+const sal_uInt32 nPdfMagic((sal_uInt32('p') << 24) | (sal_uInt32('d') << 16) | (sal_uInt32('f') << 8) | sal_uInt32('0'));
+
using namespace com::sun::star;
struct ImpSwapFile
@@ -1553,11 +1555,7 @@ SvStream& ReadImpGraphic( SvStream& rIStm, ImpGraphic& rImpGraphic )
rIStm.ResetError();
rIStm.ReadUInt32( nMagic );
- if (nSvgMagic != nMagic)
- {
- rIStm.SetError(nOrigError);
- }
- else
+ if (nSvgMagic == nMagic)
{
sal_uInt32 nSvgDataArrayLength(0);
rIStm.ReadUInt32(nSvgDataArrayLength);
@@ -1580,6 +1578,24 @@ SvStream& ReadImpGraphic( SvStream& rIStm, ImpGraphic& rImpGraphic )
}
}
}
+ else if (nMagic == nPdfMagic)
+ {
+ // Stream in PDF data.
+ sal_uInt32 nPdfDataLength = 0;
+ rIStm.ReadUInt32(nPdfDataLength);
+
+ if (nPdfDataLength)
+ {
+ uno::Sequence<sal_Int8> aPdfData(nPdfDataLength);
+ rIStm.ReadBytes(aPdfData.getArray(), nPdfDataLength);
+ if (!rIStm.GetError())
+ rImpGraphic.maPdfData = aPdfData;
+ }
+ }
+ else
+ {
+ rIStm.SetError(nOrigError);
+ }
rIStm.Seek(nStmPos1);
}
@@ -1601,7 +1617,8 @@ SvStream& WriteImpGraphic( SvStream& rOStm, const ImpGraphic& rImpGraphic )
{
if( ( rOStm.GetVersion() >= SOFFICE_FILEFORMAT_50 ) &&
( rOStm.GetCompressMode() & SvStreamCompressFlags::NATIVE ) &&
- rImpGraphic.mpGfxLink && rImpGraphic.mpGfxLink->IsNative() )
+ rImpGraphic.mpGfxLink && rImpGraphic.mpGfxLink->IsNative() &&
+ !rImpGraphic.maPdfData.hasElements())
{
// native format
rOStm.WriteUInt32( NATIVE_FORMAT_50 );
@@ -1656,6 +1673,13 @@ SvStream& WriteImpGraphic( SvStream& rOStm, const ImpGraphic& rImpGraphic )
default:
{
+ if (rImpGraphic.maPdfData.hasElements())
+ {
+ // Stream out PDF data.
+ rOStm.WriteUInt32(nPdfMagic);
+ rOStm.WriteUInt32(rImpGraphic.maPdfData.getLength());
+ rOStm.WriteBytes(rImpGraphic.maPdfData.getConstArray(), rImpGraphic.maPdfData.getLength());
+ }
if( rImpGraphic.ImplIsSupportedGraphic() )
WriteGDIMetaFile( rOStm, rImpGraphic.maMetaFile );
}