1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
10 #include <oox/export/DMLPresetShapeExport.hxx>
11 #include <oox/token/tokens.hxx>
13 #include <com/sun/star/beans/XPropertySet.hpp>
14 #include <com/sun/star/beans/PropertyValue.hpp>
15 #include <com/sun/star/drawing/EnhancedCustomShapeAdjustmentValue.hpp>
16 #include <com/sun/star/drawing/EnhancedCustomShapeParameterPair.hpp>
17 #include <com/sun/star/drawing/XShape.hpp>
19 #include <osl/diagnose.h>
20 #include <filter/msfilter/util.hxx>
22 #include <string_view>
24 using namespace ::css
;
25 using namespace ::css::drawing
;
27 namespace oox::drawingml
29 // DMLPresetShapeExporter class
32 DMLPresetShapeExporter::DMLPresetShapeExporter(DrawingML
* pDMLExporter
,
33 css::uno::Reference
<css::drawing::XShape
> xShape
)
34 : m_pDMLexporter(pDMLExporter
)
36 // This class only work with custom shapes!
37 OSL_ASSERT(xShape
->getShapeType() == "com.sun.star.drawing.CustomShape");
40 m_bHasHandleValues
= false;
41 uno::Reference
<beans::XPropertySet
> xShapeProps(m_xShape
, uno::UNO_QUERY
);
42 css::uno::Sequence
<css::beans::PropertyValue
> aCustomShapeGeometry
43 = xShapeProps
->getPropertyValue("CustomShapeGeometry")
44 .get
<uno::Sequence
<beans::PropertyValue
>>();
46 for (auto const& rCustomShapeGeometryItem
: aCustomShapeGeometry
)
48 if (rCustomShapeGeometryItem
.Name
== "Type")
50 m_sPresetShapeType
= rCustomShapeGeometryItem
.Value
.get
<OUString
>();
52 if (rCustomShapeGeometryItem
.Name
== "Handles")
54 m_bHasHandleValues
= true;
56 = rCustomShapeGeometryItem
.Value
57 .get
<css::uno::Sequence
<css::uno::Sequence
<css::beans::PropertyValue
>>>();
59 if (rCustomShapeGeometryItem
.Name
== "AdjustmentValues")
62 = rCustomShapeGeometryItem
.Value
63 .get
<css::uno::Sequence
<css::drawing::EnhancedCustomShapeAdjustmentValue
>>();
65 if (rCustomShapeGeometryItem
.Name
== "MirroredX")
67 m_bIsFlipped
.first
= rCustomShapeGeometryItem
.Value
.get
<bool>();
69 if (rCustomShapeGeometryItem
.Name
== "MirroredY")
71 m_bIsFlipped
.second
= rCustomShapeGeometryItem
.Value
.get
<bool>();
73 //if (rCustomShapeGeometryItem.Name == "Equations")
75 // m_Equations = rCustomShapeGeometryItem.Value.get<css::uno::Sequence<OUString>>();
77 //if (rCustomShapeGeometryItem.Name == "Path")
79 // m_Path = rCustomShapeGeometryItem
80 // .Value.get<css::uno::Sequence<css::beans::PropertyValue>>();
82 //if (rCustomShapeGeometryItem.Name == "ViewBox")
84 // m_ViewBox = rCustomShapeGeometryItem.Value.get<css::awt::Rectangle>();
90 DMLPresetShapeExporter::~DMLPresetShapeExporter(){
94 bool DMLPresetShapeExporter::HasHandleValue() const { return m_bHasHandleValues
; }
96 const OUString
& DMLPresetShapeExporter::GetShapeType() const { return m_sPresetShapeType
; }
98 const css::uno::Sequence
<css::uno::Sequence
<css::beans::PropertyValue
>>&
99 DMLPresetShapeExporter::GetHandleValues() const
101 return m_HandleValues
;
104 const css::uno::Sequence
<css::drawing::EnhancedCustomShapeAdjustmentValue
>&
105 DMLPresetShapeExporter::GetAdjustmentValues() const
107 return m_AdjustmentValues
;
110 css::uno::Any
DMLPresetShapeExporter::GetHandleValueOfModificationPoint(sal_Int32 nPoint
,
111 std::u16string_view sType
)
114 if (GetHandleValues().getLength() > nPoint
)
116 for (sal_Int32 i
= 0; i
< GetHandleValues()[nPoint
].getLength(); i
++)
118 if (GetHandleValues()[nPoint
][i
].Name
== sType
)
120 aRet
= GetHandleValues()[nPoint
][i
].Value
;
128 DMLPresetShapeExporter::RadiusAdjustmentValue
129 DMLPresetShapeExporter::GetAdjustmentPointRadiusValue(sal_Int32 nPoint
)
131 RadiusAdjustmentValue aRet
;
134 auto aValPos
= GetHandleValueOfModificationPoint(nPoint
, u
"Position")
135 .get
<EnhancedCustomShapeParameterPair
>();
136 aRet
.nMinVal
= GetHandleValueOfModificationPoint(nPoint
, u
"RadiusRangeMinimum")
137 .get
<EnhancedCustomShapeParameter
>()
138 .Value
.get
<double>();
139 aRet
.nMaxVal
= GetHandleValueOfModificationPoint(nPoint
, u
"RadiusRangeMaximum")
140 .get
<EnhancedCustomShapeParameter
>()
141 .Value
.get
<double>();
142 aRet
.nCurrVal
= GetAdjustmentValues()[aValPos
.First
.Value
.get
<long>()].Value
.get
<double>();
151 DMLPresetShapeExporter::AngleAdjustmentValue
152 DMLPresetShapeExporter::GetAdjustmentPointAngleValue(sal_Int32 nPoint
)
154 AngleAdjustmentValue aRet
;
157 auto aValPos
= GetHandleValueOfModificationPoint(nPoint
, u
"Position")
158 .get
<EnhancedCustomShapeParameterPair
>();
161 aRet
.nCurrVal
= GetAdjustmentValues()[aValPos
.Second
.Value
.get
<long>()].Value
.get
<double>();
170 DMLPresetShapeExporter::XAdjustmentValue
171 DMLPresetShapeExporter::GetAdjustmentPointXValue(sal_Int32 nPoint
)
173 XAdjustmentValue aRet
;
176 auto aValPos
= GetHandleValueOfModificationPoint(nPoint
, u
"Position")
177 .get
<EnhancedCustomShapeParameterPair
>();
178 aRet
.nMinVal
= GetHandleValueOfModificationPoint(nPoint
, u
"RangeXMinimum")
179 .get
<EnhancedCustomShapeParameter
>()
180 .Value
.get
<double>();
181 aRet
.nMaxVal
= GetHandleValueOfModificationPoint(nPoint
, u
"RangeXMaximum")
182 .get
<EnhancedCustomShapeParameter
>()
183 .Value
.get
<double>();
184 aRet
.nCurrVal
= GetAdjustmentValues()[aValPos
.First
.Value
.get
<long>()].Value
.get
<double>();
193 DMLPresetShapeExporter::YAdjustmentValue
194 DMLPresetShapeExporter::GetAdjustmentPointYValue(sal_Int32 nPoint
)
196 YAdjustmentValue aRet
;
199 auto aValPos
= GetHandleValueOfModificationPoint(nPoint
, u
"Position")
200 .get
<EnhancedCustomShapeParameterPair
>();
201 aRet
.nMinVal
= GetHandleValueOfModificationPoint(nPoint
, u
"RangeYMinimum")
202 .get
<EnhancedCustomShapeParameter
>()
203 .Value
.get
<double>();
204 aRet
.nMaxVal
= GetHandleValueOfModificationPoint(nPoint
, u
"RangeYMaximum")
205 .get
<EnhancedCustomShapeParameter
>()
206 .Value
.get
<double>();
207 aRet
.nCurrVal
= GetAdjustmentValues()[aValPos
.Second
.Value
.get
<long>()].Value
.get
<double>();
216 bool DMLPresetShapeExporter::WriteShape()
218 if (m_pDMLexporter
&& m_xShape
)
220 // Case 1: We do not have adjustment points of the shape: just export it as preset
221 if (!m_bHasHandleValues
)
223 OUString sShapeType
= GetShapeType();
224 const OString
& sPresetShape
= msfilter::util::GetOOXMLPresetGeometry(sShapeType
);
225 m_pDMLexporter
->WriteShapeTransformation(m_xShape
, XML_a
, IsXFlipped(), IsYFlipped(),
227 m_pDMLexporter
->WritePresetShape(sPresetShape
);
230 else // Case2: There are adjustment points what have to be converted and exported.
232 return WriteShapeWithAVlist();
238 bool DMLPresetShapeExporter::WriteAV(const OUString
& sValName
, const OUString
& sVal
)
242 m_pDMLexporter
->GetFS()->singleElementNS(XML_a
, XML_gd
, XML_name
, sValName
, XML_fmla
, sVal
);
251 bool DMLPresetShapeExporter::StartAVListWriting()
255 const OString
& pShape
= msfilter::util::GetOOXMLPresetGeometry(GetShapeType());
256 m_pDMLexporter
->GetFS()->startElementNS(XML_a
, XML_prstGeom
, XML_prst
, pShape
);
257 m_pDMLexporter
->GetFS()->startElementNS(XML_a
, XML_avLst
);
265 bool DMLPresetShapeExporter::EndAVListWriting()
269 m_pDMLexporter
->GetFS()->endElementNS(XML_a
, XML_avLst
);
270 m_pDMLexporter
->GetFS()->endElementNS(XML_a
, XML_prstGeom
);
279 bool DMLPresetShapeExporter::WriteShapeWithAVlist()
281 // Remark: This method is under development. If a shape type is implemented, the corresponding,
282 // return must be set to true. False means nothing done true, export done. There are many
283 // types which do not have pairs in LO, they are do not have to be mapped, because import
284 // filter it does with GrabBag, this method only maps the SDR ones to OOXML shapes.
286 OString
sShapeType(msfilter::util::GetOOXMLPresetGeometry(GetShapeType()));
288 // OOXML uses 60th of degree, so 360 degree is 21 600 000 60thdeg
289 const tools::Long nConstOfMaxDegreeOf60th
= 21600000;
292 if (sShapeType
== "accentBorderCallout1")
294 // LO does not have this type, so it does not necessary to be mapped.
297 if (sShapeType
== "accentBorderCallout2")
299 // LO does not have this type, so it does not necessary to be mapped.
302 if (sShapeType
== "accentBorderCallout3")
304 // LO does not have this type, so it does not necessary to be mapped.
307 if (sShapeType
== "accentCallout1")
309 // LO does not have this type, so it does not necessary to be mapped.
312 if (sShapeType
== "accentCallout2")
314 // LO does not have this type, so it does not necessary to be mapped.
317 if (sShapeType
== "accentCallout3")
319 // LO does not have this type, so it does not necessary to be mapped.
322 if (sShapeType
== "actionButtonBackPrevious")
324 // LO does not have this type, so it does not necessary to be mapped.
327 if (sShapeType
== "actionButtonBeginning")
329 // LO does not have this type, so it does not necessary to be mapped.
332 if (sShapeType
== "actionButtonBlank")
334 // LO does not have this type, so it does not necessary to be mapped.
337 if (sShapeType
== "actionButtonDocument")
339 // LO does not have this type, so it does not necessary to be mapped.
342 if (sShapeType
== "actionButtonEnd")
344 // LO does not have this type, so it does not necessary to be mapped.
347 if (sShapeType
== "actionButtonForwardNext")
349 // LO does not have this type, so it does not necessary to be mapped.
352 if (sShapeType
== "actionButtonHelp")
354 // LO does not have this type, so it does not necessary to be mapped.
357 if (sShapeType
== "actionButtonHome")
359 // LO does not have this type, so it does not necessary to be mapped.
362 if (sShapeType
== "actionButtonInformation")
364 // LO does not have this type, so it does not necessary to be mapped.
367 if (sShapeType
== "actionButtonMovie")
369 // LO does not have this type, so it does not necessary to be mapped.
372 if (sShapeType
== "actionButtonReturn")
374 // LO does not have this type, so it does not necessary to be mapped.
377 if (sShapeType
== "actionButtonSound")
379 // LO does not have this type, so it does not necessary to be mapped.
382 if (sShapeType
== "arc")
384 // LO does not have handle points for this, so CustGeom is enough.
387 if (sShapeType
== "bentArrow")
389 // LO has only one type, which have to be rotated, without handling points
390 // So CustGeom enough.
393 if (sShapeType
== "bentConnector2")
398 if (sShapeType
== "bentConnector3")
403 if (sShapeType
== "bentConnector4")
408 if (sShapeType
== "bentConnector5")
413 if (sShapeType
== "bentUpArrow")
415 // CustGeom Enough, no handle points
418 if (sShapeType
== "bevel")
420 auto aPoint1
= GetAdjustmentPointXValue(0);
421 if (!aPoint1
.nCurrVal
.has_value() || !aPoint1
.nMaxVal
.has_value()
422 || !aPoint1
.nMinVal
.has_value())
424 m_pDMLexporter
->WriteShapeTransformation(m_xShape
, XML_a
, IsXFlipped(), IsYFlipped(),
428 = std::lround(*aPoint1
.nCurrVal
/ (*aPoint1
.nMaxVal
- *aPoint1
.nMinVal
) * 50000);
429 return StartAVListWriting()
430 && WriteAV(u
"adj"_ustr
, OUString(u
"val " + OUString::number(nVal1
)))
431 && EndAVListWriting();
433 if (sShapeType
== "blockArc")
435 auto aPointR
= GetAdjustmentPointRadiusValue(0);
436 auto aPointA
= GetAdjustmentPointAngleValue(0);
437 if (!aPointA
.nCurrVal
.has_value() || !aPointA
.nMaxVal
.has_value()
438 || !aPointA
.nMinVal
.has_value() || !aPointR
.nCurrVal
.has_value()
439 || !aPointR
.nMaxVal
.has_value() || !aPointR
.nMinVal
.has_value())
441 m_pDMLexporter
->WriteShapeTransformation(m_xShape
, XML_a
, IsXFlipped(), IsYFlipped(),
444 = std::lround((*aPointA
.nCurrVal
< 0 ? 360 + *aPointA
.nCurrVal
: *aPointA
.nCurrVal
)
445 / (*aPointA
.nMaxVal
- *aPointA
.nMinVal
) * nConstOfMaxDegreeOf60th
);
446 tools::Long nVal2
= std::lround(
447 (*aPointA
.nCurrVal
> 180 ? 360 - *aPointA
.nCurrVal
: 180 - *aPointA
.nCurrVal
)
448 / (*aPointA
.nMaxVal
- *aPointA
.nMinVal
) * nConstOfMaxDegreeOf60th
);
449 tools::Long nVal3
= std::lround(
450 50000 - (*aPointR
.nCurrVal
/ (*aPointR
.nMaxVal
- *aPointR
.nMinVal
) * 50000));
451 return StartAVListWriting()
452 && WriteAV(u
"adj1"_ustr
, OUString(u
"val " + OUString::number(nVal1
)))
453 && WriteAV(u
"adj2"_ustr
, OUString(u
"val " + OUString::number(nVal2
)))
454 && WriteAV(u
"adj3"_ustr
, OUString(u
"val " + OUString::number(nVal3
)))
455 && EndAVListWriting();
457 if (sShapeType
== "borderCallout1")
459 // LO does not have this type, so it does not necessary to be mapped.
462 if (sShapeType
== "borderCallout2")
464 // LO does not have this type, so it does not necessary to be mapped.
467 if (sShapeType
== "borderCallout3")
469 // LO does not have this type, so it does not necessary to be mapped.
472 if (sShapeType
== "bracePair")
474 auto aPoint1
= GetAdjustmentPointYValue(0);
475 if (!aPoint1
.nCurrVal
.has_value() || !aPoint1
.nMaxVal
.has_value()
476 || !aPoint1
.nMinVal
.has_value())
479 m_pDMLexporter
->WriteShapeTransformation(m_xShape
, XML_a
, IsXFlipped(), IsYFlipped(),
482 = std::lround(*aPoint1
.nCurrVal
/ (*aPoint1
.nMaxVal
- *aPoint1
.nMinVal
) * 25000);
483 return StartAVListWriting()
484 && WriteAV(u
"adj"_ustr
, OUString(u
"val " + OUString::number(nVal1
)))
485 && EndAVListWriting();
487 if (sShapeType
== "bracketPair")
489 auto aPoint1
= GetAdjustmentPointYValue(0);
490 if (!aPoint1
.nCurrVal
.has_value() || !aPoint1
.nMaxVal
.has_value()
491 || !aPoint1
.nMinVal
.has_value())
494 m_pDMLexporter
->WriteShapeTransformation(m_xShape
, XML_a
, IsXFlipped(), IsYFlipped(),
497 = std::lround(*aPoint1
.nCurrVal
/ (*aPoint1
.nMaxVal
- *aPoint1
.nMinVal
) * 50000);
498 return StartAVListWriting()
499 && WriteAV(u
"adj"_ustr
, OUString(u
"val " + OUString::number(nVal1
)))
500 && EndAVListWriting();
502 if (sShapeType
== "callout1")
504 // LO does not have this type, so it does not necessary to be mapped.
507 if (sShapeType
== "callout2")
509 // LO does not have this type, so it does not necessary to be mapped.
512 if (sShapeType
== "callout3")
514 // LO does not have this type, so it does not necessary to be mapped.
517 if (sShapeType
== "can")
520 // Do the export as before.
522 if (sShapeType
== "chartPlus")
524 // LO does not have this type, so it does not necessary to be mapped.
527 if (sShapeType
== "chartStar")
529 // LO does not have this type, so it does not necessary to be mapped.
532 if (sShapeType
== "chartX")
534 // LO does not have this type, so it does not necessary to be mapped.
537 if (sShapeType
== "chord")
539 // CustGeom, because LO does not have handle points
542 if (sShapeType
== "circularArrow")
544 // LO does not have this type, so it does not necessary to be mapped.
547 if (sShapeType
== "cloud")
552 if (sShapeType
== "cloudCallout")
555 // Works fine without this, so export it like before.
557 if (sShapeType
== "cornerTabs")
559 // LO does not have this type, so it does not necessary to be mapped.
562 if (sShapeType
== "cube")
564 // Works fine without this, so export it like before.
567 if (sShapeType
== "curvedConnector2")
569 // Not necessary to be mapped
572 if (sShapeType
== "curvedConnector3")
574 // Not necessary to be mapped
577 if (sShapeType
== "curvedConnector4")
579 // Not necessary to be mapped
582 if (sShapeType
== "curvedConnector5")
584 // Not necessary to be mapped
587 if (sShapeType
== "curvedDownArrow")
589 // LO does not have this type, so it does not necessary to be mapped.
592 if (sShapeType
== "curvedLeftArrow")
594 // LO does not have this type, so it does not necessary to be mapped.
597 if (sShapeType
== "curvedRightArrow")
599 // LO does not have this type, so it does not necessary to be mapped.
602 if (sShapeType
== "curvedUpArrow")
604 // LO does not have this type, so it does not necessary to be mapped.
607 if (sShapeType
== "decagon")
609 // LO does not have this type, so it does not necessary to be mapped.
612 if (sShapeType
== "diagStripe")
614 // LO does not have this type, so it does not necessary to be mapped.
617 if (sShapeType
== "diamond")
619 // It does not have handle points so it do not have to be mapped.
622 if (sShapeType
== "dodecagon")
624 // LO does not have this type, so it does not necessary to be mapped.
627 if (sShapeType
== "donut")
632 if (sShapeType
== "doubleWave")
634 // LO does not have this type, so it does not necessary to be mapped.
637 if (sShapeType
== "downArrow")
639 auto aPointX
= GetAdjustmentPointXValue(0);
640 auto aPointY
= GetAdjustmentPointYValue(0);
641 if (!aPointX
.nCurrVal
.has_value() || !aPointX
.nMaxVal
.has_value()
642 || !aPointX
.nMinVal
.has_value() || !aPointY
.nCurrVal
.has_value()
643 || !aPointY
.nMaxVal
.has_value() || !aPointY
.nMinVal
.has_value())
646 m_pDMLexporter
->WriteShapeTransformation(m_xShape
, XML_a
, IsXFlipped(), IsYFlipped(),
648 tools::Long nMaxVal1
= 100000;
650 = 100000 * m_xShape
->getSize().Height
651 / std::min(m_xShape
->getSize().Width
, m_xShape
->getSize().Height
);
652 tools::Long nVal1
= std::lround((*aPointX
.nMaxVal
- *aPointX
.nCurrVal
)
653 / (*aPointX
.nMaxVal
- *aPointX
.nMinVal
) * nMaxVal1
);
654 tools::Long nVal2
= std::lround((*aPointY
.nMaxVal
- *aPointY
.nCurrVal
)
655 / (*aPointY
.nMaxVal
- *aPointY
.nMinVal
) * nMaxVal2
);
656 return StartAVListWriting()
657 && WriteAV(u
"adj1"_ustr
, OUString(u
"val " + OUString::number(nVal1
)))
658 && WriteAV(u
"adj2"_ustr
, OUString(u
"val " + OUString::number(nVal2
)))
659 && EndAVListWriting();
661 if (sShapeType
== "downArrowCallout")
663 auto aNeckFromBox
= GetAdjustmentPointXValue(1);
664 auto aHeadFromNeck
= GetAdjustmentPointXValue(2);
665 auto aHeadHeight
= GetAdjustmentPointYValue(1);
666 auto aBoxHeight
= GetAdjustmentPointYValue(0);
667 if (!aNeckFromBox
.nCurrVal
.has_value() || !aNeckFromBox
.nMaxVal
.has_value()
668 || !aNeckFromBox
.nMinVal
.has_value() || !aHeadFromNeck
.nCurrVal
.has_value()
669 || !aHeadFromNeck
.nMaxVal
.has_value() || !aHeadFromNeck
.nMinVal
.has_value()
670 || !aHeadHeight
.nCurrVal
.has_value() || !aHeadHeight
.nMaxVal
.has_value()
671 || !aHeadHeight
.nMinVal
.has_value() || !aBoxHeight
.nCurrVal
.has_value()
672 || !aBoxHeight
.nMaxVal
.has_value() || !aBoxHeight
.nMinVal
.has_value())
675 m_pDMLexporter
->WriteShapeTransformation(m_xShape
, XML_a
, IsXFlipped(), IsYFlipped(),
678 = 100000 * m_xShape
->getSize().Width
679 / std::min(m_xShape
->getSize().Width
, m_xShape
->getSize().Height
);
681 = 50000 * m_xShape
->getSize().Width
682 / std::min(m_xShape
->getSize().Width
, m_xShape
->getSize().Height
);
684 = 100000 * m_xShape
->getSize().Height
685 / std::min(m_xShape
->getSize().Width
, m_xShape
->getSize().Height
);
687 = std::lround((*aNeckFromBox
.nMaxVal
- *aNeckFromBox
.nCurrVal
)
688 / (*aNeckFromBox
.nMaxVal
- *aNeckFromBox
.nMinVal
) * nMaxVal1
);
689 tools::Long nVal2
= std::lround((10800 - *aHeadFromNeck
.nCurrVal
)
690 / (10800 - *aHeadFromNeck
.nMinVal
) * nMaxVal2
);
692 = std::lround((*aHeadHeight
.nMaxVal
- *aHeadHeight
.nCurrVal
)
693 / (*aHeadHeight
.nMaxVal
- *aHeadHeight
.nMinVal
) * nMaxVal3
);
694 tools::Long nVal4
= std::lround((*aBoxHeight
.nCurrVal
- *aBoxHeight
.nMinVal
)
695 / (21600 - *aBoxHeight
.nMinVal
) * 100000);
696 return StartAVListWriting()
697 && WriteAV(u
"adj1"_ustr
, OUString(u
"val " + OUString::number(nVal1
)))
698 && WriteAV(u
"adj2"_ustr
, OUString(u
"val " + OUString::number(nVal2
)))
699 && WriteAV(u
"adj3"_ustr
, OUString(u
"val " + OUString::number(nVal3
)))
700 && WriteAV(u
"adj4"_ustr
, OUString(u
"val " + OUString::number(nVal4
)))
701 && EndAVListWriting();
703 if (sShapeType
== "ellipse")
705 // Does not have handle points, so preset enough.
708 if (sShapeType
== "ellipseRibbon")
710 // LO does not have this type, so it does not necessary to be mapped.
713 if (sShapeType
== "ellipseRibbon2")
715 // LO does not have this type, so it does not necessary to be mapped.
718 if (sShapeType
== "flowChartAlternateProcess")
720 // Does not have handle points, so preset enough.
723 if (sShapeType
== "flowChartCollate")
725 // Does not have handle points, so preset enough.
728 if (sShapeType
== "flowChartConnector")
730 // Does not have handle points, so preset enough.
733 if (sShapeType
== "flowChartDecision")
735 // Does not have handle points, so preset enough.
738 if (sShapeType
== "flowChartDecision")
740 // Does not have handle points, so preset enough.
743 if (sShapeType
== "flowChartDelay")
745 // Does not have handle points, so preset enough.
748 if (sShapeType
== "flowChartDisplay")
750 // Does not have handle points, so preset enough.
753 if (sShapeType
== "flowChartDocument")
755 // Does not have handle points, so preset enough.
758 if (sShapeType
== "flowChartExtract")
760 // Does not have handle points, so preset enough.
763 if (sShapeType
== "flowChartInputOutput")
765 // Does not have handle points, so preset enough.
768 if (sShapeType
== "flowChartInternalStorage")
770 // Does not have handle points, so preset enough.
773 if (sShapeType
== "flowChartMagneticDisk")
775 // Does not have handle points, so preset enough.
778 if (sShapeType
== "flowChartMagneticDrum")
780 // Does not have handle points, so preset enough.
783 if (sShapeType
== "flowChartMagneticTape")
785 // Does not have handle points, so preset enough.
788 if (sShapeType
== "flowChartManualInput")
790 // Does not have handle points, so preset enough.
793 if (sShapeType
== "flowChartManualOperation")
795 // Does not have handle points, so preset enough.
798 if (sShapeType
== "flowChartMerge")
800 // Does not have handle points, so preset enough.
803 if (sShapeType
== "flowChartMultidocument")
805 // Does not have handle points, so preset enough.
808 if (sShapeType
== "flowChartOfflineStorage")
810 // Does not have handle points, so preset enough.
813 if (sShapeType
== "flowChartOffpageConnector")
815 // Does not have handle points, so preset enough.
818 if (sShapeType
== "flowChartOnlineStorage")
820 // Does not have handle points, so preset enough.
823 if (sShapeType
== "flowChartOr")
825 // Does not have handle points, so preset enough.
828 if (sShapeType
== "flowChartDecision")
830 // Does not have handle points, so preset enough.
833 if (sShapeType
== "flowChartPredefinedProcess")
835 // Does not have handle points, so preset enough.
838 if (sShapeType
== "flowChartPreparation")
840 // Does not have handle points, so preset enough.
843 if (sShapeType
== "flowChartPunchedCard")
845 // Does not have handle points, so preset enough.
848 if (sShapeType
== "flowChartPunchedTape")
850 // Does not have handle points, so preset enough.
853 if (sShapeType
== "flowChartSort")
855 // Does not have handle points, so preset enough.
858 if (sShapeType
== "flowChartSummingJunction")
860 // Does not have handle points, so preset enough.
863 if (sShapeType
== "flowChartTerminator")
865 // Does not have handle points, so preset enough.
868 if (sShapeType
== "foldedCorner")
873 if (sShapeType
== "frame")
878 if (sShapeType
== "funnel")
883 if (sShapeType
== "gear6")
888 if (sShapeType
== "gear9")
893 if (sShapeType
== "halfFrame")
895 // LO does not have this type, not necessary to map
898 if (sShapeType
== "heart")
903 if (sShapeType
== "heptagon")
905 // LO does not have this type, not necessary to map
908 if (sShapeType
== "hexagon")
910 auto aPoint1
= GetAdjustmentPointXValue(0);
911 if (!aPoint1
.nCurrVal
.has_value() || !aPoint1
.nMaxVal
.has_value()
912 || !aPoint1
.nMinVal
.has_value())
915 m_pDMLexporter
->WriteShapeTransformation(m_xShape
, XML_a
, IsXFlipped(), IsYFlipped(),
917 tools::Long nMaxVal
= 50000 * m_xShape
->getSize().Width
918 / std::min(m_xShape
->getSize().Width
, m_xShape
->getSize().Height
);
920 = std::lround(*aPoint1
.nCurrVal
/ (*aPoint1
.nMaxVal
- *aPoint1
.nMinVal
) * nMaxVal
);
921 return StartAVListWriting()
922 && WriteAV(u
"adj"_ustr
, OUString(u
"val " + OUString::number(nVal1
)))
923 && WriteAV(u
"vf"_ustr
, OUString(u
"val " + OUString::number(115470)))
924 && EndAVListWriting();
926 if (sShapeType
== "homePlate")
931 if (sShapeType
== "horizontalScroll")
936 if (sShapeType
== "irregularSeal1")
941 if (sShapeType
== "irregularSeal2")
946 if (sShapeType
== "leftArrow")
948 auto aPointX
= GetAdjustmentPointXValue(0);
949 auto aPointY
= GetAdjustmentPointYValue(0);
950 if (!aPointX
.nCurrVal
.has_value() || !aPointX
.nMaxVal
.has_value()
951 || !aPointX
.nMinVal
.has_value() || !aPointY
.nCurrVal
.has_value()
952 || !aPointY
.nMaxVal
.has_value() || !aPointY
.nMinVal
.has_value())
955 m_pDMLexporter
->WriteShapeTransformation(m_xShape
, XML_a
, IsXFlipped(), IsYFlipped(),
957 tools::Long nMaxVal1
= 100000;
960 * (double(m_xShape
->getSize().Width
)
961 / std::min(m_xShape
->getSize().Width
, m_xShape
->getSize().Height
));
962 tools::Long nVal1
= std::lround((*aPointY
.nMaxVal
- *aPointY
.nCurrVal
)
963 / (*aPointY
.nMaxVal
- *aPointY
.nMinVal
) * nMaxVal1
);
964 tools::Long nVal2
= std::lround((*aPointX
.nCurrVal
- *aPointX
.nMinVal
)
965 / (*aPointX
.nMaxVal
- *aPointX
.nMinVal
) * nMaxVal2
);
966 return StartAVListWriting()
967 && WriteAV(u
"adj1"_ustr
, OUString(u
"val " + OUString::number(nVal1
)))
968 && WriteAV(u
"adj2"_ustr
, OUString(u
"val " + OUString::number(nVal2
)))
969 && EndAVListWriting();
971 if (sShapeType
== "leftArrowCallout")
973 auto aBoxWidth
= GetAdjustmentPointXValue(0);
974 auto aNeckLength
= GetAdjustmentPointXValue(1);
975 auto aNeckFromBox
= GetAdjustmentPointYValue(1);
976 auto aHeadFromNeck
= GetAdjustmentPointYValue(2);
977 if (!aBoxWidth
.nCurrVal
.has_value() || !aBoxWidth
.nMaxVal
.has_value()
978 || !aBoxWidth
.nMinVal
.has_value() || !aNeckLength
.nCurrVal
.has_value()
979 || !aNeckLength
.nMaxVal
.has_value() || !aNeckLength
.nMinVal
.has_value()
980 || !aNeckFromBox
.nCurrVal
.has_value() || !aNeckFromBox
.nMaxVal
.has_value()
981 || !aNeckFromBox
.nMinVal
.has_value() || !aHeadFromNeck
.nCurrVal
.has_value()
982 || !aHeadFromNeck
.nMaxVal
.has_value() || !aHeadFromNeck
.nMinVal
.has_value())
985 m_pDMLexporter
->WriteShapeTransformation(m_xShape
, XML_a
, IsXFlipped(), IsYFlipped(),
988 = 100000 * m_xShape
->getSize().Height
989 / std::min(m_xShape
->getSize().Width
, m_xShape
->getSize().Height
);
991 = 50000 * m_xShape
->getSize().Height
992 / std::min(m_xShape
->getSize().Width
, m_xShape
->getSize().Height
);
994 = 100000 * m_xShape
->getSize().Width
995 / std::min(m_xShape
->getSize().Width
, m_xShape
->getSize().Height
);
997 = std::lround((*aNeckFromBox
.nMaxVal
- *aNeckFromBox
.nCurrVal
)
998 / (*aNeckFromBox
.nMaxVal
- *aNeckFromBox
.nMinVal
) * nMaxVal1
);
999 tools::Long nVal2
= std::lround((10800 - *aHeadFromNeck
.nCurrVal
)
1000 / (10800 - *aHeadFromNeck
.nMinVal
) * nMaxVal2
);
1001 tools::Long nVal3
= std::lround((*aNeckLength
.nCurrVal
- *aNeckLength
.nMinVal
)
1002 / (21600 - *aNeckLength
.nMinVal
) * nMaxVal3
);
1003 tools::Long nVal4
= std::lround((*aBoxWidth
.nMaxVal
- *aBoxWidth
.nCurrVal
)
1004 / (*aBoxWidth
.nMaxVal
- *aBoxWidth
.nMinVal
) * 100000);
1005 return StartAVListWriting()
1006 && WriteAV(u
"adj1"_ustr
, OUString(u
"val " + OUString::number(nVal1
)))
1007 && WriteAV(u
"adj2"_ustr
, OUString(u
"val " + OUString::number(nVal2
)))
1008 && WriteAV(u
"adj3"_ustr
, OUString(u
"val " + OUString::number(nVal3
)))
1009 && WriteAV(u
"adj4"_ustr
, OUString(u
"val " + OUString::number(nVal4
)))
1010 && EndAVListWriting();
1012 if (sShapeType
== "leftBrace")
1017 if (sShapeType
== "leftBracket")
1022 if (sShapeType
== "leftCircularArrow")
1024 // LO does not have this type, not necessary to map
1027 if (sShapeType
== "leftRightArrow")
1029 auto aPointX
= GetAdjustmentPointXValue(0);
1030 auto aPointY
= GetAdjustmentPointYValue(0);
1031 if (!aPointX
.nCurrVal
.has_value() || !aPointX
.nMaxVal
.has_value()
1032 || !aPointX
.nMinVal
.has_value() || !aPointY
.nCurrVal
.has_value()
1033 || !aPointY
.nMaxVal
.has_value() || !aPointY
.nMinVal
.has_value())
1036 m_pDMLexporter
->WriteShapeTransformation(m_xShape
, XML_a
, IsXFlipped(), IsYFlipped(),
1038 tools::Long nMaxVal1
= 100000;
1039 tools::Long nMaxVal2
1041 * (double(m_xShape
->getSize().Width
)
1042 / std::min(m_xShape
->getSize().Width
, m_xShape
->getSize().Height
));
1043 tools::Long nVal1
= std::lround((*aPointY
.nMaxVal
- *aPointY
.nCurrVal
)
1044 / (*aPointY
.nMaxVal
- *aPointY
.nMinVal
) * nMaxVal1
);
1045 tools::Long nVal2
= std::lround((*aPointX
.nCurrVal
- *aPointX
.nMinVal
)
1046 / (*aPointX
.nMaxVal
- *aPointX
.nMinVal
) * nMaxVal2
);
1047 return StartAVListWriting()
1048 && WriteAV(u
"adj1"_ustr
, OUString(u
"val " + OUString::number(nVal1
)))
1049 && WriteAV(u
"adj2"_ustr
, OUString(u
"val " + OUString::number(nVal2
)))
1050 && EndAVListWriting();
1052 if (sShapeType
== "leftRightArrowCallout")
1054 auto aNeckFromBox
= GetAdjustmentPointXValue(1);
1055 auto aHeadFromNeck
= GetAdjustmentPointXValue(2);
1056 auto aHeadHeight
= GetAdjustmentPointYValue(1);
1057 auto aBoxHeight
= GetAdjustmentPointYValue(0);
1058 if (!aNeckFromBox
.nCurrVal
.has_value() || !aNeckFromBox
.nMaxVal
.has_value()
1059 || !aNeckFromBox
.nMinVal
.has_value() || !aHeadFromNeck
.nCurrVal
.has_value()
1060 || !aHeadFromNeck
.nMaxVal
.has_value() || !aHeadFromNeck
.nMinVal
.has_value()
1061 || !aHeadHeight
.nCurrVal
.has_value() || !aHeadHeight
.nMaxVal
.has_value()
1062 || !aHeadHeight
.nMinVal
.has_value() || !aBoxHeight
.nCurrVal
.has_value()
1063 || !aBoxHeight
.nMaxVal
.has_value() || !aBoxHeight
.nMinVal
.has_value())
1066 m_pDMLexporter
->WriteShapeTransformation(m_xShape
, XML_a
, IsXFlipped(), IsYFlipped(),
1068 tools::Long nMaxVal1
1069 = 100000 * m_xShape
->getSize().Width
1070 / std::min(m_xShape
->getSize().Width
, m_xShape
->getSize().Height
);
1071 tools::Long nMaxVal2
1072 = 50000 * m_xShape
->getSize().Width
1073 / std::min(m_xShape
->getSize().Width
, m_xShape
->getSize().Height
);
1074 tools::Long nMaxVal3
1075 = 100000 * m_xShape
->getSize().Height
1076 / std::min(m_xShape
->getSize().Width
, m_xShape
->getSize().Height
);
1078 = std::lround((*aNeckFromBox
.nMaxVal
- *aNeckFromBox
.nCurrVal
)
1079 / (*aNeckFromBox
.nMaxVal
- *aNeckFromBox
.nMinVal
) * nMaxVal1
);
1080 tools::Long nVal2
= std::lround((10800 - *aHeadFromNeck
.nCurrVal
)
1081 / (10800 - *aHeadFromNeck
.nMinVal
) * nMaxVal2
);
1082 tools::Long nVal3
= std::lround((*aHeadHeight
.nCurrVal
- *aHeadHeight
.nMinVal
)
1083 / (21600 - *aHeadHeight
.nMinVal
) * nMaxVal3
);
1084 tools::Long nVal4
= std::lround((*aBoxHeight
.nCurrVal
- *aBoxHeight
.nMinVal
)
1085 / (10800 - *aBoxHeight
.nMinVal
) * 100000);
1086 return StartAVListWriting()
1087 && WriteAV(u
"adj1"_ustr
, OUString(u
"val " + OUString::number(nVal1
)))
1088 && WriteAV(u
"adj2"_ustr
, OUString(u
"val " + OUString::number(nVal2
)))
1089 && WriteAV(u
"adj3"_ustr
, OUString(u
"val " + OUString::number(nVal3
)))
1090 && WriteAV(u
"adj4"_ustr
, OUString(u
"val " + OUString::number(nVal4
)))
1091 && EndAVListWriting();
1093 if (sShapeType
== "leftRightCircularArrow")
1095 // Not found in word
1098 if (sShapeType
== "leftRightRibbon")
1100 // LO does not have this type so mapping not necessary
1103 if (sShapeType
== "leftRightUpArrow")
1106 // MS Word stretches the arrow to fit the bounding box; LO doesn't
1109 if (sShapeType
== "leftUpArrow")
1111 // MS Word's and LO's interpretations of what a leftUpArrow should look like
1112 // are too different to find a compromise :(
1114 if (sShapeType
== "lightningBolt")
1116 // Difference between the SDR and OOXML variants, custgeom?
1119 if (sShapeType
== "line")
1124 if (sShapeType
== "lineInv")
1129 if (sShapeType
== "mathDivide")
1131 // LO does not have this type so mapping not necessary
1134 if (sShapeType
== "mathEqual")
1136 // LO does not have this type so mapping not necessary
1139 if (sShapeType
== "mathMinus")
1141 // LO does not have this type so mapping not necessary
1144 if (sShapeType
== "mathMultiply")
1146 // LO does not have this type so mapping not necessary
1149 if (sShapeType
== "mathNotEqual")
1151 // LO does not have this type so mapping not necessary
1154 if (sShapeType
== "mathPlus")
1156 // LO does not have this type so mapping not necessary
1159 if (sShapeType
== "nonIsoscelesTrapezoid")
1164 if (sShapeType
== "noSmoking")
1169 if (sShapeType
== "notchedRightArrow")
1174 if (sShapeType
== "octagon")
1176 auto aPoint1
= GetAdjustmentPointXValue(0);
1177 if (!aPoint1
.nCurrVal
.has_value() || !aPoint1
.nMaxVal
.has_value()
1178 || !aPoint1
.nMinVal
.has_value())
1181 m_pDMLexporter
->WriteShapeTransformation(m_xShape
, XML_a
, IsXFlipped(), IsYFlipped(),
1184 = std::lround(*aPoint1
.nCurrVal
/ (*aPoint1
.nMaxVal
- *aPoint1
.nMinVal
) * 50000);
1185 return StartAVListWriting()
1186 && WriteAV(u
"adj"_ustr
, OUString(u
"val " + OUString::number(nVal1
)))
1187 && EndAVListWriting();
1189 if (sShapeType
== "parallelogram")
1191 auto aPoint1
= GetAdjustmentPointXValue(0);
1192 if (!aPoint1
.nCurrVal
.has_value() || !aPoint1
.nMaxVal
.has_value()
1193 || !aPoint1
.nMinVal
.has_value())
1196 m_pDMLexporter
->WriteShapeTransformation(m_xShape
, XML_a
, IsXFlipped(), IsYFlipped(),
1198 tools::Long nMaxVal
= 100000 * m_xShape
->getSize().Width
1199 / std::min(m_xShape
->getSize().Width
, m_xShape
->getSize().Height
);
1201 = std::lround(*aPoint1
.nCurrVal
/ (*aPoint1
.nMaxVal
- *aPoint1
.nMinVal
) * nMaxVal
);
1202 return StartAVListWriting()
1203 && WriteAV(u
"adj"_ustr
, OUString(u
"val " + OUString::number(nVal1
)))
1204 && EndAVListWriting();
1206 if (sShapeType
== "pentagon")
1211 if (sShapeType
== "pie")
1216 if (sShapeType
== "pieWedge")
1218 // Not found in word.
1221 if (sShapeType
== "plaque")
1226 if (sShapeType
== "plaqueTabs")
1228 // LO does not have this, so not necessary to map.
1231 if (sShapeType
== "plus")
1233 auto aPoint1
= GetAdjustmentPointXValue(0);
1234 if (!aPoint1
.nCurrVal
.has_value() || !aPoint1
.nMaxVal
.has_value()
1235 || !aPoint1
.nMinVal
.has_value())
1238 m_pDMLexporter
->WriteShapeTransformation(m_xShape
, XML_a
, IsXFlipped(), IsYFlipped(),
1241 = std::lround(*aPoint1
.nCurrVal
/ (*aPoint1
.nMaxVal
- *aPoint1
.nMinVal
) * 50000);
1242 return StartAVListWriting()
1243 && WriteAV(u
"adj"_ustr
, OUString(u
"val " + OUString::number(nVal1
)))
1244 && EndAVListWriting();
1246 if (sShapeType
== "quadArrow")
1251 if (sShapeType
== "quadArrowCallout")
1256 if (sShapeType
== "rect")
1258 // preset enough without AV points.
1261 if (sShapeType
== "ribbon")
1263 // LO does not have this, so not necessary to map.
1266 if (sShapeType
== "ribbon2")
1268 // LO does not have this, so not necessary to map.
1271 if (sShapeType
== "rightArrow")
1273 auto aPointX
= GetAdjustmentPointXValue(0);
1274 auto aPointY
= GetAdjustmentPointYValue(0);
1275 if (!aPointX
.nCurrVal
.has_value() || !aPointX
.nMaxVal
.has_value()
1276 || !aPointX
.nMinVal
.has_value() || !aPointY
.nCurrVal
.has_value()
1277 || !aPointY
.nMaxVal
.has_value() || !aPointY
.nMinVal
.has_value())
1280 m_pDMLexporter
->WriteShapeTransformation(m_xShape
, XML_a
, IsXFlipped(), IsYFlipped(),
1282 tools::Long nMaxVal1
= 100000;
1283 tools::Long nMaxVal2
1285 * (double(m_xShape
->getSize().Width
)
1286 / std::min(m_xShape
->getSize().Width
, m_xShape
->getSize().Height
));
1287 tools::Long nVal1
= std::lround((*aPointY
.nMaxVal
- *aPointY
.nCurrVal
)
1288 / (*aPointY
.nMaxVal
- *aPointY
.nMinVal
) * nMaxVal1
);
1289 tools::Long nVal2
= std::lround((*aPointX
.nMaxVal
- *aPointX
.nCurrVal
)
1290 / (*aPointX
.nMaxVal
- *aPointX
.nMinVal
) * nMaxVal2
);
1291 return StartAVListWriting()
1292 && WriteAV(u
"adj1"_ustr
, OUString(u
"val " + OUString::number(nVal1
)))
1293 && WriteAV(u
"adj2"_ustr
, OUString(u
"val " + OUString::number(nVal2
)))
1294 && EndAVListWriting();
1296 if (sShapeType
== "rightArrowCallout")
1298 auto aBoxWidth
= GetAdjustmentPointXValue(0);
1299 auto aNeckLength
= GetAdjustmentPointXValue(1);
1300 auto aNeckFromBox
= GetAdjustmentPointYValue(1);
1301 auto aHeadFromNeck
= GetAdjustmentPointYValue(2);
1302 if (!aBoxWidth
.nCurrVal
.has_value() || !aBoxWidth
.nMaxVal
.has_value()
1303 || !aBoxWidth
.nMinVal
.has_value() || !aNeckLength
.nCurrVal
.has_value()
1304 || !aNeckLength
.nMaxVal
.has_value() || !aNeckLength
.nMinVal
.has_value()
1305 || !aNeckFromBox
.nCurrVal
.has_value() || !aNeckFromBox
.nMaxVal
.has_value()
1306 || !aNeckFromBox
.nMinVal
.has_value() || !aHeadFromNeck
.nCurrVal
.has_value()
1307 || !aHeadFromNeck
.nMaxVal
.has_value() || !aHeadFromNeck
.nMinVal
.has_value())
1310 m_pDMLexporter
->WriteShapeTransformation(m_xShape
, XML_a
, IsXFlipped(), IsYFlipped(),
1312 tools::Long nMaxVal1
1313 = 100000 * m_xShape
->getSize().Height
1314 / std::min(m_xShape
->getSize().Width
, m_xShape
->getSize().Height
);
1315 tools::Long nMaxVal2
1316 = 50000 * m_xShape
->getSize().Height
1317 / std::min(m_xShape
->getSize().Width
, m_xShape
->getSize().Height
);
1318 tools::Long nMaxVal3
1319 = 100000 * m_xShape
->getSize().Width
1320 / std::min(m_xShape
->getSize().Width
, m_xShape
->getSize().Height
);
1322 = std::lround((*aNeckFromBox
.nMaxVal
- *aNeckFromBox
.nCurrVal
)
1323 / (*aNeckFromBox
.nMaxVal
- *aNeckFromBox
.nMinVal
) * nMaxVal1
);
1324 tools::Long nVal2
= std::lround((10800 - *aHeadFromNeck
.nCurrVal
)
1325 / (10800 - *aHeadFromNeck
.nMinVal
) * nMaxVal2
);
1327 = std::lround((*aNeckLength
.nMaxVal
- *aNeckLength
.nCurrVal
)
1328 / (*aNeckLength
.nMaxVal
- *aNeckLength
.nMinVal
) * nMaxVal3
);
1329 tools::Long nVal4
= std::lround((*aBoxWidth
.nCurrVal
- *aBoxWidth
.nMinVal
)
1330 / (21600 - *aBoxWidth
.nMinVal
) * 100000);
1331 return StartAVListWriting()
1332 && WriteAV(u
"adj1"_ustr
, OUString(u
"val " + OUString::number(nVal1
)))
1333 && WriteAV(u
"adj2"_ustr
, OUString(u
"val " + OUString::number(nVal2
)))
1334 && WriteAV(u
"adj3"_ustr
, OUString(u
"val " + OUString::number(nVal3
)))
1335 && WriteAV(u
"adj4"_ustr
, OUString(u
"val " + OUString::number(nVal4
)))
1336 && EndAVListWriting();
1338 if (sShapeType
== "rightBrace")
1343 if (sShapeType
== "rightBracket")
1348 if (sShapeType
== "round1Rect")
1350 // LO does not have this, so not necessary to map.
1353 if (sShapeType
== "round2DiagRect")
1355 // LO does not have this, so not necessary to map.
1358 if (sShapeType
== "round2SameRect")
1360 // LO does not have this, so not necessary to map.
1363 if (sShapeType
== "roundRect")
1365 tools::Long nVal1
= 0;
1366 if (m_xShape
->getSize().Width
>= m_xShape
->getSize().Height
)
1368 auto aPointX
= GetAdjustmentPointXValue(0);
1369 if (!aPointX
.nCurrVal
.has_value() || !aPointX
.nMaxVal
.has_value()
1370 || !aPointX
.nMinVal
.has_value())
1372 nVal1
= std::lround(*aPointX
.nCurrVal
/ (*aPointX
.nMaxVal
- *aPointX
.nMinVal
)
1377 auto aPointY
= GetAdjustmentPointYValue(0);
1378 if (!aPointY
.nCurrVal
.has_value() || !aPointY
.nMaxVal
.has_value()
1379 || !aPointY
.nMinVal
.has_value())
1381 nVal1
= std::lround(*aPointY
.nCurrVal
/ (*aPointY
.nMaxVal
- *aPointY
.nMinVal
)
1385 m_pDMLexporter
->WriteShapeTransformation(m_xShape
, XML_a
, IsXFlipped(), IsYFlipped(),
1387 return StartAVListWriting()
1388 && WriteAV(u
"adj"_ustr
, OUString(u
"val " + OUString::number(nVal1
)))
1389 && EndAVListWriting();
1391 if (sShapeType
== "rtTriangle")
1393 // Does not have AV points not necessary to map
1396 if (sShapeType
== "smileyFace")
1401 if (sShapeType
== "snip1Rect")
1403 // LO does not have this, so not necessary to map.
1406 if (sShapeType
== "snip2DiagRect")
1408 // LO does not have this, so not necessary to map.
1411 if (sShapeType
== "snip2SameRect")
1413 // LO does not have this, so not necessary to map.
1416 if (sShapeType
== "snipRoundRect")
1418 // LO does not have this, so not necessary to map.
1421 if (sShapeType
== "squareTabs")
1423 // LO does not have this, so not necessary to map.
1426 if (sShapeType
== "star10")
1428 // LO does not have this, so not necessary to map.
1431 if (sShapeType
== "star12")
1436 if (sShapeType
== "star16")
1438 // LO does not have this, so not necessary to map.
1441 if (sShapeType
== "star24")
1446 if (sShapeType
== "star32")
1448 // LO does not have this, so not necessary to map.
1451 if (sShapeType
== "star4")
1456 if (sShapeType
== "star5")
1461 if (sShapeType
== "star6")
1466 if (sShapeType
== "star7")
1468 // LO does not have this, so not necessary to map.
1471 if (sShapeType
== "star8")
1476 if (sShapeType
== "straightConnector1")
1478 // Not necessary to map.
1481 if (sShapeType
== "stripedRightArrow")
1486 if (sShapeType
== "sun")
1491 if (sShapeType
== "swooshArrow")
1493 // Not found in word.
1496 if (sShapeType
== "teardrop")
1501 if (sShapeType
== "trapezoid")
1506 if (sShapeType
== "triangle")
1508 auto aPoint1
= GetAdjustmentPointXValue(0);
1509 if (!aPoint1
.nCurrVal
.has_value() || !aPoint1
.nMaxVal
.has_value()
1510 || !aPoint1
.nMinVal
.has_value())
1513 m_pDMLexporter
->WriteShapeTransformation(m_xShape
, XML_a
, IsXFlipped(), IsYFlipped(),
1515 tools::Long nMaxVal
= 100000;
1517 = std::lround(*aPoint1
.nCurrVal
/ (*aPoint1
.nMaxVal
- *aPoint1
.nMinVal
) * nMaxVal
);
1518 return StartAVListWriting()
1519 && WriteAV(u
"adj"_ustr
, OUString(u
"val " + OUString::number(nVal1
)))
1520 && EndAVListWriting();
1522 if (sShapeType
== "upArrowCallout")
1524 auto aNeckFromBox
= GetAdjustmentPointXValue(1);
1525 auto aHeadFromNeck
= GetAdjustmentPointXValue(2);
1526 auto aHeadHeight
= GetAdjustmentPointYValue(1);
1527 auto aBoxHeight
= GetAdjustmentPointYValue(0);
1528 if (!aNeckFromBox
.nCurrVal
.has_value() || !aNeckFromBox
.nMaxVal
.has_value()
1529 || !aNeckFromBox
.nMinVal
.has_value() || !aHeadFromNeck
.nCurrVal
.has_value()
1530 || !aHeadFromNeck
.nMaxVal
.has_value() || !aHeadFromNeck
.nMinVal
.has_value()
1531 || !aHeadHeight
.nCurrVal
.has_value() || !aHeadHeight
.nMaxVal
.has_value()
1532 || !aHeadHeight
.nMinVal
.has_value() || !aBoxHeight
.nCurrVal
.has_value()
1533 || !aBoxHeight
.nMaxVal
.has_value() || !aBoxHeight
.nMinVal
.has_value())
1536 m_pDMLexporter
->WriteShapeTransformation(m_xShape
, XML_a
, IsXFlipped(), IsYFlipped(),
1538 tools::Long nMaxVal1
1539 = 100000 * m_xShape
->getSize().Width
1540 / std::min(m_xShape
->getSize().Width
, m_xShape
->getSize().Height
);
1541 tools::Long nMaxVal2
1542 = 50000 * m_xShape
->getSize().Width
1543 / std::min(m_xShape
->getSize().Width
, m_xShape
->getSize().Height
);
1544 tools::Long nMaxVal3
1545 = 100000 * m_xShape
->getSize().Height
1546 / std::min(m_xShape
->getSize().Width
, m_xShape
->getSize().Height
);
1548 = std::lround((*aNeckFromBox
.nMaxVal
- *aNeckFromBox
.nCurrVal
)
1549 / (*aNeckFromBox
.nMaxVal
- *aNeckFromBox
.nMinVal
) * nMaxVal1
);
1550 tools::Long nVal2
= std::lround((10800 - *aHeadFromNeck
.nCurrVal
)
1551 / (10800 - *aHeadFromNeck
.nMinVal
) * nMaxVal2
);
1552 tools::Long nVal3
= std::lround((*aHeadHeight
.nCurrVal
- *aHeadHeight
.nMinVal
)
1553 / (21600 - *aHeadHeight
.nMinVal
) * nMaxVal3
);
1554 tools::Long nVal4
= std::lround((*aBoxHeight
.nCurrVal
- *aBoxHeight
.nMinVal
)
1555 / (10800 - *aBoxHeight
.nMinVal
) * 100000);
1556 return StartAVListWriting()
1557 && WriteAV(u
"adj1"_ustr
, OUString(u
"val " + OUString::number(nVal1
)))
1558 && WriteAV(u
"adj2"_ustr
, OUString(u
"val " + OUString::number(nVal2
)))
1559 && WriteAV(u
"adj3"_ustr
, OUString(u
"val " + OUString::number(nVal3
)))
1560 && WriteAV(u
"adj4"_ustr
, OUString(u
"val " + OUString::number(nVal4
)))
1561 && EndAVListWriting();
1563 if (sShapeType
== "upDownArrow")
1565 auto aPointX
= GetAdjustmentPointXValue(0);
1566 auto aPointY
= GetAdjustmentPointYValue(0);
1567 if (!aPointX
.nCurrVal
.has_value() || !aPointX
.nMaxVal
.has_value()
1568 || !aPointX
.nMinVal
.has_value() || !aPointY
.nCurrVal
.has_value()
1569 || !aPointY
.nMaxVal
.has_value() || !aPointY
.nMinVal
.has_value())
1572 m_pDMLexporter
->WriteShapeTransformation(m_xShape
, XML_a
, IsXFlipped(), IsYFlipped(),
1574 tools::Long nMaxVal1
= 100000;
1575 tools::Long nMaxVal2
1576 = 50000 * m_xShape
->getSize().Height
1577 / std::min(m_xShape
->getSize().Width
, m_xShape
->getSize().Height
);
1578 tools::Long nVal1
= std::lround((*aPointX
.nMaxVal
- *aPointX
.nCurrVal
)
1579 / (*aPointX
.nMaxVal
- *aPointX
.nMinVal
) * nMaxVal1
);
1580 tools::Long nVal2
= std::lround((*aPointY
.nCurrVal
- *aPointY
.nMinVal
)
1581 / (*aPointY
.nMaxVal
- *aPointY
.nMinVal
) * nMaxVal2
);
1582 return StartAVListWriting()
1583 && WriteAV(u
"adj1"_ustr
, OUString(u
"val " + OUString::number(nVal1
)))
1584 && WriteAV(u
"adj2"_ustr
, OUString(u
"val " + OUString::number(nVal2
)))
1585 && EndAVListWriting();
1587 if (sShapeType
== "upArrow")
1589 auto aPointX
= GetAdjustmentPointXValue(0);
1590 auto aPointY
= GetAdjustmentPointYValue(0);
1591 if (!aPointX
.nCurrVal
.has_value() || !aPointX
.nMaxVal
.has_value()
1592 || !aPointX
.nMinVal
.has_value() || !aPointY
.nCurrVal
.has_value()
1593 || !aPointY
.nMaxVal
.has_value() || !aPointY
.nMinVal
.has_value())
1596 m_pDMLexporter
->WriteShapeTransformation(m_xShape
, XML_a
, IsXFlipped(), IsYFlipped(),
1598 tools::Long nMaxVal1
= 100000;
1599 tools::Long nMaxVal2
1600 = 100000 * m_xShape
->getSize().Height
1601 / std::min(m_xShape
->getSize().Width
, m_xShape
->getSize().Height
);
1602 tools::Long nVal1
= std::lround((*aPointX
.nMaxVal
- *aPointX
.nCurrVal
)
1603 / (*aPointX
.nMaxVal
- *aPointX
.nMinVal
) * nMaxVal1
);
1604 tools::Long nVal2
= std::lround((*aPointY
.nCurrVal
- *aPointY
.nMinVal
)
1605 / (*aPointY
.nMaxVal
- *aPointY
.nMinVal
) * nMaxVal2
);
1606 return StartAVListWriting()
1607 && WriteAV(u
"adj1"_ustr
, OUString(u
"val " + OUString::number(nVal1
)))
1608 && WriteAV(u
"adj2"_ustr
, OUString(u
"val " + OUString::number(nVal2
)))
1609 && EndAVListWriting();
1611 if (sShapeType
== "upDownArrowCallout")
1616 if (sShapeType
== "uturnArrow")
1618 // LO does not have like this.
1621 if (sShapeType
== "verticalScroll")
1626 if (sShapeType
== "wave")
1628 // LO does not have.
1631 if (sShapeType
== "wedgeEllipseCallout")
1636 if (sShapeType
== "wedgeRectCallout")
1641 if (sShapeType
== "wedgeRoundRectCallout")
1649 // Problem detected with the writing, aborting and trying to find another way.
1653 // Default, nothing happened return.