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