SkiaCanvas.h revision 6e49c9f007c879f05b035c40c0ba543c00f9d0d0
1c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger/*
2c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger * Copyright (C) 2016 The Android Open Source Project
3c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger *
4c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger * Licensed under the Apache License, Version 2.0 (the "License");
5c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger * you may not use this file except in compliance with the License.
6c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger * You may obtain a copy of the License at
7c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger *
8c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger *      http://www.apache.org/licenses/LICENSE-2.0
9c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger *
10c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger * Unless required by applicable law or agreed to in writing, software
11c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger * distributed under the License is distributed on an "AS IS" BASIS,
12c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger * See the License for the specific language governing permissions and
14c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger * limitations under the License.
15c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger */
16c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger#pragma once
17c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
18c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger#include "hwui/Canvas.h"
19c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger#include "CanvasProperty.h"
20c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger#include "DeferredLayerUpdater.h"
21c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger#include "RenderNode.h"
22c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger#include "VectorDrawable.h"
23c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
24c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger#include <SkCanvas.h>
25f50806afb8982acbab4510a8d04bbcf13a2bcd9eStan Iliev#include <SkTLazy.h>
26c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
27c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenbergernamespace android {
28c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
29c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger// Holds an SkCanvas reference plus additional native data.
30c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenbergerclass SkiaCanvas : public Canvas {
31c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenbergerpublic:
32c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    explicit SkiaCanvas(const SkBitmap& bitmap);
33c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
34c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    /**
35c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger     *  Create a new SkiaCanvas.
36c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger     *
37c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger     *  @param canvas SkCanvas to handle calls made to this SkiaCanvas. Must
386acfe16b5650446dbdcce3bd779b52fb6533a41eMike Reed     *      not be NULL. This constructor does not take ownership, so the caller
396acfe16b5650446dbdcce3bd779b52fb6533a41eMike Reed     *      must guarantee that it remains valid while the SkiaCanvas is valid.
40c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger     */
41f50806afb8982acbab4510a8d04bbcf13a2bcd9eStan Iliev    explicit SkiaCanvas(SkCanvas* canvas);
42c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
43021693b967a2c5556dddd183eb0247df4079e1adStan Iliev    virtual ~SkiaCanvas();
44021693b967a2c5556dddd183eb0247df4079e1adStan Iliev
45c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual SkCanvas* asSkCanvas() override {
466acfe16b5650446dbdcce3bd779b52fb6533a41eMike Reed        return mCanvas;
47c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    }
48c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
49c0e7a90f1f5f98e85dbeda021fac0dff79725933Stan Iliev    virtual void resetRecording(int width, int height,
50c0e7a90f1f5f98e85dbeda021fac0dff79725933Stan Iliev            uirenderer::RenderNode* renderNode) override {
51c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger        LOG_ALWAYS_FATAL("SkiaCanvas cannot be reset as a recording canvas");
52c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    }
53c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
54c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual uirenderer::DisplayList* finishRecording() override {
55c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger        LOG_ALWAYS_FATAL("SkiaCanvas does not produce a DisplayList");
56c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger        return nullptr;
57c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    }
58c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void insertReorderBarrier(bool enableReorder) override {
59c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger        LOG_ALWAYS_FATAL("SkiaCanvas does not support reordering barriers");
60c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    }
61c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
62c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void setBitmap(const SkBitmap& bitmap) override;
63c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
64c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual bool isOpaque() override;
65c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual int width() override;
66c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual int height() override;
67c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
68c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void setHighContrastText(bool highContrastText) override {
69c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger        mHighContrastText = highContrastText;
70c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    }
71c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual bool isHighContrastText() override { return mHighContrastText; }
72c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
73c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual int getSaveCount() const override;
74c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual int save(SaveFlags::Flags flags) override;
75c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void restore() override;
76c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void restoreToCount(int saveCount) override;
77c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
78c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual int saveLayer(float left, float top, float right, float bottom,
79c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger                const SkPaint* paint, SaveFlags::Flags flags) override;
80c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual int saveLayerAlpha(float left, float top, float right, float bottom,
81c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger            int alpha, SaveFlags::Flags flags) override;
82c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
83c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void getMatrix(SkMatrix* outMatrix) const override;
84c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void setMatrix(const SkMatrix& matrix) override;
85c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void concat(const SkMatrix& matrix) override;
86c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void rotate(float degrees) override;
87c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void scale(float sx, float sy) override;
88c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void skew(float sx, float sy) override;
89c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void translate(float dx, float dy) override;
90c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
91c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual bool getClipBounds(SkRect* outRect) const override;
92c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual bool quickRejectRect(float left, float top, float right, float bottom) const override;
93c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual bool quickRejectPath(const SkPath& path) const override;
94c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual bool clipRect(float left, float top, float right, float bottom,
956e49c9f007c879f05b035c40c0ba543c00f9d0d0Mike Reed            SkClipOp op) override;
966e49c9f007c879f05b035c40c0ba543c00f9d0d0Mike Reed    virtual bool clipPath(const SkPath* path, SkClipOp op) override;
976e49c9f007c879f05b035c40c0ba543c00f9d0d0Mike Reed    virtual bool clipRegion(const SkRegion* region, SkClipOp op) override;
98c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
99c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual SkDrawFilter* getDrawFilter() override;
100c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void setDrawFilter(SkDrawFilter* drawFilter) override;
101c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
102260ab726486317496bc12a57d599ea96dcde3284Mike Reed    virtual void drawColor(int color, SkBlendMode mode) override;
103c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void drawPaint(const SkPaint& paint) override;
104c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
105c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void drawPoint(float x, float y, const SkPaint& paint) override;
106c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void drawPoints(const float* points, int count, const SkPaint& paint) override;
107c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void drawLine(float startX, float startY, float stopX, float stopY,
108c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger            const SkPaint& paint) override;
109c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void drawLines(const float* points, int count, const SkPaint& paint) override;
110c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void drawRect(float left, float top, float right, float bottom,
111c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger            const SkPaint& paint) override;
112c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void drawRegion(const SkRegion& region, const SkPaint& paint) override;
113c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void drawRoundRect(float left, float top, float right, float bottom,
114c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger            float rx, float ry, const SkPaint& paint) override;
115c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void drawCircle(float x, float y, float radius, const SkPaint& paint) override;
116c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void drawOval(float left, float top, float right, float bottom,
117c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger            const SkPaint& paint) override;
118c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void drawArc(float left, float top, float right, float bottom,
119c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger            float startAngle, float sweepAngle, bool useCenter, const SkPaint& paint) override;
120c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void drawPath(const SkPath& path, const SkPaint& paint) override;
121c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void drawVertices(SkCanvas::VertexMode vertexMode, int vertexCount,
122c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger            const float* verts, const float* tex, const int* colors,
123c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger            const uint16_t* indices, int indexCount, const SkPaint& paint) override;
124c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
125aed7f58fb05a25ce2112829e77c0eb5dd268e8a7sergeyv    virtual void drawBitmap(Bitmap& bitmap, float left, float top, const SkPaint* paint) override;
126fc9999505a36c66892d7ccce85187936105f4f36sergeyv    virtual void drawBitmap(Bitmap& bitmap, const SkMatrix& matrix, const SkPaint* paint) override;
127fc9999505a36c66892d7ccce85187936105f4f36sergeyv    virtual void drawBitmap(Bitmap& bitmap, float srcLeft, float srcTop,
128c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger            float srcRight, float srcBottom, float dstLeft, float dstTop,
129c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger            float dstRight, float dstBottom, const SkPaint* paint) override;
1305fd2a1cb2726afa7d40fe4750e9defd89c24ed37sergeyv    virtual void drawBitmapMesh(Bitmap& bitmap, int meshWidth, int meshHeight,
131c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger            const float* vertices, const int* colors, const SkPaint* paint) override;
1325fd2a1cb2726afa7d40fe4750e9defd89c24ed37sergeyv    virtual void drawNinePatch(Bitmap& bitmap, const android::Res_png_9patch& chunk,
133c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger            float dstLeft, float dstTop, float dstRight, float dstBottom,
134c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger            const SkPaint* paint) override;
135c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
136c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual bool drawTextAbsolutePos() const  override { return true; }
137c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void drawVectorDrawable(VectorDrawableRoot* vectorDrawable) override;
138c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
139c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void drawRoundRect(uirenderer::CanvasPropertyPrimitive* left,
140c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger            uirenderer::CanvasPropertyPrimitive* top, uirenderer::CanvasPropertyPrimitive* right,
141c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger            uirenderer::CanvasPropertyPrimitive* bottom, uirenderer::CanvasPropertyPrimitive* rx,
142c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger            uirenderer::CanvasPropertyPrimitive* ry, uirenderer::CanvasPropertyPaint* paint) override;
143c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void drawCircle(uirenderer::CanvasPropertyPrimitive* x,
144c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger            uirenderer::CanvasPropertyPrimitive* y, uirenderer::CanvasPropertyPrimitive* radius,
145c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger            uirenderer::CanvasPropertyPaint* paint) override;
146c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
147c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void drawLayer(uirenderer::DeferredLayerUpdater* layerHandle) override;
148c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void drawRenderNode(uirenderer::RenderNode* renderNode) override;
149c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void callDrawGLFunction(Functor* functor,
150c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger            uirenderer::GlFunctorLifecycleListener* listener) override;
151c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
152c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenbergerprotected:
153f50806afb8982acbab4510a8d04bbcf13a2bcd9eStan Iliev    SkiaCanvas();
154c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    void reset(SkCanvas* skiaCanvas);
155c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    void drawDrawable(SkDrawable* drawable) { mCanvas->drawDrawable(drawable); }
156c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
157c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void drawGlyphs(const uint16_t* text, const float* positions, int count,
158c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger            const SkPaint& paint, float x, float y,
159c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger            float boundsLeft, float boundsTop, float boundsRight, float boundsBottom,
160c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger            float totalAdvance) override;
161afc221499d943386256feb9db46c119ff834bf79Yuqian Li    virtual void drawLayoutOnPath(const minikin::Layout& layout, float hOffset, float vOffset,
162afc221499d943386256feb9db46c119ff834bf79Yuqian Li            const SkPaint& paint, const SkPath& path, size_t start, size_t end) override;
163c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
164c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenbergerprivate:
165c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    struct SaveRec {
166c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger        int              saveCount;
167c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger        SaveFlags::Flags saveFlags;
168f50806afb8982acbab4510a8d04bbcf13a2bcd9eStan Iliev        size_t           clipIndex;
169c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    };
170c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
171c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    bool mHighContrastText = false;
172c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
173f50806afb8982acbab4510a8d04bbcf13a2bcd9eStan Iliev    const SaveRec* currentSaveRec() const;
174c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    void recordPartialSave(SaveFlags::Flags flags);
175f50806afb8982acbab4510a8d04bbcf13a2bcd9eStan Iliev
176f50806afb8982acbab4510a8d04bbcf13a2bcd9eStan Iliev    template<typename T>
1776e49c9f007c879f05b035c40c0ba543c00f9d0d0Mike Reed    void recordClip(const T&, SkClipOp);
178f50806afb8982acbab4510a8d04bbcf13a2bcd9eStan Iliev    void applyPersistentClips(size_t clipStartIndex);
179c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
180c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    void drawPoints(const float* points, int count, const SkPaint& paint,
181c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger            SkCanvas::PointMode mode);
182c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
183f50806afb8982acbab4510a8d04bbcf13a2bcd9eStan Iliev    class Clip;
184f50806afb8982acbab4510a8d04bbcf13a2bcd9eStan Iliev
1856acfe16b5650446dbdcce3bd779b52fb6533a41eMike Reed    std::unique_ptr<SkCanvas> mCanvasOwned; // might own a canvas we allocated
1866acfe16b5650446dbdcce3bd779b52fb6533a41eMike Reed    SkCanvas*                 mCanvas;    // we do NOT own this canvas, it must survive us
1876acfe16b5650446dbdcce3bd779b52fb6533a41eMike Reed                                          // unless it is the same as mCanvasOwned.get()
188c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    std::unique_ptr<SkDeque> mSaveStack; // lazily allocated, tracks partial saves.
189f50806afb8982acbab4510a8d04bbcf13a2bcd9eStan Iliev    std::vector<Clip>        mClipStack; // tracks persistent clips.
190c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger};
191c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
192c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger} // namespace android
193c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
194