diff options
| author | 2018-03-09 18:19:52 +0000 | |
|---|---|---|
| committer | 2018-03-09 18:19:52 +0000 | |
| commit | c481d0a43c777f4dea3b2021e2b7ded97d7d7cde (patch) | |
| tree | d4206f6dc0a9d52b94d4391fb95d607357759e67 | |
| parent | 874b0091372a5a74e8a959c15dc93b4e82a2329d (diff) | |
| parent | d8b68717400487a3dd20d1cc7c11f6e1ee6d3fd9 (diff) | |
Merge "Add lockHardwareWideColorGamutCanvas." into pi-dev
| -rw-r--r-- | core/java/android/view/Surface.java | 52 | ||||
| -rw-r--r-- | core/jni/android_view_Surface.cpp | 8 |
2 files changed, 54 insertions, 6 deletions
diff --git a/core/java/android/view/Surface.java b/core/java/android/view/Surface.java index 8830c90addac..d3b1e5c52596 100644 --- a/core/java/android/view/Surface.java +++ b/core/java/android/view/Surface.java @@ -396,7 +396,44 @@ public class Surface implements Parcelable { synchronized (mLock) { checkNotReleasedLocked(); if (mHwuiContext == null) { - mHwuiContext = new HwuiContext(); + mHwuiContext = new HwuiContext(false); + } + return mHwuiContext.lockCanvas( + nativeGetWidth(mNativeObject), + nativeGetHeight(mNativeObject)); + } + } + + /** + * Gets a {@link Canvas} for drawing into this surface that supports wide color gamut. + * + * After drawing into the provided {@link Canvas}, the caller must + * invoke {@link #unlockCanvasAndPost} to post the new contents to the surface. + * + * Unlike {@link #lockCanvas(Rect)} and {@link #lockHardwareCanvas()}, + * this will return a hardware-accelerated canvas that supports wide color gamut. + * See the <a href="{@docRoot}guide/topics/graphics/hardware-accel.html#unsupported"> + * unsupported drawing operations</a> for a list of what is and isn't + * supported in a hardware-accelerated canvas. It is also required to + * fully cover the surface every time {@link #lockHardwareCanvas()} is + * called as the buffer is not preserved between frames. Partial updates + * are not supported. + * + * @return A canvas for drawing into the surface. + * + * @throws IllegalStateException If the canvas cannot be locked. + * + * @hide + */ + public Canvas lockHardwareWideColorGamutCanvas() { + synchronized (mLock) { + checkNotReleasedLocked(); + if (mHwuiContext != null && !mHwuiContext.isWideColorGamut()) { + mHwuiContext.destroy(); + mHwuiContext = null; + } + if (mHwuiContext == null) { + mHwuiContext = new HwuiContext(true); } return mHwuiContext.lockCanvas( nativeGetWidth(mNativeObject), @@ -829,11 +866,14 @@ public class Surface implements Parcelable { private final RenderNode mRenderNode; private long mHwuiRenderer; private DisplayListCanvas mCanvas; + private final boolean mIsWideColorGamut; - HwuiContext() { + HwuiContext(boolean isWideColorGamut) { mRenderNode = RenderNode.create("HwuiCanvas", null); mRenderNode.setClipToBounds(false); - mHwuiRenderer = nHwuiCreate(mRenderNode.mNativeRenderNode, mNativeObject); + mIsWideColorGamut = isWideColorGamut; + mHwuiRenderer = nHwuiCreate(mRenderNode.mNativeRenderNode, mNativeObject, + isWideColorGamut); } Canvas lockCanvas(int width, int height) { @@ -864,9 +904,13 @@ public class Surface implements Parcelable { mHwuiRenderer = 0; } } + + boolean isWideColorGamut() { + return mIsWideColorGamut; + } } - private static native long nHwuiCreate(long rootNode, long surface); + private static native long nHwuiCreate(long rootNode, long surface, boolean isWideColorGamut); private static native void nHwuiSetSurface(long renderer, long surface); private static native void nHwuiDraw(long renderer); private static native void nHwuiDestroy(long renderer); diff --git a/core/jni/android_view_Surface.cpp b/core/jni/android_view_Surface.cpp index f5c09fd316de..f70cf07b9535 100644 --- a/core/jni/android_view_Surface.cpp +++ b/core/jni/android_view_Surface.cpp @@ -546,12 +546,16 @@ public: } }; -static jlong create(JNIEnv* env, jclass clazz, jlong rootNodePtr, jlong surfacePtr) { +static jlong create(JNIEnv* env, jclass clazz, jlong rootNodePtr, jlong surfacePtr, + jboolean isWideColorGamut) { RenderNode* rootNode = reinterpret_cast<RenderNode*>(rootNodePtr); sp<Surface> surface(reinterpret_cast<Surface*>(surfacePtr)); ContextFactory factory; RenderProxy* proxy = new RenderProxy(false, rootNode, &factory); proxy->loadSystemProperties(); + if (isWideColorGamut) { + proxy->setWideGamut(true); + } proxy->setSwapBehavior(SwapBehavior::kSwap_discardBuffer); proxy->initialize(surface); // Shadows can't be used via this interface, so just set the light source @@ -620,7 +624,7 @@ static const JNINativeMethod gSurfaceMethods[] = { {"nativeSetAutoRefreshEnabled", "(JZ)I", (void*)nativeSetAutoRefreshEnabled}, // HWUI context - {"nHwuiCreate", "(JJ)J", (void*) hwui::create }, + {"nHwuiCreate", "(JJZ)J", (void*) hwui::create }, {"nHwuiSetSurface", "(JJ)V", (void*) hwui::setSurface }, {"nHwuiDraw", "(J)V", (void*) hwui::draw }, {"nHwuiDestroy", "(J)V", (void*) hwui::destroy }, |