25static constexpr const T &
SkTPin(
const T &x,
const T &lo,
const T &hi)
27 return std::max(lo, std::min(x, hi));
32 return std::floor((x) + 0.5);
36 return (
float)std::floor((x) + 0.5);
39template <
typename T, std::enable_if_t<std::is_
floating_po
int_v<T>,
bool> = true>
45#if defined(_MSC_VER) && !defined(__clang__)
46# define SK_CHECK_NAN(resultVal) \
51# define SK_CHECK_NAN(resultVal)
75static inline float divide_and_pin(
float numer,
float denom,
float min,
float max)
77 float result =
SkTPin(numer / denom, min, max);
79 Q_ASSERT(result >= min && result <= max);
96 return lightRadius *
divide_and_pin(occluderZ, lightZ - occluderZ, 0.0f, 0.95f);
101 QVector2D *translate)
104 *blurRadius = lightRadius * zRatio;
106 *translate = QVector2D(-zRatio * lightX, -zRatio * lightY);
111 QVector2D *translate)
113 *blurRadius = lightRadius * occluderZ;
118 *translate = QVector2D(-zRatio * lightX, -zRatio * lightY);
132 float blurRadius,
float insetWidth)
135 QRectF bounds = devRect;
136 Q_ASSERT(insetWidth > 0);
137 scalar innerRadius = 0.0f;
138 scalar outerRadius = devRadius;
145 umbraInset = std::max(outerRadius, blurRadius);
151 innerRadius = devRadius - insetWidth;
154 if (insetWidth <= 0.5f * std::min(devRect.width(), devRect.height())) {
157 innerRadius = std::max(insetWidth - umbraInset, 0.0f);
164 fGeoData = (
Geometry{ color, outerRadius, umbraInset, innerRadius, blurRadius, bounds, type,
219 6, 18, 27, 6, 27, 25,
220 18, 12, 26, 18, 26, 27,
221 12, 0, 24, 12, 24, 26,
224 0, 1, 2, 0, 2, 3, 0, 3, 4, 0, 4, 5,
225 6, 11, 10, 6, 10, 9, 6, 9, 8, 6, 8, 7,
226 12, 17, 16, 12, 16, 15, 12, 15, 14, 12, 14, 13,
227 18, 19, 20, 18, 20, 21, 18, 21, 22, 18, 22, 23,
232 18, 23, 17, 18, 17, 12,
315 QRgb color = args.
color;
316 scalar outerRadius = args.outer_radius;
317 scalar innerRadius = args.inner_radius;
318 scalar blurRadius = args.blur_radius;
319 scalar distanceCorrection = outerRadius / blurRadius;
321 const QRectF &bounds = args.dev_bounds;
324 innerRadius = innerRadius / outerRadius;
326 auto center = QVector2D(bounds.center().x(), bounds.center().y());
327 scalar halfWidth = 0.5f * bounds.width();
328 scalar octOffset = 0.41421356237f;
332 v->
setPoint(center + QVector2D(-octOffset * halfWidth, -halfWidth));
334 v->setOffset({ -octOffset, -1 });
335 v->distance_correction = distanceCorrection;
339 v->setPoint(center + QVector2D(octOffset * halfWidth, -halfWidth));
341 v->setOffset({ octOffset, -1 });
342 v->distance_correction = distanceCorrection;
346 v->setPoint(center + QVector2D(halfWidth, -octOffset * halfWidth));
348 v->setOffset({ 1, -octOffset });
349 v->distance_correction = distanceCorrection;
353 v->setPoint(center + QVector2D(halfWidth, octOffset * halfWidth));
355 v->setOffset({ 1, octOffset });
356 v->distance_correction = distanceCorrection;
360 v->setPoint(center + QVector2D(octOffset * halfWidth, halfWidth));
362 v->setOffset({ octOffset, 1 });
363 v->distance_correction = distanceCorrection;
367 v->setPoint(center + QVector2D(-octOffset * halfWidth, halfWidth));
369 v->setOffset({ -octOffset, 1 });
370 v->distance_correction = distanceCorrection;
374 v->setPoint(center + QVector2D(-halfWidth, octOffset * halfWidth));
376 v->setOffset({ -1, octOffset });
377 v->distance_correction = distanceCorrection;
381 v->setPoint(center + QVector2D(-halfWidth, -octOffset * halfWidth));
383 v->setOffset({ -1, -octOffset });
384 v->distance_correction = distanceCorrection;
392 scalar r = args.inner_radius;
393 v->setPoint(center + QVector2D(-s * r, -c * r));
395 v->setOffset({ -s * innerRadius, -c * innerRadius });
396 v->distance_correction = distanceCorrection;
400 v->setPoint(center + QVector2D(s * r, -c * r));
402 v->setOffset({ s * innerRadius, -c * innerRadius });
403 v->distance_correction = distanceCorrection;
407 v->setPoint(center + QVector2D(c * r, -s * r));
409 v->setOffset({ c * innerRadius, -s * innerRadius });
410 v->distance_correction = distanceCorrection;
414 v->setPoint(center + QVector2D(c * r, s * r));
416 v->setOffset({ c * innerRadius, s * innerRadius });
417 v->distance_correction = distanceCorrection;
421 v->setPoint(center + QVector2D(s * r, c * r));
423 v->setOffset({ s * innerRadius, c * innerRadius });
424 v->distance_correction = distanceCorrection;
428 v->setPoint(center + QVector2D(-s * r, c * r));
430 v->setOffset({ -s * innerRadius, c * innerRadius });
431 v->distance_correction = distanceCorrection;
435 v->setPoint(center + QVector2D(-c * r, s * r));
437 v->setOffset({ -c * innerRadius, s * innerRadius });
438 v->distance_correction = distanceCorrection;
442 v->setPoint(center + QVector2D(-c * r, -s * r));
444 v->setOffset({ -c * innerRadius, -s * innerRadius });
445 v->distance_correction = distanceCorrection;
451 v->setOffset({ 0, 0 });
452 v->distance_correction = distanceCorrection;
461 QRgb color = args.
color;
467 scalar min_dim = 0.5f * std::min(bounds.width(), bounds.height());
468 if (umbra_inset > min_dim) {
469 umbra_inset = min_dim;
472 scalar xInner[4] = { (float)bounds.left() + umbra_inset,
473 (float)bounds.right() - umbra_inset,
474 (float)bounds.left() + umbra_inset,
475 (float)bounds.right() - umbra_inset };
476 scalar xMid[4] = { (float)bounds.left() + outer_radius,
477 (float)bounds.right() - outer_radius,
478 (float)bounds.left() + outer_radius,
479 (float)bounds.right() - outer_radius };
480 scalar xOuter[4] = { (float)bounds.left(), (float)bounds.right(), (float)bounds.left(),
481 (float)bounds.right() };
482 scalar yInner[4] = { (float)bounds.top() + umbra_inset, (float)bounds.top() + umbra_inset,
483 (float)bounds.bottom() - umbra_inset,
484 (float)bounds.bottom() - umbra_inset };
485 scalar yMid[4] = { (float)bounds.top() + outer_radius, (float)bounds.top() + outer_radius,
486 (float)bounds.bottom() - outer_radius,
487 (float)bounds.bottom() - outer_radius };
488 scalar yOuter[4] = { (float)bounds.top(), (float)bounds.top(), (float)bounds.bottom(),
489 (float)bounds.bottom() };
503 QVector2D outerVec = QVector2D(outer_radius - umbra_inset, -outer_radius - umbra_inset);
504 outerVec.normalize();
510 umbra_inset / (
SK_FloatSqrt2 * (outer_radius - umbra_inset) - outer_radius);
511 QVector2D diag_vec = QVector2D(diag_val, diag_val);
512 scalar distance_correction = umbra_inset / blurRadius;
516 for (
int i = 0; i < 4; ++i) {
520 v->setOffset({ 0, 0 });
521 v->distance_correction = distance_correction;
525 v->setPoint(xOuter[i], yInner[i]);
527 v->setOffset({ 0, -1 });
528 v->distance_correction = distance_correction;
531 v->setPoint(xOuter[i], yMid[i]);
533 v->setOffset(outerVec);
534 v->distance_correction = distance_correction;
537 v->setPoint(xOuter[i], yOuter[i]);
539 v->setOffset(diag_vec);
540 v->distance_correction = distance_correction;
543 v->setPoint(xMid[i], yOuter[i]);
545 v->setOffset(outerVec);
546 v->distance_correction = distance_correction;
549 v->setPoint(xInner[i], yOuter[i]);
551 v->setOffset({ 0, -1 });
552 v->distance_correction = distance_correction;
566 v->setPoint(bounds.left() + inset, bounds.top() + inset);
568 v->setOffset({ 0, 0 });
569 v->distance_correction = distance_correction;
573 v->setPoint(bounds.right() - inset, bounds.top() + inset);
575 v->setOffset({ 0, 0 });
576 v->distance_correction = distance_correction;
580 v->setPoint(bounds.left() + inset, bounds.bottom() - inset);
582 v->setOffset({ 0, 0 });
583 v->distance_correction = distance_correction;
587 v->setPoint(bounds.right() - inset, bounds.bottom() - inset);
589 v->setOffset({ 0, 0 });
590 v->distance_correction = distance_correction;
Definition skia_shadow.h:122
static int rrect_type_to_index_count(RRectType type)
Definition skia_shadow.h:286
static constexpr int kVertsPerStrokeCircle
Definition skia_shadow.h:255
static constexpr int kVertsPerFillRRect
Definition skia_shadow.h:251
void fillInRRectVerts(SceneGraph::ShadowVertex **vp) const
Definition skia_shadow.h:458
static int circle_type_to_vert_count(bool stroked)
Definition skia_shadow.h:258
static constexpr int kIndicesPerStrokeRRect
Definition skia_shadow.h:246
int fIndexCount
Definition skia_shadow.h:599
void fillInCircleVerts(bool isStroked, SceneGraph::ShadowVertex **vp) const
Definition skia_shadow.h:312
static constexpr int kVertsPerStrokeRRect
Definition skia_shadow.h:249
static constexpr int kIndicesPerOverstrokeRRect
Definition skia_shadow.h:244
static constexpr int kIndicesPerStrokeCircle
Definition skia_shadow.h:254
static constexpr int kIndicesPerFillRRect
Definition skia_shadow.h:248
static const uint16_t * rrect_type_to_indices(RRectType type)
Definition skia_shadow.h:299
RRectType
Definition skia_shadow.h:125
@ kFill_RRectType
Definition skia_shadow.h:126
@ kOverstroke_RRectType
Definition skia_shadow.h:128
@ kStroke_RRectType
Definition skia_shadow.h:127
static int circle_type_to_index_count(bool stroked)
Definition skia_shadow.h:263
float scalar
Definition skia_shadow.h:124
ShadowCircularRRectOp(QRgb color, const QRectF &devRect, float devRadius, bool isCircle, float blurRadius, float insetWidth)
Definition skia_shadow.h:131
static constexpr uint16_t gRRectIndices[]
Definition skia_shadow.h:214
static constexpr uint16_t gStrokeCircleIndices[]
Definition skia_shadow.h:200
static constexpr uint16_t gFillCircleIndices[]
Definition skia_shadow.h:189
int fVertCount
Definition skia_shadow.h:598
static constexpr int kVertsPerOverstrokeRRect
Definition skia_shadow.h:250
static const uint16_t * circle_type_to_indices(bool stroked)
Definition skia_shadow.h:268
static constexpr int kIndicesPerFillCircle
Definition skia_shadow.h:253
static constexpr int kVertsPerFillCircle
Definition skia_shadow.h:256
static constexpr float SK_FloatSqrt2
Definition skia_shadow.h:241
Geometry fGeoData
Definition skia_shadow.h:597
const uint16_t * fIndexPtr
Definition skia_shadow.h:600
static int rrect_type_to_vert_count(RRectType type)
Definition skia_shadow.h:273
Definition skia_shadow.h:20
constexpr int SK_MaxS32FitsInFloat
Definition skia_shadow.h:54
constexpr auto sk_float_round(double x)
Definition skia_shadow.h:34
static constexpr auto kAmbientGeomFactor
Definition skia_shadow.h:69
static constexpr const T & SkTPin(const T &x, const T &lo, const T &hi)
Definition skia_shadow.h:25
static constexpr auto kMaxAmbientRadius
Definition skia_shadow.h:73
constexpr auto SK_Scalar1
Definition skia_shadow.h:82
constexpr auto SK_ScalarNearlyZero
Definition skia_shadow.h:83
void GetSpotParams(scalar occluderZ, scalar lightX, scalar lightY, scalar lightZ, scalar lightRadius, scalar *blurRadius, scalar *scale, QVector2D *translate)
Definition skia_shadow.h:99
scalar AmbientBlurRadius(scalar height)
Definition skia_shadow.h:85
constexpr auto SkScalarRoundToInt(double x)
Definition skia_shadow.h:63
void GetDirectionalParams(scalar occluderZ, scalar lightX, scalar lightY, scalar lightZ, scalar lightRadius, scalar *blurRadius, scalar *scale, QVector2D *translate)
Definition skia_shadow.h:109
constexpr auto sk_double_round(double x)
Definition skia_shadow.h:30
scalar SpotBlurRadius(scalar occluderZ, scalar lightZ, scalar lightRadius)
Definition skia_shadow.h:94
constexpr int SK_MinS32FitsInFloat
Definition skia_shadow.h:55
static constexpr int sk_float_saturate2int(float x)
Definition skia_shadow.h:56
static constexpr auto kAmbientHeightFactor
Definition skia_shadow.h:68
float scalar
Definition skia_shadow.h:22
static float divide_and_pin(float numer, float denom, float min, float max)
Definition skia_shadow.h:75
scalar AmbientRecipAlpha(scalar height)
Definition skia_shadow.h:89
static constexpr bool SkIsNaN(T x)
Definition skia_shadow.h:40
#define SK_CHECK_NAN(resultVal)
Definition skia_shadow.h:51
void setPoint(float x, float y) noexcept
Definition geometry.h:36
Definition skia_shadow.h:177
scalar blur_radius
Definition skia_shadow.h:182
scalar umbra_inset
Definition skia_shadow.h:180
bool is_circle
Definition skia_shadow.h:185
RRectType type
Definition skia_shadow.h:184
QRectF dev_bounds
Definition skia_shadow.h:183
scalar inner_radius
Definition skia_shadow.h:181
QRgb color
Definition skia_shadow.h:178
scalar outer_radius
Definition skia_shadow.h:179