| /* |
| * Copyright 2022 Google LLC |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| * |
| * This file contains private enums related to paths. See also skbug.com/40042016 |
| */ |
| |
| #ifndef SkPathEnums_DEFINED |
| #define SkPathEnums_DEFINED |
| |
| #include "include/core/SkPathTypes.h" |
| |
| #include <optional> |
| |
| enum class SkPathConvexity { |
| kConvex_CW, |
| kConvex_CCW, |
| kConvex_Degenerate, // known to not have a determinable direction, but convex |
| |
| kConcave, |
| |
| kUnknown, // todo: can we eliminate this, and use optional or other patterns? |
| }; |
| |
| enum class SkResolveConvexity : bool { |
| kNo = false, |
| kYes = true, |
| }; |
| |
| static inline bool SkPathConvexity_IsConvex(SkPathConvexity cv) { |
| return cv == SkPathConvexity::kConvex_CW |
| || cv == SkPathConvexity::kConvex_CCW |
| || cv == SkPathConvexity::kConvex_Degenerate; |
| } |
| |
| static inline SkPathConvexity SkPathConvexity_OppositeConvexDirection(SkPathConvexity cv) { |
| SkASSERT(SkPathConvexity_IsConvex(cv)); |
| switch (cv) { |
| case SkPathConvexity::kConvex_CW: cv = SkPathConvexity::kConvex_CCW; break; |
| case SkPathConvexity::kConvex_CCW: cv = SkPathConvexity::kConvex_CW; break; |
| default: break; |
| } |
| return cv; |
| } |
| |
| enum class SkPathFirstDirection { |
| kCW, // == SkPathDirection::kCW |
| kCCW, // == SkPathDirection::kCCW |
| kUnknown, |
| }; |
| |
| static inline SkPathConvexity SkPathDirection_ToConvexity(SkPathDirection dir) { |
| switch (dir) { |
| case SkPathDirection::kCW: return SkPathConvexity::kConvex_CW; |
| case SkPathDirection::kCCW: return SkPathConvexity::kConvex_CCW; |
| } |
| SkUNREACHABLE; |
| } |
| |
| static inline SkPathConvexity SkPathFirstDirection_ToConvexity(SkPathFirstDirection dir) { |
| switch (dir) { |
| case SkPathFirstDirection::kCW: return SkPathConvexity::kConvex_CW; |
| case SkPathFirstDirection::kCCW: return SkPathConvexity::kConvex_CCW; |
| case SkPathFirstDirection::kUnknown: return SkPathConvexity::kConvex_Degenerate; |
| } |
| SkUNREACHABLE; |
| } |
| |
| static inline std::optional<SkPathDirection> SkPathConvexity_ToDirection(SkPathConvexity cv) { |
| if (cv == SkPathConvexity::kConvex_CW) { |
| return SkPathDirection::kCW; |
| } |
| if (cv == SkPathConvexity::kConvex_CCW) { |
| return SkPathDirection::kCCW; |
| } |
| return {}; |
| } |
| |
| static inline SkPathFirstDirection SkPathConvexity_ToFirstDirection(SkPathConvexity cv) { |
| if (cv == SkPathConvexity::kConvex_CW) { |
| return SkPathFirstDirection::kCW; |
| } |
| if (cv == SkPathConvexity::kConvex_CCW) { |
| return SkPathFirstDirection::kCCW; |
| } |
| return SkPathFirstDirection::kUnknown; |
| } |
| |
| static inline SkPathFirstDirection SkPathDirectionToFirst(SkPathDirection dir) { |
| return dir == SkPathDirection::kCW ? SkPathFirstDirection::kCW |
| : SkPathFirstDirection::kCCW; |
| } |
| |
| #endif |