180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/* 280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2006 The Android Open Source Project 380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be 580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file. 680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifndef Sk2DPathEffect_DEFINED 980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define Sk2DPathEffect_DEFINED 1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkPath.h" 1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkPathEffect.h" 1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkMatrix.h" 1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SK_API Sk2DPathEffect : public SkPathEffect { 1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic: 1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru Sk2DPathEffect(const SkMatrix& mat); 1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 19363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger virtual bool filterPath(SkPath*, const SkPath&, 20d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger SkStrokeRec*, const SkRect*) const SK_OVERRIDE; 2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(Sk2DPathEffect) 2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected: 2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** New virtual, to be overridden by subclasses. 2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru This is called once from filterPath, and provides the 2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru uv parameter bounds for the path. Subsequent calls to 2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru next() will receive u and v values within these bounds, 2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru and then a call to end() will signal the end of processing. 3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 31363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger virtual void begin(const SkIRect& uvBounds, SkPath* dst) const; 32363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger virtual void next(const SkPoint& loc, int u, int v, SkPath* dst) const; 33363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger virtual void end(SkPath* dst) const; 3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** Low-level virtual called per span of locations in the u-direction. 3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru The default implementation calls next() repeatedly with each 3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru location. 3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 39363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger virtual void nextSpan(int u, int v, int ucount, SkPath* dst) const; 4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const SkMatrix& getMatrix() const { return fMatrix; } 4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // protected so that subclasses can call this during unflattening 4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru Sk2DPathEffect(SkFlattenableReadBuffer&); 4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual void flatten(SkFlattenableWriteBuffer&) const SK_OVERRIDE; 4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate: 4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkMatrix fMatrix, fInverse; 4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru bool fMatrixIsInvertible; 5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // illegal 5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru Sk2DPathEffect(const Sk2DPathEffect&); 5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru Sk2DPathEffect& operator=(const Sk2DPathEffect&); 5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru friend class Sk2DPathEffectBlitter; 5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru typedef SkPathEffect INHERITED; 5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SK_API SkLine2DPathEffect : public Sk2DPathEffect { 6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic: 6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkLine2DPathEffect(SkScalar width, const SkMatrix& matrix) 6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru : Sk2DPathEffect(matrix), fWidth(width) {} 6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 64363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger virtual bool filterPath(SkPath* dst, const SkPath& src, 65d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger SkStrokeRec*, const SkRect*) const SK_OVERRIDE; 6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkLine2DPathEffect) 6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected: 70363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger virtual void nextSpan(int u, int v, int ucount, SkPath*) const SK_OVERRIDE; 7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkLine2DPathEffect(SkFlattenableReadBuffer&); 7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual void flatten(SkFlattenableWriteBuffer&) const SK_OVERRIDE; 7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate: 7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScalar fWidth; 7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru typedef Sk2DPathEffect INHERITED; 8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SK_API SkPath2DPathEffect : public Sk2DPathEffect { 8380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic: 8480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** 8580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Stamp the specified path to fill the shape, using the matrix to define 8680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * the latice. 8780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 8880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkPath2DPathEffect(const SkMatrix&, const SkPath&); 8980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 9080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkPath2DPathEffect) 9180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 9280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected: 9380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkPath2DPathEffect(SkFlattenableReadBuffer& buffer); 9480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual void flatten(SkFlattenableWriteBuffer&) const SK_OVERRIDE; 9580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 96363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger virtual void next(const SkPoint&, int u, int v, SkPath*) const SK_OVERRIDE; 9780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 9880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate: 9980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkPath fPath; 10080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 10180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru typedef Sk2DPathEffect INHERITED; 10280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 10380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 10480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 105