diff options
| author | Romain Guy <romainguy@google.com> | 2010-07-14 16:35:37 -0700 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2010-07-14 16:35:37 -0700 |
| commit | 7ba6617a53424b85711313478459a0a8cda8c3da (patch) | |
| tree | c95c76f46d09858ffc7e3a08f3918f01f1e7816a | |
| parent | a51eb0bb2fd9505a943a62f5f6b501fcb23b72bd (diff) | |
| parent | 3d58c03de0d8877b36cdb78b0ca8b5cac7f600e2 (diff) | |
| download | frameworks_base-7ba6617a53424b85711313478459a0a8cda8c3da.zip frameworks_base-7ba6617a53424b85711313478459a0a8cda8c3da.tar.gz frameworks_base-7ba6617a53424b85711313478459a0a8cda8c3da.tar.bz2 | |
Merge "Do not apply transforms when using drawColor()."
| -rw-r--r-- | libs/hwui/Matrix.h | 3 | ||||
| -rw-r--r-- | libs/hwui/OpenGLRenderer.cpp | 15 | ||||
| -rw-r--r-- | libs/hwui/OpenGLRenderer.h | 3 | ||||
| -rw-r--r-- | libs/hwui/Snapshot.h | 12 | ||||
| -rw-r--r-- | tests/HwAccelerationTest/AndroidManifest.xml | 9 | ||||
| -rw-r--r-- | tests/HwAccelerationTest/src/com/google/android/test/hwui/MultisamplingActivity.java | 141 | ||||
| -rw-r--r-- | tests/HwAccelerationTest/src/com/google/android/test/hwui/RotationActivity.java | 63 |
7 files changed, 98 insertions, 148 deletions
diff --git a/libs/hwui/Matrix.h b/libs/hwui/Matrix.h index 40c80fa..ba5be03 100644 --- a/libs/hwui/Matrix.h +++ b/libs/hwui/Matrix.h @@ -88,6 +88,9 @@ public: void copyTo(float* v) const; void copyTo(SkMatrix& v) const; + /** + * Does not apply rotations! + */ void mapRect(Rect& r) const; float getTranslateX(); diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp index 9739b9b..12b0dea 100644 --- a/libs/hwui/OpenGLRenderer.cpp +++ b/libs/hwui/OpenGLRenderer.cpp @@ -406,7 +406,7 @@ bool OpenGLRenderer::quickReject(float left, float top, float right, float botto } bool OpenGLRenderer::clipRect(float left, float top, float right, float bottom) { - bool clipped = mSnapshot->clipRect.intersect(left, top, right, bottom); + bool clipped = mSnapshot->clip(left, top, right, bottom); if (clipped) { mSnapshot->flags |= Snapshot::kFlagClipSet; setScissorFromClip(); @@ -492,8 +492,8 @@ void OpenGLRenderer::drawPatch(SkBitmap* bitmap, Res_png_9patch* patch, } void OpenGLRenderer::drawColor(int color, SkXfermode::Mode mode) { - const Rect& clip = mSnapshot->clipRect; - drawColorRect(clip.left, clip.top, clip.right, clip.bottom, color, mode); + const Rect& clip = mSnapshot->getMappedClip(); + drawColorRect(clip.left, clip.top, clip.right, clip.bottom, color, mode, true); } void OpenGLRenderer::drawRect(float left, float top, float right, float bottom, const SkPaint* p) { @@ -524,7 +524,7 @@ void OpenGLRenderer::drawRect(float left, float top, float right, float bottom, /////////////////////////////////////////////////////////////////////////////// void OpenGLRenderer::drawColorRect(float left, float top, float right, float bottom, - int color, SkXfermode::Mode mode) { + int color, SkXfermode::Mode mode, bool ignoreTransform) { const int alpha = (color >> 24) & 0xFF; const GLfloat a = alpha / 255.0f; const GLfloat r = ((color >> 16) & 0xFF) / 255.0f; @@ -538,7 +538,12 @@ void OpenGLRenderer::drawColorRect(float left, float top, float right, float bot mModelView.scale(right - left, bottom - top, 1.0f); const bool inUse = useShader(mDrawColorShader); - mDrawColorShader->set(mOrthoMatrix, mModelView, mSnapshot->transform); + if (!ignoreTransform) { + mDrawColorShader->set(mOrthoMatrix, mModelView, mSnapshot->transform); + } else { + mat4 identity; + mDrawColorShader->set(mOrthoMatrix, mModelView, identity); + } if (!inUse) { const GLvoid* p = &gDrawColorVertices[0].position[0]; diff --git a/libs/hwui/OpenGLRenderer.h b/libs/hwui/OpenGLRenderer.h index 1165ab6..8083038 100644 --- a/libs/hwui/OpenGLRenderer.h +++ b/libs/hwui/OpenGLRenderer.h @@ -160,9 +160,10 @@ private: * @param bottom The bottom coordinate of the rectangle * @param color The rectangle's ARGB color, defined as a packed 32 bits word * @param mode The Skia xfermode to use + * @param ignoreTransform True if the current transform should be ignored */ void drawColorRect(float left, float top, float right, float bottom, - int color, SkXfermode::Mode mode); + int color, SkXfermode::Mode mode, bool ignoreTransform = false); /** * Draws a textured rectangle with the specified texture. The specified coordinates diff --git a/libs/hwui/Snapshot.h b/libs/hwui/Snapshot.h index ef9269f..7265d91 100644 --- a/libs/hwui/Snapshot.h +++ b/libs/hwui/Snapshot.h @@ -56,6 +56,8 @@ public: previous(s), layer(NULL), fbo(s->fbo) { + mappedClip.set(s->clipRect); + transform.mapRect(mappedClip); } /** @@ -87,12 +89,20 @@ public: * Returns the current clip region mapped by the current transform. */ const Rect& getMappedClip() { + return mappedClip; + } + + /** + * Intersects the current clip with the new clip rectangle. + */ + bool clip(float left, float top, float right, float bottom) { + bool clipped = clipRect.intersect(left, top, right, bottom); if (flags & kFlagDirtyTransform) { flags &= ~kFlagDirtyTransform; mappedClip.set(clipRect); transform.mapRect(mappedClip); } - return mappedClip; + return clipped; } /** diff --git a/tests/HwAccelerationTest/AndroidManifest.xml b/tests/HwAccelerationTest/AndroidManifest.xml index f13cfaf..cb894f1 100644 --- a/tests/HwAccelerationTest/AndroidManifest.xml +++ b/tests/HwAccelerationTest/AndroidManifest.xml @@ -87,6 +87,15 @@ <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> + + <activity + android:name="RotationActivity" + android:label="_Rotation"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + </activity> </application> </manifest> diff --git a/tests/HwAccelerationTest/src/com/google/android/test/hwui/MultisamplingActivity.java b/tests/HwAccelerationTest/src/com/google/android/test/hwui/MultisamplingActivity.java deleted file mode 100644 index 95b14aa..0000000 --- a/tests/HwAccelerationTest/src/com/google/android/test/hwui/MultisamplingActivity.java +++ /dev/null @@ -1,141 +0,0 @@ -/* - * 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. - */ - -package com.google.android.test.hwui; - -import android.app.Activity; -import android.content.Context; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.os.Bundle; -import android.util.Log; -import android.view.Gravity; -import android.view.View; -import android.view.animation.AlphaAnimation; -import android.view.animation.Animation; -import android.widget.FrameLayout; - -@SuppressWarnings({"UnusedDeclaration"}) -public class MultisamplingActivity extends Activity { - private static final String LOG_TAG = "HwUi"; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - DirtyBitmapView container = new DirtyBitmapView(this); - - ColorView color = new ColorView(this); - container.addView(color, new DirtyBitmapView.LayoutParams( - dipToPx(this, 100), dipToPx(this, 100), Gravity.CENTER)); - - AlphaAnimation a = new AlphaAnimation(1.0f, 0.0f); - a.setDuration(2000); - a.setRepeatCount(Animation.INFINITE); - a.setRepeatMode(Animation.REVERSE); - color.startAnimation(a); - - setContentView(container); - } - - @SuppressWarnings({"UnusedDeclaration"}) - static int dipToPx(Context c, int dip) { - return (int) (c.getResources().getDisplayMetrics().density * dip + 0.5f); - } - - static class ColorView extends View { - ColorView(Context c) { - super(c); - } - - @Override - protected void onDraw(Canvas canvas) { - super.onDraw(canvas); - canvas.drawRGB(0, 255, 0); - } - } - - static class DirtyBitmapView extends FrameLayout { - private final Paint mPaint; - - DirtyBitmapView(Context c) { - super(c); - mPaint = new Paint(); - } - - @Override - public void dispatchDraw(Canvas canvas) { - canvas.drawRGB(255, 255, 255); - - mPaint.setColor(0xffff0000); - canvas.drawRect(200.0f, 0.0f, 220.0f, 20.0f, mPaint); - - canvas.save(); - canvas.clipRect(20.0f, 0.0f, 40.0f, 20.0f); - Log.d(LOG_TAG, "clipRect = " + canvas.getClipBounds()); - Log.d(LOG_TAG, "rejected = " + canvas.quickReject(100.0f, 100.0f, 110.0f, 110.0f, - Canvas.EdgeType.BW)); - Log.d(LOG_TAG, "rejected = " + canvas.quickReject(25.0f, 5.0f, 30.0f, 10.0f, - Canvas.EdgeType.BW)); - canvas.restore(); - - canvas.save(); - canvas.scale(2.0f, 2.0f); - canvas.clipRect(20.0f, 0.0f, 40.0f, 20.0f); - Log.d(LOG_TAG, "clipRect = " + canvas.getClipBounds()); - Log.d(LOG_TAG, "rejected = " + canvas.quickReject(50.0f, 50.0f, 60.0f, 60.0f, - Canvas.EdgeType.BW)); - Log.d(LOG_TAG, "rejected = " + canvas.quickReject(25.0f, 5.0f, 30.0f, 10.0f, - Canvas.EdgeType.BW)); - canvas.restore(); - - canvas.save(); - canvas.translate(20.0f, 20.0f); - canvas.clipRect(20.0f, 0.0f, 40.0f, 20.0f); - Log.d(LOG_TAG, "clipRect = " + canvas.getClipBounds()); - Log.d(LOG_TAG, "rejected = " + canvas.quickReject(80.0f, 80.0f, 90.0f, 90.0f, - Canvas.EdgeType.BW)); - Log.d(LOG_TAG, "rejected = " + canvas.quickReject(25.0f, 5.0f, 30.0f, 10.0f, - Canvas.EdgeType.BW)); - canvas.restore(); - - canvas.save(); - canvas.scale(2.0f, 2.0f); - canvas.clipRect(20.0f, 0.0f, 40.0f, 20.0f); - - mPaint.setColor(0xff00ff00); - canvas.drawRect(0.0f, 0.0f, 20.0f, 20.0f, mPaint); - - mPaint.setColor(0xff0000ff); - canvas.drawRect(20.0f, 0.0f, 40.0f, 20.0f, mPaint); - - canvas.restore(); - - final int restoreTo = canvas.save(); - canvas.saveLayerAlpha(0.0f, 100.0f, getWidth(), 150.0f, 127, - Canvas.HAS_ALPHA_LAYER_SAVE_FLAG | Canvas.CLIP_TO_LAYER_SAVE_FLAG); - mPaint.setColor(0xff0000ff); - canvas.drawRect(0.0f, 100.0f, 40.0f, 150.0f, mPaint); - mPaint.setColor(0xff00ffff); - canvas.drawRect(40.0f, 100.0f, 140.0f, 150.0f, mPaint); - mPaint.setColor(0xffff00ff); - canvas.drawRect(140.0f, 100.0f, 240.0f, 150.0f, mPaint); - canvas.restoreToCount(restoreTo); - - super.dispatchDraw(canvas); - } - } -}
\ No newline at end of file diff --git a/tests/HwAccelerationTest/src/com/google/android/test/hwui/RotationActivity.java b/tests/HwAccelerationTest/src/com/google/android/test/hwui/RotationActivity.java new file mode 100644 index 0000000..e629cb8 --- /dev/null +++ b/tests/HwAccelerationTest/src/com/google/android/test/hwui/RotationActivity.java @@ -0,0 +1,63 @@ +/* + * 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. + */ + +package com.google.android.test.hwui; + +import android.app.Activity; +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.os.Bundle; +import android.view.View; + +@SuppressWarnings({"UnusedDeclaration"}) +public class RotationActivity extends Activity { + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + DrawingView container = new DrawingView(this); + + setContentView(container); + } + + @SuppressWarnings({"UnusedDeclaration"}) + static int dipToPx(Context c, int dip) { + return (int) (c.getResources().getDisplayMetrics().density * dip + 0.5f); + } + + static class DrawingView extends View { + private final Paint mPaint; + + DrawingView(Context c) { + super(c); + mPaint = new Paint(); + mPaint.setAntiAlias(true); + } + + @Override + protected void onDraw(Canvas canvas) { + canvas.save(); + canvas.translate(dipToPx(getContext(), 400), dipToPx(getContext(), 200)); + canvas.rotate(45.0f); + canvas.drawRGB(255, 255, 255); + mPaint.setColor(0xffff0000); + canvas.drawRect(-80.0f, -80.0f, 80.0f, 80.0f, mPaint); + canvas.drawRect(0.0f, 0.0f, 220.0f, 220.0f, mPaint); + canvas.restore(); + } + } +} |
