SkiaCanvas.h revision 021693b967a2c5556dddd183eb0247df4079e1ad
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 38c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger * not be NULL. This constructor will ref() the SkCanvas, and unref() 39c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger * it in its destructor. 40c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger */ 41f50806afb8982acbab4510a8d04bbcf13a2bcd9eStan Iliev explicit SkiaCanvas(SkCanvas* canvas); 42c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger 43021693b967a2c5556dddd183eb0247df4079e1adStan Iliev virtual ~SkiaCanvas(); 44021693b967a2c5556dddd183eb0247df4079e1adStan Iliev 45c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger virtual SkCanvas* asSkCanvas() override { 46c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger return mCanvas.get(); 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, 95c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger SkRegion::Op op) override; 96c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger virtual bool clipPath(const SkPath* path, SkRegion::Op op) override; 97c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger virtual bool clipRegion(const SkRegion* region, SkRegion::Op 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> 177f50806afb8982acbab4510a8d04bbcf13a2bcd9eStan Iliev void recordClip(const T&, SkRegion::Op); 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 185f50806afb8982acbab4510a8d04bbcf13a2bcd9eStan Iliev sk_sp<SkCanvas> mCanvas; 186c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger std::unique_ptr<SkDeque> mSaveStack; // lazily allocated, tracks partial saves. 187f50806afb8982acbab4510a8d04bbcf13a2bcd9eStan Iliev std::vector<Clip> mClipStack; // tracks persistent clips. 188c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger}; 189c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger 190c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger} // namespace android 191c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger 192