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

Commit 6f485569 authored by Derek Sollenberger's avatar Derek Sollenberger
Browse files

Update Canvas API with view system calls.

Refactor DisplayListCanvas, RecordingCanvas, and SkiaCanvas
to share a common API.

Change-Id: I0268ec2749ea5d13a3a72bb2784ed6a9911383d9
parent 5d304503
Loading
Loading
Loading
Loading
+12 −17
Original line number Diff line number Diff line
@@ -27,13 +27,8 @@
#include <SkBitmap.h>
#include <SkRegion.h>

#if HWUI_NEW_OPS
#include <RecordingCanvas.h>
typedef android::uirenderer::RecordingCanvas canvas_t;
#else
#include <DisplayListCanvas.h>
typedef android::uirenderer::DisplayListCanvas canvas_t;
#endif

#include <Canvas.h>
#include <Rect.h>
#include <RenderNode.h>
#include <CanvasProperty.h>
@@ -52,7 +47,7 @@ using namespace uirenderer;

static void android_view_DisplayListCanvas_insertReorderBarrier(JNIEnv* env, jobject clazz,
        jlong canvasPtr, jboolean reorderEnable) {
    canvas_t* canvas = reinterpret_cast<canvas_t*>(canvasPtr);
    Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
    canvas->insertReorderBarrier(reorderEnable);
}

@@ -62,7 +57,7 @@ static void android_view_DisplayListCanvas_insertReorderBarrier(JNIEnv* env, job

static void android_view_DisplayListCanvas_callDrawGLFunction(JNIEnv* env, jobject clazz,
        jlong canvasPtr, jlong functorPtr) {
    canvas_t* canvas = reinterpret_cast<canvas_t*>(canvasPtr);
    Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
    Functor* functor = reinterpret_cast<Functor*>(functorPtr);
    canvas->callDrawGLFunction(functor);
}
@@ -92,7 +87,7 @@ static jint android_view_DisplayListCanvas_getMaxTextureHeight(JNIEnv* env, jobj
static void android_view_DisplayListCanvas_drawRoundRectProps(JNIEnv* env, jobject clazz,
        jlong canvasPtr, jlong leftPropPtr, jlong topPropPtr, jlong rightPropPtr,
        jlong bottomPropPtr, jlong rxPropPtr, jlong ryPropPtr, jlong paintPropPtr) {
    canvas_t* canvas = reinterpret_cast<canvas_t*>(canvasPtr);
    Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
    CanvasPropertyPrimitive* leftProp = reinterpret_cast<CanvasPropertyPrimitive*>(leftPropPtr);
    CanvasPropertyPrimitive* topProp = reinterpret_cast<CanvasPropertyPrimitive*>(topPropPtr);
    CanvasPropertyPrimitive* rightProp = reinterpret_cast<CanvasPropertyPrimitive*>(rightPropPtr);
@@ -105,7 +100,7 @@ static void android_view_DisplayListCanvas_drawRoundRectProps(JNIEnv* env, jobje

static void android_view_DisplayListCanvas_drawCircleProps(JNIEnv* env, jobject clazz,
        jlong canvasPtr, jlong xPropPtr, jlong yPropPtr, jlong radiusPropPtr, jlong paintPropPtr) {
    canvas_t* canvas = reinterpret_cast<canvas_t*>(canvasPtr);
    Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
    CanvasPropertyPrimitive* xProp = reinterpret_cast<CanvasPropertyPrimitive*>(xPropPtr);
    CanvasPropertyPrimitive* yProp = reinterpret_cast<CanvasPropertyPrimitive*>(yPropPtr);
    CanvasPropertyPrimitive* radiusProp = reinterpret_cast<CanvasPropertyPrimitive*>(radiusPropPtr);
@@ -119,25 +114,25 @@ static void android_view_DisplayListCanvas_drawCircleProps(JNIEnv* env, jobject

static jlong android_view_DisplayListCanvas_finishRecording(JNIEnv* env,
        jobject clazz, jlong canvasPtr) {
    canvas_t* canvas = reinterpret_cast<canvas_t*>(canvasPtr);
    Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
    return reinterpret_cast<jlong>(canvas->finishRecording());
}

static jlong android_view_DisplayListCanvas_createDisplayListCanvas(JNIEnv* env, jobject clazz,
        jint width, jint height) {
    return reinterpret_cast<jlong>(new canvas_t(width, height));
    return reinterpret_cast<jlong>(Canvas::create_recording_canvas(width, height));
}

static void android_view_DisplayListCanvas_resetDisplayListCanvas(JNIEnv* env, jobject clazz,
        jlong canvasPtr, jint width, jint height) {
    canvas_t* canvas = reinterpret_cast<canvas_t*>(canvasPtr);
    canvas->reset(width, height);
    Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
    canvas->resetRecording(width, height);
}


static void android_view_DisplayListCanvas_drawRenderNode(JNIEnv* env,
        jobject clazz, jlong canvasPtr, jlong renderNodePtr) {
    canvas_t* canvas = reinterpret_cast<canvas_t*>(canvasPtr);
    Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
    canvas->drawRenderNode(renderNode);
}
@@ -148,7 +143,7 @@ static void android_view_DisplayListCanvas_drawRenderNode(JNIEnv* env,

static void android_view_DisplayListCanvas_drawLayer(JNIEnv* env, jobject clazz,
        jlong canvasPtr, jlong layerPtr) {
    canvas_t* canvas = reinterpret_cast<canvas_t*>(canvasPtr);
    Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
    DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerPtr);
    canvas->drawLayer(layer);
}
+10 −0
Original line number Diff line number Diff line
@@ -16,10 +16,20 @@

#include "Canvas.h"

#include "DisplayListCanvas.h"
#include "RecordingCanvas.h"
#include <SkDrawFilter.h>

namespace android {

Canvas* Canvas::create_recording_canvas(int width, int height) {
#if HWUI_NEW_OPS
    return new uirenderer::RecordingCanvas(width, height);
#else
    return new uirenderer::DisplayListCanvas(width, height);
#endif
}

void Canvas::drawTextDecorations(float x, float y, float length, const SkPaint& paint) {
    uint32_t flags;
    SkDrawFilter* drawFilter = getDrawFilter();
+32 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@
#define ANDROID_GRAPHICS_CANVAS_H

#include <cutils/compiler.h>
#include <utils/Functor.h>

#include "utils/NinePatch.h"

@@ -27,6 +28,14 @@

namespace android {

namespace uirenderer {
    class CanvasPropertyPaint;
    class CanvasPropertyPrimitive;
    class DeferredLayerUpdater;
    class DisplayList;
    class RenderNode;
}

namespace SaveFlags {

// These must match the corresponding Canvas API constants.
@@ -56,6 +65,8 @@ public:

    static Canvas* create_canvas(const SkBitmap& bitmap);

    static Canvas* create_recording_canvas(int width, int height);

    /**
     *  Create a new Canvas object which delegates to an SkCanvas.
     *
@@ -81,15 +92,36 @@ public:
     */
    virtual SkCanvas* asSkCanvas() = 0;


    virtual void setBitmap(const SkBitmap& bitmap) = 0;

    virtual bool isOpaque() = 0;
    virtual int width() = 0;
    virtual int height() = 0;

// ----------------------------------------------------------------------------
// View System operations (not exposed in public Canvas API)
// ----------------------------------------------------------------------------

    virtual void resetRecording(int width, int height) = 0;
    virtual uirenderer::DisplayList* finishRecording() = 0;
    virtual void insertReorderBarrier(bool enableReorder) = 0;

    virtual void setHighContrastText(bool highContrastText) = 0;
    virtual bool isHighContrastText() = 0;

    virtual void drawRoundRect(uirenderer::CanvasPropertyPrimitive* left,
            uirenderer::CanvasPropertyPrimitive* top, uirenderer::CanvasPropertyPrimitive* right,
            uirenderer::CanvasPropertyPrimitive* bottom, uirenderer::CanvasPropertyPrimitive* rx,
            uirenderer::CanvasPropertyPrimitive* ry, uirenderer::CanvasPropertyPaint* paint) = 0;
    virtual void drawCircle(uirenderer::CanvasPropertyPrimitive* x,
            uirenderer::CanvasPropertyPrimitive* y, uirenderer::CanvasPropertyPrimitive* radius,
            uirenderer::CanvasPropertyPaint* paint) = 0;

    virtual void drawLayer(uirenderer::DeferredLayerUpdater* layerHandle) = 0;
    virtual void drawRenderNode(uirenderer::RenderNode* renderNode) = 0;
    virtual void callDrawGLFunction(Functor* functor) = 0;

// ----------------------------------------------------------------------------
// Canvas state operations
// ----------------------------------------------------------------------------
+2 −2
Original line number Diff line number Diff line
@@ -42,7 +42,7 @@ DisplayListCanvas::DisplayListCanvas(int width, int height)
    , mDeferredBarrierType(kBarrier_None)
    , mHighContrastText(false)
    , mRestoreSaveCount(-1) {
    reset(width, height);
    resetRecording(width, height);
}

DisplayListCanvas::~DisplayListCanvas() {
@@ -50,7 +50,7 @@ DisplayListCanvas::~DisplayListCanvas() {
            "Destroyed a DisplayListCanvas during a record!");
}

void DisplayListCanvas::reset(int width, int height) {
void DisplayListCanvas::resetRecording(int width, int height) {
    LOG_ALWAYS_FATAL_IF(mDisplayList,
            "prepareDirty called a second time during a recording!");
    mDisplayList = new DisplayList();
+10 −13
Original line number Diff line number Diff line
@@ -67,36 +67,33 @@ public:
    DisplayListCanvas(int width, int height);
    virtual ~DisplayListCanvas();

    void reset(int width, int height);
    WARN_UNUSED_RESULT DisplayList* finishRecording();
    virtual void resetRecording(int width, int height) override;
    virtual WARN_UNUSED_RESULT DisplayList* finishRecording() override;

// ----------------------------------------------------------------------------
// HWUI Canvas state operations
// ----------------------------------------------------------------------------

    void insertReorderBarrier(bool enableReorder);
    virtual void insertReorderBarrier(bool enableReorder) override;

// ----------------------------------------------------------------------------
// HWUI Canvas draw operations
// ----------------------------------------------------------------------------

    // Shapes
    void drawRoundRect(CanvasPropertyPrimitive* left, CanvasPropertyPrimitive* top,
    virtual void drawRoundRect(CanvasPropertyPrimitive* left, CanvasPropertyPrimitive* top,
                CanvasPropertyPrimitive* right, CanvasPropertyPrimitive* bottom,
                CanvasPropertyPrimitive* rx, CanvasPropertyPrimitive* ry,
                CanvasPropertyPaint* paint);
    void drawCircle(CanvasPropertyPrimitive* x, CanvasPropertyPrimitive* y,
                CanvasPropertyPrimitive* radius, CanvasPropertyPaint* paint);

                CanvasPropertyPaint* paint) override;
    virtual void drawCircle(CanvasPropertyPrimitive* x, CanvasPropertyPrimitive* y,
                CanvasPropertyPrimitive* radius, CanvasPropertyPaint* paint) override;

// ----------------------------------------------------------------------------
// HWUI Canvas draw operations - special
// ----------------------------------------------------------------------------
    void drawLayer(DeferredLayerUpdater* layerHandle);
    void drawRenderNode(RenderNode* renderNode);

    // TODO: rename for consistency
    void callDrawGLFunction(Functor* functor);
    virtual void drawLayer(DeferredLayerUpdater* layerHandle) override;
    virtual void drawRenderNode(RenderNode* renderNode) override;
    virtual void callDrawGLFunction(Functor* functor) override;

// ----------------------------------------------------------------------------
// CanvasStateClient interface
Loading