Loading libs/hwui/OpenGLRenderer.cpp +44 −44 Original line number Diff line number Diff line Loading @@ -183,12 +183,12 @@ OpenGLRenderer::~OpenGLRenderer() { void OpenGLRenderer::setViewport(int width, int height) { glViewport(0, 0, width, height); mOrthoMatrix.loadOrtho(0, width, height, 0, -1, 1); mWidth = width; mHeight = height; mFirstSnapshot->height = height; mFirstSnapshot->viewport.set(0, 0, width, height); } void OpenGLRenderer::prepare() { Loading Loading @@ -254,6 +254,8 @@ bool OpenGLRenderer::restoreSnapshot() { sp<Snapshot> previous = mSnapshot->previous; if (restoreOrtho) { Rect& r = previous->viewport; glViewport(r.left, r.top, r.right, r.bottom); mOrthoMatrix.load(current->orthoMatrix); } Loading @@ -267,39 +269,6 @@ bool OpenGLRenderer::restoreSnapshot() { return restoreClip; } void OpenGLRenderer::composeLayer(sp<Snapshot> current, sp<Snapshot> previous) { if (!current->layer) { LOGE("Attempting to compose a layer that does not exist"); return; } // Unbind current FBO and restore previous one // Most of the time, previous->fbo will be 0 to bind the default buffer glBindFramebuffer(GL_FRAMEBUFFER, previous->fbo); // Restore the clip from the previous snapshot const Rect& clip = previous->clipRect; glScissor(clip.left, mHeight - clip.bottom, clip.getWidth(), clip.getHeight()); Layer* layer = current->layer; const Rect& rect = layer->layer; drawTextureRect(rect.left, rect.top, rect.right, rect.bottom, layer->texture, layer->alpha, layer->mode, layer->blend); LayerSize size(rect.getWidth(), rect.getHeight()); // Failing to add the layer to the cache should happen only if the // layer is too large if (!mLayerCache.put(size, layer)) { LAYER_LOGD("Deleting layer"); glDeleteFramebuffers(1, &layer->fbo); glDeleteTextures(1, &layer->texture); delete layer; } } /////////////////////////////////////////////////////////////////////////////// // Layers /////////////////////////////////////////////////////////////////////////////// Loading Loading @@ -366,21 +335,58 @@ bool OpenGLRenderer::createLayer(sp<Snapshot> snapshot, float left, float top, // Creates a new snapshot to draw into the FBO saveSnapshot(); // TODO: This doesn't preserve other transformations (check Skia first) mSnapshot->transform.loadTranslate(-left, -top, 0.0f); mSnapshot->setClip(0.0f, 0.0f, right - left, bottom - top); mSnapshot->viewport.set(0.0f, 0.0f, right - left, bottom - top); mSnapshot->height = bottom - top; setScissorFromClip(); mSnapshot->flags = Snapshot::kFlagDirtyOrtho | Snapshot::kFlagClipSet; mSnapshot->orthoMatrix.load(mOrthoMatrix); // Change the ortho projection mOrthoMatrix.loadOrtho(0.0f, right - left, bottom - top, 0.0f, 0.0f, 1.0f); glViewport(0, 0, right - left, bottom - top); // Don't flip the FBO, it will get flipped when drawing back to the framebuffer mOrthoMatrix.loadOrtho(0.0f, right - left, 0.0f, bottom - top, -1.0f, 1.0f); return true; } void OpenGLRenderer::composeLayer(sp<Snapshot> current, sp<Snapshot> previous) { if (!current->layer) { LOGE("Attempting to compose a layer that does not exist"); return; } // Unbind current FBO and restore previous one // Most of the time, previous->fbo will be 0 to bind the default buffer glBindFramebuffer(GL_FRAMEBUFFER, previous->fbo); // Restore the clip from the previous snapshot const Rect& clip = previous->clipRect; glScissor(clip.left, mHeight - clip.bottom, clip.getWidth(), clip.getHeight()); Layer* layer = current->layer; const Rect& rect = layer->layer; drawTextureRect(rect.left, rect.top, rect.right, rect.bottom, layer->texture, layer->alpha, layer->mode, layer->blend); LayerSize size(rect.getWidth(), rect.getHeight()); // Failing to add the layer to the cache should happen only if the // layer is too large if (!mLayerCache.put(size, layer)) { LAYER_LOGD("Deleting layer"); glDeleteFramebuffers(1, &layer->fbo); glDeleteTextures(1, &layer->texture); delete layer; } } /////////////////////////////////////////////////////////////////////////////// // Transforms /////////////////////////////////////////////////////////////////////////////// Loading Loading @@ -424,14 +430,9 @@ const Rect& OpenGLRenderer::getClipBounds() { } bool OpenGLRenderer::quickReject(float left, float top, float right, float bottom) { SkRect sr; sr.set(left, top, right, bottom); Rect r(left, top, right, bottom); mSnapshot->transform.mapRect(r); SkMatrix m; mSnapshot->transform.copyTo(m); m.mapRect(&sr); Rect r(sr.fLeft, sr.fTop, sr.fRight, sr.fBottom); return !mSnapshot->clipRect.intersects(r); } Loading Loading @@ -759,7 +760,6 @@ void OpenGLRenderer::setupTextureAlpha8(GLuint texture, uint32_t width, uint32_t mModelView.loadIdentity(); } mCurrentProgram->set(mOrthoMatrix, mModelView, mSnapshot->transform); glUniform4f(mCurrentProgram->color, r, g, b, a); textureUnit++; Loading libs/hwui/Snapshot.h +7 −1 Original line number Diff line number Diff line Loading @@ -57,7 +57,8 @@ public: flags(0), previous(s), layer(NULL), fbo(s->fbo) { fbo(s->fbo), viewport(s->viewport) { if ((s->flags & Snapshot::kFlagClipSet) && !(s->flags & Snapshot::kFlagDirtyLocalClip)) { localClip.set(s->localClip); Loading Loading @@ -179,6 +180,11 @@ public: Layer* layer; GLuint fbo; /** * Current viewport. */ Rect viewport; /** * Contains the previous ortho matrix. */ Loading libs/hwui/TextDropShadowCache.h +1 −1 Original line number Diff line number Diff line Loading @@ -47,7 +47,7 @@ struct ShadowText { ShadowText(const ShadowText& shadow): paint(shadow.paint), radius(shadow.radius), len(shadow.len), hash(shadow.hash) { text = new char[len]; text = new char[shadow.len]; memcpy(text, shadow.text, shadow.len); } Loading tests/HwAccelerationTest/res/layout/stack.xml 0 → 100644 +33 −0 Original line number Diff line number Diff line <?xml version="1.0" encoding="utf-8"?> <!-- 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. --> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:paddingTop="0dp" android:paddingBottom="0dp" android:paddingLeft="12dp" android:paddingRight="12dp" android:focusable="true"> <StackView android:id="@+id/stack_view" android:layout_width="348px" android:layout_height="374px" android:layout_gravity="center" android:background="#00000000" android:cacheColorHint="#00000000" android:autoStart="true" /> </FrameLayout> tests/HwAccelerationTest/res/layout/stack_item.xml 0 → 100644 +38 −0 Original line number Diff line number Diff line <?xml version="1.0" encoding="utf-8"?> <!-- 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. --> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/stack_item" android:layout_width="fill_parent" android:layout_height="fill_parent"> <FrameLayout android:layout_width="fill_parent" android:layout_height="fill_parent"> <ImageView android:id="@+id/textview_icon" android:layout_height="250dip" android:layout_width="250dip" android:layout_gravity="center" /> <TextView android:id="@+id/mini_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" /> </FrameLayout> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="gone" android:layout_gravity="center" /> </FrameLayout> No newline at end of file Loading
libs/hwui/OpenGLRenderer.cpp +44 −44 Original line number Diff line number Diff line Loading @@ -183,12 +183,12 @@ OpenGLRenderer::~OpenGLRenderer() { void OpenGLRenderer::setViewport(int width, int height) { glViewport(0, 0, width, height); mOrthoMatrix.loadOrtho(0, width, height, 0, -1, 1); mWidth = width; mHeight = height; mFirstSnapshot->height = height; mFirstSnapshot->viewport.set(0, 0, width, height); } void OpenGLRenderer::prepare() { Loading Loading @@ -254,6 +254,8 @@ bool OpenGLRenderer::restoreSnapshot() { sp<Snapshot> previous = mSnapshot->previous; if (restoreOrtho) { Rect& r = previous->viewport; glViewport(r.left, r.top, r.right, r.bottom); mOrthoMatrix.load(current->orthoMatrix); } Loading @@ -267,39 +269,6 @@ bool OpenGLRenderer::restoreSnapshot() { return restoreClip; } void OpenGLRenderer::composeLayer(sp<Snapshot> current, sp<Snapshot> previous) { if (!current->layer) { LOGE("Attempting to compose a layer that does not exist"); return; } // Unbind current FBO and restore previous one // Most of the time, previous->fbo will be 0 to bind the default buffer glBindFramebuffer(GL_FRAMEBUFFER, previous->fbo); // Restore the clip from the previous snapshot const Rect& clip = previous->clipRect; glScissor(clip.left, mHeight - clip.bottom, clip.getWidth(), clip.getHeight()); Layer* layer = current->layer; const Rect& rect = layer->layer; drawTextureRect(rect.left, rect.top, rect.right, rect.bottom, layer->texture, layer->alpha, layer->mode, layer->blend); LayerSize size(rect.getWidth(), rect.getHeight()); // Failing to add the layer to the cache should happen only if the // layer is too large if (!mLayerCache.put(size, layer)) { LAYER_LOGD("Deleting layer"); glDeleteFramebuffers(1, &layer->fbo); glDeleteTextures(1, &layer->texture); delete layer; } } /////////////////////////////////////////////////////////////////////////////// // Layers /////////////////////////////////////////////////////////////////////////////// Loading Loading @@ -366,21 +335,58 @@ bool OpenGLRenderer::createLayer(sp<Snapshot> snapshot, float left, float top, // Creates a new snapshot to draw into the FBO saveSnapshot(); // TODO: This doesn't preserve other transformations (check Skia first) mSnapshot->transform.loadTranslate(-left, -top, 0.0f); mSnapshot->setClip(0.0f, 0.0f, right - left, bottom - top); mSnapshot->viewport.set(0.0f, 0.0f, right - left, bottom - top); mSnapshot->height = bottom - top; setScissorFromClip(); mSnapshot->flags = Snapshot::kFlagDirtyOrtho | Snapshot::kFlagClipSet; mSnapshot->orthoMatrix.load(mOrthoMatrix); // Change the ortho projection mOrthoMatrix.loadOrtho(0.0f, right - left, bottom - top, 0.0f, 0.0f, 1.0f); glViewport(0, 0, right - left, bottom - top); // Don't flip the FBO, it will get flipped when drawing back to the framebuffer mOrthoMatrix.loadOrtho(0.0f, right - left, 0.0f, bottom - top, -1.0f, 1.0f); return true; } void OpenGLRenderer::composeLayer(sp<Snapshot> current, sp<Snapshot> previous) { if (!current->layer) { LOGE("Attempting to compose a layer that does not exist"); return; } // Unbind current FBO and restore previous one // Most of the time, previous->fbo will be 0 to bind the default buffer glBindFramebuffer(GL_FRAMEBUFFER, previous->fbo); // Restore the clip from the previous snapshot const Rect& clip = previous->clipRect; glScissor(clip.left, mHeight - clip.bottom, clip.getWidth(), clip.getHeight()); Layer* layer = current->layer; const Rect& rect = layer->layer; drawTextureRect(rect.left, rect.top, rect.right, rect.bottom, layer->texture, layer->alpha, layer->mode, layer->blend); LayerSize size(rect.getWidth(), rect.getHeight()); // Failing to add the layer to the cache should happen only if the // layer is too large if (!mLayerCache.put(size, layer)) { LAYER_LOGD("Deleting layer"); glDeleteFramebuffers(1, &layer->fbo); glDeleteTextures(1, &layer->texture); delete layer; } } /////////////////////////////////////////////////////////////////////////////// // Transforms /////////////////////////////////////////////////////////////////////////////// Loading Loading @@ -424,14 +430,9 @@ const Rect& OpenGLRenderer::getClipBounds() { } bool OpenGLRenderer::quickReject(float left, float top, float right, float bottom) { SkRect sr; sr.set(left, top, right, bottom); Rect r(left, top, right, bottom); mSnapshot->transform.mapRect(r); SkMatrix m; mSnapshot->transform.copyTo(m); m.mapRect(&sr); Rect r(sr.fLeft, sr.fTop, sr.fRight, sr.fBottom); return !mSnapshot->clipRect.intersects(r); } Loading Loading @@ -759,7 +760,6 @@ void OpenGLRenderer::setupTextureAlpha8(GLuint texture, uint32_t width, uint32_t mModelView.loadIdentity(); } mCurrentProgram->set(mOrthoMatrix, mModelView, mSnapshot->transform); glUniform4f(mCurrentProgram->color, r, g, b, a); textureUnit++; Loading
libs/hwui/Snapshot.h +7 −1 Original line number Diff line number Diff line Loading @@ -57,7 +57,8 @@ public: flags(0), previous(s), layer(NULL), fbo(s->fbo) { fbo(s->fbo), viewport(s->viewport) { if ((s->flags & Snapshot::kFlagClipSet) && !(s->flags & Snapshot::kFlagDirtyLocalClip)) { localClip.set(s->localClip); Loading Loading @@ -179,6 +180,11 @@ public: Layer* layer; GLuint fbo; /** * Current viewport. */ Rect viewport; /** * Contains the previous ortho matrix. */ Loading
libs/hwui/TextDropShadowCache.h +1 −1 Original line number Diff line number Diff line Loading @@ -47,7 +47,7 @@ struct ShadowText { ShadowText(const ShadowText& shadow): paint(shadow.paint), radius(shadow.radius), len(shadow.len), hash(shadow.hash) { text = new char[len]; text = new char[shadow.len]; memcpy(text, shadow.text, shadow.len); } Loading
tests/HwAccelerationTest/res/layout/stack.xml 0 → 100644 +33 −0 Original line number Diff line number Diff line <?xml version="1.0" encoding="utf-8"?> <!-- 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. --> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:paddingTop="0dp" android:paddingBottom="0dp" android:paddingLeft="12dp" android:paddingRight="12dp" android:focusable="true"> <StackView android:id="@+id/stack_view" android:layout_width="348px" android:layout_height="374px" android:layout_gravity="center" android:background="#00000000" android:cacheColorHint="#00000000" android:autoStart="true" /> </FrameLayout>
tests/HwAccelerationTest/res/layout/stack_item.xml 0 → 100644 +38 −0 Original line number Diff line number Diff line <?xml version="1.0" encoding="utf-8"?> <!-- 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. --> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/stack_item" android:layout_width="fill_parent" android:layout_height="fill_parent"> <FrameLayout android:layout_width="fill_parent" android:layout_height="fill_parent"> <ImageView android:id="@+id/textview_icon" android:layout_height="250dip" android:layout_width="250dip" android:layout_gravity="center" /> <TextView android:id="@+id/mini_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" /> </FrameLayout> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="gone" android:layout_gravity="center" /> </FrameLayout> No newline at end of file