[Libreoffice-commits] core.git: Branch 'feature/gsoc-tiled-rendering' - libreofficekit/source

Pranav Kant pranavk at gnome.org
Wed Jul 15 11:10:58 PDT 2015


 libreofficekit/source/gtk/lokdocview.cxx |   41 ++++++++++++++++++++++---------
 1 file changed, 30 insertions(+), 11 deletions(-)

New commits:
commit 4a95948e8b7bdc7d40e58d0b2efa22b49f2867ec
Author: Pranav Kant <pranavk at gnome.org>
Date:   Wed Jul 15 23:39:09 2015 +0530

    lokdocview: [WIP] Trying to draw in a separate thread
    
    But it seems that this code is not able to correctly handle and
    paint the cairo contexts.
    
    Change-Id: I663d6ea4500ea8b132cb0371750f9970dd08ecb7

diff --git a/libreofficekit/source/gtk/lokdocview.cxx b/libreofficekit/source/gtk/lokdocview.cxx
index 0a5eca4..75e370b 100644
--- a/libreofficekit/source/gtk/lokdocview.cxx
+++ b/libreofficekit/source/gtk/lokdocview.cxx
@@ -715,11 +715,16 @@ renderGraphicHandle(LOKDocView* pDocView,
     }
 }
 
-
-static gboolean
-renderDocument(LOKDocView* pDocView, cairo_t* pCairo)
+static void
+renderDocument(GTask*,
+               gpointer source_object,
+               gpointer task_data,
+               GCancellable*)
 {
+    LOKDocView* pDocView = LOK_DOC_VIEW(source_object);
     LOKDocViewPrivate *priv = static_cast<LOKDocViewPrivate*>(lok_doc_view_get_instance_private (pDocView));
+    cairo_t* pCairo = static_cast<cairo_t*>(task_data);
+
     GdkRectangle aVisibleArea;
     long nDocumentWidthPixels = twipToPixel(priv->m_nDocumentWidthTwips, priv->m_fZoom);
     long nDocumentHeightPixels = twipToPixel(priv->m_nDocumentHeightTwips, priv->m_fZoom);
@@ -773,14 +778,17 @@ renderDocument(LOKDocView* pDocView, cairo_t* pCairo)
             }
         }
     }
-
-    return FALSE;
 }
 
-static gboolean
-renderOverlay(LOKDocView* pDocView, cairo_t* pCairo)
+static void
+renderOverlay(GTask*,
+              gpointer source_object,
+              gpointer task_data,
+              GCancellable*)
 {
+    LOKDocView* pDocView = LOK_DOC_VIEW(source_object);
     LOKDocViewPrivate *priv = static_cast<LOKDocViewPrivate*>(lok_doc_view_get_instance_private (pDocView));
+    cairo_t* pCairo = static_cast<cairo_t*>(task_data);
 
     if (priv->m_bEdit && priv->m_bCursorVisible && priv->m_bCursorOverlayVisible && !isEmptyRectangle(priv->m_aVisibleCursor))
     {
@@ -850,8 +858,6 @@ renderOverlay(LOKDocView* pDocView, cairo_t* pCairo)
         renderGraphicHandle(pDocView, pCairo, priv->m_aGraphicSelection, priv->m_pGraphicHandle);
         g_free (handleGraphicPath);
     }
-
-    return FALSE;
 }
 
 static gboolean
@@ -1144,12 +1150,25 @@ static void lok_doc_view_get_property (GObject* object, guint propId, GValue *va
     }
 }
 
+static void
+lokCairoFree(gpointer cairo)
+{
+    cairo_t* pCairo = static_cast<cairo_t*>(cairo);
+    cairo_destroy(pCairo);
+}
+
+
 static gboolean lok_doc_view_draw (GtkWidget* pWidget, cairo_t* pCairo)
 {
     LOKDocView *pDocView = LOK_DOC_VIEW (pWidget);
+    GTask* taskDocument = g_task_new(pDocView, NULL, NULL, NULL);
+    GTask* taskOverlay = g_task_new(pDocView, NULL, NULL, NULL);
+
+    g_task_set_task_data(taskDocument, cairo_reference(pCairo), lokCairoFree);
+    g_task_set_task_data(taskOverlay, cairo_reference(pCairo), lokCairoFree);
 
-    renderDocument (pDocView, pCairo);
-    renderOverlay (pDocView, pCairo);
+    g_task_run_in_thread(taskDocument, renderDocument);
+    g_task_run_in_thread(taskDocument, renderOverlay);
 
     return FALSE;
 }


More information about the Libreoffice-commits mailing list