kit/Kit.cpp                                |   89 +++++++++++++++++++++--------
 loleaflet/src/control/Control.LokDialog.js |   30 +++++----
 loleaflet/src/control/Toolbar.js           |    3 
 loleaflet/src/core/Socket.js               |   15 +++-
 loleaflet/src/layer/tile/TileLayer.js      |    5 -
 5 files changed, 99 insertions(+), 43 deletions(-)

New commits:
commit a2a72572bbc7f48b6772ea5481b004102b3f08a0
Author: Pranav Kant <pran...@collabora.co.uk>
Date:   Tue Nov 7 15:30:51 2017 +0530

    lokdialog: Paint only part of the dialog when specified
    
    Change-Id: I5543c95a48fd0192e5c654598991125bcaeb62e4
    Reviewed-on: https://gerrit.libreoffice.org/44519
    Reviewed-by: pranavk <pran...@collabora.co.uk>
    Tested-by: pranavk <pran...@collabora.co.uk>

diff --git a/kit/Kit.cpp b/kit/Kit.cpp
index d798ce88..1a7d87c1 100644
--- a/kit/Kit.cpp
+++ b/kit/Kit.cpp
@@ -851,10 +851,6 @@ public:
         assert(ws && "Expected a non-null websocket.");
 
         const bool child = tokens[0] == "dialogchild";
-        const int nCanvasWidth = 800;
-        const int nCanvasHeight = 600;
-        size_t pixmapDataSize = 4 * nCanvasWidth * nCanvasHeight;
-        std::vector<unsigned char> pixmap(pixmapDataSize);
 
         std::unique_lock<std::mutex> lock(_documentMutex);
         if (!_loKitDocument)
@@ -869,38 +865,83 @@ public:
             return;
         }
 
-        int nWidth = nCanvasWidth;
-        int nHeight = nCanvasHeight;
-        Timestamp timestamp;
+        int startX = 0, startY = 0;
+        int bufferWidth = 800, bufferHeight = 600; // hopefully, this is big 
enough
+        std::string paintRectangle;
+        // find the rectangle to paint, if specified
+        if (tokens.size() >= 3 && getTokenString(tokens[2], "rectangle", 
paintRectangle))
+        {
+            const std::vector<std::string> rectParts = 
LOOLProtocol::tokenize(paintRectangle.c_str(), paintRectangle.length(), ',');
+            startX = std::atoi(rectParts[0].c_str());
+            startY = std::atoi(rectParts[1].c_str());
+            bufferWidth = std::atoi(rectParts[2].c_str());
+            bufferHeight = std::atoi(rectParts[3].c_str());
+        }
+
+        size_t pixmapDataSize = 4 * bufferWidth * bufferHeight;
+        std::vector<unsigned char> pixmap(pixmapDataSize);
+
         char* pDialogTitle = nullptr;
+        int width = bufferWidth;
+        int height = bufferHeight;
+        std::string response;
         if (child)
-            _loKitDocument->paintActiveFloatingWindow(tokens[1].c_str(), 
pixmap.data(), nWidth, nHeight);
+        {
+            Timestamp timestamp;
+            _loKitDocument->paintActiveFloatingWindow(tokens[1].c_str(), 
pixmap.data(), width, height);
+            const auto elapsed = timestamp.elapsed();
+            const double area = width * height;
+            LOG_TRC("paintActiveFloatingWindow for " << tokens[1] << " 
returned floating window "
+                    << width << "X" << height << " "
+                    << "rendered in " << (elapsed/1000.)
+                    << "ms (" << area / elapsed << " MP/s).");
+
+            response = "dialogchildpaint: id=" + tokens[1] + " width=" + 
std::to_string(width) + " height=" + std::to_string(height) + "\n";
+        }
         else
-            _loKitDocument->paintDialog(tokens[1].c_str(), pixmap.data(), 
&pDialogTitle, nWidth, nHeight);
+        {
+            Timestamp timestamp;
+            _loKitDocument->paintDialog(tokens[1].c_str(), pixmap.data(), 
startX, startY, width, height);
+            const auto elapsed = timestamp.elapsed();
 
-        const double area = nWidth * nHeight;
-        const auto elapsed = timestamp.elapsed();
-        LOG_TRC((child ? std::string("paintActiveFloatingWindow") : 
std::string("paintDialog")) +
-                " for " << tokens[1] << " returned with size" << nWidth << "X" 
<< nHeight
-                << " and rendered in " << (elapsed/1000.) <<
-                " ms (" << area / elapsed << " MP/s).");
+            int dialogWidth = 0;
+            int dialogHeight = 0;
+            _loKitDocument->getDialogInfo(tokens[1].c_str(), &pDialogTitle, 
dialogWidth, dialogHeight);
 
-        std::string encodedDialogTitle;
-        if (pDialogTitle)
-        {
-            std::string aDialogTitle(pDialogTitle);
-            URI::encode(aDialogTitle, "", encodedDialogTitle);
-            free(pDialogTitle);
+            std::string encodedDialogTitle;
+            if (pDialogTitle)
+            {
+                std::string aDialogTitle(pDialogTitle);
+                URI::encode(aDialogTitle, "", encodedDialogTitle);
+                free(pDialogTitle);
+            }
+
+            // rendered width, height cannot be less than the dialog width, 
height
+            width = std::min(width, dialogWidth);
+            height = std::min(height, dialogHeight);
+            const double area = width * height;
+
+            LOG_TRC("paintDialog for " << tokens[1] << " returned " << width 
<< "X" << height
+                    << "@(" << startX << "," << startY << ")"
+                    << "and rendered in " << (elapsed/1000.)
+                    << "ms (" << area / elapsed << " MP/s).");
+
+            response = "dialogpaint: id=" + tokens[1] + " title=" + 
encodedDialogTitle +
+                " dialogwidth=" + std::to_string(dialogWidth) + " 
dialogheight=" + std::to_string(dialogHeight);
+
+            if (!paintRectangle.empty())
+                response += " rectangle=" + paintRectangle;
+
+            response += "\n";
         }
-        const std::string response = std::string(child ? "dialogchildpaint:" : 
"dialogpaint:") + " id=" + tokens[1] +
-            (!encodedDialogTitle.empty() ? " title=" + encodedDialogTitle : 
"") + " width=" + std::to_string(nWidth) + " height=" + std::to_string(nHeight) 
+ "\n";
+
         std::vector<char> output;
         output.reserve(response.size() + pixmapDataSize);
         output.resize(response.size());
         std::memcpy(output.data(), response.data(), response.size());
 
         // TODO: use png cache for dialogs too
-        if (!Png::encodeSubBufferToPNG(pixmap.data(), 0, 0, nWidth, nHeight, 
nCanvasWidth, nCanvasHeight, output, LOK_TILEMODE_RGBA))
+        if (!Png::encodeSubBufferToPNG(pixmap.data(), 0, 0, width, height, 
bufferWidth, bufferHeight, output, LOK_TILEMODE_RGBA))
         {
             LOG_ERR("Failed to encode into PNG.");
             return;
diff --git a/loleaflet/src/control/Control.LokDialog.js 
b/loleaflet/src/control/Control.LokDialog.js
index 65ebf07c..e7c2cd4c 100644
--- a/loleaflet/src/control/Control.LokDialog.js
+++ b/loleaflet/src/control/Control.LokDialog.js
@@ -23,13 +23,7 @@ L.Control.LokDialog = L.Control.extend({
                if (e.action === 'invalidate') {
                        // ignore any invalidate callbacks when we have closed 
the dialog
                        if (this._isOpen(e.dialogId)) {
-                               var rect = e.rectangle.match(/\d+g/);
-                               if (rect != null && rect.length == 4) {
-                                       var json = {
-                                               rectangle: e.rectangle
-                                       };
-                               }
-                               this._map.sendDialogCommand(e.dialogId, json);
+                               this._map.sendDialogCommand(e.dialogId, 
e.rectangle);
                        }
                } else if (e.action === 'close') {
                        this._onDialogClose(e.dialogId);
@@ -158,7 +152,7 @@ L.Control.LokDialog = L.Control.extend({
                delete this._dialogs[dialogId];
        },
 
-       _paintDialog: function(dialogId, title, imgData) {
+       _paintDialog: function(dialogId, title, rectangle, imgData) {
                if (!this._isOpen(dialogId))
                        return;
 
@@ -167,7 +161,15 @@ L.Control.LokDialog = L.Control.extend({
                var canvas = document.getElementById(dialogId + '-canvas');
                var ctx = canvas.getContext('2d');
                img.onload = function() {
-                       ctx.drawImage(img, 0, 0);
+                       var x = 0;
+                       var y = 0;
+                       if (rectangle) {
+                               rectangle = rectangle.split(',');
+                               x = parseInt(rectangle[0]);
+                               y = parseInt(rectangle[1]);
+                       }
+
+                       ctx.drawImage(img, x, y);
                };
                img.src = imgData;
        },
@@ -178,7 +180,7 @@ L.Control.LokDialog = L.Control.extend({
                {
                        var oldWidth = $('#' + dialogId + '-canvas').width();
                        var oldHeight = $('#' + dialogId + '-canvas').height();
-                       if (oldWidth === newWidth && oldHeight === newHeight)
+                       if (oldWidth == newWidth && oldHeight == newHeight)
                                ret = true;
                }
 
@@ -193,14 +195,14 @@ L.Control.LokDialog = L.Control.extend({
                        return;
 
                if (!this._isOpen(dialogId)) {
-                       this._launchDialog(dialogId, e.width, e.height);
-               } else if (!this._isSameSize(dialogId, e.width, e.height)) {
+                       this._launchDialog(dialogId, e.dialogWidth, 
e.dialogHeight);
+               } else if (!this._isSameSize(dialogId, e.dialogWidth, 
e.dialogHeight)) {
                        // size changed - destroy the old sized dialog
                        this._onDialogClose(dialogId);
-                       this._launchDialog(dialogId, e.width, e.height);
+                       this._launchDialog(dialogId, e.dialogWidth, 
e.dialogHeight);
                }
 
-               this._paintDialog(dialogId, e.title, e.dialog);
+               this._paintDialog(dialogId, e.title, e.rectangle, e.dialog);
        },
 
        _onDialogChildPaint: function(e) {
diff --git a/loleaflet/src/control/Toolbar.js b/loleaflet/src/control/Toolbar.js
index 960c02d4..46ebabea 100644
--- a/loleaflet/src/control/Toolbar.js
+++ b/loleaflet/src/control/Toolbar.js
@@ -146,6 +146,9 @@ L.Map.include({
                        var dialogCmd = 'dialog';
                        if (child)
                                dialogCmd = 'dialogchild';
+                       // make sure there are no spaces in rectangle
+                       if (rectangle)
+                               rectangle = rectangle.replace(/ /g, '');
                        this._socket.sendMessage(dialogCmd + ' ' + command + 
(rectangle ? ' rectangle=' + rectangle : ''));
                }
        },
diff --git a/loleaflet/src/core/Socket.js b/loleaflet/src/core/Socket.js
index 97faaae9..367e2f18 100644
--- a/loleaflet/src/core/Socket.js
+++ b/loleaflet/src/core/Socket.js
@@ -745,9 +745,6 @@ L.Socket = L.Class.extend({
                        else if (tokens[i].substring(0, 6) === 'width=') {
                                command.width = 
parseInt(tokens[i].substring(6));
                        }
-                       else if (tokens[i].substring(0, 6) === 'title=') {
-                               command.title = tokens[i].substring(6);
-                       }
                        else if (tokens[i].substring(0, 7) === 'height=') {
                                command.height = 
parseInt(tokens[i].substring(7));
                        }
@@ -813,6 +810,18 @@ L.Socket = L.Class.extend({
                        else if (tokens[i].startsWith('wid=')) {
                                command.wireId = 
this.getParameterValue(tokens[i]);
                        }
+                       else if (tokens[i].substring(0, 6) === 'title=') {
+                               command.title = tokens[i].substring(6);
+                       }
+                       else if (tokens[i].substring(0, 12) === 'dialogwidth=') 
{
+                               command.dialogwidth = tokens[i].substring(12);
+                       }
+                       else if (tokens[i].substring(0, 13) === 
'dialogheight=') {
+                               command.dialogheight = tokens[i].substring(13);
+                       }
+                       else if (tokens[i].substring(0, 10) === 'rectangle=') {
+                               command.rectangle = tokens[i].substring(10);
+                       }
                }
                if (command.tileWidth && command.tileHeight && 
this._map._docLayer) {
                        var defaultZoom = this._map.options.zoom;
diff --git a/loleaflet/src/layer/tile/TileLayer.js 
b/loleaflet/src/layer/tile/TileLayer.js
index 65f1c5c3..7ee9c90c 100644
--- a/loleaflet/src/layer/tile/TileLayer.js
+++ b/loleaflet/src/layer/tile/TileLayer.js
@@ -1200,8 +1200,9 @@ L.TileLayer = L.GridLayer.extend({
                        dialog: img,
                        title: command.title,
                        // TODO: add id too
-                       width: command.width,
-                       height: command.height
+                       dialogWidth: command.dialogwidth,
+                       dialogHeight: command.dialogheight,
+                       rectangle: command.rectangle
                });
        },
 
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to