SkiaCanvas.h revision aed7f58fb05a25ce2112829e77c0eb5dd268e8a7
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; 128c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger virtual void drawBitmap(const SkBitmap& bitmap, const SkMatrix& matrix, 129c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger const SkPaint* paint) override; 130c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger virtual void drawBitmap(const SkBitmap& bitmap, float srcLeft, float srcTop, 131c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger float srcRight, float srcBottom, float dstLeft, float dstTop, 132c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger float dstRight, float dstBottom, const SkPaint* paint) override; 133c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger virtual void drawBitmapMesh(const SkBitmap& bitmap, int meshWidth, int meshHeight, 134c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger const float* vertices, const int* colors, const SkPaint* paint) override; 135c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger virtual void drawNinePatch(const SkBitmap& bitmap, const android::Res_png_9patch& chunk, 136c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger float dstLeft, float dstTop, float dstRight, float dstBottom, 137c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger const SkPaint* paint) override; 138c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger 139c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger virtual bool drawTextAbsolutePos() const override { return true; } 140c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger virtual void drawVectorDrawable(VectorDrawableRoot* vectorDrawable) override; 141c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger 142c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger virtual void drawRoundRect(uirenderer::CanvasPropertyPrimitive* left, 143c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger uirenderer::CanvasPropertyPrimitive* top, uirenderer::CanvasPropertyPrimitive* right, 144c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger uirenderer::CanvasPropertyPrimitive* bottom, uirenderer::CanvasPropertyPrimitive* rx, 145c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger uirenderer::CanvasPropertyPrimitive* ry, uirenderer::CanvasPropertyPaint* paint) override; 146c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger virtual void drawCircle(uirenderer::CanvasPropertyPrimitive* x, 147c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger uirenderer::CanvasPropertyPrimitive* y, uirenderer::CanvasPropertyPrimitive* radius, 148c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger uirenderer::CanvasPropertyPaint* paint) override; 149c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger 150c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger virtual void drawLayer(uirenderer::DeferredLayerUpdater* layerHandle) override; 151c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger virtual void drawRenderNode(uirenderer::RenderNode* renderNode) override; 152c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger virtual void callDrawGLFunction(Functor* functor, 153c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger uirenderer::GlFunctorLifecycleListener* listener) override; 154c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger 155c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenbergerprotected: 156c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger explicit SkiaCanvas() {} 157c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger void reset(SkCanvas* skiaCanvas); 158c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger void drawDrawable(SkDrawable* drawable) { mCanvas->drawDrawable(drawable); } 159c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger 160c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger virtual void drawGlyphs(const uint16_t* text, const float* positions, int count, 161c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger const SkPaint& paint, float x, float y, 162c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger float boundsLeft, float boundsTop, float boundsRight, float boundsBottom, 163c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger float totalAdvance) override; 164afc221499d943386256feb9db46c119ff834bf79Yuqian Li virtual void drawLayoutOnPath(const minikin::Layout& layout, float hOffset, float vOffset, 165afc221499d943386256feb9db46c119ff834bf79Yuqian Li const SkPaint& paint, const SkPath& path, size_t start, size_t end) override; 166c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger 167c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenbergerprivate: 168c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger struct SaveRec { 169c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger int saveCount; 170c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger SaveFlags::Flags saveFlags; 171c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger }; 172c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger 173c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger bool mHighContrastText = false; 174c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger 175c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger void recordPartialSave(SaveFlags::Flags flags); 176c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger void saveClipsForFrame(SkTArray<SkClipStack::Element>& clips, int frameSaveCount); 177c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger void applyClips(const SkTArray<SkClipStack::Element>& clips); 178c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger 179c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger void drawPoints(const float* points, int count, const SkPaint& paint, 180c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger SkCanvas::PointMode mode); 181c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger 182c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger sk_sp<SkCanvas> mCanvas; 183c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger std::unique_ptr<SkDeque> mSaveStack; // lazily allocated, tracks partial saves. 184c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger}; 185c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger 186c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger} // namespace android 187c190813b938ecf28d9e76b07098e9637ced8808eDerek Sollenberger 188