diff --git a/libs/image/kis_warptransform_worker.cc b/libs/image/kis_warptransform_worker.cc --- a/libs/image/kis_warptransform_worker.cc +++ b/libs/image/kis_warptransform_worker.cc @@ -254,7 +254,8 @@ m_dev->clear(); - const int pixelPrecision = 8; + float scaleValue = (sqrt(srcBounds.height()*srcBounds.width()/pow(2,18))/5)*3; + int pixelPrecision = pow(2,(scaleValue < 3) ? scaleValue : 3); FunctionTransformOp functionOp(m_warpMathFunction, m_origPoint, m_transfPoint, m_alpha); GridIterationTools::PaintDevicePolygonOp polygonOp(srcdev, m_dev); @@ -357,7 +358,9 @@ QImage dstImage(dstBoundsI.size(), srcImage.format()); dstImage.fill(0); - const int pixelPrecision = 32; + float scaleValue = sqrt(srcBounds.height()*srcBounds.width()/pow(2,18)); + int pixelPrecision = pow(2,(scaleValue < 5) ? scaleValue : 5); + GridIterationTools::QImagePolygonOp polygonOp(srcImage, dstImage, srcQImageOffset, dstQImageOffset); GridIterationTools::processGrid(polygonOp, functionOp, srcBounds.toAlignedRect(), pixelPrecision); 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 @@ -87,12 +87,14 @@ QPointF *dstOffset) { Q_UNUSED(currentArgs); + float scaleValue = (sqrt(srcImage.height()*srcImage.width()/pow(2,14))/5); + int pixelPrecision = pow(2,(scaleValue < 4) ? scaleValue : 4); KisCageTransformWorker worker(srcImage, srcOffset, origPoints, 0, - 16); + pixelPrecision); worker.prepareTransform(); worker.setTransformedCage(transfPoints); return worker.runOnQImage(dstOffset); diff --git a/plugins/tools/tool_transform2/kis_transform_utils.cpp b/plugins/tools/tool_transform2/kis_transform_utils.cpp --- a/plugins/tools/tool_transform2/kis_transform_utils.cpp +++ b/plugins/tools/tool_transform2/kis_transform_utils.cpp @@ -246,10 +246,13 @@ } else if (config.mode() == ToolTransformArgs::CAGE) { KoUpdaterPtr updater = helper->updater(); + float scaleValue = (sqrt(device->exactBounds().height()*device->exactBounds().width()/pow(2,18))/5)*3; + int pixelPrecision = pow(2,(scaleValue < 3) ? scaleValue : 3); + KisCageTransformWorker worker(device, config.origPoints(), updater, - 8); + pixelPrecision); worker.prepareTransform(); worker.setTransformedCage(config.transfPoints()); 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 @@ -295,7 +295,10 @@ void ToolTransformArgs::initLiquifyTransformMode(const QRect &srcRect) { - m_liquifyWorker.reset(new KisLiquifyTransformWorker(srcRect, 0, 8)); + float scaleValue = (sqrt(srcRect.height()*srcRect.width()/pow(2,18))/5)*3; + int pixelPrecision = pow(2,(scaleValue < 3) ? scaleValue : 3); + + m_liquifyWorker.reset(new KisLiquifyTransformWorker(srcRect, 0, pixelPrecision)); m_liquifyProperties->loadAndResetMode(); }