summaryrefslogtreecommitdiffstats
path: root/libs/hwui/OpenGLRenderer.cpp
diff options
context:
space:
mode:
authorRomain Guy <romainguy@google.com>2010-06-23 17:47:49 -0700
committerRomain Guy <romainguy@google.com>2010-06-23 17:47:49 -0700
commitf6a11b8a9e25ff9861bbba19251bea84d8a5daf2 (patch)
treec44f214f59f2206de152585d97b23e2bfaa1b3b0 /libs/hwui/OpenGLRenderer.cpp
parentbb9524b6bdddc7ac77d8628daa8b366b8a7be4a4 (diff)
downloadframeworks_base-f6a11b8a9e25ff9861bbba19251bea84d8a5daf2.zip
frameworks_base-f6a11b8a9e25ff9861bbba19251bea84d8a5daf2.tar.gz
frameworks_base-f6a11b8a9e25ff9861bbba19251bea84d8a5daf2.tar.bz2
Add support for transformations.
This change adds partial support for the following transforms: - scale() - translate() - rotate() - setMatrix() - getMatrix() The transform is stored in a snapshot and saved/restored as needed. The transform is currently not applied to the clip rect and is not mapped to the vertex shader. Change-Id: Id48993453311200804149917d0c126a4d0471226
Diffstat (limited to 'libs/hwui/OpenGLRenderer.cpp')
-rw-r--r--libs/hwui/OpenGLRenderer.cpp68
1 files changed, 60 insertions, 8 deletions
diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp
index 1416ce1..e19795e 100644
--- a/libs/hwui/OpenGLRenderer.cpp
+++ b/libs/hwui/OpenGLRenderer.cpp
@@ -33,17 +33,22 @@
namespace android {
+///////////////////////////////////////////////////////////////////////////////
+// Constructors/destructor
+///////////////////////////////////////////////////////////////////////////////
+
OpenGLRenderer::OpenGLRenderer() {
LOGD("Create OpenGLRenderer");
-
- mSnapshot = new Snapshot;
- mSaveCount = 0;
}
OpenGLRenderer::~OpenGLRenderer() {
LOGD("Destroy OpenGLRenderer");
}
+///////////////////////////////////////////////////////////////////////////////
+// Setup
+///////////////////////////////////////////////////////////////////////////////
+
void OpenGLRenderer::setViewport(int width, int height) {
glViewport(0, 0, width, height);
@@ -56,15 +61,23 @@ void OpenGLRenderer::setViewport(int width, int height) {
}
void OpenGLRenderer::prepare() {
+ mSnapshot = &mFirstSnapshot;
+ mSaveCount = 0;
+
glDisable(GL_SCISSOR_TEST);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT);
glEnable(GL_SCISSOR_TEST);
+
mSnapshot->clipRect.set(0.0f, 0.0f, mWidth, mHeight);
}
+///////////////////////////////////////////////////////////////////////////////
+// State management
+///////////////////////////////////////////////////////////////////////////////
+
int OpenGLRenderer::getSaveCount() const {
return mSaveCount;
}
@@ -97,8 +110,7 @@ void OpenGLRenderer::restoreToCount(int saveCount) {
int OpenGLRenderer::saveSnapshot() {
mSnapshot = new Snapshot(mSnapshot);
- mSaveCount++;
- return mSaveCount;
+ return ++mSaveCount;
}
bool OpenGLRenderer::restoreSnapshot() {
@@ -106,14 +118,50 @@ bool OpenGLRenderer::restoreSnapshot() {
bool restoreClip = mSnapshot->flags & Snapshot::kFlagClipSet;
mSaveCount--;
- mSnapshot = mSnapshot->previous;
+
+ // Do not merge these two lines!
+ sp<Snapshot> previous = mSnapshot->previous;
+ mSnapshot = previous;
return restoreClip;
}
+///////////////////////////////////////////////////////////////////////////////
+// Transforms
+///////////////////////////////////////////////////////////////////////////////
+
+void OpenGLRenderer::translate(float dx, float dy) {
+ mSnapshot->transform.translate(dx, dy, 0.0f);
+}
+
+void OpenGLRenderer::rotate(float degrees) {
+ mSnapshot->transform.rotate(degrees, 0.0f, 0.0f, 1.0f);
+}
+
+void OpenGLRenderer::scale(float sx, float sy) {
+ mSnapshot->transform.scale(sx, sy, 1.0f);
+}
+
+void OpenGLRenderer::setMatrix(SkMatrix* matrix) {
+ mSnapshot->transform.load(*matrix);
+}
+
+void OpenGLRenderer::getMatrix(SkMatrix* matrix) {
+ mSnapshot->transform.copyTo(*matrix);
+}
+
+void OpenGLRenderer::concatMatrix(SkMatrix* matrix) {
+ mat4 m(*matrix);
+ mSnapshot->transform.multiply(m);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// Clipping
+///////////////////////////////////////////////////////////////////////////////
+
void OpenGLRenderer::setScissorFromClip() {
- Rect clip = mSnapshot->clipRect;
- glScissor(clip.left, clip.top, clip.getWidth(), clip.getHeight());
+ Rect* clip = &(mSnapshot->clipRect);
+ glScissor(clip->left, clip->top, clip->getWidth(), clip->getHeight());
}
bool OpenGLRenderer::clipRect(float left, float top, float right, float bottom) {
@@ -126,6 +174,10 @@ bool OpenGLRenderer::clipRect(float left, float top, float right, float bottom)
return clipped;
}
+///////////////////////////////////////////////////////////////////////////////
+// Drawing
+///////////////////////////////////////////////////////////////////////////////
+
void OpenGLRenderer::drawColor(int color, SkXfermode::Mode mode) {
LOGD("Drawing color");
}