/* * Copyright 2020 Google LLC * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef GrShape_DEFINED #define GrShape_DEFINED #include "include/core/SkArc.h" #include "include/core/SkPath.h" #include "include/core/SkPathTypes.h" #include "include/core/SkPoint.h" #include "include/core/SkRRect.h" #include "include/core/SkRect.h" #include "include/private/base/SkAssert.h" #include "include/private/base/SkTo.h" #include "include/private/base/SkTypeTraits.h" #include <cstdint> #include <new> #include <type_traits> // Represents a line segment between two points. struct GrLineSegment { … }; /** * GrShape is a convenience class to represent the many different specialized geometries that * Ganesh can handle, including rects, round rects, lines, as well as paths. It is intended as * a data-only class where any additional complex behavior is handled by an owning type (e.g. * GrStyledShape). However, it does include some basic utilities that unify common functionality * (such as contains()) from the underlying shape types. * * In order to have lossless simplification of the geometry, it also tracks winding direction, start * index, and fill inversion. The direction and index are match the SkPath indexing scheme for * the shape's type (e.g. rect, rrect, or oval). * * Regarding GrShape's empty shape: * - GrShape uses empty to refer to the absence of any geometric data * - SkRect::isEmpty() returns true if the rect is not sorted, even if it has area. GrShape will not * simplify these shapes to an empty GrShape. Rects with actual 0 width and height will simplify * to a point or line, not empty. This is to preserve geometric data for path effects and strokes. * - SkRRect::isEmpty() is true when the bounds have 0 width or height, so GrShape will simplify it * to a point or line, just like a rect. SkRRect does not have the concept of unsorted edges. */ class GrShape { … }; #endif