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     static SkPath1DPathEffect* Create(const SkPath& path, SkScalar advance, SkScalar phase,
     56                                       Style style) {
     57         return SkNEW_ARGS(SkPath1DPathEffect, (path, advance, phase, style));
     58     }
     59 
     60     virtual bool filterPath(SkPath*, const SkPath&,
     61                             SkStrokeRec*, const SkRect*) const SK_OVERRIDE;
     62 
     63     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkPath1DPathEffect)
     64 
     65 protected:
     66     SkPath1DPathEffect(const SkPath& path, SkScalar advance, SkScalar phase, Style);
     67 #ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING
     68     explicit SkPath1DPathEffect(SkReadBuffer& buffer);
     69 #endif
     70     virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE;
     71 
     72     // overrides from Sk1DPathEffect
     73     virtual SkScalar begin(SkScalar contourLength) const SK_OVERRIDE;
     74     virtual SkScalar next(SkPath*, SkScalar, SkPathMeasure&) const SK_OVERRIDE;
     75 
     76 private:
     77     SkPath      fPath;          // copied from constructor
     78     SkScalar    fAdvance;       // copied from constructor
     79     SkScalar    fInitialOffset; // computed from phase
     80     Style       fStyle;         // copied from constructor
     81 
     82     typedef Sk1DPathEffect INHERITED;
     83 };
     84 
     85 #endif
     86