Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
Public Member Functions | Public Attributes | List of all members
SkConicalGradient::FocalData Struct Reference

#include <SkConicalGradient.h>

Public Member Functions

bool set (SkScalar r0, SkScalar r1, SkMatrix *matrix)
 
bool isFocalOnCircle () const
 
bool isSwapped () const
 
bool isWellBehaved () const
 
bool isNativelyFocal () const
 

Public Attributes

SkScalar fR1
 
SkScalar fFocalX
 
bool fIsSwapped
 

Detailed Description

Definition at line 28 of file SkConicalGradient.h.

Member Function Documentation

◆ isFocalOnCircle()

bool SkConicalGradient::FocalData::isFocalOnCircle ( ) const
inline

Definition at line 44 of file SkConicalGradient.h.

44{ return SkScalarNearlyZero(1 - fR1); }
static bool SkScalarNearlyZero(SkScalar x, SkScalar tolerance=SK_ScalarNearlyZero)
Definition SkScalar.h:101

◆ isNativelyFocal()

bool SkConicalGradient::FocalData::isNativelyFocal ( ) const
inline

Definition at line 48 of file SkConicalGradient.h.

◆ isSwapped()

bool SkConicalGradient::FocalData::isSwapped ( ) const
inline

Definition at line 46 of file SkConicalGradient.h.

◆ isWellBehaved()

bool SkConicalGradient::FocalData::isWellBehaved ( ) const
inline

Definition at line 47 of file SkConicalGradient.h.

47{ return !this->isFocalOnCircle() && fR1 > 1; }

◆ set()

bool SkConicalGradient::FocalData::set ( SkScalar  r0,
SkScalar  r1,
SkMatrix matrix 
)

Definition at line 33 of file SkConicalGradient.cpp.

33 {
34 fIsSwapped = false;
35 fFocalX = sk_ieee_float_divide(r0, (r0 - r1));
36 if (SkScalarNearlyZero(fFocalX - 1)) {
37 // swap r0, r1
38 matrix->postTranslate(-1, 0);
39 matrix->postScale(-1, 1);
40 std::swap(r0, r1);
41 fFocalX = 0; // because r0 is now 0
42 fIsSwapped = true;
43 }
44
45 // Map {focal point, (1, 0)} to {(0, 0), (1, 0)}
46 const SkPoint from[2] = { {fFocalX, 0}, {1, 0} };
47 const SkPoint to[2] = { {0, 0}, {1, 0} };
48 SkMatrix focalMatrix;
49 if (!focalMatrix.setPolyToPoly(from, to, 2)) {
50 return false;
51 }
52 matrix->postConcat(focalMatrix);
53 fR1 = r1 / SkScalarAbs(1 - fFocalX); // focalMatrix has a scale of 1/(1-f)
54
55 // The following transformations are just to accelerate the shader computation by saving
56 // some arithmatic operations.
57 if (this->isFocalOnCircle()) {
58 matrix->postScale(0.5, 0.5);
59 } else {
60 matrix->postScale(fR1 / (fR1 * fR1 - 1), 1 / sqrt(SkScalarAbs(fR1 * fR1 - 1)));
61 }
62 matrix->postScale(SkScalarAbs(1 - fFocalX), SkScalarAbs(1 - fFocalX)); // scale |1 - f|
63 return true;
64}
static constexpr float sk_ieee_float_divide(float numer, float denom)
#define SkScalarAbs(x)
Definition SkScalar.h:39
SkMatrix & postScale(SkScalar sx, SkScalar sy, SkScalar px, SkScalar py)
Definition SkMatrix.cpp:360
bool setPolyToPoly(const SkPoint src[], const SkPoint dst[], int count)
unsigned useCenter Optional< SkMatrix > matrix
Definition SkRecords.h:258
SIN Vec< N, float > sqrt(const Vec< N, float > &x)
Definition SkVx.h:706

Member Data Documentation

◆ fFocalX

SkScalar SkConicalGradient::FocalData::fFocalX

Definition at line 30 of file SkConicalGradient.h.

◆ fIsSwapped

bool SkConicalGradient::FocalData::fIsSwapped

Definition at line 31 of file SkConicalGradient.h.

◆ fR1

SkScalar SkConicalGradient::FocalData::fR1

Definition at line 29 of file SkConicalGradient.h.


The documentation for this struct was generated from the following files: