/*
 * Copyright 2014 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef GrPathRange_DEFINED
#define GrPathRange_DEFINED

#include "GrGpuResource.h"
#include "GrResourceCache.h"
#include "SkStrokeRec.h"

class SkPath;

/**
 * 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.
 */
class GrPathRange : public GrGpuResource {
public:
    SK_DECLARE_INST_COUNT(GrPathRange);

    static const bool kIsWrapped = false;

    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.
     */
    GrPathRange(GrGpu* gpu, size_t size, const SkStrokeRec& stroke)
        : INHERITED(gpu, kIsWrapped),
          fSize(size),
          fStroke(stroke) {
        this->registerWithCache();
    }

    size_t getSize() const { return fSize; }
    const SkStrokeRec& getStroke() const { return fStroke; }

    /**
     * Initialize a path in the range. It is invalid to call this method for a
     * path that has already been initialized.
     */
    virtual void initAt(size_t index, const SkPath&) = 0;

protected:
    size_t fSize;
    SkStrokeRec fStroke;

private:
    typedef GrGpuResource INHERITED;
};

#endif
