diff options
Diffstat (limited to 'core')
| -rw-r--r-- | core/java/android/view/DisplayList.java | 9 | ||||
| -rw-r--r-- | core/java/android/view/GLES20Canvas.java | 9 | ||||
| -rw-r--r-- | core/java/android/view/GLES20RecordingCanvas.java | 4 | ||||
| -rw-r--r-- | core/java/android/view/HardwareCanvas.java | 5 | ||||
| -rw-r--r-- | core/java/android/view/HardwareRenderer.java | 3 | ||||
| -rw-r--r-- | core/java/android/view/View.java | 2 | ||||
| -rw-r--r-- | core/java/android/view/ViewGroup.java | 5 | ||||
| -rw-r--r-- | core/java/android/widget/TextView.java | 8 | ||||
| -rw-r--r-- | core/jni/android_view_GLES20Canvas.cpp | 6 |
9 files changed, 37 insertions, 14 deletions
diff --git a/core/java/android/view/DisplayList.java b/core/java/android/view/DisplayList.java index fec0d4b..f60c8f0 100644 --- a/core/java/android/view/DisplayList.java +++ b/core/java/android/view/DisplayList.java @@ -27,6 +27,15 @@ package android.view; */ public abstract class DisplayList { /** + * Flag used when calling + * {@link HardwareCanvas#drawDisplayList(DisplayList, int, int, android.graphics.Rect, int)}. + * When this flag is set, draw operations lying outside of the bounds of the + * display list will be culled early. It is recommeneded to always set this + * flag. + */ + public static final int FLAG_CLIP_CHILDREN = 0x1; + + /** * Starts recording the display list. All operations performed on the * returned canvas are recorded and stored in this display list. * diff --git a/core/java/android/view/GLES20Canvas.java b/core/java/android/view/GLES20Canvas.java index 4af5f3d..f5fc708 100644 --- a/core/java/android/view/GLES20Canvas.java +++ b/core/java/android/view/GLES20Canvas.java @@ -385,13 +385,14 @@ class GLES20Canvas extends HardwareCanvas { private static native void nSetDisplayListName(int displayList, String name); @Override - public boolean drawDisplayList(DisplayList displayList, int width, int height, Rect dirty) { - return nDrawDisplayList(mRenderer, - ((GLES20DisplayList) displayList).getNativeDisplayList(), width, height, dirty); + public boolean drawDisplayList(DisplayList displayList, int width, int height, + Rect dirty, int flags) { + return nDrawDisplayList(mRenderer, ((GLES20DisplayList) displayList).getNativeDisplayList(), + width, height, dirty, flags); } private static native boolean nDrawDisplayList(int renderer, int displayList, - int width, int height, Rect dirty); + int width, int height, Rect dirty, int flags); @Override void outputDisplayList(DisplayList displayList) { diff --git a/core/java/android/view/GLES20RecordingCanvas.java b/core/java/android/view/GLES20RecordingCanvas.java index c987f48..c9ba65f 100644 --- a/core/java/android/view/GLES20RecordingCanvas.java +++ b/core/java/android/view/GLES20RecordingCanvas.java @@ -143,8 +143,8 @@ class GLES20RecordingCanvas extends GLES20Canvas implements Poolable<GLES20Recor @Override public void drawBitmapMesh(Bitmap bitmap, int meshWidth, int meshHeight, float[] verts, int vertOffset, int[] colors, int colorOffset, Paint paint) { - super.drawBitmapMesh(bitmap, meshWidth, meshHeight, verts, vertOffset, colors, colorOffset, - paint); + super.drawBitmapMesh(bitmap, meshWidth, meshHeight, verts, vertOffset, + colors, colorOffset, paint); mDisplayList.mBitmaps.add(bitmap); // Shaders in the Paint are ignored when drawing a Bitmap } diff --git a/core/java/android/view/HardwareCanvas.java b/core/java/android/view/HardwareCanvas.java index cbdbbde..838c03c 100644 --- a/core/java/android/view/HardwareCanvas.java +++ b/core/java/android/view/HardwareCanvas.java @@ -57,11 +57,14 @@ public abstract class HardwareCanvas extends Canvas { * @param height The height of the display list. * @param dirty The dirty region to redraw in the next pass, matters only * if this method returns true, can be null. + * @param flags Optional flags about drawing, see {@link DisplayList} for + * the possible flags. * * @return True if the content of the display list requires another * drawing pass (invalidate()), false otherwise */ - public abstract boolean drawDisplayList(DisplayList displayList, int width, int height, Rect dirty); + public abstract boolean drawDisplayList(DisplayList displayList, int width, int height, + Rect dirty, int flags); /** * Outputs the specified display list to the log. This method exists for use by diff --git a/core/java/android/view/HardwareRenderer.java b/core/java/android/view/HardwareRenderer.java index 67466a4..ec95863 100644 --- a/core/java/android/view/HardwareRenderer.java +++ b/core/java/android/view/HardwareRenderer.java @@ -969,7 +969,8 @@ public abstract class HardwareRenderer { } boolean invalidateNeeded = canvas.drawDisplayList(displayList, - view.getWidth(), view.getHeight(), mRedrawClip); + view.getWidth(), view.getHeight(), mRedrawClip, + DisplayList.FLAG_CLIP_CHILDREN); if (mProfileEnabled) { long now = System.nanoTime(); diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 613a766..e34af08 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -11204,7 +11204,7 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal } else { mPrivateFlags &= ~DIRTY_MASK; ((HardwareCanvas) canvas).drawDisplayList(displayList, - mRight - mLeft, mBottom - mTop, null); + mRight - mLeft, mBottom - mTop, null, flags); } } } else if (cache != null) { diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java index d40d8af..ef2e1e7 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -168,6 +168,11 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager */ protected int mGroupFlags; + /** + * NOTE: If you change the flags below make sure to reflect the changes + * the DisplayList class + */ + // When set, ViewGroup invalidates only the child's rectangle // Set by default static final int FLAG_CLIP_CHILDREN = 0x1; diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 7db8a1e..d29dc2e 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -5016,15 +5016,19 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener hardwareCanvas.setViewport(width, height); // The dirty rect should always be null for a display list hardwareCanvas.onPreDraw(null); + hardwareCanvas.translate(-mScrollX, -mScrollY); layout.draw(hardwareCanvas, highlight, mHighlightPaint, cursorOffsetVertical); + hardwareCanvas.translate(mScrollX, mScrollY); } finally { hardwareCanvas.onPostDraw(); mTextDisplayList.end(); mTextDisplayListIsValid = true; } } - ((HardwareCanvas) canvas).drawDisplayList(mTextDisplayList, - mScrollX + width, mScrollY + height, null); + canvas.translate(mScrollX, mScrollY); + ((HardwareCanvas) canvas).drawDisplayList(mTextDisplayList, width, height, null, + DisplayList.FLAG_CLIP_CHILDREN); + canvas.translate(-mScrollX, -mScrollY); } else { layout.draw(canvas, highlight, mHighlightPaint, cursorOffsetVertical); } diff --git a/core/jni/android_view_GLES20Canvas.cpp b/core/jni/android_view_GLES20Canvas.cpp index e19bb38..0c93b83 100644 --- a/core/jni/android_view_GLES20Canvas.cpp +++ b/core/jni/android_view_GLES20Canvas.cpp @@ -652,9 +652,9 @@ static void android_view_GLES20Canvas_destroyDisplayList(JNIEnv* env, static bool android_view_GLES20Canvas_drawDisplayList(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer, DisplayList* displayList, - jint width, jint height, jobject dirty) { + jint width, jint height, jobject dirty, jint flags) { android::uirenderer::Rect bounds; - bool redraw = renderer->drawDisplayList(displayList, width, height, bounds); + bool redraw = renderer->drawDisplayList(displayList, width, height, bounds, flags); if (redraw && dirty != NULL) { env->CallVoidMethod(dirty, gRectClassInfo.set, int(bounds.left), int(bounds.top), int(bounds.right), int(bounds.bottom)); @@ -901,7 +901,7 @@ static JNINativeMethod gMethods[] = { { "nGetDisplayListSize", "(I)I", (void*) android_view_GLES20Canvas_getDisplayListSize }, { "nSetDisplayListName", "(ILjava/lang/String;)V", (void*) android_view_GLES20Canvas_setDisplayListName }, - { "nDrawDisplayList", "(IIIILandroid/graphics/Rect;)Z", + { "nDrawDisplayList", "(IIIILandroid/graphics/Rect;I)Z", (void*) android_view_GLES20Canvas_drawDisplayList }, { "nCreateDisplayListRenderer", "()I", (void*) android_view_GLES20Canvas_createDisplayListRenderer }, |
