| Index: src/gpu/GrPathRange.h
|
| diff --git a/src/gpu/GrPathRange.h b/src/gpu/GrPathRange.h
|
| index b52fef170c62798894ee042bbb86c27e396209d0..dc8ce1d71b54980e36d700acd163ce0c2b2fae99 100644
|
| --- a/src/gpu/GrPathRange.h
|
| +++ b/src/gpu/GrPathRange.h
|
| @@ -10,51 +10,80 @@
|
|
|
| #include "GrGpuResource.h"
|
| #include "GrResourceCache.h"
|
| +#include "SkRefCnt.h"
|
| #include "SkStrokeRec.h"
|
| +#include "SkTArray.h"
|
|
|
| class SkPath;
|
| +class SkDescriptor;
|
|
|
| /**
|
| - * Represents a contiguous range of GPU path objects with a common stroke. The
|
| - * path range is immutable with the exception that individual paths can be
|
| - * initialized lazily. Unititialized paths are silently ignored by drawing
|
| - * functions.
|
| + * Represents a contiguous range of GPU path objects, all with a common stroke.
|
| + * This object is immutable with the exception that individual paths may be
|
| + * initialized lazily.
|
| */
|
| +
|
| class GrPathRange : public GrGpuResource {
|
| public:
|
| SK_DECLARE_INST_COUNT(GrPathRange);
|
|
|
| static const bool kIsWrapped = false;
|
|
|
| + /**
|
| + * Return the resourceType intended for cache lookups involving GrPathRange.
|
| + */
|
| static GrResourceKey::ResourceType resourceType() {
|
| static const GrResourceKey::ResourceType type = GrResourceKey::GenerateResourceType();
|
| return type;
|
| }
|
|
|
| /**
|
| - * Initialize to a range with a fixed size and stroke. Stroke must not be hairline.
|
| + * Class that generates the paths for a specific range.
|
| */
|
| - GrPathRange(GrGpu* gpu, size_t size, const SkStrokeRec& stroke)
|
| - : INHERITED(gpu, kIsWrapped),
|
| - fSize(size),
|
| - fStroke(stroke) {
|
| - this->registerWithCache();
|
| - }
|
| + class PathGenerator : public SkRefCnt {
|
| + public:
|
| + virtual int getNumPaths() = 0;
|
| + virtual void generatePath(int index, SkPath* out) = 0;
|
| + virtual bool isEqualTo(const SkDescriptor&) const { return false; }
|
| + virtual ~PathGenerator() {}
|
| + };
|
|
|
| - size_t getSize() const { return fSize; }
|
| - const SkStrokeRec& getStroke() const { return fStroke; }
|
| + /**
|
| + * Initialize a lazy-loaded path range. This class will generate an SkPath and call
|
| + * onInitPath() for each path within the range before it is drawn for the first time.
|
| + */
|
| + GrPathRange(GrGpu*, PathGenerator*, const SkStrokeRec& stroke);
|
|
|
| /**
|
| - * Initialize a path in the range. It is invalid to call this method for a
|
| - * path that has already been initialized.
|
| + * Initialize an eager-loaded path range. The subclass is responsible for ensuring all
|
| + * the paths are initialized up front.
|
| */
|
| - virtual void initAt(size_t index, const SkPath&) = 0;
|
| + GrPathRange(GrGpu*, int numPaths, const SkStrokeRec& stroke);
|
| +
|
| + virtual bool isEqualTo(const SkDescriptor& desc) const {
|
| + return NULL != fPathGenerator.get() && fPathGenerator->isEqualTo(desc);
|
| + }
|
| +
|
| + int getNumPaths() const { return fNumPaths; }
|
| + const SkStrokeRec& getStroke() const { return fStroke; }
|
| + const PathGenerator* getPathGenerator() const { return fPathGenerator.get(); }
|
|
|
| protected:
|
| - size_t fSize;
|
| - SkStrokeRec fStroke;
|
| + // Initialize a path in the range before drawing. This is only called when
|
| + // fPathGenerator is non-null. The child class need not call didChangeGpuMemorySize(),
|
| + // GrPathRange will take care of that after the call is complete.
|
| + virtual void onInitPath(int index, const SkPath&) const = 0;
|
|
|
| private:
|
| + // Notify when paths will be drawn in case this is a lazy-loaded path range.
|
| + friend class GrGpu;
|
| + void willDrawPaths(const uint32_t indices[], int count) const;
|
| +
|
| + mutable SkAutoTUnref<PathGenerator> fPathGenerator;
|
| + mutable SkTArray<uint8_t, true /*MEM_COPY*/> fGeneratedPaths;
|
| + const int fNumPaths;
|
| + const SkStrokeRec fStroke;
|
| +
|
| typedef GrGpuResource INHERITED;
|
| };
|
|
|
|
|