blob: 7bd0ca9ab1d5aa165bc0577886477be8e18bbc10 [file] [log] [blame]
/**************************************************************
*
* 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
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#ifndef INCLUDED_DRAWINGLAYER_PRIMITIVE3D_BASEPRIMITIVE3D_HXX
#define INCLUDED_DRAWINGLAYER_PRIMITIVE3D_BASEPRIMITIVE3D_HXX
#include <drawinglayer/drawinglayerdllapi.h>
#include <cppuhelper/compbase1.hxx>
#include <boost/utility.hpp>
#include <com/sun/star/graphic/XPrimitive3D.hpp>
#include <comphelper/broadcasthelper.hxx>
#include <basegfx/range/b3drange.hxx>
//////////////////////////////////////////////////////////////////////////////
/** defines for DeclPrimitrive3DIDBlock and ImplPrimitrive3DIDBlock
Added to be able to simply change identification stuff later, e.g. add
a identification string and/or ID to the interface and to the implementation
ATM used to delclare implement getPrimitive3DID()
*/
#define DeclPrimitrive3DIDBlock() \
virtual sal_uInt32 getPrimitive3DID() const;
#define ImplPrimitrive3DIDBlock(TheClass, TheID) \
sal_uInt32 TheClass::getPrimitive3DID() const { return TheID; }
//////////////////////////////////////////////////////////////////////////////
// predefines
namespace drawinglayer { namespace geometry {
class ViewInformation3D;
}}
namespace drawinglayer { namespace primitive3d {
/// typedefs for basePrimitive3DImplBase, Primitive3DSequence and Primitive3DReference
typedef cppu::WeakComponentImplHelper1< ::com::sun::star::graphic::XPrimitive3D > BasePrimitive3DImplBase;
typedef ::com::sun::star::uno::Reference< ::com::sun::star::graphic::XPrimitive3D > Primitive3DReference;
typedef ::com::sun::star::uno::Sequence< Primitive3DReference > Primitive3DSequence;
}}
//////////////////////////////////////////////////////////////////////////////
// basePrimitive3D class
namespace drawinglayer
{
namespace primitive3d
{
/** BasePrimitive3D class
Baseclass for all C++ implementations of com::sun::star::graphic::XPrimitive2D
The description/functionality is identical with the 2D case in baseprimitive2d.hxx,
please see there for detailed information.
Current Basic 3D Primitives are:
- PolygonHairlinePrimitive3D (for 3D hairlines)
- PolyPolygonMaterialPrimitive3D (for 3D filled plane polygons)
That's all for 3D!
*/
class DRAWINGLAYER_DLLPUBLIC BasePrimitive3D
: private boost::noncopyable,
protected comphelper::OBaseMutex,
public BasePrimitive3DImplBase
{
private:
protected:
public:
// constructor/destructor
BasePrimitive3D();
virtual ~BasePrimitive3D();
/** the ==operator is mainly needed to allow testing newly-created high level primitives against their last
incarnation which buffers/holds the decompositionsThe default implementation
uses getPrimitive3DID()-calls to test if it's the same ID at last. Overloaded implementation are then
based on this implementation.
*/
virtual bool operator==( const BasePrimitive3D& rPrimitive ) const;
bool operator!=( const BasePrimitive3D& rPrimitive ) const { return !operator==(rPrimitive); }
/** This method is for places where using the C++ implementation directly is possible. The subprocessing
and range merging is more efficient when working directly on basegfx::B3DRange. The default implementation
will use getDecomposition results to create the range
*/
virtual basegfx::B3DRange getB3DRange(const geometry::ViewInformation3D& rViewInformation) const;
/** provide unique ID for fast identifying of known primitive implementations in renderers. These use
the the defines from primitivetypes3d.hxx to define unique IDs.
*/
virtual sal_uInt32 getPrimitive3DID() const = 0;
/// The default implementation returns an empty sequence
virtual Primitive3DSequence get3DDecomposition(const geometry::ViewInformation3D& rViewInformation) const;
//
// Methods from XPrimitive3D
//
/** The getDecomposition implementation for UNO API will use getDecomposition from this implementation. It
will get the ViewInformation from the ViewParameters for that purpose
*/
virtual Primitive3DSequence SAL_CALL getDecomposition( const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& rViewParameters ) throw ( ::com::sun::star::uno::RuntimeException );
/** the getRange default implemenation will use getDecomposition to create the range information from merging
getRange results from the single local decomposition primitives.
*/
virtual ::com::sun::star::geometry::RealRectangle3D SAL_CALL getRange( const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& rViewParameters ) throw ( ::com::sun::star::uno::RuntimeException );
};
} // end of namespace primitive3d
} // end of namespace drawinglayer
//////////////////////////////////////////////////////////////////////////////
// BufferedDecompositionPrimitive3D class
namespace drawinglayer
{
namespace primitive3d
{
/** BufferedDecompositionPrimitive3D class
Baseclass for all C++ implementations of com::sun::star::graphic::XPrimitive2D
The description/functionality is identical with the 2D case in baseprimitive2d.hxx,
please see there for detailed information
*/
class DRAWINGLAYER_DLLPUBLIC BufferedDecompositionPrimitive3D
: public BasePrimitive3D
{
private:
/// a sequence used for buffering the last create3DDecomposition() result
Primitive3DSequence maBuffered3DDecomposition;
protected:
/** access methods to maBuffered3DDecomposition. The usage of this methods may allow
later thread-safe stuff to be added if needed. Only to be used by getDecomposition()
implementations for buffering the last decomposition.
*/
const Primitive3DSequence& getBuffered3DDecomposition() const { return maBuffered3DDecomposition; }
void setBuffered3DDecomposition(const Primitive3DSequence& rNew) { maBuffered3DDecomposition = rNew; }
/** method which is to be used to implement the local decomposition of a 2D primitive. The default
implementation will just return an empty decomposition
*/
virtual Primitive3DSequence create3DDecomposition(const geometry::ViewInformation3D& rViewInformation) const;
public:
// constructor
BufferedDecompositionPrimitive3D();
/** The getDecomposition default implementation will on demand use create3DDecomposition() if
maBuffered3DDecomposition is empty. It will set maBuffered3DDecomposition to this obtained decomposition
to buffer it. If the decomposition is also ViewInformation-dependent, this method needs to be
overloaded and the ViewInformation for the last decomposition needs to be remembered, too, and
be used in the next call to decide if the buffered decomposition may be reused or not.
*/
virtual Primitive3DSequence get3DDecomposition(const geometry::ViewInformation3D& rViewInformation) const;
};
} // end of namespace primitive3d
} // end of namespace drawinglayer
//////////////////////////////////////////////////////////////////////////////
// tooling
namespace drawinglayer
{
namespace primitive3d
{
/// get B3DRange from a given Primitive3DReference
basegfx::B3DRange DRAWINGLAYER_DLLPUBLIC getB3DRangeFromPrimitive3DReference(const Primitive3DReference& rCandidate, const geometry::ViewInformation3D& aViewInformation);
/// get range3D from a given Primitive3DSequence
basegfx::B3DRange DRAWINGLAYER_DLLPUBLIC getB3DRangeFromPrimitive3DSequence(const Primitive3DSequence& rCandidate, const geometry::ViewInformation3D& aViewInformation);
/** compare two Primitive2DReferences for equality, including trying to get implementations (BasePrimitive2D)
and using compare operator
*/
bool DRAWINGLAYER_DLLPUBLIC arePrimitive3DReferencesEqual(const Primitive3DReference& rA, const Primitive3DReference& rB);
/// compare two Primitive3DReferences for equality, uses arePrimitive3DReferencesEqual internally
bool DRAWINGLAYER_DLLPUBLIC arePrimitive3DSequencesEqual(const Primitive3DSequence& rA, const Primitive3DSequence& rB);
/// concatenate sequence
void DRAWINGLAYER_DLLPUBLIC appendPrimitive3DSequenceToPrimitive3DSequence(Primitive3DSequence& rDest, const Primitive3DSequence& rSource);
/// concatenate single Primitive3D
void DRAWINGLAYER_DLLPUBLIC appendPrimitive3DReferenceToPrimitive3DSequence(Primitive3DSequence& rDest, const Primitive3DReference& rSource);
} // end of namespace primitive3d
} // end of namespace drawinglayer
//////////////////////////////////////////////////////////////////////////////
#endif //INCLUDED_DRAWINGLAYER_PRIMITIVE3D_BASEPRIMITIVE3D_HXX
//////////////////////////////////////////////////////////////////////////////
// eof