Kaydet (Commit) bee4ff50 authored tarafından Miklos Vajna's avatar Miklos Vajna

desktop lok: avoid unnecessary setPart() in paintPartTile()

If possible, switch views, not parts, that way started Impress text
edits don't end as a side-effect.

Change-Id: I3f18d4dda6bc24235bf1219416f153248a867fa4
üst b9a27d58
...@@ -99,6 +99,7 @@ public: ...@@ -99,6 +99,7 @@ public:
void testRedlineWriter(); void testRedlineWriter();
void testTrackChanges(); void testTrackChanges();
void testRedlineCalc(); void testRedlineCalc();
void testPaintPartTile();
CPPUNIT_TEST_SUITE(DesktopLOKTest); CPPUNIT_TEST_SUITE(DesktopLOKTest);
CPPUNIT_TEST(testGetStyles); CPPUNIT_TEST(testGetStyles);
...@@ -129,6 +130,7 @@ public: ...@@ -129,6 +130,7 @@ public:
CPPUNIT_TEST(testRedlineWriter); CPPUNIT_TEST(testRedlineWriter);
CPPUNIT_TEST(testTrackChanges); CPPUNIT_TEST(testTrackChanges);
CPPUNIT_TEST(testRedlineCalc); CPPUNIT_TEST(testRedlineCalc);
CPPUNIT_TEST(testPaintPartTile);
CPPUNIT_TEST_SUITE_END(); CPPUNIT_TEST_SUITE_END();
uno::Reference<lang::XComponent> mxComponent; uno::Reference<lang::XComponent> mxComponent;
...@@ -1472,6 +1474,78 @@ void DesktopLOKTest::testRedlineCalc() ...@@ -1472,6 +1474,78 @@ void DesktopLOKTest::testRedlineCalc()
comphelper::LibreOfficeKit::setActive(false); comphelper::LibreOfficeKit::setActive(false);
} }
class ViewCallback
{
public:
bool m_bTilesInvalidated;
ViewCallback()
: m_bTilesInvalidated(false)
{
}
static void callback(int nType, const char* pPayload, void* pData)
{
static_cast<ViewCallback*>(pData)->callbackImpl(nType, pPayload);
}
void callbackImpl(int nType, const char* /*pPayload*/)
{
switch (nType)
{
case LOK_CALLBACK_INVALIDATE_TILES:
{
m_bTilesInvalidated = true;
}
break;
}
}
};
void DesktopLOKTest::testPaintPartTile()
{
// Load an impress doc of 2 slides.
comphelper::LibreOfficeKit::setActive();
LibLODocument_Impl* pDocument = loadDoc("2slides.odp");
pDocument->m_pDocumentClass->initializeForRendering(pDocument, "{}");
ViewCallback aView1;
pDocument->m_pDocumentClass->registerCallback(pDocument, &ViewCallback::callback, &aView1);
int nView1 = pDocument->m_pDocumentClass->getView(pDocument);
// Create a second view.
pDocument->m_pDocumentClass->createView(pDocument);
pDocument->m_pDocumentClass->initializeForRendering(pDocument, "{}");
ViewCallback aView2;
pDocument->m_pDocumentClass->registerCallback(pDocument, &ViewCallback::callback, &aView2);
// Go to the second slide in the second view.
pDocument->m_pDocumentClass->setPart(pDocument, 1);
// Switch back to the first view and start typing.
pDocument->m_pDocumentClass->setView(pDocument, nView1);
pDocument->m_pDocumentClass->postKeyEvent(pDocument, LOK_KEYEVENT_KEYINPUT, 0, awt::Key::TAB);
pDocument->m_pDocumentClass->postKeyEvent(pDocument, LOK_KEYEVENT_KEYUP, 0, awt::Key::TAB);
pDocument->m_pDocumentClass->postKeyEvent(pDocument, LOK_KEYEVENT_KEYINPUT, 'x', 0);
pDocument->m_pDocumentClass->postKeyEvent(pDocument, LOK_KEYEVENT_KEYUP, 'x', 0);
// Call paintPartTile() to paint the second part (in whichever view it finds suitable for this).
unsigned char pPixels[256 * 256 * 4];
pDocument->m_pDocumentClass->paintPartTile(pDocument, pPixels, 1, 256, 256, 0, 0, 256, 256);
// Type again.
Scheduler::ProcessEventsToIdle();
aView1.m_bTilesInvalidated = false;
pDocument->m_pDocumentClass->postKeyEvent(pDocument, LOK_KEYEVENT_KEYINPUT, 'x', 0);
pDocument->m_pDocumentClass->postKeyEvent(pDocument, LOK_KEYEVENT_KEYUP, 'x', 0);
Scheduler::ProcessEventsToIdle();
// This failed: paintPartTile() (as a side-effect) ended the text edit of
// the first view, so there were no invalidations.
CPPUNIT_ASSERT(aView1.m_bTilesInvalidated);
mxComponent->dispose();
mxComponent.clear();
comphelper::LibreOfficeKit::setActive(false);
}
CPPUNIT_TEST_SUITE_REGISTRATION(DesktopLOKTest); CPPUNIT_TEST_SUITE_REGISTRATION(DesktopLOKTest);
CPPUNIT_PLUGIN_IMPLEMENT(); CPPUNIT_PLUGIN_IMPLEMENT();
......
...@@ -1483,6 +1483,7 @@ static void doc_paintPartTile(LibreOfficeKitDocument* pThis, ...@@ -1483,6 +1483,7 @@ static void doc_paintPartTile(LibreOfficeKitDocument* pThis,
const int nTilePosX, const int nTilePosY, const int nTilePosX, const int nTilePosY,
const int nTileWidth, const int nTileHeight) const int nTileWidth, const int nTileHeight)
{ {
SolarMutexGuard aGuard;
SAL_INFO( "lok.tiledrendering", "paintPartTile: painting @ " << nPart << " [" SAL_INFO( "lok.tiledrendering", "paintPartTile: painting @ " << nPart << " ["
<< nTileWidth << "x" << nTileHeight << "]@(" << nTileWidth << "x" << nTileHeight << "]@("
<< nTilePosX << ", " << nTilePosY << ") to [" << nTilePosX << ", " << nTilePosY << ") to ["
...@@ -1500,8 +1501,27 @@ static void doc_paintPartTile(LibreOfficeKitDocument* pThis, ...@@ -1500,8 +1501,27 @@ static void doc_paintPartTile(LibreOfficeKitDocument* pThis,
// Text documents have a single coordinate system; don't change part. // Text documents have a single coordinate system; don't change part.
int nOrigPart = 0; int nOrigPart = 0;
const bool isText = (doc_getDocumentType(pThis) == LOK_DOCTYPE_TEXT); const bool isText = (doc_getDocumentType(pThis) == LOK_DOCTYPE_TEXT);
int nOrigViewId = doc_getView(pThis);
int nViewId = nOrigViewId;
if (!isText) if (!isText)
{ {
// Check if just switching to an other view is enough, that has
// less side-effects.
if (nPart != doc_getPart(pThis))
{
SfxViewShell* pViewShell = SfxViewShell::GetFirst();
while (pViewShell)
{
if (pViewShell->getPart() == nPart)
{
nViewId = pViewShell->GetViewShellId();
doc_setView(pThis, nViewId);
break;
}
pViewShell = SfxViewShell::GetNext(*pViewShell);
}
}
nOrigPart = doc_getPart(pThis); nOrigPart = doc_getPart(pThis);
if (nPart != nOrigPart) if (nPart != nOrigPart)
{ {
...@@ -1515,6 +1535,10 @@ static void doc_paintPartTile(LibreOfficeKitDocument* pThis, ...@@ -1515,6 +1535,10 @@ static void doc_paintPartTile(LibreOfficeKitDocument* pThis,
{ {
doc_setPart(pThis, nOrigPart); doc_setPart(pThis, nOrigPart);
} }
if (!isText && nViewId != nOrigViewId)
{
doc_setView(pThis, nOrigViewId);
}
} }
catch (const std::exception&) catch (const std::exception&)
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment