Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 86bd2140 authored by Fedor Kudasov's avatar Fedor Kudasov
Browse files

Enable RenderNode and RecordingCanvas for layoutlib

Bug: 117921091
Test: all tests should pass
Change-Id: I574b12a5f7a6a54cbbcb17c35a3884368fd404e6
parent c8d53875
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -40,6 +40,8 @@ cc_library_shared {
        "android_graphics_Picture.cpp",
        "android_nio_utils.cpp",
        "android_util_PathParser.cpp",
        "android_view_DisplayListCanvas.cpp",
        "android_view_RenderNode.cpp",
        "android/graphics/Bitmap.cpp",
        "android/graphics/BitmapFactory.cpp",
        "android/graphics/ByteBufferStreamAdaptor.cpp",
@@ -136,7 +138,6 @@ cc_library_shared {
                "android_database_SQLiteDebug.cpp",
                "android_view_CompositionSamplingListener.cpp",
                "android_view_DisplayEventReceiver.cpp",
                "android_view_DisplayListCanvas.cpp",
                "android_view_TextureLayer.cpp",
                "android_view_InputChannel.cpp",
                "android_view_InputDevice.cpp",
@@ -147,7 +148,6 @@ cc_library_shared {
                "android_view_KeyEvent.cpp",
                "android_view_MotionEvent.cpp",
                "android_view_PointerIcon.cpp",
                "android_view_RenderNode.cpp",
                "android_view_RenderNodeAnimator.cpp",
                "android_view_Surface.cpp",
                "android_view_SurfaceControl.cpp",
+4 −0
Original line number Diff line number Diff line
@@ -67,6 +67,8 @@ extern int register_android_graphics_fonts_FontFamily(JNIEnv* env);
extern int register_android_graphics_text_LineBreaker(JNIEnv* env);
extern int register_android_graphics_text_MeasuredText(JNIEnv* env);
extern int register_android_util_PathParser(JNIEnv* env);
extern int register_android_view_RenderNode(JNIEnv* env);
extern int register_android_view_DisplayListCanvas(JNIEnv* env);
extern int register_com_android_internal_util_VirtualRefBasePtr(JNIEnv *env);
extern int register_com_android_internal_view_animation_NativeInterpolatorFactoryHelper(JNIEnv *env);

@@ -83,6 +85,7 @@ static const std::unordered_map<std::string, RegJNIRec> gRegJNIMap = {
    {"android.graphics.BitmapFactory", REG_JNI(register_android_graphics_BitmapFactory)},
    {"android.graphics.ByteBufferStreamAdaptor", REG_JNI(register_android_graphics_ByteBufferStreamAdaptor)},
    {"android.graphics.Canvas", REG_JNI(register_android_graphics_Canvas)},
    {"android.graphics.RenderNode", REG_JNI(register_android_view_RenderNode)},
    {"android.graphics.ColorFilter", REG_JNI(register_android_graphics_ColorFilter)},
    {"android.graphics.ColorSpace", REG_JNI(register_android_graphics_ColorSpace)},
    {"android.graphics.CreateJavaOutputStreamAdaptor", REG_JNI(register_android_graphics_CreateJavaOutputStreamAdaptor)},
@@ -98,6 +101,7 @@ static const std::unordered_map<std::string, RegJNIRec> gRegJNIMap = {
    {"android.graphics.PathEffect", REG_JNI(register_android_graphics_PathEffect)},
    {"android.graphics.PathMeasure", REG_JNI(register_android_graphics_PathMeasure)},
    {"android.graphics.Picture", REG_JNI(register_android_graphics_Picture)},
    {"android.graphics.RecordingCanvas", REG_JNI(register_android_view_DisplayListCanvas)},
    {"android.graphics.Region", REG_JNI(register_android_graphics_Region)},
    {"android.graphics.Shader", REG_JNI(register_android_graphics_Shader)},
    {"android.graphics.Typeface", REG_JNI(register_android_graphics_Typeface)},
+22 −12
Original line number Diff line number Diff line
@@ -21,9 +21,9 @@
#include <nativehelper/JNIHelp.h>

#include <android_runtime/AndroidRuntime.h>

#ifdef __ANDROID__ // Layoutlib does not support Looper and device properties
#include <utils/Looper.h>
#include <cutils/properties.h>
#endif

#include <SkBitmap.h>
#include <SkRegion.h>
@@ -34,7 +34,9 @@
#include <hwui/Canvas.h>
#include <hwui/Paint.h>
#include <minikin/Layout.h>
#ifdef __ANDROID__ // Layoutlib does not support RenderThread
#include <renderthread/RenderProxy.h>
#endif

#include "core_jni_helpers.h"

@@ -52,6 +54,7 @@ static JNIEnv* jnienv(JavaVM* vm) {
    return env;
}

#ifdef __ANDROID__ // Layoutlib does not support GL, Looper
class InvokeRunnableMessage : public MessageHandler {
public:
    InvokeRunnableMessage(JNIEnv* env, jobject runnable) {
@@ -87,11 +90,13 @@ private:
    sp<Looper> mLooper;
    sp<InvokeRunnableMessage> mMessage;
};
#endif

// ---------------- @FastNative -----------------------------

static void android_view_DisplayListCanvas_callDrawGLFunction(JNIEnv* env, jobject clazz,
        jlong canvasPtr, jlong functorPtr, jobject releasedCallback) {
#ifdef __ANDROID__ // Layoutlib does not support GL
    Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
    Functor* functor = reinterpret_cast<Functor*>(functorPtr);
    sp<GlFunctorReleasedCallbackBridge> bridge;
@@ -99,52 +104,57 @@ static void android_view_DisplayListCanvas_callDrawGLFunction(JNIEnv* env, jobje
        bridge = new GlFunctorReleasedCallbackBridge(env, releasedCallback);
    }
    canvas->callDrawGLFunction(functor, bridge.get());
#endif
}


// ---------------- @CriticalNative -------------------------

static jlong android_view_DisplayListCanvas_createDisplayListCanvas(jlong renderNodePtr,
static jlong android_view_DisplayListCanvas_createDisplayListCanvas(CRITICAL_JNI_PARAMS_COMMA jlong renderNodePtr,
        jint width, jint height) {
    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
    return reinterpret_cast<jlong>(Canvas::create_recording_canvas(width, height, renderNode));
}

static void android_view_DisplayListCanvas_resetDisplayListCanvas(jlong canvasPtr,
static void android_view_DisplayListCanvas_resetDisplayListCanvas(CRITICAL_JNI_PARAMS_COMMA jlong canvasPtr,
        jlong renderNodePtr, jint width, jint height) {
    Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
    canvas->resetRecording(width, height, renderNode);
}

static jint android_view_DisplayListCanvas_getMaxTextureSize() {
static jint android_view_DisplayListCanvas_getMaxTextureSize(CRITICAL_JNI_PARAMS) {
#ifdef __ANDROID__ // Layoutlib does not support RenderProxy (RenderThread)
    return android::uirenderer::renderthread::RenderProxy::maxTextureSize();
#else
    return 4096;
#endif
}

static void android_view_DisplayListCanvas_insertReorderBarrier(jlong canvasPtr,
static void android_view_DisplayListCanvas_insertReorderBarrier(CRITICAL_JNI_PARAMS_COMMA jlong canvasPtr,
        jboolean reorderEnable) {
    Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
    canvas->insertReorderBarrier(reorderEnable);
}

static jlong android_view_DisplayListCanvas_finishRecording(jlong canvasPtr) {
static jlong android_view_DisplayListCanvas_finishRecording(CRITICAL_JNI_PARAMS_COMMA jlong canvasPtr) {
    Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
    return reinterpret_cast<jlong>(canvas->finishRecording());
}

static void android_view_DisplayListCanvas_drawRenderNode(jlong canvasPtr, jlong renderNodePtr) {
static void android_view_DisplayListCanvas_drawRenderNode(CRITICAL_JNI_PARAMS_COMMA jlong canvasPtr, jlong renderNodePtr) {
    Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
    canvas->drawRenderNode(renderNode);
}

static void android_view_DisplayListCanvas_drawTextureLayer(jlong canvasPtr, jlong layerPtr) {
static void android_view_DisplayListCanvas_drawTextureLayer(CRITICAL_JNI_PARAMS_COMMA jlong canvasPtr, jlong layerPtr) {
    Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
    DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerPtr);
    canvas->drawLayer(layer);
}

static void android_view_DisplayListCanvas_drawRoundRectProps(jlong canvasPtr,
static void android_view_DisplayListCanvas_drawRoundRectProps(CRITICAL_JNI_PARAMS_COMMA jlong canvasPtr,
        jlong leftPropPtr, jlong topPropPtr, jlong rightPropPtr, jlong bottomPropPtr,
        jlong rxPropPtr, jlong ryPropPtr, jlong paintPropPtr) {
    Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
@@ -158,7 +168,7 @@ static void android_view_DisplayListCanvas_drawRoundRectProps(jlong canvasPtr,
    canvas->drawRoundRect(leftProp, topProp, rightProp, bottomProp, rxProp, ryProp, paintProp);
}

static void android_view_DisplayListCanvas_drawCircleProps(jlong canvasPtr,
static void android_view_DisplayListCanvas_drawCircleProps(CRITICAL_JNI_PARAMS_COMMA jlong canvasPtr,
        jlong xPropPtr, jlong yPropPtr, jlong radiusPropPtr, jlong paintPropPtr) {
    Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
    CanvasPropertyPrimitive* xProp = reinterpret_cast<CanvasPropertyPrimitive*>(xPropPtr);
@@ -168,7 +178,7 @@ static void android_view_DisplayListCanvas_drawCircleProps(jlong canvasPtr,
    canvas->drawCircle(xProp, yProp, radiusProp, paintProp);
}

static void android_view_DisplayListCanvas_drawWebViewFunctor(jlong canvasPtr, jint functor) {
static void android_view_DisplayListCanvas_drawWebViewFunctor(CRITICAL_JNI_PARAMS_COMMA jlong canvasPtr, jint functor) {
    Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
    canvas->drawWebViewFunctor(functor);
}
+88 −79

File changed.

Preview size limit exceeded, changes collapsed.

+18 −13
Original line number Diff line number Diff line
@@ -56,6 +56,8 @@ cc_defaults {
        host: {
            include_dirs: [
                "external/vulkan-headers/include",
                "frameworks/native/libs/math/include",
                "frameworks/native/libs/ui/include",
            ],
            cflags: [
                "-Wno-unused-variable",
@@ -159,6 +161,10 @@ cc_defaults {
    whole_static_libs: ["libskia"],

    srcs: [
        "pipeline/skia/SkiaDisplayList.cpp",
        "pipeline/skia/SkiaRecordingCanvas.cpp",
        "pipeline/skia/RenderNodeDrawable.cpp",
        "pipeline/skia/ReorderBarrierDrawables.cpp",
        "hwui/AnimatedImageDrawable.cpp",
        "hwui/AnimatedImageThread.cpp",
        "hwui/Bitmap.cpp",
@@ -168,15 +174,24 @@ cc_defaults {
        "hwui/PaintImpl.cpp",
        "hwui/Typeface.cpp",
        "utils/Blur.cpp",
        "utils/Color.cpp",
        "utils/LinearAllocator.cpp",
        "utils/VectorDrawableUtils.cpp",
        "AnimationContext.cpp",
        "Animator.cpp",
        "AnimatorManager.cpp",
        "CanvasTransform.cpp",
        "DamageAccumulator.cpp",
        "Interpolator.cpp",
        "LightingInfo.cpp",
        "Matrix.cpp",
        "PathParser.cpp",
        "Properties.cpp",
        "PropertyValuesAnimatorSet.cpp",
        "PropertyValuesHolder.cpp",
        "RecordingCanvas.cpp",
        "RenderNode.cpp",
        "RenderProperties.cpp",
        "SkiaCanvas.cpp",
        "VectorDrawable.cpp",
    ],
@@ -193,15 +208,11 @@ cc_defaults {
            srcs: [
                "pipeline/skia/GLFunctorDrawable.cpp",
                "pipeline/skia/LayerDrawable.cpp",
                "pipeline/skia/RenderNodeDrawable.cpp",
                "pipeline/skia/ReorderBarrierDrawables.cpp",
                "pipeline/skia/ShaderCache.cpp",
                "pipeline/skia/SkiaDisplayList.cpp",
                "pipeline/skia/SkiaMemoryTracer.cpp",
                "pipeline/skia/SkiaOpenGLPipeline.cpp",
                "pipeline/skia/SkiaPipeline.cpp",
                "pipeline/skia/SkiaProfileRenderer.cpp",
                "pipeline/skia/SkiaRecordingCanvas.cpp",
                "pipeline/skia/SkiaVulkanPipeline.cpp",
                "pipeline/skia/VectorDrawableAtlas.cpp",
                "pipeline/skia/VkFunctorDrawable.cpp",
@@ -224,13 +235,8 @@ cc_defaults {
                "surfacetexture/ImageConsumer.cpp",
                "surfacetexture/SurfaceTexture.cpp",
                "thread/CommonPool.cpp",
                "utils/Color.cpp",
                "utils/GLUtils.cpp",
                "utils/StringUtils.cpp",
                "AnimationContext.cpp",
                "AnimatorManager.cpp",
                "CanvasTransform.cpp",
                "DamageAccumulator.cpp",
                "DeferredLayerUpdater.cpp",
                "DeviceInfo.cpp",
                "FrameInfo.cpp",
@@ -241,13 +247,9 @@ cc_defaults {
                "JankTracker.cpp",
                "Layer.cpp",
                "LayerUpdateQueue.cpp",
                "LightingInfo.cpp",
                "ProfileData.cpp",
                "ProfileDataContainer.cpp",
                "Readback.cpp",
                "RecordingCanvas.cpp",
                "RenderNode.cpp",
                "RenderProperties.cpp",
                "TreeInfo.cpp",
                "WebViewFunctorManager.cpp",
                "protos/graphicsstats.proto",
@@ -257,6 +259,9 @@ cc_defaults {
            cflags: ["-Wno-implicit-fallthrough"],
        },
        host: {
            srcs: [
                "utils/HostColorSpace.cpp",
            ],
            export_static_lib_headers: [
                "libarect",
            ],
Loading