Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
Classes | Public Member Functions | Static Public Member Functions | Private Member Functions | List of all members
EllipseOp Class Referencefinal
Inheritance diagram for EllipseOp:
GrMeshDrawOp GrDrawOp GrOp SkNoncopyable

Public Member Functions

 EllipseOp (GrProcessorSet *processorSet, const SkPMColor4f &color, const SkMatrix &viewMatrix, const DeviceSpaceParams &params, const SkStrokeRec &stroke)
 
const char * name () const override
 
void visitProxies (const GrVisitProxyFunc &func) const override
 
GrProcessorSet::Analysis finalize (const GrCaps &caps, const GrAppliedClip *clip, GrClampType clampType) override
 
FixedFunctionFlags fixedFunctionFlags () const override
 
- Public Member Functions inherited from GrDrawOp
 GrDrawOp (uint32_t classID)
 
virtual bool usesMSAA () const
 
virtual ClipResult clipToShape (skgpu::ganesh::SurfaceDrawContext *, SkClipOp, const SkMatrix &, const GrShape &, GrAA)
 
virtual bool usesStencil () const
 
- Public Member Functions inherited from GrOp
virtual ~GrOp ()=default
 
CombineResult combineIfPossible (GrOp *that, SkArenaAlloc *alloc, const GrCaps &caps)
 
const SkRectbounds () const
 
void setClippedBounds (const SkRect &clippedBounds)
 
bool hasAABloat () const
 
bool hasZeroArea () const
 
void operator delete (void *p)
 
template<typename T >
const Tcast () const
 
template<typename T >
Tcast ()
 
uint32_t classID () const
 
uint32_t uniqueID () const
 
void prePrepare (GrRecordingContext *context, const GrSurfaceProxyView &dstView, GrAppliedClip *clip, const GrDstProxyView &dstProxyView, GrXferBarrierFlags renderPassXferBarriers, GrLoadOp colorLoadOp)
 
void prepare (GrOpFlushState *state)
 
void execute (GrOpFlushState *state, const SkRect &chainBounds)
 
void chainConcat (GrOp::Owner)
 
bool isChainHead () const
 
bool isChainTail () const
 
GrOpnextInChain () const
 
GrOpprevInChain () const
 
GrOp::Owner cutChain ()
 
void setBounds (const SkRect &newBounds, HasAABloat aabloat, IsHairline zeroArea)
 
void setTransformedBounds (const SkRect &srcBounds, const SkMatrix &m, HasAABloat aabloat, IsHairline zeroArea)
 
void makeFullScreen (GrSurfaceProxy *proxy)
 

Static Public Member Functions

static DEFINE_OP_CLASS_ID GrOp::Owner Make (GrRecordingContext *context, GrPaint &&paint, const SkMatrix &viewMatrix, const SkRect &ellipse, const SkStrokeRec &stroke)
 
- Static Public Member Functions inherited from GrMeshDrawOp
static bool CanUpgradeAAOnMerge (GrAAType aa1, GrAAType aa2)
 
- Static Public Member Functions inherited from GrOp
template<typename Op , typename... Args>
static Owner Make (GrRecordingContext *context, Args &&... args)
 
template<typename Op , typename... Args>
static Owner MakeWithProcessorSet (GrRecordingContext *context, const SkPMColor4f &color, GrPaint &&paint, Args &&... args)
 
template<typename Op , typename... Args>
static Owner MakeWithExtraMemory (GrRecordingContext *context, size_t extraSize, Args &&... args)
 
static uint32_t GenOpClassID ()
 

Private Member Functions

GrProgramInfoprogramInfo () override
 
void onCreateProgramInfo (const GrCaps *caps, SkArenaAlloc *arena, const GrSurfaceProxyView &writeView, bool usesMSAASurface, GrAppliedClip &&appliedClip, const GrDstProxyView &dstProxyView, GrXferBarrierFlags renderPassXferBarriers, GrLoadOp colorLoadOp) override
 
void onPrepareDraws (GrMeshDrawTarget *target) override
 
