xref: /aoo4110/main/canvas/source/tools/surface.hxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski #ifndef INCLUDED_CANVAS_SURFACE_HXX
25*b1cdbd2cSJim Jagielski #define INCLUDED_CANVAS_SURFACE_HXX
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <basegfx/point/b2ipoint.hxx>
28*b1cdbd2cSJim Jagielski #include <basegfx/point/b2dpoint.hxx>
29*b1cdbd2cSJim Jagielski #include <basegfx/polygon/b2dpolygon.hxx>
30*b1cdbd2cSJim Jagielski #include <basegfx/range/b2drectangle.hxx>
31*b1cdbd2cSJim Jagielski #include <basegfx/vector/b2isize.hxx>
32*b1cdbd2cSJim Jagielski #include <basegfx/matrix/b2dhommatrix.hxx>
33*b1cdbd2cSJim Jagielski #include <canvas/rendering/irendermodule.hxx>
34*b1cdbd2cSJim Jagielski #include <canvas/rendering/icolorbuffer.hxx>
35*b1cdbd2cSJim Jagielski #include <canvas/rendering/isurface.hxx>
36*b1cdbd2cSJim Jagielski 
37*b1cdbd2cSJim Jagielski #include "surfacerect.hxx"
38*b1cdbd2cSJim Jagielski #include "pagemanager.hxx"
39*b1cdbd2cSJim Jagielski 
40*b1cdbd2cSJim Jagielski namespace canvas
41*b1cdbd2cSJim Jagielski {
42*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////////////////
43*b1cdbd2cSJim Jagielski 	// Surface
44*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////////////////
45*b1cdbd2cSJim Jagielski 
46*b1cdbd2cSJim Jagielski 	/** surfaces denote occupied areas withing pages.
47*b1cdbd2cSJim Jagielski 
48*b1cdbd2cSJim Jagielski 		pages encapsulate the hardware buffers that
49*b1cdbd2cSJim Jagielski 		contain image data which can be used for texturing.
50*b1cdbd2cSJim Jagielski 		surfaces are areas within those pages.
51*b1cdbd2cSJim Jagielski 	*/
52*b1cdbd2cSJim Jagielski 	class Surface
53*b1cdbd2cSJim Jagielski 	{
54*b1cdbd2cSJim Jagielski     public:
55*b1cdbd2cSJim Jagielski 
56*b1cdbd2cSJim Jagielski         Surface( const PageManagerSharedPtr&  rPageManager,
57*b1cdbd2cSJim Jagielski                  const IColorBufferSharedPtr& rColorBuffer,
58*b1cdbd2cSJim Jagielski                  const ::basegfx::B2IPoint&   rPos,
59*b1cdbd2cSJim Jagielski                  const ::basegfx::B2ISize&    rSize );
60*b1cdbd2cSJim Jagielski         ~Surface();
61*b1cdbd2cSJim Jagielski 
62*b1cdbd2cSJim Jagielski         void setColorBufferDirty();
63*b1cdbd2cSJim Jagielski 
64*b1cdbd2cSJim Jagielski         /** Render the surface content to screen.
65*b1cdbd2cSJim Jagielski 
66*b1cdbd2cSJim Jagielski             @param fAlpha
67*b1cdbd2cSJim Jagielski             Overall alpha for content
68*b1cdbd2cSJim Jagielski 
69*b1cdbd2cSJim Jagielski             @param rPos
70*b1cdbd2cSJim Jagielski             Output position
71*b1cdbd2cSJim Jagielski 
72*b1cdbd2cSJim Jagielski             @param rTransform
73*b1cdbd2cSJim Jagielski             Output transformation (does not affect output position)
74*b1cdbd2cSJim Jagielski         */
75*b1cdbd2cSJim Jagielski         bool draw( double                         fAlpha,
76*b1cdbd2cSJim Jagielski                    const ::basegfx::B2DPoint&     rPos,
77*b1cdbd2cSJim Jagielski                    const ::basegfx::B2DHomMatrix& rTransform );
78*b1cdbd2cSJim Jagielski 
79*b1cdbd2cSJim Jagielski         /** Render the surface content to screen.
80*b1cdbd2cSJim Jagielski 
81*b1cdbd2cSJim Jagielski             @param fAlpha
82*b1cdbd2cSJim Jagielski             Overall alpha for content
83*b1cdbd2cSJim Jagielski 
84*b1cdbd2cSJim Jagielski             @param rPos
85*b1cdbd2cSJim Jagielski             Output position
86*b1cdbd2cSJim Jagielski 
87*b1cdbd2cSJim Jagielski             @param rArea
88*b1cdbd2cSJim Jagielski             Subset of the surface to render. Coordinate system are
89*b1cdbd2cSJim Jagielski             surface area pixel, given area will be clipped to the
90*b1cdbd2cSJim Jagielski             surface bounds.
91*b1cdbd2cSJim Jagielski 
92*b1cdbd2cSJim Jagielski             @param rTransform
93*b1cdbd2cSJim Jagielski             Output transformation (does not affect output position)
94*b1cdbd2cSJim Jagielski         */
95*b1cdbd2cSJim Jagielski         bool drawRectangularArea(
96*b1cdbd2cSJim Jagielski             double                         fAlpha,
97*b1cdbd2cSJim Jagielski             const ::basegfx::B2DPoint&     rPos,
98*b1cdbd2cSJim Jagielski             const ::basegfx::B2DRange&     rArea,
99*b1cdbd2cSJim Jagielski             const ::basegfx::B2DHomMatrix& rTransform );
100*b1cdbd2cSJim Jagielski 
101*b1cdbd2cSJim Jagielski         /** Render the surface content to screen.
102*b1cdbd2cSJim Jagielski 
103*b1cdbd2cSJim Jagielski             @param fAlpha
104*b1cdbd2cSJim Jagielski             Overall alpha for content
105*b1cdbd2cSJim Jagielski 
106*b1cdbd2cSJim Jagielski             @param rPos
107*b1cdbd2cSJim Jagielski             Output position
108*b1cdbd2cSJim Jagielski 
109*b1cdbd2cSJim Jagielski             @param rClipPoly
110*b1cdbd2cSJim Jagielski             Clip polygon for the surface. The clip polygon is also
111*b1cdbd2cSJim Jagielski             subject to the output transformation.
112*b1cdbd2cSJim Jagielski 
113*b1cdbd2cSJim Jagielski             @param rTransform
114*b1cdbd2cSJim Jagielski             Output transformation (does not affect output position)
115*b1cdbd2cSJim Jagielski         */
116*b1cdbd2cSJim Jagielski         bool drawWithClip( double                           fAlpha,
117*b1cdbd2cSJim Jagielski                            const ::basegfx::B2DPoint&       rPos,
118*b1cdbd2cSJim Jagielski                            const ::basegfx::B2DPolygon&     rClipPoly,
119*b1cdbd2cSJim Jagielski                            const ::basegfx::B2DHomMatrix&   rTransform );
120*b1cdbd2cSJim Jagielski 
121*b1cdbd2cSJim Jagielski 		// private attributes
122*b1cdbd2cSJim Jagielski     private:
123*b1cdbd2cSJim Jagielski         IColorBufferSharedPtr mpColorBuffer;
124*b1cdbd2cSJim Jagielski 
125*b1cdbd2cSJim Jagielski         // invoking any of the above defined 'draw' methods
126*b1cdbd2cSJim Jagielski         // will forward primitive commands to the rendermodule.
127*b1cdbd2cSJim Jagielski         PageManagerSharedPtr  mpPageManager;
128*b1cdbd2cSJim Jagielski 
129*b1cdbd2cSJim Jagielski         FragmentSharedPtr     mpFragment;
130*b1cdbd2cSJim Jagielski 
131*b1cdbd2cSJim Jagielski         // the offset of this surface with regard to the source
132*b1cdbd2cSJim Jagielski         // image. if the source image had to be tiled into multiple
133*b1cdbd2cSJim Jagielski         // surfaces, this offset denotes the relative pixel distance
134*b1cdbd2cSJim Jagielski         // from the source image's upper, left corner
135*b1cdbd2cSJim Jagielski         ::basegfx::B2IPoint   maSourceOffset;
136*b1cdbd2cSJim Jagielski 
137*b1cdbd2cSJim Jagielski         // the size in pixels of this surface. please note that
138*b1cdbd2cSJim Jagielski         // this size is likely to be smaller than the size of
139*b1cdbd2cSJim Jagielski         // the colorbuffer we're associated with since we
140*b1cdbd2cSJim Jagielski         // maybe represent only a part of it.
141*b1cdbd2cSJim Jagielski         ::basegfx::B2ISize    maSize;
142*b1cdbd2cSJim Jagielski 
143*b1cdbd2cSJim Jagielski         bool                  mbIsDirty;
144*b1cdbd2cSJim Jagielski 
145*b1cdbd2cSJim Jagielski 		// private methods
146*b1cdbd2cSJim Jagielski     private:
147*b1cdbd2cSJim Jagielski         bool refresh( canvas::IColorBuffer& rBuffer ) const;
148*b1cdbd2cSJim Jagielski         void prepareRendering();
149*b1cdbd2cSJim Jagielski 
150*b1cdbd2cSJim Jagielski         basegfx::B2DRectangle getUVCoords() const;
151*b1cdbd2cSJim Jagielski         basegfx::B2DRectangle getUVCoords( const ::basegfx::B2IPoint& rPos,
152*b1cdbd2cSJim Jagielski                                            const ::basegfx::B2ISize&  rSize ) const;
153*b1cdbd2cSJim Jagielski 	};
154*b1cdbd2cSJim Jagielski 
155*b1cdbd2cSJim Jagielski 	typedef ::boost::shared_ptr< Surface > SurfaceSharedPtr;
156*b1cdbd2cSJim Jagielski }
157*b1cdbd2cSJim Jagielski 
158*b1cdbd2cSJim Jagielski #endif
159