[Libreoffice-commits] online.git: common/Rectangle.hpp wsd/ClientSession.cpp

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Wed Aug 22 11:50:57 UTC 2018


 common/Rectangle.hpp  |   10 ++++++++++
 wsd/ClientSession.cpp |   18 ++++++++----------
 2 files changed, 18 insertions(+), 10 deletions(-)

New commits:
commit 25e1a01a3c3df8bf412db7819536ed0a36196320
Author:     Tamás Zolnai <tamas.zolnai at collabora.com>
AuthorDate: Tue Aug 21 17:15:02 2018 +0200
Commit:     Tamás Zolnai <tamas.zolnai at collabora.com>
CommitDate: Wed Aug 22 13:49:23 2018 +0200

    Handle tiles hanging out the visible area
    
    A problem comes up when only a part of the tile is visible
    on the client side and invalidation affects the invisible
    part of this tile. To get back the old / right behavior we
    need to request this kind of tiles too.

diff --git a/common/Rectangle.hpp b/common/Rectangle.hpp
index 1300aa71a..6089f863d 100644
--- a/common/Rectangle.hpp
+++ b/common/Rectangle.hpp
@@ -78,6 +78,16 @@ struct Rectangle
     {
         return _x1 < _x2 && _y1 < _y2;
     }
+
+    bool intersects(const Rectangle& rOther)
+    {
+        Util::Rectangle intersection;
+        intersection._x1 = std::max(_x1, rOther._x1);
+        intersection._y1 = std::max(_y1, rOther._y1);
+        intersection._x2 = std::min(_x2, rOther._x2);
+        intersection._y2 = std::min(_y2, rOther._y2);
+        return intersection.isValid();
+    }
 };
 
 }
diff --git a/wsd/ClientSession.cpp b/wsd/ClientSession.cpp
index 90e099d38..01398fedb 100644
--- a/wsd/ClientSession.cpp
+++ b/wsd/ClientSession.cpp
@@ -1154,18 +1154,16 @@ void ClientSession::handleTileInvalidation(const std::string& message,
     std::vector<TileDesc> invalidTiles;
     if(part == _clientSelectedPart || _isTextDocument)
     {
-        Util::Rectangle intersection;
-        intersection._x1 = std::max(invalidateRect._x1, _clientVisibleArea._x1);
-        intersection._y1 = std::max(invalidateRect._y1, _clientVisibleArea._y1);
-        intersection._x2 = std::min(invalidateRect._x2, _clientVisibleArea._x2);
-        intersection._y2 = std::min(invalidateRect._y2, _clientVisibleArea._y2);
-        if(intersection.isValid()) // Client visible area and invalidated rectangle has intersection
+        // Iterate through visible tiles
+        for(int i = std::ceil(_clientVisibleArea._y1 / _tileHeightTwips);
+                    i <= std::ceil(_clientVisibleArea._y2 / _tileHeightTwips); ++i)
         {
-            for(int i = std::ceil(intersection._y1 / _tileHeightTwips);
-                    i <= std::ceil(intersection._y2 / _tileHeightTwips); ++i)
+            for(int j = std::ceil(_clientVisibleArea._x1 / _tileWidthTwips);
+                j <= std::ceil(_clientVisibleArea._x2 / _tileWidthTwips); ++j)
             {
-                for(int j = std::ceil(intersection._x1 / _tileWidthTwips);
-                    j <= std::ceil(intersection._x2 / _tileWidthTwips); ++j)
+                // Find tiles affected by invalidation
+                Util::Rectangle tileRect (j * _tileWidthTwips, i * _tileHeightTwips, _tileWidthTwips, _tileHeightTwips);
+                if(invalidateRect.intersects(tileRect))
                 {
                     invalidTiles.emplace_back(TileDesc(part, _tileWidthPixel, _tileHeightPixel, j * _tileWidthTwips, i * _tileHeightTwips, _tileWidthTwips, _tileHeightTwips, -1, 0, -1, false));
 


More information about the Libreoffice-commits mailing list