/* * Copyright 2019 Google LLC * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef GrQuadUtils_DEFINED #define GrQuadUtils_DEFINED #include "src/base/SkVx.h" #include "src/gpu/ganesh/geometry/GrQuad.h" #include <cstdint> enum class GrAA : bool; enum class GrAAType : unsigned int; enum class GrQuadAAFlags; struct SkRect; namespace GrQuadUtils { // Resolve disagreements between the overall requested AA type and the per-edge quad AA flags. // Both outAAType and outEdgeFlags will be updated. void ResolveAAType(GrAAType requestedAAType, GrQuadAAFlags requestedEdgeFlags, const GrQuad& quad, GrAAType* outAAtype, GrQuadAAFlags* outEdgeFlags); /** * Clip the device vertices of 'quad' to be in front of the W = 0 plane (w/in epsilon). The * local coordinates will be updated to match the new clipped vertices. This returns the number * of clipped quads that need to be drawn: 0 if 'quad' was entirely behind the plane, 1 if * 'quad' did not need to be clipped or if 2 or 3 vertices were clipped, or 2 if 'quad' had one * vertex clipped (producing a pentagonal shape spanned by 'quad' and 'extraVertices'). */ int ClipToW0(DrawQuad* quad, DrawQuad* extraVertices); /** * Crops quad to the provided device-space axis-aligned rectangle. If the intersection of this * quad (projected) and cropRect results in a quadrilateral, this returns true. If not, this * quad may be updated to be a smaller quad of the same type such that its intersection with * cropRect is visually the same. This function assumes that the 'quad' coordinates are finite. * * The provided edge flags are updated to reflect edges clipped by cropRect (toggling on or off * based on cropAA policy). If provided, the local coordinates will be updated to reflect the * updated device coordinates of this quad. * * If 'computeLocal' is false, the local coordinates in 'quad' will not be modified. */ bool CropToRect(const SkRect& cropRect, GrAA cropAA, DrawQuad* quad, bool computeLocal=true); inline void Outset(const skvx::float4& edgeDistances, GrQuad* quad); bool WillUseHairline(const GrQuad& quad, GrAAType aaType, GrQuadAAFlags edgeFlags); class TessellationHelper { … }; } // namespace GrQuadUtils void GrQuadUtils::Outset(const skvx::float4& edgeDistances, GrQuad* quad) { … } #endif