diff options
-rw-r--r-- | sw/qa/extras/rtfimport/data/fdo76633.rtf | 32 | ||||
-rw-r--r-- | sw/qa/extras/rtfimport/rtfimport.cxx | 15 | ||||
-rw-r--r-- | writerfilter/source/rtftok/rtfdocumentimpl.cxx | 12 | ||||
-rw-r--r-- | writerfilter/source/rtftok/rtfsdrimport.cxx | 6 | ||||
-rw-r--r-- | writerfilter/source/rtftok/rtfsdrimport.hxx | 3 |
5 files changed, 62 insertions, 6 deletions
diff --git a/sw/qa/extras/rtfimport/data/fdo76633.rtf b/sw/qa/extras/rtfimport/data/fdo76633.rtf new file mode 100644 index 000000000000..d339b12e2917 --- /dev/null +++ b/sw/qa/extras/rtfimport/data/fdo76633.rtf @@ -0,0 +1,32 @@ +{\rtf1\ansi +{\*\generator LibreOfficeDev/4.4.0.0.alpha0$Linux_X86_64 LibreOffice_project/b534967caca6767cd2100da363b1da2433640ddd} +{\*\shppict{\pict{\*\picprop{\sp{\sn wzDescription}{\sv }}{\sp{\sn wzName}{\sv }}}\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0\picw64\pich60\picwgoal1280\pichgoal1200\jpegblip +ffd8ffe000104a46494600010101004800480000ffe101604578696600004d4d002a000000080009010e00020000000100000000010f0002000000060000007a +011000020000001500000080011200030000000100010000011a00050000000100000096011b0005000000010000009e01280003000000010002000001310002 +0000000c000000a68769000400000001000000b20000000043616e6f6e0043616e6f6e20506f77657253686f7420413531300000000000480000000100000048 +0000000147494d5020322e362e3131000009829a00050000000100000124829d0005000000010000012c88270003000000010000000090000007000000043032 +3130900300020000001400000134920a00050000000100000148928600070000000800000150a00000070000000430313030a001000300000001ffff00000000 +00000051eb85ffffffff0000000400000001323031313a30363a31322031393a32363a3436000000001000000001554e49434f444500ffdb0043000806060706 +05080707070909080a0c140d0c0b0b0c1912130f141d1a1f1e1d1a1c1c20242e2720222c231c1c2837292c30313434341f27393d38323c2e333432ffdb004301 +0909090c0b0c180d0d1832211c213232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232 +ffc0001108003c004003012200021101031101ffc4001a000002030101000000000000000000000004050203060100ffc4003210000201030302050302050500 +000000000102030004110512213151132241617106143242911523a1c1e17281b1d1f0ffc400190101010101010100000000000000000000010200030405ffc4 +001d110002020203010000000000000000000000010211213103225141ffda000c03010002110311003f007e1df6912a2c9e8372f27fdc509731bc571f731065 +8b1b668f180bcf0c3e3d7da99c6ca3cf24783ed5cbd1b6d8c91287232319ea3b7c57cc3d82cbdd5adecf62c9b9e50be6551d3e6975d7d49163f976ec47405985 +461fa6defa797c49e73264332a614007b64e71e993da8a6fa26d9b02459ca8f533e7fe055df1ad93d9e81edbea8831992270c060ed20d7351d76316ea6c9f6cb +2379ba7007b50b7bf467dabaf812c881f254b9ca8f63eb54e816da6dd4d2e9978a535589cf926fc5d7b2907b7355d2ad076d0136b5746e15da77dcbd8fbf6ada +0769144858052a0e3b8a51aae876a34b98ac31c4f1a92194739a274f995b4cb7594296f0c0233d7ff62a66d35686298dadc1958a89627e7aa9dbd7d0a9fed5c9 +199565555c323608cf0738ff001553b9824dc5778f6f37a54cb89e4dfbcf9941f4c71dea1942c86ff1acc9340764817c2970bc9c72323f7a7aba84aea4e0678e +0f18acb5bec3acdeba070e1b1c0e09029c2baf86482aa71fa813fd3d6a65156298d3ee5a67db22a6d230ca4fe5599fa8fe985bb432443c2b98fcd6f32b727d42 +934c22994b30cb021b9214f1c7bfad1e2fa27b6922b91cc433b80f6c8c0ef5a2dc5e0cf3b10e8badaeb7612595f0116ab0a14911b8f1401f97cf7ab6cadd52d8 +44e780be50f80323af3e99a5b7f6f8d5edb53b3c7de6e2bb0ae04a30723fd445398d0f86889e424701b079aa963408b2662a049092c18ed200cd4236731c4f9c +7246339aba1b83185049f7e7d4f7cd0f730cd736720b6f0dd8e498d9f6ab8edd29fa0cc83eb725bdd4a2d88f348497c641f807a579b59bb698399873fa71c0cf +b502da16b0d3304b275009e0b00073e849a99d175a4600d8bf27960ca40f9e6bbd44e76c3df57ba38669cee1ea3028cd2f5dbcbabb4b090f8aae0e18e015e339 +f7ff00349a6d1355455678939e021917767f7a23e9bb37fe2c65b872823181b39e4fa1ed44a31a14dd9a2d4d360b62ea1b1386ebedd28a376890659d843fa8c9 +d71ff79a13584630c1b18bb8940c28f53d28a8bc4306638f3819219871f39e95c19d11631324061207dc6762b95cec61dc0f71fd69969f0d9ff0f8e2ba01655d +d9c291ce4f208e71cd7a3b48597c464cbb1de5ba1cf1daaefb189433465e321b8d871d41a993148b25d26d76f98b0e47490f3f3533a4da642a028e0648ce78a5 +1717973671954999f613867e49c9c609edc554faadda40ec24e9818f91454bd3606efa05a4cd993c49075db9c0c8f8aea68f681b7a0973c91e62c47ef40a5ecc +d023b90c73b79cf4aaef6e678d86d95c33851bb3c8cf6f4a5a97a6c1ed6ece3b7804b02ac9b86c1c12d93c8c01d7a1a147871a239dc84f250b647b64d4e79a53 +0c71072a646c175fc8704e476e959db6bdb892cd54c9b40214ed00646ec7f7aa8a6d03747fffd9}} + +\par } diff --git a/sw/qa/extras/rtfimport/rtfimport.cxx b/sw/qa/extras/rtfimport/rtfimport.cxx index e8f40c85ef37..ee7d9719e332 100644 --- a/sw/qa/extras/rtfimport/rtfimport.cxx +++ b/sw/qa/extras/rtfimport/rtfimport.cxx @@ -569,6 +569,21 @@ DECLARE_RTFIMPORT_TEST(testFdo52066, "fdo52066.rtf") CPPUNIT_ASSERT_EQUAL(sal_Int32(TWIP_TO_MM100(19)), xShape->getSize().Height); } +DECLARE_RTFIMPORT_TEST(testFdo76633, "fdo76633.rtf") +{ + // check that there is only a graphic object, not an additional rectangle + uno::Reference<lang::XServiceInfo> xShape(getShape(1), uno::UNO_QUERY); + CPPUNIT_ASSERT(xShape.is()); +#if 0 + // disabled - fails currently + CPPUNIT_ASSERT(xShape->supportsService("com.sun.star.text.TextGraphicObject")); + try { + uno::Reference<drawing::XShape> xShape2(getShape(2), uno::UNO_QUERY); + CPPUNIT_FAIL("exception expected"); + } catch (lang::IndexOutOfBoundsException const&) { /* expected */ } +#endif +} + DECLARE_RTFIMPORT_TEST(testFdo48033, "fdo48033.rtf") { /* diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx index 67285b09b3da..dd14ca53b312 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx @@ -1391,7 +1391,8 @@ void RTFDocumentImpl::replayBuffer(RTFBuffer_t& rBuffer, else if (boost::get<0>(aTuple) == BUFFER_PAR) parBreak(); else if (boost::get<0>(aTuple) == BUFFER_STARTSHAPE) - m_pSdrImport->resolve(boost::get<1>(aTuple)->getShape(), false); + m_pSdrImport->resolve(boost::get<1>(aTuple)->getShape(), false, + RTFSdrImport::SHAPE); else if (boost::get<0>(aTuple) == BUFFER_ENDSHAPE) m_pSdrImport->close(); else @@ -1660,7 +1661,8 @@ int RTFDocumentImpl::dispatchDestination(RTFKeyword nKeyword) if (nKeyword == RTF_SHPTXT) { if (!m_aStates.top().pCurrentBuffer) - m_pSdrImport->resolve(m_aStates.top().aShape, false); + m_pSdrImport->resolve(m_aStates.top().aShape, false, + RTFSdrImport::SHAPE); else { RTFValue::Pointer_t pValue(new RTFValue(m_aStates.top().aShape)); @@ -4326,7 +4328,11 @@ int RTFDocumentImpl::popState() case DESTINATION_SHAPEINSTRUCTION: // Don't trigger a shape import in case we're only leaving the \shpinst of the groupshape itself. if (!m_bObject && !aState.bInListpicture && !aState.bHadShapeText && !(aState.bInShapeGroup && !aState.bInShape)) - m_pSdrImport->resolve(m_aStates.top().aShape, true); + { + m_pSdrImport->resolve(m_aStates.top().aShape, true, + (aState.nDestinationState == DESTINATION_SHAPEINSTRUCTION) + ? RTFSdrImport::SHAPE : RTFSdrImport::PICT); + } else if (aState.bInShapeGroup && !aState.bInShape) { // End of a groupshape, as we're in shapegroup, but not in a real shape. diff --git a/writerfilter/source/rtftok/rtfsdrimport.cxx b/writerfilter/source/rtftok/rtfsdrimport.cxx index 778841446e3e..e855086561e2 100644 --- a/writerfilter/source/rtftok/rtfsdrimport.cxx +++ b/writerfilter/source/rtftok/rtfsdrimport.cxx @@ -212,7 +212,8 @@ void RTFSdrImport::applyProperty(uno::Reference<drawing::XShape> xShape, OUStrin } } -void RTFSdrImport::resolve(RTFShape& rShape, bool bClose) +void RTFSdrImport::resolve(RTFShape& rShape, bool bClose, + ShapeOrPict const shapeOrPict) { int nType = -1; bool bPib = false; @@ -243,7 +244,8 @@ void RTFSdrImport::resolve(RTFShape& rShape, bool bClose) bool bOpaque = true; // The spec doesn't state what is the default for shapeType, Word seems to implement it as a rectangle. - if (std::find_if(rShape.aProperties.begin(), + if (SHAPE == shapeOrPict && + std::find_if(rShape.aProperties.begin(), rShape.aProperties.end(), boost::bind(&OUString::equals, boost::bind(&std::pair<OUString, OUString>::first, _1), OUString("shapeType"))) == rShape.aProperties.end()) diff --git a/writerfilter/source/rtftok/rtfsdrimport.hxx b/writerfilter/source/rtftok/rtfsdrimport.hxx index 31d08b4bba5b..e4fbaae8a825 100644 --- a/writerfilter/source/rtftok/rtfsdrimport.hxx +++ b/writerfilter/source/rtftok/rtfsdrimport.hxx @@ -23,7 +23,8 @@ namespace writerfilter { RTFSdrImport(RTFDocumentImpl& rImport, uno::Reference<lang::XComponent> const& xDstDoc); virtual ~RTFSdrImport(); - void resolve(RTFShape& rShape, bool bClose); + enum ShapeOrPict { SHAPE, PICT }; + void resolve(RTFShape& rShape, bool bClose, ShapeOrPict shapeOrPict); void close(); void append(OUString aKey, OUString aValue); /// Append property on the current parent. |