/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- *//* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */#include "docxsdrexport.hxx"#include <com/sun/star/drawing/PointSequenceSequence.hpp>#include <com/sun/star/xml/sax/XSAXSerializable.hpp>#include <com/sun/star/xml/sax/Writer.hpp>#include <com/sun/star/xml/dom/XNodeList.hpp>#include <editeng/unoprnms.hxx>#include <editeng/charrotateitem.hxx>#include <editeng/lrspitem.hxx>#include <editeng/ulspitem.hxx>#include <editeng/shaditem.hxx>#include <editeng/opaqitem.hxx>#include <editeng/boxitem.hxx>#include <svx/svdogrp.hxx>#include <oox/helper/propertyset.hxx>#include <oox/token/namespaces.hxx>#include <oox/token/relationship.hxx>#include <oox/token/properties.hxx>#include <textboxhelper.hxx>#include <fmtanchr.hxx>#include <fmtsrnd.hxx>#include <fmtcntnt.hxx>#include <ndtxt.hxx>#include <txatbase.hxx>#include <fmtfsize.hxx>#include <frmatr.hxx>#include "docxattributeoutput.hxx"#include "docxexportfilter.hxx"#include <comphelper/processfactory.hxx>#include <comphelper/seqstream.hxx>#include <comphelper/sequence.hxx>#include <comphelper/sequenceashashmap.hxx>#include <o3tl/make_unique.hxx>#include <sal/log.hxx>#include <IDocumentDrawModelAccess.hxx>usingnamespacecom::sun::star;usingnamespaceoox;namespace{uno::Sequence<beans::PropertyValue>lclGetProperty(constuno::Reference<drawing::XShape>&rShape,constOUString&rPropName){uno::Sequence<beans::PropertyValue>aResult;uno::Reference<beans::XPropertySet>xPropertySet(rShape,uno::UNO_QUERY);uno::Reference<beans::XPropertySetInfo>xPropSetInfo;if(!xPropertySet.is())returnaResult;xPropSetInfo=xPropertySet->getPropertySetInfo();if(xPropSetInfo.is()&&xPropSetInfo->hasPropertyByName(rPropName)){xPropertySet->getPropertyValue(rPropName)>>=aResult;}returnaResult;}OUStringlclGetAnchorIdFromGrabBag(constSdrObject*pObj){OUStringaResult;uno::Reference<drawing::XShape>xShape(const_cast<SdrObject*>(pObj)->getUnoShape(),uno::UNO_QUERY);OUStringaGrabBagName;uno::Reference<lang::XServiceInfo>xServiceInfo(xShape,uno::UNO_QUERY);if(xServiceInfo->supportsService("com.sun.star.text.TextFrame"))aGrabBagName="FrameInteropGrabBag";elseaGrabBagName="InteropGrabBag";uno::Sequence<beans::PropertyValue>propList=lclGetProperty(xShape,aGrabBagName);for(sal_Int32nProp=0;nProp<propList.getLength();++nProp){OUStringaPropName=propList[nProp].Name;if(aPropName=="AnchorId"){propList[nProp].Value>>=aResult;break;}}returnaResult;}voidlclMovePositionWithRotation(awt::Point&aPos,constSize&rSize,sal_Int64nRotation){// code from ImplEESdrWriter::ImplFlipBoundingBox (filter/source/msfilter/eschesdo.cxx)// TODO: refactorif(nRotation==0)return;if(nRotation<0)nRotation=(36000+nRotation)%36000;if(nRotation%18000==0)nRotation=0;while(nRotation>9000)nRotation=(18000-(nRotation%18000));doublefVal=static_cast<double>(nRotation)*F_PI18000;doublefCos=cos(fVal);doublefSin=sin(fVal);doublenWidthHalf=static_cast<double>(rSize.Width())/2;doublenHeightHalf=static_cast<double>(rSize.Height())/2;doublenXDiff=fSin*nHeightHalf+fCos*nWidthHalf-nWidthHalf;doublenYDiff=fSin*nWidthHalf+fCos*nHeightHalf-nHeightHalf;aPos.X+=nXDiff;aPos.Y+=nYDiff;}/// Determines if the anchor is inside a paragraph.boolIsAnchorTypeInsideParagraph(constww8::Frame*pFrame){constSwFormatAnchor&rAnchor=pFrame->GetFrameFormat().GetAttrSet().GetAnchor();returnrAnchor.GetAnchorId()!=RndStdIds::FLY_AT_PAGE;}}ExportDataSaveRestore::ExportDataSaveRestore(DocxExport&rExport,sal_uLongnStt,sal_uLongnEnd,ww8::Frameconst*pParentFrame):m_rExport(rExport){m_rExport.SaveData(nStt,nEnd);m_rExport.m_pParentFrame=pParentFrame;}ExportDataSaveRestore::~ExportDataSaveRestore(){m_rExport.RestoreData();}/// Holds data used by DocxSdrExport only.structDocxSdrExport::Impl{DocxSdrExport&m_rSdrExport;DocxExport&m_rExport;sax_fastparser::FSHelperPtrm_pSerializer;oox::drawingml::DrawingML*m_pDrawingML;constSize*m_pFlyFrameSize;boolm_bTextFrameSyntax;boolm_bDMLTextFrameSyntax;rtl::Reference<sax_fastparser::FastAttributeList>m_pFlyAttrList;rtl::Reference<sax_fastparser::FastAttributeList>m_pTextboxAttrList;OStringBufferm_aTextFrameStyle;boolm_bFrameBtLr;boolm_bDrawingOpen;boolm_bParagraphSdtOpen;boolm_bParagraphHasDrawing;///Flag for checking drawing in a paragraph.boolm_bFlyFrameGraphic;rtl::Reference<sax_fastparser::FastAttributeList>m_pFlyFillAttrList;sax_fastparser::FastAttributeList*m_pFlyWrapAttrList;sax_fastparser::FastAttributeList*m_pBodyPrAttrList;rtl::Reference<sax_fastparser::FastAttributeList>m_pDashLineStyleAttr;boolm_bDMLAndVMLDrawingOpen;/// List of TextBoxes in this document: they are exported as part of their shape, never alone./// Preserved rotation for TextFrames.sal_Int32m_nDMLandVMLTextFrameRotation;Impl(DocxSdrExport&rSdrExport,DocxExport&rExport,sax_fastparser::FSHelperPtrpSerializer,oox::drawingml::DrawingML*pDrawingML):m_rSdrExport(rSdrExport),m_rExport(rExport),m_pSerializer(std::move(pSerializer)),m_pDrawingML(pDrawingML),m_pFlyFrameSize(nullptr),m_bTextFrameSyntax(false),m_bDMLTextFrameSyntax(false),m_bFrameBtLr(false),m_bDrawingOpen(false),m_bParagraphSdtOpen(false),m_bParagraphHasDrawing(false),m_bFlyFrameGraphic(false),m_pFlyWrapAttrList(nullptr),m_pBodyPrAttrList(nullptr),m_bDMLAndVMLDrawingOpen(false),m_nDMLandVMLTextFrameRotation(0){}/// Writes wp wrapper code around an SdrObject, which itself is written using drawingML syntax.voidtextFrameShadow(constSwFrameFormat&rFrameFormat);staticboolisSupportedDMLShape(constuno::Reference<drawing::XShape>&xShape);/// Undo the text direction mangling done by the frame btLr handler in writerfilter::dmapper::DomainMapper::lcl_startCharacterGroup()boolcheckFrameBtlr(SwNode*pStartNode,boolbDML);};DocxSdrExport::DocxSdrExport(DocxExport&rExport,constsax_fastparser::FSHelperPtr&pSerializer,oox::drawingml::DrawingML*pDrawingML):m_pImpl(o3tl::make_unique<Impl>(*this,rExport,pSerializer,pDrawingML)){}DocxSdrExport::~DocxSdrExport()=default;voidDocxSdrExport::setSerializer(constsax_fastparser::FSHelperPtr&pSerializer){m_pImpl->m_pSerializer=pSerializer;}constSize*DocxSdrExport::getFlyFrameSize(){returnm_pImpl->m_pFlyFrameSize;}boolDocxSdrExport::getTextFrameSyntax(){returnm_pImpl->m_bTextFrameSyntax;}boolDocxSdrExport::getDMLTextFrameSyntax(){returnm_pImpl->m_bDMLTextFrameSyntax;}rtl::Reference<sax_fastparser::FastAttributeList>&DocxSdrExport::getFlyAttrList(){returnm_pImpl->m_pFlyAttrList;}rtl::Reference<sax_fastparser::FastAttributeList>&DocxSdrExport::getTextboxAttrList(){returnm_pImpl->m_pTextboxAttrList;}OStringBuffer&DocxSdrExport::getTextFrameStyle(){returnm_pImpl->m_aTextFrameStyle;}boolDocxSdrExport::getFrameBtLr(){returnm_pImpl->m_bFrameBtLr;}boolDocxSdrExport::IsDrawingOpen(){returnm_pImpl->m_bDrawingOpen;}voidDocxSdrExport::setParagraphSdtOpen(boolbParagraphSdtOpen){m_pImpl->m_bParagraphSdtOpen=bParagraphSdtOpen;}boolDocxSdrExport::IsDMLAndVMLDrawingOpen(){returnm_pImpl->m_bDMLAndVMLDrawingOpen;}boolDocxSdrExport::IsParagraphHasDrawing(){returnm_pImpl->m_bParagraphHasDrawing;}voidDocxSdrExport::setParagraphHasDrawing(boolbParagraphHasDrawing){m_pImpl->m_bParagraphHasDrawing=bParagraphHasDrawing;}rtl::Reference<sax_fastparser::FastAttributeList>&DocxSdrExport::getFlyFillAttrList(){returnm_pImpl->m_pFlyFillAttrList;}sax_fastparser::FastAttributeList*DocxSdrExport::getFlyWrapAttrList(){returnm_pImpl->m_pFlyWrapAttrList;}sax_fastparser::FastAttributeList*DocxSdrExport::getBodyPrAttrList(){returnm_pImpl->m_pBodyPrAttrList;}rtl::Reference<sax_fastparser::FastAttributeList>&DocxSdrExport::getDashLineStyle(){returnm_pImpl->m_pDashLineStyleAttr;}voidDocxSdrExport::setFlyWrapAttrList(sax_fastparser::FastAttributeList*pAttrList){m_pImpl->m_pFlyWrapAttrList=pAttrList;}voidDocxSdrExport::startDMLAnchorInline(constSwFrameFormat*pFrameFormat,constSize&rSize){m_pImpl->m_bDrawingOpen=true;m_pImpl->m_bParagraphHasDrawing=true;m_pImpl->m_pSerializer->startElementNS(XML_w,XML_drawing,FSEND);constSvxLRSpaceItemaLRSpaceItem=pFrameFormat->GetLRSpace(false);constSvxULSpaceItemaULSpaceItem=pFrameFormat->GetULSpace(false);boolisAnchor;if(m_pImpl->m_bFlyFrameGraphic){isAnchor=false;// make Graphic object inside DMLTextFrame & VMLTextFrame as Inline}else{isAnchor=pFrameFormat->GetAnchor().GetAnchorId()!=RndStdIds::FLY_AS_CHAR;}// Count effectExtent values, their value is needed before dist{T,B,L,R} is written.SvxShadowItemaShadowItem=pFrameFormat->GetShadow();sal_Int32nLeftExt=0,nRightExt=0,nTopExt=0,nBottomExt=0;if(aShadowItem.GetLocation()!=SvxShadowLocation::NONE){sal_Int32nShadowWidth(TwipsToEMU(aShadowItem.GetWidth()));switch(aShadowItem.GetLocation()){caseSvxShadowLocation::TopLeft:nTopExt=nLeftExt=nShadowWidth;break;caseSvxShadowLocation::TopRight:nTopExt=nRightExt=nShadowWidth;break;caseSvxShadowLocation::BottomLeft:nBottomExt=nLeftExt=nShadowWidth;break;caseSvxShadowLocation::BottomRight:nBottomExt=nRightExt=nShadowWidth;break;caseSvxShadowLocation::NONE:caseSvxShadowLocation::End:break;}}elseif(constSdrObject*pObject=pFrameFormat->FindRealSdrObject()){// No shadow, but we have an idea what was the original effectExtent.uno::AnyaAny;pObject->GetGrabBagItem(aAny);comphelper::SequenceAsHashMapaGrabBag(aAny);autoit=aGrabBag.find("CT_EffectExtent");if(it!=aGrabBag.end()){comphelper::SequenceAsHashMapaEffectExtent(it->second);for(std::pair<constOUString,uno::Any>&rDirection:aEffectExtent){if(rDirection.first=="l"&&rDirection.second.has<sal_Int32>())nLeftExt=rDirection.second.get<sal_Int32>();elseif(rDirection.first=="t"&&rDirection.second.has<sal_Int32>())nTopExt=rDirection.second.get<sal_Int32>();elseif(rDirection.first=="r"&&rDirection.second.has<sal_Int32>())nRightExt=rDirection.second.get<sal_Int32>();elseif(rDirection.first=="b"&&rDirection.second.has<sal_Int32>())nBottomExt=rDirection.second.get<sal_Int32>();}}}if(isAnchor){sax_fastparser::FastAttributeList*attrList=sax_fastparser::FastSerializerHelper::createAttrList();boolbOpaque=pFrameFormat->GetOpaque().GetValue();awt::PointaPos(pFrameFormat->GetHoriOrient().GetPos(),pFrameFormat->GetVertOrient().GetPos());constSdrObject*pObj=pFrameFormat->FindRealSdrObject();if(pObj!=nullptr){// SdrObjects know their layer, consider that instead of the frame format.bOpaque=pObj->GetLayer()!=pFrameFormat->GetDoc()->getIDocumentDrawModelAccess().GetHellId()&&pObj->GetLayer()!=pFrameFormat->GetDoc()->getIDocumentDrawModelAccess().GetInvisibleHellId();lclMovePositionWithRotation(aPos,rSize,pObj->GetRotateAngle());}attrList->add(XML_behindDoc,bOpaque?"0":"1");// The type of dist* attributes is unsigned, so make sure no negative value is written.sal_Int64nDistT=std::max(static_cast<sal_Int64>(0),TwipsToEMU(aULSpaceItem.GetUpper())-nTopExt);attrList->add(XML_distT,OString::number(nDistT).getStr());sal_Int64nDistB=std::max(static_cast<sal_Int64>(0),TwipsToEMU(aULSpaceItem.GetLower())-nBottomExt);attrList->add(XML_distB,OString::number(nDistB).getStr());sal_Int64nDistL=std::max(static_cast<sal_Int64>(0),TwipsToEMU(aLRSpaceItem.GetLeft())-nLeftExt);attrList->add(XML_distL,OString::number(nDistL).getStr());sal_Int64nDistR=std::max(static_cast<sal_Int64>(0),TwipsToEMU(aLRSpaceItem.GetRight())-nRightExt);attrList->add(XML_distR,OString::number(nDistR).getStr());attrList->add(XML_simplePos,"0");attrList->add(XML_locked,"0");attrList->add(XML_layoutInCell,"1");attrList->add(XML_allowOverlap,"1");// TODOif(pObj!=nullptr)// It seems 0 and 1 have special meaning: just start counting from 2 to avoid issues with that.attrList->add(XML_relativeHeight,OString::number(pObj->GetOrdNum()+2));else// relativeHeight is mandatory attribute, if value is not present, we must write default valueattrList->add(XML_relativeHeight,"0");if(pObj!=nullptr){OUStringsAnchorId=lclGetAnchorIdFromGrabBag(pObj);if(!sAnchorId.isEmpty())attrList->addNS(XML_wp14,XML_anchorId,OUStringToOString(sAnchorId,RTL_TEXTENCODING_UTF8));}sax_fastparser::XFastAttributeListRefxAttrList(attrList);m_pImpl->m_pSerializer->startElementNS(XML_wp,XML_anchor,xAttrList);m_pImpl->m_pSerializer->singleElementNS(XML_wp,XML_simplePos,XML_x,"0",XML_y,"0",FSEND);// required, unusedconstchar*relativeFromH;constchar*relativeFromV;constchar*alignH=nullptr;constchar*alignV=nullptr;switch(pFrameFormat->GetVertOrient().GetRelationOrient()){casetext::RelOrientation::PAGE_PRINT_AREA:relativeFromV="margin";break;casetext::RelOrientation::PAGE_FRAME:relativeFromV="page";break;casetext::RelOrientation::FRAME:relativeFromV="paragraph";break;casetext::RelOrientation::TEXT_LINE:default:relativeFromV="line";break;}switch(pFrameFormat->GetVertOrient().GetVertOrient()){casetext::VertOrientation::TOP:casetext::VertOrientation::CHAR_TOP:casetext::VertOrientation::LINE_TOP:if(pFrameFormat->GetVertOrient().GetRelationOrient()==text::RelOrientation::TEXT_LINE)alignV="bottom";elsealignV="top";break;casetext::VertOrientation::BOTTOM:casetext::VertOrientation::CHAR_BOTTOM:casetext::VertOrientation::LINE_BOTTOM:if(pFrameFormat->GetVertOrient().GetRelationOrient()==text::RelOrientation::TEXT_LINE)alignV="top";elsealignV="bottom";break;casetext::VertOrientation::CENTER:casetext::VertOrientation::CHAR_CENTER:casetext::VertOrientation::LINE_CENTER:alignV="center";break;default:break;}switch(pFrameFormat->GetHoriOrient().GetRelationOrient()){casetext::RelOrientation::PAGE_PRINT_AREA:relativeFromH="margin";break;casetext::RelOrientation::PAGE_FRAME:relativeFromH="page";break;casetext::RelOrientation::CHAR:relativeFromH="character";break;casetext::RelOrientation::PAGE_RIGHT:relativeFromH="rightMargin";break;casetext::RelOrientation::PAGE_LEFT:relativeFromH="leftMargin";break;casetext::RelOrientation::FRAME:default:relativeFromH="column";break;}switch(pFrameFormat->GetHoriOrient().GetHoriOrient()){casetext::HoriOrientation::LEFT:alignH="left";break;casetext::HoriOrientation::RIGHT:alignH="right";break;casetext::HoriOrientation::CENTER:alignH="center";break;casetext::HoriOrientation::INSIDE:alignH="inside";break;casetext::HoriOrientation::OUTSIDE:alignH="outside";break;default:break;}m_pImpl->m_pSerializer->startElementNS(XML_wp,XML_positionH,XML_relativeFrom,relativeFromH,FSEND);/** * Sizes of integral types * climits header defines constants with the limits of integral types for the specific system and compiler implementation used. * Use of this might cause platform dependent problem like posOffset exceed the limit. **/constsal_Int64MAX_INTEGER_VALUE=SAL_MAX_INT32;constsal_Int64MIN_INTEGER_VALUE=SAL_MIN_INT32;if(alignH!=nullptr){m_pImpl->m_pSerializer->startElementNS(XML_wp,XML_align,FSEND);m_pImpl->m_pSerializer->write(alignH);m_pImpl->m_pSerializer->endElementNS(XML_wp,XML_align);}else{m_pImpl->m_pSerializer->startElementNS(XML_wp,XML_posOffset,FSEND);sal_Int64nPosXEMU=TwipsToEMU(aPos.X);/* Absolute Position Offset Value is of type Int. Hence it should not be greater than * Maximum value for Int OR Less than the Minimum value for Int. * - Maximum value for Int = 2147483647 * - Minimum value for Int = -2147483648 * * As per ECMA Specification : ECMA-376, Second Edition, * Part 1 - Fundamentals And Markup Language Reference[20.4.3.3 ST_PositionOffset (Absolute Position Offset Value)] * * Please refer : http://www.schemacentral.com/sc/xsd/t-xsd_int.html */if(nPosXEMU>MAX_INTEGER_VALUE){nPosXEMU=MAX_INTEGER_VALUE;}elseif(nPosXEMU<MIN_INTEGER_VALUE){nPosXEMU=MIN_INTEGER_VALUE;}m_pImpl->m_pSerializer->write(nPosXEMU);m_pImpl->m_pSerializer->endElementNS(XML_wp,XML_posOffset);}m_pImpl->m_pSerializer->endElementNS(XML_wp,XML_positionH);m_pImpl->m_pSerializer->startElementNS(XML_wp,XML_positionV,XML_relativeFrom,relativeFromV,FSEND);sal_Int64nPosYEMU=TwipsToEMU(aPos.Y);// tdf#93675, 0 below line/paragraph and/or top line/paragraph with// wrap top+bottom or other wraps is affecting the line directly// above the anchor line, which seems odd, but a tiny adjustment// here to bring the top down convinces msoffice to wrap like usif(nPosYEMU==0&&(strcmp(relativeFromV,"line")==0||strcmp(relativeFromV,"paragraph")==0)&&(!alignV||strcmp(alignV,"top")==0)){alignV=nullptr;nPosYEMU=635;}if(alignV!=nullptr){m_pImpl->m_pSerializer->startElementNS(XML_wp,XML_align,FSEND);m_pImpl->m_pSerializer->write(alignV);m_pImpl->m_pSerializer->endElementNS(XML_wp,XML_align);}else{m_pImpl->m_pSerializer->startElementNS(XML_wp,XML_posOffset,FSEND);if(nPosYEMU>MAX_INTEGER_VALUE){nPosYEMU=MAX_INTEGER_VALUE;}elseif(nPosYEMU<MIN_INTEGER_VALUE){nPosYEMU=MIN_INTEGER_VALUE;}m_pImpl->m_pSerializer->write(nPosYEMU);m_pImpl->m_pSerializer->endElementNS(XML_wp,XML_posOffset);}m_pImpl->m_pSerializer->endElementNS(XML_wp,XML_positionV);}else{sax_fastparser::FastAttributeList*aAttrList=sax_fastparser::FastSerializerHelper::createAttrList();aAttrList->add(XML_distT,OString::number(TwipsToEMU(aULSpaceItem.GetUpper())).getStr());aAttrList->add(XML_distB,OString::number(TwipsToEMU(aULSpaceItem.GetLower())).getStr());aAttrList->add(XML_distL,OString::number(TwipsToEMU(aLRSpaceItem.GetLeft())).getStr());aAttrList->add(XML_distR,OString::number(TwipsToEMU(aLRSpaceItem.GetRight())).getStr());constSdrObject*pObj=pFrameFormat->FindRealSdrObject();if(pObj!=nullptr){OUStringsAnchorId=lclGetAnchorIdFromGrabBag(pObj);if(!sAnchorId.isEmpty())aAttrList->addNS(XML_wp14,XML_anchorId,OUStringToOString(sAnchorId,RTL_TEXTENCODING_UTF8));}m_pImpl->m_pSerializer->startElementNS(XML_wp,XML_inline,aAttrList);}// now the common parts// extent of the image/** * Extent width is of type long ( i.e cx & cy ) as * * per ECMA-376, Second Edition, Part 1 - Fundamentals And Markup Language Reference * [ 20.4.2.7 extent (Drawing Object Size)] * * cy is of type a:ST_PositiveCoordinate. * Minimum inclusive: 0 * Maximum inclusive: 27273042316900 * * reference : http://www.schemacentral.com/sc/ooxml/e-wp_extent-1.html * * Though ECMA mentions the max value as aforementioned. It appears that MSO does not * handle for the same, infact it actually can handles a max value of int32 i.e * 2147483647( MAX_INTEGER_VALUE ). * Therefore changing the following accordingly so that LO sync's up with MSO. **/sal_uInt64cx=0;sal_uInt64cy=0;constsal_Int64MAX_INTEGER_VALUE=SAL_MAX_INT32;// the 'Size' type uses 'long' for width and height, so on// platforms where 'long' is 32 bits they can obviously never be// larger than the max signed 32-bit integer.#if SAL_TYPES_SIZEOFLONG > 4if(rSize.Width()>MAX_INTEGER_VALUE)cx=MAX_INTEGER_VALUE;else#endif{if(0>rSize.Width())cx=0;elsecx=rSize.Width();}#if SAL_TYPES_SIZEOFLONG > 4if(rSize.Height()>MAX_INTEGER_VALUE)cy=MAX_INTEGER_VALUE;else#endif{if(0>rSize.Height())cy=0;elsecy=rSize.Height();}OStringaWidth(OString::number(TwipsToEMU(cx)));//we explicitly check the converted EMU value for the range as mentioned in above comment.aWidth=(aWidth.toInt64()>0?(aWidth.toInt64()>MAX_INTEGER_VALUE?I64S(MAX_INTEGER_VALUE):aWidth.getStr()):"0");OStringaHeight(OString::number(TwipsToEMU(cy)));aHeight=(aHeight.toInt64()>0?(aHeight.toInt64()>MAX_INTEGER_VALUE?I64S(MAX_INTEGER_VALUE):aHeight.getStr()):"0");m_pImpl->m_pSerializer->singleElementNS(XML_wp,XML_extent,XML_cx,aWidth,XML_cy,aHeight,FSEND);// effectExtent, extent including the effect (shadow only for now)m_pImpl->m_pSerializer->singleElementNS(XML_wp,XML_effectExtent,XML_l,OString::number(nLeftExt),XML_t,OString::number(nTopExt),XML_r,OString::number(nRightExt),XML_b,OString::number(nBottomExt),FSEND);// See if we know the exact wrap type from grab-bag.sal_Int32nWrapToken=0;if(constSdrObject*pObject=pFrameFormat->FindRealSdrObject()){uno::AnyaAny;pObject->GetGrabBagItem(aAny);comphelper::SequenceAsHashMapaGrabBag(aAny);autoit=aGrabBag.find("EG_WrapType");if(it!=aGrabBag.end()){autosType=it->second.get<OUString>();if(sType=="wrapTight")nWrapToken=XML_wrapTight;elseif(sType=="wrapThrough")nWrapToken=XML_wrapThrough;elseSAL_WARN("sw.ww8","DocxSdrExport::startDMLAnchorInline: unexpected EG_WrapType value");m_pImpl->m_pSerializer->startElementNS(XML_wp,nWrapToken,XML_wrapText,"bothSides",FSEND);it=aGrabBag.find("CT_WrapPath");if(it!=aGrabBag.end()){m_pImpl->m_pSerializer->startElementNS(XML_wp,XML_wrapPolygon,XML_edited,"0",FSEND);autoaSeqSeq=it->second.get<drawing::PointSequenceSequence>();autoaPoints(comphelper::sequenceToContainer<std::vector<awt::Point>>(aSeqSeq[0]));for(autoi=aPoints.begin();i!=aPoints.end();++i){awt::Point&rPoint=*i;m_pImpl->m_pSerializer->singleElementNS(XML_wp,(i==aPoints.begin()?XML_start:XML_lineTo),XML_x,OString::number(rPoint.X),XML_y,OString::number(rPoint.Y),FSEND);}m_pImpl->m_pSerializer->endElementNS(XML_wp,XML_wrapPolygon);}m_pImpl->m_pSerializer->endElementNS(XML_wp,nWrapToken);}}// Or if we have a contour.if(!nWrapToken&&pFrameFormat->GetSurround().IsContour()){if(constSwNoTextNode*pNd=sw::util::GetNoTextNodeFromSwFrameFormat(*pFrameFormat)){consttools::PolyPolygon*pPolyPoly=pNd->HasContour();if(pPolyPoly&&pPolyPoly->Count()){nWrapToken=XML_wrapTight;m_pImpl->m_pSerializer->startElementNS(XML_wp,nWrapToken,XML_wrapText,"bothSides",FSEND);m_pImpl->m_pSerializer->startElementNS(XML_wp,XML_wrapPolygon,XML_edited,"0",FSEND);tools::PolygonaPoly=sw::util::CorrectWordWrapPolygonForExport(*pPolyPoly,pNd);for(sal_uInt16i=0;i<aPoly.GetSize();++i)m_pImpl->m_pSerializer->singleElementNS(XML_wp,(i==0?XML_start:XML_lineTo),XML_x,OString::number(aPoly[i].X()),XML_y,OString::number(aPoly[i].Y()),FSEND);m_pImpl->m_pSerializer->endElementNS(XML_wp,XML_wrapPolygon);m_pImpl->m_pSerializer->endElementNS(XML_wp,nWrapToken);}}}// No? Then just approximate based on what we have.if(isAnchor&&!nWrapToken){switch(pFrameFormat->GetSurround().GetValue()){casecss::text::WrapTextMode_NONE:m_pImpl->m_pSerializer->singleElementNS(XML_wp,XML_wrapTopAndBottom,FSEND);break;casecss::text::WrapTextMode_THROUGH:m_pImpl->m_pSerializer->singleElementNS(XML_wp,XML_wrapNone,FSEND);break;casecss::text::WrapTextMode_PARALLEL:m_pImpl->m_pSerializer->singleElementNS(XML_wp,XML_wrapSquare,XML_wrapText,"bothSides",FSEND);break;casecss::text::WrapTextMode_DYNAMIC:default:m_pImpl->m_pSerializer->singleElementNS(XML_wp,XML_wrapSquare,XML_wrapText,"largest",FSEND);break;}}}voidDocxSdrExport::endDMLAnchorInline(constSwFrameFormat*pFrameFormat){boolisAnchor;if(m_pImpl->m_bFlyFrameGraphic){isAnchor=false;// end Inline Graphic object inside DMLTextFrame}else{isAnchor=pFrameFormat->GetAnchor().GetAnchorId()!=RndStdIds::FLY_AS_CHAR;}m_pImpl->m_pSerializer->endElementNS(XML_wp,isAnchor?XML_anchor:XML_inline);m_pImpl->m_pSerializer->endElementNS(XML_w,XML_drawing);m_pImpl->m_bDrawingOpen=false;}voidDocxSdrExport::writeVMLDrawing(constSdrObject*sdrObj,constSwFrameFormat&rFrameFormat){m_pImpl->m_pSerializer->startElementNS(XML_w,XML_pict,FSEND);m_pImpl->m_pDrawingML->SetFS(m_pImpl->m_pSerializer);// See WinwordAnchoring::SetAnchoring(), these are not part of the SdrObject, have to be passed around manually.constSwFormatHoriOrient&rHoriOri=rFrameFormat.GetHoriOrient();constSwFormatVertOrient&rVertOri=rFrameFormat.GetVertOrient();m_pImpl->m_rExport.VMLExporter().AddSdrObject(*sdrObj,rHoriOri.GetHoriOrient(),rVertOri.GetVertOrient(),rHoriOri.GetRelationOrient(),rVertOri.GetRelationOrient(),true);m_pImpl->m_pSerializer->endElementNS(XML_w,XML_pict);}staticboollcl_isLockedCanvas(constuno::Reference<drawing::XShape>&xShape){boolbRet=false;uno::Sequence<beans::PropertyValue>propList=lclGetProperty(xShape,"InteropGrabBag");for(sal_Int32nProp=0;nProp<propList.getLength();++nProp){OUStringpropName=propList[nProp].Name;if(propName=="LockedCanvas"){/* * Export as Locked Canvas only if the property * is in the PropertySet */bRet=true;break;}}returnbRet;}voidDocxSdrExport::writeDMLDrawing(constSdrObject*pSdrObject,constSwFrameFormat*pFrameFormat,intnAnchorId){uno::Reference<drawing::XShape>xShape(const_cast<SdrObject*>(pSdrObject)->getUnoShape(),uno::UNO_QUERY_THROW);if(!Impl::isSupportedDMLShape(xShape))return;m_pImpl->m_rExport.DocxAttrOutput().GetSdtEndBefore(pSdrObject);sax_fastparser::FSHelperPtrpFS=m_pImpl->m_pSerializer;SizeaSize(pSdrObject->GetLogicRect().GetWidth(),pSdrObject->GetLogicRect().GetHeight());startDMLAnchorInline(pFrameFormat,aSize);sax_fastparser::FastAttributeList*pDocPrAttrList=sax_fastparser::FastSerializerHelper::createAttrList();pDocPrAttrList->add(XML_id,OString::number(nAnchorId).getStr());pDocPrAttrList->add(XML_name,OUStringToOString(pSdrObject->GetName(),RTL_TEXTENCODING_UTF8).getStr());if(!pSdrObject->GetTitle().isEmpty())pDocPrAttrList->add(XML_title,OUStringToOString(pSdrObject->GetTitle(),RTL_TEXTENCODING_UTF8));if(!pSdrObject->GetDescription().isEmpty())pDocPrAttrList->add(XML_descr,OUStringToOString(pSdrObject->GetDescription(),RTL_TEXTENCODING_UTF8));sax_fastparser::XFastAttributeListRefxDocPrAttrListRef(pDocPrAttrList);pFS->singleElementNS(XML_wp,XML_docPr,xDocPrAttrListRef);uno::Reference<lang::XServiceInfo>xServiceInfo(xShape,uno::UNO_QUERY_THROW);constchar*pNamespace="http://schemas.microsoft.com/office/word/2010/wordprocessingShape";if(xServiceInfo->supportsService("com.sun.star.drawing.GroupShape"))pNamespace="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup";elseif(xServiceInfo->supportsService("com.sun.star.drawing.GraphicObjectShape"))pNamespace="http://schemas.openxmlformats.org/drawingml/2006/picture";pFS->startElementNS(XML_a,XML_graphic,FSNS(XML_xmlns,XML_a),OUStringToOString(m_pImpl->m_rExport.GetFilter().getNamespaceURL(OOX_NS(dml)),RTL_TEXTENCODING_UTF8).getStr(),FSEND);pFS->startElementNS(XML_a,XML_graphicData,XML_uri,pNamespace,FSEND);boolbLockedCanvas=lcl_isLockedCanvas(xShape);if(bLockedCanvas)pFS->startElementNS(XML_lc,XML_lockedCanvas,FSNS(XML_xmlns,XML_lc),OUStringToOString(m_pImpl->m_rExport.GetFilter().getNamespaceURL(OOX_NS(dmlLockedCanvas)),RTL_TEXTENCODING_UTF8).getStr(),FSEND);m_pImpl->m_rExport.OutputDML(xShape);if(bLockedCanvas)pFS->endElementNS(XML_lc,XML_lockedCanvas);pFS->endElementNS(XML_a,XML_graphicData);pFS->endElementNS(XML_a,XML_graphic);// Relative size of the drawing.if(pSdrObject->GetRelativeWidth()){// At the moment drawinglayer objects are always relative from page.pFS->startElementNS(XML_wp14,XML_sizeRelH,XML_relativeFrom,(pSdrObject->GetRelativeWidthRelation()==text::RelOrientation::FRAME?"margin":"page"),FSEND);pFS->startElementNS(XML_wp14,XML_pctWidth,FSEND);pFS->writeEscaped(OUString::number(*pSdrObject->GetRelativeWidth()*100*oox::drawingml::PER_PERCENT));pFS->endElementNS(XML_wp14,XML_pctWidth);pFS->endElementNS(XML_wp14,XML_sizeRelH);}if(pSdrObject->GetRelativeHeight()){pFS->startElementNS(XML_wp14,XML_sizeRelV,XML_relativeFrom,(pSdrObject->GetRelativeHeightRelation()==text::RelOrientation::FRAME?"margin":"page"),FSEND);pFS->startElementNS(XML_wp14,XML_pctHeight,FSEND);pFS->writeEscaped(OUString::number(*pSdrObject->GetRelativeHeight()*100*oox::drawingml::PER_PERCENT));pFS->endElementNS(XML_wp14,XML_pctHeight);pFS->endElementNS(XML_wp14,XML_sizeRelV);}endDMLAnchorInline(pFrameFormat);}voidDocxSdrExport::Impl::textFrameShadow(constSwFrameFormat&rFrameFormat){constSvxShadowItem&aShadowItem=rFrameFormat.GetShadow();if(aShadowItem.GetLocation()==SvxShadowLocation::NONE)return;OStringaShadowWidth(OString::number(double(aShadowItem.GetWidth())/20)+"pt");OStringaOffset;switch(aShadowItem.GetLocation()){caseSvxShadowLocation::TopLeft:aOffset="-"+aShadowWidth+",-"+aShadowWidth;break;caseSvxShadowLocation::TopRight:aOffset=aShadowWidth+",-"+aShadowWidth;break;caseSvxShadowLocation::BottomLeft:aOffset="-"+aShadowWidth+","+aShadowWidth;break;caseSvxShadowLocation::BottomRight:aOffset=aShadowWidth+","+aShadowWidth;break;caseSvxShadowLocation::NONE:caseSvxShadowLocation::End:break;}if(aOffset.isEmpty())return;OStringaShadowColor=msfilter::util::ConvertColor(aShadowItem.GetColor());m_pSerializer->singleElementNS(XML_v,XML_shadow,XML_on,"t",XML_color,"#"+aShadowColor,XML_offset,aOffset,FSEND);}boolDocxSdrExport::Impl::isSupportedDMLShape(constuno::Reference<drawing::XShape>&xShape){uno::Reference<lang::XServiceInfo>xServiceInfo(xShape,uno::UNO_QUERY_THROW);if(xServiceInfo->supportsService("com.sun.star.drawing.PolyPolygonShape")||xServiceInfo->supportsService("com.sun.star.drawing.PolyLineShape"))returnfalse;// For signature line shapes, we don't want DML, just the VML shape.boolbIsSignatureLineShape=false;

