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