summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRomain Guy <romainguy@google.com>2010-08-17 18:40:50 -0700
committerAndroid (Google) Code Review <android-gerrit@google.com>2010-08-17 18:40:50 -0700
commit4ae784f126e15ff3363bb8d3587ea60bf642d509 (patch)
treedb5be3e5b0f1fbfe72950c6d7388677d29ce355c
parentcdff2f242425874a4a9758e9ce2fb0e4f3f1afa4 (diff)
parent8fb954263dd2f918ad339045cc6d82e346515599 (diff)
downloadframeworks_base-4ae784f126e15ff3363bb8d3587ea60bf642d509.zip
frameworks_base-4ae784f126e15ff3363bb8d3587ea60bf642d509.tar.gz
frameworks_base-4ae784f126e15ff3363bb8d3587ea60bf642d509.tar.bz2
Merge "Fix save()/restore() issues in the OpenGL renderer."
-rw-r--r--core/java/android/view/HardwareRenderer.java2
-rw-r--r--core/java/android/view/View.java14
-rw-r--r--core/java/android/view/ViewRoot.java2
-rw-r--r--core/java/android/widget/ScrollBarDrawable.java3
-rw-r--r--libs/hwui/OpenGLRenderer.cpp31
-rw-r--r--libs/hwui/Snapshot.h9
-rw-r--r--tests/HwAccelerationTest/res/layout/list_activity.xml25
-rw-r--r--tests/HwAccelerationTest/src/com/google/android/test/hwui/QuickRejectActivity.java27
8 files changed, 87 insertions, 26 deletions
diff --git a/core/java/android/view/HardwareRenderer.java b/core/java/android/view/HardwareRenderer.java
index 44bd6d4..ca60a89 100644
--- a/core/java/android/view/HardwareRenderer.java
+++ b/core/java/android/view/HardwareRenderer.java
@@ -385,7 +385,7 @@ public abstract class HardwareRenderer {
onPreDraw();
Canvas canvas = mCanvas;
- int saveCount = canvas.save(Canvas.MATRIX_SAVE_FLAG);
+ int saveCount = canvas.save();
canvas.translate(0, -yOffset);
try {
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 570793b..a0e840d 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -6630,9 +6630,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility
* @see android.widget.ScrollBarDrawable
* @hide
*/
- protected void onDrawHorizontalScrollBar(Canvas canvas,
- Drawable scrollBar,
- int l, int t, int r, int b) {
+ protected void onDrawHorizontalScrollBar(Canvas canvas, Drawable scrollBar,
+ int l, int t, int r, int b) {
scrollBar.setBounds(l, t, r, b);
scrollBar.draw(canvas);
}
@@ -6651,9 +6650,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility
* @see android.widget.ScrollBarDrawable
* @hide
*/
- protected void onDrawVerticalScrollBar(Canvas canvas,
- Drawable scrollBar,
- int l, int t, int r, int b) {
+ protected void onDrawVerticalScrollBar(Canvas canvas, Drawable scrollBar,
+ int l, int t, int r, int b) {
scrollBar.setBounds(l, t, r, b);
scrollBar.draw(canvas);
}
@@ -10018,8 +10016,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility
public final Interpolator scrollBarInterpolator = new Interpolator(1, 2);
- private final float[] mOpaque = {255.0f};
- private final float[] mTransparent = {0.0f};
+ private final float[] mOpaque = { 255.0f };
+ private final float[] mTransparent = { 0.0f };
/**
* When fading should start. This time moves into the future every time
diff --git a/core/java/android/view/ViewRoot.java b/core/java/android/view/ViewRoot.java
index faa4783..d32ccb1 100644
--- a/core/java/android/view/ViewRoot.java
+++ b/core/java/android/view/ViewRoot.java
@@ -1363,7 +1363,6 @@ public final class ViewRoot extends Handler implements ViewParent, View.AttachIn
", metrics=" + cxt.getResources().getDisplayMetrics() +
", compatibilityInfo=" + cxt.getResources().getCompatibilityInfo());
}
- int saveCount = canvas.save(Canvas.MATRIX_SAVE_FLAG);
try {
canvas.translate(0, -yoff);
if (mTranslator != null) {
@@ -1374,7 +1373,6 @@ public final class ViewRoot extends Handler implements ViewParent, View.AttachIn
mView.draw(canvas);
} finally {
mAttachInfo.mIgnoreDirtyState = false;
- canvas.restoreToCount(saveCount);
}
if (Config.DEBUG && ViewDebug.consistencyCheckEnabled) {
diff --git a/core/java/android/widget/ScrollBarDrawable.java b/core/java/android/widget/ScrollBarDrawable.java
index 3b113ae..93a1179 100644
--- a/core/java/android/widget/ScrollBarDrawable.java
+++ b/core/java/android/widget/ScrollBarDrawable.java
@@ -111,8 +111,7 @@ public class ScrollBarDrawable extends Drawable {
}
Rect r = getBounds();
- if (canvas.quickReject(r.left, r.top, r.right, r.bottom,
- Canvas.EdgeType.AA)) {
+ if (canvas.quickReject(r.left, r.top, r.right, r.bottom, Canvas.EdgeType.AA)) {
return;
}
if (drawTrack) {
diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp
index f35c380..35e17bf 100644
--- a/libs/hwui/OpenGLRenderer.cpp
+++ b/libs/hwui/OpenGLRenderer.cpp
@@ -193,7 +193,7 @@ void OpenGLRenderer::setViewport(int width, int height) {
void OpenGLRenderer::prepare() {
mSnapshot = new Snapshot(mFirstSnapshot);
- mSaveCount = 0;
+ mSaveCount = 1;
glDisable(GL_SCISSOR_TEST);
@@ -219,19 +219,17 @@ int OpenGLRenderer::save(int flags) {
}
void OpenGLRenderer::restore() {
- if (mSaveCount == 0) return;
-
- if (restoreSnapshot()) {
+ if (mSaveCount > 1 && restoreSnapshot()) {
setScissorFromClip();
}
}
void OpenGLRenderer::restoreToCount(int saveCount) {
- if (saveCount <= 0 || saveCount > mSaveCount) return;
+ if (saveCount < 1) saveCount = 1;
bool restoreClip = false;
- while (mSaveCount != saveCount - 1) {
+ while (mSaveCount > saveCount) {
restoreClip |= restoreSnapshot();
}
@@ -242,7 +240,7 @@ void OpenGLRenderer::restoreToCount(int saveCount) {
int OpenGLRenderer::saveSnapshot() {
mSnapshot = new Snapshot(mSnapshot);
- return ++mSaveCount;
+ return mSaveCount++;
}
bool OpenGLRenderer::restoreSnapshot() {
@@ -263,10 +261,18 @@ bool OpenGLRenderer::restoreSnapshot() {
composeLayer(current, previous);
}
+ bool skip = mSnapshot->skip;
+ if (!skip) {
+ mSaveCount--;
+ }
mSnapshot = previous;
- mSaveCount--;
- return restoreClip;
+ if (!skip) {
+ return restoreClip;
+ } else {
+ bool restorePreviousClip = restoreSnapshot();
+ return restoreClip || restorePreviousClip;
+ }
}
///////////////////////////////////////////////////////////////////////////////
@@ -324,18 +330,20 @@ bool OpenGLRenderer::createLayer(sp<Snapshot> snapshot, float left, float top,
glClear(GL_COLOR_BUFFER_BIT);
glEnable(GL_SCISSOR_TEST);
- // Save the layer in the snapshot
- snapshot->flags |= Snapshot::kFlagIsLayer;
layer->mode = mode;
layer->alpha = alpha / 255.0f;
layer->layer.set(left, top, right, bottom);
+ // Save the layer in the snapshot
+ snapshot->flags |= Snapshot::kFlagIsLayer;
snapshot->layer = layer;
snapshot->fbo = layer->fbo;
// Creates a new snapshot to draw into the FBO
saveSnapshot();
+ mSaveCount--;
+ mSnapshot->skip = true;
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);
@@ -432,7 +440,6 @@ const Rect& OpenGLRenderer::getClipBounds() {
bool OpenGLRenderer::quickReject(float left, float top, float right, float bottom) {
Rect r(left, top, right, bottom);
mSnapshot->transform.mapRect(r);
-
return !mSnapshot->clipRect.intersects(r);
}
diff --git a/libs/hwui/Snapshot.h b/libs/hwui/Snapshot.h
index 21b2bef..77650a3 100644
--- a/libs/hwui/Snapshot.h
+++ b/libs/hwui/Snapshot.h
@@ -42,7 +42,7 @@ namespace uirenderer {
*/
class Snapshot: public LightRefBase<Snapshot> {
public:
- Snapshot(): flags(0), previous(NULL), layer(NULL), fbo(0) { }
+ Snapshot(): skip(false), flags(0), previous(NULL), layer(NULL), fbo(0) { }
/**
* Copies the specified snapshot. Only the transform and clip rectangle
@@ -54,6 +54,7 @@ public:
height(s->height),
transform(s->transform),
clipRect(s->clipRect),
+ skip(false),
flags(0),
previous(s),
layer(NULL),
@@ -165,6 +166,12 @@ public:
Rect clipRect;
/**
+ * This snapshot should be skipped. Snapshots marked as skipped are
+ * created by the renderer and should be hidden from the user.
+ */
+ bool skip;
+
+ /**
* Dirty flags.
*/
int flags;
diff --git a/tests/HwAccelerationTest/res/layout/list_activity.xml b/tests/HwAccelerationTest/res/layout/list_activity.xml
index f548f53..6bba370 100644
--- a/tests/HwAccelerationTest/res/layout/list_activity.xml
+++ b/tests/HwAccelerationTest/res/layout/list_activity.xml
@@ -19,6 +19,31 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
+ <LinearLayout
+ android:orientation="horizontal"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+
+ <Button
+ android:layout_width="0dip"
+ android:layout_weight="1.0"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="10dip"
+ android:layout_marginRight="3dip"
+
+ android:text="Add" />
+
+ <Button
+ android:layout_width="0dip"
+ android:layout_weight="1.0"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="3dip"
+ android:layout_marginRight="10dip"
+
+ android:text="Remove" />
+
+ </LinearLayout>
+
<ListView
android:id="@+id/list"
android:layout_width="match_parent"
diff --git a/tests/HwAccelerationTest/src/com/google/android/test/hwui/QuickRejectActivity.java b/tests/HwAccelerationTest/src/com/google/android/test/hwui/QuickRejectActivity.java
index fd7a1e6..2ba249a 100644
--- a/tests/HwAccelerationTest/src/com/google/android/test/hwui/QuickRejectActivity.java
+++ b/tests/HwAccelerationTest/src/com/google/android/test/hwui/QuickRejectActivity.java
@@ -23,6 +23,7 @@ import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.os.Bundle;
+import android.util.Log;
import android.view.View;
@SuppressWarnings({"UnusedDeclaration"})
@@ -51,6 +52,32 @@ public class QuickRejectActivity extends Activity {
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
+ int count = canvas.getSaveCount();
+ Log.d("OpenGLRenderer", "count=" + count);
+ count = canvas.save();
+ Log.d("OpenGLRenderer", "count after save=" + count);
+ count = canvas.getSaveCount();
+ Log.d("OpenGLRenderer", "getSaveCount after save=" + count);
+ canvas.restore();
+ count = canvas.getSaveCount();
+ Log.d("OpenGLRenderer", "count after restore=" + count);
+ canvas.save();
+ Log.d("OpenGLRenderer", "count after save=" + canvas.getSaveCount());
+ canvas.save();
+ Log.d("OpenGLRenderer", "count after save=" + canvas.getSaveCount());
+ canvas.save();
+ Log.d("OpenGLRenderer", "count after save=" + canvas.getSaveCount());
+ canvas.restoreToCount(count);
+ count = canvas.getSaveCount();
+ Log.d("OpenGLRenderer", "count after restoreToCount=" + count);
+ count = canvas.saveLayer(0, 0, 10, 10, mBitmapPaint, Canvas.ALL_SAVE_FLAG);
+ Log.d("OpenGLRenderer", "count after saveLayer=" + count);
+ count = canvas.getSaveCount();
+ Log.d("OpenGLRenderer", "getSaveCount after saveLayer=" + count);
+ canvas.restore();
+ count = canvas.getSaveCount();
+ Log.d("OpenGLRenderer", "count after restore=" + count);
+
canvas.save();
canvas.clipRect(0.0f, 0.0f, 40.0f, 40.0f);
canvas.drawBitmap(mBitmap1, 0.0f, 0.0f, mBitmapPaint);