summaryrefslogtreecommitdiff
path: root/xmloff
diff options
context:
space:
mode:
authorRegina Henschel <rb.henschel@t-online.de>2022-08-17 02:31:44 +0200
committerMiklos Vajna <vmiklos@collabora.com>2022-09-14 08:32:08 +0200
commitc70ee4a6b9071468255e5d4fdb893e9c9bdf4fad (patch)
tree1df672814e562a42f0da889acbc9789322a67685 /xmloff
parentc97c60f70e9e6de594f7e0e0b85f17944c640dcf (diff)
tdf#149551 use 'WritingMode' instead of TextPreRotateAngle
Commit 7e23cbdbb6ec0247a29ed8a8f744c01e10963ea0 changed the code so, that TextPreRotateAngle is used to track ooxml vert attribute. This patch changes it so, that the style attribute WritingMode is used. Now text direction can be written in 'writing-mode' attribute in the graphic properties in ODF, same for shapes as for frames. The needed conversion from WritingMode BT-LR and TB_LR90 to TextPreRotateAngle for rendering of text in custom shapes is now in one place in class SdrObjectCustomshape. The shape edit engine cannot yet render it itself. Some unit tests are adapted to use WritingMode property instead of TextPreRotateAngle. The value text::WritingMode2::TB_RL90 is introduced, corresponding to vert='vert' and textDirection='tbRl' or ='rl' in OOXML. It is used for frames too, so that the original text direction is preserved and vert='eaVert' can be distinguished from vert='vert'. TextPreRotateAngle is currently still used in SmartArt import for 'upr' and 'grav' and in emulating 'upright' but no longer to emulate text direction. Change-Id: Idc4339bbfc3592fe90b154d75e2c404a1fa30856 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/138813 Tested-by: Jenkins Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
Diffstat (limited to 'xmloff')
-rw-r--r--xmloff/inc/xmlsdtypes.hxx2
-rw-r--r--xmloff/source/core/xmltoken.cxx1
-rw-r--r--xmloff/source/draw/sdpropls.cxx37
-rw-r--r--xmloff/source/draw/shapeexport.cxx30
-rw-r--r--xmloff/source/style/prhdlfac.cxx3
-rw-r--r--xmloff/source/style/xmlexppr.cxx3
-rw-r--r--xmloff/source/token/tokens.txt1
7 files changed, 72 insertions, 5 deletions
diff --git a/xmloff/inc/xmlsdtypes.hxx b/xmloff/inc/xmlsdtypes.hxx
index 898c475bd7ef..c6e0ad315e22 100644
--- a/xmloff/inc/xmlsdtypes.hxx
+++ b/xmloff/inc/xmlsdtypes.hxx
@@ -118,6 +118,7 @@
//////////////////////////////////////////////////////////////////////////////
#define XML_SD_TYPE_CELL_ROTATION_ANGLE (XML_SD_TYPES_START + 79 )
+#define XML_SD_TYPE_WRITINGMODE2 (XML_SD_TYPES_START + 80 )
#define CTF_NUMBERINGRULES 1000
#define CTF_CONTROLWRITINGMODE 1001
@@ -200,5 +201,6 @@
#define CTF_SD_OLE_VIS_AREA_EXPORT_HEIGHT 1063
//////////////////////////////////////////////////////////////////////////////
+#define CTF_WRITINGMODE2 1064
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/xmloff/source/core/xmltoken.cxx b/xmloff/source/core/xmltoken.cxx
index 30158b20660e..ca5c7ec21b08 100644
--- a/xmloff/source/core/xmltoken.cxx
+++ b/xmloff/source/core/xmltoken.cxx
@@ -2299,6 +2299,7 @@ namespace xmloff::token {
TOKEN( "lr", XML_LR ),
TOKEN( "rl", XML_RL ),
TOKEN( "tb", XML_TB ),
+ TOKEN( "tb-rl90", XML_TB_RL90 ),
TOKEN( "layout-grid-color", XML_LAYOUT_GRID_COLOR ),
TOKEN( "layout-grid-lines", XML_LAYOUT_GRID_LINES ),
diff --git a/xmloff/source/draw/sdpropls.cxx b/xmloff/source/draw/sdpropls.cxx
index a72a57261b58..3490625e1e8b 100644
--- a/xmloff/source/draw/sdpropls.cxx
+++ b/xmloff/source/draw/sdpropls.cxx
@@ -317,6 +317,9 @@ const XMLPropertyMapEntry aXMLSDProperties[] =
// misc object properties
GMAP( "MoveProtect", XML_NAMESPACE_STYLE, XML_PROTECT, XML_SD_TYPE_MOVE_PROTECT|MID_FLAG_MULTI_PROPERTY|MID_FLAG_MERGE_ATTRIBUTE, CTF_SD_MOVE_PROTECT ),
GMAP( "SizeProtect", XML_NAMESPACE_STYLE, XML_PROTECT, XML_SD_TYPE_SIZE_PROTECT|MID_FLAG_MULTI_PROPERTY|MID_FLAG_MERGE_ATTRIBUTE, CTF_SD_SIZE_PROTECT ),
+ GMAP( "WritingMode", XML_NAMESPACE_STYLE, XML_WRITING_MODE, XML_SD_TYPE_WRITINGMODE2, CTF_WRITINGMODE2 ),
+ {"WritingMode", XML_NAMESPACE_LO_EXT, XML_WRITING_MODE, XML_SD_TYPE_WRITINGMODE2|XML_TYPE_PROP_GRAPHIC, 0, SvtSaveOptions::ODFSVER_FUTURE_EXTENDED, true},
+
MAP_END()
};
@@ -589,6 +592,18 @@ SvXMLEnumMapEntry<text::WritingMode> const aXML_WritingMode_EnumMap[] =
{ XML_TOKEN_INVALID, text::WritingMode(0) }
};
+SvXMLEnumMapEntry<sal_Int16> const aXML_WritingMode2_EnumMap[] =
+{
+ { XML_LR_TB, text::WritingMode2::LR_TB },
+ { XML_RL_TB, text::WritingMode2::RL_TB },
+ { XML_TB_RL, text::WritingMode2::TB_RL },
+ { XML_TB_LR, text::WritingMode2::TB_LR },
+ { XML_PAGE, text::WritingMode2::CONTEXT },
+ { XML_BT_LR, text::WritingMode2::BT_LR },
+ { XML_TB_RL90, text::WritingMode2::TB_RL90 },
+ { XML_TOKEN_INVALID, text::WritingMode2::LR_TB }
+};
+
SvXMLEnumMapEntry<drawing::TextAnimationKind> const pXML_TextAnimation_Enum[] =
{
{ XML_NONE, drawing::TextAnimationKind_NONE },
@@ -1061,6 +1076,11 @@ const XMLPropertyHandler* XMLSdPropHdlFactory::GetPropertyHandler( sal_Int32 nTy
pHdl = new XMLEnumPropertyHdl( aXML_WritingMode_EnumMap );
break;
}
+ case XML_SD_TYPE_WRITINGMODE2 :
+ {
+ pHdl = new XMLConstantsPropertyHandler ( aXML_WritingMode2_EnumMap, XML_LR_TB );
+ break;
+ }
case XML_SD_TYPE_PRESPAGE_VISIBILITY :
{
pHdl = new XMLNamedBoolPropertyHdl( GetXMLToken(XML_VISIBLE), GetXMLToken(XML_HIDDEN) );
@@ -1360,6 +1380,7 @@ void XMLShapeExportPropertyMapper::ContextFilter(
XMLPropertyState* pClip11State = nullptr;
XMLPropertyState* pClipState = nullptr;
+ XMLPropertyState* pGraphicWritingMode2 = nullptr;
XMLPropertyState* pShapeWritingMode = nullptr;
XMLPropertyState* pTextWritingMode = nullptr;
XMLPropertyState* pControlWritingMode = nullptr;
@@ -1391,6 +1412,9 @@ void XMLShapeExportPropertyMapper::ContextFilter(
property->mnIndex = -1;
}
break;
+ case CTF_WRITINGMODE2:
+ pGraphicWritingMode2 = property;
+ break;
case CTF_WRITINGMODE:
pShapeWritingMode = property;
break;
@@ -1484,6 +1508,19 @@ void XMLShapeExportPropertyMapper::ContextFilter(
}
}
+ if (pGraphicWritingMode2)
+ {
+ // A style:writing-mode attribute G in graphic-properties is only evaluated if there is no
+ // style:writing-mode attribute P in the paragraph-properties of the same graphic style.
+ // Otherwise the value of P is used. For values lr-tb, rl-tb and tb-rl the values G and P
+ // should be the same. But other values in G cannot be expressed in P and would produce default
+ // 0 value in P, preventing evaluation of G.
+ sal_Int16 eGraphicWritingMode;
+ if ((pGraphicWritingMode2->maValue >>= eGraphicWritingMode)
+ && eGraphicWritingMode >= text::WritingMode2::TB_LR && pShapeWritingMode)
+ pShapeWritingMode->mnIndex = -1;
+ }
+
// check for duplicate writing mode
if( pShapeWritingMode && (pTextWritingMode || pControlWritingMode) )
{
diff --git a/xmloff/source/draw/shapeexport.cxx b/xmloff/source/draw/shapeexport.cxx
index c44349184770..a9f0291a53b8 100644
--- a/xmloff/source/draw/shapeexport.cxx
+++ b/xmloff/source/draw/shapeexport.cxx
@@ -80,6 +80,7 @@
#include <com/sun/star/presentation/ClickAction.hpp>
#include <com/sun/star/style/XStyle.hpp>
#include <com/sun/star/table/XColumnRowRange.hpp>
+#include <com/sun/star/text/WritingMode2.hpp>
#include <com/sun/star/text/XText.hpp>
#include <comphelper/classids.hxx>
@@ -4313,7 +4314,8 @@ static void ImpExportEnhancedGeometry( SvXMLExport& rExport, const uno::Referenc
OUString aStr;
OUStringBuffer aStrBuffer;
- double fTextRotateAngle(0.0); // sum TextRotateAngle and TextPreRotateAngle
+ double fTextRotateAngle(0.0);
+ double fTextPreRotateAngle(0.0); // will be consolidated with fTextRotateAngle at the end
SvXMLUnitConverter& rUnitConverter = rExport.GetMM100UnitConverter();
uno::Reference< beans::XPropertySetInfo > xPropSetInfo( xPropSet->getPropertySetInfo() );
@@ -4366,11 +4368,13 @@ static void ImpExportEnhancedGeometry( SvXMLExport& rExport, const uno::Referenc
}
break;
case EAS_TextPreRotateAngle :
+ {
+ rGeoProp.Value >>= fTextPreRotateAngle;
+ }
+ break;
case EAS_TextRotateAngle :
{
- double fAngle = 0.0;
- rGeoProp.Value >>= fAngle;
- fTextRotateAngle += fAngle;
+ rGeoProp.Value >>= fTextRotateAngle;
}
break;
case EAS_Extrusion :
@@ -4947,12 +4951,30 @@ static void ImpExportEnhancedGeometry( SvXMLExport& rExport, const uno::Referenc
break;
}
} // for
+
+ // ToDo: Where is TextPreRotateAngle still used? We cannot save it in ODF.
+ fTextRotateAngle += fTextPreRotateAngle;
+ // Workaround for writing-mode bt-lr and tb-rl90 in ODF strict,
+ // otherwise loext:writing-mode is used in style export.
+ if (!(rExport.getSaneDefaultVersion() & SvtSaveOptions::ODFSVER_EXTENDED))
+ {
+ if (xPropSetInfo->hasPropertyByName(u"WritingMode"))
+ {
+ sal_Int16 nDirection;
+ xPropSet->getPropertyValue(u"WritingMode") >>= nDirection;
+ if (nDirection == text::WritingMode2::TB_RL90)
+ fTextRotateAngle -= 90;
+ else if (nDirection == text::WritingMode2::BT_LR)
+ fTextRotateAngle -= 270;
+ }
+ }
if (fTextRotateAngle != 0)
{
::sax::Converter::convertDouble( aStrBuffer, fTextRotateAngle );
aStr = aStrBuffer.makeStringAndClear();
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_TEXT_ROTATE_ANGLE, aStr );
}
+
rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_TYPE, aCustomShapeType );
// adjustments
diff --git a/xmloff/source/style/prhdlfac.cxx b/xmloff/source/style/prhdlfac.cxx
index ca96e0421552..3b8cbe371000 100644
--- a/xmloff/source/style/prhdlfac.cxx
+++ b/xmloff/source/style/prhdlfac.cxx
@@ -99,6 +99,9 @@ SvXMLEnumMapEntry<sal_uInt16> const aXML_WritingDirection_Enum[] =
{ XML_RL, text::WritingMode2::RL_TB },
{ XML_TB, text::WritingMode2::TB_RL },
+ // vertical as clockwise 90deg rotation, for OOXML vert="vert"
+ { XML_TB_RL90, text::WritingMode2::TB_RL90 },
+
{ XML_TOKEN_INVALID, 0 }
};
diff --git a/xmloff/source/style/xmlexppr.cxx b/xmloff/source/style/xmlexppr.cxx
index 412b578c42a9..d2088cfea601 100644
--- a/xmloff/source/style/xmlexppr.cxx
+++ b/xmloff/source/style/xmlexppr.cxx
@@ -938,7 +938,8 @@ namespace
sal_Int8 CheckExtendedNamespace(std::u16string_view sXMLAttributeName, std::u16string_view sValue,
const SvtSaveOptions::ODFSaneDefaultVersion nODFVersion)
{
- if (IsXMLToken(sXMLAttributeName, XML_WRITING_MODE) && IsXMLToken(sValue, XML_BT_LR))
+ if (IsXMLToken(sXMLAttributeName, XML_WRITING_MODE)
+ && (IsXMLToken(sValue, XML_BT_LR) || IsXMLToken(sValue, XML_TB_RL90)))
return nODFVersion & SvtSaveOptions::ODFSVER_EXTENDED ? 1 : -1;
else if (IsXMLToken(sXMLAttributeName, XML_VERTICAL_REL)
&& (IsXMLToken(sValue, XML_PAGE_CONTENT_BOTTOM)
diff --git a/xmloff/source/token/tokens.txt b/xmloff/source/token/tokens.txt
index 918ab44981c4..506b9a4cb0e4 100644
--- a/xmloff/source/token/tokens.txt
+++ b/xmloff/source/token/tokens.txt
@@ -2183,6 +2183,7 @@ bt-lr
lr
rl
tb
+tb-rl90
layout-grid-color
layout-grid-lines
layout-grid-base-height