sw/qa/extras/rtfexport/data/abi10039.odt    |binary
 sw/qa/extras/rtfexport/rtfexport.cxx        |    6 ++++++
 sw/source/filter/ww8/rtfattributeoutput.cxx |   22 +++++++++++++++-------
 3 files changed, 21 insertions(+), 7 deletions(-)

New commits:
commit 845fb7bf6753ec9582d0b1d1c9b4276aa9e6c65e
Author: Miklos Vajna <vmik...@collabora.co.uk>
Date:   Fri Sep 5 10:36:08 2014 +0200

    abi#10039 RTF export: support page-anchored frames
    
    Change-Id: I71c961799f76446cdf24faeba86f881ae02ffe3b

diff --git a/sw/qa/extras/rtfexport/data/abi10039.odt 
b/sw/qa/extras/rtfexport/data/abi10039.odt
new file mode 100644
index 0000000..4d5dde5
Binary files /dev/null and b/sw/qa/extras/rtfexport/data/abi10039.odt differ
diff --git a/sw/qa/extras/rtfexport/rtfexport.cxx 
b/sw/qa/extras/rtfexport/rtfexport.cxx
index 63df389..f11f0bb 100644
--- a/sw/qa/extras/rtfexport/rtfexport.cxx
+++ b/sw/qa/extras/rtfexport/rtfexport.cxx
@@ -680,6 +680,12 @@ DECLARE_RTFEXPORT_TEST(testPictureWrapPolygon, 
"picture-wrap-polygon.rtf")
     CPPUNIT_ASSERT_EQUAL(sal_Int32(convertTwipToMm100(-67)), 
getProperty<sal_Int32>(getShape(1), "VertOrientPosition"));
 }
 
+DECLARE_RTFEXPORT_TEST(testAbi10039, "abi10039.odt")
+{
+    // Make sure we don't just crash on export, and additionally the shape 
should not be inline (as it's at-page anchored originally).
+    CPPUNIT_ASSERT(text::TextContentAnchorType_AS_CHARACTER != 
getProperty<text::TextContentAnchorType>(getShape(1), "AnchorType"));
+}
+
 #endif
 
 CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/sw/source/filter/ww8/rtfattributeoutput.cxx 
b/sw/source/filter/ww8/rtfattributeoutput.cxx
index 308e1f2..616631b 100644
--- a/sw/source/filter/ww8/rtfattributeoutput.cxx
+++ b/sw/source/filter/ww8/rtfattributeoutput.cxx
@@ -3696,8 +3696,16 @@ void RtfAttributeOutput::FlyFrameGraphic(const 
SwFlyFrmFmt* pFlyFrmFmt, const Sw
         aRendered.Height() = rS.GetHeight();
     }
 
-    const SwPosition* pAnchor = pFlyFrmFmt->GetAnchor().GetCntntAnchor();
-    sw::Frame aFrame(*pFlyFrmFmt, *pAnchor);
+    sw::Frame* pFrame = 0;
+    for (sw::FrameIter it = m_rExport.maFrames.begin(); it != 
m_rExport.maFrames.end(); ++it)
+    {
+        if (pFlyFrmFmt == &it->GetFrmFmt())
+        {
+            pFrame = &(*it);
+            break;
+        }
+    }
+    assert(pFrame);
 
     /*
        If the graphic is not of type WMF then we will have to store two
@@ -3706,7 +3714,7 @@ void RtfAttributeOutput::FlyFrameGraphic(const 
SwFlyFrmFmt* pFlyFrmFmt, const Sw
        a wmf already then we don't need any such wrapping
        */
     bool bIsWMF = pBLIPType && std::strcmp(pBLIPType, 
OOO_STRING_SVTOOLS_RTF_WMETAFILE) == 0;
-    if (aFrame.IsInline())
+    if (pFrame->IsInline())
     {
         if (!bIsWMF)
             m_rExport.Strm().WriteCharPtr("{" OOO_STRING_SVTOOLS_RTF_IGNORE 
OOO_STRING_SVTOOLS_RTF_SHPPICT);
@@ -3715,9 +3723,9 @@ void RtfAttributeOutput::FlyFrameGraphic(const 
SwFlyFrmFmt* pFlyFrmFmt, const Sw
     {
         m_rExport.Strm().WriteCharPtr("{" OOO_STRING_SVTOOLS_RTF_SHP "{" 
OOO_STRING_SVTOOLS_RTF_IGNORE OOO_STRING_SVTOOLS_RTF_SHPINST);
         m_pFlyFrameSize = &aRendered;
-        m_rExport.mpParentFrame = &aFrame;
+        m_rExport.mpParentFrame = pFrame;
         m_rExport.bOutFlyFrmAttrs = m_rExport.bRTFFlySyntax = true;
-        m_rExport.OutputFormat(aFrame.GetFrmFmt(), false, false, true);
+        m_rExport.OutputFormat(pFrame->GetFrmFmt(), false, false, true);
         m_rExport.bOutFlyFrmAttrs = m_rExport.bRTFFlySyntax = false;
         m_rExport.mpParentFrame = NULL;
         m_pFlyFrameSize = 0;
@@ -3760,7 +3768,7 @@ void RtfAttributeOutput::FlyFrameGraphic(const 
SwFlyFrmFmt* pFlyFrmFmt, const Sw
         m_rExport.Strm().WriteCharPtr("{" OOO_STRING_SVTOOLS_RTF_SP "{" 
OOO_STRING_SVTOOLS_RTF_SN " pib" "}{" OOO_STRING_SVTOOLS_RTF_SV " ");
     }
 
-    bool bWritePicProp = aFrame.IsInline();
+    bool bWritePicProp = pFrame->IsInline();
     if (pBLIPType)
         ExportPICT(pFlyFrmFmt, aSize, aRendered, aMapped, rCr, pBLIPType, 
pGraphicAry, nSize, m_rExport, &m_rExport.Strm(), bWritePicProp);
     else
@@ -3775,7 +3783,7 @@ void RtfAttributeOutput::FlyFrameGraphic(const 
SwFlyFrmFmt* pFlyFrmFmt, const Sw
         ExportPICT(pFlyFrmFmt, aSize, aRendered, aMapped, rCr, pBLIPType, 
pGraphicAry, nSize, m_rExport, &m_rExport.Strm(), bWritePicProp);
     }
 
-    if (aFrame.IsInline())
+    if (pFrame->IsInline())
     {
         if (!bIsWMF)
         {
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to