diff --git a/libs/image/kis_cage_transform_worker.cpp b/libs/image/kis_cage_transform_worker.cpp --- a/libs/image/kis_cage_transform_worker.cpp +++ b/libs/image/kis_cage_transform_worker.cpp @@ -164,15 +164,13 @@ // no need to process empty devices if (srcBounds.isEmpty()) return; - m_d->gridSize = GridIterationTools::calcGridSize(srcBounds, m_d->pixelPrecision); PointsFetcherOp pointsOp(srcPolygon); GridIterationTools::processGrid(pointsOp, srcBounds, m_d->pixelPrecision); const int numPoints = pointsOp.m_points.size(); - KIS_ASSERT_RECOVER_RETURN(numPoints == m_d->gridSize.width() * m_d->gridSize.height()); m_d->allSrcPoints = pointsOp.m_points; diff --git a/plugins/tools/tool_transform2/kis_cage_transform_strategy.cpp b/plugins/tools/tool_transform2/kis_cage_transform_strategy.cpp --- a/plugins/tools/tool_transform2/kis_cage_transform_strategy.cpp +++ b/plugins/tools/tool_transform2/kis_cage_transform_strategy.cpp @@ -88,13 +88,11 @@ const QPointF &srcOffset, QPointF *dstOffset) { - Q_UNUSED(currentArgs); - KisCageTransformWorker worker(srcImage, srcOffset, origPoints, 0, - 16); + currentArgs.previewPixelPrecision()); worker.prepareTransform(); worker.setTransformedCage(transfPoints); return worker.runOnQImage(dstOffset); diff --git a/plugins/tools/tool_transform2/kis_tool_transform_config_widget.h b/plugins/tools/tool_transform2/kis_tool_transform_config_widget.h --- a/plugins/tools/tool_transform2/kis_tool_transform_config_widget.h +++ b/plugins/tools/tool_transform2/kis_tool_transform_config_widget.h @@ -112,7 +112,8 @@ void notifyEditingFinished(); - void slotGranularityChanged(int value); + void slotGranularityChanged(QString value); + void slotPreviewGranularityChanged(QString value); private: // rad being in |R, the returned value is in [0; 360] diff --git a/plugins/tools/tool_transform2/kis_tool_transform_config_widget.cpp b/plugins/tools/tool_transform2/kis_tool_transform_config_widget.cpp --- a/plugins/tools/tool_transform2/kis_tool_transform_config_widget.cpp +++ b/plugins/tools/tool_transform2/kis_tool_transform_config_widget.cpp @@ -53,7 +53,18 @@ chkWorkRecursively->setChecked(workRecursively); connect(chkWorkRecursively, SIGNAL(toggled(bool)), this, SIGNAL(sigRestartTransform())); - connect(changeGranularity,SIGNAL(valueChanged(int)),this,SLOT(slotGranularityChanged(int))); + + // Granularity can only be specified in the power of 2's + QStringList granularityValues{"4","8","16","32"}; + changeGranularity->addItems(granularityValues); + changeGranularity->setCurrentIndex(1); + granularityPreview->addItems(granularityValues); + granularityPreview->setCurrentIndex(2); + + connect(changeGranularity,SIGNAL(currentIndexChanged(QString)), + this,SLOT(slotGranularityChanged(QString))); + connect(granularityPreview, SIGNAL(currentIndexChanged(QString)), + this,SLOT(slotPreviewGranularityChanged(QString))); // Init Filter combo cmbFilter->setIDList(KisFilterStrategyRegistry::instance()->listKeys()); @@ -1297,10 +1308,20 @@ notifyConfigChanged(); } -void KisToolTransformConfigWidget::slotGranularityChanged(int value) +void KisToolTransformConfigWidget::slotGranularityChanged(QString value) +{ + if (m_uiSlotsBlocked) return; + KIS_SAFE_ASSERT_RECOVER_RETURN(value.toInt() > 1); + ToolTransformArgs *config = m_transaction->currentConfig(); + config->setPixelPrecision(value.toInt()); + notifyConfigChanged(); +} + +void KisToolTransformConfigWidget::slotPreviewGranularityChanged(QString value) { if (m_uiSlotsBlocked) return; + KIS_SAFE_ASSERT_RECOVER_RETURN(value.toInt() > 1); ToolTransformArgs *config = m_transaction->currentConfig(); - config->setPixelPrecision(value); + config->setPreviewPixelPrecision(value.toInt()); notifyConfigChanged(); } diff --git a/plugins/tools/tool_transform2/tool_transform_args.h b/plugins/tools/tool_transform2/tool_transform_args.h --- a/plugins/tools/tool_transform2/tool_transform_args.h +++ b/plugins/tools/tool_transform2/tool_transform_args.h @@ -100,6 +100,14 @@ m_pixelPrecision = precision; } + inline int previewPixelPrecision() const { + return m_previewPixelPrecision; + } + + inline void setPreviewPixelPrecision(int precision) { + m_previewPixelPrecision = precision; + } + //warp-related inline int numPoints() const { KIS_ASSERT_RECOVER_NOOP(m_origPoints.size() == m_transfPoints.size()); @@ -338,7 +346,10 @@ * operations should revert to it. */ QScopedPointer m_continuedTransformation; + + //PixelPrecision should always be in powers of 2 int m_pixelPrecision; + int m_previewPixelPrecision; }; #endif // TOOL_TRANSFORM_ARGS_H_ diff --git a/plugins/tools/tool_transform2/tool_transform_args.cc b/plugins/tools/tool_transform2/tool_transform_args.cc --- a/plugins/tools/tool_transform2/tool_transform_args.cc +++ b/plugins/tools/tool_transform2/tool_transform_args.cc @@ -48,6 +48,8 @@ , m_shearX(0.0) , m_shearY(0.0) , m_liquifyProperties(new KisLiquifyProperties()) + , m_pixelPrecision(8) + , m_previewPixelPrecision(16) { KConfigGroup configGroup = KSharedConfig::openConfig()->group("KisToolTransform"); QString savedFilterId = configGroup.readEntry("filterId", "Bicubic"); @@ -96,6 +98,8 @@ m_filter = args.m_filter; m_flattenedPerspectiveTransform = args.m_flattenedPerspectiveTransform; m_editTransformPoints = args.m_editTransformPoints; + m_pixelPrecision = 8; + m_previewPixelPrecision = 16; if (args.m_liquifyWorker) { m_liquifyWorker.reset(new KisLiquifyTransformWorker(*args.m_liquifyWorker.data())); @@ -166,7 +170,9 @@ ((m_liquifyWorker && other.m_liquifyWorker && *m_liquifyWorker == *other.m_liquifyWorker) - || m_liquifyWorker == other.m_liquifyWorker); + || m_liquifyWorker == other.m_liquifyWorker) && + m_pixelPrecision == other.m_pixelPrecision && + m_previewPixelPrecision == other.m_previewPixelPrecision; } bool ToolTransformArgs::isSameMode(const ToolTransformArgs& other) const @@ -247,6 +253,7 @@ , m_shearY(shearY) , m_liquifyProperties(new KisLiquifyProperties()) , m_pixelPrecision(8) + , m_previewPixelPrecision(16) { setFilterId(filterId); } diff --git a/plugins/tools/tool_transform2/wdg_tool_transform.ui b/plugins/tools/tool_transform2/wdg_tool_transform.ui --- a/plugins/tools/tool_transform2/wdg_tool_transform.ui +++ b/plugins/tools/tool_transform2/wdg_tool_transform.ui @@ -6,8 +6,8 @@ 0 0 - 489 - 674 + 499 + 709 @@ -1677,56 +1677,72 @@ - 20 - 20 + 17 + 17 - + + + + 75 + true + + - Adjust Granularity + Adjust Granularity : - - - - 0 - 0 - - - - - 60 - 16777215 - - - - Set Granularity - - - Qt::ImhNone - - - 20 - - - 8 - - + + + + + Preview + + + + + + + + 0 + 0 + + + + + + + + Real + + + + + + + + 0 + 0 + + + + + Qt::Vertical - 20 - 40 + 17 + 411 @@ -2243,7 +2259,7 @@ - +