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

#ifndef GrGLPath_DEFINED
#define GrGLPath_DEFINED

#include "../GrPath.h"
#include "gl/GrGLTypes.h"

class GrGLGpu;
class GrStyle;

/**
 * Currently this represents a path built using GL_NV_path_rendering. If we
 * support other GL path extensions then this would have to have a type enum
 * and/or be subclassed.
 */

class GrGLPath : public GrPath {
public:
    static bool InitPathObjectPathDataCheckingDegenerates(GrGLGpu*,
                                                          GrGLuint pathID,
                                                          const SkPath&);
    static void InitPathObjectPathData(GrGLGpu*,
                                       GrGLuint pathID,
                                       const SkPath&);
    static void InitPathObjectStroke(GrGLGpu*, GrGLuint pathID, const SkStrokeRec&);

    static void InitPathObjectEmptyPath(GrGLGpu*, GrGLuint pathID);


    GrGLPath(GrGLGpu*, const SkPath&, const GrStyle&);
    GrGLuint pathID() const { return fPathID; }

    bool shouldStroke() const { return fShouldStroke; }
    bool shouldFill() const { return fShouldFill; }
protected:
    void onRelease() override;
    void onAbandon() override;

private:
    // TODO: Figure out how to get an approximate size of the path in Gpu memory.
    size_t onGpuMemorySize() const override { return 100; }

    GrGLuint fPathID;
    bool fShouldStroke;
    bool fShouldFill;

    typedef GrPath INHERITED;
};

#endif
