office-gobmx/include/basegfx/polygon/b2dpolypolygon.hxx
Armin Le Grand 2da7a82f6b tdf#129845: Better solution using already existing info
Use calculateCombinedHoldCyclesInSeconds() in central
places of system-dependent buffering and the zero value
to early exclude data from buffering. This solves the
problem on all system-dependent usages in a central
place. Also enhanced to roughly allow buffering for
bitmaps unchanged, for polygons starting with ca. 50
coordinate pairs.
Added special treatments to Cairo version to allow
temp buffer objects without copying the path data. This
needed some extra stuff due to Cairo not allowing
to work with it's cr-internal path object directly.

Change-Id: Icd0a0d8091707fe356a82f5c7ec48f36ad44ccde
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/87199
Reviewed-by: Michael Meeks <michael.meeks@collabora.com>
Tested-by: Jenkins
2020-01-23 17:48:55 +01:00

180 lines
5.9 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#ifndef INCLUDED_BASEGFX_POLYGON_B2DPOLYPOLYGON_HXX
#define INCLUDED_BASEGFX_POLYGON_B2DPOLYPOLYGON_HXX
#include <ostream>
#include <vector>
#include <sal/types.h>
#include <o3tl/cow_wrapper.hxx>
#include <basegfx/range/b2drange.hxx>
#include <basegfx/basegfxdllapi.h>
#include <basegfx/polygon/b2dpolygon.hxx>
class ImplB2DPolyPolygon;
namespace basegfx
{
class B2DHomMatrix;
}
namespace basegfx
{
class BASEGFX_DLLPUBLIC B2DPolyPolygon
{
public:
typedef o3tl::cow_wrapper< ImplB2DPolyPolygon > ImplType;
private:
ImplType mpPolyPolygon;
public:
B2DPolyPolygon();
B2DPolyPolygon(const B2DPolyPolygon& rPolyPolygon);
B2DPolyPolygon(B2DPolyPolygon&& rPolyPolygon);
explicit B2DPolyPolygon(const B2DPolygon& rPolygon);
~B2DPolyPolygon();
// assignment operator
B2DPolyPolygon& operator=(const B2DPolyPolygon& rPolyPolygon);
B2DPolyPolygon& operator=(B2DPolyPolygon&& rPolyPolygon);
/// unshare this poly-polygon (and all included polygons) with all internally shared instances
void makeUnique();
// compare operators
bool operator==(const B2DPolyPolygon& rPolyPolygon) const;
bool operator!=(const B2DPolyPolygon& rPolyPolygon) const;
// polygon interface
sal_uInt32 count() const;
B2DPolygon const & getB2DPolygon(sal_uInt32 nIndex) const;
void setB2DPolygon(sal_uInt32 nIndex, const B2DPolygon& rPolygon);
// test for curve
bool areControlPointsUsed() const;
// insert/append single polygon
void insert(sal_uInt32 nIndex, const B2DPolygon& rPolygon, sal_uInt32 nCount = 1);
void append(const B2DPolygon& rPolygon, sal_uInt32 nCount = 1);
/** Default adaptive subdivision access
For details refer to B2DPolygon::getDefaultAdaptiveSubdivision()
@return
The default subdivision of this polygon
*/
B2DPolyPolygon getDefaultAdaptiveSubdivision() const;
/** Get the B2DRange (Rectangle dimensions) of this B2DPolyPolygon
For details refer to B2DPolygon::getB2DRange()
@return
The outer range of the bezier curve/polygon
*/
B2DRange getB2DRange() const;
// insert/append multiple polygons
void insert(sal_uInt32 nIndex, const B2DPolyPolygon& rPolyPolygon);
void append(const B2DPolyPolygon& rPolyPolygon);
// remove
void remove(sal_uInt32 nIndex, sal_uInt32 nCount = 1);
// reset to empty state
void clear();
// closed state
bool isClosed() const;
void setClosed(bool bNew);
// flip polygon direction
void flip();
// test if tools::PolyPolygon has double points
bool hasDoublePoints() const;
// remove double points, at the begin/end and follow-ups, too
void removeDoublePoints();
// apply transformation given in matrix form to the polygon
void transform(const basegfx::B2DHomMatrix& rMatrix);
// polygon iterators (same iterator validity conditions as for vector)
const B2DPolygon* begin() const;
const B2DPolygon* end() const;
B2DPolygon* begin();
B2DPolygon* end();
// exclusive management op's for SystemDependentData at B2DPolygon
template<class T>
std::shared_ptr<T> getSystemDependentData() const
{
return std::static_pointer_cast<T>(getSystemDependantDataInternal(typeid(T).hash_code()));
}
template<class T, class... Args>
std::shared_ptr<T> addOrReplaceSystemDependentData(SystemDependentDataManager& manager, Args&&... args) const
{
std::shared_ptr<T> r = std::make_shared<T>(manager, std::forward<Args>(args)...);
// tdf#129845 only add to buffer if a relevant buffer time is estimated
if(r->calculateCombinedHoldCyclesInSeconds() > 0)
{
basegfx::SystemDependentData_SharedPtr r2(r);
addOrReplaceSystemDependentDataInternal(r2);
}
return r;
}
private:
void addOrReplaceSystemDependentDataInternal(SystemDependentData_SharedPtr& rData) const;
SystemDependentData_SharedPtr getSystemDependantDataInternal(size_t hash_code) const;
};
// typedef for a vector of B2DPolyPolygons
typedef ::std::vector< B2DPolyPolygon > B2DPolyPolygonVector;
template< typename charT, typename traits >
inline std::basic_ostream<charT, traits> & operator <<(
std::basic_ostream<charT, traits> & stream, const B2DPolyPolygon& poly )
{
stream << "[" << poly.count() << ":";
for (sal_uInt32 i = 0; i < poly.count(); i++)
{
if (i > 0)
stream << ",";
stream << poly.getB2DPolygon(i);
}
stream << "]";
return stream;
}
} // end of namespace basegfx
#endif // INCLUDED_BASEGFX_POLYGON_B2DPOLYPOLYGON_HXX
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */