[Libreoffice-commits] core.git: Branch 'private/moggi/abstract-chart-rendering' - 2 commits - chart2/inc chart2/Library_chartopengl.mk chart2/source

Markus Mohrhard markus.mohrhard at googlemail.com
Tue Oct 22 05:32:34 PDT 2013


 chart2/Library_chartopengl.mk                   |    3 
 chart2/inc/ChartModel.hxx                       |    1 
 chart2/source/model/main/ChartModel.cxx         |    8 
 chart2/source/view/inc/AbstractShapeFactory.hxx |    2 
 chart2/source/view/inc/DummyXShape.hxx          |   74 ++++
 chart2/source/view/inc/OpenglShapeFactory.hxx   |    3 
 chart2/source/view/inc/ShapeFactory.hxx         |    2 
 chart2/source/view/main/ChartView.cxx           |    1 
 chart2/source/view/main/DummyXShape.cxx         |  360 ++++++++++++++++++++++++
 chart2/source/view/main/OpenglShapeFactory.cxx  |   50 +++
 chart2/source/view/main/ShapeFactory.cxx        |    4 
 11 files changed, 504 insertions(+), 4 deletions(-)

New commits:
commit 3da7f09e23de54a9950bab2806ce71bda4c90d9b
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Tue Oct 22 14:06:56 2013 +0200

    fix lifetime problems of ChartView
    
    Change-Id: I99b24b026c50a05f8f3803348c76277e29a45ec7

diff --git a/chart2/inc/ChartModel.hxx b/chart2/inc/ChartModel.hxx
index ffc49aa..d3719da 100644
--- a/chart2/inc/ChartModel.hxx
+++ b/chart2/inc/ChartModel.hxx
@@ -120,6 +120,7 @@ private:
     sal_Int32               m_nInLoad;
     sal_Bool volatile       m_bUpdateNotificationsPending;
 
+    com::sun::star::uno::Reference< com::sun::star::uno::XInterface > xChartView; // for the ref count
     ChartView* mpChartView;
 
     OUString m_aResource;
diff --git a/chart2/source/model/main/ChartModel.cxx b/chart2/source/model/main/ChartModel.cxx
index c25b346..4fbda9a 100644
--- a/chart2/source/model/main/ChartModel.cxx
+++ b/chart2/source/model/main/ChartModel.cxx
@@ -186,8 +186,6 @@ ChartModel::~ChartModel()
     OSL_TRACE( "ChartModel: DTOR called" );
     if( m_xOldModelAgg.is())
         m_xOldModelAgg->setDelegator( NULL );
-
-    delete mpChartView;
 }
 
 void SAL_CALL ChartModel::initialize( const Sequence< Any >& /*rArguments*/ )
@@ -1200,7 +1198,10 @@ Reference< uno::XInterface > SAL_CALL ChartModel::createInstance( const OUString
             case SERVICE_MARKER_TABLE:
                 {
                     if(!mpChartView)
+                    {
                         mpChartView = new ChartView( m_xContext, *this);
+                        xChartView = static_cast< ::cppu::OWeakObject* >( mpChartView );
+                    }
                     return mpChartView->createInstance( rServiceSpecifier );
                 }
                 break;
@@ -1211,7 +1212,10 @@ Reference< uno::XInterface > SAL_CALL ChartModel::createInstance( const OUString
     else if(rServiceSpecifier == CHART_VIEW_SERVICE_NAME)
     {
         if(!mpChartView)
+        {
             mpChartView = new ChartView( m_xContext, *this);
+            xChartView = static_cast< ::cppu::OWeakObject* >( mpChartView );
+        }
 
         return static_cast< ::cppu::OWeakObject* >( mpChartView );
     }
diff --git a/chart2/source/view/main/DummyXShape.cxx b/chart2/source/view/main/DummyXShape.cxx
index 61860d0..0708ad8 100644
--- a/chart2/source/view/main/DummyXShape.cxx
+++ b/chart2/source/view/main/DummyXShape.cxx
@@ -680,6 +680,7 @@ int oglErrorHandler( unx::Display* /*dpy*/, unx::XErrorEvent* /*evnt*/ )
 
 bool DummyChart::initOpengl()
 {
+    initWindow();
     mpWindow->setPosSizePixel(0,0,0,0);
     GLWin.Width = 0;
     GLWin.Height = 0;
@@ -804,7 +805,7 @@ DummyChart::DummyChart():
 
 void DummyChart::createGLContext()
 {
-
+    initOpengl();
 }
 
 void DummyChart::setPosition( const awt::Point& aPosition )
commit 43233a870f441f1664c1743c3ffed1e468dea48c
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Tue Oct 22 13:49:15 2013 +0200

    it builds again
    
    Change-Id: I969ff5ed6fd979e9fd126e8d0b79a518697e7915

diff --git a/chart2/Library_chartopengl.mk b/chart2/Library_chartopengl.mk
index 88c8e5f..d1f2c4b 100644
--- a/chart2/Library_chartopengl.mk
+++ b/chart2/Library_chartopengl.mk
@@ -24,6 +24,7 @@ $(eval $(call gb_Library_use_libraries,chartopengl,\
     cppu \
     cppuhelper \
     sal \
+    vcl \
     $(gb_UWINAPI) \
 ))
 
@@ -43,6 +44,8 @@ else ifeq ($(OS),LINUX)
 $(eval $(call gb_Library_add_libs,chartopengl,\
     -ldl \
     -lGL \
+    -lGLU \
+    -lX11 \
 ))
 endif
 
diff --git a/chart2/source/view/inc/AbstractShapeFactory.hxx b/chart2/source/view/inc/AbstractShapeFactory.hxx
index 8dd8137..36b2554 100644
--- a/chart2/source/view/inc/AbstractShapeFactory.hxx
+++ b/chart2/source/view/inc/AbstractShapeFactory.hxx
@@ -227,6 +227,8 @@ public:
          getOrCreateChartRootShape( const ::com::sun::star::uno::Reference<
             ::com::sun::star::drawing::XDrawPage>& xPage ) = 0;
 
+    virtual void setPageSize( com::sun::star::uno::Reference < com::sun::star::drawing::XShapes > xChartShapes, const com::sun::star::awt::Size& rSize ) = 0;
+
 
     virtual void createSeries( const com::sun::star::uno::Reference<
             com::sun::star::drawing::XShapes> & xTarget,
diff --git a/chart2/source/view/inc/DummyXShape.hxx b/chart2/source/view/inc/DummyXShape.hxx
index 924c43f..0d56924 100644
--- a/chart2/source/view/inc/DummyXShape.hxx
+++ b/chart2/source/view/inc/DummyXShape.hxx
@@ -56,6 +56,39 @@
 
 #include <vector>
 #include <map>
+#include <boost/scoped_ptr.hpp>
+
+
+#include <GL/gl.h>
+#include <GL/glu.h>
+#include <vcl/window.hxx>
+#include <vcl/syschild.hxx>
+#include <vcl/sysdata.hxx>
+
+#if defined( _WIN32 )
+    #include <GL/glu.h>
+    #include <GL/glext.h>
+    #include <GL/wglext.h>
+#elif defined( MACOSX )
+    #include "premac.h"
+    #include <Cocoa/Cocoa.h>
+    #include "postmac.h"
+#elif defined( UNX )
+    #include <GL/glu.h>
+    #include <GL/glext.h>
+
+    namespace unx
+    {
+        #include <X11/keysym.h>
+        #include <X11/X.h>
+        #define GLX_GLXEXT_PROTOTYPES 1
+        #include <GL/glx.h>
+        #include <GL/glxext.h>
+    }
+#endif
+
+class SystemWindow;
+class SystemChildWindow;
 
 using namespace com::sun::star;
 
@@ -354,12 +387,53 @@ private:
 class DummyChart : public DummyXShapes
 {
 public:
+    DummyChart();
     virtual DummyChart* getRootShape();
 
     OpenglContext* getGlContext() { return mpContext; }
 
+    virtual void SAL_CALL setPosition( const ::com::sun::star::awt::Point& aPosition ) throw(::com::sun::star::uno::RuntimeException);
+    virtual void SAL_CALL setSize( const ::com::sun::star::awt::Size& aSize ) throw(::com::sun::star::beans::PropertyVetoException, ::com::sun::star::uno::RuntimeException);
+
 private:
+
+    /// Holds the information of our new child window
+    struct GLWindow
+    {
+#if defined( _WIN32 )
+        HWND                    hWnd;
+        HDC                     hDC;
+        HGLRC                   hRC;
+#elif defined( MACOSX )
+#elif defined( UNX )
+        unx::Display*           dpy;
+        int                     screen;
+        unx::Window             win;
+#if defined( GLX_VERSION_1_3 ) && defined( GLX_EXT_texture_from_pixmap )
+        unx::GLXFBConfig        fbc;
+#endif
+        unx::XVisualInfo*       vi;
+        unx::GLXContext         ctx;
+
+        bool HasGLXExtension( const char* name ) { return gluCheckExtension( (const GLubyte*) name, (const GLubyte*) GLXExtensions ); }
+        const char*             GLXExtensions;
+#endif
+        unsigned int            bpp;
+        unsigned int            Width;
+        unsigned int            Height;
+        const GLubyte*          GLExtensions;
+
+        bool HasGLExtension( const char* name ) { return gluCheckExtension( (const GLubyte*) name, GLExtensions ); }
+    } GLWin;    /// Holds the information of our new child window
+
+    void createGLContext();
+
+    bool initWindow();
+    bool initOpengl();
+
     OpenglContext* mpContext;
+    boost::scoped_ptr<Window> mpWindow;
+    boost::scoped_ptr<SystemChildWindow> pWindow;
 };
 
 class DummyGroup2D : public DummyXShapes
diff --git a/chart2/source/view/inc/OpenglShapeFactory.hxx b/chart2/source/view/inc/OpenglShapeFactory.hxx
index 1dc444d..7d8ebdc 100644
--- a/chart2/source/view/inc/OpenglShapeFactory.hxx
+++ b/chart2/source/view/inc/OpenglShapeFactory.hxx
@@ -187,6 +187,9 @@ public:
     virtual ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapes >
          getOrCreateChartRootShape( const ::com::sun::star::uno::Reference<
             ::com::sun::star::drawing::XDrawPage>& xPage );
+
+    virtual void setPageSize( com::sun::star::uno::Reference < com::sun::star::drawing::XShapes > xChartShapes, const com::sun::star::awt::Size& rSize );
+
 };
 
 }
diff --git a/chart2/source/view/inc/ShapeFactory.hxx b/chart2/source/view/inc/ShapeFactory.hxx
index 04db1d0..10cd541 100644
--- a/chart2/source/view/inc/ShapeFactory.hxx
+++ b/chart2/source/view/inc/ShapeFactory.hxx
@@ -203,6 +203,8 @@ public:
          getOrCreateChartRootShape( const ::com::sun::star::uno::Reference<
             ::com::sun::star::drawing::XDrawPage>& xPage );
 
+    virtual void setPageSize( com::sun::star::uno::Reference < com::sun::star::drawing::XShapes > xChartShapes, const com::sun::star::awt::Size& rSize );
+
 private:
     ShapeFactory();
 
diff --git a/chart2/source/view/main/ChartView.cxx b/chart2/source/view/main/ChartView.cxx
index 387e840..8017109 100644
--- a/chart2/source/view/main/ChartView.cxx
+++ b/chart2/source/view/main/ChartView.cxx
@@ -2398,6 +2398,7 @@ void ChartView::createShapes()
     {
         OSL_FAIL("could not set page size correctly");
     }
+    pShapeFactory->setPageSize(xPageShapes, aPageSize);
 
     {
         SolarMutexGuard aSolarGuard;
diff --git a/chart2/source/view/main/DummyXShape.cxx b/chart2/source/view/main/DummyXShape.cxx
index 4d93079..61860d0 100644
--- a/chart2/source/view/main/DummyXShape.cxx
+++ b/chart2/source/view/main/DummyXShape.cxx
@@ -11,6 +11,9 @@
 #include "CommonConverters.hxx"
 #include <rtl/ustring.hxx>
 
+#include <vcl/window.hxx>
+#include <tools/gen.hxx>
+
 #include <algorithm>
 
 using namespace com::sun::star;
@@ -462,6 +465,362 @@ uno::Any DummyXShapes::getByIndex(sal_Int32 nIndex)
     return aShape;
 }
 
+bool DummyChart::initWindow()
+{
+    const SystemEnvData* sysData(mpWindow->GetSystemData());
+#if defined( WNT )
+    GLWin.hWnd = sysData->hWnd;
+#elif defined( UNX )
+    GLWin.dpy = reinterpret_cast<unx::Display*>(sysData->pDisplay);
+
+    if( unx::glXQueryExtension( GLWin.dpy, NULL, NULL ) == false )
+        return false;
+
+    GLWin.win = sysData->aWindow;
+
+    OSL_TRACE("parent window: %d", GLWin.win);
+
+    unx::XWindowAttributes xattr;
+    unx::XGetWindowAttributes( GLWin.dpy, GLWin.win, &xattr );
+
+    GLWin.screen = XScreenNumberOfScreen( xattr.screen );
+
+    unx::XVisualInfo* vi( NULL );
+#if defined( GLX_VERSION_1_3 ) && defined( GLX_EXT_texture_from_pixmap )
+    unx::XVisualInfo* visinfo;
+    unx::XVisualInfo* firstVisual( NULL );
+#endif
+    static int attrList3[] =
+    {
+        GLX_RGBA,//only TrueColor or DirectColor
+        //single buffered
+        GLX_RED_SIZE,4,//use the maximum red bits, with a minimum of 4 bits
+        GLX_GREEN_SIZE,4,//use the maximum green bits, with a minimum of 4 bits
+        GLX_BLUE_SIZE,4,//use the maximum blue bits, with a minimum of 4 bits
+        GLX_DEPTH_SIZE,0,//no depth buffer
+        None
+    };
+    static int attrList2[] =
+    {
+        GLX_RGBA,//only TrueColor or DirectColor
+        /// single buffered
+        GLX_RED_SIZE,4,/// use the maximum red bits, with a minimum of 4 bits
+        GLX_GREEN_SIZE,4,/// use the maximum green bits, with a minimum of 4 bits
+        GLX_BLUE_SIZE,4,/// use the maximum blue bits, with a minimum of 4 bits
+        GLX_DEPTH_SIZE,1,/// use the maximum depth bits, making sure there is a depth buffer
+        None
+    };
+    static int attrList1[] =
+    {
+        GLX_RGBA,//only TrueColor or DirectColor
+        GLX_DOUBLEBUFFER,/// only double buffer
+        GLX_RED_SIZE,4,/// use the maximum red bits, with a minimum of 4 bits
+        GLX_GREEN_SIZE,4,/// use the maximum green bits, with a minimum of 4 bits
+        GLX_BLUE_SIZE,4,/// use the maximum blue bits, with a minimum of 4 bits
+        GLX_DEPTH_SIZE,0,/// no depth buffer
+        None
+    };
+    static int attrList0[] =
+    {
+        GLX_RGBA,//only TrueColor or DirectColor
+        GLX_DOUBLEBUFFER,/// only double buffer
+        GLX_RED_SIZE,4,/// use the maximum red bits, with a minimum of 4 bits
+        GLX_GREEN_SIZE,4,/// use the maximum green bits, with a minimum of 4 bits
+        GLX_BLUE_SIZE,4,/// use the maximum blue bits, with a minimum of 4 bits
+        GLX_DEPTH_SIZE,1,/// use the maximum depth bits, making sure there is a depth buffer
+        None
+    };
+    static int* attrTable[] =
+    {
+        attrList0,
+        attrList1,
+        attrList2,
+        attrList3,
+        NULL
+    };
+    int** pAttributeTable = attrTable;
+    const SystemEnvData* pChildSysData = NULL;
+    pWindow.reset();
+
+#if defined( GLX_VERSION_1_3 ) && defined( GLX_EXT_texture_from_pixmap )
+    unx::GLXFBConfig* fbconfigs = NULL;
+    int nfbconfigs, value, i = 0;
+#endif
+
+    while( *pAttributeTable )
+    {
+        // try to find a visual for the current set of attributes
+        vi = unx::glXChooseVisual( GLWin.dpy,
+                GLWin.screen,
+                *pAttributeTable );
+
+#if defined( GLX_VERSION_1_3 ) && defined( GLX_EXT_texture_from_pixmap )
+        if( vi ) {
+            if( !firstVisual )
+                firstVisual = vi;
+            OSL_TRACE("trying VisualID %08X", vi->visualid);
+            fbconfigs = glXGetFBConfigs (GLWin.dpy, GLWin.screen, &nfbconfigs);
+
+            for ( ; i < nfbconfigs; i++)
+            {
+                visinfo = glXGetVisualFromFBConfig (GLWin.dpy, fbconfigs[i]);
+                if( !visinfo || visinfo->visualid != vi->visualid )
+                    continue;
+
+                glXGetFBConfigAttrib (GLWin.dpy, fbconfigs[i], GLX_DRAWABLE_TYPE, &value);
+                if (!(value & GLX_PIXMAP_BIT))
+                    continue;
+
+                glXGetFBConfigAttrib (GLWin.dpy, fbconfigs[i],
+                        GLX_BIND_TO_TEXTURE_TARGETS_EXT,
+                        &value);
+                if (!(value & GLX_TEXTURE_2D_BIT_EXT))
+                    continue;
+
+                glXGetFBConfigAttrib (GLWin.dpy, fbconfigs[i],
+                        GLX_BIND_TO_TEXTURE_RGB_EXT,
+                        &value);
+                if (value == sal_False)
+                    continue;
+
+                glXGetFBConfigAttrib (GLWin.dpy, fbconfigs[i],
+                        GLX_BIND_TO_MIPMAP_TEXTURE_EXT,
+                        &value);
+                if (value == sal_False)
+                    continue;
+
+                // TODO: handle non Y inverted cases
+                break;
+            }
+
+            if( i != nfbconfigs || ( firstVisual && pAttributeTable[1] == NULL ) ) {
+                if( i != nfbconfigs ) {
+                    vi = glXGetVisualFromFBConfig( GLWin.dpy, fbconfigs[i] );
+                    // TODO:moggi
+                    // mbHasTFPVisual = true;
+                    OSL_TRACE("found visual suitable for texture_from_pixmap");
+                } else {
+                    vi = firstVisual;
+                    // TODO:moggi
+                    // mbHasTFPVisual = false;
+                    OSL_TRACE("did not find visual suitable for texture_from_pixmap, using %08X", vi->visualid);
+                }
+#else
+                if( vi ) {
+#endif
+                    SystemWindowData winData;
+                    winData.nSize = sizeof(winData);
+                    OSL_TRACE("using VisualID %08X", vi->visualid);
+                    winData.pVisual = (void*)(vi->visual);
+                    pWindow.reset(new SystemChildWindow(mpWindow.get(), 0, &winData, sal_False));
+                    pChildSysData = pWindow->GetSystemData();
+
+                    if( pChildSysData ) {
+                        break;
+                    } else {
+                        pWindow.reset();
+                    }
+                }
+#if defined( GLX_VERSION_1_3 ) && defined( GLX_EXT_texture_from_pixmap )
+            }
+#endif
+
+            ++pAttributeTable;
+        }
+#endif
+
+#if defined( WNT )
+        SystemWindowData winData;
+        winData.nSize = sizeof(winData);
+        pWindow.reset(new SystemChildWindow(mpWindow.get(), 0, &winData, sal_False));
+#endif
+
+        if( pWindow )
+        {
+            pWindow->SetMouseTransparent( sal_True );
+            pWindow->SetParentClipMode( PARENTCLIPMODE_NOCLIP );
+            pWindow->EnableEraseBackground( sal_False );
+            pWindow->SetControlForeground();
+            pWindow->SetControlBackground();
+            pWindow->EnablePaint(sal_False);
+#if defined( WNT )
+            GLWin.hWnd = sysData->hWnd;
+#elif defined( UNX )
+            GLWin.dpy = reinterpret_cast<unx::Display*>(pChildSysData->pDisplay);
+            GLWin.win = pChildSysData->aWindow;
+#if defined( GLX_VERSION_1_3 ) && defined( GLX_EXT_texture_from_pixmap )
+            //TODO: moggi
+            /*
+            if( mbHasTFPVisual )
+                GLWin.fbc = fbconfigs[i];
+                */
+#endif
+            GLWin.vi = vi;
+            GLWin.GLXExtensions = unx::glXQueryExtensionsString( GLWin.dpy, GLWin.screen );
+            OSL_TRACE("available GLX extensions: %s", GLWin.GLXExtensions);
+#endif
+
+        return false;
+        }
+
+    return true;
+}
+
+namespace {
+
+static bool errorTriggered;
+int oglErrorHandler( unx::Display* /*dpy*/, unx::XErrorEvent* /*evnt*/ )
+{
+    errorTriggered = true;
+
+    return 0;
+}
+
+}
+
+bool DummyChart::initOpengl()
+{
+    mpWindow->setPosSizePixel(0,0,0,0);
+    GLWin.Width = 0;
+    GLWin.Height = 0;
+
+#if defined( WNT )
+    GLWin.hDC = GetDC(GLWin.hWnd);
+#elif defined( UNX )
+    GLWin.ctx = glXCreateContext(GLWin.dpy,
+                                 GLWin.vi,
+                                 0,
+                                 GL_TRUE);
+    if( GLWin.ctx == NULL )
+    {
+        OSL_TRACE("unable to create GLX context");
+        return false;
+    }
+#endif
+
+#if defined( WNT )
+    PIXELFORMATDESCRIPTOR PixelFormatFront =                    // PixelFormat Tells Windows How We Want Things To Be
+    {
+        sizeof(PIXELFORMATDESCRIPTOR),
+        1,                              // Version Number
+        PFD_DRAW_TO_WINDOW |
+        PFD_SUPPORT_OPENGL |
+        PFD_DOUBLEBUFFER,
+        PFD_TYPE_RGBA,                  // Request An RGBA Format
+        (BYTE)32,                       // Select Our Color Depth
+        0, 0, 0, 0, 0, 0,               // Color Bits Ignored
+        0,                              // No Alpha Buffer
+        0,                              // Shift Bit Ignored
+        0,                              // No Accumulation Buffer
+        0, 0, 0, 0,                     // Accumulation Bits Ignored
+        64,                             // 32 bit Z-BUFFER
+        0,                              // 0 bit stencil buffer
+        0,                              // No Auxiliary Buffer
+        0,                              // now ignored
+        0,                              // Reserved
+        0, 0, 0                         // Layer Masks Ignored
+    };
+    int WindowPix = ChoosePixelFormat(GLWin.hDC,&PixelFormatFront);
+    SetPixelFormat(GLWin.hDC,WindowPix,&PixelFormatFront);
+    GLWin.hRC  = wglCreateContext(GLWin.hDC);
+    wglMakeCurrent(GLWin.hDC,GLWin.hRC);
+#elif defined( UNX )
+    if( !glXMakeCurrent( GLWin.dpy, GLWin.win, GLWin.ctx ) )
+    {
+        OSL_TRACE("unable to select current GLX context");
+        return false;
+    }
+
+    int glxMinor, glxMajor;
+    double nGLXVersion = 0;
+    if( glXQueryVersion( GLWin.dpy, &glxMajor, &glxMinor ) )
+      nGLXVersion = glxMajor + 0.1*glxMinor;
+    OSL_TRACE("available GLX version: %f", nGLXVersion);
+
+    GLWin.GLExtensions = glGetString( GL_EXTENSIONS );
+    OSL_TRACE("available GL  extensions: %s", GLWin.GLExtensions);
+
+    // TODO: moggi
+    // mbTextureFromPixmap = GLWin.HasGLXExtension( "GLX_EXT_texture_from_pixmap" );
+    // mbGenerateMipmap = GLWin.HasGLExtension( "GL_SGIS_generate_mipmap" );
+
+    if( GLWin.HasGLXExtension("GLX_SGI_swap_control" ) )
+    {
+        // enable vsync
+        typedef GLint (*glXSwapIntervalProc)(GLint);
+        glXSwapIntervalProc glXSwapInterval = (glXSwapIntervalProc) unx::glXGetProcAddress( (const GLubyte*) "glXSwapIntervalSGI" );
+        if( glXSwapInterval ) {
+        int (*oldHandler)(unx::Display* /*dpy*/, unx::XErrorEvent* /*evnt*/);
+
+        // replace error handler temporarily
+        oldHandler = unx::XSetErrorHandler( oglErrorHandler );
+
+        errorTriggered = false;
+
+        glXSwapInterval( 1 );
+
+        // sync so that we possibly get an XError
+        unx::glXWaitGL();
+        XSync(GLWin.dpy, false);
+
+        if( errorTriggered )
+            OSL_TRACE("error when trying to set swap interval, NVIDIA or Mesa bug?");
+        else
+            OSL_TRACE("set swap interval to 1 (enable vsync)");
+
+        // restore the error handler
+        unx::XSetErrorHandler( oldHandler );
+        }
+    }
+#endif
+
+    glEnable(GL_CULL_FACE);
+    glCullFace(GL_BACK);
+    glClearColor (0, 0, 0, 0);
+    glClear(GL_COLOR_BUFFER_BIT);
+#if defined( WNT )
+    SwapBuffers(GLWin.hDC);
+#elif defined( UNX )
+    unx::glXSwapBuffers(GLWin.dpy, GLWin.win);
+#endif
+
+    glEnable(GL_LIGHTING);
+    GLfloat light_direction[] = { 0.0 , 0.0 , 1.0 };
+    GLfloat materialDiffuse[] = { 1.0 , 1.0 , 1.0 , 1.0};
+    glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, light_direction);
+    glMaterialfv(GL_FRONT,GL_DIFFUSE,materialDiffuse);
+    glEnable(GL_LIGHT0);
+    glEnable(GL_NORMALIZE);
+
+    return true;
+}
+
+DummyChart::DummyChart():
+    mpWindow(new Window(0, WB_NOBORDER|WB_NODIALOGCONTROL))
+{
+    setName("com.sun.star.chart2.shapes");
+    createGLContext();
+}
+
+void DummyChart::createGLContext()
+{
+
+}
+
+void DummyChart::setPosition( const awt::Point& aPosition )
+    throw( uno::RuntimeException )
+{
+    DummyXShape::setPosition(aPosition);
+}
+
+void DummyChart::setSize( const awt::Size& aSize )
+    throw( beans::PropertyVetoException, uno::RuntimeException )
+{
+    DummyXShape::setSize(aSize);
+    mpWindow->SetSizePixel(Size(aSize.Width, aSize.Height));
+    pWindow->SetSizePixel(Size(aSize.Width, aSize.Height));
+}
+
 }
 
 }
diff --git a/chart2/source/view/main/OpenglShapeFactory.cxx b/chart2/source/view/main/OpenglShapeFactory.cxx
index 4a45466..e535a25 100644
--- a/chart2/source/view/main/OpenglShapeFactory.cxx
+++ b/chart2/source/view/main/OpenglShapeFactory.cxx
@@ -77,10 +77,56 @@ using dummy::DummyCone;
 
 namespace opengl {
 
+namespace {
+
+uno::Reference< drawing::XShapes > getChartShape(
+    const uno::Reference< drawing::XDrawPage>& xDrawPage )
+{
+    uno::Reference< drawing::XShapes > xRet;
+    uno::Reference< drawing::XShapes > xShapes( xDrawPage, uno::UNO_QUERY );
+    if( xShapes.is() )
+    {
+        sal_Int32 nCount = xShapes->getCount();
+        uno::Reference< drawing::XShape > xShape;
+        for( sal_Int32 nN = nCount; nN--; )
+        {
+            if( xShapes->getByIndex( nN ) >>= xShape )
+            {
+
+                OUString aRet;
+
+                uno::Reference< beans::XPropertySet > xProp( xShape, uno::UNO_QUERY );
+                xProp->getPropertyValue( UNO_NAME_MISC_OBJ_NAME ) >>= aRet;
+                if( aRet.equals("com.sun.star.chart2.shapes") )
+                {
+                    xRet = uno::Reference< drawing::XShapes >( xShape, uno::UNO_QUERY );
+                    break;
+                }
+            }
+        }
+    }
+    return xRet;
+}
+
+}
+
 uno::Reference< drawing::XShapes > OpenglShapeFactory::getOrCreateChartRootShape(
-    const uno::Reference< drawing::XDrawPage>& )
+    const uno::Reference< drawing::XDrawPage>& xDrawPage )
+{
+    uno::Reference< drawing::XShapes > xRet( getChartShape( xDrawPage ) );
+    if( !xRet.is()  )
+    {
+        //create the root shape
+        xRet = new dummy::DummyChart();
+        xDrawPage->add(uno::Reference< drawing::XShape >(xRet, uno::UNO_QUERY_THROW));
+    }
+    return xRet;
+}
+
+void OpenglShapeFactory::setPageSize( uno::Reference < drawing::XShapes > xChartShapes, const awt::Size& rSize )
 {
-    return new dummy::DummyChart();
+    uno::Reference< drawing::XShape > xShape(xChartShapes, uno::UNO_QUERY_THROW);
+    xShape->setSize(rSize);
 }
 
 //  methods for 3D shape creation
diff --git a/chart2/source/view/main/ShapeFactory.cxx b/chart2/source/view/main/ShapeFactory.cxx
index 2bf11e4..17a89cb 100644
--- a/chart2/source/view/main/ShapeFactory.cxx
+++ b/chart2/source/view/main/ShapeFactory.cxx
@@ -74,6 +74,10 @@ uno::Reference< drawing::XShapes > ShapeFactory::getOrCreateChartRootShape(
     return xRet;
 }
 
+void ShapeFactory::setPageSize(uno::Reference< drawing::XShapes >, const awt::Size& )
+{
+}
+
 //  diverse PolyPolygon create methods
 
 uno::Any createPolyPolygon_Cube(


More information about the Libreoffice-commits mailing list