Home | History | Annotate | Download | only in effects
      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