Blame SOURCES/0261-lokdocview-Separate-painting-and-saving-of-tiles.patch

f325b2
From a47531dc2f5b90eedb4afb4dd2b3b52fb5a59365 Mon Sep 17 00:00:00 2001
f325b2
From: Pranav Kant <pranavk@libreoffice.org>
f325b2
Date: Sun, 1 Nov 2015 13:22:25 +0530
f325b2
Subject: [PATCH 261/398] lokdocview: Separate "painting" and "saving" of tiles
f325b2
f325b2
Lets separate the task of painting the tile, and saving the tile
f325b2
in tile buffer using GAsyncReadyCallback. This will provide us
f325b2
with better control over tiles -- cancelling the painting operation,
f325b2
and filtering tiles that should not be saved in the tile buffer.
f325b2
f325b2
Change-Id: I6aae928d8cc0c906034570ed0e9a054763d493a3
f325b2
Reviewed-on: https://gerrit.libreoffice.org/19725
f325b2
Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk>
f325b2
Tested-by: Miklos Vajna <vmiklos@collabora.co.uk>
f325b2
(cherry picked from commit de0c7e1783edc6a36037f2657f823dc9812c0804)
f325b2
---
f325b2
 libreofficekit/source/gtk/lokdocview.cxx | 56 ++++++++++++++++++++++++++++----
f325b2
 libreofficekit/source/gtk/tilebuffer.cxx | 10 ------
f325b2
 2 files changed, 49 insertions(+), 17 deletions(-)
f325b2
f325b2
diff --git a/libreofficekit/source/gtk/lokdocview.cxx b/libreofficekit/source/gtk/lokdocview.cxx
f325b2
index 2ec27305af4e..867c0d165448 100644
f325b2
--- a/libreofficekit/source/gtk/lokdocview.cxx
f325b2
+++ b/libreofficekit/source/gtk/lokdocview.cxx
f325b2
@@ -873,6 +873,47 @@ renderGraphicHandle(LOKDocView* pDocView,
f325b2
     }
f325b2
 }
f325b2
 
f325b2
+/// Finishes the paint tile operation and returns the result, if any
f325b2
+static gpointer
f325b2
+paintTileFinish(LOKDocView* pDocView, GAsyncResult* res, GError **error)
f325b2
+{
f325b2
+    GTask* task = G_TASK(res);
f325b2
+
f325b2
+    g_return_val_if_fail(LOK_IS_DOC_VIEW(pDocView), NULL);
f325b2
+    g_return_val_if_fail(g_task_is_valid(res, pDocView), NULL);
f325b2
+    g_return_val_if_fail(error == NULL || *error == NULL, NULL);
f325b2
+
f325b2
+    return g_task_propagate_pointer(task, error);
f325b2
+}
f325b2
+
f325b2
+/// Callback called in the main UI thread when paintTileInThread in LOK thread has finished
f325b2
+static void
f325b2
+paintTileCallback(GObject* sourceObject, GAsyncResult* res, gpointer userData)
f325b2
+{
f325b2
+    LOKDocView* pDocView = LOK_DOC_VIEW(sourceObject);
f325b2
+    LOKDocViewPrivate& priv = getPrivate(pDocView);
f325b2
+    LOEvent* pLOEvent = static_cast<LOEvent*>(userData);
f325b2
+    std::unique_ptr<TileBuffer>& buffer = priv->m_pTileBuffer;
f325b2
+    int index = pLOEvent->m_nPaintTileX * buffer->m_nWidth + pLOEvent->m_nPaintTileY;
f325b2
+    GError* error;
f325b2
+
f325b2
+    error = NULL;
f325b2
+    GdkPixbuf* pPixBuf = static_cast<GdkPixbuf*>(paintTileFinish(pDocView, res, &error));
f325b2
+    if (error != NULL)
f325b2
+    {
f325b2
+        g_warning("Unable to get painted GdkPixbuf: %s", error->message);
f325b2
+        g_error_free(error);
f325b2
+        return;
f325b2
+    }
f325b2
+
f325b2
+    buffer->m_mTiles[index].setPixbuf(pPixBuf);
f325b2
+    buffer->m_mTiles[index].valid = true;
f325b2
+    gdk_threads_add_idle(queueDraw, GTK_WIDGET(pDocView));
f325b2
+
f325b2
+    g_object_unref(pPixBuf);
f325b2
+}
f325b2
+
f325b2
+
f325b2
 static gboolean
f325b2
 renderDocument(LOKDocView* pDocView, cairo_t* pCairo)
f325b2
 {
f325b2
@@ -921,7 +962,13 @@ renderDocument(LOKDocView* pDocView, cairo_t* pCairo)
f325b2
 
f325b2
             if (bPaint)
f325b2
             {
f325b2
-                GTask* task = g_task_new(pDocView, NULL, NULL, NULL);
f325b2
+                LOEvent* pLOEvent = new LOEvent(LOK_PAINT_TILE);
f325b2
+                pLOEvent->m_nPaintTileX = nRow;
f325b2
+                pLOEvent->m_nPaintTileY = nColumn;
f325b2
+                pLOEvent->m_fPaintTileZoom = priv->m_fZoom;
f325b2
+                GTask* task = g_task_new(pDocView, NULL, paintTileCallback, pLOEvent);
f325b2
+                g_task_set_task_data(task, pLOEvent, LOEvent::destroy);
f325b2
+
f325b2
                 Tile& currentTile = priv->m_pTileBuffer->getTile(nRow, nColumn, priv->m_fZoom, task, priv->lokThreadPool);
f325b2
                 GdkPixbuf* pPixBuf = currentTile.getBuffer();
f325b2
                 gdk_cairo_set_source_pixbuf (pCairo, pPixBuf,
f325b2
@@ -1516,12 +1563,7 @@ paintTileInThread (gpointer data)
f325b2
                                          pixelToTwip(nTileSizePixels, pLOEvent->m_fPaintTileZoom),
f325b2
                                          pixelToTwip(nTileSizePixels, pLOEvent->m_fPaintTileZoom));
f325b2
 
f325b2
-    //create a mapping for it
f325b2
-    buffer->m_mTiles[index].setPixbuf(pPixBuf);
f325b2
-    buffer->m_mTiles[index].valid = true;
f325b2
-    gdk_threads_add_idle(queueDraw, GTK_WIDGET(pDocView));
f325b2
-
f325b2
-    g_object_unref(pPixBuf);
f325b2
+    g_task_return_pointer(task, pPixBuf, g_object_unref);
f325b2
 }
f325b2
 
f325b2
 
f325b2
diff --git a/libreofficekit/source/gtk/tilebuffer.cxx b/libreofficekit/source/gtk/tilebuffer.cxx
f325b2
index 811fcc61ef46..6c9847674e53 100644
f325b2
--- a/libreofficekit/source/gtk/tilebuffer.cxx
f325b2
+++ b/libreofficekit/source/gtk/tilebuffer.cxx
f325b2
@@ -93,11 +93,6 @@ Tile& TileBuffer::getTile(int x, int y, float fZoom, GTask* task,
f325b2
 
f325b2
     if (m_mTiles.find(index) != m_mTiles.end() && !m_mTiles[index].valid)
f325b2
     {
f325b2
-        LOEvent* pLOEvent = new LOEvent(LOK_PAINT_TILE);
f325b2
-        pLOEvent->m_nPaintTileX = x;
f325b2
-        pLOEvent->m_nPaintTileY = y;
f325b2
-        pLOEvent->m_fPaintTileZoom = fZoom;
f325b2
-        g_task_set_task_data(task, pLOEvent, LOEvent::destroy);
f325b2
         g_thread_pool_push(lokThreadPool, g_object_ref(task), &error);
f325b2
         if (error != NULL)
f325b2
         {
f325b2
@@ -108,11 +103,6 @@ Tile& TileBuffer::getTile(int x, int y, float fZoom, GTask* task,
f325b2
     }
f325b2
     else if(m_mTiles.find(index) == m_mTiles.end())
f325b2
     {
f325b2
-        LOEvent* pLOEvent = new LOEvent(LOK_PAINT_TILE);
f325b2
-        pLOEvent->m_nPaintTileX = x;
f325b2
-        pLOEvent->m_nPaintTileY = y;
f325b2
-        pLOEvent->m_fPaintTileZoom = fZoom;
f325b2
-        g_task_set_task_data(task, pLOEvent, LOEvent::destroy);
f325b2
         g_thread_pool_push(lokThreadPool, g_object_ref(task), &error);
f325b2
         if (error != NULL)
f325b2
         {
f325b2
-- 
f325b2
2.12.0
f325b2