1cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger/* 2cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger * Copyright (C) 2014 The Android Open Source Project 3cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger * 4cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger * Licensed under the Apache License, Version 2.0 (the "License"); 5cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger * you may not use this file except in compliance with the License. 6cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger * You may obtain a copy of the License at 7cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger * 8cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger * http://www.apache.org/licenses/LICENSE-2.0 9cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger * 10cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger * Unless required by applicable law or agreed to in writing, software 11cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger * distributed under the License is distributed on an "AS IS" BASIS, 12cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger * See the License for the specific language governing permissions and 14cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger * limitations under the License. 15cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger */ 16cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger 17cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger#ifndef ANDROID_GRAPHICS_CANVAS_H 18cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger#define ANDROID_GRAPHICS_CANVAS_H 19cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger 20cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger#include "SkBitmap.h" 21cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger#include "SkCanvas.h" 22cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger#include "SkMatrix.h" 23cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger 24cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenbergernamespace android { 25cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger 26cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenbergerclass Canvas { 27cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenbergerpublic: 28cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger virtual ~Canvas() {}; 29cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger 30cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger static Canvas* create_canvas(SkBitmap* bitmap); 31cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger static Canvas* create_canvas(SkCanvas* skiaCanvas); 32cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger 33cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger // TODO: enable HWUI to either create similar canvas wrapper or subclass 34cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger // directly from Canvas 35cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger //static Canvas* create_canvas(uirenderer::Renderer* renderer); 36cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger 37cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger // TODO: this is a temporary affordance until all necessary logic can be 38cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger // moved within this interface! Further, the return value should 39cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger // NOT be unref'd and is valid until this canvas is destroyed or a 40cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger // new bitmap is set. 41cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger virtual SkCanvas* getSkCanvas() = 0; 42cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger 43cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger virtual void setBitmap(SkBitmap* bitmap, bool copyState) = 0; 44cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger 45cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger virtual bool isOpaque() = 0; 46cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger virtual int width() = 0; 47cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger virtual int height() = 0; 48cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger 49cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger// ---------------------------------------------------------------------------- 50cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger// Canvas state operations 51cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger// ---------------------------------------------------------------------------- 52cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger // Save (layer) 53cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger virtual int getSaveCount() const = 0; 54cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger virtual int save(SkCanvas::SaveFlags flags) = 0; 55cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger virtual void restore() = 0; 56cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger virtual void restoreToCount(int saveCount) = 0; 57cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger 58cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger virtual int saveLayer(float left, float top, float right, float bottom, 59cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger const SkPaint* paint, SkCanvas::SaveFlags flags) = 0; 60cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger virtual int saveLayerAlpha(float left, float top, float right, float bottom, 61cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger int alpha, SkCanvas::SaveFlags flags) = 0; 62cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger 63cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger // Matrix 64cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger virtual void getMatrix(SkMatrix* outMatrix) const = 0; 65cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger virtual void setMatrix(const SkMatrix& matrix) = 0; 66cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger 67cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger virtual void concat(const SkMatrix& matrix) = 0; 68cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger virtual void rotate(float degrees) = 0; 69cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger virtual void scale(float sx, float sy) = 0; 70cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger virtual void skew(float sx, float sy) = 0; 71cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger virtual void translate(float dx, float dy) = 0; 72cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger 73cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger // clip 74cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger virtual bool getClipBounds(SkRect* outRect) const = 0; 75cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger virtual bool quickRejectRect(float left, float top, float right, float bottom) const = 0; 76cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger virtual bool quickRejectPath(const SkPath& path) const = 0; 77cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger 78cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger virtual bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op) = 0; 79cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger virtual bool clipPath(const SkPath* path, SkRegion::Op op) = 0; 80cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger virtual bool clipRegion(const SkRegion* region, SkRegion::Op op) = 0; 81cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger 82cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger // filters 83cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger virtual SkDrawFilter* getDrawFilter() = 0; 84cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger virtual void setDrawFilter(SkDrawFilter* drawFilter) = 0; 85cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger 86cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger// ---------------------------------------------------------------------------- 87cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger// Canvas draw operations 88cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger// ---------------------------------------------------------------------------- 89cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger virtual void drawColor(int color, SkXfermode::Mode mode) = 0; 90cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger virtual void drawPaint(const SkPaint& paint) = 0; 91cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger 92cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger // Geometry 93cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger virtual void drawPoint(float x, float y, const SkPaint& paint) = 0; 94cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger virtual void drawPoints(const float* points, int count, const SkPaint& paint) = 0; 95cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger virtual void drawLine(float startX, float startY, float stopX, float stopY, 96cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger const SkPaint& paint) = 0; 97cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger virtual void drawLines(const float* points, int count, const SkPaint& paint) = 0; 98cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger virtual void drawRect(float left, float top, float right, float bottom, 99cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger const SkPaint& paint) = 0; 100cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger virtual void drawRoundRect(float left, float top, float right, float bottom, 101cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger float rx, float ry, const SkPaint& paint) = 0; 102cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger virtual void drawCircle(float x, float y, float radius, const SkPaint& paint) = 0; 103cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger virtual void drawOval(float left, float top, float right, float bottom, 104cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger const SkPaint& paint) = 0; 105cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger virtual void drawArc(float left, float top, float right, float bottom, 106cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger float startAngle, float sweepAngle, bool useCenter, const SkPaint& paint) = 0; 107cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger virtual void drawPath(const SkPath& path, const SkPaint& paint) = 0; 108cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger virtual void drawVertices(SkCanvas::VertexMode vertexMode, int vertexCount, 109cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger const float* verts, const float* tex, const int* colors, 110cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger const uint16_t* indices, int indexCount, const SkPaint& paint) = 0; 111cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger 112cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger // Bitmap-based 113cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger virtual void drawBitmap(const SkBitmap& bitmap, float left, float top, 114cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger const SkPaint* paint) = 0; 115cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger virtual void drawBitmap(const SkBitmap& bitmap, const SkMatrix& matrix, 116cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger const SkPaint* paint) = 0; 117cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger virtual void drawBitmap(const SkBitmap& bitmap, float srcLeft, float srcTop, 118cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger float srcRight, float srcBottom, float dstLeft, float dstTop, 119cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger float dstRight, float dstBottom, const SkPaint* paint) = 0; 120cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger virtual void drawBitmapMesh(const SkBitmap& bitmap, int meshWidth, int meshHeight, 121cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger const float* vertices, const int* colors, const SkPaint* paint) = 0; 122cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger 123cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger // Text 124cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger virtual void drawText(const uint16_t* text, const float* positions, int count, 125cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger const SkPaint& paint, float x, float y, 126cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger float boundsLeft, float boundsTop, float boundsRight, float boundsBottom) = 0; 127cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger virtual void drawPosText(const uint16_t* text, const float* positions, int count, 128cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger int posCount, const SkPaint& paint) = 0; 129cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger virtual void drawTextOnPath(const uint16_t* glyphs, int count, const SkPath& path, 130cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger float hOffset, float vOffset, const SkPaint& paint) = 0; 131cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger 132cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger /* 133cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger * Specifies if the positions passed to ::drawText are absolute or relative 134cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger * to the (x,y) value provided. 135cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger * 136cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger * If true the (x,y) values are ignored. Otherwise, those (x,y) values need 137cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger * to be added to each glyph's position to get its absolute position. 138cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger */ 139cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger virtual bool drawTextAbsolutePos() const = 0; 140cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger}; 141cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger 142cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger}; // namespace android 143cae05e0b4c4726236487bdd7c23b82e93f85fd23Derek Sollenberger#endif // ANDROID_GRAPHICS_CANVAS_H 144