blob: bd5274c94e75e350b5c24e19226201936f4551b6 [file] [log] [blame]
Stan Iliev021693b2016-10-17 16:26:15 -04001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16#pragma once
17
John Reck8f45d4a2018-08-15 10:17:12 -070018#include "RecordingCanvas.h"
John Reck1bcacfd2017-11-03 10:12:19 -070019#include "ReorderBarrierDrawables.h"
Stan Iliev021693b2016-10-17 16:26:15 -040020#include "SkiaCanvas.h"
21#include "SkiaDisplayList.h"
Stan Iliev021693b2016-10-17 16:26:15 -040022
23namespace android {
24namespace uirenderer {
25namespace skiapipeline {
26
27/**
28 * A SkiaCanvas implementation that records drawing operations for deferred rendering backed by a
29 * SkLiteRecorder and a SkiaDisplayList.
30 */
31class SkiaRecordingCanvas : public SkiaCanvas {
John Reck1bcacfd2017-11-03 10:12:19 -070032public:
Stan Iliev021693b2016-10-17 16:26:15 -040033 explicit SkiaRecordingCanvas(uirenderer::RenderNode* renderNode, int width, int height) {
34 initDisplayList(renderNode, width, height);
35 }
36
37 virtual void setBitmap(const SkBitmap& bitmap) override {
38 LOG_ALWAYS_FATAL("DisplayListCanvas is not backed by a bitmap.");
39 }
40
41 virtual void resetRecording(int width, int height,
John Reck1bcacfd2017-11-03 10:12:19 -070042 uirenderer::RenderNode* renderNode) override {
Stan Iliev021693b2016-10-17 16:26:15 -040043 initDisplayList(renderNode, width, height);
44 }
45
46 virtual uirenderer::DisplayList* finishRecording() override;
47
Mike Reedc2dbc032019-07-25 12:28:29 -040048 virtual void drawBitmap(Bitmap& bitmap, float left, float top, const Paint* paint) override;
49 virtual void drawBitmap(Bitmap& bitmap, const SkMatrix& matrix, const Paint* paint) override;
John Reck1bcacfd2017-11-03 10:12:19 -070050 virtual void drawBitmap(Bitmap& bitmap, float srcLeft, float srcTop, float srcRight,
51 float srcBottom, float dstLeft, float dstTop, float dstRight,
Mike Reedc2dbc032019-07-25 12:28:29 -040052 float dstBottom, const Paint* paint) override;
Stan Iliev021693b2016-10-17 16:26:15 -040053 virtual void drawNinePatch(Bitmap& hwuiBitmap, const android::Res_png_9patch& chunk,
John Reck1bcacfd2017-11-03 10:12:19 -070054 float dstLeft, float dstTop, float dstRight, float dstBottom,
Mike Reedc2dbc032019-07-25 12:28:29 -040055 const Paint* paint) override;
Derek Sollenberger2d142132018-01-22 10:25:26 -050056 virtual double drawAnimatedImage(AnimatedImageDrawable* animatedImage) override;
Stan Iliev021693b2016-10-17 16:26:15 -040057
58 virtual void drawRoundRect(uirenderer::CanvasPropertyPrimitive* left,
John Reck1bcacfd2017-11-03 10:12:19 -070059 uirenderer::CanvasPropertyPrimitive* top,
60 uirenderer::CanvasPropertyPrimitive* right,
61 uirenderer::CanvasPropertyPrimitive* bottom,
62 uirenderer::CanvasPropertyPrimitive* rx,
63 uirenderer::CanvasPropertyPrimitive* ry,
64 uirenderer::CanvasPropertyPaint* paint) override;
Stan Iliev021693b2016-10-17 16:26:15 -040065 virtual void drawCircle(uirenderer::CanvasPropertyPrimitive* x,
John Reck1bcacfd2017-11-03 10:12:19 -070066 uirenderer::CanvasPropertyPrimitive* y,
67 uirenderer::CanvasPropertyPrimitive* radius,
68 uirenderer::CanvasPropertyPaint* paint) override;
Stan Iliev021693b2016-10-17 16:26:15 -040069
70 virtual void drawVectorDrawable(VectorDrawableRoot* vectorDrawable) override;
71
72 virtual void insertReorderBarrier(bool enableReorder) override;
73 virtual void drawLayer(uirenderer::DeferredLayerUpdater* layerHandle) override;
74 virtual void drawRenderNode(uirenderer::RenderNode* renderNode) override;
75 virtual void callDrawGLFunction(Functor* functor,
76 uirenderer::GlFunctorLifecycleListener* listener) override;
John Reck283bb462018-12-13 16:40:14 -080077 void drawWebViewFunctor(int functor) override;
Stan Iliev021693b2016-10-17 16:26:15 -040078
79private:
John Reck8f45d4a2018-08-15 10:17:12 -070080 RecordingCanvas mRecorder;
Stan Iliev021693b2016-10-17 16:26:15 -040081 std::unique_ptr<SkiaDisplayList> mDisplayList;
Stan Iliev021693b2016-10-17 16:26:15 -040082 StartReorderBarrierDrawable* mCurrentBarrier;
83
84 /**
85 * A new SkiaDisplayList is created or recycled if available.
86 *
87 * @param renderNode is optional and used to recycle an old display list.
88 * @param width used to calculate recording bounds.
89 * @param height used to calculate recording bounds.
90 */
91 void initDisplayList(uirenderer::RenderNode* renderNode, int width, int height);
Stan Ilievf9a461f2018-03-02 13:20:26 -050092
Nader Jawadf9f964d2019-05-24 10:33:55 -070093 PaintCoW&& filterBitmap(PaintCoW&& paint);
Stan Iliev021693b2016-10-17 16:26:15 -040094};
95
Chris Blume7b8a8082018-11-30 15:51:58 -080096} // namespace skiapipeline
97} // namespace uirenderer
98} // namespace android