<--- The scope of the variable 'bIsSignatureLineShape' can be reduced. [+]

The scope of the variable 'bIsSignatureLineShape' can be reduced. Warning: Be careful when fixing this message, especially when there are inner loops. Here is an example where cppcheck will write that the scope for 'i' can be reduced:
void f(int x)
{
int i = 0;
if (x) {
// it's safe to move 'int i = 0;' here
for (int n = 0; n < 10; ++n) {
// it is possible but not safe to move 'int i = 0;' here
do_something(&i);
}
}
}
When you see this message it is always safe to reduce the variable scope 1 level.

if(xServiceInfo->supportsService("com.sun.star.drawing.GraphicObjectShape")){uno::Reference<beans::XPropertySet>xShapeProperties(xShape,uno::UNO_QUERY);xShapeProperties->getPropertyValue("IsSignatureLine")>>=bIsSignatureLineShape;if(bIsSignatureLineShape)returnfalse;}returntrue;}voidDocxSdrExport::writeDMLAndVMLDrawing(constSdrObject*sdrObj,constSwFrameFormat&rFrameFormat,intnAnchorId){boolbDMLAndVMLDrawingOpen=m_pImpl->m_bDMLAndVMLDrawingOpen;m_pImpl->m_bDMLAndVMLDrawingOpen=true;// Depending on the shape type, we actually don't write the shape as DML.OUStringsShapeType;ShapeFlagnMirrorFlags=ShapeFlag::NONE;uno::Reference<drawing::XShape>xShape(const_cast<SdrObject*>(sdrObj)->getUnoShape(),uno::UNO_QUERY_THROW);// Locked canvas is OK inside DML.if(lcl_isLockedCanvas(xShape))bDMLAndVMLDrawingOpen=false;MSO_SPTeShapeType=EscherPropertyContainer::GetCustomShapeType(xShape,nMirrorFlags,sShapeType);// In case we are already inside a DML block, then write the shape only as VML, turn out that's allowed to do.// A common service created in util to check for VML shapes which are allowed to have textbox in contentif((msfilter::util::HasTextBoxContent(eShapeType))&&Impl::isSupportedDMLShape(xShape)&&!bDMLAndVMLDrawingOpen){m_pImpl->m_pSerializer->startElementNS(XML_mc,XML_AlternateContent,FSEND);autopObjGroup=dynamic_cast<constSdrObjGroup*>(sdrObj);m_pImpl->m_pSerializer->startElementNS(XML_mc,XML_Choice,XML_Requires,(pObjGroup?"wpg":"wps"),FSEND);writeDMLDrawing(sdrObj,&rFrameFormat,nAnchorId);m_pImpl->m_pSerializer->endElementNS(XML_mc,XML_Choice);m_pImpl->m_pSerializer->startElementNS(XML_mc,XML_Fallback,FSEND);writeVMLDrawing(sdrObj,rFrameFormat);m_pImpl->m_pSerializer->endElementNS(XML_mc,XML_Fallback);m_pImpl->m_pSerializer->endElementNS(XML_mc,XML_AlternateContent);}elsewriteVMLDrawing(sdrObj,rFrameFormat);m_pImpl->m_bDMLAndVMLDrawingOpen=false;}// Converts ARGB transparency (0..255) to drawingml alpha (opposite, and 0..100000)staticOStringlcl_ConvertTransparency(constColor&rColor){if(rColor.GetTransparency()>0){sal_Int32nTransparencyPercent=100-float(rColor.GetTransparency())/2.55;returnOString::number(nTransparencyPercent*oox::drawingml::PER_PERCENT);}returnOString();}voidDocxSdrExport::writeDMLEffectLst(constSwFrameFormat&rFrameFormat){constSvxShadowItem&aShadowItem=rFrameFormat.GetShadow();// Output effectsif(aShadowItem.GetLocation()==SvxShadowLocation::NONE)return;// Distance is measured diagonally from cornerdoublenShadowDist=sqrt(static_cast<double>(aShadowItem.GetWidth())*aShadowItem.GetWidth()*2.0);OStringaShadowDist(OString::number(TwipsToEMU(nShadowDist)));OStringaShadowColor=msfilter::util::ConvertColor(aShadowItem.GetColor());OStringaShadowAlpha=lcl_ConvertTransparency(aShadowItem.GetColor());sal_uInt32nShadowDir=0;switch(aShadowItem.GetLocation()){caseSvxShadowLocation::TopLeft:nShadowDir=13500000;break;caseSvxShadowLocation::TopRight:nShadowDir=18900000;break;caseSvxShadowLocation::BottomLeft:nShadowDir=8100000;break;caseSvxShadowLocation::BottomRight:nShadowDir=2700000;break;caseSvxShadowLocation::NONE:caseSvxShadowLocation::End:break;}OStringaShadowDir(OString::number(nShadowDir));m_pImpl->m_pSerializer->startElementNS(XML_a,XML_effectLst,FSEND);m_pImpl->m_pSerializer->startElementNS(XML_a,XML_outerShdw,XML_dist,aShadowDist.getStr(),XML_dir,aShadowDir.getStr(),FSEND);if(aShadowAlpha.isEmpty())m_pImpl->m_pSerializer->singleElementNS(XML_a,XML_srgbClr,XML_val,aShadowColor.getStr(),FSEND);else{m_pImpl->m_pSerializer->startElementNS(XML_a,XML_srgbClr,XML_val,aShadowColor.getStr(),FSEND);m_pImpl->m_pSerializer->singleElementNS(XML_a,XML_alpha,XML_val,aShadowAlpha.getStr(),FSEND);m_pImpl->m_pSerializer->endElementNS(XML_a,XML_srgbClr);}m_pImpl->m_pSerializer->endElementNS(XML_a,XML_outerShdw);m_pImpl->m_pSerializer->endElementNS(XML_a,XML_effectLst);}voidDocxSdrExport::writeDiagramRels(constuno::Sequence<uno::Sequence<uno::Any>>&xRelSeq,constuno::Reference<io::XOutputStream>&xOutStream,constOUString&sGrabBagProperyName,intnAnchorId){// add image relationships of OOXData, OOXDiagramOUStringsType(oox::getRelationship(Relationship::IMAGE));uno::Reference<xml::sax::XWriter>xWriter=xml::sax::Writer::create(comphelper::getProcessComponentContext());xWriter->setOutputStream(xOutStream);// retrieve the relationships from Sequencefor(sal_Int32j=0;j<xRelSeq.getLength();j++){// diagramDataRelTuple[0] => RID,// diagramDataRelTuple[1] => xInputStream// diagramDataRelTuple[2] => extensionuno::Sequence<uno::Any>diagramDataRelTuple=xRelSeq[j];OUStringsRelId,sExtension;diagramDataRelTuple[0]>>=sRelId;diagramDataRelTuple[2]>>=sExtension;OUStringsContentType;if(sExtension.equalsIgnoreAsciiCase(".WMF"))sContentType="image/x-wmf";elsesContentType="image/"+sExtension.copy(1);sRelId=sRelId.copy(3);StreamDataSequencedataSeq;diagramDataRelTuple[1]>>=dataSeq;uno::Reference<io::XInputStream>dataImagebin(new::comphelper::SequenceInputStream(dataSeq));OUStringsFragment("../media/");//nAnchorId is used to make the name unique irrespective of the number of smart arts.sFragment+=sGrabBagProperyName+OUString::number(nAnchorId)+"_"+OUString::number(j)+sExtension;PropertySetaProps(xOutStream);aProps.setAnyProperty(PROP_RelId,uno::makeAny(sRelId.toInt32()));m_pImpl->m_rExport.GetFilter().addRelation(xOutStream,sType,sFragment);sFragment=sFragment.replaceFirst("..","word");uno::Reference<io::XOutputStream>xBinOutStream=m_pImpl->m_rExport.GetFilter().openFragmentStream(sFragment,sContentType);try{sal_Int32nBufferSize=512;uno::Sequence<sal_Int8>aDataBuffer(nBufferSize);sal_Int32nRead;do{nRead=dataImagebin->readBytes(aDataBuffer,nBufferSize);if(nRead){if(nRead<nBufferSize){nBufferSize=nRead;aDataBuffer.realloc(nRead);}xBinOutStream->writeBytes(aDataBuffer);}}while(nRead);xBinOutStream->flush();}catch(constuno::Exception&rException){SAL_WARN("sw.ww8","DocxSdrExport::writeDiagramRels Failed to copy grabbaged Image: "<<rException);}dataImagebin->closeInput();}}voidDocxSdrExport::writeDiagram(constSdrObject*sdrObject,constSwFrameFormat&rFrameFormat,intnAnchorId){sax_fastparser::FSHelperPtrpFS=m_pImpl->m_pSerializer;uno::Reference<drawing::XShape>xShape(const_cast<SdrObject*>(sdrObject)->getUnoShape(),uno::UNO_QUERY);uno::Reference<beans::XPropertySet>xPropSet(xShape,uno::UNO_QUERY);uno::Reference<xml::dom::XDocument>dataDom;uno::Reference<xml::dom::XDocument>layoutDom;uno::Reference<xml::dom::XDocument>styleDom;uno::Reference<xml::dom::XDocument>colorDom;uno::Reference<xml::dom::XDocument>drawingDom;uno::Sequence<uno::Sequence<uno::Any>>xDataRelSeq;uno::Sequence<uno::Any>diagramDrawing;// retrieve the doms from the GrabBaguno::Sequence<beans::PropertyValue>propList;xPropSet->getPropertyValue(UNO_NAME_MISC_OBJ_INTEROPGRABBAG)>>=propList;for(sal_Int32nProp=0;nProp<propList.getLength();++nProp){OUStringpropName=propList[nProp].Name;if(propName=="OOXData")propList[nProp].Value>>=dataDom;elseif(propName=="OOXLayout")propList[nProp].Value>>=layoutDom;elseif(propName=="OOXStyle")propList[nProp].Value>>=styleDom;elseif(propName=="OOXColor")propList[nProp].Value>>=colorDom;elseif(propName=="OOXDrawing"){propList[nProp].Value>>=diagramDrawing;diagramDrawing[0]>>=drawingDom;// if there is OOXDrawing property then set drawingDom here only.}elseif(propName=="OOXDiagramDataRels")propList[nProp].Value>>=xDataRelSeq;}// check that we have the 4 mandatory XDocuments// if not, there was an error importing and we won't output anythingif(!dataDom.is()||!layoutDom.is()||!styleDom.is()||!colorDom.is())return;// write necessary tags to document.xmlSizeaSize(sdrObject->GetSnapRect().GetWidth(),sdrObject->GetSnapRect().GetHeight());startDMLAnchorInline(&rFrameFormat,aSize);// generate an unique idsax_fastparser::FastAttributeList*pDocPrAttrList=sax_fastparser::FastSerializerHelper::createAttrList();pDocPrAttrList->add(XML_id,OString::number(nAnchorId).getStr());OUStringsName="Diagram"+OUString::number(nAnchorId);pDocPrAttrList->add(XML_name,OUStringToOString(sName,RTL_TEXTENCODING_UTF8).getStr());sax_fastparser::XFastAttributeListRefxDocPrAttrListRef(pDocPrAttrList);pFS->singleElementNS(XML_wp,XML_docPr,xDocPrAttrListRef);sal_Int32diagramCount;diagramCount=nAnchorId;pFS->singleElementNS(XML_wp,XML_cNvGraphicFramePr,FSEND);pFS->startElementNS(XML_a,XML_graphic,FSNS(XML_xmlns,XML_a),OUStringToOString(m_pImpl->m_rExport.GetFilter().getNamespaceURL(OOX_NS(dml)),RTL_TEXTENCODING_UTF8).getStr(),FSEND);pFS->startElementNS(XML_a,XML_graphicData,XML_uri,"http://schemas.openxmlformats.org/drawingml/2006/diagram",FSEND);// add data relationOUStringdataFileName="diagrams/data"+OUString::number(diagramCount)+".xml";OStringdataRelId=OUStringToOString(m_pImpl->m_rExport.GetFilter().addRelation(pFS->getOutputStream(),oox::getRelationship(Relationship::DIAGRAMDATA),dataFileName),RTL_TEXTENCODING_UTF8);// add layout relationOUStringlayoutFileName="diagrams/layout"+OUString::number(diagramCount)+".xml";OStringlayoutRelId=OUStringToOString(m_pImpl->m_rExport.GetFilter().addRelation(pFS->getOutputStream(),oox::getRelationship(Relationship::DIAGRAMLAYOUT),layoutFileName),RTL_TEXTENCODING_UTF8);// add style relationOUStringstyleFileName="diagrams/quickStyle"+OUString::number(diagramCount)+".xml";OStringstyleRelId=OUStringToOString(m_pImpl->m_rExport.GetFilter().addRelation(pFS->getOutputStream(),oox::getRelationship(Relationship::DIAGRAMQUICKSTYLE),styleFileName),RTL_TEXTENCODING_UTF8);// add color relationOUStringcolorFileName="diagrams/colors"+OUString::number(diagramCount)+".xml";OStringcolorRelId=OUStringToOString(m_pImpl->m_rExport.GetFilter().addRelation(pFS->getOutputStream(),oox::getRelationship(Relationship::DIAGRAMCOLORS),colorFileName),RTL_TEXTENCODING_UTF8);OUStringdrawingFileName;if(drawingDom.is()){// add drawing relationdrawingFileName="diagrams/drawing"+OUString::number(diagramCount)+".xml";OUStringdrawingRelId=m_pImpl->m_rExport.GetFilter().addRelation(pFS->getOutputStream(),oox::getRelationship(Relationship::DIAGRAMDRAWING),drawingFileName);// the data dom contains a reference to the drawing relation. We need to update it with the new generated// relation value before writing the dom to a file// Get the dsp:damaModelExt node from the domuno::Reference<xml::dom::XNodeList>nodeList=dataDom->getElementsByTagNameNS("http://schemas.microsoft.com/office/drawing/2008/diagram","dataModelExt");// There must be one element only so get ituno::Reference<xml::dom::XNode>node=nodeList->item(0);// Get the list of attributes of the nodeuno::Reference<xml::dom::XNamedNodeMap>nodeMap=node->getAttributes();// Get the node with the relId attribute and set its new valueuno::Reference<xml::dom::XNode>relIdNode=nodeMap->getNamedItem("relId");relIdNode->setNodeValue(drawingRelId);}pFS->singleElementNS(XML_dgm,XML_relIds,FSNS(XML_xmlns,XML_dgm),OUStringToOString(m_pImpl->m_rExport.GetFilter().getNamespaceURL(OOX_NS(dmlDiagram)),RTL_TEXTENCODING_UTF8).getStr(),FSNS(XML_xmlns,XML_r),OUStringToOString(m_pImpl->m_rExport.GetFilter().getNamespaceURL(OOX_NS(officeRel)),RTL_TEXTENCODING_UTF8).getStr(),FSNS(XML_r,XML_dm),dataRelId.getStr(),FSNS(XML_r,XML_lo),layoutRelId.getStr(),FSNS(XML_r,XML_qs),styleRelId.getStr(),FSNS(XML_r,XML_cs),colorRelId.getStr(),FSEND);pFS->endElementNS(XML_a,XML_graphicData);pFS->endElementNS(XML_a,XML_graphic);endDMLAnchorInline(&rFrameFormat);uno::Reference<xml::sax::XSAXSerializable>serializer;uno::Reference<xml::sax::XWriter>writer=xml::sax::Writer::create(comphelper::getProcessComponentContext());// write data fileserializer.set(dataDom,uno::UNO_QUERY);uno::Reference<io::XOutputStream>xDataOutputStream=m_pImpl->m_rExport.GetFilter().openFragmentStream("word/"+dataFileName,"application/vnd.openxmlformats-officedocument.drawingml.diagramData+xml");writer->setOutputStream(xDataOutputStream);serializer->serialize(uno::Reference<xml::sax::XDocumentHandler>(writer,uno::UNO_QUERY_THROW),uno::Sequence<beans::StringPair>());// write the associated Images and rels for data filewriteDiagramRels(xDataRelSeq,xDataOutputStream,"OOXDiagramDataRels",nAnchorId);// write layout fileserializer.set(layoutDom,uno::UNO_QUERY);writer->setOutputStream(m_pImpl->m_rExport.GetFilter().openFragmentStream("word/"+layoutFileName,"application/vnd.openxmlformats-officedocument.drawingml.diagramLayout+xml"));serializer->serialize(uno::Reference<xml::sax::XDocumentHandler>(writer,uno::UNO_QUERY_THROW),uno::Sequence<beans::StringPair>());// write style fileserializer.set(styleDom,uno::UNO_QUERY);writer->setOutputStream(m_pImpl->m_rExport.GetFilter().openFragmentStream("word/"+styleFileName,"application/vnd.openxmlformats-officedocument.drawingml.diagramStyle+xml"));serializer->serialize(uno::Reference<xml::sax::XDocumentHandler>(writer,uno::UNO_QUERY_THROW),uno::Sequence<beans::StringPair>());// write color fileserializer.set(colorDom,uno::UNO_QUERY);writer->setOutputStream(m_pImpl->m_rExport.GetFilter().openFragmentStream("word/"+colorFileName,"application/vnd.openxmlformats-officedocument.drawingml.diagramColors+xml"));serializer->serialize(uno::Reference<xml::sax::XDocumentHandler>(writer,uno::UNO_QUERY_THROW),uno::Sequence<beans::StringPair>());// write drawing fileif(drawingDom.is()){serializer.set(drawingDom,uno::UNO_QUERY);uno::Reference<io::XOutputStream>xDrawingOutputStream=m_pImpl->m_rExport.GetFilter().openFragmentStream("word/"+drawingFileName,"application/vnd.ms-office.drawingml.diagramDrawing+xml");writer->setOutputStream(xDrawingOutputStream);serializer->serialize(uno::Reference<xml::sax::XDocumentHandler>(writer,uno::UNO_QUERY_THROW),uno::Sequence<beans::StringPair>());// write the associated Images and rels for drawing fileuno::Sequence<uno::Sequence<uno::Any>>xDrawingRelSeq;diagramDrawing[1]>>=xDrawingRelSeq;writeDiagramRels(xDrawingRelSeq,xDrawingOutputStream,"OOXDiagramDrawingRels",nAnchorId);}}voidDocxSdrExport::writeOnlyTextOfFrame(ww8::Frameconst*pParentFrame){constSwFrameFormat&rFrameFormat=pParentFrame->GetFrameFormat();constSwNodeIndex*pNodeIndex=rFrameFormat.GetContent().GetContentIdx();sax_fastparser::FSHelperPtrpFS=m_pImpl->m_pSerializer;sal_uLongnStt=pNodeIndex?pNodeIndex->GetIndex()+1:0;sal_uLongnEnd=pNodeIndex?pNodeIndex->GetNode().EndOfSectionIndex():0;//Save data here and restore when out of scopeExportDataSaveRestoreaDataGuard(m_pImpl->m_rExport,nStt,nEnd,pParentFrame);m_pImpl->m_pBodyPrAttrList=sax_fastparser::FastSerializerHelper::createAttrList();m_pImpl->m_bFrameBtLr=m_pImpl->checkFrameBtlr(m_pImpl->m_rExport.m_pDoc->GetNodes()[nStt],/*bDML=*/true);m_pImpl->m_bFlyFrameGraphic=true;m_pImpl->m_rExport.WriteText();m_pImpl->m_bFlyFrameGraphic=false;m_pImpl->m_bFrameBtLr=false;}voidDocxSdrExport::writeBoxItemLine(constSvxBoxItem&rBox){constediteng::SvxBorderLine*pBorderLine=nullptr;if(rBox.GetTop()){pBorderLine=rBox.GetTop();}elseif(rBox.GetLeft()){pBorderLine=rBox.GetLeft();}elseif(rBox.GetBottom()){pBorderLine=rBox.GetBottom();}elseif(rBox.GetRight()){pBorderLine=rBox.GetRight();}if(!pBorderLine){return;}sax_fastparser::FSHelperPtrpFS=m_pImpl->m_pSerializer;doublefConverted(editeng::ConvertBorderWidthToWord(pBorderLine->GetBorderLineStyle(),pBorderLine->GetWidth()));OStringsWidth(OString::number(TwipsToEMU(fConverted)));pFS->startElementNS(XML_a,XML_ln,XML_w,sWidth.getStr(),FSEND);pFS->startElementNS(XML_a,XML_solidFill,FSEND);OStringsColor(msfilter::util::ConvertColor(pBorderLine->GetColor()));pFS->singleElementNS(XML_a,XML_srgbClr,XML_val,sColor,FSEND);pFS->endElementNS(XML_a,XML_solidFill);if(SvxBorderLineStyle::DASHED==pBorderLine->GetBorderLineStyle())// Line Style is Dash typepFS->singleElementNS(XML_a,XML_prstDash,XML_val,"dash",FSEND);pFS->endElementNS(XML_a,XML_ln);}voidDocxSdrExport::writeDMLTextFrame(ww8::Frameconst*pParentFrame,intnAnchorId,boolbTextBoxOnly){boolbDMLAndVMLDrawingOpen=m_pImpl->m_bDMLAndVMLDrawingOpen;m_pImpl->m_bDMLAndVMLDrawingOpen=IsAnchorTypeInsideParagraph(pParentFrame);sax_fastparser::FSHelperPtrpFS=m_pImpl->m_pSerializer;constSwFrameFormat&rFrameFormat=pParentFrame->GetFrameFormat();constSwNodeIndex*pNodeIndex=rFrameFormat.GetContent().GetContentIdx();sal_uLongnStt=pNodeIndex?pNodeIndex->GetIndex()+1:0;sal_uLongnEnd=pNodeIndex?pNodeIndex->GetNode().EndOfSectionIndex():0;//Save data here and restore when out of scopeExportDataSaveRestoreaDataGuard(m_pImpl->m_rExport,nStt,nEnd,pParentFrame);// When a frame has some low height, but automatically expanded due// to lots of contents, this size contains the real size.constSizeaSize=pParentFrame->GetSize();uno::Reference<drawing::XShape>xShape;constSdrObject*pSdrObj=rFrameFormat.FindRealSdrObject();if(pSdrObj)xShape.set(const_cast<SdrObject*>(pSdrObj)->getUnoShape(),uno::UNO_QUERY);uno::Reference<beans::XPropertySet>xPropertySet(xShape,uno::UNO_QUERY);uno::Reference<beans::XPropertySetInfo>xPropSetInfo;if(xPropertySet.is())xPropSetInfo=xPropertySet->getPropertySetInfo();m_pImpl->m_pBodyPrAttrList=sax_fastparser::FastSerializerHelper::createAttrList();{drawing::TextVerticalAdjusteAdjust=drawing::TextVerticalAdjust_TOP;if(xPropSetInfo.is()&&xPropSetInfo->hasPropertyByName("TextVerticalAdjust"))xPropertySet->getPropertyValue("TextVerticalAdjust")>>=eAdjust;m_pImpl->m_pBodyPrAttrList->add(XML_anchor,oox::drawingml::GetTextVerticalAdjust(eAdjust));}if(!bTextBoxOnly){startDMLAnchorInline(&rFrameFormat,aSize);sax_fastparser::FastAttributeList*pDocPrAttrList=sax_fastparser::FastSerializerHelper::createAttrList();pDocPrAttrList->add(XML_id,OString::number(nAnchorId).getStr());pDocPrAttrList->add(XML_name,OUStringToOString(rFrameFormat.GetName(),RTL_TEXTENCODING_UTF8).getStr());sax_fastparser::XFastAttributeListRefxDocPrAttrListRef(pDocPrAttrList);pFS->singleElementNS(XML_wp,XML_docPr,xDocPrAttrListRef);pFS->startElementNS(XML_a,XML_graphic,FSNS(XML_xmlns,XML_a),OUStringToOString(m_pImpl->m_rExport.GetFilter().getNamespaceURL(OOX_NS(dml)),RTL_TEXTENCODING_UTF8).getStr(),FSEND);pFS->startElementNS(XML_a,XML_graphicData,XML_uri,"http://schemas.microsoft.com/office/word/2010/wordprocessingShape",FSEND);pFS->startElementNS(XML_wps,XML_wsp,FSEND);pFS->singleElementNS(XML_wps,XML_cNvSpPr,XML_txBox,"1",FSEND);uno::AnyaRotation;m_pImpl->m_nDMLandVMLTextFrameRotation=0;if(xPropSetInfo.is()&&xPropSetInfo->hasPropertyByName("FrameInteropGrabBag")){uno::Sequence<beans::PropertyValue>propList;xPropertySet->getPropertyValue("FrameInteropGrabBag")>>=propList;for(sal_Int32nProp=0;nProp<propList.getLength();++nProp){OUStringpropName=propList[nProp].Name;if(propName=="mso-rotation-angle"){aRotation=propList[nProp].Value;break;}}}aRotation>>=m_pImpl->m_nDMLandVMLTextFrameRotation;OStringsRotation(OString::number((OOX_DRAWINGML_EXPORT_ROTATE_CLOCKWISIFY(m_pImpl->m_nDMLandVMLTextFrameRotation))));// Shape propertiespFS->startElementNS(XML_wps,XML_spPr,FSEND);if(m_pImpl->m_nDMLandVMLTextFrameRotation){pFS->startElementNS(XML_a,XML_xfrm,XML_rot,sRotation.getStr(),FSEND);}else{pFS->startElementNS(XML_a,XML_xfrm,FSEND);}pFS->singleElementNS(XML_a,XML_off,XML_x,"0",XML_y,"0",FSEND);OStringaWidth(OString::number(TwipsToEMU(aSize.Width())));OStringaHeight(OString::number(TwipsToEMU(aSize.Height())));pFS->singleElementNS(XML_a,XML_ext,XML_cx,aWidth.getStr(),XML_cy,aHeight.getStr(),FSEND);pFS->endElementNS(XML_a,XML_xfrm);OUStringshapeType="rect";if(xPropSetInfo.is()&&xPropSetInfo->hasPropertyByName("FrameInteropGrabBag")){uno::Sequence<beans::PropertyValue>propList;xPropertySet->getPropertyValue("FrameInteropGrabBag")>>=propList;for(sal_Int32nProp=0;nProp<propList.getLength();++nProp){OUStringpropName=propList[nProp].Name;if(propName=="mso-orig-shape-type"){propList[nProp].Value>>=shapeType;break;}}}//Empty shapeType will lead to corruption so to avoid that shapeType is set to default i.e. "rect"if(shapeType.isEmpty())shapeType="rect";pFS->singleElementNS(XML_a,XML_prstGeom,XML_prst,OUStringToOString(shapeType,RTL_TEXTENCODING_UTF8).getStr(),FSEND);m_pImpl->m_bDMLTextFrameSyntax=true;m_pImpl->m_rExport.OutputFormat(pParentFrame->GetFrameFormat(),false,false,true);m_pImpl->m_bDMLTextFrameSyntax=false;writeDMLEffectLst(rFrameFormat);pFS->endElementNS(XML_wps,XML_spPr);}//first, loop through ALL of the chained textboxes to identify a unique ID for each chain, and sequence number for each textbox in that chain.if(!m_pImpl->m_rExport.m_bLinkedTextboxesHelperInitialized){sal_Int32nSeq=0;for(auto&rEntry:m_pImpl->m_rExport.m_aLinkedTextboxesHelper){//find the start of a textbox chain: has no PREVIOUS link, but does have NEXT linkif(rEntry.second.sPrevChain.isEmpty()&&!rEntry.second.sNextChain.isEmpty()){//assign this chain a unique ID and start a new sequencenSeq=0;rEntry.second.nId=++m_pImpl->m_rExport.m_nLinkedTextboxesChainId;rEntry.second.nSeq=nSeq;OUStringsCheckForBrokenChains=rEntry.first;//follow the chain and assign the same id, and incremental sequence numbers.std::map<OUString,MSWordExportBase::LinkedTextboxInfo>::iteratorfollowChainIter;followChainIter=m_pImpl->m_rExport.m_aLinkedTextboxesHelper.find(rEntry.second.sNextChain);while(followChainIter!=m_pImpl->m_rExport.m_aLinkedTextboxesHelper.end()){//verify that the NEXT textbox also points to me as the PREVIOUS.// A broken link indicates a leftover remnant that can be ignored.if(followChainIter->second.sPrevChain!=sCheckForBrokenChains)break;followChainIter->second.nId=m_pImpl->m_rExport.m_nLinkedTextboxesChainId;followChainIter->second.nSeq=++nSeq;//empty next chain indicates the end of the linked chain.if(followChainIter->second.sNextChain.isEmpty())break;sCheckForBrokenChains=followChainIter->first;followChainIter=m_pImpl->m_rExport.m_aLinkedTextboxesHelper.find(followChainIter->second.sNextChain);}}}m_pImpl->m_rExport.m_bLinkedTextboxesHelperInitialized=true;}m_pImpl->m_rExport.m_pParentFrame=nullptr;boolskipTxBxContent=false;boolisTxbxLinked=false;OUStringsLinkChainName;if(xPropSetInfo.is()){if(xPropSetInfo->hasPropertyByName("LinkDisplayName"))xPropertySet->getPropertyValue("LinkDisplayName")>>=sLinkChainName;elseif(xPropSetInfo->hasPropertyByName("ChainName"))xPropertySet->getPropertyValue("ChainName")>>=sLinkChainName;}// second, check if THIS textbox is linked and then decide whether to write the tag txbx or linkedTxbxstd::map<OUString,MSWordExportBase::LinkedTextboxInfo>::iteratorlinkedTextboxesIter=m_pImpl->m_rExport.m_aLinkedTextboxesHelper.find(sLinkChainName);if(linkedTextboxesIter!=m_pImpl->m_rExport.m_aLinkedTextboxesHelper.end()){if((linkedTextboxesIter->second.nId!=0)&&(linkedTextboxesIter->second.nSeq!=0)){//not the first in the chain, so write the tag as linkedTxbxpFS->singleElementNS(XML_wps,XML_linkedTxbx,XML_id,I32S(linkedTextboxesIter->second.nId),XML_seq,I32S(linkedTextboxesIter->second.nSeq),FSEND);/* no text content should be added to this tag, since the textbox is linked, the entire content is written in txbx block */skipTxBxContent=true;}elseif((linkedTextboxesIter->second.nId!=0)&&(linkedTextboxesIter->second.nSeq==0)){/* this is the first textbox in the chaining, we add the text content to this block*///since the text box is linked, it needs an id.pFS->startElementNS(XML_wps,XML_txbx,XML_id,I32S(linkedTextboxesIter->second.nId),FSEND);isTxbxLinked=true;}}if(!skipTxBxContent){if(!isTxbxLinked)pFS->startElementNS(XML_wps,XML_txbx,FSEND);//text box is not linked, therefore no id.pFS->startElementNS(XML_w,XML_txbxContent,FSEND);m_pImpl->m_bFrameBtLr=m_pImpl->checkFrameBtlr(m_pImpl->m_rExport.m_pDoc->GetNodes()[nStt],/*bDML=*/true);m_pImpl->m_bFlyFrameGraphic=true;m_pImpl->m_rExport.WriteText();if(m_pImpl->m_bParagraphSdtOpen){m_pImpl->m_rExport.DocxAttrOutput().EndParaSdtBlock();m_pImpl->m_bParagraphSdtOpen=false;}m_pImpl->m_bFlyFrameGraphic=false;m_pImpl->m_bFrameBtLr=false;pFS->endElementNS(XML_w,XML_txbxContent);pFS->endElementNS(XML_wps,XML_txbx);}// We need to init padding to 0, if it's not set.// In LO the default is 0 and so ins attributes are not set when padding is 0// but in MSO the default is 254 / 127, so we need to set 0 padding explicitlyif(!m_pImpl->m_pBodyPrAttrList->hasAttribute(XML_lIns))m_pImpl->m_pBodyPrAttrList->add(XML_lIns,OString::number(0));if(!m_pImpl->m_pBodyPrAttrList->hasAttribute(XML_tIns))m_pImpl->m_pBodyPrAttrList->add(XML_tIns,OString::number(0));if(!m_pImpl->m_pBodyPrAttrList->hasAttribute(XML_rIns))m_pImpl->m_pBodyPrAttrList->add(XML_rIns,OString::number(0));if(!m_pImpl->m_pBodyPrAttrList->hasAttribute(XML_bIns))m_pImpl->m_pBodyPrAttrList->add(XML_bIns,OString::number(0));sax_fastparser::XFastAttributeListRefxBodyPrAttrList(m_pImpl->m_pBodyPrAttrList);m_pImpl->m_pBodyPrAttrList=nullptr;if(!bTextBoxOnly){pFS->startElementNS(XML_wps,XML_bodyPr,xBodyPrAttrList);// AutoSize of the Text Frame.constSwFormatFrameSize&rSize=rFrameFormat.GetFrameSize();pFS->singleElementNS(XML_a,(rSize.GetHeightSizeType()==ATT_VAR_SIZE?XML_spAutoFit:XML_noAutofit),FSEND);pFS->endElementNS(XML_wps,XML_bodyPr);pFS->endElementNS(XML_wps,XML_wsp);pFS->endElementNS(XML_a,XML_graphicData);pFS->endElementNS(XML_a,XML_graphic);// Relative size of the Text Frame.constsal_uInt8nWidthPercent=rSize.GetWidthPercent();if(nWidthPercent&&nWidthPercent!=SwFormatFrameSize::SYNCED){pFS->startElementNS(XML_wp14,XML_sizeRelH,XML_relativeFrom,(rSize.GetWidthPercentRelation()==text::RelOrientation::PAGE_FRAME?"page":"margin"),FSEND);pFS->startElementNS(XML_wp14,XML_pctWidth,FSEND);pFS->writeEscaped(OUString::number(nWidthPercent*oox::drawingml::PER_PERCENT));pFS->endElementNS(XML_wp14,XML_pctWidth);pFS->endElementNS(XML_wp14,XML_sizeRelH);}constsal_uInt8nHeightPercent=rSize.GetHeightPercent();if(nHeightPercent&&nHeightPercent!=SwFormatFrameSize::SYNCED){pFS->startElementNS(XML_wp14,XML_sizeRelV,XML_relativeFrom,(rSize.GetHeightPercentRelation()==text::RelOrientation::PAGE_FRAME?"page":"margin"),FSEND);pFS->startElementNS(XML_wp14,XML_pctHeight,FSEND);pFS->writeEscaped(OUString::number(nHeightPercent*oox::drawingml::PER_PERCENT));pFS->endElementNS(XML_wp14,XML_pctHeight);pFS->endElementNS(XML_wp14,XML_sizeRelV);}endDMLAnchorInline(&rFrameFormat);}m_pImpl->m_bDMLAndVMLDrawingOpen=bDMLAndVMLDrawingOpen;}voidDocxSdrExport::writeVMLTextFrame(ww8::Frameconst*pParentFrame,boolbTextBoxOnly){boolbDMLAndVMLDrawingOpen=m_pImpl->m_bDMLAndVMLDrawingOpen;m_pImpl->m_bDMLAndVMLDrawingOpen=IsAnchorTypeInsideParagraph(pParentFrame);sax_fastparser::FSHelperPtrpFS=m_pImpl->m_pSerializer;constSwFrameFormat&rFrameFormat=pParentFrame->GetFrameFormat();constSwNodeIndex*pNodeIndex=rFrameFormat.GetContent().GetContentIdx();sal_uLongnStt=pNodeIndex?pNodeIndex->GetIndex()+1:0;sal_uLongnEnd=pNodeIndex?pNodeIndex->GetNode().EndOfSectionIndex():0;//Save data here and restore when out of scopeExportDataSaveRestoreaDataGuard(m_pImpl->m_rExport,nStt,nEnd,pParentFrame);// When a frame has some low height, but automatically expanded due// to lots of contents, this size contains the real size.constSizeaSize=pParentFrame->GetSize();m_pImpl->m_pFlyFrameSize=&aSize;m_pImpl->m_bTextFrameSyntax=true;m_pImpl->m_pFlyAttrList=sax_fastparser::FastSerializerHelper::createAttrList();m_pImpl->m_pTextboxAttrList=sax_fastparser::FastSerializerHelper::createAttrList();m_pImpl->m_aTextFrameStyle="position:absolute";if(!bTextBoxOnly){OStringsRotation(OString::number(m_pImpl->m_nDMLandVMLTextFrameRotation/-100));m_pImpl->m_rExport.SdrExporter().getTextFrameStyle().append(";rotation:").append(sRotation);}m_pImpl->m_rExport.OutputFormat(pParentFrame->GetFrameFormat(),false,false,true);m_pImpl->m_pFlyAttrList->add(XML_style,m_pImpl->m_aTextFrameStyle.makeStringAndClear());constSdrObject*pObject=pParentFrame->GetFrameFormat().FindRealSdrObject();if(pObject!=nullptr){OUStringsAnchorId=lclGetAnchorIdFromGrabBag(pObject);if(!sAnchorId.isEmpty())m_pImpl->m_pFlyAttrList->addNS(XML_w14,XML_anchorId,OUStringToOString(sAnchorId,RTL_TEXTENCODING_UTF8));}sax_fastparser::XFastAttributeListRefxFlyAttrList(m_pImpl->m_pFlyAttrList.get());m_pImpl->m_pFlyAttrList.clear();m_pImpl->m_bFrameBtLr=m_pImpl->checkFrameBtlr(m_pImpl->m_rExport.m_pDoc->GetNodes()[nStt],/*bDML=*/false);sax_fastparser::XFastAttributeListRefxTextboxAttrList(m_pImpl->m_pTextboxAttrList.get());m_pImpl->m_pTextboxAttrList.clear();m_pImpl->m_bTextFrameSyntax=false;m_pImpl->m_pFlyFrameSize=nullptr;m_pImpl->m_rExport.m_pParentFrame=nullptr;if(!bTextBoxOnly){pFS->startElementNS(XML_w,XML_pict,FSEND);pFS->startElementNS(XML_v,XML_rect,xFlyAttrList);m_pImpl->textFrameShadow(rFrameFormat);if(m_pImpl->m_pFlyFillAttrList.is()){sax_fastparser::XFastAttributeListRefxFlyFillAttrList(m_pImpl->m_pFlyFillAttrList.get());m_pImpl->m_pFlyFillAttrList.clear();pFS->singleElementNS(XML_v,XML_fill,xFlyFillAttrList);}if(m_pImpl->m_pDashLineStyleAttr.is()){sax_fastparser::XFastAttributeListRefxDashLineStyleAttr(m_pImpl->m_pDashLineStyleAttr.get());m_pImpl->m_pDashLineStyleAttr.clear();pFS->singleElementNS(XML_v,XML_stroke,xDashLineStyleAttr);}pFS->startElementNS(XML_v,XML_textbox,xTextboxAttrList);}pFS->startElementNS(XML_w,XML_txbxContent,FSEND);m_pImpl->m_bFlyFrameGraphic=true;m_pImpl->m_rExport.WriteText();if(m_pImpl->m_bParagraphSdtOpen){m_pImpl->m_rExport.DocxAttrOutput().EndParaSdtBlock();m_pImpl->m_bParagraphSdtOpen=false;}m_pImpl->m_bFlyFrameGraphic=false;pFS->endElementNS(XML_w,XML_txbxContent);if(!bTextBoxOnly){pFS->endElementNS(XML_v,XML_textbox);if(m_pImpl->m_pFlyWrapAttrList){sax_fastparser::XFastAttributeListRefxFlyWrapAttrList(m_pImpl->m_pFlyWrapAttrList);m_pImpl->m_pFlyWrapAttrList=nullptr;pFS->singleElementNS(XML_w10,XML_wrap,xFlyWrapAttrList);}pFS->endElementNS(XML_v,XML_rect);pFS->endElementNS(XML_w,XML_pict);}m_pImpl->m_bFrameBtLr=false;m_pImpl->m_bDMLAndVMLDrawingOpen=bDMLAndVMLDrawingOpen;}boolDocxSdrExport::Impl::checkFrameBtlr(SwNode*pStartNode,boolbDML){// The intended usage is to pass either a valid VML or DML attribute list.if(bDML)assert(m_pBodyPrAttrList);elseassert(m_pTextboxAttrList.is());if(!pStartNode->IsTextNode())returnfalse;SwTextNode*pTextNode=pStartNode->GetTextNode();constSfxPoolItem*pItem=nullptr;// explicitly init to avoid warningsboolbItemSet=false;if(pTextNode->HasSwAttrSet()){constSwAttrSet&rAttrSet=pTextNode->GetSwAttrSet();bItemSet=rAttrSet.GetItemState(RES_CHRATR_ROTATE,true,&pItem)==SfxItemState::SET;}if(!bItemSet){if(!pTextNode->HasHints())returnfalse;SwTextAttr*pTextAttr=pTextNode->GetTextAttrAt(0,RES_TXTATR_AUTOFMT);if(!pTextAttr||pTextAttr->Which()!=RES_TXTATR_AUTOFMT)returnfalse;std::shared_ptr<SfxItemSet>pItemSet=pTextAttr->GetAutoFormat().GetStyleHandle();bItemSet=pItemSet->GetItemState(RES_CHRATR_ROTATE,true,&pItem)==SfxItemState::SET;}if(bItemSet){auto&rCharRotate=static_cast<constSvxCharRotateItem&>(*pItem);if(rCharRotate.GetValue()==900){if(bDML)m_pBodyPrAttrList->add(XML_vert,"vert270");elsem_pTextboxAttrList->add(XML_style,"mso-layout-flow-alt:bottom-to-top");returntrue;}}returnfalse;}boolDocxSdrExport::isTextBox(constSwFrameFormat&rFrameFormat){returnSwTextBoxHelper::isTextBox(&rFrameFormat,RES_FLYFRMFMT);}/* vim:set shiftwidth=4 softtabstop=4 expandtab: */