blob: 9beec2944390aecf60911313543be1031b0a5cba [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_CANVAS_IRENDERMODULE_HXX
#define INCLUDED_CANVAS_IRENDERMODULE_HXX
#include <sal/types.h>
#include <boost/shared_ptr.hpp>
#include <boost/utility.hpp>
namespace basegfx
{
class B2DRange;
class B2IRange;
class B2IVector;
class B2IPoint;
}
namespace canvas
{
struct ISurface;
struct Vertex
{
float r,g,b,a;
float u,v;
float x,y,z;
};
/** Output module interface for backend render implementations.
Implement this interface for each operating system- or
library-specific rendering backend, which needs coupling with
the canvas rendering framework (which can be shared between
all backend implementations).
*/
struct IRenderModule
{
/** Type of primitive passed to the render module via
pushVertex()
*/
enum PrimitiveType
{
PRIMITIVE_TYPE_UNKNOWN,
PRIMITIVE_TYPE_TRIANGLE,
PRIMITIVE_TYPE_QUAD
};
virtual ~IRenderModule() {}
/// Lock rendermodule against concurrent access
virtual void lock() const = 0;
/// Unlock rendermodule for concurrent access
virtual void unlock() const = 0;
/** Maximal size of VRAM pages available
This is typically the maximum texture size of the
hardware, or some arbitrary limit if the backend is
software.
*/
virtual ::basegfx::B2IVector getPageSize() = 0;
/** Create a (possibly hardware-accelerated) surface
@return a pointer to a surface, which is an abstraction of
a piece of (possibly hardware-accelerated) texture memory.
*/
virtual ::boost::shared_ptr<ISurface> createSurface( const ::basegfx::B2IVector& surfaceSize ) = 0;
/** Begin rendering the given primitive.
Each beginPrimitive() call must be matched with an
endPrimitive() call.
*/
virtual void beginPrimitive( PrimitiveType eType ) = 0;
/** Finish rendering a primitive.
Each beginPrimitive() call must be matched with an
endPrimitive() call.
*/
virtual void endPrimitive() = 0;
/** Add given vertex to current primitive
After issuing a beginPrimitive(), each pushVertex() adds a
vertex to the active primitive.
*/
virtual void pushVertex( const Vertex& vertex ) = 0;
/** Query error status
@returns true, if an error occured during primitive
construction.
*/
virtual bool isError() = 0;
};
typedef ::boost::shared_ptr< IRenderModule > IRenderModuleSharedPtr;
/// Little RAII wrapper for guarding access to IRenderModule interface
class RenderModuleGuard : private ::boost::noncopyable
{
public:
explicit RenderModuleGuard( const IRenderModuleSharedPtr& rRenderModule ) :
mpRenderModule( rRenderModule )
{
mpRenderModule->lock();
}
~RenderModuleGuard()
{
mpRenderModule->unlock();
}
private:
const IRenderModuleSharedPtr mpRenderModule;
};
}
#endif /* INCLUDED_CANVAS_IRENDERMODULE_HXX */