191c99ff4SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 391c99ff4SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 491c99ff4SAndrew Rist * or more contributor license agreements. See the NOTICE file 591c99ff4SAndrew Rist * distributed with this work for additional information 691c99ff4SAndrew Rist * regarding copyright ownership. The ASF licenses this file 791c99ff4SAndrew Rist * to you under the Apache License, Version 2.0 (the 891c99ff4SAndrew Rist * "License"); you may not use this file except in compliance 991c99ff4SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 1191c99ff4SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 1391c99ff4SAndrew Rist * Unless required by applicable law or agreed to in writing, 1491c99ff4SAndrew Rist * software distributed under the License is distributed on an 1591c99ff4SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 1691c99ff4SAndrew Rist * KIND, either express or implied. See the License for the 1791c99ff4SAndrew Rist * specific language governing permissions and limitations 1891c99ff4SAndrew Rist * under the License. 19cdf0e10cSrcweir * 2091c99ff4SAndrew Rist *************************************************************/ 2191c99ff4SAndrew Rist 2291c99ff4SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir #ifndef INCLUDED_CANVAS_IRENDERMODULE_HXX 25cdf0e10cSrcweir #define INCLUDED_CANVAS_IRENDERMODULE_HXX 26cdf0e10cSrcweir 27cdf0e10cSrcweir #include <sal/types.h> 28cdf0e10cSrcweir 29cdf0e10cSrcweir #include <boost/shared_ptr.hpp> 30cdf0e10cSrcweir #include <boost/utility.hpp> 31cdf0e10cSrcweir 32cdf0e10cSrcweir 33cdf0e10cSrcweir namespace basegfx 34cdf0e10cSrcweir { 35cdf0e10cSrcweir class B2DRange; 36cdf0e10cSrcweir class B2IRange; 37cdf0e10cSrcweir class B2IVector; 38cdf0e10cSrcweir class B2IPoint; 39cdf0e10cSrcweir } 40cdf0e10cSrcweir 41cdf0e10cSrcweir namespace canvas 42cdf0e10cSrcweir { 43cdf0e10cSrcweir struct ISurface; 44cdf0e10cSrcweir 45cdf0e10cSrcweir struct Vertex 46cdf0e10cSrcweir { 47cdf0e10cSrcweir float r,g,b,a; 48cdf0e10cSrcweir float u,v; 49cdf0e10cSrcweir float x,y,z; 50cdf0e10cSrcweir }; 51cdf0e10cSrcweir 52cdf0e10cSrcweir /** Output module interface for backend render implementations. 53cdf0e10cSrcweir 54cdf0e10cSrcweir Implement this interface for each operating system- or 55cdf0e10cSrcweir library-specific rendering backend, which needs coupling with 56cdf0e10cSrcweir the canvas rendering framework (which can be shared between 57cdf0e10cSrcweir all backend implementations). 58cdf0e10cSrcweir */ 59cdf0e10cSrcweir struct IRenderModule 60cdf0e10cSrcweir { 61cdf0e10cSrcweir /** Type of primitive passed to the render module via 62cdf0e10cSrcweir pushVertex() 63cdf0e10cSrcweir */ 64cdf0e10cSrcweir enum PrimitiveType 65cdf0e10cSrcweir { 66cdf0e10cSrcweir PRIMITIVE_TYPE_UNKNOWN, 67cdf0e10cSrcweir PRIMITIVE_TYPE_TRIANGLE, 68cdf0e10cSrcweir PRIMITIVE_TYPE_QUAD 69cdf0e10cSrcweir }; 70cdf0e10cSrcweir ~IRenderModulecanvas::IRenderModule71cdf0e10cSrcweir virtual ~IRenderModule() {} 72cdf0e10cSrcweir 73cdf0e10cSrcweir /// Lock rendermodule against concurrent access 74cdf0e10cSrcweir virtual void lock() const = 0; 75cdf0e10cSrcweir 76cdf0e10cSrcweir /// Unlock rendermodule for concurrent access 77cdf0e10cSrcweir virtual void unlock() const = 0; 78cdf0e10cSrcweir 79cdf0e10cSrcweir /** Maximal size of VRAM pages available 80cdf0e10cSrcweir 81cdf0e10cSrcweir This is typically the maximum texture size of the 82cdf0e10cSrcweir hardware, or some arbitrary limit if the backend is 83cdf0e10cSrcweir software. 84cdf0e10cSrcweir */ 85cdf0e10cSrcweir virtual ::basegfx::B2IVector getPageSize() = 0; 86cdf0e10cSrcweir 87cdf0e10cSrcweir /** Create a (possibly hardware-accelerated) surface 88cdf0e10cSrcweir 89cdf0e10cSrcweir @return a pointer to a surface, which is an abstraction of 90cdf0e10cSrcweir a piece of (possibly hardware-accelerated) texture memory. 91cdf0e10cSrcweir */ 92cdf0e10cSrcweir virtual ::boost::shared_ptr<ISurface> createSurface( const ::basegfx::B2IVector& surfaceSize ) = 0; 93cdf0e10cSrcweir 94cdf0e10cSrcweir /** Begin rendering the given primitive. 95cdf0e10cSrcweir 96cdf0e10cSrcweir Each beginPrimitive() call must be matched with an 97cdf0e10cSrcweir endPrimitive() call. 98cdf0e10cSrcweir */ 99cdf0e10cSrcweir virtual void beginPrimitive( PrimitiveType eType ) = 0; 100cdf0e10cSrcweir 101cdf0e10cSrcweir /** Finish rendering a primitive. 102cdf0e10cSrcweir 103cdf0e10cSrcweir Each beginPrimitive() call must be matched with an 104cdf0e10cSrcweir endPrimitive() call. 105cdf0e10cSrcweir */ 106cdf0e10cSrcweir virtual void endPrimitive() = 0; 107cdf0e10cSrcweir 108cdf0e10cSrcweir /** Add given vertex to current primitive 109cdf0e10cSrcweir 110cdf0e10cSrcweir After issuing a beginPrimitive(), each pushVertex() adds a 111cdf0e10cSrcweir vertex to the active primitive. 112cdf0e10cSrcweir */ 113cdf0e10cSrcweir virtual void pushVertex( const Vertex& vertex ) = 0; 114cdf0e10cSrcweir 115cdf0e10cSrcweir /** Query error status 116cdf0e10cSrcweir 117*07a3d7f1SPedro Giffuni @returns true, if an error occurred during primitive 118cdf0e10cSrcweir construction. 119cdf0e10cSrcweir */ 120cdf0e10cSrcweir virtual bool isError() = 0; 121cdf0e10cSrcweir }; 122cdf0e10cSrcweir 123cdf0e10cSrcweir typedef ::boost::shared_ptr< IRenderModule > IRenderModuleSharedPtr; 124cdf0e10cSrcweir 125cdf0e10cSrcweir /// Little RAII wrapper for guarding access to IRenderModule interface 126cdf0e10cSrcweir class RenderModuleGuard : private ::boost::noncopyable 127cdf0e10cSrcweir { 128cdf0e10cSrcweir public: RenderModuleGuard(const IRenderModuleSharedPtr & rRenderModule)129cdf0e10cSrcweir explicit RenderModuleGuard( const IRenderModuleSharedPtr& rRenderModule ) : 130cdf0e10cSrcweir mpRenderModule( rRenderModule ) 131cdf0e10cSrcweir { 132cdf0e10cSrcweir mpRenderModule->lock(); 133cdf0e10cSrcweir } 134cdf0e10cSrcweir ~RenderModuleGuard()135cdf0e10cSrcweir ~RenderModuleGuard() 136cdf0e10cSrcweir { 137cdf0e10cSrcweir mpRenderModule->unlock(); 138cdf0e10cSrcweir } 139cdf0e10cSrcweir 140cdf0e10cSrcweir private: 141cdf0e10cSrcweir const IRenderModuleSharedPtr mpRenderModule; 142cdf0e10cSrcweir }; 143cdf0e10cSrcweir } 144cdf0e10cSrcweir 145cdf0e10cSrcweir #endif /* INCLUDED_CANVAS_IRENDERMODULE_HXX */ 146