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 #define GLX_GLXEXT_PROTOTYPES 1
25*b1cdbd2cSJim Jagielski #include "OGLTrans_TransitionImpl.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/XFastPropertySet.hpp>
28*b1cdbd2cSJim Jagielski #include <com/sun/star/rendering/IntegerBitmapLayout.hpp>
29*b1cdbd2cSJim Jagielski #include <com/sun/star/rendering/ColorComponentTag.hpp>
30*b1cdbd2cSJim Jagielski #include <com/sun/star/rendering/ColorSpaceType.hpp>
31*b1cdbd2cSJim Jagielski #include <com/sun/star/animations/TransitionType.hpp>
32*b1cdbd2cSJim Jagielski #include <com/sun/star/animations/TransitionSubType.hpp>
33*b1cdbd2cSJim Jagielski #include <com/sun/star/presentation/XTransitionFactory.hpp>
34*b1cdbd2cSJim Jagielski #include <com/sun/star/presentation/XTransition.hpp>
35*b1cdbd2cSJim Jagielski #include <com/sun/star/presentation/XSlideShowView.hpp>
36*b1cdbd2cSJim Jagielski #include <com/sun/star/uno/XComponentContext.hpp>
37*b1cdbd2cSJim Jagielski #include <com/sun/star/rendering/XIntegerBitmap.hpp>
38*b1cdbd2cSJim Jagielski #include <com/sun/star/geometry/IntegerSize2D.hpp>
39*b1cdbd2cSJim Jagielski 
40*b1cdbd2cSJim Jagielski #include <cppuhelper/compbase1.hxx>
41*b1cdbd2cSJim Jagielski #include <cppuhelper/basemutex.hxx>
42*b1cdbd2cSJim Jagielski #include <cppuhelper/factory.hxx>
43*b1cdbd2cSJim Jagielski #include <rtl/ref.hxx>
44*b1cdbd2cSJim Jagielski 
45*b1cdbd2cSJim Jagielski #include <comphelper/servicedecl.hxx>
46*b1cdbd2cSJim Jagielski 
47*b1cdbd2cSJim Jagielski #include <canvas/canvastools.hxx>
48*b1cdbd2cSJim Jagielski #include <tools/gen.hxx>
49*b1cdbd2cSJim Jagielski #include <vcl/window.hxx>
50*b1cdbd2cSJim Jagielski #include <vcl/syschild.hxx>
51*b1cdbd2cSJim Jagielski 
52*b1cdbd2cSJim Jagielski #include <boost/noncopyable.hpp>
53*b1cdbd2cSJim Jagielski 
54*b1cdbd2cSJim Jagielski #include <GL/gl.h>
55*b1cdbd2cSJim Jagielski #include <GL/glu.h>
56*b1cdbd2cSJim Jagielski 
57*b1cdbd2cSJim Jagielski 
58*b1cdbd2cSJim Jagielski #if defined( WNT )
59*b1cdbd2cSJim Jagielski     #include <tools/prewin.h>
60*b1cdbd2cSJim Jagielski     #include <windows.h>
61*b1cdbd2cSJim Jagielski     #include <tools/postwin.h>
62*b1cdbd2cSJim Jagielski 	#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE
63*b1cdbd2cSJim Jagielski 	#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF
64*b1cdbd2cSJim Jagielski #elif defined( OS2 )
65*b1cdbd2cSJim Jagielski #elif defined( QUARTZ )
66*b1cdbd2cSJim Jagielski     #include "premac.h"
67*b1cdbd2cSJim Jagielski     #include <Cocoa/Cocoa.h>
68*b1cdbd2cSJim Jagielski     #include "postmac.h"
69*b1cdbd2cSJim Jagielski #elif defined( UNX )
70*b1cdbd2cSJim Jagielski namespace unx
71*b1cdbd2cSJim Jagielski {
72*b1cdbd2cSJim Jagielski #include <X11/keysym.h>
73*b1cdbd2cSJim Jagielski #include <X11/X.h>
74*b1cdbd2cSJim Jagielski #include <GL/glx.h>
75*b1cdbd2cSJim Jagielski #include <GL/glxext.h>
76*b1cdbd2cSJim Jagielski 
77*b1cdbd2cSJim Jagielski #if GLX_GLXEXT_VERSION<18
78*b1cdbd2cSJim Jagielski     typedef void(*PFNGLXBINDTEXIMAGEEXTPROC)(Display*dpy,GLXDrawable,int,const int*);
79*b1cdbd2cSJim Jagielski     typedef void(*PFNGLXRELEASETEXIMAGEEXTPROC)(Display*,GLXDrawable,int);
80*b1cdbd2cSJim Jagielski #endif
81*b1cdbd2cSJim Jagielski }
82*b1cdbd2cSJim Jagielski #endif
83*b1cdbd2cSJim Jagielski #include <vcl/sysdata.hxx>
84*b1cdbd2cSJim Jagielski 
85*b1cdbd2cSJim Jagielski #ifdef DEBUG
86*b1cdbd2cSJim Jagielski #include <boost/date_time/posix_time/posix_time.hpp>
87*b1cdbd2cSJim Jagielski using namespace ::boost::posix_time;
88*b1cdbd2cSJim Jagielski 
89*b1cdbd2cSJim Jagielski static ptime t1;
90*b1cdbd2cSJim Jagielski static ptime t2;
91*b1cdbd2cSJim Jagielski 
92*b1cdbd2cSJim Jagielski #define DBG(x) x
93*b1cdbd2cSJim Jagielski #else
94*b1cdbd2cSJim Jagielski #define DBG(x)
95*b1cdbd2cSJim Jagielski #endif
96*b1cdbd2cSJim Jagielski 
97*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
98*b1cdbd2cSJim Jagielski using ::com::sun::star::beans::XFastPropertySet;
99*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Any;
100*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Reference;
101*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Sequence;
102*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::UNO_QUERY;
103*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::UNO_QUERY_THROW;
104*b1cdbd2cSJim Jagielski 
105*b1cdbd2cSJim Jagielski namespace
106*b1cdbd2cSJim Jagielski {
107*b1cdbd2cSJim Jagielski 
108*b1cdbd2cSJim Jagielski typedef cppu::WeakComponentImplHelper1<presentation::XTransition> OGLTransitionerImplBase;
109*b1cdbd2cSJim Jagielski 
110*b1cdbd2cSJim Jagielski namespace
111*b1cdbd2cSJim Jagielski {
112*b1cdbd2cSJim Jagielski     struct OGLFormat
113*b1cdbd2cSJim Jagielski     {
114*b1cdbd2cSJim Jagielski         GLint  nInternalFormat;
115*b1cdbd2cSJim Jagielski         GLenum eFormat;
116*b1cdbd2cSJim Jagielski         GLenum eType;
117*b1cdbd2cSJim Jagielski     };
118*b1cdbd2cSJim Jagielski 
119*b1cdbd2cSJim Jagielski     /* channel ordering: (0:rgba, 1:bgra, 2:argb, 3:abgr)
120*b1cdbd2cSJim Jagielski     */
calcComponentOrderIndex(const uno::Sequence<sal_Int8> & rTags)121*b1cdbd2cSJim Jagielski     int calcComponentOrderIndex(const uno::Sequence<sal_Int8>& rTags)
122*b1cdbd2cSJim Jagielski     {
123*b1cdbd2cSJim Jagielski         using namespace rendering::ColorComponentTag;
124*b1cdbd2cSJim Jagielski 
125*b1cdbd2cSJim Jagielski         static const sal_Int8 aOrderTable[] =
126*b1cdbd2cSJim Jagielski         {
127*b1cdbd2cSJim Jagielski             RGB_RED, RGB_GREEN, RGB_BLUE, ALPHA,
128*b1cdbd2cSJim Jagielski             RGB_BLUE, RGB_GREEN, RGB_RED, ALPHA,
129*b1cdbd2cSJim Jagielski             ALPHA, RGB_RED, RGB_GREEN, RGB_BLUE,
130*b1cdbd2cSJim Jagielski             ALPHA, RGB_BLUE, RGB_GREEN, RGB_RED,
131*b1cdbd2cSJim Jagielski         };
132*b1cdbd2cSJim Jagielski 
133*b1cdbd2cSJim Jagielski         const sal_Int32 nNumComps(rTags.getLength());
134*b1cdbd2cSJim Jagielski         const sal_Int8* pLine=aOrderTable;
135*b1cdbd2cSJim Jagielski         for(int i=0; i<4; ++i)
136*b1cdbd2cSJim Jagielski         {
137*b1cdbd2cSJim Jagielski             int j=0;
138*b1cdbd2cSJim Jagielski             while( j<4 && j<nNumComps && pLine[j] == rTags[j] )
139*b1cdbd2cSJim Jagielski                 ++j;
140*b1cdbd2cSJim Jagielski 
141*b1cdbd2cSJim Jagielski             // all of the line passed, this is a match!
142*b1cdbd2cSJim Jagielski             if( j==nNumComps )
143*b1cdbd2cSJim Jagielski                 return i;
144*b1cdbd2cSJim Jagielski 
145*b1cdbd2cSJim Jagielski             pLine+=4;
146*b1cdbd2cSJim Jagielski         }
147*b1cdbd2cSJim Jagielski 
148*b1cdbd2cSJim Jagielski         return -1;
149*b1cdbd2cSJim Jagielski     }
150*b1cdbd2cSJim Jagielski }
151*b1cdbd2cSJim Jagielski 
152*b1cdbd2cSJim Jagielski // not thread safe
153*b1cdbd2cSJim Jagielski static bool errorTriggered;
oglErrorHandler(unx::Display *,unx::XErrorEvent *)154*b1cdbd2cSJim Jagielski int oglErrorHandler( unx::Display* /*dpy*/, unx::XErrorEvent* /*evnt*/ )
155*b1cdbd2cSJim Jagielski {
156*b1cdbd2cSJim Jagielski     errorTriggered = true;
157*b1cdbd2cSJim Jagielski 
158*b1cdbd2cSJim Jagielski     return 0;
159*b1cdbd2cSJim Jagielski }
160*b1cdbd2cSJim Jagielski 
161*b1cdbd2cSJim Jagielski /** This is the Transitioner class for OpenGL 3D transitions in
162*b1cdbd2cSJim Jagielski  * slideshow. At the moment, it's Linux only. This class is implicitly
163*b1cdbd2cSJim Jagielski  * constructed from XTransitionFactory.
164*b1cdbd2cSJim Jagielski */
165*b1cdbd2cSJim Jagielski class OGLTransitionerImpl : private cppu::BaseMutex, private boost::noncopyable, public OGLTransitionerImplBase
166*b1cdbd2cSJim Jagielski {
167*b1cdbd2cSJim Jagielski public:
168*b1cdbd2cSJim Jagielski     explicit OGLTransitionerImpl(OGLTransitionImpl* pOGLTransition);
169*b1cdbd2cSJim Jagielski     bool initWindowFromSlideShowView( const uno::Reference< presentation::XSlideShowView >& xView );
170*b1cdbd2cSJim Jagielski     void setSlides( const Reference< rendering::XBitmap >& xLeavingSlide , const uno::Reference< rendering::XBitmap >& xEnteringSlide );
171*b1cdbd2cSJim Jagielski     static bool initialize( const Reference< presentation::XSlideShowView >& xView );
172*b1cdbd2cSJim Jagielski 
173*b1cdbd2cSJim Jagielski     // XTransition
174*b1cdbd2cSJim Jagielski     virtual void SAL_CALL update( double nTime )
175*b1cdbd2cSJim Jagielski 	throw (uno::RuntimeException);
176*b1cdbd2cSJim Jagielski     virtual void SAL_CALL viewChanged( const Reference< presentation::XSlideShowView >& rView,
177*b1cdbd2cSJim Jagielski 				       const Reference< rendering::XBitmap >& rLeavingBitmap,
178*b1cdbd2cSJim Jagielski 				       const Reference< rendering::XBitmap >& rEnteringBitmap )
179*b1cdbd2cSJim Jagielski 	throw (uno::RuntimeException);
180*b1cdbd2cSJim Jagielski 
181*b1cdbd2cSJim Jagielski protected:
182*b1cdbd2cSJim Jagielski     void disposeContextAndWindow();
183*b1cdbd2cSJim Jagielski     void disposeTextures();
184*b1cdbd2cSJim Jagielski 
185*b1cdbd2cSJim Jagielski     // WeakComponentImplHelperBase
186*b1cdbd2cSJim Jagielski     virtual void SAL_CALL disposing();
187*b1cdbd2cSJim Jagielski 
isDisposed() const188*b1cdbd2cSJim Jagielski     bool isDisposed() const
189*b1cdbd2cSJim Jagielski     {
190*b1cdbd2cSJim Jagielski         return (rBHelper.bDisposed || rBHelper.bInDispose);
191*b1cdbd2cSJim Jagielski     }
192*b1cdbd2cSJim Jagielski 
193*b1cdbd2cSJim Jagielski     bool createWindow( Window* pPWindow );
194*b1cdbd2cSJim Jagielski     void createTexture( unsigned int* texID,
195*b1cdbd2cSJim Jagielski #if defined( GLX_VERSION_1_3 ) && defined( GLX_EXT_texture_from_pixmap )
196*b1cdbd2cSJim Jagielski 			unx::GLXPixmap pixmap,
197*b1cdbd2cSJim Jagielski 			bool usePixmap,
198*b1cdbd2cSJim Jagielski #endif
199*b1cdbd2cSJim Jagielski 			bool useMipmap,
200*b1cdbd2cSJim Jagielski 			uno::Sequence<sal_Int8>& data,
201*b1cdbd2cSJim Jagielski 			const OGLFormat* pFormat );
202*b1cdbd2cSJim Jagielski     void prepareEnvironment ();
203*b1cdbd2cSJim Jagielski     const OGLFormat* chooseFormats();
204*b1cdbd2cSJim Jagielski 
205*b1cdbd2cSJim Jagielski private:
206*b1cdbd2cSJim Jagielski     /** After the window has been created, and the slides have been set, we'll initialize the slides with OpenGL.
207*b1cdbd2cSJim Jagielski     */
208*b1cdbd2cSJim Jagielski     void GLInitSlides();
209*b1cdbd2cSJim Jagielski 
210*b1cdbd2cSJim Jagielski 
211*b1cdbd2cSJim Jagielski     /// Holds the information of our new child window
212*b1cdbd2cSJim Jagielski     struct GLWindow
213*b1cdbd2cSJim Jagielski     {
214*b1cdbd2cSJim Jagielski #if defined( WNT )
215*b1cdbd2cSJim Jagielski 	HWND					hWnd;
216*b1cdbd2cSJim Jagielski 	HDC						hDC;
217*b1cdbd2cSJim Jagielski 	HGLRC					hRC;
218*b1cdbd2cSJim Jagielski #elif defined( OS2 )
219*b1cdbd2cSJim Jagielski #elif defined( QUARTZ )
220*b1cdbd2cSJim Jagielski #elif defined( UNX )
221*b1cdbd2cSJim Jagielski 	unx::Display*           dpy;
222*b1cdbd2cSJim Jagielski 	int                     screen;
223*b1cdbd2cSJim Jagielski 	unx::Window             win;
224*b1cdbd2cSJim Jagielski #if defined( GLX_VERSION_1_3 ) && defined( GLX_EXT_texture_from_pixmap )
225*b1cdbd2cSJim Jagielski 	unx::GLXFBConfig        fbc;
226*b1cdbd2cSJim Jagielski #endif
227*b1cdbd2cSJim Jagielski 	unx::XVisualInfo*       vi;
228*b1cdbd2cSJim Jagielski 	unx::GLXContext         ctx;
229*b1cdbd2cSJim Jagielski #endif
230*b1cdbd2cSJim Jagielski     	unsigned int            bpp;
231*b1cdbd2cSJim Jagielski     	unsigned int            Width;
232*b1cdbd2cSJim Jagielski     	unsigned int            Height;
233*b1cdbd2cSJim Jagielski         const char*             GLXExtensions;
234*b1cdbd2cSJim Jagielski 	const GLubyte*          GLExtensions;
235*b1cdbd2cSJim Jagielski 
HasGLXExtension__anon02fb2bbc0111::OGLTransitionerImpl::GLWindow236*b1cdbd2cSJim Jagielski         bool HasGLXExtension( const char* name ) { return gluCheckExtension( (const GLubyte*) name, (const GLubyte*) GLXExtensions ); }
HasGLExtension__anon02fb2bbc0111::OGLTransitionerImpl::GLWindow237*b1cdbd2cSJim Jagielski 	bool HasGLExtension( const char* name ) { return gluCheckExtension( (const GLubyte*) name, GLExtensions ); }
238*b1cdbd2cSJim Jagielski     } GLWin;
239*b1cdbd2cSJim Jagielski 
240*b1cdbd2cSJim Jagielski     /** OpenGL handle to the leaving slide's texture
241*b1cdbd2cSJim Jagielski     */
242*b1cdbd2cSJim Jagielski     unsigned int GLleavingSlide;
243*b1cdbd2cSJim Jagielski     /** OpenGL handle to the entering slide's texture
244*b1cdbd2cSJim Jagielski     */
245*b1cdbd2cSJim Jagielski     unsigned int GLenteringSlide;
246*b1cdbd2cSJim Jagielski 
247*b1cdbd2cSJim Jagielski     /** pointer to our window which we MIGHT create.
248*b1cdbd2cSJim Jagielski     */
249*b1cdbd2cSJim Jagielski     class SystemChildWindow* pWindow;
250*b1cdbd2cSJim Jagielski 
251*b1cdbd2cSJim Jagielski     Reference< presentation::XSlideShowView > mxView;
252*b1cdbd2cSJim Jagielski     Reference< rendering::XIntegerBitmap > mxLeavingBitmap;
253*b1cdbd2cSJim Jagielski     Reference< rendering::XIntegerBitmap > mxEnteringBitmap;
254*b1cdbd2cSJim Jagielski 
255*b1cdbd2cSJim Jagielski     /** raw bytes of the entering bitmap
256*b1cdbd2cSJim Jagielski     */
257*b1cdbd2cSJim Jagielski     uno::Sequence<sal_Int8> EnteringBytes;
258*b1cdbd2cSJim Jagielski 
259*b1cdbd2cSJim Jagielski     /** raw bytes of the leaving bitmap
260*b1cdbd2cSJim Jagielski     */
261*b1cdbd2cSJim Jagielski     uno::Sequence<sal_Int8> LeavingBytes;
262*b1cdbd2cSJim Jagielski 
263*b1cdbd2cSJim Jagielski #if defined( GLX_VERSION_1_3 ) && defined( GLX_EXT_texture_from_pixmap )
264*b1cdbd2cSJim Jagielski     unx::GLXPixmap LeavingPixmap;
265*b1cdbd2cSJim Jagielski     unx::GLXPixmap EnteringPixmap;
266*b1cdbd2cSJim Jagielski #endif
267*b1cdbd2cSJim Jagielski     bool mbRestoreSync;
268*b1cdbd2cSJim Jagielski     bool mbUseLeavingPixmap;
269*b1cdbd2cSJim Jagielski     bool mbUseEnteringPixmap;
270*b1cdbd2cSJim Jagielski     bool mbFreeLeavingPixmap;
271*b1cdbd2cSJim Jagielski     bool mbFreeEnteringPixmap;
272*b1cdbd2cSJim Jagielski     unx::Pixmap maLeavingPixmap;
273*b1cdbd2cSJim Jagielski     unx::Pixmap maEnteringPixmap;
274*b1cdbd2cSJim Jagielski 
275*b1cdbd2cSJim Jagielski     /** the form the raw bytes are in for the bitmaps
276*b1cdbd2cSJim Jagielski     */
277*b1cdbd2cSJim Jagielski     rendering::IntegerBitmapLayout SlideBitmapLayout;
278*b1cdbd2cSJim Jagielski 
279*b1cdbd2cSJim Jagielski     /** the size of the slides
280*b1cdbd2cSJim Jagielski     */
281*b1cdbd2cSJim Jagielski     geometry::IntegerSize2D SlideSize;
282*b1cdbd2cSJim Jagielski 
283*b1cdbd2cSJim Jagielski     /** Our Transition to be used.
284*b1cdbd2cSJim Jagielski     */
285*b1cdbd2cSJim Jagielski     OGLTransitionImpl* pTransition;
286*b1cdbd2cSJim Jagielski 
287*b1cdbd2cSJim Jagielski public:
288*b1cdbd2cSJim Jagielski     /** whether we are running on ATI fglrx with bug related to textures
289*b1cdbd2cSJim Jagielski      */
290*b1cdbd2cSJim Jagielski     static bool cbBrokenTexturesATI;
291*b1cdbd2cSJim Jagielski 
292*b1cdbd2cSJim Jagielski     /** GL version
293*b1cdbd2cSJim Jagielski      */
294*b1cdbd2cSJim Jagielski     static float cnGLVersion;
295*b1cdbd2cSJim Jagielski     float mnGLXVersion;
296*b1cdbd2cSJim Jagielski 
297*b1cdbd2cSJim Jagielski     /** Whether Mesa is the OpenGL vendor
298*b1cdbd2cSJim Jagielski      */
299*b1cdbd2cSJim Jagielski     static bool cbMesa;
300*b1cdbd2cSJim Jagielski 
301*b1cdbd2cSJim Jagielski     /**
302*b1cdbd2cSJim Jagielski        whether the display has GLX extension
303*b1cdbd2cSJim Jagielski      */
304*b1cdbd2cSJim Jagielski     static bool cbGLXPresent;
305*b1cdbd2cSJim Jagielski 
306*b1cdbd2cSJim Jagielski     /**
307*b1cdbd2cSJim Jagielski        whether texture from pixmap extension is available
308*b1cdbd2cSJim Jagielski     */
309*b1cdbd2cSJim Jagielski     bool mbTextureFromPixmap;
310*b1cdbd2cSJim Jagielski 
311*b1cdbd2cSJim Jagielski     /**
312*b1cdbd2cSJim Jagielski        whether to generate mipmaped textures
313*b1cdbd2cSJim Jagielski     */
314*b1cdbd2cSJim Jagielski     bool mbGenerateMipmap;
315*b1cdbd2cSJim Jagielski 
316*b1cdbd2cSJim Jagielski     /**
317*b1cdbd2cSJim Jagielski        whether we have visual which can be used for texture_from_pixmap extension
318*b1cdbd2cSJim Jagielski     */
319*b1cdbd2cSJim Jagielski     bool mbHasTFPVisual;
320*b1cdbd2cSJim Jagielski 
321*b1cdbd2cSJim Jagielski #ifdef DEBUG
322*b1cdbd2cSJim Jagielski     ptime t3;
323*b1cdbd2cSJim Jagielski     ptime t4;
324*b1cdbd2cSJim Jagielski     ptime t5;
325*b1cdbd2cSJim Jagielski     ptime t6;
326*b1cdbd2cSJim Jagielski     time_duration total_update;
327*b1cdbd2cSJim Jagielski     int frame_count;
328*b1cdbd2cSJim Jagielski #endif
329*b1cdbd2cSJim Jagielski };
330*b1cdbd2cSJim Jagielski 
331*b1cdbd2cSJim Jagielski // declare the static variables as some gcc versions have problems declaring them automaticaly
332*b1cdbd2cSJim Jagielski bool OGLTransitionerImpl::cbBrokenTexturesATI;
333*b1cdbd2cSJim Jagielski float OGLTransitionerImpl::cnGLVersion;
334*b1cdbd2cSJim Jagielski bool OGLTransitionerImpl::cbMesa;
335*b1cdbd2cSJim Jagielski bool OGLTransitionerImpl::cbGLXPresent;
336*b1cdbd2cSJim Jagielski 
initialize(const Reference<presentation::XSlideShowView> & xView)337*b1cdbd2cSJim Jagielski bool OGLTransitionerImpl::initialize( const Reference< presentation::XSlideShowView >& xView )
338*b1cdbd2cSJim Jagielski {
339*b1cdbd2cSJim Jagielski     // not thread safe
340*b1cdbd2cSJim Jagielski     static bool initialized = false;
341*b1cdbd2cSJim Jagielski 
342*b1cdbd2cSJim Jagielski     if( !initialized ) {
343*b1cdbd2cSJim Jagielski         OGLTransitionerImpl *instance;
344*b1cdbd2cSJim Jagielski 
345*b1cdbd2cSJim Jagielski         instance = new OGLTransitionerImpl( NULL );
346*b1cdbd2cSJim Jagielski         if( instance->initWindowFromSlideShowView( xView ) ) {
347*b1cdbd2cSJim Jagielski 
348*b1cdbd2cSJim Jagielski             const GLubyte* version = glGetString( GL_VERSION );
349*b1cdbd2cSJim Jagielski             if( version && version[0] ) {
350*b1cdbd2cSJim Jagielski                 cnGLVersion = version[0] - '0';
351*b1cdbd2cSJim Jagielski                 if( version[1] == '.' && version[2] )
352*b1cdbd2cSJim Jagielski                     cnGLVersion += (version[2] - '0')/10.0;
353*b1cdbd2cSJim Jagielski             } else
354*b1cdbd2cSJim Jagielski                 cnGLVersion = 1.0;
355*b1cdbd2cSJim Jagielski             OSL_TRACE("GL version: %s parsed: %f", version, cnGLVersion );
356*b1cdbd2cSJim Jagielski 
357*b1cdbd2cSJim Jagielski             const GLubyte* vendor = glGetString( GL_VENDOR );
358*b1cdbd2cSJim Jagielski             cbMesa = ( vendor && strstr( (const char *) vendor, "Mesa" ) );
359*b1cdbd2cSJim Jagielski             OSL_TRACE("GL vendor: %s identified as Mesa: %d", vendor, cbMesa );
360*b1cdbd2cSJim Jagielski 
361*b1cdbd2cSJim Jagielski             /* TODO: check for version once the bug in fglrx driver is fixed */
362*b1cdbd2cSJim Jagielski             cbBrokenTexturesATI = (vendor && strcmp( (const char *) vendor, "ATI Technologies Inc." ) == 0 );
363*b1cdbd2cSJim Jagielski 
364*b1cdbd2cSJim Jagielski             instance->disposing();
365*b1cdbd2cSJim Jagielski             cbGLXPresent = true;
366*b1cdbd2cSJim Jagielski         } else
367*b1cdbd2cSJim Jagielski             cbGLXPresent = false;
368*b1cdbd2cSJim Jagielski 
369*b1cdbd2cSJim Jagielski         delete instance;
370*b1cdbd2cSJim Jagielski         initialized = true;
371*b1cdbd2cSJim Jagielski     }
372*b1cdbd2cSJim Jagielski 
373*b1cdbd2cSJim Jagielski     return cbGLXPresent;
374*b1cdbd2cSJim Jagielski }
375*b1cdbd2cSJim Jagielski 
createWindow(Window * pPWindow)376*b1cdbd2cSJim Jagielski bool OGLTransitionerImpl::createWindow( Window* pPWindow )
377*b1cdbd2cSJim Jagielski {
378*b1cdbd2cSJim Jagielski     const SystemEnvData* sysData(pPWindow->GetSystemData());
379*b1cdbd2cSJim Jagielski #if defined( WNT )
380*b1cdbd2cSJim Jagielski 	GLWin.hWnd = sysData->hWnd;
381*b1cdbd2cSJim Jagielski #elif defined( UNX )
382*b1cdbd2cSJim Jagielski     GLWin.dpy = reinterpret_cast<unx::Display*>(sysData->pDisplay);
383*b1cdbd2cSJim Jagielski 
384*b1cdbd2cSJim Jagielski     if( unx::glXQueryExtension( GLWin.dpy, NULL, NULL ) == false )
385*b1cdbd2cSJim Jagielski         return false;
386*b1cdbd2cSJim Jagielski 
387*b1cdbd2cSJim Jagielski     GLWin.win = sysData->aWindow;
388*b1cdbd2cSJim Jagielski 
389*b1cdbd2cSJim Jagielski     OSL_TRACE("parent window: %d", GLWin.win);
390*b1cdbd2cSJim Jagielski 
391*b1cdbd2cSJim Jagielski     unx::XWindowAttributes xattr;
392*b1cdbd2cSJim Jagielski     unx::XGetWindowAttributes( GLWin.dpy, GLWin.win, &xattr );
393*b1cdbd2cSJim Jagielski 
394*b1cdbd2cSJim Jagielski     GLWin.screen = XScreenNumberOfScreen( xattr.screen );
395*b1cdbd2cSJim Jagielski 
396*b1cdbd2cSJim Jagielski     unx::XVisualInfo* vi( NULL );
397*b1cdbd2cSJim Jagielski #if defined( GLX_VERSION_1_3 ) && defined( GLX_EXT_texture_from_pixmap )
398*b1cdbd2cSJim Jagielski     unx::XVisualInfo* visinfo;
399*b1cdbd2cSJim Jagielski     unx::XVisualInfo* firstVisual( NULL );
400*b1cdbd2cSJim Jagielski #endif
401*b1cdbd2cSJim Jagielski     static int attrList3[] =
402*b1cdbd2cSJim Jagielski         {
403*b1cdbd2cSJim Jagielski 	    GLX_RGBA,//only TrueColor or DirectColor
404*b1cdbd2cSJim Jagielski             //single buffered
405*b1cdbd2cSJim Jagielski             GLX_RED_SIZE,4,//use the maximum red bits, with a minimum of 4 bits
406*b1cdbd2cSJim Jagielski             GLX_GREEN_SIZE,4,//use the maximum green bits, with a minimum of 4 bits
407*b1cdbd2cSJim Jagielski             GLX_BLUE_SIZE,4,//use the maximum blue bits, with a minimum of 4 bits
408*b1cdbd2cSJim Jagielski             GLX_DEPTH_SIZE,0,//no depth buffer
409*b1cdbd2cSJim Jagielski             None
410*b1cdbd2cSJim Jagielski         };
411*b1cdbd2cSJim Jagielski     static int attrList2[] =
412*b1cdbd2cSJim Jagielski 	{
413*b1cdbd2cSJim Jagielski 	    GLX_RGBA,//only TrueColor or DirectColor
414*b1cdbd2cSJim Jagielski             /// single buffered
415*b1cdbd2cSJim Jagielski             GLX_RED_SIZE,4,/// use the maximum red bits, with a minimum of 4 bits
416*b1cdbd2cSJim Jagielski             GLX_GREEN_SIZE,4,/// use the maximum green bits, with a minimum of 4 bits
417*b1cdbd2cSJim Jagielski             GLX_BLUE_SIZE,4,/// use the maximum blue bits, with a minimum of 4 bits
418*b1cdbd2cSJim Jagielski             GLX_DEPTH_SIZE,1,/// use the maximum depth bits, making sure there is a depth buffer
419*b1cdbd2cSJim Jagielski             None
420*b1cdbd2cSJim Jagielski         };
421*b1cdbd2cSJim Jagielski     static int attrList1[] =
422*b1cdbd2cSJim Jagielski         {
423*b1cdbd2cSJim Jagielski 	    GLX_RGBA,//only TrueColor or DirectColor
424*b1cdbd2cSJim Jagielski             GLX_DOUBLEBUFFER,/// only double buffer
425*b1cdbd2cSJim Jagielski             GLX_RED_SIZE,4,/// use the maximum red bits, with a minimum of 4 bits
426*b1cdbd2cSJim Jagielski             GLX_GREEN_SIZE,4,/// use the maximum green bits, with a minimum of 4 bits
427*b1cdbd2cSJim Jagielski             GLX_BLUE_SIZE,4,/// use the maximum blue bits, with a minimum of 4 bits
428*b1cdbd2cSJim Jagielski             GLX_DEPTH_SIZE,0,/// no depth buffer
429*b1cdbd2cSJim Jagielski             None
430*b1cdbd2cSJim Jagielski         };
431*b1cdbd2cSJim Jagielski     static int attrList0[] =
432*b1cdbd2cSJim Jagielski         {
433*b1cdbd2cSJim Jagielski 	    GLX_RGBA,//only TrueColor or DirectColor
434*b1cdbd2cSJim Jagielski             GLX_DOUBLEBUFFER,/// only double buffer
435*b1cdbd2cSJim Jagielski             GLX_RED_SIZE,4,/// use the maximum red bits, with a minimum of 4 bits
436*b1cdbd2cSJim Jagielski             GLX_GREEN_SIZE,4,/// use the maximum green bits, with a minimum of 4 bits
437*b1cdbd2cSJim Jagielski             GLX_BLUE_SIZE,4,/// use the maximum blue bits, with a minimum of 4 bits
438*b1cdbd2cSJim Jagielski             GLX_DEPTH_SIZE,1,/// use the maximum depth bits, making sure there is a depth buffer
439*b1cdbd2cSJim Jagielski             None
440*b1cdbd2cSJim Jagielski        };
441*b1cdbd2cSJim Jagielski     static int* attrTable[] =
442*b1cdbd2cSJim Jagielski         {
443*b1cdbd2cSJim Jagielski             attrList0,
444*b1cdbd2cSJim Jagielski             attrList1,
445*b1cdbd2cSJim Jagielski             attrList2,
446*b1cdbd2cSJim Jagielski             attrList3,
447*b1cdbd2cSJim Jagielski             NULL
448*b1cdbd2cSJim Jagielski         };
449*b1cdbd2cSJim Jagielski 	int** pAttributeTable = attrTable;
450*b1cdbd2cSJim Jagielski     const SystemEnvData* pChildSysData = NULL;
451*b1cdbd2cSJim Jagielski     delete pWindow;
452*b1cdbd2cSJim Jagielski     pWindow=NULL;
453*b1cdbd2cSJim Jagielski 
454*b1cdbd2cSJim Jagielski #if defined( GLX_VERSION_1_3 ) && defined( GLX_EXT_texture_from_pixmap )
455*b1cdbd2cSJim Jagielski     unx::GLXFBConfig* fbconfigs = NULL;
456*b1cdbd2cSJim Jagielski     int nfbconfigs, value, i = 0;
457*b1cdbd2cSJim Jagielski #endif
458*b1cdbd2cSJim Jagielski 
459*b1cdbd2cSJim Jagielski     while( *pAttributeTable )
460*b1cdbd2cSJim Jagielski     {
461*b1cdbd2cSJim Jagielski         // try to find a visual for the current set of attributes
462*b1cdbd2cSJim Jagielski         vi = unx::glXChooseVisual( GLWin.dpy,
463*b1cdbd2cSJim Jagielski                                    GLWin.screen,
464*b1cdbd2cSJim Jagielski                                    *pAttributeTable );
465*b1cdbd2cSJim Jagielski 
466*b1cdbd2cSJim Jagielski #if defined( GLX_VERSION_1_3 ) && defined( GLX_EXT_texture_from_pixmap )
467*b1cdbd2cSJim Jagielski       if( vi ) {
468*b1cdbd2cSJim Jagielski 	  if( !firstVisual )
469*b1cdbd2cSJim Jagielski 	      firstVisual = vi;
470*b1cdbd2cSJim Jagielski 	  OSL_TRACE("trying VisualID %08X", vi->visualid);
471*b1cdbd2cSJim Jagielski           fbconfigs = glXGetFBConfigs (GLWin.dpy, GLWin.screen, &nfbconfigs);
472*b1cdbd2cSJim Jagielski           for ( ; i < nfbconfigs; i++)
473*b1cdbd2cSJim Jagielski           {
474*b1cdbd2cSJim Jagielski               visinfo = glXGetVisualFromFBConfig (GLWin.dpy, fbconfigs[i]);
475*b1cdbd2cSJim Jagielski               if( !visinfo || visinfo->visualid != vi->visualid )
476*b1cdbd2cSJim Jagielski                   continue;
477*b1cdbd2cSJim Jagielski 
478*b1cdbd2cSJim Jagielski               glXGetFBConfigAttrib (GLWin.dpy, fbconfigs[i], GLX_DRAWABLE_TYPE, &value);
479*b1cdbd2cSJim Jagielski               if (!(value & GLX_PIXMAP_BIT))
480*b1cdbd2cSJim Jagielski                   continue;
481*b1cdbd2cSJim Jagielski 
482*b1cdbd2cSJim Jagielski               glXGetFBConfigAttrib (GLWin.dpy, fbconfigs[i],
483*b1cdbd2cSJim Jagielski                                     GLX_BIND_TO_TEXTURE_TARGETS_EXT,
484*b1cdbd2cSJim Jagielski                                     &value);
485*b1cdbd2cSJim Jagielski               if (!(value & GLX_TEXTURE_2D_BIT_EXT))
486*b1cdbd2cSJim Jagielski                   continue;
487*b1cdbd2cSJim Jagielski 
488*b1cdbd2cSJim Jagielski               glXGetFBConfigAttrib (GLWin.dpy, fbconfigs[i],
489*b1cdbd2cSJim Jagielski                                     GLX_BIND_TO_TEXTURE_RGB_EXT,
490*b1cdbd2cSJim Jagielski                                     &value);
491*b1cdbd2cSJim Jagielski               if (!value)
492*b1cdbd2cSJim Jagielski                   continue;
493*b1cdbd2cSJim Jagielski 
494*b1cdbd2cSJim Jagielski               glXGetFBConfigAttrib (GLWin.dpy, fbconfigs[i],
495*b1cdbd2cSJim Jagielski                                     GLX_BIND_TO_MIPMAP_TEXTURE_EXT,
496*b1cdbd2cSJim Jagielski                                     &value);
497*b1cdbd2cSJim Jagielski               if (!value)
498*b1cdbd2cSJim Jagielski                   continue;
499*b1cdbd2cSJim Jagielski 
500*b1cdbd2cSJim Jagielski               /* TODO: handle non Y inverted cases */
501*b1cdbd2cSJim Jagielski               break;
502*b1cdbd2cSJim Jagielski           }
503*b1cdbd2cSJim Jagielski 
504*b1cdbd2cSJim Jagielski           if( i != nfbconfigs || ( firstVisual && pAttributeTable[1] == NULL ) ) {
505*b1cdbd2cSJim Jagielski 	      if( i != nfbconfigs ) {
506*b1cdbd2cSJim Jagielski 		  vi = glXGetVisualFromFBConfig( GLWin.dpy, fbconfigs[i] );
507*b1cdbd2cSJim Jagielski 		  mbHasTFPVisual = true;
508*b1cdbd2cSJim Jagielski 		  OSL_TRACE("found visual suitable for texture_from_pixmap");
509*b1cdbd2cSJim Jagielski 	      } else {
510*b1cdbd2cSJim Jagielski 		  vi = firstVisual;
511*b1cdbd2cSJim Jagielski 		  mbHasTFPVisual = false;
512*b1cdbd2cSJim Jagielski 		  OSL_TRACE("did not find visual suitable for texture_from_pixmap, using %08X", vi->visualid);
513*b1cdbd2cSJim Jagielski 	      }
514*b1cdbd2cSJim Jagielski #else
515*b1cdbd2cSJim Jagielski 	  if( vi ) {
516*b1cdbd2cSJim Jagielski #endif
517*b1cdbd2cSJim Jagielski               SystemWindowData winData;
518*b1cdbd2cSJim Jagielski               winData.nSize = sizeof(winData);
519*b1cdbd2cSJim Jagielski 	      OSL_TRACE("using VisualID %08X", vi->visualid);
520*b1cdbd2cSJim Jagielski               winData.pVisual = (void*)(vi->visual);
521*b1cdbd2cSJim Jagielski               pWindow=new SystemChildWindow(pPWindow, 0, &winData, sal_False);
522*b1cdbd2cSJim Jagielski               pChildSysData = pWindow->GetSystemData();
523*b1cdbd2cSJim Jagielski               if( pChildSysData ) {
524*b1cdbd2cSJim Jagielski                   break;
525*b1cdbd2cSJim Jagielski               } else {
526*b1cdbd2cSJim Jagielski                   delete pWindow, pWindow=NULL;
527*b1cdbd2cSJim Jagielski               }
528*b1cdbd2cSJim Jagielski           }
529*b1cdbd2cSJim Jagielski #if defined( GLX_VERSION_1_3 ) && defined( GLX_EXT_texture_from_pixmap )
530*b1cdbd2cSJim Jagielski       }
531*b1cdbd2cSJim Jagielski #endif
532*b1cdbd2cSJim Jagielski 
533*b1cdbd2cSJim Jagielski         ++pAttributeTable;
534*b1cdbd2cSJim Jagielski       }
535*b1cdbd2cSJim Jagielski #endif
536*b1cdbd2cSJim Jagielski 
537*b1cdbd2cSJim Jagielski #if defined( WNT )
538*b1cdbd2cSJim Jagielski       const SystemEnvData* pChildSysData = NULL;
539*b1cdbd2cSJim Jagielski       SystemWindowData winData;
540*b1cdbd2cSJim Jagielski       winData.nSize = sizeof(winData);
541*b1cdbd2cSJim Jagielski       pWindow=new SystemChildWindow(pPWindow, 0, &winData, sal_False);
542*b1cdbd2cSJim Jagielski       pChildSysData = pWindow->GetSystemData();
543*b1cdbd2cSJim Jagielski #endif
544*b1cdbd2cSJim Jagielski 
545*b1cdbd2cSJim Jagielski       if( pWindow )
546*b1cdbd2cSJim Jagielski       {
547*b1cdbd2cSJim Jagielski 	  pWindow->SetMouseTransparent( sal_True );
548*b1cdbd2cSJim Jagielski 	  pWindow->SetParentClipMode( PARENTCLIPMODE_NOCLIP );
549*b1cdbd2cSJim Jagielski 	  pWindow->EnableEraseBackground( sal_False );
550*b1cdbd2cSJim Jagielski 	  pWindow->SetControlForeground();
551*b1cdbd2cSJim Jagielski 	  pWindow->SetControlBackground();
552*b1cdbd2cSJim Jagielski 	  pWindow->EnablePaint(sal_False);
553*b1cdbd2cSJim Jagielski #if defined( WNT )
554*b1cdbd2cSJim Jagielski 		GLWin.hWnd = sysData->hWnd;
555*b1cdbd2cSJim Jagielski #elif defined( UNX )
556*b1cdbd2cSJim Jagielski         GLWin.dpy = reinterpret_cast<unx::Display*>(pChildSysData->pDisplay);
557*b1cdbd2cSJim Jagielski         GLWin.win = pChildSysData->aWindow;
558*b1cdbd2cSJim Jagielski #if defined( GLX_VERSION_1_3 ) && defined( GLX_EXT_texture_from_pixmap )
559*b1cdbd2cSJim Jagielski 	if( mbHasTFPVisual )
560*b1cdbd2cSJim Jagielski 	    GLWin.fbc = fbconfigs[i];
561*b1cdbd2cSJim Jagielski #endif
562*b1cdbd2cSJim Jagielski 	GLWin.vi = vi;
563*b1cdbd2cSJim Jagielski 	GLWin.GLXExtensions = unx::glXQueryExtensionsString( GLWin.dpy, GLWin.screen );
564*b1cdbd2cSJim Jagielski 	OSL_TRACE("available GLX extensions: %s", GLWin.GLXExtensions);
565*b1cdbd2cSJim Jagielski #endif
566*b1cdbd2cSJim Jagielski 
567*b1cdbd2cSJim Jagielski 	return true;
568*b1cdbd2cSJim Jagielski     }
569*b1cdbd2cSJim Jagielski 
570*b1cdbd2cSJim Jagielski     return false;
571*b1cdbd2cSJim Jagielski }
572*b1cdbd2cSJim Jagielski 
573*b1cdbd2cSJim Jagielski bool OGLTransitionerImpl::initWindowFromSlideShowView( const Reference< presentation::XSlideShowView >& xView )
574*b1cdbd2cSJim Jagielski {
575*b1cdbd2cSJim Jagielski     osl::MutexGuard const guard( m_aMutex );
576*b1cdbd2cSJim Jagielski 
577*b1cdbd2cSJim Jagielski     if (isDisposed())
578*b1cdbd2cSJim Jagielski         return false;
579*b1cdbd2cSJim Jagielski 
580*b1cdbd2cSJim Jagielski     mxView.set( xView, UNO_QUERY );
581*b1cdbd2cSJim Jagielski     if( !mxView.is() )
582*b1cdbd2cSJim Jagielski 	return false;
583*b1cdbd2cSJim Jagielski 
584*b1cdbd2cSJim Jagielski     /// take the XSlideShowView and extract the parent window from it. see viewmediashape.cxx
585*b1cdbd2cSJim Jagielski     uno::Reference< rendering::XCanvas > xCanvas(mxView->getCanvas(), uno::UNO_QUERY_THROW);
586*b1cdbd2cSJim Jagielski     uno::Sequence< uno::Any > aDeviceParams;
587*b1cdbd2cSJim Jagielski     ::canvas::tools::getDeviceInfo( xCanvas, aDeviceParams );
588*b1cdbd2cSJim Jagielski 
589*b1cdbd2cSJim Jagielski     ::rtl::OUString aImplName;
590*b1cdbd2cSJim Jagielski     aDeviceParams[ 0 ] >>= aImplName;
591*b1cdbd2cSJim Jagielski 
592*b1cdbd2cSJim Jagielski     sal_Int64 aVal = 0;
593*b1cdbd2cSJim Jagielski     aDeviceParams[1] >>= aVal;
594*b1cdbd2cSJim Jagielski     if( !createWindow( reinterpret_cast< Window* >( aVal ) ) )
595*b1cdbd2cSJim Jagielski 	return false;
596*b1cdbd2cSJim Jagielski 
597*b1cdbd2cSJim Jagielski     awt::Rectangle aCanvasArea = mxView->getCanvasArea();
598*b1cdbd2cSJim Jagielski     pWindow->SetPosSizePixel(aCanvasArea.X, aCanvasArea.Y, aCanvasArea.Width, aCanvasArea.Height);
599*b1cdbd2cSJim Jagielski     GLWin.Width = aCanvasArea.Width;
600*b1cdbd2cSJim Jagielski     GLWin.Height = aCanvasArea.Height;
601*b1cdbd2cSJim Jagielski     OSL_TRACE("canvas area: %d,%d - %dx%d", aCanvasArea.X, aCanvasArea.Y, aCanvasArea.Width, aCanvasArea.Height);
602*b1cdbd2cSJim Jagielski 
603*b1cdbd2cSJim Jagielski #if defined( WNT )
604*b1cdbd2cSJim Jagielski 		GLWin.hDC = GetDC(GLWin.hWnd);
605*b1cdbd2cSJim Jagielski #elif defined( UNX )
606*b1cdbd2cSJim Jagielski     GLWin.ctx = glXCreateContext(GLWin.dpy,
607*b1cdbd2cSJim Jagielski                                  GLWin.vi,
608*b1cdbd2cSJim Jagielski                                  0,
609*b1cdbd2cSJim Jagielski                                  GL_TRUE);
610*b1cdbd2cSJim Jagielski     if( GLWin.ctx == NULL ) {
611*b1cdbd2cSJim Jagielski 	OSL_TRACE("unable to create GLX context");
612*b1cdbd2cSJim Jagielski 	return false;
613*b1cdbd2cSJim Jagielski     }
614*b1cdbd2cSJim Jagielski #endif
615*b1cdbd2cSJim Jagielski 
616*b1cdbd2cSJim Jagielski #if defined( WNT )
617*b1cdbd2cSJim Jagielski 	PIXELFORMATDESCRIPTOR PixelFormatFront =					// PixelFormat Tells Windows How We Want Things To Be
618*b1cdbd2cSJim Jagielski 	{
619*b1cdbd2cSJim Jagielski 		sizeof(PIXELFORMATDESCRIPTOR),
620*b1cdbd2cSJim Jagielski 		1,								// Version Number
621*b1cdbd2cSJim Jagielski 		PFD_DRAW_TO_WINDOW |
622*b1cdbd2cSJim Jagielski 		PFD_SUPPORT_OPENGL |
623*b1cdbd2cSJim Jagielski 		PFD_DOUBLEBUFFER,
624*b1cdbd2cSJim Jagielski 		PFD_TYPE_RGBA,					// Request An RGBA Format
625*b1cdbd2cSJim Jagielski 		(BYTE)32,						// Select Our Color Depth
626*b1cdbd2cSJim Jagielski 		0, 0, 0, 0, 0, 0,				// Color Bits Ignored
627*b1cdbd2cSJim Jagielski 		0,								// No Alpha Buffer
628*b1cdbd2cSJim Jagielski 		0,								// Shift Bit Ignored
629*b1cdbd2cSJim Jagielski 		0,								// No Accumulation Buffer
630*b1cdbd2cSJim Jagielski 		0, 0, 0, 0,						// Accumulation Bits Ignored
631*b1cdbd2cSJim Jagielski 		64,								// 32 bit Z-BUFFER
632*b1cdbd2cSJim Jagielski 		0,								// 0 bit stencil buffer
633*b1cdbd2cSJim Jagielski 		0,								// No Auxiliary Buffer
634*b1cdbd2cSJim Jagielski 		0,								// now ignored
635*b1cdbd2cSJim Jagielski 		0,								// Reserved
636*b1cdbd2cSJim Jagielski 		0, 0, 0							// Layer Masks Ignored
637*b1cdbd2cSJim Jagielski 	};
638*b1cdbd2cSJim Jagielski 	int WindowPix = ChoosePixelFormat(GLWin.hDC,&PixelFormatFront);
639*b1cdbd2cSJim Jagielski 	SetPixelFormat(GLWin.hDC,WindowPix,&PixelFormatFront);
640*b1cdbd2cSJim Jagielski 	GLWin.hRC  = wglCreateContext(GLWin.hDC);
641*b1cdbd2cSJim Jagielski 	wglMakeCurrent(GLWin.hDC,GLWin.hRC);
642*b1cdbd2cSJim Jagielski #elif defined( UNX )
643*b1cdbd2cSJim Jagielski 	if( !glXMakeCurrent( GLWin.dpy, GLWin.win, GLWin.ctx ) ) {
644*b1cdbd2cSJim Jagielski 	    OSL_TRACE("unable to select current GLX context");
645*b1cdbd2cSJim Jagielski 	    return false;
646*b1cdbd2cSJim Jagielski 	}
647*b1cdbd2cSJim Jagielski 
648*b1cdbd2cSJim Jagielski     int glxMinor, glxMajor;
649*b1cdbd2cSJim Jagielski     mnGLXVersion = 0;
650*b1cdbd2cSJim Jagielski     if( glXQueryVersion( GLWin.dpy, &glxMajor, &glxMinor ) )
651*b1cdbd2cSJim Jagielski       mnGLXVersion = glxMajor + 0.1*glxMinor;
652*b1cdbd2cSJim Jagielski     OSL_TRACE("available GLX version: %f", mnGLXVersion);
653*b1cdbd2cSJim Jagielski 
654*b1cdbd2cSJim Jagielski     GLWin.GLExtensions = glGetString( GL_EXTENSIONS );
655*b1cdbd2cSJim Jagielski     OSL_TRACE("available GL  extensions: %s", GLWin.GLExtensions);
656*b1cdbd2cSJim Jagielski 
657*b1cdbd2cSJim Jagielski     mbTextureFromPixmap = GLWin.HasGLXExtension( "GLX_EXT_texture_from_pixmap" );
658*b1cdbd2cSJim Jagielski     mbGenerateMipmap = GLWin.HasGLExtension( "GL_SGIS_generate_mipmap" );
659*b1cdbd2cSJim Jagielski 
660*b1cdbd2cSJim Jagielski     if( GLWin.HasGLXExtension("GLX_SGI_swap_control" ) ) {
661*b1cdbd2cSJim Jagielski 	    // enable vsync
662*b1cdbd2cSJim Jagielski 	    typedef GLint (*glXSwapIntervalProc)(GLint);
663*b1cdbd2cSJim Jagielski 	    glXSwapIntervalProc glXSwapInterval = (glXSwapIntervalProc) unx::glXGetProcAddress( (const GLubyte*) "glXSwapIntervalSGI" );
664*b1cdbd2cSJim Jagielski 	    if( glXSwapInterval ) {
665*b1cdbd2cSJim Jagielski 		int (*oldHandler)(unx::Display* /*dpy*/, unx::XErrorEvent* /*evnt*/);
666*b1cdbd2cSJim Jagielski 
667*b1cdbd2cSJim Jagielski 		// replace error handler temporarily
668*b1cdbd2cSJim Jagielski 		oldHandler = unx::XSetErrorHandler( oglErrorHandler );
669*b1cdbd2cSJim Jagielski 
670*b1cdbd2cSJim Jagielski 		errorTriggered = false;
671*b1cdbd2cSJim Jagielski 
672*b1cdbd2cSJim Jagielski 		glXSwapInterval( 1 );
673*b1cdbd2cSJim Jagielski 
674*b1cdbd2cSJim Jagielski 		// sync so that we possibly get an XError
675*b1cdbd2cSJim Jagielski 		unx::glXWaitGL();
676*b1cdbd2cSJim Jagielski 		XSync(GLWin.dpy, false);
677*b1cdbd2cSJim Jagielski 
678*b1cdbd2cSJim Jagielski 		if( errorTriggered )
679*b1cdbd2cSJim Jagielski 		    OSL_TRACE("error when trying to set swap interval, NVIDIA or Mesa bug?");
680*b1cdbd2cSJim Jagielski 		else
681*b1cdbd2cSJim Jagielski 		    OSL_TRACE("set swap interval to 1 (enable vsync)");
682*b1cdbd2cSJim Jagielski 
683*b1cdbd2cSJim Jagielski 		// restore the error handler
684*b1cdbd2cSJim Jagielski 		unx::XSetErrorHandler( oldHandler );
685*b1cdbd2cSJim Jagielski 	    }
686*b1cdbd2cSJim Jagielski     }
687*b1cdbd2cSJim Jagielski #endif
688*b1cdbd2cSJim Jagielski 
689*b1cdbd2cSJim Jagielski     glEnable(GL_CULL_FACE);
690*b1cdbd2cSJim Jagielski     glCullFace(GL_BACK);
691*b1cdbd2cSJim Jagielski     glClearColor (0, 0, 0, 0);
692*b1cdbd2cSJim Jagielski     glClear(GL_COLOR_BUFFER_BIT);
693*b1cdbd2cSJim Jagielski #if defined( WNT )
694*b1cdbd2cSJim Jagielski 	SwapBuffers(GLWin.hDC);
695*b1cdbd2cSJim Jagielski #elif defined( UNX )
696*b1cdbd2cSJim Jagielski     unx::glXSwapBuffers(GLWin.dpy, GLWin.win);
697*b1cdbd2cSJim Jagielski #endif
698*b1cdbd2cSJim Jagielski 
699*b1cdbd2cSJim Jagielski     glEnable(GL_LIGHTING);
700*b1cdbd2cSJim Jagielski     GLfloat light_direction[] = { 0.0 , 0.0 , 1.0 };
701*b1cdbd2cSJim Jagielski     GLfloat materialDiffuse[] = { 1.0 , 1.0 , 1.0 , 1.0};
702*b1cdbd2cSJim Jagielski     glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, light_direction);
703*b1cdbd2cSJim Jagielski     glMaterialfv(GL_FRONT,GL_DIFFUSE,materialDiffuse);
704*b1cdbd2cSJim Jagielski     glEnable(GL_LIGHT0);
705*b1cdbd2cSJim Jagielski     glEnable(GL_NORMALIZE);
706*b1cdbd2cSJim Jagielski 
707*b1cdbd2cSJim Jagielski     if( LeavingBytes.hasElements() && EnteringBytes.hasElements())
708*b1cdbd2cSJim Jagielski        GLInitSlides();//we already have uninitialized slides, let's initialize
709*b1cdbd2cSJim Jagielski 
710*b1cdbd2cSJim Jagielski     if( pTransition && pTransition->mnRequiredGLVersion <= cnGLVersion )
711*b1cdbd2cSJim Jagielski         pTransition->prepare( GLleavingSlide, GLenteringSlide );
712*b1cdbd2cSJim Jagielski 
713*b1cdbd2cSJim Jagielski     return true;
714*b1cdbd2cSJim Jagielski }
715*b1cdbd2cSJim Jagielski 
716*b1cdbd2cSJim Jagielski void OGLTransitionerImpl::setSlides( const uno::Reference< rendering::XBitmap >& xLeavingSlide,
717*b1cdbd2cSJim Jagielski                                      const uno::Reference< rendering::XBitmap >& xEnteringSlide )
718*b1cdbd2cSJim Jagielski {
719*b1cdbd2cSJim Jagielski     osl::MutexGuard const guard( m_aMutex );
720*b1cdbd2cSJim Jagielski 
721*b1cdbd2cSJim Jagielski     if (isDisposed())
722*b1cdbd2cSJim Jagielski         return;
723*b1cdbd2cSJim Jagielski 
724*b1cdbd2cSJim Jagielski     mxLeavingBitmap.set( xLeavingSlide , UNO_QUERY_THROW );
725*b1cdbd2cSJim Jagielski     mxEnteringBitmap.set( xEnteringSlide , UNO_QUERY_THROW );
726*b1cdbd2cSJim Jagielski     Reference< XFastPropertySet > xLeavingSet( xLeavingSlide , UNO_QUERY );
727*b1cdbd2cSJim Jagielski     Reference< XFastPropertySet > xEnteringSet( xEnteringSlide , UNO_QUERY );
728*b1cdbd2cSJim Jagielski 
729*b1cdbd2cSJim Jagielski     geometry::IntegerRectangle2D SlideRect;
730*b1cdbd2cSJim Jagielski     SlideSize = mxLeavingBitmap->getSize();
731*b1cdbd2cSJim Jagielski     SlideRect.X1 = 0;
732*b1cdbd2cSJim Jagielski     SlideRect.X2 = SlideSize.Width;
733*b1cdbd2cSJim Jagielski     SlideRect.Y1 = 0;
734*b1cdbd2cSJim Jagielski     SlideRect.Y2 = SlideSize.Height;
735*b1cdbd2cSJim Jagielski 
736*b1cdbd2cSJim Jagielski     OSL_TRACE("leaving bitmap area: %dx%d", SlideSize.Width, SlideSize.Height);
737*b1cdbd2cSJim Jagielski     SlideSize = mxEnteringBitmap->getSize();
738*b1cdbd2cSJim Jagielski     OSL_TRACE("entering bitmap area: %dx%d", SlideSize.Width, SlideSize.Height);
739*b1cdbd2cSJim Jagielski 
740*b1cdbd2cSJim Jagielski #ifdef UNX
741*b1cdbd2cSJim Jagielski     unx::glXWaitGL();
742*b1cdbd2cSJim Jagielski     XSync(GLWin.dpy, false);
743*b1cdbd2cSJim Jagielski #endif
744*b1cdbd2cSJim Jagielski 
745*b1cdbd2cSJim Jagielski #ifdef DEBUG
746*b1cdbd2cSJim Jagielski     t1 = microsec_clock::local_time();
747*b1cdbd2cSJim Jagielski #endif
748*b1cdbd2cSJim Jagielski 
749*b1cdbd2cSJim Jagielski     mbUseLeavingPixmap = false;
750*b1cdbd2cSJim Jagielski     mbUseEnteringPixmap = false;
751*b1cdbd2cSJim Jagielski 
752*b1cdbd2cSJim Jagielski #ifdef UNX
753*b1cdbd2cSJim Jagielski #if defined( GLX_VERSION_1_3 ) && defined( GLX_EXT_texture_from_pixmap )
754*b1cdbd2cSJim Jagielski 
755*b1cdbd2cSJim Jagielski     if( mnGLXVersion >= 1.2999 && mbTextureFromPixmap && xLeavingSet.is() && xEnteringSet.is() && mbHasTFPVisual ) {
756*b1cdbd2cSJim Jagielski 	Sequence< Any > leaveArgs;
757*b1cdbd2cSJim Jagielski 	Sequence< Any > enterArgs;
758*b1cdbd2cSJim Jagielski 	if( (xLeavingSet->getFastPropertyValue( 1 ) >>= leaveArgs) &&
759*b1cdbd2cSJim Jagielski 	    (xEnteringSet->getFastPropertyValue( 1 ) >>= enterArgs) ) {
760*b1cdbd2cSJim Jagielski 	    OSL_TRACE ("pixmaps available");
761*b1cdbd2cSJim Jagielski 
762*b1cdbd2cSJim Jagielski 	    sal_Int32 depth;
763*b1cdbd2cSJim Jagielski 
764*b1cdbd2cSJim Jagielski 	    leaveArgs[0] >>= mbFreeLeavingPixmap;
765*b1cdbd2cSJim Jagielski 	    enterArgs[0] >>= mbFreeEnteringPixmap;
766*b1cdbd2cSJim Jagielski 	    leaveArgs[1] >>= maLeavingPixmap;
767*b1cdbd2cSJim Jagielski 	    enterArgs[1] >>= maEnteringPixmap;
768*b1cdbd2cSJim Jagielski 	    leaveArgs[2] >>= depth;
769*b1cdbd2cSJim Jagielski 
770*b1cdbd2cSJim Jagielski 	    int pixmapAttribs[] = { GLX_TEXTURE_TARGET_EXT, GLX_TEXTURE_2D_EXT,
771*b1cdbd2cSJim Jagielski 				    GLX_TEXTURE_FORMAT_EXT, GLX_TEXTURE_FORMAT_RGB_EXT,
772*b1cdbd2cSJim Jagielski 				    GLX_MIPMAP_TEXTURE_EXT, True,
773*b1cdbd2cSJim Jagielski 				    None };
774*b1cdbd2cSJim Jagielski 
775*b1cdbd2cSJim Jagielski 
776*b1cdbd2cSJim Jagielski 	    // sync so that we possibly get an pending XError, before we set our handler.
777*b1cdbd2cSJim Jagielski 	    // this way we will not miss any error from other code
778*b1cdbd2cSJim Jagielski 	    unx::glXWaitGL();
779*b1cdbd2cSJim Jagielski 	    XSync(GLWin.dpy, false);
780*b1cdbd2cSJim Jagielski 
781*b1cdbd2cSJim Jagielski 	    int (*oldHandler)(unx::Display* /*dpy*/, unx::XErrorEvent* /*evnt*/);
782*b1cdbd2cSJim Jagielski 
783*b1cdbd2cSJim Jagielski 	    // replace error handler temporarily
784*b1cdbd2cSJim Jagielski 	    oldHandler = unx::XSetErrorHandler( oglErrorHandler );
785*b1cdbd2cSJim Jagielski 
786*b1cdbd2cSJim Jagielski 	    errorTriggered = false;
787*b1cdbd2cSJim Jagielski 	    LeavingPixmap = glXCreatePixmap( GLWin.dpy, GLWin.fbc, maLeavingPixmap, pixmapAttribs );
788*b1cdbd2cSJim Jagielski 
789*b1cdbd2cSJim Jagielski 	    // sync so that we possibly get an XError
790*b1cdbd2cSJim Jagielski 	    unx::glXWaitGL();
791*b1cdbd2cSJim Jagielski 	    XSync(GLWin.dpy, false);
792*b1cdbd2cSJim Jagielski 
793*b1cdbd2cSJim Jagielski 	    if( !errorTriggered )
794*b1cdbd2cSJim Jagielski 		mbUseLeavingPixmap = true;
795*b1cdbd2cSJim Jagielski 	    else {
796*b1cdbd2cSJim Jagielski 		OSL_TRACE("XError triggered");
797*b1cdbd2cSJim Jagielski 		if( mbFreeLeavingPixmap ) {
798*b1cdbd2cSJim Jagielski 		    unx::XFreePixmap( GLWin.dpy, maLeavingPixmap );
799*b1cdbd2cSJim Jagielski 		    mbFreeLeavingPixmap = false;
800*b1cdbd2cSJim Jagielski 		}
801*b1cdbd2cSJim Jagielski 		errorTriggered = false;
802*b1cdbd2cSJim Jagielski 	    }
803*b1cdbd2cSJim Jagielski 
804*b1cdbd2cSJim Jagielski 	    EnteringPixmap = glXCreatePixmap( GLWin.dpy, GLWin.fbc, maEnteringPixmap, pixmapAttribs );
805*b1cdbd2cSJim Jagielski 
806*b1cdbd2cSJim Jagielski 	    // sync so that we possibly get an XError
807*b1cdbd2cSJim Jagielski 	    unx::glXWaitGL();
808*b1cdbd2cSJim Jagielski 	    XSync(GLWin.dpy, false);
809*b1cdbd2cSJim Jagielski 
810*b1cdbd2cSJim Jagielski 	    OSL_TRACE("created glx pixmap %p and %p depth: %d", LeavingPixmap, EnteringPixmap, depth);
811*b1cdbd2cSJim Jagielski 	    if( !errorTriggered )
812*b1cdbd2cSJim Jagielski 		mbUseEnteringPixmap = true;
813*b1cdbd2cSJim Jagielski 	    else {
814*b1cdbd2cSJim Jagielski 		OSL_TRACE("XError triggered");
815*b1cdbd2cSJim Jagielski 		if( mbFreeEnteringPixmap ) {
816*b1cdbd2cSJim Jagielski 		    unx::XFreePixmap( GLWin.dpy, maEnteringPixmap );
817*b1cdbd2cSJim Jagielski 		    mbFreeEnteringPixmap = false;
818*b1cdbd2cSJim Jagielski 		}
819*b1cdbd2cSJim Jagielski 	    }
820*b1cdbd2cSJim Jagielski 
821*b1cdbd2cSJim Jagielski 	    // restore the error handler
822*b1cdbd2cSJim Jagielski 	    unx::XSetErrorHandler( oldHandler );
823*b1cdbd2cSJim Jagielski 	}
824*b1cdbd2cSJim Jagielski     }
825*b1cdbd2cSJim Jagielski 
826*b1cdbd2cSJim Jagielski #endif
827*b1cdbd2cSJim Jagielski #endif
828*b1cdbd2cSJim Jagielski     if( !mbUseLeavingPixmap )
829*b1cdbd2cSJim Jagielski 	LeavingBytes = mxLeavingBitmap->getData(SlideBitmapLayout,SlideRect);
830*b1cdbd2cSJim Jagielski     if( !mbUseEnteringPixmap )
831*b1cdbd2cSJim Jagielski 	EnteringBytes = mxEnteringBitmap->getData(SlideBitmapLayout,SlideRect);
832*b1cdbd2cSJim Jagielski 
833*b1cdbd2cSJim Jagielski // TODO
834*b1cdbd2cSJim Jagielski #ifdef UNX
835*b1cdbd2cSJim Jagielski     if(GLWin.ctx)//if we have a rendering context, let's init the slides
836*b1cdbd2cSJim Jagielski #endif
837*b1cdbd2cSJim Jagielski 	GLInitSlides();
838*b1cdbd2cSJim Jagielski 
839*b1cdbd2cSJim Jagielski     OSL_ENSURE(SlideBitmapLayout.PlaneStride == 0,"only handle no plane stride now");
840*b1cdbd2cSJim Jagielski 
841*b1cdbd2cSJim Jagielski #ifdef UNX
842*b1cdbd2cSJim Jagielski     /* flush & sync */
843*b1cdbd2cSJim Jagielski     unx::glXWaitGL();
844*b1cdbd2cSJim Jagielski     XSync( GLWin.dpy, false );
845*b1cdbd2cSJim Jagielski 
846*b1cdbd2cSJim Jagielski     // synchronized X still gives us much smoother play
847*b1cdbd2cSJim Jagielski     // I suspect some issues in above code in slideshow
848*b1cdbd2cSJim Jagielski     // synchronize whole transition for now
849*b1cdbd2cSJim Jagielski     XSynchronize( GLWin.dpy, true );
850*b1cdbd2cSJim Jagielski     mbRestoreSync = true;
851*b1cdbd2cSJim Jagielski #endif
852*b1cdbd2cSJim Jagielski }
853*b1cdbd2cSJim Jagielski 
854*b1cdbd2cSJim Jagielski void OGLTransitionerImpl::createTexture( unsigned int* texID,
855*b1cdbd2cSJim Jagielski #if defined( GLX_VERSION_1_3 ) && defined( GLX_EXT_texture_from_pixmap )
856*b1cdbd2cSJim Jagielski 					 unx::GLXPixmap pixmap,
857*b1cdbd2cSJim Jagielski 					 bool usePixmap,
858*b1cdbd2cSJim Jagielski #endif
859*b1cdbd2cSJim Jagielski 					 bool useMipmap,
860*b1cdbd2cSJim Jagielski 					 uno::Sequence<sal_Int8>& data,
861*b1cdbd2cSJim Jagielski 					 const OGLFormat* pFormat )
862*b1cdbd2cSJim Jagielski {
863*b1cdbd2cSJim Jagielski     glDeleteTextures( 1, texID );
864*b1cdbd2cSJim Jagielski     glGenTextures( 1, texID );
865*b1cdbd2cSJim Jagielski     glBindTexture( GL_TEXTURE_2D, *texID );
866*b1cdbd2cSJim Jagielski     glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
867*b1cdbd2cSJim Jagielski     glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
868*b1cdbd2cSJim Jagielski 
869*b1cdbd2cSJim Jagielski #if defined( GLX_VERSION_1_3 ) && defined( GLX_EXT_texture_from_pixmap )
870*b1cdbd2cSJim Jagielski     unx::PFNGLXBINDTEXIMAGEEXTPROC myglXBindTexImageEXT = (unx::PFNGLXBINDTEXIMAGEEXTPROC) unx::glXGetProcAddress( (const GLubyte*) "glXBindTexImageEXT" );
871*b1cdbd2cSJim Jagielski 
872*b1cdbd2cSJim Jagielski     if( usePixmap ) {
873*b1cdbd2cSJim Jagielski       if( mbGenerateMipmap )
874*b1cdbd2cSJim Jagielski           glTexParameteri( GL_TEXTURE_2D, GL_GENERATE_MIPMAP_SGIS, True);
875*b1cdbd2cSJim Jagielski       myglXBindTexImageEXT (GLWin.dpy, pixmap, GLX_FRONT_LEFT_EXT, NULL);
876*b1cdbd2cSJim Jagielski       if( mbGenerateMipmap && useMipmap ) {
877*b1cdbd2cSJim Jagielski           OSL_TRACE("use mipmaps");
878*b1cdbd2cSJim Jagielski           glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
879*b1cdbd2cSJim Jagielski           glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR); //TRILINEAR FILTERING
880*b1cdbd2cSJim Jagielski       } else {
881*b1cdbd2cSJim Jagielski           glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
882*b1cdbd2cSJim Jagielski           glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
883*b1cdbd2cSJim Jagielski       }
884*b1cdbd2cSJim Jagielski     } else {
885*b1cdbd2cSJim Jagielski #endif
886*b1cdbd2cSJim Jagielski     if( !pFormat )
887*b1cdbd2cSJim Jagielski     {
888*b1cdbd2cSJim Jagielski         // force-convert color to ARGB8888 int color space
889*b1cdbd2cSJim Jagielski         uno::Sequence<sal_Int8> tempBytes(
890*b1cdbd2cSJim Jagielski             SlideBitmapLayout.ColorSpace->convertToIntegerColorSpace(
891*b1cdbd2cSJim Jagielski                 data,
892*b1cdbd2cSJim Jagielski                 canvas::tools::getStdColorSpace()));
893*b1cdbd2cSJim Jagielski         gluBuild2DMipmaps(GL_TEXTURE_2D,
894*b1cdbd2cSJim Jagielski                           4,
895*b1cdbd2cSJim Jagielski                           SlideSize.Width,
896*b1cdbd2cSJim Jagielski                           SlideSize.Height,
897*b1cdbd2cSJim Jagielski                           GL_RGBA,
898*b1cdbd2cSJim Jagielski                           GL_UNSIGNED_BYTE,
899*b1cdbd2cSJim Jagielski                           &tempBytes[0]);
900*b1cdbd2cSJim Jagielski 	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
901*b1cdbd2cSJim Jagielski 	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR); //TRILINEAR FILTERING
902*b1cdbd2cSJim Jagielski 
903*b1cdbd2cSJim Jagielski         //anistropic filtering (to make texturing not suck when looking at polygons from oblique angles)
904*b1cdbd2cSJim Jagielski 	GLfloat largest_supported_anisotropy;
905*b1cdbd2cSJim Jagielski 	glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &largest_supported_anisotropy);
906*b1cdbd2cSJim Jagielski 	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, largest_supported_anisotropy);
907*b1cdbd2cSJim Jagielski     } else {
908*b1cdbd2cSJim Jagielski 	if( pTransition && !cbBrokenTexturesATI && !useMipmap) {
909*b1cdbd2cSJim Jagielski 	    glTexImage2D( GL_TEXTURE_2D, 0, pFormat->nInternalFormat, SlideSize.Width, SlideSize.Height, 0, pFormat->eFormat, pFormat->eType, &data[0] );
910*b1cdbd2cSJim Jagielski 	    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
911*b1cdbd2cSJim Jagielski 	    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
912*b1cdbd2cSJim Jagielski 	} else {
913*b1cdbd2cSJim Jagielski 	    gluBuild2DMipmaps( GL_TEXTURE_2D, pFormat->nInternalFormat, SlideSize.Width, SlideSize.Height, pFormat->eFormat, pFormat->eType, &data[0] );
914*b1cdbd2cSJim Jagielski 	    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
915*b1cdbd2cSJim Jagielski 	    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR ); //TRILINEAR FILTERING
916*b1cdbd2cSJim Jagielski 
917*b1cdbd2cSJim Jagielski 	    //anistropic filtering (to make texturing not suck when looking at polygons from oblique angles)
918*b1cdbd2cSJim Jagielski 	    GLfloat largest_supported_anisotropy;
919*b1cdbd2cSJim Jagielski 	    glGetFloatv( GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &largest_supported_anisotropy );
920*b1cdbd2cSJim Jagielski 	    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, largest_supported_anisotropy );
921*b1cdbd2cSJim Jagielski 	}
922*b1cdbd2cSJim Jagielski     }
923*b1cdbd2cSJim Jagielski #if defined( GLX_VERSION_1_3 ) && defined( GLX_EXT_texture_from_pixmap )
924*b1cdbd2cSJim Jagielski     }
925*b1cdbd2cSJim Jagielski #endif
926*b1cdbd2cSJim Jagielski     OSL_ENSURE(glIsTexture(*texID), "Can't generate Leaving slide textures in OpenGL");
927*b1cdbd2cSJim Jagielski }
928*b1cdbd2cSJim Jagielski 
929*b1cdbd2cSJim Jagielski void OGLTransitionerImpl::prepareEnvironment()
930*b1cdbd2cSJim Jagielski {
931*b1cdbd2cSJim Jagielski     glMatrixMode(GL_PROJECTION);
932*b1cdbd2cSJim Jagielski     glLoadIdentity();
933*b1cdbd2cSJim Jagielski     double EyePos(10.0);
934*b1cdbd2cSJim Jagielski     double RealF(1.0);
935*b1cdbd2cSJim Jagielski     double RealN(-1.0);
936*b1cdbd2cSJim Jagielski     double RealL(-1.0);
937*b1cdbd2cSJim Jagielski     double RealR(1.0);
938*b1cdbd2cSJim Jagielski     double RealB(-1.0);
939*b1cdbd2cSJim Jagielski     double RealT(1.0);
940*b1cdbd2cSJim Jagielski     double ClipN(EyePos+5.0*RealN);
941*b1cdbd2cSJim Jagielski     double ClipF(EyePos+15.0*RealF);
942*b1cdbd2cSJim Jagielski     double ClipL(RealL*8.0);
943*b1cdbd2cSJim Jagielski     double ClipR(RealR*8.0);
944*b1cdbd2cSJim Jagielski     double ClipB(RealB*8.0);
945*b1cdbd2cSJim Jagielski     double ClipT(RealT*8.0);
946*b1cdbd2cSJim Jagielski     //This scaling is to take the plane with BottomLeftCorner(-1,-1,0) and TopRightCorner(1,1,0) and map it to the screen after the perspective division.
947*b1cdbd2cSJim Jagielski     glScaled( 1.0 / ( ( ( RealR * 2.0 * ClipN ) / ( EyePos * ( ClipR - ClipL ) ) ) - ( ( ClipR + ClipL ) / ( ClipR - ClipL ) ) ),
948*b1cdbd2cSJim Jagielski               1.0 / ( ( ( RealT * 2.0 * ClipN ) / ( EyePos * ( ClipT - ClipB ) ) ) - ( ( ClipT + ClipB ) / ( ClipT - ClipB ) ) ),
949*b1cdbd2cSJim Jagielski               1.0 );
950*b1cdbd2cSJim Jagielski     glFrustum(ClipL,ClipR,ClipB,ClipT,ClipN,ClipF);
951*b1cdbd2cSJim Jagielski     glMatrixMode(GL_MODELVIEW);
952*b1cdbd2cSJim Jagielski     glLoadIdentity();
953*b1cdbd2cSJim Jagielski     glTranslated(0,0,-EyePos);
954*b1cdbd2cSJim Jagielski }
955*b1cdbd2cSJim Jagielski 
956*b1cdbd2cSJim Jagielski const OGLFormat* OGLTransitionerImpl::chooseFormats()
957*b1cdbd2cSJim Jagielski {
958*b1cdbd2cSJim Jagielski     const OGLFormat* pDetectedFormat=NULL;
959*b1cdbd2cSJim Jagielski     uno::Reference<rendering::XIntegerBitmapColorSpace> xIntColorSpace(
960*b1cdbd2cSJim Jagielski         SlideBitmapLayout.ColorSpace);
961*b1cdbd2cSJim Jagielski 
962*b1cdbd2cSJim Jagielski     if( (xIntColorSpace->getType() == rendering::ColorSpaceType::RGB ||
963*b1cdbd2cSJim Jagielski          xIntColorSpace->getType() == rendering::ColorSpaceType::SRGB) )
964*b1cdbd2cSJim Jagielski     {
965*b1cdbd2cSJim Jagielski         /* table for canvas->OGL format mapping. outer index is number
966*b1cdbd2cSJim Jagielski            of color components (0:3, 1:4), then comes bits per pixel
967*b1cdbd2cSJim Jagielski            (0:16, 1:24, 2:32), then channel ordering: (0:rgba, 1:bgra,
968*b1cdbd2cSJim Jagielski            2:argb, 3:abgr)
969*b1cdbd2cSJim Jagielski          */
970*b1cdbd2cSJim Jagielski         static const OGLFormat lcl_RGB24[] =
971*b1cdbd2cSJim Jagielski         {
972*b1cdbd2cSJim Jagielski             // 24 bit RGB
973*b1cdbd2cSJim Jagielski             {3, GL_BGR, GL_UNSIGNED_BYTE},
974*b1cdbd2cSJim Jagielski             {3, GL_RGB, GL_UNSIGNED_BYTE},
975*b1cdbd2cSJim Jagielski             {3, GL_BGR, GL_UNSIGNED_BYTE},
976*b1cdbd2cSJim Jagielski             {3, GL_RGB, GL_UNSIGNED_BYTE}
977*b1cdbd2cSJim Jagielski         };
978*b1cdbd2cSJim Jagielski 
979*b1cdbd2cSJim Jagielski #if defined(GL_VERSION_1_2) && defined(GLU_VERSION_1_3)
980*b1cdbd2cSJim Jagielski         // more format constants available
981*b1cdbd2cSJim Jagielski         static const OGLFormat lcl_RGB16[] =
982*b1cdbd2cSJim Jagielski         {
983*b1cdbd2cSJim Jagielski             // 16 bit RGB
984*b1cdbd2cSJim Jagielski             {3, GL_RGB, GL_UNSIGNED_SHORT_5_6_5_REV},
985*b1cdbd2cSJim Jagielski             {3, GL_RGB, GL_UNSIGNED_SHORT_5_6_5},
986*b1cdbd2cSJim Jagielski             {3, GL_RGB, GL_UNSIGNED_SHORT_5_6_5_REV},
987*b1cdbd2cSJim Jagielski             {3, GL_RGB, GL_UNSIGNED_SHORT_5_6_5}
988*b1cdbd2cSJim Jagielski         };
989*b1cdbd2cSJim Jagielski 
990*b1cdbd2cSJim Jagielski         static const OGLFormat lcl_ARGB16_4[] =
991*b1cdbd2cSJim Jagielski         {
992*b1cdbd2cSJim Jagielski             // 16 bit ARGB
993*b1cdbd2cSJim Jagielski             {4, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4_REV},
994*b1cdbd2cSJim Jagielski             {4, GL_BGRA, GL_UNSIGNED_SHORT_4_4_4_4_REV},
995*b1cdbd2cSJim Jagielski             {4, GL_BGRA, GL_UNSIGNED_SHORT_4_4_4_4},
996*b1cdbd2cSJim Jagielski             {4, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4}
997*b1cdbd2cSJim Jagielski         };
998*b1cdbd2cSJim Jagielski 
999*b1cdbd2cSJim Jagielski         static const OGLFormat lcl_ARGB16_5[] =
1000*b1cdbd2cSJim Jagielski         {
1001*b1cdbd2cSJim Jagielski             // 16 bit ARGB
1002*b1cdbd2cSJim Jagielski             {4, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV},
1003*b1cdbd2cSJim Jagielski             {4, GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV},
1004*b1cdbd2cSJim Jagielski             {4, GL_BGRA, GL_UNSIGNED_SHORT_5_5_5_1},
1005*b1cdbd2cSJim Jagielski             {4, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1}
1006*b1cdbd2cSJim Jagielski         };
1007*b1cdbd2cSJim Jagielski 
1008*b1cdbd2cSJim Jagielski         static const OGLFormat lcl_ARGB32[] =
1009*b1cdbd2cSJim Jagielski         {
1010*b1cdbd2cSJim Jagielski             // 32 bit ARGB
1011*b1cdbd2cSJim Jagielski             {4, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV},
1012*b1cdbd2cSJim Jagielski             {4, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV},
1013*b1cdbd2cSJim Jagielski             {4, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8},
1014*b1cdbd2cSJim Jagielski             {4, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8}
1015*b1cdbd2cSJim Jagielski         };
1016*b1cdbd2cSJim Jagielski 
1017*b1cdbd2cSJim Jagielski         const uno::Sequence<sal_Int8> aComponentTags(
1018*b1cdbd2cSJim Jagielski             xIntColorSpace->getComponentTags());
1019*b1cdbd2cSJim Jagielski         const uno::Sequence<sal_Int32> aComponentBitcounts(
1020*b1cdbd2cSJim Jagielski             xIntColorSpace->getComponentBitCounts());
1021*b1cdbd2cSJim Jagielski         const sal_Int32 nNumComponents( aComponentBitcounts.getLength() );
1022*b1cdbd2cSJim Jagielski         const sal_Int32 nBitsPerPixel( xIntColorSpace->getBitsPerPixel() );
1023*b1cdbd2cSJim Jagielski 
1024*b1cdbd2cSJim Jagielski         // supported component ordering?
1025*b1cdbd2cSJim Jagielski         const int nComponentOrderIndex(
1026*b1cdbd2cSJim Jagielski             calcComponentOrderIndex(aComponentTags));
1027*b1cdbd2cSJim Jagielski         if( nComponentOrderIndex != -1 )
1028*b1cdbd2cSJim Jagielski         {
1029*b1cdbd2cSJim Jagielski             switch( nBitsPerPixel )
1030*b1cdbd2cSJim Jagielski             {
1031*b1cdbd2cSJim Jagielski                 case 16:
1032*b1cdbd2cSJim Jagielski                     if( nNumComponents == 3 )
1033*b1cdbd2cSJim Jagielski                     {
1034*b1cdbd2cSJim Jagielski                         pDetectedFormat = &lcl_RGB16[nComponentOrderIndex];
1035*b1cdbd2cSJim Jagielski                     }
1036*b1cdbd2cSJim Jagielski                     else if( nNumComponents == 4 )
1037*b1cdbd2cSJim Jagielski                     {
1038*b1cdbd2cSJim Jagielski                         if( aComponentBitcounts[1] == 4 )
1039*b1cdbd2cSJim Jagielski                         {
1040*b1cdbd2cSJim Jagielski                             pDetectedFormat = &lcl_ARGB16_4[nComponentOrderIndex];
1041*b1cdbd2cSJim Jagielski                         }
1042*b1cdbd2cSJim Jagielski                         else if( aComponentBitcounts[1] == 5 )
1043*b1cdbd2cSJim Jagielski                         {
1044*b1cdbd2cSJim Jagielski                             pDetectedFormat = &lcl_ARGB16_5[nComponentOrderIndex];
1045*b1cdbd2cSJim Jagielski                         }
1046*b1cdbd2cSJim Jagielski                     }
1047*b1cdbd2cSJim Jagielski                     break;
1048*b1cdbd2cSJim Jagielski                 case 24:
1049*b1cdbd2cSJim Jagielski                     if( nNumComponents == 3 )
1050*b1cdbd2cSJim Jagielski                     {
1051*b1cdbd2cSJim Jagielski                         pDetectedFormat = &lcl_RGB24[nComponentOrderIndex];
1052*b1cdbd2cSJim Jagielski                     }
1053*b1cdbd2cSJim Jagielski                     break;
1054*b1cdbd2cSJim Jagielski                 case 32:
1055*b1cdbd2cSJim Jagielski                     pDetectedFormat = &lcl_ARGB32[nComponentOrderIndex];
1056*b1cdbd2cSJim Jagielski                     break;
1057*b1cdbd2cSJim Jagielski             }
1058*b1cdbd2cSJim Jagielski         }
1059*b1cdbd2cSJim Jagielski #else
1060*b1cdbd2cSJim Jagielski         const uno::Sequence<sal_Int8> aComponentTags(
1061*b1cdbd2cSJim Jagielski             xIntColorSpace->getComponentTags());
1062*b1cdbd2cSJim Jagielski         const int nComponentOrderIndex(calcComponentOrderIndex(aComponentTags));
1063*b1cdbd2cSJim Jagielski         if( aComponentTags.getLength() == 3 &&
1064*b1cdbd2cSJim Jagielski             nComponentOrderIndex != -1 &&
1065*b1cdbd2cSJim Jagielski             xIntColorSpace->getBitsPerPixel() == 24 )
1066*b1cdbd2cSJim Jagielski         {
1067*b1cdbd2cSJim Jagielski             pDetectedFormat = &lcl_RGB24[nComponentOrderIndex];
1068*b1cdbd2cSJim Jagielski         }
1069*b1cdbd2cSJim Jagielski #endif
1070*b1cdbd2cSJim Jagielski     }
1071*b1cdbd2cSJim Jagielski 
1072*b1cdbd2cSJim Jagielski     return pDetectedFormat;
1073*b1cdbd2cSJim Jagielski }
1074*b1cdbd2cSJim Jagielski 
1075*b1cdbd2cSJim Jagielski void OGLTransitionerImpl::GLInitSlides()
1076*b1cdbd2cSJim Jagielski {
1077*b1cdbd2cSJim Jagielski     osl::MutexGuard const guard( m_aMutex );
1078*b1cdbd2cSJim Jagielski 
1079*b1cdbd2cSJim Jagielski     if (isDisposed() || pTransition->mnRequiredGLVersion > cnGLVersion)
1080*b1cdbd2cSJim Jagielski         return;
1081*b1cdbd2cSJim Jagielski 
1082*b1cdbd2cSJim Jagielski     prepareEnvironment();
1083*b1cdbd2cSJim Jagielski 
1084*b1cdbd2cSJim Jagielski     const OGLFormat* pFormat = NULL;
1085*b1cdbd2cSJim Jagielski     if( !mbUseLeavingPixmap || !mbUseEnteringPixmap )
1086*b1cdbd2cSJim Jagielski 	pFormat = chooseFormats();
1087*b1cdbd2cSJim Jagielski 
1088*b1cdbd2cSJim Jagielski     createTexture( &GLleavingSlide,
1089*b1cdbd2cSJim Jagielski #if defined( GLX_VERSION_1_3 ) && defined( GLX_EXT_texture_from_pixmap )
1090*b1cdbd2cSJim Jagielski 		   LeavingPixmap,
1091*b1cdbd2cSJim Jagielski 		   mbUseLeavingPixmap,
1092*b1cdbd2cSJim Jagielski #endif
1093*b1cdbd2cSJim Jagielski 		   pTransition->mbUseMipMapLeaving,
1094*b1cdbd2cSJim Jagielski 		   LeavingBytes,
1095*b1cdbd2cSJim Jagielski 		   pFormat );
1096*b1cdbd2cSJim Jagielski 
1097*b1cdbd2cSJim Jagielski     createTexture( &GLenteringSlide,
1098*b1cdbd2cSJim Jagielski #if defined( GLX_VERSION_1_3 ) && defined( GLX_EXT_texture_from_pixmap )
1099*b1cdbd2cSJim Jagielski 		   EnteringPixmap,
1100*b1cdbd2cSJim Jagielski 		   mbUseEnteringPixmap,
1101*b1cdbd2cSJim Jagielski #endif
1102*b1cdbd2cSJim Jagielski 		   pTransition->mbUseMipMapEntering,
1103*b1cdbd2cSJim Jagielski 		   EnteringBytes,
1104*b1cdbd2cSJim Jagielski 		   pFormat );
1105*b1cdbd2cSJim Jagielski 
1106*b1cdbd2cSJim Jagielski #ifdef UNX
1107*b1cdbd2cSJim Jagielski     unx::glXWaitGL();
1108*b1cdbd2cSJim Jagielski     XSync(GLWin.dpy, false);
1109*b1cdbd2cSJim Jagielski #endif
1110*b1cdbd2cSJim Jagielski 
1111*b1cdbd2cSJim Jagielski #ifdef DEBUG
1112*b1cdbd2cSJim Jagielski     t2 = microsec_clock::local_time();
1113*b1cdbd2cSJim Jagielski     OSL_TRACE("textures created in: %s", to_simple_string( t2 - t1 ).c_str());
1114*b1cdbd2cSJim Jagielski #endif
1115*b1cdbd2cSJim Jagielski }
1116*b1cdbd2cSJim Jagielski 
1117*b1cdbd2cSJim Jagielski void SAL_CALL OGLTransitionerImpl::update( double nTime ) throw (uno::RuntimeException)
1118*b1cdbd2cSJim Jagielski {
1119*b1cdbd2cSJim Jagielski #ifdef DEBUG
1120*b1cdbd2cSJim Jagielski     frame_count ++;
1121*b1cdbd2cSJim Jagielski     t3 = microsec_clock::local_time();
1122*b1cdbd2cSJim Jagielski     if( frame_count == 1 ) {
1123*b1cdbd2cSJim Jagielski 	t5 = t3;
1124*b1cdbd2cSJim Jagielski 	total_update = seconds (0);
1125*b1cdbd2cSJim Jagielski     }
1126*b1cdbd2cSJim Jagielski #endif
1127*b1cdbd2cSJim Jagielski     osl::MutexGuard const guard( m_aMutex );
1128*b1cdbd2cSJim Jagielski 
1129*b1cdbd2cSJim Jagielski     if (isDisposed() || !cbGLXPresent || pTransition->mnRequiredGLVersion > cnGLVersion)
1130*b1cdbd2cSJim Jagielski         return;
1131*b1cdbd2cSJim Jagielski 
1132*b1cdbd2cSJim Jagielski #ifdef WNT
1133*b1cdbd2cSJim Jagielski     wglMakeCurrent(GLWin.hDC,GLWin.hRC);
1134*b1cdbd2cSJim Jagielski #endif
1135*b1cdbd2cSJim Jagielski #ifdef UNX
1136*b1cdbd2cSJim Jagielski     glXMakeCurrent( GLWin.dpy, GLWin.win, GLWin.ctx );
1137*b1cdbd2cSJim Jagielski #endif
1138*b1cdbd2cSJim Jagielski 
1139*b1cdbd2cSJim Jagielski     glEnable(GL_DEPTH_TEST);
1140*b1cdbd2cSJim Jagielski     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
1141*b1cdbd2cSJim Jagielski 
1142*b1cdbd2cSJim Jagielski     if(pTransition)
1143*b1cdbd2cSJim Jagielski 	pTransition->display( nTime, GLleavingSlide, GLenteringSlide,
1144*b1cdbd2cSJim Jagielski                               SlideSize.Width, SlideSize.Height,
1145*b1cdbd2cSJim Jagielski                               static_cast<double>(GLWin.Width),
1146*b1cdbd2cSJim Jagielski                               static_cast<double>(GLWin.Height) );
1147*b1cdbd2cSJim Jagielski 
1148*b1cdbd2cSJim Jagielski #if defined( WNT )
1149*b1cdbd2cSJim Jagielski     SwapBuffers(GLWin.hDC);
1150*b1cdbd2cSJim Jagielski #elif defined( UNX )
1151*b1cdbd2cSJim Jagielski     unx::glXSwapBuffers(GLWin.dpy, GLWin.win);
1152*b1cdbd2cSJim Jagielski #endif
1153*b1cdbd2cSJim Jagielski     if( pWindow )
1154*b1cdbd2cSJim Jagielski         pWindow->Show();
1155*b1cdbd2cSJim Jagielski 
1156*b1cdbd2cSJim Jagielski #ifdef UNX
1157*b1cdbd2cSJim Jagielski     /* flush & sync */
1158*b1cdbd2cSJim Jagielski     unx::glXWaitGL();
1159*b1cdbd2cSJim Jagielski     XSync( GLWin.dpy, false );
1160*b1cdbd2cSJim Jagielski #endif
1161*b1cdbd2cSJim Jagielski 
1162*b1cdbd2cSJim Jagielski #ifdef DEBUG
1163*b1cdbd2cSJim Jagielski     t4 = microsec_clock::local_time();
1164*b1cdbd2cSJim Jagielski 
1165*b1cdbd2cSJim Jagielski     OSL_TRACE("update time: %f", nTime);
1166*b1cdbd2cSJim Jagielski     OSL_TRACE("update took: %s", to_simple_string( t4 - t3 ).c_str());
1167*b1cdbd2cSJim Jagielski     total_update += (t4 - t3);
1168*b1cdbd2cSJim Jagielski #endif
1169*b1cdbd2cSJim Jagielski }
1170*b1cdbd2cSJim Jagielski 
1171*b1cdbd2cSJim Jagielski void SAL_CALL OGLTransitionerImpl::viewChanged( const Reference< presentation::XSlideShowView >& rView,
1172*b1cdbd2cSJim Jagielski 						const Reference< rendering::XBitmap >& rLeavingBitmap,
1173*b1cdbd2cSJim Jagielski 						const Reference< rendering::XBitmap >& rEnteringBitmap )
1174*b1cdbd2cSJim Jagielski     throw (uno::RuntimeException)
1175*b1cdbd2cSJim Jagielski {
1176*b1cdbd2cSJim Jagielski     OSL_TRACE("transitioner: view changed");
1177*b1cdbd2cSJim Jagielski 
1178*b1cdbd2cSJim Jagielski     disposeTextures();
1179*b1cdbd2cSJim Jagielski     disposeContextAndWindow();
1180*b1cdbd2cSJim Jagielski 
1181*b1cdbd2cSJim Jagielski     initWindowFromSlideShowView( rView );
1182*b1cdbd2cSJim Jagielski     setSlides( rLeavingBitmap, rEnteringBitmap );
1183*b1cdbd2cSJim Jagielski }
1184*b1cdbd2cSJim Jagielski 
1185*b1cdbd2cSJim Jagielski void OGLTransitionerImpl::disposeContextAndWindow()
1186*b1cdbd2cSJim Jagielski {
1187*b1cdbd2cSJim Jagielski #if defined( WNT )
1188*b1cdbd2cSJim Jagielski     if (GLWin.hRC)
1189*b1cdbd2cSJim Jagielski     {
1190*b1cdbd2cSJim Jagielski 	wglMakeCurrent( GLWin.hDC, 0 );		// kill Device Context
1191*b1cdbd2cSJim Jagielski 	wglDeleteContext( GLWin.hRC );		// Kill Render Context
1192*b1cdbd2cSJim Jagielski 	ReleaseDC( GLWin.hWnd, GLWin.hDC );         // Release Window
1193*b1cdbd2cSJim Jagielski     }
1194*b1cdbd2cSJim Jagielski #elif defined( UNX )
1195*b1cdbd2cSJim Jagielski     if(GLWin.ctx)
1196*b1cdbd2cSJim Jagielski     {
1197*b1cdbd2cSJim Jagielski 	glXMakeCurrent(GLWin.dpy, None, NULL);
1198*b1cdbd2cSJim Jagielski 	if( glGetError() != GL_NO_ERROR ) {
1199*b1cdbd2cSJim Jagielski 	    OSL_TRACE("glError: %s", (char *)gluErrorString(glGetError()));
1200*b1cdbd2cSJim Jagielski 	}
1201*b1cdbd2cSJim Jagielski 	glXDestroyContext(GLWin.dpy, GLWin.ctx);
1202*b1cdbd2cSJim Jagielski 	GLWin.ctx = NULL;
1203*b1cdbd2cSJim Jagielski     }
1204*b1cdbd2cSJim Jagielski #endif
1205*b1cdbd2cSJim Jagielski     if( pWindow ) {
1206*b1cdbd2cSJim Jagielski 	delete pWindow;
1207*b1cdbd2cSJim Jagielski 	pWindow = NULL;
1208*b1cdbd2cSJim Jagielski 	GLWin.win = 0;
1209*b1cdbd2cSJim Jagielski     }
1210*b1cdbd2cSJim Jagielski }
1211*b1cdbd2cSJim Jagielski 
1212*b1cdbd2cSJim Jagielski void OGLTransitionerImpl::disposeTextures()
1213*b1cdbd2cSJim Jagielski {
1214*b1cdbd2cSJim Jagielski #ifdef WNT
1215*b1cdbd2cSJim Jagielski     wglMakeCurrent(GLWin.hDC,GLWin.hRC);
1216*b1cdbd2cSJim Jagielski #endif
1217*b1cdbd2cSJim Jagielski #ifdef UNX
1218*b1cdbd2cSJim Jagielski     glXMakeCurrent( GLWin.dpy, GLWin.win, GLWin.ctx );
1219*b1cdbd2cSJim Jagielski #endif
1220*b1cdbd2cSJim Jagielski 
1221*b1cdbd2cSJim Jagielski #if defined( GLX_VERSION_1_3 ) && defined( GLX_EXT_texture_from_pixmap )
1222*b1cdbd2cSJim Jagielski     unx::PFNGLXRELEASETEXIMAGEEXTPROC myglXReleaseTexImageEXT = (unx::PFNGLXRELEASETEXIMAGEEXTPROC) unx::glXGetProcAddress( (const GLubyte*) "glXReleaseTexImageEXT" );
1223*b1cdbd2cSJim Jagielski     if( mbUseLeavingPixmap ) {
1224*b1cdbd2cSJim Jagielski 
1225*b1cdbd2cSJim Jagielski 	myglXReleaseTexImageEXT( GLWin.dpy, LeavingPixmap, GLX_FRONT_LEFT_EXT );
1226*b1cdbd2cSJim Jagielski 	glXDestroyGLXPixmap( GLWin.dpy, LeavingPixmap );
1227*b1cdbd2cSJim Jagielski 	LeavingPixmap = 0;
1228*b1cdbd2cSJim Jagielski 	if( mbFreeLeavingPixmap ) {
1229*b1cdbd2cSJim Jagielski 	    unx::XFreePixmap( GLWin.dpy, maLeavingPixmap );
1230*b1cdbd2cSJim Jagielski 	    mbFreeLeavingPixmap = false;
1231*b1cdbd2cSJim Jagielski 	    maLeavingPixmap = 0;
1232*b1cdbd2cSJim Jagielski 	}
1233*b1cdbd2cSJim Jagielski     }
1234*b1cdbd2cSJim Jagielski     if( mbUseEnteringPixmap ) {
1235*b1cdbd2cSJim Jagielski 	myglXReleaseTexImageEXT( GLWin.dpy, EnteringPixmap, GLX_FRONT_LEFT_EXT );
1236*b1cdbd2cSJim Jagielski 	glXDestroyGLXPixmap( GLWin.dpy, EnteringPixmap );
1237*b1cdbd2cSJim Jagielski 	EnteringPixmap = 0;
1238*b1cdbd2cSJim Jagielski 	if( mbFreeEnteringPixmap ) {
1239*b1cdbd2cSJim Jagielski 	    unx::XFreePixmap( GLWin.dpy, maEnteringPixmap );
1240*b1cdbd2cSJim Jagielski 	    mbFreeEnteringPixmap = false;
1241*b1cdbd2cSJim Jagielski 	    maEnteringPixmap = 0;
1242*b1cdbd2cSJim Jagielski 	}
1243*b1cdbd2cSJim Jagielski     }
1244*b1cdbd2cSJim Jagielski #endif
1245*b1cdbd2cSJim Jagielski 
1246*b1cdbd2cSJim Jagielski     if( !mbUseLeavingPixmap ) {
1247*b1cdbd2cSJim Jagielski 	glDeleteTextures(1,&GLleavingSlide);
1248*b1cdbd2cSJim Jagielski 	GLleavingSlide = 0;
1249*b1cdbd2cSJim Jagielski     }
1250*b1cdbd2cSJim Jagielski     if( !mbUseEnteringPixmap ) {
1251*b1cdbd2cSJim Jagielski 	glDeleteTextures(1,&GLenteringSlide);
1252*b1cdbd2cSJim Jagielski 	GLleavingSlide = 0;
1253*b1cdbd2cSJim Jagielski     }
1254*b1cdbd2cSJim Jagielski 
1255*b1cdbd2cSJim Jagielski     mbUseLeavingPixmap = false;
1256*b1cdbd2cSJim Jagielski     mbUseEnteringPixmap = false;
1257*b1cdbd2cSJim Jagielski }
1258*b1cdbd2cSJim Jagielski 
1259*b1cdbd2cSJim Jagielski // we are about to be disposed (someone call dispose() on us)
1260*b1cdbd2cSJim Jagielski void OGLTransitionerImpl::disposing()
1261*b1cdbd2cSJim Jagielski {
1262*b1cdbd2cSJim Jagielski     osl::MutexGuard const guard( m_aMutex );
1263*b1cdbd2cSJim Jagielski 
1264*b1cdbd2cSJim Jagielski #ifdef DEBUG
1265*b1cdbd2cSJim Jagielski     OSL_TRACE("dispose %p\n", this);
1266*b1cdbd2cSJim Jagielski     if( frame_count ) {
1267*b1cdbd2cSJim Jagielski 	t6 = microsec_clock::local_time();
1268*b1cdbd2cSJim Jagielski 	time_duration duration = t6 - t5;
1269*b1cdbd2cSJim Jagielski 	OSL_TRACE("whole transition (frames: %d) took: %s fps: %f time spent in updates: %s percentage of transition time: %f%%",
1270*b1cdbd2cSJim Jagielski 		  frame_count, to_simple_string( duration ).c_str(),
1271*b1cdbd2cSJim Jagielski 		  ((double)frame_count*1000000000.0)/duration.total_nanoseconds(),
1272*b1cdbd2cSJim Jagielski 		  to_simple_string( total_update ).c_str(),
1273*b1cdbd2cSJim Jagielski 		  100*(((double)total_update.total_nanoseconds())/((double)duration.total_nanoseconds()))
1274*b1cdbd2cSJim Jagielski 	    );
1275*b1cdbd2cSJim Jagielski     }
1276*b1cdbd2cSJim Jagielski #endif
1277*b1cdbd2cSJim Jagielski 
1278*b1cdbd2cSJim Jagielski     if( pWindow ) {
1279*b1cdbd2cSJim Jagielski 
1280*b1cdbd2cSJim Jagielski 	disposeTextures();
1281*b1cdbd2cSJim Jagielski 
1282*b1cdbd2cSJim Jagielski 	if (pTransition)
1283*b1cdbd2cSJim Jagielski 	    pTransition->finish();
1284*b1cdbd2cSJim Jagielski 
1285*b1cdbd2cSJim Jagielski #ifdef UNX
1286*b1cdbd2cSJim Jagielski 	if( mbRestoreSync ) {
1287*b1cdbd2cSJim Jagielski 	    // try to reestablish synchronize state
1288*b1cdbd2cSJim Jagielski 	    char* sal_synchronize = getenv("SAL_SYNCHRONIZE");
1289*b1cdbd2cSJim Jagielski 	    XSynchronize( GLWin.dpy, sal_synchronize && *sal_synchronize == '1' );
1290*b1cdbd2cSJim Jagielski 	}
1291*b1cdbd2cSJim Jagielski #endif
1292*b1cdbd2cSJim Jagielski 
1293*b1cdbd2cSJim Jagielski 	disposeContextAndWindow();
1294*b1cdbd2cSJim Jagielski     }
1295*b1cdbd2cSJim Jagielski 
1296*b1cdbd2cSJim Jagielski     if (pTransition)
1297*b1cdbd2cSJim Jagielski 	delete pTransition;
1298*b1cdbd2cSJim Jagielski 
1299*b1cdbd2cSJim Jagielski     mxLeavingBitmap.clear();
1300*b1cdbd2cSJim Jagielski     mxEnteringBitmap.clear();
1301*b1cdbd2cSJim Jagielski     mxView.clear();
1302*b1cdbd2cSJim Jagielski }
1303*b1cdbd2cSJim Jagielski 
1304*b1cdbd2cSJim Jagielski OGLTransitionerImpl::OGLTransitionerImpl(OGLTransitionImpl* pOGLTransition) :
1305*b1cdbd2cSJim Jagielski     OGLTransitionerImplBase(m_aMutex),
1306*b1cdbd2cSJim Jagielski     GLWin(),
1307*b1cdbd2cSJim Jagielski     GLleavingSlide( 0 ),
1308*b1cdbd2cSJim Jagielski     GLenteringSlide( 0 ),
1309*b1cdbd2cSJim Jagielski     pWindow( NULL ),
1310*b1cdbd2cSJim Jagielski     mxView(),
1311*b1cdbd2cSJim Jagielski     EnteringBytes(),
1312*b1cdbd2cSJim Jagielski     LeavingBytes(),
1313*b1cdbd2cSJim Jagielski     mbRestoreSync( false ),
1314*b1cdbd2cSJim Jagielski     mbUseLeavingPixmap( false ),
1315*b1cdbd2cSJim Jagielski     mbUseEnteringPixmap( false ),
1316*b1cdbd2cSJim Jagielski     SlideBitmapLayout(),
1317*b1cdbd2cSJim Jagielski     SlideSize(),
1318*b1cdbd2cSJim Jagielski     pTransition(pOGLTransition)
1319*b1cdbd2cSJim Jagielski {
1320*b1cdbd2cSJim Jagielski #if defined( WNT )
1321*b1cdbd2cSJim Jagielski 	GLWin.hWnd = 0;
1322*b1cdbd2cSJim Jagielski #elif defined( UNX )
1323*b1cdbd2cSJim Jagielski     GLWin.ctx = 0;
1324*b1cdbd2cSJim Jagielski #endif
1325*b1cdbd2cSJim Jagielski 
1326*b1cdbd2cSJim Jagielski     DBG(frame_count = 0);
1327*b1cdbd2cSJim Jagielski }
1328*b1cdbd2cSJim Jagielski 
1329*b1cdbd2cSJim Jagielski typedef cppu::WeakComponentImplHelper1<presentation::XTransitionFactory> OGLTransitionFactoryImplBase;
1330*b1cdbd2cSJim Jagielski 
1331*b1cdbd2cSJim Jagielski class OGLTransitionFactoryImpl : private cppu::BaseMutex, public OGLTransitionFactoryImplBase
1332*b1cdbd2cSJim Jagielski {
1333*b1cdbd2cSJim Jagielski public:
1334*b1cdbd2cSJim Jagielski     explicit OGLTransitionFactoryImpl( const uno::Reference< uno::XComponentContext >& ) :
1335*b1cdbd2cSJim Jagielski         OGLTransitionFactoryImplBase(m_aMutex)
1336*b1cdbd2cSJim Jagielski     {}
1337*b1cdbd2cSJim Jagielski 
1338*b1cdbd2cSJim Jagielski     // XTransitionFactory
1339*b1cdbd2cSJim Jagielski     virtual ::sal_Bool SAL_CALL hasTransition( ::sal_Int16 transitionType, ::sal_Int16 transitionSubType ) throw (uno::RuntimeException)
1340*b1cdbd2cSJim Jagielski     {
1341*b1cdbd2cSJim Jagielski         if( transitionType == animations::TransitionType::MISCSHAPEWIPE ) {
1342*b1cdbd2cSJim Jagielski             switch( transitionSubType )
1343*b1cdbd2cSJim Jagielski                 {
1344*b1cdbd2cSJim Jagielski                 case animations::TransitionSubType::ACROSS:
1345*b1cdbd2cSJim Jagielski                 case animations::TransitionSubType::CORNERSOUT:
1346*b1cdbd2cSJim Jagielski                 case animations::TransitionSubType::CIRCLE:
1347*b1cdbd2cSJim Jagielski                 case animations::TransitionSubType::FANOUTHORIZONTAL:
1348*b1cdbd2cSJim Jagielski                 case animations::TransitionSubType::CORNERSIN:
1349*b1cdbd2cSJim Jagielski                 case animations::TransitionSubType::LEFTTORIGHT:
1350*b1cdbd2cSJim Jagielski                 case animations::TransitionSubType::TOPTOBOTTOM:
1351*b1cdbd2cSJim Jagielski                 case animations::TransitionSubType::TOPRIGHT:
1352*b1cdbd2cSJim Jagielski                 case animations::TransitionSubType::TOPLEFT:
1353*b1cdbd2cSJim Jagielski                 case animations::TransitionSubType::BOTTOMRIGHT:
1354*b1cdbd2cSJim Jagielski                 case animations::TransitionSubType::BOTTOMLEFT:
1355*b1cdbd2cSJim Jagielski                 case animations::TransitionSubType::TOPCENTER:
1356*b1cdbd2cSJim Jagielski                 case animations::TransitionSubType::RIGHTCENTER:
1357*b1cdbd2cSJim Jagielski                 case animations::TransitionSubType::BOTTOMCENTER:
1358*b1cdbd2cSJim Jagielski                     return sal_True;
1359*b1cdbd2cSJim Jagielski 
1360*b1cdbd2cSJim Jagielski                 default:
1361*b1cdbd2cSJim Jagielski                     return sal_False;
1362*b1cdbd2cSJim Jagielski                 }
1363*b1cdbd2cSJim Jagielski         } else if( transitionType == animations::TransitionType::FADE && transitionSubType == animations::TransitionSubType::CROSSFADE ) {
1364*b1cdbd2cSJim Jagielski             return sal_True;
1365*b1cdbd2cSJim Jagielski         } else if( transitionType == animations::TransitionType::FADE && transitionSubType == animations::TransitionSubType::FADEOVERCOLOR ) {
1366*b1cdbd2cSJim Jagielski             return sal_True;
1367*b1cdbd2cSJim Jagielski         } else if( transitionType == animations::TransitionType::IRISWIPE && transitionSubType == animations::TransitionSubType::DIAMOND ) {
1368*b1cdbd2cSJim Jagielski             return sal_True;
1369*b1cdbd2cSJim Jagielski         } else if( transitionType == animations::TransitionType::ZOOM && transitionSubType == animations::TransitionSubType::ROTATEIN ) {
1370*b1cdbd2cSJim Jagielski             return sal_True;
1371*b1cdbd2cSJim Jagielski         } else
1372*b1cdbd2cSJim Jagielski             return sal_False;
1373*b1cdbd2cSJim Jagielski     }
1374*b1cdbd2cSJim Jagielski 
1375*b1cdbd2cSJim Jagielski     virtual uno::Reference< presentation::XTransition > SAL_CALL createTransition(
1376*b1cdbd2cSJim Jagielski         ::sal_Int16                                           transitionType,
1377*b1cdbd2cSJim Jagielski         ::sal_Int16                                           transitionSubType,
1378*b1cdbd2cSJim Jagielski         const uno::Reference< presentation::XSlideShowView >& view,
1379*b1cdbd2cSJim Jagielski         const uno::Reference< rendering::XBitmap >&           leavingBitmap,
1380*b1cdbd2cSJim Jagielski         const uno::Reference< rendering::XBitmap >&           enteringBitmap )
1381*b1cdbd2cSJim Jagielski 	throw (uno::RuntimeException)
1382*b1cdbd2cSJim Jagielski     {
1383*b1cdbd2cSJim Jagielski         if( !hasTransition( transitionType, transitionSubType ) )
1384*b1cdbd2cSJim Jagielski             return uno::Reference< presentation::XTransition >();
1385*b1cdbd2cSJim Jagielski 
1386*b1cdbd2cSJim Jagielski         bool bGLXPresent = OGLTransitionerImpl::initialize( view );
1387*b1cdbd2cSJim Jagielski 
1388*b1cdbd2cSJim Jagielski         if( OGLTransitionerImpl::cbMesa && (
1389*b1cdbd2cSJim Jagielski             ( transitionType == animations::TransitionType::FADE && transitionSubType == animations::TransitionSubType::CROSSFADE ) ||
1390*b1cdbd2cSJim Jagielski             ( transitionType == animations::TransitionType::FADE && transitionSubType == animations::TransitionSubType::FADEOVERCOLOR ) ||
1391*b1cdbd2cSJim Jagielski             ( transitionType == animations::TransitionType::IRISWIPE && transitionSubType == animations::TransitionSubType::DIAMOND ) ) )
1392*b1cdbd2cSJim Jagielski             return uno::Reference< presentation::XTransition >();
1393*b1cdbd2cSJim Jagielski 
1394*b1cdbd2cSJim Jagielski 
1395*b1cdbd2cSJim Jagielski         OGLTransitionImpl* pTransition = NULL;
1396*b1cdbd2cSJim Jagielski 
1397*b1cdbd2cSJim Jagielski         if( transitionType == animations::TransitionType::MISCSHAPEWIPE ) {
1398*b1cdbd2cSJim Jagielski             pTransition = new OGLTransitionImpl();
1399*b1cdbd2cSJim Jagielski             switch( transitionSubType )
1400*b1cdbd2cSJim Jagielski                 {
1401*b1cdbd2cSJim Jagielski                 case animations::TransitionSubType::ACROSS:
1402*b1cdbd2cSJim Jagielski                     pTransition->makeNByMTileFlip(8,6);
1403*b1cdbd2cSJim Jagielski                     break;
1404*b1cdbd2cSJim Jagielski                 case animations::TransitionSubType::CORNERSOUT:
1405*b1cdbd2cSJim Jagielski                     pTransition->makeOutsideCubeFaceToLeft();
1406*b1cdbd2cSJim Jagielski                     break;
1407*b1cdbd2cSJim Jagielski                 case animations::TransitionSubType::CIRCLE:
1408*b1cdbd2cSJim Jagielski                     pTransition->makeRevolvingCircles(8,128);
1409*b1cdbd2cSJim Jagielski                     break;
1410*b1cdbd2cSJim Jagielski                 case animations::TransitionSubType::FANOUTHORIZONTAL:
1411*b1cdbd2cSJim Jagielski                     pTransition->makeHelix(20);
1412*b1cdbd2cSJim Jagielski                     break;
1413*b1cdbd2cSJim Jagielski                 case animations::TransitionSubType::CORNERSIN:
1414*b1cdbd2cSJim Jagielski                     pTransition->makeInsideCubeFaceToLeft();
1415*b1cdbd2cSJim Jagielski                     break;
1416*b1cdbd2cSJim Jagielski                 case animations::TransitionSubType::LEFTTORIGHT:
1417*b1cdbd2cSJim Jagielski                     pTransition->makeFallLeaving();
1418*b1cdbd2cSJim Jagielski                     break;
1419*b1cdbd2cSJim Jagielski                 case animations::TransitionSubType::TOPTOBOTTOM:
1420*b1cdbd2cSJim Jagielski                     pTransition->makeTurnAround();
1421*b1cdbd2cSJim Jagielski                     break;
1422*b1cdbd2cSJim Jagielski                 case animations::TransitionSubType::TOPRIGHT:
1423*b1cdbd2cSJim Jagielski                     pTransition->makeTurnDown();
1424*b1cdbd2cSJim Jagielski                     break;
1425*b1cdbd2cSJim Jagielski                 case animations::TransitionSubType::TOPLEFT:
1426*b1cdbd2cSJim Jagielski                     pTransition->makeIris();
1427*b1cdbd2cSJim Jagielski                     break;
1428*b1cdbd2cSJim Jagielski                 case animations::TransitionSubType::BOTTOMRIGHT:
1429*b1cdbd2cSJim Jagielski                     pTransition->makeRochade();
1430*b1cdbd2cSJim Jagielski                     break;
1431*b1cdbd2cSJim Jagielski                 case animations::TransitionSubType::BOTTOMLEFT:
1432*b1cdbd2cSJim Jagielski                     pTransition->makeVenetianBlinds( true, 8 );
1433*b1cdbd2cSJim Jagielski                     break;
1434*b1cdbd2cSJim Jagielski                 case animations::TransitionSubType::TOPCENTER:
1435*b1cdbd2cSJim Jagielski                     pTransition->makeVenetianBlinds( false, 6 );
1436*b1cdbd2cSJim Jagielski                     break;
1437*b1cdbd2cSJim Jagielski                 case animations::TransitionSubType::RIGHTCENTER:
1438*b1cdbd2cSJim Jagielski                     pTransition->makeStatic();
1439*b1cdbd2cSJim Jagielski                     break;
1440*b1cdbd2cSJim Jagielski                 case animations::TransitionSubType::BOTTOMCENTER:
1441*b1cdbd2cSJim Jagielski                     pTransition->makeDissolve();
1442*b1cdbd2cSJim Jagielski                     break;
1443*b1cdbd2cSJim Jagielski                 }
1444*b1cdbd2cSJim Jagielski         } else if( transitionType == animations::TransitionType::FADE && transitionSubType == animations::TransitionSubType::CROSSFADE ) {
1445*b1cdbd2cSJim Jagielski             pTransition = new OGLTransitionImpl();
1446*b1cdbd2cSJim Jagielski             pTransition->makeFadeSmoothly();
1447*b1cdbd2cSJim Jagielski         } else if( transitionType == animations::TransitionType::FADE && transitionSubType == animations::TransitionSubType::FADEOVERCOLOR ) {
1448*b1cdbd2cSJim Jagielski             pTransition = new OGLTransitionImpl();
1449*b1cdbd2cSJim Jagielski             pTransition->makeFadeThroughBlack();
1450*b1cdbd2cSJim Jagielski         } else if( transitionType == animations::TransitionType::IRISWIPE && transitionSubType == animations::TransitionSubType::DIAMOND ) {
1451*b1cdbd2cSJim Jagielski             pTransition = new OGLTransitionImpl();
1452*b1cdbd2cSJim Jagielski             pTransition->makeDiamond();
1453*b1cdbd2cSJim Jagielski         } else if( transitionType == animations::TransitionType::ZOOM && transitionSubType == animations::TransitionSubType::ROTATEIN ) {
1454*b1cdbd2cSJim Jagielski             pTransition = new OGLTransitionImpl();
1455*b1cdbd2cSJim Jagielski             pTransition->makeNewsflash();
1456*b1cdbd2cSJim Jagielski         }
1457*b1cdbd2cSJim Jagielski 
1458*b1cdbd2cSJim Jagielski         rtl::Reference<OGLTransitionerImpl> xRes(
1459*b1cdbd2cSJim Jagielski             new OGLTransitionerImpl(pTransition) );
1460*b1cdbd2cSJim Jagielski         if( bGLXPresent ) {
1461*b1cdbd2cSJim Jagielski             if( !xRes->initWindowFromSlideShowView(view))
1462*b1cdbd2cSJim Jagielski                 return uno::Reference< presentation::XTransition >();
1463*b1cdbd2cSJim Jagielski             xRes->setSlides(leavingBitmap,enteringBitmap);
1464*b1cdbd2cSJim Jagielski         }
1465*b1cdbd2cSJim Jagielski 
1466*b1cdbd2cSJim Jagielski         return uno::Reference<presentation::XTransition>(xRes.get());
1467*b1cdbd2cSJim Jagielski     }
1468*b1cdbd2cSJim Jagielski };
1469*b1cdbd2cSJim Jagielski 
1470*b1cdbd2cSJim Jagielski }
1471*b1cdbd2cSJim Jagielski 
1472*b1cdbd2cSJim Jagielski namespace sdecl = comphelper::service_decl;
1473*b1cdbd2cSJim Jagielski #if defined (__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ <= 3)
1474*b1cdbd2cSJim Jagielski  sdecl::class_<OGLTransitionFactoryImpl> serviceImpl;
1475*b1cdbd2cSJim Jagielski  const sdecl::ServiceDecl OGLTransitionFactoryDecl(
1476*b1cdbd2cSJim Jagielski      serviceImpl,
1477*b1cdbd2cSJim Jagielski #else
1478*b1cdbd2cSJim Jagielski  const sdecl::ServiceDecl OGLTransitionFactoryDecl(
1479*b1cdbd2cSJim Jagielski      sdecl::class_<OGLTransitionFactoryImpl>(),
1480*b1cdbd2cSJim Jagielski #endif
1481*b1cdbd2cSJim Jagielski     "com.sun.star.comp.presentation.OGLTransitionFactory",
1482*b1cdbd2cSJim Jagielski     "com.sun.star.presentation.TransitionFactory" );
1483*b1cdbd2cSJim Jagielski 
1484*b1cdbd2cSJim Jagielski // The C shared lib entry points
1485*b1cdbd2cSJim Jagielski COMPHELPER_SERVICEDECL_EXPORTS1(OGLTransitionFactoryDecl)
1486