1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2015 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 #ifndef SubsetPath_DEFINED 8*c8dee2aaSAndroid Build Coastguard Worker #define SubsetPath_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker 10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPath.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTDArray.h" 12*c8dee2aaSAndroid Build Coastguard Worker 13*c8dee2aaSAndroid Build Coastguard Worker /* Given a path, generate a the desired minimal subset of the original. 14*c8dee2aaSAndroid Build Coastguard Worker 15*c8dee2aaSAndroid Build Coastguard Worker This does a binary divide-and-conquer on the path, first splitting by 16*c8dee2aaSAndroid Build Coastguard Worker contours, and then by verbs. The caller passes whether the previous subset 17*c8dee2aaSAndroid Build Coastguard Worker behaved the same as the original. If not, the subset() call restores the 18*c8dee2aaSAndroid Build Coastguard Worker prior state before returning a new subset. 19*c8dee2aaSAndroid Build Coastguard Worker 20*c8dee2aaSAndroid Build Coastguard Worker If a path fails a local test, this reduces the data to the 21*c8dee2aaSAndroid Build Coastguard Worker minimal set that fails using a pattern like: 22*c8dee2aaSAndroid Build Coastguard Worker 23*c8dee2aaSAndroid Build Coastguard Worker bool testFailed = true; 24*c8dee2aaSAndroid Build Coastguard Worker SkPath minimal; 25*c8dee2aaSAndroid Build Coastguard Worker SubsetContours subsetContours(testPath); 26*c8dee2aaSAndroid Build Coastguard Worker while (subsetContours.subset(testFailed, &minimal)) { 27*c8dee2aaSAndroid Build Coastguard Worker testFailed = myPathTest(minimal); 28*c8dee2aaSAndroid Build Coastguard Worker } 29*c8dee2aaSAndroid Build Coastguard Worker testFailed = true; 30*c8dee2aaSAndroid Build Coastguard Worker SubsetVerbs subsetVerbs(testPath); 31*c8dee2aaSAndroid Build Coastguard Worker while (subsetVerbs.subset(testFailed, &minimal)) { 32*c8dee2aaSAndroid Build Coastguard Worker testFailed = myPathTest(minimal); 33*c8dee2aaSAndroid Build Coastguard Worker } 34*c8dee2aaSAndroid Build Coastguard Worker */ 35*c8dee2aaSAndroid Build Coastguard Worker 36*c8dee2aaSAndroid Build Coastguard Worker class SubsetPath { 37*c8dee2aaSAndroid Build Coastguard Worker public: 38*c8dee2aaSAndroid Build Coastguard Worker SubsetPath(const SkPath& path); ~SubsetPath()39*c8dee2aaSAndroid Build Coastguard Worker virtual ~SubsetPath() {} 40*c8dee2aaSAndroid Build Coastguard Worker bool subset(bool testFailed, SkPath* sub); 41*c8dee2aaSAndroid Build Coastguard Worker protected: 42*c8dee2aaSAndroid Build Coastguard Worker int range(int* end) const; 43*c8dee2aaSAndroid Build Coastguard Worker virtual SkPath getSubsetPath() const = 0; 44*c8dee2aaSAndroid Build Coastguard Worker 45*c8dee2aaSAndroid Build Coastguard Worker const SkPath& fPath; 46*c8dee2aaSAndroid Build Coastguard Worker SkTDArray<bool> fSelected; 47*c8dee2aaSAndroid Build Coastguard Worker int fSubset; 48*c8dee2aaSAndroid Build Coastguard Worker int fTries; 49*c8dee2aaSAndroid Build Coastguard Worker 50*c8dee2aaSAndroid Build Coastguard Worker }; 51*c8dee2aaSAndroid Build Coastguard Worker 52*c8dee2aaSAndroid Build Coastguard Worker class SubsetContours : public SubsetPath { 53*c8dee2aaSAndroid Build Coastguard Worker public: 54*c8dee2aaSAndroid Build Coastguard Worker SubsetContours(const SkPath& path); 55*c8dee2aaSAndroid Build Coastguard Worker protected: 56*c8dee2aaSAndroid Build Coastguard Worker SkPath getSubsetPath() const override; 57*c8dee2aaSAndroid Build Coastguard Worker }; 58*c8dee2aaSAndroid Build Coastguard Worker 59*c8dee2aaSAndroid Build Coastguard Worker class SubsetVerbs : public SubsetPath { 60*c8dee2aaSAndroid Build Coastguard Worker public: 61*c8dee2aaSAndroid Build Coastguard Worker SubsetVerbs(const SkPath& path); 62*c8dee2aaSAndroid Build Coastguard Worker protected: 63*c8dee2aaSAndroid Build Coastguard Worker SkPath getSubsetPath() const override; 64*c8dee2aaSAndroid Build Coastguard Worker }; 65*c8dee2aaSAndroid Build Coastguard Worker 66*c8dee2aaSAndroid Build Coastguard Worker #endif 67