loolwsd/ChildProcessSession.cpp | 151 --------------------------------------- loolwsd/ChildProcessSession.hpp | 2 loolwsd/DocumentBroker.cpp | 4 + loolwsd/LOOLKit.cpp | 146 +++++++++++++++++++++++++++++++++++++ loolwsd/LOOLSession.hpp | 4 - loolwsd/MasterProcessSession.hpp | 4 - 6 files changed, 153 insertions(+), 158 deletions(-)
New commits: commit df67c4a31c1f7ccd26d861300787e0033eddd9f1 Author: Ashod Nakashian <ashod.nakash...@collabora.co.uk> Date: Tue May 3 07:47:58 2016 -0400 loolwsd: move tilecombine handling into lokit Change-Id: I32854769c5260444b0e97c112a141028f1cda179 Reviewed-on: https://gerrit.libreoffice.org/24641 Reviewed-by: Ashod Nakashian <ashnak...@gmail.com> Tested-by: Ashod Nakashian <ashnak...@gmail.com> diff --git a/loolwsd/ChildProcessSession.cpp b/loolwsd/ChildProcessSession.cpp index 5ca7d6e..6843b24 100644 --- a/loolwsd/ChildProcessSession.cpp +++ b/loolwsd/ChildProcessSession.cpp @@ -441,14 +441,10 @@ bool ChildProcessSession::_handleInput(const char *buffer, int length) { return getStatus(buffer, length); } - else if (tokens[0] == "tile") + else if (tokens[0] == "tile" || tokens[0] == "tilecombine") { assert(!"Tile traffic should go through the DocumentBroker-LoKit WS."); } - else if (tokens[0] == "tilecombine") - { - sendCombinedTiles(buffer, length, tokens); - } else { // All other commands are such that they always require a LibreOfficeKitDocument session, @@ -725,151 +721,6 @@ namespace { } } -void ChildProcessSession::sendCombinedTiles(const char* /*buffer*/, int /*length*/, StringTokenizer& tokens) -{ - int part, pixelWidth, pixelHeight, tileWidth, tileHeight; - std::string tilePositionsX, tilePositionsY; - std::string reqTimestamp; - - if (tokens.count() < 8 || - !getTokenInteger(tokens[1], "part", part) || - !getTokenInteger(tokens[2], "width", pixelWidth) || - !getTokenInteger(tokens[3], "height", pixelHeight) || - !getTokenString (tokens[4], "tileposx", tilePositionsX) || - !getTokenString (tokens[5], "tileposy", tilePositionsY) || - !getTokenInteger(tokens[6], "tilewidth", tileWidth) || - !getTokenInteger(tokens[7], "tileheight", tileHeight)) - { - sendTextFrame("error: cmd=tilecombine kind=syntax"); - return; - } - - if (part < 0 || pixelWidth <= 0 || pixelHeight <= 0 - || tileWidth <= 0 || tileHeight <= 0 - || tilePositionsX.empty() || tilePositionsY.empty()) - { - sendTextFrame("error: cmd=tilecombine kind=invalid"); - return; - } - - if (tokens.count() > 8) - getTokenString(tokens[8], "timestamp", reqTimestamp); - - bool makeSlow = delayAndRewritePart(part); - - Util::Rectangle renderArea; - - StringTokenizer positionXtokens(tilePositionsX, ",", StringTokenizer::TOK_IGNORE_EMPTY | StringTokenizer::TOK_TRIM); - StringTokenizer positionYtokens(tilePositionsY, ",", StringTokenizer::TOK_IGNORE_EMPTY | StringTokenizer::TOK_TRIM); - - size_t numberOfPositions = positionYtokens.count(); - // check that number of positions for X and Y is the same - if (numberOfPositions != positionYtokens.count()) - { - sendTextFrame("error: cmd=tilecombine kind=invalid"); - return; - } - - std::vector<Util::Rectangle> tiles; - tiles.reserve(numberOfPositions); - - for (size_t i = 0; i < numberOfPositions; ++i) - { - int x = 0; - if (!stringToInteger(positionXtokens[i], x)) - { - sendTextFrame("error: cmd=tilecombine kind=syntax"); - return; - } - - int y = 0; - if (!stringToInteger(positionYtokens[i], y)) - { - sendTextFrame("error: cmd=tilecombine kind=syntax"); - return; - } - - Util::Rectangle rectangle(x, y, tileWidth, tileHeight); - - if (tiles.empty()) - { - renderArea = rectangle; - } - else - { - renderArea.extend(rectangle); - } - - tiles.push_back(rectangle); - } - - if (_docType != "text" && part != _loKitDocument->pClass->getPart(_loKitDocument)) - { - _loKitDocument->pClass->setPart(_loKitDocument, part); - } - - LibreOfficeKitTileMode mode = static_cast<LibreOfficeKitTileMode>(_loKitDocument->pClass->getTileMode(_loKitDocument)); - - int tilesByX = renderArea.getWidth() / tileWidth; - int tilesByY = renderArea.getHeight() / tileHeight; - - int pixmapWidth = tilesByX * pixelWidth; - int pixmapHeight = tilesByY * pixelHeight; - - const size_t pixmapSize = 4 * pixmapWidth * pixmapHeight; - - std::vector<unsigned char> pixmap(pixmapSize, 0); - - Timestamp timestamp; - _loKitDocument->pClass->paintTile(_loKitDocument, pixmap.data(), pixmapWidth, pixmapHeight, - renderArea.getLeft(), renderArea.getTop(), - renderArea.getWidth(), renderArea.getHeight()); - - Log::debug() << "paintTile (combined) called, tile at [" << renderArea.getLeft() << ", " << renderArea.getTop() << "]" - << " (" << renderArea.getWidth() << ", " << renderArea.getHeight() << ") rendered in " - << double(timestamp.elapsed())/1000 << "ms" << Log::end; - - for (Util::Rectangle& tileRect : tiles) - { - std::string response = "tile: part=" + std::to_string(part) + - " width=" + std::to_string(pixelWidth) + - " height=" + std::to_string(pixelHeight) + - " tileposx=" + std::to_string(tileRect.getLeft()) + - " tileposy=" + std::to_string(tileRect.getTop()) + - " tilewidth=" + std::to_string(tileWidth) + - " tileheight=" + std::to_string(tileHeight); - - if (reqTimestamp != "") - response += " timestamp=" + reqTimestamp; - -#if ENABLE_DEBUG - response += " renderid=" + Util::UniqueId(); -#endif - - response += "\n"; - - std::vector<char> output; - output.reserve(pixelWidth * pixelHeight * 4 + response.size()); - output.resize(response.size()); - - std::copy(response.begin(), response.end(), output.begin()); - - int positionX = (tileRect.getLeft() - renderArea.getLeft()) / tileWidth; - int positionY = (tileRect.getTop() - renderArea.getTop()) / tileHeight; - - if (!Util::encodeSubBufferToPNG(pixmap.data(), positionX * pixelWidth, positionY * pixelHeight, pixelWidth, pixelHeight, pixmapWidth, pixmapHeight, output, mode)) - { - sendTextFrame("error: cmd=tile kind=failure"); - return; - } - - sendBinaryFrame(output.data(), output.size()); - } - - if (makeSlow) - delay(); -} - bool ChildProcessSession::clientZoom(const char* /*buffer*/, int /*length*/, StringTokenizer& tokens) { int tilePixelWidth, tilePixelHeight, tileTwipWidth, tileTwipHeight; diff --git a/loolwsd/ChildProcessSession.hpp b/loolwsd/ChildProcessSession.hpp index ec6855e..8a760cb 100644 --- a/loolwsd/ChildProcessSession.hpp +++ b/loolwsd/ChildProcessSession.hpp @@ -67,8 +67,6 @@ public: protected: virtual bool loadDocument(const char *buffer, int length, Poco::StringTokenizer& tokens) override; - virtual void sendCombinedTiles(const char *buffer, int length, Poco::StringTokenizer& tokens) override; - virtual void sendFontRendering(const char *buffer, int length, Poco::StringTokenizer& tokens) override; bool clientZoom(const char *buffer, int length, Poco::StringTokenizer& tokens); diff --git a/loolwsd/DocumentBroker.cpp b/loolwsd/DocumentBroker.cpp index a390320..9f5c0a3 100644 --- a/loolwsd/DocumentBroker.cpp +++ b/loolwsd/DocumentBroker.cpp @@ -393,6 +393,10 @@ void DocumentBroker::handleTileRequest(int part, int width, int height, int tile int tilePosY, int tileWidth, int tileHeight, const std::shared_ptr<MasterProcessSession>& session) { + Log::trace() << "Tile request for part: " << part << ", width: " << width << ", height: " << height + << ", tilePosX: " << tilePosX << ", tilePosY: " << tilePosY << ", tileWidth: " << tileWidth + << ", tileHeight: " << tileHeight << Log::end; + std::unique_lock<std::mutex> lock(_mutex); std::unique_ptr<std::fstream> cachedTile = tileCache().lookupTile(part, width, height, tilePosX, tilePosY, tileWidth, tileHeight); diff --git a/loolwsd/LOOLKit.cpp b/loolwsd/LOOLKit.cpp index a5269a9..2262e78 100644 --- a/loolwsd/LOOLKit.cpp +++ b/loolwsd/LOOLKit.cpp @@ -661,6 +661,152 @@ public: ws->sendFrame(output.data(), length, WebSocket::FRAME_BINARY); } + void sendCombinedTiles(const char* /*buffer*/, int /*length*/, StringTokenizer& tokens) + { + int part, pixelWidth, pixelHeight, tileWidth, tileHeight; + std::string tilePositionsX, tilePositionsY; + std::string reqTimestamp; + + if (tokens.count() < 8 || + !getTokenInteger(tokens[1], "part", part) || + !getTokenInteger(tokens[2], "width", pixelWidth) || + !getTokenInteger(tokens[3], "height", pixelHeight) || + !getTokenString (tokens[4], "tileposx", tilePositionsX) || + !getTokenString (tokens[5], "tileposy", tilePositionsY) || + !getTokenInteger(tokens[6], "tilewidth", tileWidth) || + !getTokenInteger(tokens[7], "tileheight", tileHeight)) + { + //sendTextFrame("error: cmd=tilecombine kind=syntax"); + return; + } + + if (part < 0 || pixelWidth <= 0 || pixelHeight <= 0 + || tileWidth <= 0 || tileHeight <= 0 + || tilePositionsX.empty() || tilePositionsY.empty()) + { + //sendTextFrame("error: cmd=tilecombine kind=invalid"); + return; + } + + if (tokens.count() > 8) + getTokenString(tokens[8], "timestamp", reqTimestamp); +/* + bool makeSlow = delayAndRewritePart(part); + + Util::Rectangle renderArea; + + StringTokenizer positionXtokens(tilePositionsX, ",", StringTokenizer::TOK_IGNORE_EMPTY | StringTokenizer::TOK_TRIM); + StringTokenizer positionYtokens(tilePositionsY, ",", StringTokenizer::TOK_IGNORE_EMPTY | StringTokenizer::TOK_TRIM); + + size_t numberOfPositions = positionYtokens.count(); + // check that number of positions for X and Y is the same + if (numberOfPositions != positionYtokens.count()) + { + sendTextFrame("error: cmd=tilecombine kind=invalid"); + return; + } + + std::vector<Util::Rectangle> tiles; + tiles.reserve(numberOfPositions); + + for (size_t i = 0; i < numberOfPositions; ++i) + { + int x = 0; + if (!stringToInteger(positionXtokens[i], x)) + { + sendTextFrame("error: cmd=tilecombine kind=syntax"); + return; + } + + int y = 0; + if (!stringToInteger(positionYtokens[i], y)) + { + sendTextFrame("error: cmd=tilecombine kind=syntax"); + return; + } + + Util::Rectangle rectangle(x, y, tileWidth, tileHeight); + + if (tiles.empty()) + { + renderArea = rectangle; + } + else + { + renderArea.extend(rectangle); + } + + tiles.push_back(rectangle); + } + + if (_docType != "text" && part != _loKitDocument->pClass->getPart(_loKitDocument)) + { + _loKitDocument->pClass->setPart(_loKitDocument, part); + } + + LibreOfficeKitTileMode mode = static_cast<LibreOfficeKitTileMode>(_loKitDocument->pClass->getTileMode(_loKitDocument)); + + int tilesByX = renderArea.getWidth() / tileWidth; + int tilesByY = renderArea.getHeight() / tileHeight; + + int pixmapWidth = tilesByX * pixelWidth; + int pixmapHeight = tilesByY * pixelHeight; + + const size_t pixmapSize = 4 * pixmapWidth * pixmapHeight; + + std::vector<unsigned char> pixmap(pixmapSize, 0); + + Timestamp timestamp; + _loKitDocument->pClass->paintTile(_loKitDocument, pixmap.data(), pixmapWidth, pixmapHeight, + renderArea.getLeft(), renderArea.getTop(), + renderArea.getWidth(), renderArea.getHeight()); + + Log::debug() << "paintTile (combined) called, tile at [" << renderArea.getLeft() << ", " << renderArea.getTop() << "]" + << " (" << renderArea.getWidth() << ", " << renderArea.getHeight() << ") rendered in " + << double(timestamp.elapsed())/1000 << "ms" << Log::end; + + for (Util::Rectangle& tileRect : tiles) + { + std::string response = "tile: part=" + std::to_string(part) + + " width=" + std::to_string(pixelWidth) + + " height=" + std::to_string(pixelHeight) + + " tileposx=" + std::to_string(tileRect.getLeft()) + + " tileposy=" + std::to_string(tileRect.getTop()) + + " tilewidth=" + std::to_string(tileWidth) + + " tileheight=" + std::to_string(tileHeight); + + if (reqTimestamp != "") + response += " timestamp=" + reqTimestamp; + +#if ENABLE_DEBUG + response += " renderid=" + Util::UniqueId(); +#endif + + response += "\n"; + + std::vector<char> output; + output.reserve(pixelWidth * pixelHeight * 4 + response.size()); + output.resize(response.size()); + + std::copy(response.begin(), response.end(), output.begin()); + + int positionX = (tileRect.getLeft() - renderArea.getLeft()) / tileWidth; + int positionY = (tileRect.getTop() - renderArea.getTop()) / tileHeight; + + if (!Util::encodeSubBufferToPNG(pixmap.data(), positionX * pixelWidth, positionY * pixelHeight, pixelWidth, pixelHeight, pixmapWidth, pixmapHeight, output, mode)) + { + sendTextFrame("error: cmd=tile kind=failure"); + return; + } + + sendBinaryFrame(output.data(), output.size()); + } + + if (makeSlow) + delay(); + */ + } + private: static void ViewCallback(int , const char* , void* ) diff --git a/loolwsd/LOOLSession.hpp b/loolwsd/LOOLSession.hpp index 9864562..13fa109 100644 --- a/loolwsd/LOOLSession.hpp +++ b/loolwsd/LOOLSession.hpp @@ -87,10 +87,6 @@ protected: virtual bool loadDocument(const char *buffer, int length, Poco::StringTokenizer& tokens) = 0; - virtual void sendTile(const char *buffer, int length, Poco::StringTokenizer& tokens) = 0; - - virtual void sendCombinedTiles(const char *buffer, int length, Poco::StringTokenizer& tokens) = 0; - virtual void sendFontRendering(const char *buffer, int length, Poco::StringTokenizer& tokens) = 0; void updateLastActivityTime() diff --git a/loolwsd/MasterProcessSession.hpp b/loolwsd/MasterProcessSession.hpp index c3e1662..19a4788 100644 --- a/loolwsd/MasterProcessSession.hpp +++ b/loolwsd/MasterProcessSession.hpp @@ -60,9 +60,9 @@ public: protected: virtual bool loadDocument(const char *buffer, int length, Poco::StringTokenizer& tokens) override; - virtual void sendTile(const char *buffer, int length, Poco::StringTokenizer& tokens) override; + virtual void sendTile(const char *buffer, int length, Poco::StringTokenizer& tokens); - virtual void sendCombinedTiles(const char *buffer, int length, Poco::StringTokenizer& tokens) override; + virtual void sendCombinedTiles(const char *buffer, int length, Poco::StringTokenizer& tokens); virtual void sendFontRendering(const char *buffer, int length, Poco::StringTokenizer& tokens) override; _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits