diff options
author | Scott Lobdell <slobdell@google.com> | 2021-03-23 20:33:04 +0000 |
---|---|---|
committer | Scott Lobdell <slobdell@google.com> | 2021-03-24 02:40:01 +0000 |
commit | 757dbb836469bbdd7eb8312deaf584fe0c99c17d (patch) | |
tree | a678b33ad5f0f024d0f942f127b91665f0616193 /libs/hwui/jni/android_graphics_RenderNode.cpp | |
parent | 7710a95746be8dba8c6ffe7172f9c01334a2ca81 (diff) | |
parent | f022dd1e6827ebf7c52b06aa40f2059a3f0f5cad (diff) |
Merge SP1A.210311.001
Change-Id: Id1a205bf3f0609c0b13e4bea377056c3b06299fa
Diffstat (limited to 'libs/hwui/jni/android_graphics_RenderNode.cpp')
-rw-r--r-- | libs/hwui/jni/android_graphics_RenderNode.cpp | 253 |
1 files changed, 146 insertions, 107 deletions
diff --git a/libs/hwui/jni/android_graphics_RenderNode.cpp b/libs/hwui/jni/android_graphics_RenderNode.cpp index 80239687a7fb..fc7d0d181949 100644 --- a/libs/hwui/jni/android_graphics_RenderNode.cpp +++ b/libs/hwui/jni/android_graphics_RenderNode.cpp @@ -25,6 +25,7 @@ #include <renderthread/CanvasContext.h> #endif #include <TreeInfo.h> +#include <effects/StretchEffect.h> #include <hwui/Paint.h> #include <utils/TraceUtils.h> @@ -179,14 +180,13 @@ static jboolean android_view_RenderNode_clearStretch(CRITICAL_JNI_PARAMS_COMMA j } static jboolean android_view_RenderNode_stretch(CRITICAL_JNI_PARAMS_COMMA jlong renderNodePtr, - jfloat left, jfloat top, jfloat right, jfloat bottom, jfloat vX, jfloat vY, jfloat max) { + jfloat left, jfloat top, jfloat right, + jfloat bottom, jfloat vX, jfloat vY, jfloat max) { + StretchEffect effect = + StretchEffect(SkRect::MakeLTRB(left, top, right, bottom), {.fX = vX, .fY = vY}, max); RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr); renderNode->mutateStagingProperties().mutateLayerProperties().mutableStretchEffect().mergeWith( - StretchEffect{ - .stretchArea = SkRect::MakeLTRB(left, top, right, bottom), - .stretchDirection = {.fX = vX, .fY = vY}, - .maxStretchAmount = max - }); + effect); renderNode->setPropertyFieldsDirty(RenderNode::GENERIC); return true; } @@ -549,6 +549,7 @@ static void android_view_RenderNode_endAllAnimators(JNIEnv* env, jobject clazz, // ---------------------------------------------------------------------------- jmethodID gPositionListener_PositionChangedMethod; +jmethodID gPositionListener_ApplyStretchMethod; jmethodID gPositionListener_PositionLostMethod; static void android_view_RenderNode_requestPositionUpdates(JNIEnv* env, jobject, @@ -571,6 +572,11 @@ static void android_view_RenderNode_requestPositionUpdates(JNIEnv* env, jobject, Matrix4 transform; info.damageAccumulator->computeCurrentTransform(&transform); const RenderProperties& props = node.properties(); + + if (info.stretchEffectCount) { + handleStretchEffect(info, transform); + } + uirenderer::Rect bounds(props.getWidth(), props.getHeight()); transform.mapRect(bounds); @@ -613,7 +619,7 @@ static void android_view_RenderNode_requestPositionUpdates(JNIEnv* env, jobject, JNIEnv* env = jnienv(); jobject localref = env->NewLocalRef(mWeakRef); if (CC_UNLIKELY(!localref)) { - jnienv()->DeleteWeakGlobalRef(mWeakRef); + env->DeleteWeakGlobalRef(mWeakRef); mWeakRef = nullptr; return; } @@ -634,6 +640,33 @@ static void android_view_RenderNode_requestPositionUpdates(JNIEnv* env, jobject, return env; } + void handleStretchEffect(const TreeInfo& info, const Matrix4& transform) { + // Search up to find the nearest stretcheffect parent + const StretchEffect* effect = info.damageAccumulator->findNearestStretchEffect(); + if (!effect) { + return; + } + + uirenderer::Rect area = effect->stretchArea; + transform.mapRect(area); + JNIEnv* env = jnienv(); + + jobject localref = env->NewLocalRef(mWeakRef); + if (CC_UNLIKELY(!localref)) { + env->DeleteWeakGlobalRef(mWeakRef); + mWeakRef = nullptr; + return; + } +#ifdef __ANDROID__ // Layoutlib does not support CanvasContext + SkVector stretchDirection = effect->getStretchDirection(); + env->CallVoidMethod(localref, gPositionListener_ApplyStretchMethod, + info.canvasContext.getFrameNumber(), area.left, area.top, + area.right, area.bottom, stretchDirection.fX, stretchDirection.fY, + effect->maxStretchAmount); +#endif + env->DeleteLocalRef(localref); + } + void doUpdatePositionAsync(jlong frameNumber, jint left, jint top, jint right, jint bottom) { ATRACE_NAME("Update SurfaceView position"); @@ -669,112 +702,118 @@ static void android_view_RenderNode_requestPositionUpdates(JNIEnv* env, jobject, const char* const kClassPathName = "android/graphics/RenderNode"; static const JNINativeMethod gMethods[] = { -// ---------------------------------------------------------------------------- -// Regular JNI -// ---------------------------------------------------------------------------- - { "nCreate", "(Ljava/lang/String;)J", (void*) android_view_RenderNode_create }, - { "nGetNativeFinalizer", "()J", (void*) android_view_RenderNode_getNativeFinalizer }, - { "nOutput", "(J)V", (void*) android_view_RenderNode_output }, - { "nGetUsageSize", "(J)I", (void*) android_view_RenderNode_getUsageSize }, - { "nGetAllocatedSize", "(J)I", (void*) android_view_RenderNode_getAllocatedSize }, - { "nAddAnimator", "(JJ)V", (void*) android_view_RenderNode_addAnimator }, - { "nEndAllAnimators", "(J)V", (void*) android_view_RenderNode_endAllAnimators }, - { "nRequestPositionUpdates", "(JLandroid/graphics/RenderNode$PositionUpdateListener;)V", (void*) android_view_RenderNode_requestPositionUpdates }, - -// ---------------------------------------------------------------------------- -// Critical JNI via @CriticalNative annotation in RenderNode.java -// ---------------------------------------------------------------------------- - { "nDiscardDisplayList", "(J)V", (void*) android_view_RenderNode_discardDisplayList }, - { "nIsValid", "(J)Z", (void*) android_view_RenderNode_isValid }, - { "nSetLayerType", "(JI)Z", (void*) android_view_RenderNode_setLayerType }, - { "nGetLayerType", "(J)I", (void*) android_view_RenderNode_getLayerType }, - { "nSetLayerPaint", "(JJ)Z", (void*) android_view_RenderNode_setLayerPaint }, - { "nSetStaticMatrix", "(JJ)Z", (void*) android_view_RenderNode_setStaticMatrix }, - { "nSetAnimationMatrix", "(JJ)Z", (void*) android_view_RenderNode_setAnimationMatrix }, - { "nGetAnimationMatrix", "(JJ)Z", (void*) android_view_RenderNode_getAnimationMatrix }, - { "nSetClipToBounds", "(JZ)Z", (void*) android_view_RenderNode_setClipToBounds }, - { "nGetClipToBounds", "(J)Z", (void*) android_view_RenderNode_getClipToBounds }, - { "nSetClipBounds", "(JIIII)Z", (void*) android_view_RenderNode_setClipBounds }, - { "nSetClipBoundsEmpty", "(J)Z", (void*) android_view_RenderNode_setClipBoundsEmpty }, - { "nSetProjectBackwards", "(JZ)Z", (void*) android_view_RenderNode_setProjectBackwards }, - { "nSetProjectionReceiver","(JZ)Z", (void*) android_view_RenderNode_setProjectionReceiver }, - - { "nSetOutlineRoundRect", "(JIIIIFF)Z", (void*) android_view_RenderNode_setOutlineRoundRect }, - { "nSetOutlinePath", "(JJF)Z", (void*) android_view_RenderNode_setOutlinePath }, - { "nSetOutlineEmpty", "(J)Z", (void*) android_view_RenderNode_setOutlineEmpty }, - { "nSetOutlineNone", "(J)Z", (void*) android_view_RenderNode_setOutlineNone }, - { "nClearStretch", "(J)Z", (void*) android_view_RenderNode_clearStretch }, - { "nStretch", "(JFFFFFFF)Z", (void*) android_view_RenderNode_stretch }, - { "nHasShadow", "(J)Z", (void*) android_view_RenderNode_hasShadow }, - { "nSetSpotShadowColor", "(JI)Z", (void*) android_view_RenderNode_setSpotShadowColor }, - { "nGetSpotShadowColor", "(J)I", (void*) android_view_RenderNode_getSpotShadowColor }, - { "nSetAmbientShadowColor","(JI)Z", (void*) android_view_RenderNode_setAmbientShadowColor }, - { "nGetAmbientShadowColor","(J)I", (void*) android_view_RenderNode_getAmbientShadowColor }, - { "nSetClipToOutline", "(JZ)Z", (void*) android_view_RenderNode_setClipToOutline }, - { "nSetRevealClip", "(JZFFF)Z", (void*) android_view_RenderNode_setRevealClip }, - - { "nSetAlpha", "(JF)Z", (void*) android_view_RenderNode_setAlpha }, - { "nSetRenderEffect", "(JJ)Z", (void*) android_view_RenderNode_setRenderEffect }, - { "nSetHasOverlappingRendering", "(JZ)Z", - (void*) android_view_RenderNode_setHasOverlappingRendering }, - { "nSetUsageHint", "(JI)V", (void*) android_view_RenderNode_setUsageHint }, - { "nSetElevation", "(JF)Z", (void*) android_view_RenderNode_setElevation }, - { "nSetTranslationX", "(JF)Z", (void*) android_view_RenderNode_setTranslationX }, - { "nSetTranslationY", "(JF)Z", (void*) android_view_RenderNode_setTranslationY }, - { "nSetTranslationZ", "(JF)Z", (void*) android_view_RenderNode_setTranslationZ }, - { "nSetRotation", "(JF)Z", (void*) android_view_RenderNode_setRotation }, - { "nSetRotationX", "(JF)Z", (void*) android_view_RenderNode_setRotationX }, - { "nSetRotationY", "(JF)Z", (void*) android_view_RenderNode_setRotationY }, - { "nSetScaleX", "(JF)Z", (void*) android_view_RenderNode_setScaleX }, - { "nSetScaleY", "(JF)Z", (void*) android_view_RenderNode_setScaleY }, - { "nSetPivotX", "(JF)Z", (void*) android_view_RenderNode_setPivotX }, - { "nSetPivotY", "(JF)Z", (void*) android_view_RenderNode_setPivotY }, - { "nResetPivot", "(J)Z", (void*) android_view_RenderNode_resetPivot }, - { "nSetCameraDistance", "(JF)Z", (void*) android_view_RenderNode_setCameraDistance }, - { "nSetLeft", "(JI)Z", (void*) android_view_RenderNode_setLeft }, - { "nSetTop", "(JI)Z", (void*) android_view_RenderNode_setTop }, - { "nSetRight", "(JI)Z", (void*) android_view_RenderNode_setRight }, - { "nSetBottom", "(JI)Z", (void*) android_view_RenderNode_setBottom }, - { "nGetLeft", "(J)I", (void*) android_view_RenderNode_getLeft }, - { "nGetTop", "(J)I", (void*) android_view_RenderNode_getTop }, - { "nGetRight", "(J)I", (void*) android_view_RenderNode_getRight }, - { "nGetBottom", "(J)I", (void*) android_view_RenderNode_getBottom }, - { "nSetLeftTopRightBottom","(JIIII)Z", (void*) android_view_RenderNode_setLeftTopRightBottom }, - { "nOffsetLeftAndRight", "(JI)Z", (void*) android_view_RenderNode_offsetLeftAndRight }, - { "nOffsetTopAndBottom", "(JI)Z", (void*) android_view_RenderNode_offsetTopAndBottom }, - - { "nHasOverlappingRendering", "(J)Z", (void*) android_view_RenderNode_hasOverlappingRendering }, - { "nGetClipToOutline", "(J)Z", (void*) android_view_RenderNode_getClipToOutline }, - { "nGetAlpha", "(J)F", (void*) android_view_RenderNode_getAlpha }, - { "nGetCameraDistance", "(J)F", (void*) android_view_RenderNode_getCameraDistance }, - { "nGetScaleX", "(J)F", (void*) android_view_RenderNode_getScaleX }, - { "nGetScaleY", "(J)F", (void*) android_view_RenderNode_getScaleY }, - { "nGetElevation", "(J)F", (void*) android_view_RenderNode_getElevation }, - { "nGetTranslationX", "(J)F", (void*) android_view_RenderNode_getTranslationX }, - { "nGetTranslationY", "(J)F", (void*) android_view_RenderNode_getTranslationY }, - { "nGetTranslationZ", "(J)F", (void*) android_view_RenderNode_getTranslationZ }, - { "nGetRotation", "(J)F", (void*) android_view_RenderNode_getRotation }, - { "nGetRotationX", "(J)F", (void*) android_view_RenderNode_getRotationX }, - { "nGetRotationY", "(J)F", (void*) android_view_RenderNode_getRotationY }, - { "nIsPivotExplicitlySet", "(J)Z", (void*) android_view_RenderNode_isPivotExplicitlySet }, - { "nHasIdentityMatrix", "(J)Z", (void*) android_view_RenderNode_hasIdentityMatrix }, - - { "nGetTransformMatrix", "(JJ)V", (void*) android_view_RenderNode_getTransformMatrix }, - { "nGetInverseTransformMatrix","(JJ)V", (void*) android_view_RenderNode_getInverseTransformMatrix }, - - { "nGetPivotX", "(J)F", (void*) android_view_RenderNode_getPivotX }, - { "nGetPivotY", "(J)F", (void*) android_view_RenderNode_getPivotY }, - { "nGetWidth", "(J)I", (void*) android_view_RenderNode_getWidth }, - { "nGetHeight", "(J)I", (void*) android_view_RenderNode_getHeight }, - { "nSetAllowForceDark", "(JZ)Z", (void*) android_view_RenderNode_setAllowForceDark }, - { "nGetAllowForceDark", "(J)Z", (void*) android_view_RenderNode_getAllowForceDark }, - { "nGetUniqueId", "(J)J", (void*) android_view_RenderNode_getUniqueId }, + // ---------------------------------------------------------------------------- + // Regular JNI + // ---------------------------------------------------------------------------- + {"nCreate", "(Ljava/lang/String;)J", (void*)android_view_RenderNode_create}, + {"nGetNativeFinalizer", "()J", (void*)android_view_RenderNode_getNativeFinalizer}, + {"nOutput", "(J)V", (void*)android_view_RenderNode_output}, + {"nGetUsageSize", "(J)I", (void*)android_view_RenderNode_getUsageSize}, + {"nGetAllocatedSize", "(J)I", (void*)android_view_RenderNode_getAllocatedSize}, + {"nAddAnimator", "(JJ)V", (void*)android_view_RenderNode_addAnimator}, + {"nEndAllAnimators", "(J)V", (void*)android_view_RenderNode_endAllAnimators}, + {"nRequestPositionUpdates", "(JLandroid/graphics/RenderNode$PositionUpdateListener;)V", + (void*)android_view_RenderNode_requestPositionUpdates}, + + // ---------------------------------------------------------------------------- + // Critical JNI via @CriticalNative annotation in RenderNode.java + // ---------------------------------------------------------------------------- + {"nDiscardDisplayList", "(J)V", (void*)android_view_RenderNode_discardDisplayList}, + {"nIsValid", "(J)Z", (void*)android_view_RenderNode_isValid}, + {"nSetLayerType", "(JI)Z", (void*)android_view_RenderNode_setLayerType}, + {"nGetLayerType", "(J)I", (void*)android_view_RenderNode_getLayerType}, + {"nSetLayerPaint", "(JJ)Z", (void*)android_view_RenderNode_setLayerPaint}, + {"nSetStaticMatrix", "(JJ)Z", (void*)android_view_RenderNode_setStaticMatrix}, + {"nSetAnimationMatrix", "(JJ)Z", (void*)android_view_RenderNode_setAnimationMatrix}, + {"nGetAnimationMatrix", "(JJ)Z", (void*)android_view_RenderNode_getAnimationMatrix}, + {"nSetClipToBounds", "(JZ)Z", (void*)android_view_RenderNode_setClipToBounds}, + {"nGetClipToBounds", "(J)Z", (void*)android_view_RenderNode_getClipToBounds}, + {"nSetClipBounds", "(JIIII)Z", (void*)android_view_RenderNode_setClipBounds}, + {"nSetClipBoundsEmpty", "(J)Z", (void*)android_view_RenderNode_setClipBoundsEmpty}, + {"nSetProjectBackwards", "(JZ)Z", (void*)android_view_RenderNode_setProjectBackwards}, + {"nSetProjectionReceiver", "(JZ)Z", (void*)android_view_RenderNode_setProjectionReceiver}, + + {"nSetOutlineRoundRect", "(JIIIIFF)Z", (void*)android_view_RenderNode_setOutlineRoundRect}, + {"nSetOutlinePath", "(JJF)Z", (void*)android_view_RenderNode_setOutlinePath}, + {"nSetOutlineEmpty", "(J)Z", (void*)android_view_RenderNode_setOutlineEmpty}, + {"nSetOutlineNone", "(J)Z", (void*)android_view_RenderNode_setOutlineNone}, + {"nClearStretch", "(J)Z", (void*)android_view_RenderNode_clearStretch}, + {"nStretch", "(JFFFFFFF)Z", (void*)android_view_RenderNode_stretch}, + {"nHasShadow", "(J)Z", (void*)android_view_RenderNode_hasShadow}, + {"nSetSpotShadowColor", "(JI)Z", (void*)android_view_RenderNode_setSpotShadowColor}, + {"nGetSpotShadowColor", "(J)I", (void*)android_view_RenderNode_getSpotShadowColor}, + {"nSetAmbientShadowColor", "(JI)Z", (void*)android_view_RenderNode_setAmbientShadowColor}, + {"nGetAmbientShadowColor", "(J)I", (void*)android_view_RenderNode_getAmbientShadowColor}, + {"nSetClipToOutline", "(JZ)Z", (void*)android_view_RenderNode_setClipToOutline}, + {"nSetRevealClip", "(JZFFF)Z", (void*)android_view_RenderNode_setRevealClip}, + + {"nSetAlpha", "(JF)Z", (void*)android_view_RenderNode_setAlpha}, + {"nSetRenderEffect", "(JJ)Z", (void*)android_view_RenderNode_setRenderEffect}, + {"nSetHasOverlappingRendering", "(JZ)Z", + (void*)android_view_RenderNode_setHasOverlappingRendering}, + {"nSetUsageHint", "(JI)V", (void*)android_view_RenderNode_setUsageHint}, + {"nSetElevation", "(JF)Z", (void*)android_view_RenderNode_setElevation}, + {"nSetTranslationX", "(JF)Z", (void*)android_view_RenderNode_setTranslationX}, + {"nSetTranslationY", "(JF)Z", (void*)android_view_RenderNode_setTranslationY}, + {"nSetTranslationZ", "(JF)Z", (void*)android_view_RenderNode_setTranslationZ}, + {"nSetRotation", "(JF)Z", (void*)android_view_RenderNode_setRotation}, + {"nSetRotationX", "(JF)Z", (void*)android_view_RenderNode_setRotationX}, + {"nSetRotationY", "(JF)Z", (void*)android_view_RenderNode_setRotationY}, + {"nSetScaleX", "(JF)Z", (void*)android_view_RenderNode_setScaleX}, + {"nSetScaleY", "(JF)Z", (void*)android_view_RenderNode_setScaleY}, + {"nSetPivotX", "(JF)Z", (void*)android_view_RenderNode_setPivotX}, + {"nSetPivotY", "(JF)Z", (void*)android_view_RenderNode_setPivotY}, + {"nResetPivot", "(J)Z", (void*)android_view_RenderNode_resetPivot}, + {"nSetCameraDistance", "(JF)Z", (void*)android_view_RenderNode_setCameraDistance}, + {"nSetLeft", "(JI)Z", (void*)android_view_RenderNode_setLeft}, + {"nSetTop", "(JI)Z", (void*)android_view_RenderNode_setTop}, + {"nSetRight", "(JI)Z", (void*)android_view_RenderNode_setRight}, + {"nSetBottom", "(JI)Z", (void*)android_view_RenderNode_setBottom}, + {"nGetLeft", "(J)I", (void*)android_view_RenderNode_getLeft}, + {"nGetTop", "(J)I", (void*)android_view_RenderNode_getTop}, + {"nGetRight", "(J)I", (void*)android_view_RenderNode_getRight}, + {"nGetBottom", "(J)I", (void*)android_view_RenderNode_getBottom}, + {"nSetLeftTopRightBottom", "(JIIII)Z", + (void*)android_view_RenderNode_setLeftTopRightBottom}, + {"nOffsetLeftAndRight", "(JI)Z", (void*)android_view_RenderNode_offsetLeftAndRight}, + {"nOffsetTopAndBottom", "(JI)Z", (void*)android_view_RenderNode_offsetTopAndBottom}, + + {"nHasOverlappingRendering", "(J)Z", + (void*)android_view_RenderNode_hasOverlappingRendering}, + {"nGetClipToOutline", "(J)Z", (void*)android_view_RenderNode_getClipToOutline}, + {"nGetAlpha", "(J)F", (void*)android_view_RenderNode_getAlpha}, + {"nGetCameraDistance", "(J)F", (void*)android_view_RenderNode_getCameraDistance}, + {"nGetScaleX", "(J)F", (void*)android_view_RenderNode_getScaleX}, + {"nGetScaleY", "(J)F", (void*)android_view_RenderNode_getScaleY}, + {"nGetElevation", "(J)F", (void*)android_view_RenderNode_getElevation}, + {"nGetTranslationX", "(J)F", (void*)android_view_RenderNode_getTranslationX}, + {"nGetTranslationY", "(J)F", (void*)android_view_RenderNode_getTranslationY}, + {"nGetTranslationZ", "(J)F", (void*)android_view_RenderNode_getTranslationZ}, + {"nGetRotation", "(J)F", (void*)android_view_RenderNode_getRotation}, + {"nGetRotationX", "(J)F", (void*)android_view_RenderNode_getRotationX}, + {"nGetRotationY", "(J)F", (void*)android_view_RenderNode_getRotationY}, + {"nIsPivotExplicitlySet", "(J)Z", (void*)android_view_RenderNode_isPivotExplicitlySet}, + {"nHasIdentityMatrix", "(J)Z", (void*)android_view_RenderNode_hasIdentityMatrix}, + + {"nGetTransformMatrix", "(JJ)V", (void*)android_view_RenderNode_getTransformMatrix}, + {"nGetInverseTransformMatrix", "(JJ)V", + (void*)android_view_RenderNode_getInverseTransformMatrix}, + + {"nGetPivotX", "(J)F", (void*)android_view_RenderNode_getPivotX}, + {"nGetPivotY", "(J)F", (void*)android_view_RenderNode_getPivotY}, + {"nGetWidth", "(J)I", (void*)android_view_RenderNode_getWidth}, + {"nGetHeight", "(J)I", (void*)android_view_RenderNode_getHeight}, + {"nSetAllowForceDark", "(JZ)Z", (void*)android_view_RenderNode_setAllowForceDark}, + {"nGetAllowForceDark", "(J)Z", (void*)android_view_RenderNode_getAllowForceDark}, + {"nGetUniqueId", "(J)J", (void*)android_view_RenderNode_getUniqueId}, }; int register_android_view_RenderNode(JNIEnv* env) { jclass clazz = FindClassOrDie(env, "android/graphics/RenderNode$PositionUpdateListener"); gPositionListener_PositionChangedMethod = GetMethodIDOrDie(env, clazz, "positionChanged", "(JIIII)V"); + gPositionListener_ApplyStretchMethod = + GetMethodIDOrDie(env, clazz, "applyStretch", "(JFFFFFFF)V"); gPositionListener_PositionLostMethod = GetMethodIDOrDie(env, clazz, "positionLost", "(J)V"); return RegisterMethodsOrDie(env, kClassPathName, gMethods, NELEM(gMethods)); |