1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
|
/* -*- 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/.
*/
#ifndef INCLUDED_CANVAS_SOURCE_OPENGL_OGL_SPRITEDEVICEHELPER_HXX
#define INCLUDED_CANVAS_SOURCE_OPENGL_OGL_SPRITEDEVICEHELPER_HXX
#include <vcl/opengl/OpenGLContext.hxx>
#include <rtl/ref.hxx>
#include <canvas/elapsedtime.hxx>
#include <com/sun/star/rendering/XGraphicDevice.hpp>
#include <boost/utility.hpp>
#include <boost/shared_ptr.hpp>
#include "ogl_buffercontext.hxx"
#include <set>
class Window;
class SystemChildWindow;
namespace basegfx{ class B2IVector; class B2DHomMatrix; }
namespace com { namespace sun { namespace star {
namespace awt { struct Rectangle; }
namespace geometry { struct AffineMatrix2D; }
}}}
namespace oglcanvas
{
class TextureCache;
class SpriteCanvas;
class CanvasCustomSprite;
class CanvasHelper;
class SpriteDeviceHelper : private ::boost::noncopyable
{
public:
SpriteDeviceHelper();
void init( Window& rWindow,
SpriteCanvas& rSpriteCanvas,
const ::com::sun::star::awt::Rectangle& rViewArea );
/// Dispose all internal references
void disposing();
// XWindowGraphicDevice
::com::sun::star::geometry::RealSize2D getPhysicalResolution();
::com::sun::star::geometry::RealSize2D getPhysicalSize();
::com::sun::star::uno::Reference< ::com::sun::star::rendering::XLinePolyPolygon2D > createCompatibleLinePolyPolygon(
const ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XGraphicDevice >& rDevice,
const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence< ::com::sun::star::geometry::RealPoint2D > >& points );
::com::sun::star::uno::Reference< ::com::sun::star::rendering::XBezierPolyPolygon2D > createCompatibleBezierPolyPolygon(
const ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XGraphicDevice >& rDevice,
const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence< ::com::sun::star::geometry::RealBezierSegment2D > >& points );
::com::sun::star::uno::Reference< ::com::sun::star::rendering::XBitmap > createCompatibleBitmap(
const ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XGraphicDevice >& rDevice,
const ::com::sun::star::geometry::IntegerSize2D& size );
::com::sun::star::uno::Reference< ::com::sun::star::rendering::XVolatileBitmap > createVolatileBitmap(
const ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XGraphicDevice >& rDevice,
const ::com::sun::star::geometry::IntegerSize2D& size );
::com::sun::star::uno::Reference< ::com::sun::star::rendering::XBitmap > createCompatibleAlphaBitmap(
const ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XGraphicDevice >& rDevice,
const ::com::sun::star::geometry::IntegerSize2D& size );
::com::sun::star::uno::Reference< ::com::sun::star::rendering::XVolatileBitmap > createVolatileAlphaBitmap(
const ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XGraphicDevice >& rDevice,
const ::com::sun::star::geometry::IntegerSize2D& size );
bool hasFullScreenMode( );
bool enterFullScreenMode( bool bEnter );
::sal_Int32 createBuffers( ::sal_Int32 nBuffers );
void destroyBuffers( );
bool showBuffer( bool bIsVisible, bool bUpdateAll );
bool switchBuffer( bool bIsVisible, bool bUpdateAll );
::com::sun::star::uno::Any isAccelerated() const;
::com::sun::star::uno::Any getDeviceHandle() const;
::com::sun::star::uno::Any getSurfaceHandle() const;
::com::sun::star::uno::Reference<
::com::sun::star::rendering::XColorSpace > getColorSpace() const;
void notifySizeUpdate( const ::com::sun::star::awt::Rectangle& rBounds );
/** called when DumpScreenContent property is enabled on
XGraphicDevice, and writes out bitmaps of current screen.
*/
void dumpScreenContent() const;
void show( const ::rtl::Reference< CanvasCustomSprite >& );
void hide( const ::rtl::Reference< CanvasCustomSprite >& );
/// enable linear gradient shader "texture" with given parameters
void useLinearGradientShader( const ::com::sun::star::rendering::ARGBColor* pColors,
const ::com::sun::star::uno::Sequence< double >& rStops,
const ::basegfx::B2DHomMatrix& rTexTransform );
/// enable radial gradient shader "texture" with given parameters
void useRadialGradientShader( const ::com::sun::star::rendering::ARGBColor* pColors,
const ::com::sun::star::uno::Sequence< double >& rStops,
const ::basegfx::B2DHomMatrix& rTexTransform );
/// enable rectangular gradient shader "texture" with given parameters
void useRectangularGradientShader( const ::com::sun::star::rendering::ARGBColor* pColors,
const ::com::sun::star::uno::Sequence< double >& rStops,
const ::basegfx::B2DHomMatrix& rTexTransform );
/// create a pbuffer context (for rendering into background surface)
IBufferContextSharedPtr createBufferContext(const ::basegfx::B2IVector& rSize) const;
/// Get instance of internal texture cache
TextureCache& getTextureCache() const;
bool activateWindowContext();
private:
void resize( const ::basegfx::B2IVector& rNewSize );
/** Phyical output device
Deliberately not a refcounted reference, because of
potential circular references for canvas. Needed to
create bitmaps
*/
com::sun::star::rendering::XGraphicDevice* mpDevice;
/// Pointer to sprite canvas (owner of this helper), needed to create bitmaps
SpriteCanvas* mpSpriteCanvas;
std::set< ::rtl::Reference< CanvasCustomSprite > > maActiveSprites;
/// For the frame counter timings
::canvas::tools::ElapsedTime maLastUpdate;
boost::shared_ptr<TextureCache> mpTextureCache;
unsigned int mnLinearTwoColorGradientProgram;
unsigned int mnLinearMultiColorGradientProgram;
unsigned int mnRadialTwoColorGradientProgram;
unsigned int mnRadialMultiColorGradientProgram;
unsigned int mnRectangularTwoColorGradientProgram;
unsigned int mnRectangularMultiColorGradientProgram;
OpenGLContext maContext;
};
}
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|