summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/svx/svdotext.hxx2
-rw-r--r--oox/source/export/drawingml.cxx19
-rw-r--r--sd/qa/unit/data/pptx/font-scale.pptxbin0 -> 40239 bytes
-rw-r--r--sd/qa/unit/export-tests-ooxml2.cxx17
-rw-r--r--svx/source/svdraw/svdotext.cxx63
5 files changed, 100 insertions, 1 deletions
diff --git a/include/svx/svdotext.hxx b/include/svx/svdotext.hxx
index 132a77800c14..45819d59ced1 100644
--- a/include/svx/svdotext.hxx
+++ b/include/svx/svdotext.hxx
@@ -215,6 +215,7 @@ protected:
virtual SdrObject* getFullDragClone() const override;
+
public:
const Point& GetTextEditOffset() const { return maTextEditOffset; }
void SetTextEditOffset(const Point& rNew) { maTextEditOffset = rNew; }
@@ -390,6 +391,7 @@ public:
// FitToSize and Fontwork are not taken into account in GetTextSize()!
virtual const Size& GetTextSize() const;
void FitFrameToTextSize();
+ double GetFontScaleY() const;
// Simultaneously sets the text into the Outliner (possibly
// the one of the EditOutliner) and sets the PaperSize.
diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx
index aa9ba6a4dfac..cc5cf27bc47b 100644
--- a/oox/source/export/drawingml.cxx
+++ b/oox/source/export/drawingml.cxx
@@ -2325,8 +2325,25 @@ void DrawingML::WriteText( const Reference< XInterface >& rXIface, const OUStrin
TextFitToSizeType eFit = TextFitToSizeType_NONE;
if (GETA(TextFitToSize))
mAny >>= eFit;
+
if (eFit == TextFitToSizeType_AUTOFIT)
- mpFS->singleElementNS(XML_a, XML_normAutofit, FSEND);
+ {
+ const sal_Int32 MAX_SCALE_VAL = 100000;
+ sal_Int32 nFontScale = MAX_SCALE_VAL;
+ SvxShapeText* pTextShape = dynamic_cast<SvxShapeText*>(rXIface.get());
+ if (pTextShape)
+ {
+ SdrTextObj* pTextObject = dynamic_cast<SdrTextObj*>(pTextShape->GetSdrObject());
+ if (pTextObject)
+ {
+ double fScaleY = pTextObject->GetFontScaleY();
+ nFontScale = static_cast<sal_uInt32>(fScaleY * 100) * 1000;
+ }
+ }
+
+ mpFS->singleElementNS(XML_a, XML_normAutofit, XML_fontScale,
+ ( nFontScale < MAX_SCALE_VAL && nFontScale > 0 ) ? I32S(nFontScale) : nullptr, FSEND);
+ }
}
mpFS->endElementNS((nXmlNamespace ? nXmlNamespace : XML_a), XML_bodyPr);
}
diff --git a/sd/qa/unit/data/pptx/font-scale.pptx b/sd/qa/unit/data/pptx/font-scale.pptx
new file mode 100644
index 000000000000..df33b20cebca
--- /dev/null
+++ b/sd/qa/unit/data/pptx/font-scale.pptx
Binary files differ
diff --git a/sd/qa/unit/export-tests-ooxml2.cxx b/sd/qa/unit/export-tests-ooxml2.cxx
index 80518487b96a..7cfb05b3228a 100644
--- a/sd/qa/unit/export-tests-ooxml2.cxx
+++ b/sd/qa/unit/export-tests-ooxml2.cxx
@@ -125,6 +125,7 @@ public:
void testGroupsRotatedPosition();
void testAccentColor();
void testTdf114848();
+ void testFontScale();
void testTdf115394();
void testTdf115394Zero();
@@ -173,6 +174,7 @@ public:
CPPUNIT_TEST(testGroupsRotatedPosition);
CPPUNIT_TEST(testAccentColor);
CPPUNIT_TEST(testTdf114848);
+ CPPUNIT_TEST(testFontScale);
CPPUNIT_TEST(testTdf115394);
CPPUNIT_TEST(testTdf115394Zero);
@@ -1134,6 +1136,21 @@ void SdOOXMLExportTest2::testGroupRotation()
assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:grpSp/p:sp[2]/p:spPr/a:xfrm", "rot", "20400000");
}
+void SdOOXMLExportTest2::testFontScale()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc("/sd/qa/unit/data/pptx/font-scale.pptx"), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+ xmlDocPtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide1.xml");
+
+ // Rounding errors possible, approximate value
+ OUString sScale = getXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:bodyPr/a:normAutofit", "fontScale");
+ if (sScale != "73000" && sScale != "72000" && sScale != "74000")
+ CPPUNIT_ASSERT_EQUAL(OUString("73000"), sScale);
+
+ xDocShRef->DoClose();
+}
+
void SdOOXMLExportTest2::testTdf115394()
{
sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc("/sd/qa/unit/data/pptx/tdf115394.pptx"), PPTX);
diff --git a/svx/source/svdraw/svdotext.cxx b/svx/source/svdraw/svdotext.cxx
index 6824c46bad95..e7ba56e1aac6 100644
--- a/svx/source/svdraw/svdotext.cxx
+++ b/svx/source/svdraw/svdotext.cxx
@@ -1267,6 +1267,69 @@ void SdrTextObj::ImpSetupDrawOutlinerForPaint( bool bContourFrame,
}
}
+double SdrTextObj::GetFontScaleY() const
+{
+ SdrText* pText = getActiveText();
+ if (pText == nullptr || !pText->GetOutlinerParaObject() || pModel == nullptr)
+ return 1.0;
+
+ SdrOutliner& rOutliner = ImpGetDrawOutliner();
+ const Size aShapeSize = GetSnapRect().GetSize();
+ const Size aSize = Size(aShapeSize.Width() - GetTextLeftDistance() - GetTextRightDistance(),
+ aShapeSize.Height() - GetTextUpperDistance() - GetTextLowerDistance());
+
+ rOutliner.SetPaperSize(aSize);
+ rOutliner.SetUpdateMode(true);
+ rOutliner.SetText(*pText->GetOutlinerParaObject());
+ bool bIsVerticalWriting = IsVerticalWriting();
+
+ // Algorithm from SdrTextObj::ImpAutoFitText
+
+ sal_uInt16 nMinStretchX = 0, nMinStretchY = 0;
+ sal_uInt16 nCurrStretchX = 100, nCurrStretchY = 100;
+ sal_uInt16 aOldStretchXVals[] = { 0,0,0 };
+ const size_t aStretchArySize = SAL_N_ELEMENTS(aOldStretchXVals);
+ for (unsigned int i = 0; i<aStretchArySize; ++i)
+ {
+ const Size aCurrTextSize = rOutliner.CalcTextSizeNTP();
+ double fFactor(1.0);
+ if (bIsVerticalWriting)
+ {
+ if (aCurrTextSize.Width() != 0)
+ {
+ fFactor = double(aSize.Width()) / aCurrTextSize.Width();
+ }
+ }
+ else if (aCurrTextSize.Height() != 0)
+ {
+ fFactor = double(aSize.Height()) / aCurrTextSize.Height();
+ }
+ fFactor = std::sqrt(fFactor);
+
+ rOutliner.GetGlobalCharStretching(nCurrStretchX, nCurrStretchY);
+
+ if (fFactor >= 1.0)
+ {
+ nMinStretchX = std::max(nMinStretchX, nCurrStretchX);
+ nMinStretchY = std::max(nMinStretchY, nCurrStretchY);
+ }
+
+ aOldStretchXVals[i] = nCurrStretchX;
+ if (std::find(aOldStretchXVals, aOldStretchXVals + i, nCurrStretchX) != aOldStretchXVals + i)
+ break; // same value already attained once; algo is looping, exit
+
+ if (fFactor < 1.0 || nCurrStretchX != 100)
+ {
+ nCurrStretchX = sal::static_int_cast<sal_uInt16>(nCurrStretchX*fFactor);
+ nCurrStretchY = sal::static_int_cast<sal_uInt16>(nCurrStretchY*fFactor);
+ rOutliner.SetGlobalCharStretching(std::min(sal_uInt16(100), nCurrStretchX),
+ std::min(sal_uInt16(100), nCurrStretchY));
+ }
+ }
+
+ return std::min(sal_uInt16(100), nCurrStretchY) / 100.0;
+}
+
void SdrTextObj::ImpAutoFitText( SdrOutliner& rOutliner ) const
{
const Size aShapeSize=GetSnapRect().GetSize();