diff --git a/CMakeLists.txt b/CMakeLists.txt index e78db3a..509c12a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -430,6 +430,9 @@ if(MINGW) string(REPLACE "-Wl,--export-all-symbols" "" CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS}") endif(MINGW) +string(REPLACE "-Wl,--no-undefined" "" CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}") +string(REPLACE "-Wl,--no-undefined" "" CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS}") + # enable exceptions globally kde_enable_exceptions() diff --git a/libs/image/tiles3/kis_tile_hash_table2.h b/libs/image/tiles3/kis_tile_hash_table2.h index d5bda75..57bd309 100644 --- a/libs/image/tiles3/kis_tile_hash_table2.h +++ b/libs/image/tiles3/kis_tile_hash_table2.h @@ -81,7 +81,7 @@ public: * \param newTile out-parameter, returns true if a new tile * was created */ - TileTypeSP getTileLazy(qint32 col, qint32 row, bool& newTile); + TileTypeSP getTileLazy(qint32 col, qint32 row, bool& newTile, KisTileData *srcTileData = 0); /** * Returns a tile in position (col,row). If no tile exists, @@ -293,7 +293,7 @@ typename KisTileHashTableTraits2::TileTypeSP KisTileHashTableTraits2::getE } template -typename KisTileHashTableTraits2::TileTypeSP KisTileHashTableTraits2::getTileLazy(qint32 col, qint32 row, bool &newTile) +typename KisTileHashTableTraits2::TileTypeSP KisTileHashTableTraits2::getTileLazy(qint32 col, qint32 row, bool &newTile, KisTileData *srcTileData) { newTile = false; quint32 idx = calculateHash(col, row); @@ -303,9 +303,11 @@ typename KisTileHashTableTraits2::TileTypeSP KisTileHashTableTraits2::getT while (m_lazyLock.test_and_set(std::memory_order_acquire)); if (!(tile = m_map.get(idx))) { - { + if (!srcTileData) { QReadLocker locker(&m_defaultPixelDataLock); tile = new TileType(col, row, m_defaultTileData, m_mementoManager); + } else { + tile = new TileType(col, row, srcTileData, m_mementoManager); } TileTypeSP::ref(&tile, tile.data()); diff --git a/libs/image/tiles3/kis_tiled_data_manager.cc b/libs/image/tiles3/kis_tiled_data_manager.cc index e7d2143..11794b6 100644 --- a/libs/image/tiles3/kis_tiled_data_manager.cc +++ b/libs/image/tiles3/kis_tiled_data_manager.cc @@ -376,8 +376,9 @@ void KisTiledDataManager::clear(QRect clearRect, const quint8 *clearPixel) if (!pixelBytesAreDefault) { - KisTileSP clearedTile = KisTileSP(new KisTile(column, row, td, m_mementoManager)); - m_hashTable->addTile(clearedTile); + bool newTile = false; + (void) m_hashTable->getTileLazy(column, row, newTile, td); + KIS_ASSERT(newTile); m_extentManager.notifyTileAdded(column, row); } } else { @@ -474,11 +475,11 @@ void KisTiledDataManager::bitBltImpl(KisTiledDataManager *srcDM, const QRect &re if (srcTileExists || !defaultPixelsCoincide) { srcTile->lockForRead(); KisTileData *td = srcTile->tileData(); - KisTileSP clonedTile = KisTileSP(new KisTile(column, row, td, m_mementoManager)); + bool newTile = false; + (void) m_hashTable->getTileLazy(column, row, newTile, td); + KIS_ASSERT(newTile); srcTile->unlock(); - m_hashTable->addTile(clonedTile); - if (!wasDeleted) { m_extentManager.notifyTileAdded(column, row); } @@ -515,6 +516,10 @@ void KisTiledDataManager::bitBltImpl(KisTiledDataManager *srcDM, const QRect &re template void KisTiledDataManager::bitBltRoughImpl(KisTiledDataManager *srcDM, const QRect &rect) { + bitBltImpl(srcDM, rect); + return; + + if (rect.isEmpty()) return; const qint32 pixelSize = this->pixelSize(); @@ -548,11 +553,11 @@ void KisTiledDataManager::bitBltRoughImpl(KisTiledDataManager *srcDM, const QRec if (srcTileExists || !defaultPixelsCoincide) { srcTile->lockForRead(); KisTileData *td = srcTile->tileData(); - KisTileSP clonedTile = KisTileSP(new KisTile(column, row, td, m_mementoManager)); + bool newTile = false; + (void) m_hashTable->getTileLazy(column, row, newTile, td); + KIS_ASSERT(newTile); srcTile->unlock(); - m_hashTable->addTile(clonedTile); - if (!wasDeleted) { m_extentManager.notifyTileAdded(column, row); } diff --git a/libs/ui/tests/freehand_stroke_test.cpp b/libs/ui/tests/freehand_stroke_test.cpp index 2dd206e..27a6a76 100644 --- a/libs/ui/tests/freehand_stroke_test.cpp +++ b/libs/ui/tests/freehand_stroke_test.cpp @@ -186,4 +186,12 @@ void FreehandStrokeTest::testPredefinedBrushStrokeLod() tester.testSimpleStroke(); } +void FreehandStrokeTest::testAutoBrushStrokeMultiple() +{ + FreehandStrokeTester tester("Basic_tip_default.kpp"); + tester.setNumIterations(5); + tester.testSimpleStroke(); +} + + KISTEST_MAIN(FreehandStrokeTest) diff --git a/libs/ui/tests/freehand_stroke_test.h b/libs/ui/tests/freehand_stroke_test.h index b63bb40..7d6655f 100644 --- a/libs/ui/tests/freehand_stroke_test.h +++ b/libs/ui/tests/freehand_stroke_test.h @@ -36,6 +36,8 @@ private Q_SLOTS: void testAutoBrushStrokeLod(); void testPredefinedBrushStrokeLod(); + + void testAutoBrushStrokeMultiple(); }; #endif /* __FREEHAND_STROKE_TEST_H */