void onExecute (GrOpFlushState *flushState, const SkRect &chainBounds) override
 
CombineResult onCombineIfPossible (GrOp *t, SkArenaAlloc *, const GrCaps &caps) override
 

Additional Inherited Members

- Public Types inherited from GrDrawOp
enum class  ClipResult { kFail , kClippedGeometrically , kClippedInShader , kClippedOut }
 
- Public Types inherited from GrOp
enum class  CombineResult { kMerged , kMayChain , kCannotCombine }
 
enum class  HasAABloat : bool { kNo = false , kYes = true }
 
enum class  IsHairline : bool { kNo = false , kYes = true }
 
using Owner = std::unique_ptr< GrOp >
 
- Protected Types inherited from GrDrawOp
enum class  FixedFunctionFlags : uint32_t { kNone = 0x0 , kUsesHWAA = 0x1 , kUsesStencil = 0x2 }
 
- Protected Member Functions inherited from GrMeshDrawOp
 GrMeshDrawOp (uint32_t classID)
 
void createProgramInfo (const GrCaps *caps, SkArenaAlloc *arena, const GrSurfaceProxyView &writeView, bool usesMSAASurface, GrAppliedClip &&appliedClip, const GrDstProxyView &dstProxyView, GrXferBarrierFlags renderPassXferBarriers, GrLoadOp colorLoadOp)
 
void createProgramInfo (GrMeshDrawTarget *)
 
virtual void onPrePrepareDraws (GrRecordingContext *, const GrSurfaceProxyView &writeView, GrAppliedClip *, const GrDstProxyView &, GrXferBarrierFlags renderPassXferBarriers, GrLoadOp colorLoadOp)
 
- Protected Member Functions inherited from GrDrawOp
 GR_DECL_BITFIELD_CLASS_OPS_FRIENDS (FixedFunctionFlags)
 
- Static Protected Member Functions inherited from GrMeshDrawOp
static bool CombinedQuadCountWillOverflow (GrAAType aaType, bool willBeUpgradedToAA, int combinedQuadCount)
 

Detailed Description

Definition at line 1821 of file GrOvalOpFactory.cpp.

Constructor & Destructor Documentation

◆ EllipseOp()

EllipseOp::EllipseOp ( GrProcessorSet processorSet,
const SkPMColor4f color,
const SkMatrix viewMatrix,
const DeviceSpaceParams &  params,
const SkStrokeRec stroke 
)
inline

Definition at line 1913 of file GrOvalOpFactory.cpp.

1916 : INHERITED(ClassID())
1917 , fHelper(processorSet, GrAAType::kCoverage)
1918 , fUseScale(false) {
1919 SkStrokeRec::Style style = stroke.getStyle();
1920 bool isStrokeOnly =
1922
1923 fEllipses.emplace_back(Ellipse{color, params.fXRadius, params.fYRadius,
1924 params.fInnerXRadius, params.fInnerYRadius,
1925 SkRect::MakeLTRB(params.fCenter.fX - params.fXRadius,
1926 params.fCenter.fY - params.fYRadius,
1927 params.fCenter.fX + params.fXRadius,
1928 params.fCenter.fY + params.fYRadius)});
1929
1930 this->setBounds(fEllipses.back().fDevBounds, HasAABloat::kYes, IsHairline::kNo);
1931
1932 fStroked = isStrokeOnly && params.fInnerXRadius > 0 && params.fInnerYRadius > 0;
1933 fViewMatrixIfUsingLocalCoords = viewMatrix;
1934 }
SkColor4f color
void setBounds(const SkRect &newBounds, HasAABloat aabloat, IsHairline zeroArea)
Definition GrOp.h:279
Style getStyle() const
T & emplace_back(Args &&... args)
Definition SkTArray.h:243
const EmbeddedViewParams * params
static constexpr SkRect MakeLTRB(float l, float t, float r, float b)
Definition SkRect.h:646

Member Function Documentation

◆ finalize()

GrProcessorSet::Analysis EllipseOp::finalize ( const GrCaps ,
const GrAppliedClip ,
GrClampType   
)
inlineoverridevirtual

This is called after the GrAppliedClip has been computed and just prior to recording the op or combining it with a previously recorded op. The op should convert any proxies or resources it owns to "pending io" status so that resource allocation can be more optimal. Additionally, at this time the op must report whether a copy of the destination (or destination texture itself) needs to be provided to the GrXferProcessor when this op executes.

Implements GrDrawOp.

Definition at line 1946 of file GrOvalOpFactory.cpp.

1947 {
1948 fUseScale = !caps.shaderCaps()->fFloatIs32Bits &&
1949 !caps.shaderCaps()->fHasLowFragmentPrecision;
1950 SkPMColor4f* color = &fEllipses.front().fColor;
1951 return fHelper.finalizeProcessors(caps, clip, clampType,
1953 &fWideColor);
1954 }
static SkPath clip(const SkPath &path, const SkHalfPlane &plane)
Definition SkPath.cpp:3824
GrProcessorSet::Analysis finalizeProcessors(const GrCaps &caps, const GrAppliedClip *clip, GrClampType clampType, GrProcessorAnalysisCoverage geometryCoverage, GrProcessorAnalysisColor *geometryColor)

◆ fixedFunctionFlags()

FixedFunctionFlags EllipseOp::fixedFunctionFlags ( ) const
inlineoverridevirtual

Reimplemented from GrDrawOp.

Definition at line 1956 of file GrOvalOpFactory.cpp.

1956{ return fHelper.fixedFunctionFlags(); }
GrDrawOp::FixedFunctionFlags fixedFunctionFlags() const

◆ Make()

static DEFINE_OP_CLASS_ID GrOp::Owner EllipseOp::Make ( GrRecordingContext context,
GrPaint &&  paint,
const SkMatrix viewMatrix,
const SkRect ellipse,
const SkStrokeRec stroke 
)
inlinestatic

Definition at line 1836 of file GrOvalOpFactory.cpp.

1840 {
1841 DeviceSpaceParams params;
1842 // do any matrix crunching before we reset the draw state for device coords
1843 params.fCenter = SkPoint::Make(ellipse.centerX(), ellipse.centerY());
1844 viewMatrix.mapPoints(&params.fCenter, 1);
1845 SkScalar ellipseXRadius = SkScalarHalf(ellipse.width());
1846 SkScalar ellipseYRadius = SkScalarHalf(ellipse.height());
1847 params.fXRadius = SkScalarAbs(viewMatrix[SkMatrix::kMScaleX] * ellipseXRadius +
1848 viewMatrix[SkMatrix::kMSkewX] * ellipseYRadius);
1849 params.fYRadius = SkScalarAbs(viewMatrix[SkMatrix::kMSkewY] * ellipseXRadius +
1850 viewMatrix[SkMatrix::kMScaleY] * ellipseYRadius);
1851
1852 // do (potentially) anisotropic mapping of stroke
1853 SkVector scaledStroke;
1854 SkScalar strokeWidth = stroke.getWidth();
1855 scaledStroke.fX = SkScalarAbs(
1856 strokeWidth * (viewMatrix[SkMatrix::kMScaleX] + viewMatrix[SkMatrix::kMSkewY]));
1857 scaledStroke.fY = SkScalarAbs(
1858 strokeWidth * (viewMatrix[SkMatrix::kMSkewX] + viewMatrix[SkMatrix::kMScaleY]));
1859
1860 SkStrokeRec::Style style = stroke.getStyle();
1861 bool isStrokeOnly =
1863 bool hasStroke = isStrokeOnly || SkStrokeRec::kStrokeAndFill_Style == style;
1864
1865 params.fInnerXRadius = 0;
1866 params.fInnerYRadius = 0;
1867 if (hasStroke) {
1868 if (SkScalarNearlyZero(scaledStroke.length())) {
1869 scaledStroke.set(SK_ScalarHalf, SK_ScalarHalf);
1870 } else {
1871 scaledStroke.scale(SK_ScalarHalf);
1872 }
1873
1874 // we only handle thick strokes for near-circular ellipses
1875 if (scaledStroke.length() > SK_ScalarHalf &&
1876 (0.5f * params.fXRadius > params.fYRadius ||
1877 0.5f * params.fYRadius > params.fXRadius)) {
1878 return nullptr;
1879 }
1880
1881 // we don't handle it if curvature of the stroke is less than curvature of the ellipse
1882 if (scaledStroke.fX * (params.fXRadius * params.fYRadius) <
1883 (scaledStroke.fY * scaledStroke.fY) * params.fXRadius ||
1884 scaledStroke.fY * (params.fXRadius * params.fXRadius) <
1885 (scaledStroke.fX * scaledStroke.fX) * params.fYRadius) {
1886 return nullptr;
1887 }
1888
1889 // this is legit only if scale & translation (which should be the case at the moment)
1890 if (isStrokeOnly) {
1891 params.fInnerXRadius = params.fXRadius - scaledStroke.fX;
1892 params.fInnerYRadius = params.fYRadius - scaledStroke.fY;
1893 }
1894
1895 params.fXRadius += scaledStroke.fX;
1896 params.fYRadius += scaledStroke.fY;
1897 }
1898
1899 // For large ovals with low precision floats, we fall back to the path renderer.
1900 // To compute the AA at the edge we divide by the gradient, which is clamped to a
1901 // minimum value to avoid divides by zero. With large ovals and low precision this
1902 // leads to blurring at the edge of the oval.
1903 const SkScalar kMaxOvalRadius = 16384;
1904 if (!context->priv().caps()->shaderCaps()->fFloatIs32Bits &&
1905 (params.fXRadius >= kMaxOvalRadius || params.fYRadius >= kMaxOvalRadius)) {
1906 return nullptr;
1907 }
1908
1909 return Helper::FactoryHelper<EllipseOp>(context, std::move(paint), viewMatrix,
1910 params, stroke);
1911 }
static const int strokeWidth
Definition BlurTest.cpp:60
static bool SkScalarNearlyZero(SkScalar x, SkScalar tolerance=SK_ScalarNearlyZero)
Definition SkScalar.h:101
#define SkScalarHalf(a)
Definition SkScalar.h:75
#define SK_ScalarHalf
Definition SkScalar.h:19
#define SkScalarAbs(x)
Definition SkScalar.h:39
const GrCaps * caps() const
const GrShaderCaps * shaderCaps() const
Definition GrCaps.h:63
GrRecordingContextPriv priv()
static constexpr int kMScaleX
horizontal scale factor
Definition SkMatrix.h:353
void mapPoints(SkPoint dst[], const SkPoint src[], int count) const
Definition SkMatrix.cpp:770
static constexpr int kMSkewY
vertical skew factor
Definition SkMatrix.h:356
static constexpr int kMScaleY
vertical scale factor
Definition SkMatrix.h:357
static constexpr int kMSkewX
horizontal skew factor
Definition SkMatrix.h:354
@ kStrokeAndFill_Style
Definition SkStrokeRec.h:36
SkScalar getWidth() const
Definition SkStrokeRec.h:42
const Paint & paint
float SkScalar
Definition extension.cpp:12
float fX
x-axis value
static constexpr SkPoint Make(float x, float y)
void set(float x, float y)
float length() const
void scale(float scale, SkPoint *dst) const
Definition SkPoint.cpp:17
float fY
y-axis value
constexpr float centerX() const
Definition SkRect.h:776
constexpr float height() const
Definition SkRect.h:769
constexpr float centerY() const
Definition SkRect.h:785
constexpr float width() const
Definition SkRect.h:762

◆ name()

const char * EllipseOp::name ( ) const
inlineoverridevirtual

Implements GrOp.

Definition at line 1936 of file GrOvalOpFactory.cpp.

1936{ return "EllipseOp"; }

◆ onCombineIfPossible()

CombineResult EllipseOp::onCombineIfPossible ( GrOp t,
SkArenaAlloc ,
const GrCaps caps 
)
inlineoverrideprivatevirtual

Reimplemented from GrOp.

Definition at line 2051 of file GrOvalOpFactory.cpp.

