common/RenderTiles.hpp | 62 +++++++++++++++++++++++++++---------------------- kit/Kit.cpp | 37 +++++++++++++---------------- 2 files changed, 52 insertions(+), 47 deletions(-)
New commits: commit b673417946ebe916cc5e4fd1997d82452f19bb47 Author: Tor Lillqvist <[email protected]> AuthorDate: Mon Jul 13 00:43:51 2020 +0300 Commit: Tor Lillqvist <[email protected]> CommitDate: Mon Jul 13 16:39:59 2020 +0200 More re-factoring of tile rendering This is for the benefit of a next-gen iOS app (without FakeSockets and much of the current Online plumbing). This is not supposed to cause any functional changes in normal Online even if code is organised a bit differently. Change-Id: Ib09a84ff5d3ba858cf3f50553d76757966af7ad2 Reviewed-on: https://gerrit.libreoffice.org/c/online/+/98655 Tested-by: Jenkins Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Tor Lillqvist <[email protected]> diff --git a/common/RenderTiles.hpp b/common/RenderTiles.hpp index fece9f3af..03308879b 100644 --- a/common/RenderTiles.hpp +++ b/common/RenderTiles.hpp @@ -348,17 +348,6 @@ namespace RenderTiles unsigned char *data() { return _data; } }; - class WatermarkBlender - { - public: - virtual void blendWatermark(TileCombined &tileCombined, - unsigned char *data, - int offsetX, int offsetY, - size_t pixmapWidth, size_t pixmapHeight, - int pixelWidth, int pixelHeight, - LibreOfficeKitTileMode mode) = 0; - }; - static void pushRendered(std::vector<TileDesc> &renderedTiles, const TileDesc &desc, TileWireId wireId, size_t imgSize) { @@ -369,12 +358,15 @@ namespace RenderTiles bool doRender(std::shared_ptr<lok::Document> document, TileCombined &tileCombined, - WatermarkBlender &watermarkBlender, - std::unique_ptr<char[]> &response, - size_t &responseSize, PngCache &pngCache, ThreadPool &pngPool, - bool combined) + bool combined, + const std::function<void (unsigned char *data, + int offsetX, int offsetY, + size_t pixmapWidth, size_t pixmapHeight, + int pixelWidth, int pixelHeight, + LibreOfficeKitTileMode mode)>& blendWatermark, + const std::function<void (const char *buffer, size_t length)>& outputMessage) { auto& tiles = tileCombined.getTiles(); @@ -453,11 +445,10 @@ namespace RenderTiles const int offsetX = positionX * pixelWidth; const int offsetY = positionY * pixelHeight; - watermarkBlender.blendWatermark(tileCombined, - pixmap.data(), offsetX, offsetY, - pixmapWidth, pixmapHeight, - pixelWidth, pixelHeight, - mode); + blendWatermark(pixmap.data(), offsetX, offsetY, + pixmapWidth, pixmapHeight, + pixelWidth, pixelHeight, + mode); const uint64_t hash = Png::hashSubBuffer(pixmap.data(), offsetX, offsetY, pixelWidth, pixelHeight, pixmapWidth, pixmapHeight); @@ -572,16 +563,33 @@ namespace RenderTiles std::string tileMsg; if (combined) + { tileMsg = tileCombined.serialize("tilecombine:", ADD_DEBUG_RENDERID, renderedTiles); - else - tileMsg = tiles[0].serialize("tile:", ADD_DEBUG_RENDERID); - LOG_TRC("Sending back painted tiles for " << tileMsg << " of size " << output.size() << " bytes) for: " << tileMsg); + LOG_TRC("Sending back painted tiles for " << tileMsg << " of size " << output.size() << " bytes) for: " << tileMsg); - responseSize = tileMsg.size() + output.size(); - response.reset(new char[responseSize]); - std::copy(tileMsg.begin(), tileMsg.end(), response.get()); - std::copy(output.begin(), output.end(), response.get() + tileMsg.size()); + std::unique_ptr<char[]> response; + const size_t responseSize = tileMsg.size() + output.size(); + response.reset(new char[responseSize]); + std::copy(tileMsg.begin(), tileMsg.end(), response.get()); + std::copy(output.begin(), output.end(), response.get() + tileMsg.size()); + outputMessage(response.get(), responseSize); + } + else + { + size_t outputOffset = 0; + for (auto &i : renderedTiles) + { + tileMsg = i.serialize("tile:", ADD_DEBUG_RENDERID); + const size_t responseSize = tileMsg.size() + i.getImgSize(); + std::unique_ptr<char[]> response; + response.reset(new char[responseSize]); + std::copy(tileMsg.begin(), tileMsg.end(), response.get()); + std::copy(output.begin() + outputOffset, output.begin() + outputOffset + i.getImgSize(), response.get() + tileMsg.size()); + outputMessage(response.get(), responseSize); + outputOffset += i.getImgSize(); + } + } return true; } diff --git a/kit/Kit.cpp b/kit/Kit.cpp index 810118c22..f10493e50 100644 --- a/kit/Kit.cpp +++ b/kit/Kit.cpp @@ -420,7 +420,7 @@ namespace /// per process. But for security reasons don't. /// However, we could have a loolkit instance /// per user or group of users (a trusted circle). -class Document final : public DocumentManagerInterface, public RenderTiles::WatermarkBlender +class Document final : public DocumentManagerInterface { public: /// We have two types of password protected documents @@ -630,20 +630,6 @@ public: renderTiles(tileCombined, true); } - void blendWatermark(TileCombined &tileCombined, - unsigned char *data, int offsetX, int offsetY, - size_t pixmapWidth, size_t pixmapHeight, - int pixelWidth, int pixelHeight, - LibreOfficeKitTileMode mode) override - { - const auto session = _sessions.findByCanonicalId(tileCombined.getNormalizedViewId()); - if (session->hasWatermark()) - session->_docWatermark->blending(data, offsetX, offsetY, - pixmapWidth, pixmapHeight, - pixelWidth, pixelHeight, - mode); - } - void renderTiles(TileCombined &tileCombined, bool combined) { // Find a session matching our view / render settings. @@ -672,15 +658,26 @@ public: _loKitDocument->setView(session->getViewId()); #endif - std::unique_ptr<char[]> response; - size_t responseSize; - if (!RenderTiles::doRender(_loKitDocument, tileCombined, *this, response, responseSize, _pngCache, _pngPool, combined)) + if (!RenderTiles::doRender(_loKitDocument, tileCombined, _pngCache, _pngPool, combined, + [&](unsigned char *data, + int offsetX, int offsetY, + size_t pixmapWidth, size_t pixmapHeight, + int pixelWidth, int pixelHeight, + LibreOfficeKitTileMode mode) { + if (session->hasWatermark()) + session->_docWatermark->blending(data, offsetX, offsetY, + pixmapWidth, pixmapHeight, + pixelWidth, pixelHeight, + mode); + }, + [&](const char *buffer, size_t length) { + postMessage(buffer, length, WSOpCode::Binary); + } + )) { LOG_DBG("All tiles skipped, not producing empty tilecombine: message"); return; } - - postMessage(response.get(), responseSize, WSOpCode::Binary); } bool sendTextFrame(const std::string& message) _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
