diff options
| author | Romain Guy <romainguy@google.com> | 2010-06-23 17:47:49 -0700 |
|---|---|---|
| committer | Romain Guy <romainguy@google.com> | 2010-06-23 17:47:49 -0700 |
| commit | f6a11b8a9e25ff9861bbba19251bea84d8a5daf2 (patch) | |
| tree | c44f214f59f2206de152585d97b23e2bfaa1b3b0 /libs/hwui/OpenGLRenderer.cpp | |
| parent | bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4 (diff) | |
| download | frameworks_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.cpp | 68 |
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"); } |