2051 {
2052 EllipseOp* that = t->cast<EllipseOp>();
2053
2054 if (!fHelper.isCompatible(that->fHelper, caps, this->bounds(), that->bounds())) {
2056 }
2057
2058 if (fStroked != that->fStroked) {
2060 }
2061
2062 if (fHelper.usesLocalCoords() &&
2063 !SkMatrixPriv::CheapEqual(fViewMatrixIfUsingLocalCoords,
2064 that->fViewMatrixIfUsingLocalCoords)) {
2066 }
2067
2068 fEllipses.push_back_n(that->fEllipses.size(), that->fEllipses.begin());
2069 fWideColor |= that->fWideColor;
2071 }
const T & cast() const
Definition GrOp.h:148
const SkRect & bounds() const
Definition GrOp.h:122
bool isCompatible(const GrSimpleMeshDrawOpHelper &that, const GrCaps &, const SkRect &thisBounds, const SkRect &thatBounds, bool ignoreAAType=false) const
static bool CheapEqual(const SkMatrix &a, const SkMatrix &b)
T * push_back_n(int n)
Definition SkTArray.h:262
int size() const
Definition SkTArray.h:416

◆ onCreateProgramInfo()

void EllipseOp::onCreateProgramInfo ( const GrCaps caps,
SkArenaAlloc arena,
const GrSurfaceProxyView writeView,
bool  usesMSAASurface,
GrAppliedClip &&  appliedClip,
const GrDstProxyView dstProxyView,
GrXferBarrierFlags  renderPassXferBarriers,
GrLoadOp  colorLoadOp 
)
inlineoverrideprivatevirtual

Implements GrMeshDrawOp.

Definition at line 1961 of file GrOvalOpFactory.cpp.

1968 {
1969 SkMatrix localMatrix;
1970 if (!fViewMatrixIfUsingLocalCoords.invert(&localMatrix)) {
1971 return;
1972 }
1973
1974 GrGeometryProcessor* gp = EllipseGeometryProcessor::Make(arena, fStroked, fWideColor,
1975 fUseScale, localMatrix);
1976
1977 fProgramInfo = fHelper.createProgramInfo(caps,
1978 arena,
1979 writeView,
1980 usesMSAASurface,
1981 std::move(appliedClip),
1982 dstProxyView,
1983 gp,
1985 renderPassXferBarriers,
1986 colorLoadOp);
1987 }
static GrGeometryProcessor * Make(SkArenaAlloc *arena, bool stroke, bool wideColor, bool useScale, const SkMatrix &localMatrix)
GrProgramInfo * createProgramInfo(const GrCaps *, SkArenaAlloc *, const GrSurfaceProxyView &writeView, bool usesMSAASurface, GrAppliedClip &&, const GrDstProxyView &, GrGeometryProcessor *, GrPrimitiveType, GrXferBarrierFlags renderPassXferBarriers, GrLoadOp colorLoadOp)
bool invert(SkMatrix *inverse) const
Definition SkMatrix.h:1206

◆ onExecute()

void EllipseOp::onExecute ( GrOpFlushState flushState,
const SkRect chainBounds 
)
inlineoverrideprivatevirtual

Implements GrOp.

Definition at line 2041 of file GrOvalOpFactory.cpp.

2041 {
2042 if (!fProgramInfo || !fMesh) {
2043 return;
2044 }
2045
2046 flushState->bindPipelineAndScissorClip(*fProgramInfo, chainBounds);
2047 flushState->bindTextures(fProgramInfo->geomProc(), nullptr, fProgramInfo->pipeline());
2048 flushState->drawMesh(*fMesh);
2049 }
void drawMesh(const GrSimpleMesh &mesh)
void bindPipelineAndScissorClip(const GrProgramInfo &programInfo, const SkRect &drawBounds)
void bindTextures(const GrGeometryProcessor &geomProc, const GrSurfaceProxy &singleGeomProcTexture, const GrPipeline &pipeline)
const GrPipeline & pipeline() const
const GrGeometryProcessor & geomProc() const

