136 qreal sampleRadiusValue,
143 WeightingModeWrapper::verifySampleRadiusValue(&sampleRadiusValue);
148 const QRect minimalRect = QRect(srcRect.center(), QSize(1,1));
151 const QRect sampleRect = sampleRadiusValue > 0 ?
155 tempFixedDevice->
setRect(sampleRect);
159 const int numPixels = sampleRect.width() * sampleRect.height();
160 sourceDevice->readRect(sampleRect);
161 sourceDevice->readBytes(tempFixedDevice->
data(), sampleRect);
168 const int minSamples =
169 qMin(numPixels, qMax(64, qRound(0.02 * numPixels)));
171 WeightingModeWrapper weightingModeWrapper(mixer.data(),
173 tempFixedDevice, sampleRect);
175 KoColor lastPickedColor(*resultColor);
177 for (
int i = 0; i < minSamples; i++) {
178 const QPoint pt(hGen.
generate(sampleRect.width() - 1),
179 vGen.
generate(sampleRect.height() - 1));
181 weightingModeWrapper.samplePixel(pt);
184 mixer->computeMixedColor(resultColor->
data());
185 lastPickedColor = *resultColor;
187 const int batchSize = 16;
188 int numSamplesLeft = numPixels - minSamples;
190 while (numSamplesLeft > 0) {
191 const int currentBatchSize = qMin(numSamplesLeft, batchSize);
192 for (
int i = 0; i < currentBatchSize; i++) {
193 const QPoint pt(hGen.
generate(sampleRect.width() - 1),
194 vGen.
generate(sampleRect.height() - 1));
196 weightingModeWrapper.samplePixel(pt);
199 mixer->computeMixedColor(resultColor->
data());
201 const quint8 difference =
204 if (difference <= 2)
break;
206 lastPickedColor = *resultColor;
207 numSamplesLeft -= currentBatchSize;
210 if (!weightingModeWrapper.shouldRestartWithBiggerRadius() || sampleRadiusValue >= 1.0) {
214 sampleRadiusValue = qMin(1.0, sampleRadiusValue + 0.05);