1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2014 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 SkDashPathPriv_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define SkDashPathPriv_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPathEffect.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkPathEffectBase.h" 13*c8dee2aaSAndroid Build Coastguard Worker 14*c8dee2aaSAndroid Build Coastguard Worker namespace SkDashPath { 15*c8dee2aaSAndroid Build Coastguard Worker /** 16*c8dee2aaSAndroid Build Coastguard Worker * Calculates the initialDashLength, initialDashIndex, and intervalLength based on the 17*c8dee2aaSAndroid Build Coastguard Worker * inputed phase and intervals. If adjustedPhase is passed in, then the phase will be 18*c8dee2aaSAndroid Build Coastguard Worker * adjusted to be between 0 and intervalLength. The result will be stored in adjustedPhase. 19*c8dee2aaSAndroid Build Coastguard Worker * If adjustedPhase is nullptr then it is assumed phase is already between 0 and intervalLength 20*c8dee2aaSAndroid Build Coastguard Worker * 21*c8dee2aaSAndroid Build Coastguard Worker * Caller should have already used ValidDashPath to exclude invalid data. 22*c8dee2aaSAndroid Build Coastguard Worker */ 23*c8dee2aaSAndroid Build Coastguard Worker void CalcDashParameters(SkScalar phase, const SkScalar intervals[], int32_t count, 24*c8dee2aaSAndroid Build Coastguard Worker SkScalar* initialDashLength, int32_t* initialDashIndex, 25*c8dee2aaSAndroid Build Coastguard Worker SkScalar* intervalLength, SkScalar* adjustedPhase = nullptr); 26*c8dee2aaSAndroid Build Coastguard Worker 27*c8dee2aaSAndroid Build Coastguard Worker bool FilterDashPath(SkPath* dst, const SkPath& src, SkStrokeRec*, const SkRect*, 28*c8dee2aaSAndroid Build Coastguard Worker const SkPathEffectBase::DashInfo& info); 29*c8dee2aaSAndroid Build Coastguard Worker 30*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_BUILD_FOR_FUZZER 31*c8dee2aaSAndroid Build Coastguard Worker const SkScalar kMaxDashCount = 10000; 32*c8dee2aaSAndroid Build Coastguard Worker #else 33*c8dee2aaSAndroid Build Coastguard Worker const SkScalar kMaxDashCount = 1000000; 34*c8dee2aaSAndroid Build Coastguard Worker #endif 35*c8dee2aaSAndroid Build Coastguard Worker 36*c8dee2aaSAndroid Build Coastguard Worker /** See comments for InternalFilter */ 37*c8dee2aaSAndroid Build Coastguard Worker enum class StrokeRecApplication { 38*c8dee2aaSAndroid Build Coastguard Worker kDisallow, 39*c8dee2aaSAndroid Build Coastguard Worker kAllow, 40*c8dee2aaSAndroid Build Coastguard Worker }; 41*c8dee2aaSAndroid Build Coastguard Worker 42*c8dee2aaSAndroid Build Coastguard Worker /** 43*c8dee2aaSAndroid Build Coastguard Worker * Caller should have already used ValidDashPath to exclude invalid data. Typically, this leaves 44*c8dee2aaSAndroid Build Coastguard Worker * the strokeRec unmodified. However, for some simple shapes (e.g. a line) it may directly 45*c8dee2aaSAndroid Build Coastguard Worker * evaluate the dash and stroke to produce a stroked output path with a fill strokeRec. Passing 46*c8dee2aaSAndroid Build Coastguard Worker * true for disallowStrokeRecApplication turns this behavior off. 47*c8dee2aaSAndroid Build Coastguard Worker */ 48*c8dee2aaSAndroid Build Coastguard Worker bool InternalFilter(SkPath* dst, const SkPath& src, SkStrokeRec* rec, 49*c8dee2aaSAndroid Build Coastguard Worker const SkRect* cullRect, const SkScalar aIntervals[], 50*c8dee2aaSAndroid Build Coastguard Worker int32_t count, SkScalar initialDashLength, int32_t initialDashIndex, 51*c8dee2aaSAndroid Build Coastguard Worker SkScalar intervalLength, SkScalar startPhase, 52*c8dee2aaSAndroid Build Coastguard Worker StrokeRecApplication = StrokeRecApplication::kAllow); 53*c8dee2aaSAndroid Build Coastguard Worker 54*c8dee2aaSAndroid Build Coastguard Worker bool ValidDashPath(SkScalar phase, const SkScalar intervals[], int32_t count); 55*c8dee2aaSAndroid Build Coastguard Worker } // namespace SkDashPath 56*c8dee2aaSAndroid Build Coastguard Worker 57*c8dee2aaSAndroid Build Coastguard Worker #endif 58