121 float blurRadius,
float insetWidth)
124 QRectF bounds = devRect;
125 Q_ASSERT(insetWidth > 0);
126 QVector4D innerRadii;
127 QVector4D umbraInsets;
131 umbraInsets = QVector4D(0, 0, 0, 0);
133 for (
int i = 0; i < 4; ++i)
134 umbraInsets[i] = std::max(devRadii[i], blurRadius);
140 const scalar innerRadius = devRadii.x() - insetWidth;
141 innerRadii = QVector4D(innerRadius, innerRadius, innerRadius, innerRadius);
144 if (insetWidth <= 0.5f * std::min(devRect.width(), devRect.height())) {
147 bool hasInnerRadius =
false;
148 for (
int i = 0; i < 4; ++i) {
149 innerRadii[i] = std::max(insetWidth - umbraInsets[i], 0.0f);
150 hasInnerRadius |= innerRadii[i] > 0;
158 fGeoData = (
Geometry{ color, devRadii, umbraInsets, innerRadii, blurRadius, bounds, type,
213 6, 18, 27, 6, 27, 25,
214 18, 12, 26, 18, 26, 27,
215 12, 0, 24, 12, 24, 26,
218 0, 1, 2, 0, 2, 3, 0, 3, 4, 0, 4, 5,
219 6, 11, 10, 6, 10, 9, 6, 9, 8, 6, 8, 7,
220 12, 17, 16, 12, 16, 15, 12, 15, 14, 12, 14, 13,
221 18, 19, 20, 18, 20, 21, 18, 21, 22, 18, 22, 23,
226 18, 23, 17, 18, 17, 12,
309 QRgb color = args.
color;
310 scalar outerRadius = args.outer_radii.x();
311 scalar innerRadius = args.inner_radii.x();
312 scalar blurRadius = args.blur_radius;
313 scalar distanceCorrection = outerRadius / blurRadius;
315 const QRectF &bounds = args.dev_bounds;
318 innerRadius = innerRadius / outerRadius;
320 auto center = QVector2D(bounds.center().x(), bounds.center().y());
321 scalar halfWidth = 0.5f * bounds.width();
322 scalar octOffset = 0.41421356237f;
326 v->
setPoint(center + QVector2D(-octOffset * halfWidth, -halfWidth));
328 v->setOffset({ -octOffset, -1 });
329 v->distance_correction = distanceCorrection;
333 v->setPoint(center + QVector2D(octOffset * halfWidth, -halfWidth));
335 v->setOffset({ octOffset, -1 });
336 v->distance_correction = distanceCorrection;
340 v->setPoint(center + QVector2D(halfWidth, -octOffset * halfWidth));
342 v->setOffset({ 1, -octOffset });
343 v->distance_correction = distanceCorrection;
347 v->setPoint(center + QVector2D(halfWidth, octOffset * halfWidth));
349 v->setOffset({ 1, octOffset });
350 v->distance_correction = distanceCorrection;
354 v->setPoint(center + QVector2D(octOffset * halfWidth, halfWidth));
356 v->setOffset({ octOffset, 1 });
357 v->distance_correction = distanceCorrection;
361 v->setPoint(center + QVector2D(-octOffset * halfWidth, halfWidth));
363 v->setOffset({ -octOffset, 1 });
364 v->distance_correction = distanceCorrection;
368 v->setPoint(center + QVector2D(-halfWidth, octOffset * halfWidth));
370 v->setOffset({ -1, octOffset });
371 v->distance_correction = distanceCorrection;
375 v->setPoint(center + QVector2D(-halfWidth, -octOffset * halfWidth));
377 v->setOffset({ -1, -octOffset });
378 v->distance_correction = distanceCorrection;
386 scalar r = args.inner_radii.x();
387 v->setPoint(center + QVector2D(-s * r, -c * r));
389 v->setOffset({ -s * innerRadius, -c * innerRadius });
390 v->distance_correction = distanceCorrection;
394 v->setPoint(center + QVector2D(s * r, -c * r));
396 v->setOffset({ s * innerRadius, -c * innerRadius });
397 v->distance_correction = distanceCorrection;
401 v->setPoint(center + QVector2D(c * r, -s * r));
403 v->setOffset({ c * innerRadius, -s * innerRadius });
404 v->distance_correction = distanceCorrection;
408 v->setPoint(center + QVector2D(c * r, s * r));
410 v->setOffset({ c * innerRadius, s * innerRadius });
411 v->distance_correction = distanceCorrection;
415 v->setPoint(center + QVector2D(s * r, c * r));
417 v->setOffset({ s * innerRadius, c * innerRadius });
418 v->distance_correction = distanceCorrection;
422 v->setPoint(center + QVector2D(-s * r, c * r));
424 v->setOffset({ -s * innerRadius, c * innerRadius });
425 v->distance_correction = distanceCorrection;
429 v->setPoint(center + QVector2D(-c * r, s * r));
431 v->setOffset({ -c * innerRadius, s * innerRadius });
432 v->distance_correction = distanceCorrection;
436 v->setPoint(center + QVector2D(-c * r, -s * r));
438 v->setOffset({ -c * innerRadius, -s * innerRadius });
439 v->distance_correction = distanceCorrection;
445 v->setOffset({ 0, 0 });
446 v->distance_correction = distanceCorrection;
455 QRgb color = args.
color;
458 scalar min_dim = 0.5f * std::min(bounds.width(), bounds.height());
460 for (
int i = 0; i < 4; ++i) {
461 if (umbraInsets[i] > min_dim)
462 umbraInsets[i] = min_dim;
465 scalar xInner[4] = { (float)bounds.left() + umbraInsets[0],
466 (float)bounds.right() - umbraInsets[1],
467 (float)bounds.left() + umbraInsets[2],
468 (float)bounds.right() - umbraInsets[3] };
473 scalar xOuter[4] = { (float)bounds.left(), (float)bounds.right(), (float)bounds.left(),
474 (float)bounds.right() };
475 scalar yInner[4] = { (float)bounds.top() + umbraInsets[0],
476 (float)bounds.top() + umbraInsets[1],
477 (float)bounds.bottom() - umbraInsets[2],
478 (float)bounds.bottom() - umbraInsets[3] };
483 scalar yOuter[4] = { (float)bounds.top(), (float)bounds.top(), (float)bounds.bottom(),
484 (float)bounds.bottom() };
500 for (
int i = 0; i < 4; ++i) {
502 const scalar umbraInset = umbraInsets[i];
503 QVector2D outerVec = QVector2D(outerRadius - umbraInset,
504 -outerRadius - umbraInset);
505 outerVec.normalize();
508 const scalar diagValue = umbraInset
509 / (
SK_FloatSqrt2 * (outerRadius - umbraInset) - outerRadius);
510 const QVector2D diagVec = QVector2D(diagValue, diagValue);
511 const scalar distanceCorrection = umbraInset / blurRadius;
514 v->setPoint(xInner[i], yInner[i]);
516 v->setOffset({ 0, 0 });
517 v->distance_correction = distanceCorrection;
521 v->setPoint(xOuter[i], yInner[i]);
523 v->setOffset({ 0, -1 });
524 v->distance_correction = distanceCorrection;
527 v->setPoint(xOuter[i], yMid[i]);
529 v->setOffset(outerVec);
530 v->distance_correction = distanceCorrection;
533 v->setPoint(xOuter[i], yOuter[i]);
535 v->setOffset(diagVec);
536 v->distance_correction = distanceCorrection;
539 v->setPoint(xMid[i], yOuter[i]);
541 v->setOffset(outerVec);
542 v->distance_correction = distanceCorrection;
545 v->setPoint(xInner[i], yOuter[i]);
547 v->setOffset({ 0, -1 });
548 v->distance_correction = distanceCorrection;
560 v->setPoint(bounds.left() + umbraInsets[0] + args.
inner_radii[0],
561 bounds.top() + umbraInsets[0] + args.
inner_radii[0]);
563 v->setOffset({ 0, 0 });
564 v->distance_correction = umbraInsets[0] / blurRadius;
568 v->setPoint(bounds.right() - umbraInsets[1] - args.
inner_radii[1],
569 bounds.top() + umbraInsets[1] + args.
inner_radii[1]);
571 v->setOffset({ 0, 0 });
572 v->distance_correction = umbraInsets[1] / blurRadius;
576 v->setPoint(bounds.left() + umbraInsets[2] + args.
inner_radii[2],
577 bounds.bottom() - umbraInsets[2] - args.
inner_radii[2]);
579 v->setOffset({ 0, 0 });
580 v->distance_correction = umbraInsets[2] / blurRadius;
584 v->setPoint(bounds.right() - umbraInsets[3] - args.
inner_radii[3],
585 bounds.bottom() - umbraInsets[3] - args.
inner_radii[3]);
587 v->setOffset({ 0, 0 });
588 v->distance_correction = umbraInsets[3] / blurRadius;