10#if !defined(XSIMD_NO_SUPPORTED_ARCHITECTURE) && XSIMD_UNIVERSAL_BUILD_PASS
43 using float_v = xsimd::batch<float, xsimd::current_arch>;
44 using float_m =
typename float_v::batch_bool_type;
46 const bool useSmoothing =
d->copyOfAntialiasEdges;
48 const float y_ =
y - centerY;
49 const float sinay_ = sina * y_;
50 const float cosay_ = cosa * y_;
52 float *bufferPointer = buffer;
54 float_v currentIndices =
55 xsimd::detail::make_sequence_as_batch<float_v>();
57 const float_v increment((
float)float_v::size);
58 const float_v vCenterX(centerX);
60 const float_v vCosa(cosa);
61 const float_v vSina(sina);
62 const float_v vCosaY_(cosay_);
63 const float_v vSinaY_(sinay_);
65 const float_v vXCoeff(
static_cast<float>(
d->xcoef));
66 const float_v vYCoeff(
static_cast<float>(
d->ycoef));
68 const float_v vTransformedFadeX(
static_cast<float>(
d->transformedFadeX));
69 const float_v vTransformedFadeY(
static_cast<float>(
d->transformedFadeY));
71 const float_v vOne(1);
73 for (
size_t i = 0; i < static_cast<size_t>(width); i += float_v::size) {
74 const float_v x_ = currentIndices - vCenterX;
76 float_v xr = x_ * vCosa - vSinaY_;
77 float_v yr = x_ * vSina + vCosaY_;
80 const float_m outsideMask = n > vOne;
82 if (!xsimd::all(outsideMask)) {
84 xr = xsimd::abs(xr) + vOne;
85 yr = xsimd::abs(yr) + vOne;
87 float_v vNormFade =
xsimd::pow2(xr * vTransformedFadeX)
89 const float_m vNormLowMask = vNormFade < vOne;
93 float_v vFade = n * (vNormFade - vOne) / (vNormFade - n);
96 const float_m mask = vNormFade < vOne;
102 vFade.store_aligned(bufferPointer);
105 vOne.store_aligned(bufferPointer);
108 currentIndices = currentIndices + increment;
110 bufferPointer += float_v::size;
124 using float_v = xsimd::batch<float, xsimd::current_arch>;
125 using float_m = float_v::batch_bool_type;
127 const float y_ =
y - centerY;
128 const float sinay_ = sina * y_;
129 const float cosay_ = cosa * y_;
131 float *bufferPointer = buffer;
133 float_v currentIndices = xsimd::detail::make_sequence_as_batch<float_v>();
135 const float_v increment(
static_cast<float>(float_v::size));
136 const float_v vCenterX(centerX);
137 const float_v vCenter(
static_cast<float>(
d->center));
139 const float_v vCosa(cosa);
140 const float_v vSina(sina);
141 const float_v vCosaY_(cosay_);
142 const float_v vSinaY_(sinay_);
144 const float_v vYCoeff(
static_cast<float>(
d->ycoef));
145 const float_v vDistfactor(
static_cast<float>(
d->distfactor));
146 const float_v vAlphafactor(
static_cast<float>(
d->alphafactor));
148 const float_v vZero(0);
149 const float_v vValMax(255.f);
151 for (
size_t i = 0; i < static_cast<size_t>(width); i += float_v::size) {
152 const float_v x_ = currentIndices - vCenterX;
154 const float_v xr = x_ * vCosa - vSinaY_;
155 const float_v yr = x_ * vSina + vCosaY_;
161 const float_m excludeMask =
d->fadeMaker.needFade(dist);
163 if (!xsimd::all(excludeMask)) {
164 const float_v valDist = dist * vDistfactor;
165 float_v fullFade = vAlphafactor
170 const float_m mask = fullFade < vZero;
174 const float_m outerMask = fullFade > 254.974f;
175 fullFade = xsimd::select(outerMask, vValMax, fullFade);
178 float_v vFade = (vValMax - fullFade) / vValMax;
181 vFade = xsimd::select(excludeMask, dist, vFade);
182 vFade.store_aligned(bufferPointer);
184 dist.store_aligned(bufferPointer);
186 currentIndices = currentIndices + increment;
188 bufferPointer += float_v::size;
202 using int_v = xsimd::batch<int, xsimd::current_arch>;
203 using float_v = xsimd::batch<float, xsimd::current_arch>;
204 using float_m = float_v::batch_bool_type;
206 const float y_ =
y - centerY;
207 const float sinay_ = sina * y_;
208 const float cosay_ = cosa * y_;
210 float *bufferPointer = buffer;
212 const qreal *curveDataPointer =
d->curveData.data();
214 float_v currentIndices = xsimd::detail::make_sequence_as_batch<float_v>();
216 const float_v increment((
float)float_v::size);
217 const float_v vCenterX(centerX);
219 const float_v vCosa(cosa);
220 const float_v vSina(sina);
221 const float_v vCosaY_(cosay_);
222 const float_v vSinaY_(sinay_);
224 const float_v vYCoeff(
static_cast<float>(
d->ycoef));
225 const float_v vXCoeff(
static_cast<float>(
d->xcoef));
226 const float_v vCurveResolution(
static_cast<float>(
d->curveResolution));
228 float_v vCurvedData(0);
229 float_v vCurvedData1(0);
231 const float_v vOne(1);
232 const float_v vZero(0);
234 for (
size_t i = 0; i < static_cast<size_t>(width); i += float_v::size) {
235 const float_v x_ = currentIndices - vCenterX;
237 const float_v xr = x_ * vCosa - vSinaY_;
238 const float_v yr = x_ * vSina + vCosaY_;
243 const float_m excludeMask =
d->fadeMaker.needFade(dist);
245 if (!xsimd::all(excludeMask)) {
246 const float_v valDist = dist * vCurveResolution;
248 int_v vAlphaValue = xsimd::to_int(valDist);
249 const float_v vFloatAlphaValue = xsimd::to_float(vAlphaValue);
251 const float_v alphaValueF = valDist - vFloatAlphaValue;
253 const auto alphaMask = vAlphaValue < int_v(0);
256 vCurvedData = float_v::gather(curveDataPointer, vAlphaValue);
257 vCurvedData1 = float_v::gather(curveDataPointer, vAlphaValue + 1);
260 float_v fullFade = ((vOne - alphaValueF) * vCurvedData
261 + alphaValueF * vCurvedData1);
264 const float_m mask = fullFade < vZero;
268 const float_m outerMask = fullFade >= vOne;
269 float_v vFade = (vOne - fullFade);
273 vFade = xsimd::select(excludeMask, dist, vFade);
274 vFade.store_aligned(bufferPointer);
276 dist.store_aligned(bufferPointer);
278 currentIndices = currentIndices + increment;
280 bufferPointer += float_v::size;
294 using float_v = xsimd::batch<float, xsimd::current_arch>;
295 using float_m = float_v::batch_bool_type;
297 const bool useSmoothing =
d->copyOfAntialiasEdges;
299 const float y_ =
y - centerY;
300 const float sinay_ = sina * y_;
301 const float cosay_ = cosa * y_;
303 float *bufferPointer = buffer;
305 float_v currentIndices = xsimd::detail::make_sequence_as_batch<float_v>();
307 const float_v increment((
float)float_v::size);
308 const float_v vCenterX(centerX);
310 const float_v vCosa(cosa);
311 const float_v vSina(sina);
312 const float_v vCosaY_(cosay_);
313 const float_v vSinaY_(sinay_);
315 const float_v vXCoeff(
static_cast<float>(
d->xcoeff));
316 const float_v vYCoeff(
static_cast<float>(
d->ycoeff));
318 const float_v vTransformedFadeX(
static_cast<float>(
d->transformedFadeX));
319 const float_v vTransformedFadeY(
static_cast<float>(
d->transformedFadeY));
321 const float_v vOne(1);
322 const float_v vZero(0);
323 const float_v vTolerance(10000.f);
325 for (
size_t i = 0; i < static_cast<size_t>(width); i += float_v::size) {
326 const float_v x_ = currentIndices - vCenterX;
328 float_v xr = xsimd::abs(x_ * vCosa - vSinaY_);
329 float_v yr = xsimd::abs(x_ * vSina + vCosaY_);
331 const float_v nxr = xr * vXCoeff;
332 const float_v nyr = yr * vYCoeff;
334 float_m outsideMask = (nxr > vOne) || (nyr > vOne);
336 if (!xsimd::all(outsideMask)) {
338 xr = xsimd::abs(xr) + vOne;
339 yr = xsimd::abs(yr) + vOne;
342 const float_v fxr = xr * vTransformedFadeX;
343 const float_v fyr = yr * vTransformedFadeY;
345 const float_v fxrNorm = nxr * (fxr - vOne) / (fxr - nxr);
346 const float_v fyrNorm = nyr * (fyr - vOne) / (fyr - nyr);
348 float_v vFade(vZero);
350 const float_m vFadeMask = fxrNorm < fyrNorm;
351 float_v vMaxVal = vFade;
352 vMaxVal = xsimd::select(fxr > vOne, fxrNorm, vMaxVal);
353 vMaxVal = xsimd::select(vFadeMask && fyr > vOne, fyrNorm, vMaxVal);
357 vFade = xsimd::select(outsideMask, vOne, vFade);
358 vFade.store_aligned(bufferPointer);
361 vOne.store_aligned(bufferPointer);
364 currentIndices = currentIndices + increment;
366 bufferPointer += float_v::size;
380 using float_v = xsimd::batch<float, xsimd::current_arch>;
381 using float_m = float_v::batch_bool_type;
383 const float y_ =
y - centerY;
384 const float sinay_ = sina * y_;
385 const float cosay_ = cosa * y_;
387 float *bufferPointer = buffer;
389 float_v currentIndices = xsimd::detail::make_sequence_as_batch<float_v>();
391 const float_v increment((
float)float_v::size);
392 const float_v vCenterX(centerX);
394 const float_v vCosa(cosa);
395 const float_v vSina(sina);
396 const float_v vCosaY_(cosay_);
397 const float_v vSinaY_(sinay_);
399 const float_v vhalfWidth(
static_cast<float>(
d->halfWidth));
400 const float_v vhalfHeight(
static_cast<float>(
d->halfHeight));
401 const float_v vXFade(
static_cast<float>(
d->xfade));
402 const float_v vYFade(
static_cast<float>(
d->yfade));
404 const float_v vAlphafactor(
static_cast<float>(
d->alphafactor));
406 const float_v vOne(1);
407 const float_v vZero(0);
408 const float_v vValMax(255.f);
410 for (
size_t i = 0; i < static_cast<size_t>(width); i += float_v::size) {
411 const float_v x_ = currentIndices - vCenterX;
413 float_v xr = x_ * vCosa - vSinaY_;
414 float_v yr = xsimd::abs(x_ * vSina + vCosaY_);
417 float_m excludeMask =
d->fadeMaker.needFade(xr, yr);
419 if (!xsimd::all(excludeMask)) {
420 float_v fullFade = vValMax
425 d->fadeMaker.apply2DFader(fullFade, excludeMask, xr, yr);
428 const float_m mask = fullFade < vZero;
432 const float_m outerMask = fullFade > 254.974f;
433 fullFade = xsimd::select(outerMask, vValMax, fullFade);
436 float_v vFade = fullFade / vValMax;
438 vFade = xsimd::select(excludeMask, vOne, vFade);
439 vFade.store_aligned(bufferPointer);
442 vOne.store_aligned(bufferPointer);
444 currentIndices = currentIndices + increment;
446 bufferPointer += float_v::size;
460 using float_v = xsimd::batch<float, xsimd::current_arch>;
461 using float_m = float_v::batch_bool_type;
463 const float y_ =
y - centerY;
464 const float sinay_ = sina * y_;
465 const float cosay_ = cosa * y_;
467 float *bufferPointer = buffer;
469 const qreal *curveDataPointer =
d->curveData.data();
471 float_v currentIndices = xsimd::detail::make_sequence_as_batch<float_v>();
473 const float_v increment((
float)float_v::size);
474 const float_v vCenterX(centerX);
476 const float_v vCosa(cosa);
477 const float_v vSina(sina);
478 const float_v vCosaY_(cosay_);
479 const float_v vSinaY_(sinay_);
481 const float_v vYCoeff(
static_cast<float>(
d->ycoeff));
482 const float_v vXCoeff(
static_cast<float>(
d->xcoeff));
483 const float_v vCurveResolution(
static_cast<float>(
d->curveResolution));
485 const float_v vOne(1);
486 const float_v vZero(0);
487 const float_v vValMax(255.f);
489 for (
size_t i = 0; i < static_cast<size_t>(width); i += float_v::size) {
490 const float_v x_ = currentIndices - vCenterX;
492 float_v xr = x_ * vCosa - vSinaY_;
493 float_v yr = xsimd::abs(x_ * vSina + vCosaY_);
496 float_m excludeMask =
d->fadeMaker.needFade(xr, yr);
499 if (!xsimd::all(excludeMask)) {
502 float_v preSIndex = xsimd::abs(xr) * vXCoeff;
503 float_v preTIndex = xsimd::abs(yr) * vYCoeff;
505 preSIndex = xsimd::select(preSIndex > vOne, vOne, preSIndex);
506 preTIndex = xsimd::select(preTIndex > vOne, vOne, preTIndex);
508 const auto sIndex = xsimd::nearbyint_as_int(preSIndex * vCurveResolution);
509 const auto tIndex = xsimd::nearbyint_as_int(preTIndex * vCurveResolution);
511 const auto sIndexInverted = xsimd::to_int(vCurveResolution - xsimd::to_float(sIndex));
512 const auto tIndexInverted = xsimd::to_int(vCurveResolution - xsimd::to_float(tIndex));
514 const auto vCurvedDataSIndex = float_v::gather(curveDataPointer, sIndex);
515 const auto vCurvedDataTIndex = float_v::gather(curveDataPointer, tIndex);
516 const auto vCurvedDataSIndexInv = float_v::gather(curveDataPointer, sIndexInverted);
517 const auto vCurvedDataTIndexInv = float_v::gather(curveDataPointer, tIndexInverted);
519 float_v fullFade = vValMax
521 - (vCurvedDataSIndex * (vOne - vCurvedDataSIndexInv) * vCurvedDataTIndex
522 * (vOne - vCurvedDataTIndexInv)));
525 d->fadeMaker.apply2DFader(fullFade, excludeMask, xr, yr);
528 const float_m mask = fullFade < vZero;
532 const float_m outerMask = fullFade > 254.974f;
533 fullFade = xsimd::select(outerMask, vValMax, fullFade);
536 float_v vFade = fullFade / vValMax;
539 vFade = xsimd::select(excludeMask, vValue, vFade);
540 vFade.store_aligned(bufferPointer);
542 vValue.store_aligned(bufferPointer);
544 currentIndices = currentIndices + increment;
546 bufferPointer += float_v::size;
auto set_one(const batch< T, A > &src, const batch_bool< T, A > &mask) noexcept
batch< T, A > pow2(batch< T, A > const &self) noexcept
auto set_zero(const batch< T, A > &src, const batch_bool< T, A > &mask) noexcept