aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gl/SkGLState.h
blob: 565498ed96f70a0e6757f5bb64189bc50cf06866 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74

#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