summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpanoskorovesis <panoskorovesis@outlook.com>2021-07-08 12:51:11 +0300
committerpanoskorovesis <panoskorovesis@outlook.com>2021-07-08 12:51:11 +0300
commit66fcf507e01fa0e4e28ff00b4def26f9d4a98b20 (patch)
tree3ea6e18a495d46490b5b7a2736730f5d6716168c
parent781c04a264818f803d1fc7ade3518227637fa2c1 (diff)
Add Handler for MetaTextArray Read
The handler separates the MetaTextArrayAction::Read from metaact.hxx Read implementation is now in SvmReader.hxx Change-Id: Ie74ef5b2e44d48c8c8a6d8efe9adda956cde4d3a
-rw-r--r--include/vcl/filter/SvmReader.hxx1
-rw-r--r--include/vcl/metaact.hxx5
-rw-r--r--vcl/source/filter/svm/SvmReader.cxx81
-rw-r--r--vcl/source/gdi/metaact.cxx11
4 files changed, 97 insertions, 1 deletions
diff --git a/include/vcl/filter/SvmReader.hxx b/include/vcl/filter/SvmReader.hxx
index ea3d9a31fd63..7baae24379b0 100644
--- a/include/vcl/filter/SvmReader.hxx
+++ b/include/vcl/filter/SvmReader.hxx
@@ -52,6 +52,7 @@ public:
rtl::Reference<MetaAction> PolygonHandler();
rtl::Reference<MetaAction> PolyPolygonHandler();
rtl::Reference<MetaAction> TextHandler(ImplMetaReadData* pData);
+ rtl::Reference<MetaAction> TextArrayHandler(ImplMetaReadData* pData);
};
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/vcl/metaact.hxx b/include/vcl/metaact.hxx
index 96c15ff23213..28a5373329c6 100644
--- a/include/vcl/metaact.hxx
+++ b/include/vcl/metaact.hxx
@@ -563,6 +563,11 @@ public:
sal_Int32 GetIndex() const { return mnIndex; }
sal_Int32 GetLen() const { return mnLen; }
tools::Long* GetDXArray() const { return mpDXAry.get(); }
+ void SetPoint(Point& rPt) { maStartPt = rPt; }
+ void SetText(OUString& rStr) { maStr = rStr; }
+ void SetIndex(sal_Int32 rIndex) { mnIndex = rIndex; }
+ void SetLen(sal_Int32 rLen) { mnLen = rLen; }
+ void SetDXArray(tools::Long* rDXAry);
};
class SAL_DLLPUBLIC_RTTI MetaStretchTextAction final : public MetaAction
diff --git a/vcl/source/filter/svm/SvmReader.cxx b/vcl/source/filter/svm/SvmReader.cxx
index 6fbd043d9ad1..74919c3b17d1 100644
--- a/vcl/source/filter/svm/SvmReader.cxx
+++ b/vcl/source/filter/svm/SvmReader.cxx
@@ -198,7 +198,7 @@ rtl::Reference<MetaAction> SvmReader::MetaActionHandler(ImplMetaReadData* pData)
return TextHandler(pData);
break;
case MetaActionType::TEXTARRAY:
- pAction = new MetaTextArrayAction;
+ return TextArrayHandler(pData);
break;
case MetaActionType::STRETCHTEXT:
pAction = new MetaStretchTextAction;
@@ -666,4 +666,83 @@ rtl::Reference<MetaAction> SvmReader::TextHandler(ImplMetaReadData* pData)
return pAction;
}
+
+rtl::Reference<MetaAction> SvmReader::TextArrayHandler(ImplMetaReadData* pData)
+{
+ auto pAction = new MetaTextArrayAction();
+
+ std::unique_ptr<tools::Long[]> aArray;
+ aArray.reset();
+
+ VersionCompatRead aCompat(mrStream);
+ TypeSerializer aSerializer(mrStream);
+
+ Point aPoint;
+ aSerializer.readPoint(aPoint);
+ pAction->SetPoint(aPoint);
+
+ OUString aStr;
+ aStr = mrStream.ReadUniOrByteString(pData->meActualCharSet);
+ pAction->SetText(aStr);
+
+ sal_uInt16 nTmpIndex(0);
+ mrStream.ReadUInt16(nTmpIndex);
+ pAction->SetIndex(nTmpIndex);
+
+ sal_uInt16 nTmpLen(0);
+ mrStream.ReadUInt16(nTmpLen);
+ pAction->SetLen(nTmpLen);
+
+ sal_Int32 nAryLen(0);
+ mrStream.ReadInt32(nAryLen);
+
+ if (nTmpLen > aStr.getLength() - nTmpIndex)
+ {
+ pAction->SetIndex(0);
+ pAction->SetDXArray(nullptr);
+ return pAction;
+ }
+ if (nAryLen)
+ {
+ // #i9762#, #106172# Ensure that DX array is at least mnLen entries long
+ if (nTmpLen >= nAryLen)
+ {
+ aArray.reset(new (std::nothrow) tools::Long[nTmpLen]);
+ if (aArray)
+ {
+ sal_Int32 i;
+ sal_Int32 val;
+ for (i = 0; i < nAryLen; i++)
+ {
+ mrStream.ReadInt32(val);
+ aArray[i] = val;
+ }
+ // #106172# setup remainder
+ for (; i < nTmpLen; i++)
+ aArray[i] = 0;
+ }
+ }
+ else
+ {
+ pAction->SetDXArray(nullptr);
+ return pAction;
+ }
+ }
+ else
+ pAction->SetDXArray(nullptr);
+
+ if (aCompat.GetVersion() >= 2) // Version 2
+ {
+ aStr = read_uInt16_lenPrefixed_uInt16s_ToOUString(mrStream);
+
+ if (nTmpIndex + nTmpLen > aStr.getLength())
+ {
+ pAction->SetIndex(0);
+ aArray.reset();
+ }
+ }
+
+ pAction->SetDXArray(aArray.get());
+ return pAction;
+}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/source/gdi/metaact.cxx b/vcl/source/gdi/metaact.cxx
index 20325ed90e33..bd3c6d60681f 100644
--- a/vcl/source/gdi/metaact.cxx
+++ b/vcl/source/gdi/metaact.cxx
@@ -1242,6 +1242,17 @@ void MetaTextArrayAction::Read( SvStream& rIStm, ImplMetaReadData* pData )
}
}
+void MetaTextArrayAction::SetDXArray(tools::Long* pDXAry)
+{
+ const sal_Int32 nAryLen = pDXAry ? mnLen : 0;
+
+ if (nAryLen > 0)
+ {
+ mpDXAry.reset( new tools::Long[ nAryLen ] );
+ memcpy( mpDXAry.get(), pDXAry, nAryLen * sizeof(tools::Long) );
+ }
+}
+
MetaStretchTextAction::MetaStretchTextAction() :
MetaAction ( MetaActionType::STRETCHTEXT ),
mnWidth ( 0 ),