1 2 /* 3 * Copyright 2006 The Android Open Source Project 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9 10 #ifndef Sk1DPathEffect_DEFINED 11 #define Sk1DPathEffect_DEFINED 12 13 #include "SkPathEffect.h" 14 #include "SkPath.h" 15 16 class SkPathMeasure; 17 18 // This class is not exported to java. 19 class Sk1DPathEffect : public SkPathEffect { 20 public: 21 // override from SkPathEffect 22 virtual bool filterPath(SkPath* dst, const SkPath& src, SkScalar* width); 23 24 protected: 25 /** Called at the start of each contour, returns the initial offset 26 into that contour. 27 */ 28 virtual SkScalar begin(SkScalar contourLength) = 0; 29 /** Called with the current distance along the path, with the current matrix 30 for the point/tangent at the specified distance. 31 Return the distance to travel for the next call. If return <= 0, then that 32 contour is done. 33 */ 34 virtual SkScalar next(SkPath* dst, SkScalar distance, SkPathMeasure&) = 0; 35 36 private: 37 typedef SkPathEffect INHERITED; 38 }; 39 40 class SkPath1DPathEffect : public Sk1DPathEffect { 41 public: 42 enum Style { 43 kTranslate_Style, // translate the shape to each position 44 kRotate_Style, // rotate the shape about its center 45 kMorph_Style, // transform each point, and turn lines into curves 46 47 kStyleCount 48 }; 49 50 /** Dash by replicating the specified path. 51 @param path The path to replicate (dash) 52 @param advance The space between instances of path 53 @param phase distance (mod advance) along path for its initial position 54 @param style how to transform path at each point (based on the current 55 position and tangent) 56 */ 57 SkPath1DPathEffect(const SkPath& path, SkScalar advance, SkScalar phase, Style); 58 59 // override from SkPathEffect 60 virtual bool filterPath(SkPath*, const SkPath&, SkScalar* width) SK_OVERRIDE; 61 62 static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) { 63 return SkNEW_ARGS(SkPath1DPathEffect, (buffer)); 64 } 65 66 SK_DECLARE_FLATTENABLE_REGISTRAR() 67 68 protected: 69 SkPath1DPathEffect(SkFlattenableReadBuffer& buffer); 70 71 // overrides from Sk1DPathEffect 72 virtual SkScalar begin(SkScalar contourLength) SK_OVERRIDE; 73 virtual SkScalar next(SkPath*, SkScalar distance, SkPathMeasure&) SK_OVERRIDE; 74 // overrides from SkFlattenable 75 virtual void flatten(SkFlattenableWriteBuffer&) SK_OVERRIDE; 76 virtual Factory getFactory() SK_OVERRIDE { return CreateProc; } 77 78 private: 79 SkPath fPath; // copied from constructor 80 SkScalar fAdvance; // copied from constructor 81 SkScalar fInitialOffset; // computed from phase 82 Style fStyle; // copied from constructor 83 84 typedef Sk1DPathEffect INHERITED; 85 }; 86 87 88 #endif 89