Kaydet (Commit) c8b2849d authored tarafından Miklos Vajna's avatar Miklos Vajna

Related: tdf#120028 PPTX import: fix font size of multi-col shape text

Normal shapes have a TextFitToSize property for this, but table cell
content has to be scaled manually, as the rendering has no automatic
support for them. Luckily the file format has the info we need to scale
at import time.

Change-Id: Ibbcc4b8685995261536cce88b8c0774e148f708e
Reviewed-on: https://gerrit.libreoffice.org/60880Reviewed-by: 's avatarMiklos Vajna <vmiklos@collabora.co.uk>
Tested-by: Jenkins
üst 4c945b22
......@@ -44,6 +44,8 @@ struct TextBodyProperties
OUString msPrst;
/// Number of requested columns.
sal_Int32 mnNumCol = 1;
/// Normal autofit: font scale (default: 100%).
sal_Int32 mnFontScale = 100000;
explicit TextBodyProperties();
......
......@@ -47,6 +47,8 @@ struct TextCharacterProperties
Color maHighlightColor;
OptValue< OUString > moLang;
OptValue< sal_Int32 > moHeight;
/// If a font scale has to be applied manually to moHeight.
OptValue< double > moFontScale;
OptValue< sal_Int32 > moSpacing;
OptValue< sal_Int32 > moUnderline;
OptValue< sal_Int32 > moBaseline;
......
......@@ -20,6 +20,7 @@
#include <drawingml/table/tableproperties.hxx>
#include <drawingml/table/tablestylelist.hxx>
#include <drawingml/textbody.hxx>
#include <drawingml/textparagraph.hxx>
#include <oox/drawingml/drawingmltypes.hxx>
#include <com/sun/star/table/XTable.hpp>
#include <com/sun/star/container/XNameContainer.hpp>
......@@ -321,6 +322,8 @@ void TableProperties::pullFromTextBody(oox::drawingml::TextBodyPtr pTextBody, sa
// Create the cells and distribute the paragraphs from pTextBody.
sal_Int32 nNumPara = pTextBody->getParagraphs().size();
sal_Int32 nParaPerCol = std::ceil(double(nNumPara) / nNumCol);
// Font scale of text body will be applied at a text run level.
sal_Int32 nFontScale = pTextBody->getTextProperties().mnFontScale;
size_t nPara = 0;
for (sal_Int32 nCol = 0; nCol < nNumCol; ++nCol)
{
......@@ -331,7 +334,16 @@ void TableProperties::pullFromTextBody(oox::drawingml::TextBodyPtr pTextBody, sa
for (sal_Int32 nParaInCol = 0; nParaInCol < nParaPerCol; ++nParaInCol)
{
if (nPara < pTextBody->getParagraphs().size())
pCellTextBody->appendParagraph(pTextBody->getParagraphs()[nPara]);
{
std::shared_ptr<oox::drawingml::TextParagraph> pParagraph
= pTextBody->getParagraphs()[nPara];
if (nFontScale != 100000)
{
for (auto& pRun : pParagraph->getRuns())
pRun->getTextCharacterProperties().moFontScale = nFontScale;
}
pCellTextBody->appendParagraph(pParagraph);
}
++nPara;
}
}
......
......@@ -155,9 +155,12 @@ ContextHandlerRef TextBodyPropertiesContext::onCreateContext( sal_Int32 aElement
mrTextBodyProp.maPropertyMap.setProperty( PROP_TextAutoGrowHeight, false); // CT_TextNoAutofit
break;
case A_TOKEN( normAutofit ): // CT_TextNormalAutofit
{
mrTextBodyProp.maPropertyMap.setProperty( PROP_TextFitToSize, TextFitToSizeType_AUTOFIT);
mrTextBodyProp.maPropertyMap.setProperty( PROP_TextAutoGrowHeight, false);
mrTextBodyProp.mnFontScale = rAttribs.getInteger(XML_fontScale, 100000);
break;
}
case A_TOKEN( spAutoFit ):
{
const sal_Int32 tVert = mrTextBodyProp.moVert.get( XML_horz );
......
......@@ -52,6 +52,7 @@ void TextCharacterProperties::assignUsed( const TextCharacterProperties& rSource
maHighlightColor.assignIfUsed( rSourceProps.maHighlightColor );
maUnderlineColor.assignIfUsed( rSourceProps.maUnderlineColor );
moHeight.assignIfUsed( rSourceProps.moHeight );
moFontScale.assignIfUsed(rSourceProps.moFontScale);
moSpacing.assignIfUsed( rSourceProps.moSpacing );
moUnderline.assignIfUsed( rSourceProps.moUnderline );
moBaseline.assignIfUsed( rSourceProps.moBaseline );
......@@ -117,6 +118,8 @@ void TextCharacterProperties::pushToPropMap( PropertyMap& rPropMap, const XmlFil
if( moHeight.has() )
{
float fHeight = GetFontHeight( moHeight.get() );
if (moFontScale.has())
fHeight *= (moFontScale.get() / 100000);
rPropMap.setProperty( PROP_CharHeight, fHeight);
rPropMap.setProperty( PROP_CharHeightAsian, fHeight);
rPropMap.setProperty( PROP_CharHeightComplex, fHeight);
......
......@@ -2561,6 +2561,7 @@ void SdImportTest::testTdf119015()
void SdImportTest::testTdf120028()
{
// Check that the table shape has 4 columns.
::sd::DrawDocShellRef xDocShRef
= loadURL(m_directories.getURLFromSrc("/sd/qa/unit/data/pptx/tdf120028.pptx"), PPTX);
uno::Reference<drawing::XDrawPagesSupplier> xDoc(xDocShRef->GetDoc()->getUnoModel(),
......@@ -2580,6 +2581,17 @@ void SdImportTest::testTdf120028()
uno::Reference<table::XTableColumns> xColumns = xModel->getColumns();
CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(4), xColumns->getCount());
// Check font size in the A1 cell.
uno::Reference<table::XCellRange> xCells(xModel, uno::UNO_QUERY);
uno::Reference<beans::XPropertySet> xCell(xCells->getCellByPosition(0, 0), uno::UNO_QUERY);
uno::Reference<text::XTextRange> xParagraph(getParagraphFromShape(0, xCell));
uno::Reference<text::XTextRange> xRun(getRunFromParagraph(0, xParagraph));
uno::Reference<beans::XPropertySet> xPropSet(xRun, uno::UNO_QUERY);
double fCharHeight = 0;
xPropSet->getPropertyValue("CharHeight") >>= fCharHeight;
// This failed, non-scaled height was 13.5.
CPPUNIT_ASSERT_DOUBLES_EQUAL(11.5, fCharHeight, 1E-12);
xDocShRef->DoClose();
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment