SkiaCanvas.h revision fc9999505a36c66892d7ccce85187936105f4f36
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>
25c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger#include <SkClipStack.h>
26c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger#include <SkTArray.h>
27c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
28c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenbergernamespace android {
29c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
30c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger// Holds an SkCanvas reference plus additional native data.
31c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenbergerclass SkiaCanvas : public Canvas {
32c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenbergerpublic:
33c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    explicit SkiaCanvas(const SkBitmap& bitmap);
34c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
35c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    /**
36c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger     *  Create a new SkiaCanvas.
37c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger     *
38c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger     *  @param canvas SkCanvas to handle calls made to this SkiaCanvas. Must
39c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger     *      not be NULL. This constructor will ref() the SkCanvas, and unref()
40c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger     *      it in its destructor.
41c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger     */
42c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    explicit SkiaCanvas(SkCanvas* canvas) : mCanvas(canvas) {
43c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger        SkASSERT(canvas);
44c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger        canvas->ref();
45c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    }
46c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
47c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual SkCanvas* asSkCanvas() override {
48c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger        return mCanvas.get();
49c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    }
50c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
51c0e7a90f1f5f98e85dbeda021fac0dff79725933Stan Iliev    virtual void resetRecording(int width, int height,
52c0e7a90f1f5f98e85dbeda021fac0dff79725933Stan Iliev            uirenderer::RenderNode* renderNode) override {
53c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger        LOG_ALWAYS_FATAL("SkiaCanvas cannot be reset as a recording canvas");
54c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    }
55c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
56c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual uirenderer::DisplayList* finishRecording() override {
57c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger        LOG_ALWAYS_FATAL("SkiaCanvas does not produce a DisplayList");
58c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger        return nullptr;
59c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    }
60c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void insertReorderBarrier(bool enableReorder) override {
61c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger        LOG_ALWAYS_FATAL("SkiaCanvas does not support reordering barriers");
62c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    }
63c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
64c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void setBitmap(const SkBitmap& bitmap) override;
65c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
66c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual bool isOpaque() override;
67c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual int width() override;
68c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual int height() override;
69c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
70c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void setHighContrastText(bool highContrastText) override {
71c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger        mHighContrastText = highContrastText;
72c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    }
73c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual bool isHighContrastText() override { return mHighContrastText; }
74c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
75c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual int getSaveCount() const override;
76c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual int save(SaveFlags::Flags flags) override;
77c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void restore() override;
78c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void restoreToCount(int saveCount) override;
79c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
80c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual int saveLayer(float left, float top, float right, float bottom,
81c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger                const SkPaint* paint, SaveFlags::Flags flags) override;
82c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual int saveLayerAlpha(float left, float top, float right, float bottom,
83c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger            int alpha, SaveFlags::Flags flags) override;
84c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
85c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void getMatrix(SkMatrix* outMatrix) const override;
86c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void setMatrix(const SkMatrix& matrix) override;
87c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void concat(const SkMatrix& matrix) override;
88c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void rotate(float degrees) override;
89c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void scale(float sx, float sy) override;
90c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void skew(float sx, float sy) override;
91c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void translate(float dx, float dy) override;
92c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
93c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual bool getClipBounds(SkRect* outRect) const override;
94c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual bool quickRejectRect(float left, float top, float right, float bottom) const override;
95c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual bool quickRejectPath(const SkPath& path) const override;
96c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual bool clipRect(float left, float top, float right, float bottom,
97c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger            SkRegion::Op op) override;
98c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual bool clipPath(const SkPath* path, SkRegion::Op op) override;
99c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual bool clipRegion(const SkRegion* region, SkRegion::Op op) override;
100c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
101c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual SkDrawFilter* getDrawFilter() override;
102c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void setDrawFilter(SkDrawFilter* drawFilter) override;
103c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
104260ab726486317496bc12a57d599ea96dcde3284Mike Reed    virtual void drawColor(int color, SkBlendMode mode) override;
105c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void drawPaint(const SkPaint& paint) override;
106c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
107c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void drawPoint(float x, float y, const SkPaint& paint) override;
108c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void drawPoints(const float* points, int count, const SkPaint& paint) override;
109c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void drawLine(float startX, float startY, float stopX, float stopY,
110c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger            const SkPaint& paint) override;
111c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void drawLines(const float* points, int count, const SkPaint& paint) override;
112c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void drawRect(float left, float top, float right, float bottom,
113c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger            const SkPaint& paint) override;
114c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void drawRegion(const SkRegion& region, const SkPaint& paint) override;
115c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void drawRoundRect(float left, float top, float right, float bottom,
116c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger            float rx, float ry, const SkPaint& paint) override;
117c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void drawCircle(float x, float y, float radius, const SkPaint& paint) override;
118c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void drawOval(float left, float top, float right, float bottom,
119c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger            const SkPaint& paint) override;
120c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void drawArc(float left, float top, float right, float bottom,
121c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger            float startAngle, float sweepAngle, bool useCenter, const SkPaint& paint) override;
122c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void drawPath(const SkPath& path, const SkPaint& paint) override;
123c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void drawVertices(SkCanvas::VertexMode vertexMode, int vertexCount,
124c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger            const float* verts, const float* tex, const int* colors,
125c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger            const uint16_t* indices, int indexCount, const SkPaint& paint) override;
126c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
127aed7f58fb05a25ce2112829e77c0eb5dd268e8a7sergeyv    virtual void drawBitmap(Bitmap& bitmap, float left, float top, const SkPaint* paint) override;
128fc9999505a36c66892d7ccce85187936105f4f36sergeyv    virtual void drawBitmap(Bitmap& bitmap, const SkMatrix& matrix, const SkPaint* paint) override;
129fc9999505a36c66892d7ccce85187936105f4f36sergeyv    virtual void drawBitmap(Bitmap& bitmap, float srcLeft, float srcTop,
130c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger            float srcRight, float srcBottom, float dstLeft, float dstTop,
131c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger            float dstRight, float dstBottom, const SkPaint* paint) override;
132c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void drawBitmapMesh(const SkBitmap& bitmap, int meshWidth, int meshHeight,
133c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger            const float* vertices, const int* colors, const SkPaint* paint) override;
134c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void drawNinePatch(const SkBitmap& bitmap, const android::Res_png_9patch& chunk,
135c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger            float dstLeft, float dstTop, float dstRight, float dstBottom,
136c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger            const SkPaint* paint) override;
137c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
138c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual bool drawTextAbsolutePos() const  override { return true; }
139c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void drawVectorDrawable(VectorDrawableRoot* vectorDrawable) override;
140c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
141c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void drawRoundRect(uirenderer::CanvasPropertyPrimitive* left,
142c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger            uirenderer::CanvasPropertyPrimitive* top, uirenderer::CanvasPropertyPrimitive* right,
143c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger            uirenderer::CanvasPropertyPrimitive* bottom, uirenderer::CanvasPropertyPrimitive* rx,
144c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger            uirenderer::CanvasPropertyPrimitive* ry, uirenderer::CanvasPropertyPaint* paint) override;
145c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void drawCircle(uirenderer::CanvasPropertyPrimitive* x,
146c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger            uirenderer::CanvasPropertyPrimitive* y, uirenderer::CanvasPropertyPrimitive* radius,
147c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger            uirenderer::CanvasPropertyPaint* paint) override;
148c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
149c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void drawLayer(uirenderer::DeferredLayerUpdater* layerHandle) override;
150c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void drawRenderNode(uirenderer::RenderNode* renderNode) override;
151c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void callDrawGLFunction(Functor* functor,
152c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger            uirenderer::GlFunctorLifecycleListener* listener) override;
153c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
154c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenbergerprotected:
155c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    explicit SkiaCanvas() {}
156c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    void reset(SkCanvas* skiaCanvas);
157c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    void drawDrawable(SkDrawable* drawable) { mCanvas->drawDrawable(drawable); }
158c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
159c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    virtual void drawGlyphs(const uint16_t* text, const float* positions, int count,
160c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger            const SkPaint& paint, float x, float y,
161c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger            float boundsLeft, float boundsTop, float boundsRight, float boundsBottom,
162c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger            float totalAdvance) override;
163afc221499d943386256feb9db46c119ff834bf79Yuqian Li    virtual void drawLayoutOnPath(const minikin::Layout& layout, float hOffset, float vOffset,
164afc221499d943386256feb9db46c119ff834bf79Yuqian Li            const SkPaint& paint, const SkPath& path, size_t start, size_t end) override;
165c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
166c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenbergerprivate:
167c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    struct SaveRec {
168c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger        int              saveCount;
169c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger        SaveFlags::Flags saveFlags;
170c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    };
171c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
172c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    bool mHighContrastText = false;
173c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
174c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    void recordPartialSave(SaveFlags::Flags flags);
175c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    void saveClipsForFrame(SkTArray<SkClipStack::Element>& clips, int frameSaveCount);
176c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    void applyClips(const SkTArray<SkClipStack::Element>& clips);
177c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
178c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    void drawPoints(const float* points, int count, const SkPaint& paint,
179c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger            SkCanvas::PointMode mode);
180c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
181c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    sk_sp<SkCanvas> mCanvas;
182c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger    std::unique_ptr<SkDeque> mSaveStack; // lazily allocated, tracks partial saves.
183c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger};
184c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
185c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger} // namespace android
186c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger
187