◆ onPrepareDraws()

void EllipseOp::onPrepareDraws ( GrMeshDrawTarget target)
inlineoverrideprivatevirtual

Implements GrMeshDrawOp.

Definition at line 1989 of file GrOvalOpFactory.cpp.

1989 {
1990 if (!fProgramInfo) {
1991 this->createProgramInfo(target);
1992 if (!fProgramInfo) {
1993 return;
1994 }
1995 }
1996
1997 QuadHelper helper(target, fProgramInfo->geomProc().vertexStride(), fEllipses.size());
1998 VertexWriter verts{helper.vertices()};
1999 if (!verts) {
2000 SkDebugf("Could not allocate vertices\n");
2001 return;
2002 }
2003
2004 // On MSAA, bloat enough to guarantee any pixel that might be touched by the ellipse has
2005 // full sample coverage.
2006 float aaBloat = target->usesMSAASurface() ? SK_ScalarSqrt2 : .5f;
2007
2008 for (const auto& ellipse : fEllipses) {
2009 VertexColor color(ellipse.fColor, fWideColor);
2010 SkScalar xRadius = ellipse.fXRadius;
2011 SkScalar yRadius = ellipse.fYRadius;
2012
2013 // Compute the reciprocals of the radii here to save time in the shader
2014 struct { float xOuter, yOuter, xInner, yInner; } invRadii = {
2015 SkScalarInvert(xRadius),
2016 SkScalarInvert(yRadius),
2017 sk_ieee_float_divide(1.0f, ellipse.fInnerXRadius),
2018 sk_ieee_float_divide(1.0f, ellipse.fInnerYRadius)
2019 };
2020 SkScalar xMaxOffset = xRadius + aaBloat;
2021 SkScalar yMaxOffset = yRadius + aaBloat;
2022
2023 if (!fStroked) {
2024 // For filled ellipses we map a unit circle in the vertex attributes rather than
2025 // computing an ellipse and modifying that distance, so we normalize to 1
2026 xMaxOffset /= xRadius;
2027 yMaxOffset /= yRadius;
2028 }
2029
2030 // The inner radius in the vertex data must be specified in normalized space.
2031 verts.writeQuad(VertexWriter::TriStripFromRect(
2032 ellipse.fDevBounds.makeOutset(aaBloat, aaBloat)),
2033 color,
2034 origin_centered_tri_strip(xMaxOffset, yMaxOffset),
2035 VertexWriter::If(fUseScale, std::max(xRadius, yRadius)),
2036 invRadii);
2037 }
2038 fMesh = helper.mesh();
2039 }
void SK_SPI SkDebugf(const char format[],...) SK_PRINTF_LIKE(1
static constexpr float sk_ieee_float_divide(float numer, float denom)
#define SkScalarInvert(x)
Definition SkScalar.h:73
#define SK_ScalarSqrt2
Definition SkScalar.h:20
void createProgramInfo(const GrCaps *caps, SkArenaAlloc *arena, const GrSurfaceProxyView &writeView, bool usesMSAASurface, GrAppliedClip &&appliedClip, const GrDstProxyView &dstProxyView, GrXferBarrierFlags renderPassXferBarriers, GrLoadOp colorLoadOp)
uint32_t * target

◆ programInfo()

GrProgramInfo * EllipseOp::programInfo ( )
inlineoverrideprivatevirtual

Implements GrMeshDrawOp.

Definition at line 1959 of file GrOvalOpFactory.cpp.

1959{ return fProgramInfo; }

◆ visitProxies()

void EllipseOp::visitProxies ( const GrVisitProxyFunc func) const
inlineoverridevirtual

Reimplemented from GrOp.

Definition at line 1938 of file GrOvalOpFactory.cpp.

1938 {
1939 if (fProgramInfo) {
1940 fProgramInfo->visitFPProxies(func);
1941 } else {
1942 fHelper.visitProxies(func);
1943 }
1944 }
void visitFPProxies(const GrVisitProxyFunc &func) const
void visitProxies(const GrVisitProxyFunc &func) const

The documentation for this class was generated from the following file: