ooo-build r11836 - in trunk: . patches/src680



Author: rodo
Date: Thu Mar  6 21:17:14 2008
New Revision: 11836
URL: http://svn.gnome.org/viewvc/ooo-build?rev=11836&view=rev

Log:
2008-03-06  Radek Doulik  <rodo novell com>

	* patches/src680/transogl-more-transitions.diff,
	patches/src680/transogl-transitions-officecfg.diff: added new
	transitions
	
	* patches/src680/apply: added transogl-shader-transitions.diff,
	contains the changes described below
	
	* build/ooh680-m8/slideshow/source/engine/OGLTrans/OGLTrans_TransitionImpl.cxx:
	implemented Static and Dissolve transitions which use OpenGL
	shader language

	*
	build/ooh680-m8/slideshow/source/engine/OGLTrans/OGLTrans_TransitionerImpl.cxx:
	better error handling when creating glX context. check for OpenGL
	version and compare with transition requested version. added 2 new
	shader based transitions to the factory.



Added:
   trunk/patches/src680/transogl-shader-transitions.diff
Modified:
   trunk/ChangeLog
   trunk/patches/src680/apply
   trunk/patches/src680/transogl-more-transitions.diff
   trunk/patches/src680/transogl-transitions-officecfg.diff

Modified: trunk/patches/src680/apply
==============================================================================
--- trunk/patches/src680/apply	(original)
+++ trunk/patches/src680/apply	Thu Mar  6 21:17:14 2008
@@ -1780,6 +1780,7 @@
 transogl-transitions-scp2.diff
 transogl-more-transitions.diff
 transogl-vsync.diff
+transogl-shader-transitions.diff
 
 [ Experimental ]
 # sal_uInt32 -> sal_uIntPtr for events on some places

Modified: trunk/patches/src680/transogl-more-transitions.diff
==============================================================================
--- trunk/patches/src680/transogl-more-transitions.diff	(original)
+++ trunk/patches/src680/transogl-more-transitions.diff	Thu Mar  6 21:17:14 2008
@@ -647,7 +647,7 @@
  
 --- sd/xml-orig/transitions-ogl	2008-02-13 09:19:54.000000000 +0100
 +++ sd/xml/transitions-ogl	2008-02-15 12:51:49.000000000 +0100
-@@ -30,4 +30,10 @@
+@@ -30,4 +30,16 @@
   <anim:par pres:preset-id="rochade">
    <anim:transitionFilter smil:type="miscShapeWipe" smil:subtype="bottomRight"/>
   </anim:par>
@@ -657,4 +657,10 @@
 + <anim:par pres:preset-id="venetian3dh">
 +  <anim:transitionFilter smil:type="miscShapeWipe" smil:subtype="topCenter"/>
 + </anim:par>
++ <anim:par pres:preset-id="static">
++  <anim:transitionFilter smil:type="miscShapeWipe" smil:subtype="rightCenter"/>
++ </anim:par>
++ <anim:par pres:preset-id="finedissolve">
++  <anim:transitionFilter smil:type="miscShapeWipe" smil:subtype="bottomCenter"/>
++ </anim:par>
   </anim:seq>

Added: trunk/patches/src680/transogl-shader-transitions.diff
==============================================================================
--- (empty file)
+++ trunk/patches/src680/transogl-shader-transitions.diff	Thu Mar  6 21:17:14 2008
@@ -0,0 +1,613 @@
+diff -rup ../ooh680-m8/slideshow/source/engine/OGLTrans/makefile.mk slideshow/source/engine/OGLTrans/makefile.mk
+--- ../ooh680-m8/slideshow/source/engine/OGLTrans/makefile.mk	2008-03-06 20:57:10.000000000 +0100
++++ slideshow/source/engine/OGLTrans/makefile.mk	2008-03-05 15:07:56.000000000 +0100
+@@ -56,7 +56,7 @@ ENABLE_EXCEPTIONS=TRUE
+ SLOFILES = \
+         $(SLO)$/OGLTrans_TransitionImpl.obj \
+         $(SLO)$/OGLTrans_TransitionerImpl.obj
+-        
++
+ DLLPRE=
+ SHL1TARGET=$(TARGET).uno
+ 
+diff -rup ../ooh680-m8/slideshow/source/engine/OGLTrans/OGLTrans_TransitionerImpl.cxx slideshow/source/engine/OGLTrans/OGLTrans_TransitionerImpl.cxx
+--- ../ooh680-m8/slideshow/source/engine/OGLTrans/OGLTrans_TransitionerImpl.cxx	2008-03-06 20:57:35.000000000 +0100
++++ slideshow/source/engine/OGLTrans/OGLTrans_TransitionerImpl.cxx	2008-03-06 12:57:01.000000000 +0100
+@@ -86,7 +86,7 @@ class OGLTransitionerImpl : private cppu
+ {
+ public:
+     explicit OGLTransitionerImpl(OGLTransitionImpl* pOGLTransition);
+-    void initWindowFromSlideShowView( const uno::Reference< presentation::XSlideShowView >& xView, double, double);
++    bool initWindowFromSlideShowView( const uno::Reference< presentation::XSlideShowView >& xView, double, double);
+     void setSlides( const uno::Reference< rendering::XBitmap >& xLeavingSlide , const uno::Reference< rendering::XBitmap >& xEnteringSlide );
+ 
+     // XTransition
+@@ -154,15 +154,18 @@ private:    
+ 
+     /** whether we are running on ATI fglrx with bug related to textures
+      */
+-    bool bBrokenTexturesATI;
++    bool mbBrokenTexturesATI;
++
++    /* GL version */
++    float mnGLVersion;
+ };
+ 
+-void OGLTransitionerImpl::initWindowFromSlideShowView( const uno::Reference< presentation::XSlideShowView >& xView, double, double)
++bool OGLTransitionerImpl::initWindowFromSlideShowView( const uno::Reference< presentation::XSlideShowView >& xView, double, double)
+ {
+     osl::MutexGuard const guard( m_aMutex );
+ 
+     if (isDisposed())
+-        return;
++        return false;
+ 
+     /// take the XSlideShowView and extract the parent window from it. see viewmediashape.cxx
+     uno::Reference< rendering::XCanvas > xCanvas(xView->getCanvas(), uno::UNO_QUERY_THROW);
+@@ -281,6 +284,10 @@ void OGLTransitionerImpl::initWindowFrom
+                                  vi,
+                                  0,
+                                  GL_TRUE);
++    if( glGetError() != GL_NO_ERROR ) {
++        OSL_TRACE("glError: %s\n", (char *)gluErrorString(glGetError()));
++        return false;
++    }
+     glXMakeCurrent( GLWin.dpy, GLWin.win, GLWin.ctx );
+ 
+     if(GLWin.HasGLXExtension("GLX_SGI_swap_control")) {
+@@ -293,8 +300,19 @@ void OGLTransitionerImpl::initWindowFrom
+         }
+     }
+ 
++    const GLubyte* version = glGetString( GL_VERSION );
++    if( version && version[0] ) {
++        mnGLVersion = version[0] - '0';
++        if( version[1] == '.' && version[2] )
++            mnGLVersion += (version[2] - '0')/10.0;
++    } else
++        mnGLVersion = 1.0;
++    OSL_TRACE("GL version: %s parsed: %f", version, mnGLVersion );
++
+     /* TODO: check for version once the bug in fglrx driver is fixed */
+-    bBrokenTexturesATI = (strcmp( (const char *) glGetString( GL_VENDOR ), "ATI Technologies Inc." ) == 0 );
++    mbBrokenTexturesATI = (strcmp( (const char *) glGetString( GL_VENDOR ), "ATI Technologies Inc." ) == 0 );
++
++    
+ 
+     glEnable(GL_CULL_FACE);
+     glCullFace(GL_BACK);
+@@ -313,8 +331,10 @@ void OGLTransitionerImpl::initWindowFrom
+     if( LeavingBytes.hasElements() && EnteringBytes.hasElements())
+        GLInitSlides();//we already have uninitialized slides, let's initialize 
+ 
+-    if (pTransition)
+-        pTransition->prepare ();
++    if( pTransition && pTransition->mnRequiredGLVersion <= mnGLVersion )
++        pTransition->prepare( GLleavingSlide, GLenteringSlide );
++
++    return true;
+ }
+ 
+ void OGLTransitionerImpl::setSlides( const uno::Reference< rendering::XBitmap >& xLeavingSlide, 
+@@ -338,7 +358,6 @@ void OGLTransitionerImpl::setSlides( con
+     LeavingBytes = LeavingSlideIntBitmap->getData(SlideBitmapLayout,SlideRect);
+     EnteringBytes = EnteringSlideIntBitmap->getData(SlideBitmapLayout,SlideRect);
+ 
+-
+     if(GLWin.ctx)//if we have a rendering context, let's init the slides
+         GLInitSlides();
+ 
+@@ -350,7 +369,7 @@ void OGLTransitionerImpl::GLInitSlides()
+ {
+     osl::MutexGuard const guard( m_aMutex );
+ 
+-    if (isDisposed())
++    if (isDisposed() || pTransition->mnRequiredGLVersion > mnGLVersion)
+         return;
+ 
+     glMatrixMode(GL_PROJECTION);
+@@ -440,7 +459,7 @@ void OGLTransitionerImpl::GLInitSlides()
+     
+     glGenTextures(1, &GLleavingSlide);
+ 	glBindTexture(GL_TEXTURE_2D, GLleavingSlide);
+-    if( pTransition && !bBrokenTexturesATI && !pTransition->mbUseMipMapLeaving) {
++    if( pTransition && !mbBrokenTexturesATI && !pTransition->mbUseMipMapLeaving) {
+         glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, SlideSize.Width, SlideSize.Height, 0, Format, GL_UNSIGNED_BYTE, &LeavingBytes[0]);
+         glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
+         glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
+@@ -464,7 +483,7 @@ void OGLTransitionerImpl::GLInitSlides()
+ 	
+ 	glGenTextures(1, &GLenteringSlide);
+ 	glBindTexture(GL_TEXTURE_2D, GLenteringSlide);
+-    if( pTransition && !bBrokenTexturesATI && !pTransition->mbUseMipMapEntering ) {
++    if( pTransition && !mbBrokenTexturesATI && !pTransition->mbUseMipMapEntering ) {
+         glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, SlideSize.Width, SlideSize.Height, 0, Format, GL_UNSIGNED_BYTE, &EnteringBytes[0]);
+         glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
+         glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
+@@ -489,14 +508,14 @@ void SAL_CALL OGLTransitionerImpl::updat
+ {
+     osl::MutexGuard const guard( m_aMutex );
+ 
+-    if (isDisposed())
++    if (isDisposed() || pTransition->mnRequiredGLVersion > mnGLVersion)
+         return;
+-        
++
+     glEnable(GL_DEPTH_TEST);
+ 	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ 
+ 	if(pTransition)
+-	    pTransition->display( nTime , GLleavingSlide , GLenteringSlide , 
++	    pTransition->display( nTime, GLleavingSlide, GLenteringSlide, 
+                               SlideSize.Width, SlideSize.Height,
+                               static_cast<double>(GLWin.Width),
+                               static_cast<double>(GLWin.Height) );
+@@ -567,6 +586,8 @@ public:
+                 case animations::TransitionSubType::BOTTOMRIGHT:
+                 case animations::TransitionSubType::BOTTOMLEFT:
+                 case animations::TransitionSubType::TOPCENTER:
++                case animations::TransitionSubType::RIGHTCENTER:
++                case animations::TransitionSubType::BOTTOMCENTER:
+                     return sal_True;
+ 
+                 default:
+@@ -588,6 +609,9 @@ public:
+         const uno::Reference< rendering::XBitmap >&           enteringBitmap, 
+         const geometry::RealPoint2D&                          slideOffset ) throw (uno::RuntimeException)
+     {
++        if( !hasTransition( transitionType, transitionSubType ) )
++            return uno::Reference< presentation::XTransition >();
++
+         OGLTransitionImpl* pTransition;
+ 
+         if( transitionType == animations::TransitionType::MISCSHAPEWIPE ) {
+@@ -630,8 +654,12 @@ public:
+                 case animations::TransitionSubType::TOPCENTER:
+                     pTransition->makeVenetianBlinds( false, 6 );
+                     break;
+-                default:
+-                    return uno::Reference< presentation::XTransition >();
++                case animations::TransitionSubType::RIGHTCENTER:
++                    pTransition->makeStatic();
++                    break;
++                case animations::TransitionSubType::BOTTOMCENTER:
++                    pTransition->makeDissolve();
++                    break;
+                 }
+         } else if( transitionType == animations::TransitionType::FADE && transitionSubType == animations::TransitionSubType::CROSSFADE ) {
+             pTransition = new OGLTransitionImpl();
+@@ -639,13 +667,12 @@ public:
+         } else if( transitionType == animations::TransitionType::IRISWIPE && transitionSubType == animations::TransitionSubType::DIAMOND ) {
+             pTransition = new OGLTransitionImpl();
+             pTransition->makeDiamond();
+-        } else {
+-            return uno::Reference< presentation::XTransition >();
+         }
+ 
+         rtl::Reference<OGLTransitionerImpl> xRes(
+             new OGLTransitionerImpl(pTransition) );
+-        xRes->initWindowFromSlideShowView(view,slideOffset.X,slideOffset.Y);
++        if(!xRes->initWindowFromSlideShowView(view,slideOffset.X,slideOffset.Y))
++            return uno::Reference< presentation::XTransition >();
+         xRes->setSlides(leavingBitmap,enteringBitmap);
+ 
+         return uno::Reference<presentation::XTransition>(xRes.get());
+Only in slideshow/source/engine/OGLTrans: OGLTrans_TransitionerImpl.cxx.orig
+Only in slideshow/source/engine/OGLTrans: OGLTrans_TransitionerImpl.cxx.rej
+diff -rup ../ooh680-m8/slideshow/source/engine/OGLTrans/OGLTrans_TransitionImpl.cxx slideshow/source/engine/OGLTrans/OGLTrans_TransitionImpl.cxx
+--- ../ooh680-m8/slideshow/source/engine/OGLTrans/OGLTrans_TransitionImpl.cxx	2008-03-06 20:57:35.000000000 +0100
++++ slideshow/source/engine/OGLTrans/OGLTrans_TransitionImpl.cxx	2008-03-06 11:50:51.000000000 +0100
+@@ -32,8 +32,10 @@
+  *    MA  02111-1307  USA
+  *
+  ************************************************************************/
++#define GL_GLEXT_PROTOTYPES 1
+ #include "OGLTrans_TransitionImpl.hxx"
+ #include <GL/gl.h>
++#include <GL/glext.h>
+ #include <math.h>
+ 
+ void OGLTransitionImpl::clear()
+@@ -48,6 +50,29 @@ void OGLTransitionImpl::clear()
+     maSceneObjects.clear();
+ 
+     mbReflectSlides = false;
++
++    if( mProgramObject ) {
++        glDeleteProgram( mProgramObject );
++        mProgramObject = 0;
++    }
++
++    if( mVertexObject ) {
++        glDeleteShader( mVertexObject );
++        mVertexObject = 0;
++    }
++
++    if( mFragmentObject ) {
++        glDeleteShader( mFragmentObject );
++        mFragmentObject = 0;
++    }
++
++    if( maHelperTexture ) {
++        glDeleteTextures( 1, &maHelperTexture );
++        maHelperTexture = 0;
++    }
++
++    if( mmClearTransition )
++        (this->*mmClearTransition)();
+ }
+ 
+ OGLTransitionImpl::~OGLTransitionImpl()
+@@ -55,11 +80,14 @@ OGLTransitionImpl::~OGLTransitionImpl()
+     clear();
+ }
+ 
+-void OGLTransitionImpl::prepare()
++void OGLTransitionImpl::prepare( ::sal_Int32 glLeavingSlideTex, ::sal_Int32 glEnteringSlideTex )
+ {
+     for(unsigned int i(0); i < maSceneObjects.size(); ++i) {
+         maSceneObjects[i]->prepare();
+     }
++
++    if( mmPrepareTransition )
++        (this->*mmPrepareTransition)( glLeavingSlideTex, glEnteringSlideTex );
+ }
+ 
+ void OGLTransitionImpl::finish()
+@@ -986,3 +1014,265 @@ void OGLTransitionImpl::makeFadeSmoothly
+     mmDisplaySlides = &OGLTransitionImpl::displaySlidesFadeSmoothly;
+     mbUseMipMapLeaving = mbUseMipMapEntering = false;
+ }
++
++static GLuint linkProgram( const char *vertexShader, const char *fragmentShader )
++{
++    GLhandleARB vertexObject, fragmentObject, programObject;
++    GLint vertexCompiled, fragmentCompiled, programLinked;
++    char log[1024];
++
++    vertexObject = glCreateShaderObjectARB( GL_VERTEX_SHADER_ARB );
++    fragmentObject = glCreateShader( GL_FRAGMENT_SHADER );
++    OSL_TRACE("checkpoint 1: shaders created (%d) vertex: %d fragment: %d", glGetError() == GL_NO_ERROR, vertexObject, fragmentObject );
++
++
++    glShaderSourceARB( vertexObject, 1, &vertexShader, NULL );
++    glShaderSourceARB( fragmentObject, 1, &fragmentShader, NULL );
++
++    glCompileShader( vertexObject );
++    glGetInfoLogARB( vertexObject, sizeof( log ), NULL, log );
++    OSL_TRACE("vertex compile log: %s", log);
++    glGetShaderiv( vertexObject, GL_COMPILE_STATUS, &vertexCompiled );
++    glCompileShader( fragmentObject );
++    glGetInfoLogARB( fragmentObject, sizeof( log ), NULL, log );
++    OSL_TRACE("fragment compile log: %s", log);
++    glGetShaderiv( fragmentObject, GL_COMPILE_STATUS, &fragmentCompiled );
++
++    if( !vertexCompiled || !fragmentCompiled )
++        return 0;
++
++    OSL_TRACE("checkpoint 2: shaders compiled (%d)", glGetError() == GL_NO_ERROR);
++
++    programObject = glCreateProgram();
++    glAttachShader( programObject, vertexObject );
++    glAttachShader( programObject, fragmentObject );
++
++    glLinkProgram( programObject );
++    glGetInfoLogARB( programObject, sizeof( log ), NULL, log );
++    OSL_TRACE("program link log: %s", log);
++    glGetProgramiv( programObject, GL_LINK_STATUS, &programLinked );
++
++    if( !programLinked )
++        return 0;
++
++    OSL_TRACE("checkpoint 3: program linked (%d)", glGetError() == GL_NO_ERROR);
++
++    return programObject;
++}
++
++static const char* basicVertexShader = "\n\
++varying vec2 v_texturePosition;\n\
++\n\
++void main( void )\n\
++{\n\
++	gl_Position = ftransform();\n\
++	v_texturePosition = gl_MultiTexCoord0.xy;\n\
++}\n\
++";
++
++static const char* staticFragmentShader = "\n\
++uniform sampler2D leavingSlideTexture;\n\
++uniform sampler2D enteringSlideTexture;\n\
++uniform sampler2D permTexture;\n\
++uniform float time;\n\
++varying vec2 v_texturePosition;\n\
++\n\
++float snoise(vec2 P) {\n\
++\n\
++  return texture2D(permTexture, P).r;\n\
++}\n\
++\n\
++\n\
++#define PART 0.5\n\
++#define START 0.4\n\
++#define END 0.9\n\
++\n\
++void main() {\n\
++    float sn = snoise(10.0*v_texturePosition+time*0.07);\n\
++    if( time < PART ) {\n\
++        float sn1 = snoise(vec2(time*15.0, 20.0*v_texturePosition.y));\n\
++        float sn2 = snoise(v_texturePosition);\n\
++        if (sn1 > 1.0 - time*time && sn2 < 2.0*time+0.1)\n\
++	        gl_FragColor = vec4(sn, sn, sn, 1.0);\n\
++        else if (time > START )\n\
++            gl_FragColor = ((time-START)/(PART - START))*vec4(sn, sn, sn, 1.0) + (1.0 - (time - START)/(PART - START))*texture2D(leavingSlideTexture, v_texturePosition);\n\
++        else\n\
++            gl_FragColor = texture2D(leavingSlideTexture, v_texturePosition);\n\
++    } else if ( time < PART ) {\n\
++            gl_FragColor = texture2D(leavingSlideTexture, v_texturePosition);\n\
++    } else if ( time > END ) {\n\
++        gl_FragColor = ((1.0 - time)/(1.0 - END))*vec4(sn, sn, sn, 1.0) + ((time - END)/(1.0 - END))*texture2D(enteringSlideTexture, v_texturePosition);\n\
++    } else \n\
++	    gl_FragColor = vec4(sn, sn, sn, 1.0);\n\
++}\n\
++";
++
++static const char* dissolveFragmentShader = "\n\
++uniform sampler2D leavingSlideTexture;\n\
++uniform sampler2D enteringSlideTexture;\n\
++uniform sampler2D permTexture;\n\
++uniform float time;\n\
++varying vec2 v_texturePosition;\n\
++\n\
++float snoise(vec2 P) {\n\
++\n\
++  return texture2D(permTexture, P).r;\n\
++}\n\
++\n\
++void main() {\n\
++     float sn = snoise(10.0*v_texturePosition);\n\
++     if( sn < time)\n\
++         gl_FragColor = texture2D(enteringSlideTexture, v_texturePosition);\n\
++     else\n\
++         gl_FragColor = texture2D(leavingSlideTexture, v_texturePosition);\n\
++}\n\
++";
++
++int permutation256 [256]= {
++215, 100, 200, 204, 233,  50,  85, 196, 
++ 71, 141, 122, 160,  93, 131, 243, 234, 
++162, 183,  36, 155,   4,  62,  35, 205, 
++ 40, 102,  33,  27, 255,  55, 214, 156, 
++ 75, 163, 134, 126, 249,  74, 197, 228, 
++ 72,  90, 206, 235,  17,  22,  49, 169, 
++227,  89,  16,   5, 117,  60, 248, 230, 
++217,  68, 138,  96, 194, 170, 136,  10, 
++112, 238, 184, 189, 176,  42, 225, 212, 
++ 84,  58, 175, 244, 150, 168, 219, 236, 
++101, 208, 123,  37, 164, 110, 158, 201, 
++ 78, 114,  57,  48,  70, 142, 106,  43, 
++232,  26,  32, 252, 239,  98, 191,  94, 
++ 59, 149,  39, 187, 203, 190,  19,  13, 
++133,  45,  61, 247,  23,  34,  20,  52, 
++118, 209, 146, 193, 222,  18,   1, 152, 
++ 46,  41,  91, 148, 115,  25, 135,  77, 
++254, 147, 224, 161,   9, 213, 223, 250, 
++231, 251, 127, 166,  63, 179,  81, 130, 
++139,  28, 120, 151, 241,  86, 111,   0, 
++ 88, 153, 172, 182, 159, 105, 178,  47, 
++ 51, 167,  65,  66,  92,  73, 198, 211, 
++245, 195,  31, 220, 140,  76, 221, 186, 
++154, 185,  56,  83,  38, 165, 109,  67, 
++124, 226, 132,  53, 229,  29,  12, 181, 
++121,  24, 207, 199, 177, 113,  30,  80, 
++  3,  97, 188,  79, 216, 173,   8, 145, 
++ 87, 128, 180, 237, 240, 137, 125, 104, 
++ 15, 242, 119, 246, 103, 143,  95, 144, 
++  2,  44,  69, 157, 192, 174,  14,  54, 
++218,  82,  64, 210,  11,   6, 129,  21, 
++116, 171,  99, 202,   7, 107, 253, 108
++};
++
++void initPermTexture(GLuint *texID)
++{
++  glGenTextures(1, texID);
++  glBindTexture(GL_TEXTURE_2D, *texID);
++
++  static bool initialized = false;
++  static unsigned char permutation2D[256*256*4];
++  if( !initialized ) {
++      int x, y;
++
++      for( y=0; y < 256; y++ )
++          for( x=0; x < 256; x++ )
++              permutation2D[x*4 + y*1024] = permutation256[(y + permutation256[x]) & 0xff];
++
++      initialized = true;
++  }
++
++  glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, permutation2D );
++  glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
++  glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
++}
++
++void OGLTransitionImpl::preparePermShader()
++{
++    if( mProgramObject ) {
++        glUseProgram( mProgramObject );
++
++        GLint location = glGetUniformLocation( mProgramObject, "leavingSlideTexture" );
++        if( location != -1 ) {
++            glUniform1i( location, 0 );  // texture unit 0
++        }
++
++        glActiveTexture(GL_TEXTURE1);
++        if( !maHelperTexture )
++            initPermTexture( &maHelperTexture );
++        glActiveTexture(GL_TEXTURE0);
++
++        location = glGetUniformLocation( mProgramObject, "permTexture" );
++        if( location != -1 ) {
++            glUniform1i( location, 1 );  // texture unit 1
++        }
++
++        location = glGetUniformLocation( mProgramObject, "enteringSlideTexture" );
++        if( location != -1 ) {
++            glUniform1i( location, 2 );  // texture unit 2
++        }
++    }
++}
++
++void OGLTransitionImpl::prepareStatic( ::sal_Int32 /* glLeavingSlideTex */, ::sal_Int32 /* glEnteringSlideTex */ )
++{
++    mProgramObject = linkProgram( basicVertexShader, staticFragmentShader );
++
++    preparePermShader();
++}
++
++void OGLTransitionImpl::displaySlidesShaders( double nTime, ::sal_Int32 glLeavingSlideTex, ::sal_Int32 glEnteringSlideTex,
++                                              double SlideWidthScale, double SlideHeightScale )
++{
++    applyOverallOperations( nTime, SlideWidthScale, SlideHeightScale );
++
++    if( mProgramObject ) {
++        GLint location = glGetUniformLocation( mProgramObject, "time" );
++        if( location != -1 ) {
++            glUniform1f( location, nTime );
++        }
++    }
++
++    glActiveTexture( GL_TEXTURE2 );
++    glBindTexture( GL_TEXTURE_2D, glEnteringSlideTex );
++    glActiveTexture( GL_TEXTURE0 );
++
++    displaySlide( nTime, glLeavingSlideTex, maLeavingSlidePrimitives, SlideWidthScale, SlideHeightScale );
++}
++
++void OGLTransitionImpl::makeStatic()
++{
++    Primitive Slide;
++
++    Slide.pushTriangle (basegfx::B2DVector (0,0), basegfx::B2DVector (1,0), basegfx::B2DVector (0,1));
++    Slide.pushTriangle (basegfx::B2DVector (1,0), basegfx::B2DVector (0,1), basegfx::B2DVector (1,1));
++    maLeavingSlidePrimitives.push_back (Slide);
++    maEnteringSlidePrimitives.push_back (Slide);
++
++    mmDisplaySlides = &OGLTransitionImpl::displaySlidesShaders;
++    mmPrepareTransition = &OGLTransitionImpl::prepareStatic;
++    mbUseMipMapLeaving = mbUseMipMapEntering = false;
++
++    mnRequiredGLVersion = 2.0;
++}
++
++void OGLTransitionImpl::prepareDissolve( ::sal_Int32 /* glLeavingSlideTex */, ::sal_Int32 /* glEnteringSlideTex */ )
++{
++    mProgramObject = linkProgram( basicVertexShader, dissolveFragmentShader );
++
++    preparePermShader();
++}
++
++void OGLTransitionImpl::makeDissolve()
++{
++    Primitive Slide;
++
++    Slide.pushTriangle (basegfx::B2DVector (0,0), basegfx::B2DVector (1,0), basegfx::B2DVector (0,1));
++    Slide.pushTriangle (basegfx::B2DVector (1,0), basegfx::B2DVector (0,1), basegfx::B2DVector (1,1));
++    maLeavingSlidePrimitives.push_back (Slide);
++    maEnteringSlidePrimitives.push_back (Slide);
++
++    mmDisplaySlides = &OGLTransitionImpl::displaySlidesShaders;
++    mmPrepareTransition = &OGLTransitionImpl::prepareDissolve;
++    mbUseMipMapLeaving = mbUseMipMapEntering = false;
++
++    mnRequiredGLVersion = 2.0;
++}
+diff -rup ../ooh680-m8/slideshow/source/engine/OGLTrans/OGLTrans_TransitionImpl.hxx slideshow/source/engine/OGLTrans/OGLTrans_TransitionImpl.hxx
+--- ../ooh680-m8/slideshow/source/engine/OGLTrans/OGLTrans_TransitionImpl.hxx	2008-03-06 20:57:35.000000000 +0100
++++ slideshow/source/engine/OGLTrans/OGLTrans_TransitionImpl.hxx	2008-03-06 11:50:24.000000000 +0100
+@@ -55,18 +55,25 @@ public:
+     OGLTransitionImpl() :
+         mbUseMipMapLeaving( true ),
+         mbUseMipMapEntering( true ),
++        mnRequiredGLVersion( 1.0 ),
+         maLeavingSlidePrimitives(),
+         maEnteringSlidePrimitives(),
+         maSceneObjects(),
+         mbReflectSlides( false ),
++        mVertexObject( 0 ),
++        mFragmentObject( 0 ),
++        mProgramObject( 0 ),
++        maHelperTexture( 0 ),
+         mmPrepare( NULL ),
++        mmPrepareTransition( NULL ),
++        mmClearTransition( NULL ),
+         mmDisplaySlides( NULL )
+     {}
+ 
+     ~OGLTransitionImpl();
+     
+-    void prepare();
+-    void display( double nTime, ::sal_Int32 glLeavingSlideTex, ::sal_Int32 glEnteringSlideTex, double SlideWidth, double SlideHeight, double DispWidth, double DispHeight);
++    void prepare( ::sal_Int32 glLeavingSlideTex, ::sal_Int32 glEnteringSlideTex );
++    void display( double nTime, ::sal_Int32 glLeavingSlideTex, ::sal_Int32 glEnteringSlideTex, double SlideWidth, double SlideHeight, double DispWidth, double DispHeight );
+     void finish();
+ 
+     void makeOutsideCubeFaceToLeft();
+@@ -80,6 +87,8 @@ public:
+     void makeIris();
+     void makeRochade();
+     void makeVenetianBlinds( bool vertical, int parts );
++    void makeStatic();
++    void makeDissolve();
+ 
+     /** 2D replacements
+      */
+@@ -91,6 +100,10 @@ public:
+     bool mbUseMipMapLeaving;
+     bool mbUseMipMapEntering;
+ 
++    /** which GL version does the transition require
++     */
++    float mnRequiredGLVersion;
++
+ private:
+     /** clears all the primitives and operations
+ 	*/
+@@ -117,11 +130,28 @@ private:
+      */
+     bool mbReflectSlides;
+ 
++    /** GLSL objects, shaders and program
++     */
++    GLuint mVertexObject, mFragmentObject, mProgramObject;
++
++    /* various data */
++    GLuint maHelperTexture;
++
+     /** When this method is not NULL, it is called in display method to prepare the slides, scene, etc.
+      ** We might later replace this by cleaner derived class.
+      */
+     void (OGLTransitionImpl::*mmPrepare)( double nTime, double SlideWidth, double SlideHeight, double DispWidth, double DispHeight );
+ 
++    /** When this method is not NULL, it is called after glx context is ready to let the transition prepare GL related things, like GLSL program.
++     ** We might later replace this by cleaner derived class.
++     */
++    void (OGLTransitionImpl::*mmPrepareTransition)( ::sal_Int32 glLeavingSlideTex, ::sal_Int32 glEnteringSlideTex );
++
++    /** When this method is not NULL, it is called when the transition needs to clear after itself, like delete own textures etc.
++     ** We might later replace this by cleaner derived class.
++     */
++    void (OGLTransitionImpl::*mmClearTransition)();
++
+     /** When this method is not NULL, it is called in display method to display the slides.
+      ** We might later replace this by cleaner derived class.
+      */
+@@ -136,6 +166,10 @@ private:
+      */
+     void prepareDiamond( double nTime, double SlideWidth, double SlideHeight, double DispWidth, double DispHeight );
+     void displaySlidesFadeSmoothly( double nTime, ::sal_Int32 glLeavingSlideTex, ::sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale );
++    void displaySlidesShaders( double nTime, ::sal_Int32 glLeavingSlideTex, ::sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale );
++    void prepareStatic( ::sal_Int32 glLeavingSlideTex, ::sal_Int32 glEnteringSlideTex );
++    void prepareDissolve( ::sal_Int32 glLeavingSlideTex, ::sal_Int32 glEnteringSlideTex );
++    void preparePermShader();
+ };
+ 
+ class SceneObject

Modified: trunk/patches/src680/transogl-transitions-officecfg.diff
==============================================================================
--- trunk/patches/src680/transogl-transitions-officecfg.diff	(original)
+++ trunk/patches/src680/transogl-transitions-officecfg.diff	Thu Mar  6 21:17:14 2008
@@ -1,7 +1,7 @@
 officecfg/registry/data/org/openoffice/Office/UI/Effects.xcu
 --- officecfg/registry/data/org/openoffice/Office/UI/Effects.xcu	2007-12-05 15:02:57.000000000 +0100
 +++ officecfg/registry/data/org/openoffice/Office/UI/Effects.xcu	2007-12-05 16:29:43.000000000 +0100
-@@ -1912,6 +1912,66 @@
+@@ -1912,6 +1912,76 @@
 					
 				</prop>
 			</node>
@@ -65,6 +65,16 @@
 +          <value xml:lang="en-US">Venetian Blinds 3D Horizontal</value>
 +        </prop>
 +      </node>
++      <node oor:name="static" oor:op="replace">
++        <prop oor:name="Label" oor:type="xs:string">
++          <value xml:lang="en-US">Static</value>
++        </prop>
++      </node>
++      <node oor:name="finedissolve" oor:op="replace">
++        <prop oor:name="Label" oor:type="xs:string">
++          <value xml:lang="en-US">Fine Dissolve</value>
++        </prop>
++      </node>
  		</node>
  	</node>	
  	<node oor:name="Presets">



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]