summaryrefslogtreecommitdiff
path: root/chart2
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2018-08-22 17:08:23 +0100
committerAndras Timar <andras.timar@collabora.com>2018-08-23 09:10:34 +0200
commitbb3eef71add4c8e9827c56fe2fe9543897f61efa (patch)
tree683cf59b6170532746585254bcd24e4cc29596b5 /chart2
parentc02799e9a6c42fc8573293573f91db22c2c85969 (diff)
Resolves: tdf#98558 oom under windows with certain charts
keep the performance fix of i#66963 but clip it to a value larger than appears in that document, but massively smaller than what is necessary for this document Change-Id: I162c03a13ce11e348db8168fed212dfea216c7a4 Reviewed-on: https://gerrit.libreoffice.org/59463 Reviewed-by: Markus Mohrhard <markus.mohrhard@googlemail.com> Tested-by: Jenkins (cherry picked from commit b707def5e9696c429cfb1dbe8479d5b63046e800)
Diffstat (limited to 'chart2')
-rw-r--r--chart2/source/view/main/Clipping.cxx15
1 files changed, 14 insertions, 1 deletions
diff --git a/chart2/source/view/main/Clipping.cxx b/chart2/source/view/main/Clipping.cxx
index 7892815f322b..354871612233 100644
--- a/chart2/source/view/main/Clipping.cxx
+++ b/chart2/source/view/main/Clipping.cxx
@@ -140,6 +140,19 @@ bool lcl_clip2d_(drawing::Position3D& rPoint0, drawing::Position3D& rPoint1, con
return bRet;
}
+unsigned int round_up_nearest_pow2(unsigned int v)
+{
+ // compute the next highest power of 2 of 32-bit v
+ --v;
+ v |= v >> 1;
+ v |= v >> 2;
+ v |= v >> 4;
+ v |= v >> 8;
+ v |= v >> 16;
+ ++v;
+ return v;
+}
+
void lcl_addPointToPoly( drawing::PolyPolygonShape3D& rPoly
, const drawing::Position3D& rPos
, sal_Int32 nPolygonIndex
@@ -170,7 +183,7 @@ void lcl_addPointToPoly( drawing::PolyPolygonShape3D& rPoly
if( nSeqLength <= nNewResultPointCount )
{
- sal_Int32 nReallocLength = nReservePointCount;
+ sal_Int32 nReallocLength = nReservePointCount > SAL_MAX_INT16 ? round_up_nearest_pow2(nNewResultPointCount) * 2 : nReservePointCount;
if( nNewResultPointCount > nReallocLength )
{
nReallocLength = nNewResultPointCount;