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

#ifndef SkGLState_DEFINED
#define SkGLState_DEFINED

#include "SkGL.h"
#include "SkSize.h"

class SkGLState {
public:
    static SkGLState& GlobalState() { return gState; }

    SkGLState();
    
    void reset();

    // internally, these are bit_shifts, so they must be 0, 1, ...
    enum Caps {
        kDITHER,
        kTEXTURE_2D,
    };
    void enable(Caps);
    void disable(Caps);
    
    // internally, these are bit_shifts, so they must be 0, 1, ...
    enum ClientState {
        kTEXTURE_COORD_ARRAY,
        kCOLOR_ARRAY,
    };
    void enableClientState(ClientState);
    void disableClientState(ClientState);

    // we use -1 for unknown, so the enum must be >= 0
    enum ShadeModel {
        kFLAT,
        kSMOOTH,
    };
    void shadeModel(ShadeModel);

    void scissor(int x, int y, int w, int h);
    
    void color(SkColor c) {
        this->pmColor(SkPreMultiplyColor(c));
    }
    void alpha(U8CPU a) {
        this->pmColor((a << 24) | (a << 16) | (a << 8) | a);
    }
    void pmColor(SkPMColor);

    void blendFunc(GLenum src, GLenum dst);
    
    void pointSize(float);
    void lineWidth(float);

private:
    void init();

    unsigned    fCapBits;
    unsigned    fClientStateBits;
    int         fShadeModel;
    SkIPoint    fScissorLoc;
    SkISize     fScissorSize;
    SkPMColor   fPMColor;
    GLenum      fSrcBlend, fDstBlend;
    float       fPointSize;
    float       fLineWidth;
    
    const GLenum* fCapsPtr;
    const GLenum* fClientPtr;
    const GLenum* fShadePtr;
    
    static SkGLState gState;
};

#endif
