1021693b967a2c5556dddd183eb0247df4079e1adStan Iliev/*
2021693b967a2c5556dddd183eb0247df4079e1adStan Iliev * Copyright (C) 2016 The Android Open Source Project
3021693b967a2c5556dddd183eb0247df4079e1adStan Iliev *
4021693b967a2c5556dddd183eb0247df4079e1adStan Iliev * Licensed under the Apache License, Version 2.0 (the "License");
5021693b967a2c5556dddd183eb0247df4079e1adStan Iliev * you may not use this file except in compliance with the License.
6021693b967a2c5556dddd183eb0247df4079e1adStan Iliev * You may obtain a copy of the License at
7021693b967a2c5556dddd183eb0247df4079e1adStan Iliev *
8021693b967a2c5556dddd183eb0247df4079e1adStan Iliev *      http://www.apache.org/licenses/LICENSE-2.0
9021693b967a2c5556dddd183eb0247df4079e1adStan Iliev *
10021693b967a2c5556dddd183eb0247df4079e1adStan Iliev * Unless required by applicable law or agreed to in writing, software
11021693b967a2c5556dddd183eb0247df4079e1adStan Iliev * distributed under the License is distributed on an "AS IS" BASIS,
12021693b967a2c5556dddd183eb0247df4079e1adStan Iliev * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13021693b967a2c5556dddd183eb0247df4079e1adStan Iliev * See the License for the specific language governing permissions and
14021693b967a2c5556dddd183eb0247df4079e1adStan Iliev * limitations under the License.
15021693b967a2c5556dddd183eb0247df4079e1adStan Iliev */
16021693b967a2c5556dddd183eb0247df4079e1adStan Iliev#pragma once
17021693b967a2c5556dddd183eb0247df4079e1adStan Iliev
18021693b967a2c5556dddd183eb0247df4079e1adStan Iliev#include "SkiaCanvas.h"
19021693b967a2c5556dddd183eb0247df4079e1adStan Iliev#include "SkiaDisplayList.h"
20021693b967a2c5556dddd183eb0247df4079e1adStan Iliev#include "ReorderBarrierDrawables.h"
21021693b967a2c5556dddd183eb0247df4079e1adStan Iliev#include <SkLiteRecorder.h>
22021693b967a2c5556dddd183eb0247df4079e1adStan Iliev
23021693b967a2c5556dddd183eb0247df4079e1adStan Ilievnamespace android {
24021693b967a2c5556dddd183eb0247df4079e1adStan Ilievnamespace uirenderer {
25021693b967a2c5556dddd183eb0247df4079e1adStan Ilievnamespace skiapipeline {
26021693b967a2c5556dddd183eb0247df4079e1adStan Iliev
27021693b967a2c5556dddd183eb0247df4079e1adStan Iliev/**
28021693b967a2c5556dddd183eb0247df4079e1adStan Iliev * A SkiaCanvas implementation that records drawing operations for deferred rendering backed by a
29021693b967a2c5556dddd183eb0247df4079e1adStan Iliev * SkLiteRecorder and a SkiaDisplayList.
30021693b967a2c5556dddd183eb0247df4079e1adStan Iliev */
31021693b967a2c5556dddd183eb0247df4079e1adStan Ilievclass SkiaRecordingCanvas : public SkiaCanvas {
32021693b967a2c5556dddd183eb0247df4079e1adStan Iliev public:
33021693b967a2c5556dddd183eb0247df4079e1adStan Iliev    explicit SkiaRecordingCanvas(uirenderer::RenderNode* renderNode, int width, int height) {
34021693b967a2c5556dddd183eb0247df4079e1adStan Iliev        initDisplayList(renderNode, width, height);
35021693b967a2c5556dddd183eb0247df4079e1adStan Iliev    }
36021693b967a2c5556dddd183eb0247df4079e1adStan Iliev
37021693b967a2c5556dddd183eb0247df4079e1adStan Iliev    virtual void setBitmap(const SkBitmap& bitmap) override {
38021693b967a2c5556dddd183eb0247df4079e1adStan Iliev        LOG_ALWAYS_FATAL("DisplayListCanvas is not backed by a bitmap.");
39021693b967a2c5556dddd183eb0247df4079e1adStan Iliev    }
40021693b967a2c5556dddd183eb0247df4079e1adStan Iliev
41021693b967a2c5556dddd183eb0247df4079e1adStan Iliev    virtual void resetRecording(int width, int height,
42021693b967a2c5556dddd183eb0247df4079e1adStan Iliev            uirenderer::RenderNode* renderNode) override {
43021693b967a2c5556dddd183eb0247df4079e1adStan Iliev        initDisplayList(renderNode, width, height);
44021693b967a2c5556dddd183eb0247df4079e1adStan Iliev    }
45021693b967a2c5556dddd183eb0247df4079e1adStan Iliev
46021693b967a2c5556dddd183eb0247df4079e1adStan Iliev    virtual uirenderer::DisplayList* finishRecording() override;
47021693b967a2c5556dddd183eb0247df4079e1adStan Iliev
48021693b967a2c5556dddd183eb0247df4079e1adStan Iliev    virtual void drawBitmap(Bitmap& bitmap, float left, float top,
49021693b967a2c5556dddd183eb0247df4079e1adStan Iliev            const SkPaint* paint) override;
50021693b967a2c5556dddd183eb0247df4079e1adStan Iliev    virtual void drawBitmap(Bitmap& bitmap, const SkMatrix& matrix,
51021693b967a2c5556dddd183eb0247df4079e1adStan Iliev            const SkPaint* paint) override;
52021693b967a2c5556dddd183eb0247df4079e1adStan Iliev    virtual void drawBitmap(Bitmap& bitmap, float srcLeft, float srcTop,
53021693b967a2c5556dddd183eb0247df4079e1adStan Iliev            float srcRight, float srcBottom, float dstLeft, float dstTop,
54021693b967a2c5556dddd183eb0247df4079e1adStan Iliev            float dstRight, float dstBottom, const SkPaint* paint) override;
55021693b967a2c5556dddd183eb0247df4079e1adStan Iliev    virtual void drawNinePatch(Bitmap& hwuiBitmap, const android::Res_png_9patch& chunk,
56021693b967a2c5556dddd183eb0247df4079e1adStan Iliev            float dstLeft, float dstTop, float dstRight, float dstBottom,
57021693b967a2c5556dddd183eb0247df4079e1adStan Iliev            const SkPaint* paint) override;
58021693b967a2c5556dddd183eb0247df4079e1adStan Iliev
59021693b967a2c5556dddd183eb0247df4079e1adStan Iliev    virtual void drawRoundRect(uirenderer::CanvasPropertyPrimitive* left,
60021693b967a2c5556dddd183eb0247df4079e1adStan Iliev            uirenderer::CanvasPropertyPrimitive* top, uirenderer::CanvasPropertyPrimitive* right,
61021693b967a2c5556dddd183eb0247df4079e1adStan Iliev            uirenderer::CanvasPropertyPrimitive* bottom, uirenderer::CanvasPropertyPrimitive* rx,
62021693b967a2c5556dddd183eb0247df4079e1adStan Iliev            uirenderer::CanvasPropertyPrimitive* ry,
63021693b967a2c5556dddd183eb0247df4079e1adStan Iliev            uirenderer::CanvasPropertyPaint* paint) override;
64021693b967a2c5556dddd183eb0247df4079e1adStan Iliev    virtual void drawCircle(uirenderer::CanvasPropertyPrimitive* x,
65021693b967a2c5556dddd183eb0247df4079e1adStan Iliev            uirenderer::CanvasPropertyPrimitive* y, uirenderer::CanvasPropertyPrimitive* radius,
66021693b967a2c5556dddd183eb0247df4079e1adStan Iliev            uirenderer::CanvasPropertyPaint* paint) override;
67021693b967a2c5556dddd183eb0247df4079e1adStan Iliev
68021693b967a2c5556dddd183eb0247df4079e1adStan Iliev    virtual void drawVectorDrawable(VectorDrawableRoot* vectorDrawable) override;
69021693b967a2c5556dddd183eb0247df4079e1adStan Iliev
70021693b967a2c5556dddd183eb0247df4079e1adStan Iliev    virtual void insertReorderBarrier(bool enableReorder) override;
71021693b967a2c5556dddd183eb0247df4079e1adStan Iliev    virtual void drawLayer(uirenderer::DeferredLayerUpdater* layerHandle) override;
72021693b967a2c5556dddd183eb0247df4079e1adStan Iliev    virtual void drawRenderNode(uirenderer::RenderNode* renderNode) override;
73021693b967a2c5556dddd183eb0247df4079e1adStan Iliev    virtual void callDrawGLFunction(Functor* functor,
74021693b967a2c5556dddd183eb0247df4079e1adStan Iliev                                    uirenderer::GlFunctorLifecycleListener* listener) override;
75021693b967a2c5556dddd183eb0247df4079e1adStan Iliev
76021693b967a2c5556dddd183eb0247df4079e1adStan Ilievprivate:
77021693b967a2c5556dddd183eb0247df4079e1adStan Iliev    SkLiteRecorder mRecorder;
78021693b967a2c5556dddd183eb0247df4079e1adStan Iliev    std::unique_ptr<SkiaDisplayList> mDisplayList;
79021693b967a2c5556dddd183eb0247df4079e1adStan Iliev    StartReorderBarrierDrawable* mCurrentBarrier;
80021693b967a2c5556dddd183eb0247df4079e1adStan Iliev
81021693b967a2c5556dddd183eb0247df4079e1adStan Iliev    /**
82021693b967a2c5556dddd183eb0247df4079e1adStan Iliev     *  A new SkiaDisplayList is created or recycled if available.
83021693b967a2c5556dddd183eb0247df4079e1adStan Iliev     *
84021693b967a2c5556dddd183eb0247df4079e1adStan Iliev     *  @param renderNode is optional and used to recycle an old display list.
85021693b967a2c5556dddd183eb0247df4079e1adStan Iliev     *  @param width used to calculate recording bounds.
86021693b967a2c5556dddd183eb0247df4079e1adStan Iliev     *  @param height used to calculate recording bounds.
87021693b967a2c5556dddd183eb0247df4079e1adStan Iliev     */
88021693b967a2c5556dddd183eb0247df4079e1adStan Iliev    void initDisplayList(uirenderer::RenderNode* renderNode, int width, int height);
89021693b967a2c5556dddd183eb0247df4079e1adStan Iliev};
90021693b967a2c5556dddd183eb0247df4079e1adStan Iliev
91021693b967a2c5556dddd183eb0247df4079e1adStan Iliev}; // namespace skiapipeline
92021693b967a2c5556dddd183eb0247df4079e1adStan Iliev}; // namespace uirenderer
93021693b967a2c5556dddd183eb0247df4079e1adStan Iliev}; // namespace android
94