1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2017 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef SkOffsetPolygon_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define SkOffsetPolygon_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPoint.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkScalar.h" 13*c8dee2aaSAndroid Build Coastguard Worker 14*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint> 15*c8dee2aaSAndroid Build Coastguard Worker 16*c8dee2aaSAndroid Build Coastguard Worker #if !defined(SK_ENABLE_OPTIMIZE_SIZE) 17*c8dee2aaSAndroid Build Coastguard Worker struct SkRect; 18*c8dee2aaSAndroid Build Coastguard Worker template <typename T> class SkTDArray; 19*c8dee2aaSAndroid Build Coastguard Worker 20*c8dee2aaSAndroid Build Coastguard Worker /** 21*c8dee2aaSAndroid Build Coastguard Worker * Generates a polygon that is inset a constant from the boundary of a given convex polygon. 22*c8dee2aaSAndroid Build Coastguard Worker * The input polygon is expected to have values clamped to the nearest 1/16th. 23*c8dee2aaSAndroid Build Coastguard Worker * 24*c8dee2aaSAndroid Build Coastguard Worker * @param inputPolygonVerts Array of points representing the vertices of the original polygon. 25*c8dee2aaSAndroid Build Coastguard Worker * It should be convex and have no coincident points. 26*c8dee2aaSAndroid Build Coastguard Worker * @param inputPolygonSize Number of vertices in the original polygon. 27*c8dee2aaSAndroid Build Coastguard Worker * @param inset How far we wish to inset the polygon. This should be a positive value. 28*c8dee2aaSAndroid Build Coastguard Worker * @param insetPolygon The resulting inset polygon, if any. 29*c8dee2aaSAndroid Build Coastguard Worker * @return true if an inset polygon exists, false otherwise. 30*c8dee2aaSAndroid Build Coastguard Worker */ 31*c8dee2aaSAndroid Build Coastguard Worker bool SkInsetConvexPolygon(const SkPoint* inputPolygonVerts, int inputPolygonSize, 32*c8dee2aaSAndroid Build Coastguard Worker SkScalar inset, SkTDArray<SkPoint>* insetPolygon); 33*c8dee2aaSAndroid Build Coastguard Worker 34*c8dee2aaSAndroid Build Coastguard Worker /** 35*c8dee2aaSAndroid Build Coastguard Worker * Generates a simple polygon (if possible) that is offset a constant distance from the boundary 36*c8dee2aaSAndroid Build Coastguard Worker * of a given simple polygon. 37*c8dee2aaSAndroid Build Coastguard Worker * The input polygon must be simple, have no coincident vertices or collinear edges, and have 38*c8dee2aaSAndroid Build Coastguard Worker * values clamped to the nearest 1/16th. 39*c8dee2aaSAndroid Build Coastguard Worker * 40*c8dee2aaSAndroid Build Coastguard Worker * @param inputPolygonVerts Array of points representing the vertices of the original polygon. 41*c8dee2aaSAndroid Build Coastguard Worker * @param inputPolygonSize Number of vertices in the original polygon. 42*c8dee2aaSAndroid Build Coastguard Worker * @param bounds Bounding rectangle for the original polygon. 43*c8dee2aaSAndroid Build Coastguard Worker * @param offset How far we wish to offset the polygon. 44*c8dee2aaSAndroid Build Coastguard Worker * Positive values indicate insetting, negative values outsetting. 45*c8dee2aaSAndroid Build Coastguard Worker * @param offsetPolgon The resulting offset polygon, if any. 46*c8dee2aaSAndroid Build Coastguard Worker * @param polygonIndices The indices of the original polygon that map to the new one. 47*c8dee2aaSAndroid Build Coastguard Worker * @return true if an offset simple polygon exists, false otherwise. 48*c8dee2aaSAndroid Build Coastguard Worker */ 49*c8dee2aaSAndroid Build Coastguard Worker bool SkOffsetSimplePolygon(const SkPoint* inputPolygonVerts, int inputPolygonSize, 50*c8dee2aaSAndroid Build Coastguard Worker const SkRect& bounds, SkScalar offset, SkTDArray<SkPoint>* offsetPolygon, 51*c8dee2aaSAndroid Build Coastguard Worker SkTDArray<int>* polygonIndices = nullptr); 52*c8dee2aaSAndroid Build Coastguard Worker 53*c8dee2aaSAndroid Build Coastguard Worker /** 54*c8dee2aaSAndroid Build Coastguard Worker * Compute the number of points needed for a circular join when offsetting a vertex. 55*c8dee2aaSAndroid Build Coastguard Worker * The lengths of offset0 and offset1 don't have to equal |offset| -- only the direction matters. 56*c8dee2aaSAndroid Build Coastguard Worker * The segment lengths will be approximately four pixels. 57*c8dee2aaSAndroid Build Coastguard Worker * 58*c8dee2aaSAndroid Build Coastguard Worker * @param offset0 Starting offset vector direction. 59*c8dee2aaSAndroid Build Coastguard Worker * @param offset1 Ending offset vector direction. 60*c8dee2aaSAndroid Build Coastguard Worker * @param offset Offset value (can be negative). 61*c8dee2aaSAndroid Build Coastguard Worker * @param rotSin Sine of rotation delta per step. 62*c8dee2aaSAndroid Build Coastguard Worker * @param rotCos Cosine of rotation delta per step. 63*c8dee2aaSAndroid Build Coastguard Worker * @param n Number of steps to fill out the arc. 64*c8dee2aaSAndroid Build Coastguard Worker * @return true for success, false otherwise 65*c8dee2aaSAndroid Build Coastguard Worker */ 66*c8dee2aaSAndroid Build Coastguard Worker bool SkComputeRadialSteps(const SkVector& offset0, const SkVector& offset1, SkScalar offset, 67*c8dee2aaSAndroid Build Coastguard Worker SkScalar* rotSin, SkScalar* rotCos, int* n); 68*c8dee2aaSAndroid Build Coastguard Worker 69*c8dee2aaSAndroid Build Coastguard Worker /** 70*c8dee2aaSAndroid Build Coastguard Worker * Determine winding direction for a polygon. 71*c8dee2aaSAndroid Build Coastguard Worker * The input polygon must be simple or the result will be meaningless. 72*c8dee2aaSAndroid Build Coastguard Worker * 73*c8dee2aaSAndroid Build Coastguard Worker * @param polygonVerts Array of points representing the vertices of the polygon. 74*c8dee2aaSAndroid Build Coastguard Worker * @param polygonSize Number of vertices in the polygon. 75*c8dee2aaSAndroid Build Coastguard Worker * @return 1 for cw, -1 for ccw, and 0 if zero signed area (either degenerate or self-intersecting). 76*c8dee2aaSAndroid Build Coastguard Worker * The y-axis is assumed to be pointing down. 77*c8dee2aaSAndroid Build Coastguard Worker */ 78*c8dee2aaSAndroid Build Coastguard Worker int SkGetPolygonWinding(const SkPoint* polygonVerts, int polygonSize); 79*c8dee2aaSAndroid Build Coastguard Worker 80*c8dee2aaSAndroid Build Coastguard Worker /** 81*c8dee2aaSAndroid Build Coastguard Worker * Determine whether a polygon is convex or not. 82*c8dee2aaSAndroid Build Coastguard Worker * 83*c8dee2aaSAndroid Build Coastguard Worker * @param polygonVerts Array of points representing the vertices of the polygon. 84*c8dee2aaSAndroid Build Coastguard Worker * @param polygonSize Number of vertices in the polygon. 85*c8dee2aaSAndroid Build Coastguard Worker * @return true if the polygon is convex, false otherwise. 86*c8dee2aaSAndroid Build Coastguard Worker */ 87*c8dee2aaSAndroid Build Coastguard Worker bool SkIsConvexPolygon(const SkPoint* polygonVerts, int polygonSize); 88*c8dee2aaSAndroid Build Coastguard Worker 89*c8dee2aaSAndroid Build Coastguard Worker /** 90*c8dee2aaSAndroid Build Coastguard Worker * Determine whether a polygon is simple (i.e., not self-intersecting) or not. 91*c8dee2aaSAndroid Build Coastguard Worker * The input polygon must have no coincident vertices or the test will fail. 92*c8dee2aaSAndroid Build Coastguard Worker * The polygon is also expected to have values clamped to the nearest 1/16th. 93*c8dee2aaSAndroid Build Coastguard Worker * 94*c8dee2aaSAndroid Build Coastguard Worker * @param polygonVerts Array of points representing the vertices of the polygon. 95*c8dee2aaSAndroid Build Coastguard Worker * @param polygonSize Number of vertices in the polygon. 96*c8dee2aaSAndroid Build Coastguard Worker * @return true if the polygon is simple, false otherwise. 97*c8dee2aaSAndroid Build Coastguard Worker */ 98*c8dee2aaSAndroid Build Coastguard Worker bool SkIsSimplePolygon(const SkPoint* polygonVerts, int polygonSize); 99*c8dee2aaSAndroid Build Coastguard Worker 100*c8dee2aaSAndroid Build Coastguard Worker /** 101*c8dee2aaSAndroid Build Coastguard Worker * Compute indices to triangulate the given polygon. 102*c8dee2aaSAndroid Build Coastguard Worker * The input polygon must be simple (i.e. it is not self-intersecting) 103*c8dee2aaSAndroid Build Coastguard Worker * and have no coincident vertices or collinear edges. 104*c8dee2aaSAndroid Build Coastguard Worker * 105*c8dee2aaSAndroid Build Coastguard Worker * @param polygonVerts Array of points representing the vertices of the polygon. 106*c8dee2aaSAndroid Build Coastguard Worker * @param indexMap Mapping from index in the given array to the final index in the triangulation. 107*c8dee2aaSAndroid Build Coastguard Worker * @param polygonSize Number of vertices in the polygon. 108*c8dee2aaSAndroid Build Coastguard Worker * @param triangleIndices Indices of the resulting triangulation. 109*c8dee2aaSAndroid Build Coastguard Worker * @return true if successful, false otherwise. 110*c8dee2aaSAndroid Build Coastguard Worker */ 111*c8dee2aaSAndroid Build Coastguard Worker bool SkTriangulateSimplePolygon(const SkPoint* polygonVerts, uint16_t* indexMap, int polygonSize, 112*c8dee2aaSAndroid Build Coastguard Worker SkTDArray<uint16_t>* triangleIndices); 113*c8dee2aaSAndroid Build Coastguard Worker 114*c8dee2aaSAndroid Build Coastguard Worker #endif // !defined(SK_ENABLE_OPTIMIZE_SIZE) 115*c8dee2aaSAndroid Build Coastguard Worker 116*c8dee2aaSAndroid Build Coastguard Worker #endif 117