diff options
author | Michael Meeks <michael.meeks@collabora.com> | 2018-06-28 20:48:01 +0100 |
---|---|---|
committer | Michael Meeks <michael.meeks@collabora.com> | 2018-07-09 10:14:37 +0200 |
commit | a8ebc12eabe2e49e7d1564027c7128898279944e (patch) | |
tree | 3e20d797c7a32e49e6d5e18adfe7e252e1f4e2dc | |
parent | 8a2414e4691ceb61559233570dd9df1221d164ea (diff) |
tilebench: add dialog profiling mode.
Change-Id: I4661664d1206aacdaf22a4a8f05d7962547faf45
Reviewed-on: https://gerrit.libreoffice.org/56765
Tested-by: Jenkins
Reviewed-by: Michael Meeks <michael.meeks@collabora.com>
-rw-r--r-- | libreofficekit/Executable_tilebench.mk | 4 | ||||
-rw-r--r-- | libreofficekit/qa/tilebench/tilebench.cxx | 96 |
2 files changed, 92 insertions, 8 deletions
diff --git a/libreofficekit/Executable_tilebench.mk b/libreofficekit/Executable_tilebench.mk index 9d8b2a134f99..9977a93351ed 100644 --- a/libreofficekit/Executable_tilebench.mk +++ b/libreofficekit/Executable_tilebench.mk @@ -14,6 +14,10 @@ $(eval $(call gb_Executable_set_include,tilebench,\ -I$(SRCDIR)/desktop/inc \ )) +$(eval $(call gb_Executable_use_externals,tilebench,\ + boost_headers \ +)) + $(eval $(call gb_Executable_use_libraries,tilebench,\ sal \ )) diff --git a/libreofficekit/qa/tilebench/tilebench.cxx b/libreofficekit/qa/tilebench/tilebench.cxx index bb9201851612..0984a3feee5c 100644 --- a/libreofficekit/qa/tilebench/tilebench.cxx +++ b/libreofficekit/qa/tilebench/tilebench.cxx @@ -13,6 +13,8 @@ #include <cmath> #include <vector> +#include <atomic> +#include <iostream> #include <fstream> #include <osl/time.h> @@ -20,6 +22,9 @@ #include <LibreOfficeKit/LibreOfficeKitInit.h> #include <LibreOfficeKit/LibreOfficeKit.hxx> +#include <boost/property_tree/json_parser.hpp> +#include <boost/optional.hpp> + using namespace lok; static int help( const char *error = nullptr ) @@ -56,8 +61,9 @@ struct TimeRecord { static std::vector< TimeRecord > aTimes; /// Dump an array of RGBA or BGRA to an RGB PPM file. -static void dumpTile(const int nWidth, const int nHeight, const int mode, const char* pBuffer) +static void dumpTile(const int nWidth, const int nHeight, const int mode, const unsigned char* pBufferU) { + auto pBuffer = reinterpret_cast<const char *>(pBufferU); std::ofstream ofs("/tmp/dump_tile.ppm"); ofs << "P6\n" << nWidth << " " @@ -154,7 +160,7 @@ void testTile( Document *pDocument, int max_parts, nWidth/2, 2000, 1000, 1000); // not square aTimes.emplace_back(); if (dump) - dumpTile(nTilePixelWidth, nTilePixelHeight, mode, reinterpret_cast<char*>(pPixels)); + dumpTile(nTilePixelWidth, nTilePixelHeight, mode, pPixels); } { // 1:1 @@ -210,10 +216,72 @@ void testTile( Document *pDocument, int max_parts, } } +static std::atomic<bool> bDialogRendered(false); +static std::atomic<int> nDialogId(-1); + +void kitCallback(int nType, const char* pPayload, void* pData) +{ + Document *pDocument = static_cast<Document *>(pData); + + if (nType != LOK_CALLBACK_WINDOW) + return; + + std::stringstream aStream(pPayload); + boost::property_tree::ptree aRoot; + boost::property_tree::read_json(aStream, aRoot); + nDialogId = aRoot.get<unsigned>("id"); + const std::string aAction = aRoot.get<std::string>("action"); + + if (aAction == "created") + { + const std::string aType = aRoot.get<std::string>("type"); + const std::string aSize = aRoot.get<std::string>("size"); + int nWidth = atoi(aSize.c_str()); + int nHeight = 400; + const char *pComma = strstr(aSize.c_str(), ", "); + if (pComma) + nHeight = atoi(pComma + 2); + std::cerr << "Size " << aSize << " is " << nWidth << ", " << nHeight << "\n"; + + if (aType == "dialog") + { + aTimes.emplace_back(); // complete wait for dialog + + unsigned char *pBuffer = new unsigned char[nWidth * nHeight * 4]; + + aTimes.emplace_back("render dialog"); + pDocument->paintWindow(nDialogId, pBuffer, 0, 0, nWidth, nHeight); + dumpTile(nWidth, nHeight, pDocument->getTileMode(), pBuffer); + aTimes.emplace_back(); + + delete[] pBuffer; + + bDialogRendered = true; + } + } +} + void testDialog( Document *pDocument, const char *uno_cmd ) { - fprintf (stderr, "Stress test a dialog...\n"); - (void)pDocument; (void)uno_cmd; + int view = pDocument->createView(); + pDocument->setView(view); + pDocument->registerCallback(kitCallback, pDocument); + + aTimes.emplace_back("open dialog"); + pDocument->postUnoCommand(uno_cmd, nullptr, true); + aTimes.emplace_back(); + + aTimes.emplace_back("wait for dialog"); + while (!bDialogRendered) + { + usleep (1000); + } + + aTimes.emplace_back("post close dialog"); + pDocument->postWindow(nDialogId, LOK_WINDOW_CLOSE); + aTimes.emplace_back(); + + pDocument->destroyView(view); } int main( int argc, char* argv[] ) @@ -261,10 +329,22 @@ int main( int argc, char* argv[] ) } else if (!strcmp (mode, "--dialog")) { - if (argc > 4) - testDialog (pDocument, argv[4]); - else - return help("missing argument to --dialog"); + const char *uno_cmd = argc > 4 ? argv[4] : nullptr; + if (!uno_cmd) + { + switch (pDocument->getDocumentType()) + { + case LOK_DOCTYPE_SPREADSHEET: + uno_cmd = ".uno:FormatCellDialog"; + break; + case LOK_DOCTYPE_TEXT: + case LOK_DOCTYPE_PRESENTATION: + case LOK_DOCTYPE_DRAWING: + case LOK_DOCTYPE_OTHER: + return help("missing argument to --dialog and no default"); + } + } + testDialog (pDocument, uno_cmd); } else return help ("unknown parameter"); } |