blob: bef41938e38d34ece0ff5834c44c2805b65924a7 [file] [log] [blame]
/*
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef ANDROID_UI_OPENGL_RENDERER_H
#define ANDROID_UI_OPENGL_RENDERER_H
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
#include <SkMatrix.h>
#include <SkXfermode.h>
#include <utils/KeyedVector.h>
#include <utils/RefBase.h>
#include "Matrix.h"
#include "Rect.h"
namespace android {
namespace uirenderer {
///////////////////////////////////////////////////////////////////////////////
// Support
///////////////////////////////////////////////////////////////////////////////
class Snapshot: public LightRefBase<Snapshot> {
public:
Snapshot() {
}
Snapshot(const sp<Snapshot> s):
transform(s->transform),
clipRect(s->clipRect),
flags(kFlagDirtyTransform),
previous(s) {
}
enum Flags {
kFlagClipSet = 0x1,
kFlagDirtyTransform = 0x2,
};
const Rect& getMappedClip();
// Local transformations
mat4 transform;
// Clipping rectangle at the time of this snapshot
Rect clipRect;
// Dirty flags
int flags;
// Previous snapshot in the frames stack
sp<Snapshot> previous;
private:
// Clipping rectangle mapped with the transform
Rect mappedClip;
}; // class Snapshot
struct SimpleVertex {
float position[2];
}; // struct SimpleVertex
typedef char* shader;
class Program: public LightRefBase<Program> {
public:
Program(const char* vertex, const char* fragment);
~Program();
void use();
protected:
int addAttrib(const char* name);
int getAttrib(const char* name);
int addUniform(const char* name);
int getUniform(const char* name);
private:
GLuint buildShader(const char* source, GLenum type);
// Handle of the OpenGL program
GLuint id;
// Handles of the shaders
GLuint vertexShader;
GLuint fragmentShader;
// Keeps track of attributes and uniforms slots
KeyedVector<const char*, int> attributes;
KeyedVector<const char*, int> uniforms;
}; // class Program
class DrawColorProgram: public Program {
public:
DrawColorProgram();
void use(const GLfloat* projectionMatrix, const GLfloat* modelViewMatrix,
const GLfloat* transformMatrix);
int position;
int color;
int projection;
int modelView;
int transform;
};
///////////////////////////////////////////////////////////////////////////////
// Renderer
///////////////////////////////////////////////////////////////////////////////
class OpenGLRenderer {
public:
OpenGLRenderer();
~OpenGLRenderer();
void setViewport(int width, int height);
void prepare();
int getSaveCount() const;
int save(int flags);
void restore();
void restoreToCount(int saveCount);
void translate(float dx, float dy);
void rotate(float degrees);
void scale(float sx, float sy);
void setMatrix(SkMatrix* matrix);
void getMatrix(SkMatrix* matrix);
void concatMatrix(SkMatrix* matrix);
const Rect& getClipBounds();
bool quickReject(float left, float top, float right, float bottom);
bool clipRect(float left, float top, float right, float bottom);
void drawColor(int color, SkXfermode::Mode mode);
void drawRect(float left, float top, float right, float bottom, SkPaint* paint);
private:
int saveSnapshot();
bool restoreSnapshot();
void setScissorFromClip();
void drawColorRect(float left, float top, float right, float bottom, int color);
// Dimensions of the drawing surface
int mWidth, mHeight;
// Matrix used for ortho projection in shaders
float mOrthoMatrix[16];
// Model-view matrix used to position/size objects
mat4 mModelView;
// Number of saved states
int mSaveCount;
// Base state
Snapshot mFirstSnapshot;
// Current state
sp<Snapshot> mSnapshot;
// Shaders
sp<DrawColorProgram> mDrawColorShader;
}; // class OpenGLRenderer
}; // namespace uirenderer
}; // namespace android
#endif // ANDROID_UI_OPENGL_RENDERER_H