VectorDrawable.h revision 4bbc2931263b232fba61807fca00e127573eff42
10826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams/* 2ec6f200cd8a882458c57a63e1740731f0563cbccStephen Hines * Copyright (C) 2015 The Android Open Source Project 30826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams * 40826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 50826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams * you may not use this file except in compliance with the License. 60826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams * You may obtain a copy of the License at 70826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams * 80826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams * http://www.apache.org/licenses/LICENSE-2.0 90826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams * 100826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams * Unless required by applicable law or agreed to in writing, software 110826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams * distributed under the License is distributed on an "AS IS" BASIS, 120826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams * See the License for the specific language governing permissions and 140826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams * limitations under the License. 150826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams */ 160826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 170826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams#ifndef ANDROID_HWUI_VPATH_H 180826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams#define ANDROID_HWUI_VPATH_H 190826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 200826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams#include "Canvas.h" 210826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams#include <SkBitmap.h> 229c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines#include <SkColor.h> 23c11e25c4e653124def1fb18e203b894f42106cbeTim Murray#include <SkMatrix.h> 24e29d471e5ca9781d8772d445ec7832e94856fd14Jason Sams#include <SkPaint.h> 25e29d471e5ca9781d8772d445ec7832e94856fd14Jason Sams#include <SkPath.h> 2625430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams#include <SkPathMeasure.h> 270826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams#include <SkRect.h> 289c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines 29ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk#include <cutils/compiler.h> 30ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk#include <stddef.h> 3125430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams#include <vector> 320826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams#include <string> 330826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 340826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Samsnamespace android { 350826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Samsnamespace uirenderer { 369c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines 37ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouknamespace VectorDrawable { 38ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk#define VD_SET_PROP_WITH_FLAG(field, value, flag) (VD_SET_PROP(field, value) ? (flag = true, true): false); 39ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk#define VD_SET_PROP(field, value) (value != field ? (field = value, true) : false) 40ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk 41ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk/* A VectorDrawable is composed of a tree of nodes. 42ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Each node can be a group node, or a path. 43e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk * A group node can have groups or paths as children, but a path node has 44e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk * no children. 45e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk * One example can be: 46e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk * Root Group 47e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk * / | \ 489c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines * Group Path Group 49ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * / \ | 50ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Path Path Path 51ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 52ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 53ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchoukclass ANDROID_API Node { 54e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchoukpublic: 55e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk Node(const Node& node) { 56e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk mName = node.mName; 57e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk } 589c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines Node() {} 59ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk virtual void draw(Canvas* outCanvas, const SkMatrix& currentMatrix, 60ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk float scaleX, float scaleY) = 0; 61ec6f200cd8a882458c57a63e1740731f0563cbccStephen Hines virtual void dump() = 0; 62ec6f200cd8a882458c57a63e1740731f0563cbccStephen Hines void setName(const char* name) { 63ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk mName = name; 64ec6f200cd8a882458c57a63e1740731f0563cbccStephen Hines } 65ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk virtual ~Node(){} 66ec6f200cd8a882458c57a63e1740731f0563cbccStephen Hinesprotected: 67ec6f200cd8a882458c57a63e1740731f0563cbccStephen Hines std::string mName; 680826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams}; 690826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 709c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hinesclass ANDROID_API Path : public Node { 71ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchoukpublic: 72ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk struct ANDROID_API Data { 73ec6f200cd8a882458c57a63e1740731f0563cbccStephen Hines std::vector<char> verbs; 74ec6f200cd8a882458c57a63e1740731f0563cbccStephen Hines std::vector<size_t> verbSizes; 75ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk std::vector<float> points; 76ec6f200cd8a882458c57a63e1740731f0563cbccStephen Hines bool operator==(const Data& data) const { 77ec6f200cd8a882458c57a63e1740731f0563cbccStephen Hines return verbs == data.verbs && verbSizes == data.verbSizes 780826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams && points == data.points; 790826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 809c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines }; 81ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk Path(const Data& nodes); 82ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk Path(const Path& path); 830826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams Path(const char* path, size_t strLength); 840826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams Path() {} 850826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams void dump() override; 860826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams bool canMorph(const Data& path); 870826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams bool canMorph(const Path& path); 880826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams void draw(Canvas* outCanvas, const SkMatrix& groupStackedMatrix, 890826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams float scaleX, float scaleY) override; 900826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams void setPath(const char* path, size_t strLength); 910826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams void setPathData(const Data& data); 920826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams static float getMatrixScale(const SkMatrix& groupStackedMatrix); 9325430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 940826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Samsprotected: 950826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams virtual const SkPath& getUpdatedPath(); 960826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams virtual void drawPath(Canvas *outCanvas, const SkPath& renderPath, 970826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams float strokeScale) = 0; 980826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams Data mData; 990826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams SkPath mSkPath; 1000826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams bool mSkPathDirty = true; 1010826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams}; 1020826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 1030826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Samsclass ANDROID_API FullPath: public Path { 1040826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Samspublic: 1059c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines FullPath(const FullPath& path); // for cloning 106ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk FullPath(const char* path, size_t strLength) : Path(path, strLength) {} 107ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk FullPath() : Path() {} 108ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk FullPath(const Data& nodes) : Path(nodes) {} 109ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk 11025430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams void updateProperties(float strokeWidth, SkColor strokeColor, 111b3b89f63af148031817c046ba8023b76241c1e7cAlex Sakhartchouk float strokeAlpha, SkColor fillColor, float fillAlpha, 1120826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams float trimPathStart, float trimPathEnd, float trimPathOffset, 1130826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams float strokeMiterLimit, int strokeLineCap, int strokeLineJoin); 1149c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines float getStrokeWidth() { 1158fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams return mStrokeWidth; 1168fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams } 1178fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams void setStrokeWidth(float strokeWidth) { 1188fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams mStrokeWidth = strokeWidth; 1198fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams } 1208fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams SkColor getStrokeColor() { 1218fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams return mStrokeColor; 1228fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams } 1238fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams void setStrokeColor(SkColor strokeColor) { 1248fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams mStrokeColor = strokeColor; 1258fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams } 1268fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams float getStrokeAlpha() { 1278fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams return mStrokeAlpha; 1288fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams } 1298fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams void setStrokeAlpha(float strokeAlpha) { 1308fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams mStrokeAlpha = strokeAlpha; 1318fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams } 1328fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams SkColor getFillColor() { 1338fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams return mFillColor; 1348fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams } 1358fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams void setFillColor(SkColor fillColor) { 1368fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams mFillColor = fillColor; 1378fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams } 1388fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams float getFillAlpha() { 1398fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams return mFillAlpha; 1408fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams } 1418fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams void setFillAlpha(float fillAlpha) { 1428fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams mFillAlpha = fillAlpha; 143ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk } 144ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk float getTrimPathStart() { 145ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk return mTrimPathStart; 146ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk } 147ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk void setTrimPathStart(float trimPathStart) { 148ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk VD_SET_PROP_WITH_FLAG(mTrimPathStart, trimPathStart, mTrimDirty); 149ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk } 150ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk float getTrimPathEnd() { 1510826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams return mTrimPathEnd; 1520826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 1530826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams void setTrimPathEnd(float trimPathEnd) { 1540826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams VD_SET_PROP_WITH_FLAG(mTrimPathEnd, trimPathEnd, mTrimDirty); 1550826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 1560826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams float getTrimPathOffset() { 1570826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams return mTrimPathOffset; 1580826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 1590826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams void setTrimPathOffset(float trimPathOffset) { 1600826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams VD_SET_PROP_WITH_FLAG(mTrimPathOffset, trimPathOffset, mTrimDirty); 1610826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 1620826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams bool getProperties(int8_t* outProperties, int length); 16325430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 1640826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Samsprotected: 1650826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams const SkPath& getUpdatedPath() override; 1660826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams void drawPath(Canvas* outCanvas, const SkPath& renderPath, 1670826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams float strokeScale) override; 1680826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 1690826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Samsprivate: 1700826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams // Applies trimming to the specified path. 1710826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams void applyTrim(); 1720826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams float mStrokeWidth = 0; 1730826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams SkColor mStrokeColor = SK_ColorTRANSPARENT; 1740826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams float mStrokeAlpha = 1; 1750826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams SkColor mFillColor = SK_ColorTRANSPARENT; 1760826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams float mFillAlpha = 1; 17725430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams float mTrimPathStart = 0; 1780826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams float mTrimPathEnd = 1; 1790826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams float mTrimPathOffset = 0; 1800826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams bool mTrimDirty = true; 1810826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams SkPaint::Cap mStrokeLineCap = SkPaint::Cap::kButt_Cap; 1820826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams SkPaint::Join mStrokeLineJoin = SkPaint::Join::kMiter_Join; 1830826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams float mStrokeMiterLimit = 4; 1840826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams SkPath mTrimmedSkPath; 1850826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams SkPaint mPaint; 1860826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams}; 1870826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 1880826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Samsclass ANDROID_API ClipPath: public Path { 1899c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hinespublic: 190ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk ClipPath(const ClipPath& path) : Path(path) {} 191ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk ClipPath(const char* path, size_t strLength) : Path(path, strLength) {} 192ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk ClipPath() : Path() {} 193ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk ClipPath(const Data& nodes) : Path(nodes) {} 194ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk 195ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchoukprotected: 1960826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams void drawPath(Canvas* outCanvas, const SkPath& renderPath, 1970826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams float strokeScale) override; 1980826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams}; 1990826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 2000826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Samsclass ANDROID_API Group: public Node { 2010826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Samspublic: 20225430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams Group(const Group& group); 2039c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines Group() {} 204ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk float getRotation() { 205ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk return mRotate; 206ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk } 207ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk void setRotation(float rotation) { 208ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk mRotate = rotation; 209ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk } 210ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk float getPivotX() { 2110826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams return mPivotX; 2120826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 2130826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams void setPivotX(float pivotX) { 2140826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mPivotX = pivotX; 2150826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 2160826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams float getPivotY() { 2170826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams return mPivotY; 2189c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines } 219ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk void setPivotY(float pivotY) { 220ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk mPivotY = pivotY; 221ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk } 222ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk float getScaleX() { 223ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk return mScaleX; 224ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk } 22525430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams void setScaleX(float scaleX) { 2260826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mScaleX = scaleX; 2270826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 2280826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams float getScaleY() { 2290826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams return mScaleY; 2300826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 2310826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams void setScaleY(float scaleY) { 2320826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mScaleY = scaleY; 2330826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 2340826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams float getTranslateX() { 2350826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams return mTranslateX; 2360826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 2370826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams void setTranslateX(float translateX) { 2380826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mTranslateX = translateX; 2390826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 2400826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams float getTranslateY() { 2410826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams return mTranslateY; 2420826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 2430826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams void setTranslateY(float translateY) { 2440826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mTranslateY = translateY; 2459c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines } 246ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk virtual void draw(Canvas* outCanvas, const SkMatrix& currentMatrix, 247ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk float scaleX, float scaleY) override; 248ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk void updateLocalMatrix(float rotate, float pivotX, float pivotY, 249ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk float scaleX, float scaleY, float translateX, float translateY); 250ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk void getLocalMatrix(SkMatrix* outMatrix); 251ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk void addChild(Node* child); 252ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk void dump() override; 253ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk bool getProperties(float* outProperties, int length); 254ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk 2550826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Samsprivate: 2560826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams enum class Property { 2570826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams Rotate_Property = 0, 2580826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams PivotX_Property, 2590826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams PivotY_Property, 2600826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams ScaleX_Property, 261b37c0a5db65cd8b72cac6a3250faddd1aecb722eJason Sams ScaleY_Property, 262b37c0a5db65cd8b72cac6a3250faddd1aecb722eJason Sams TranslateX_Property, 2630826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams TranslateY_Property, 2640826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams // Count of the properties, must be at the end. 2659c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines Count, 266ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk }; 267ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk float mRotate = 0; 268ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk float mPivotX = 0; 269ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk float mPivotY = 0; 270ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk float mScaleX = 1; 271ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk float mScaleY = 1; 272ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk float mTranslateX = 0; 273ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk float mTranslateY = 0; 274ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk std::vector<Node*> mChildren; 275e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk}; 276e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk 277e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchoukclass ANDROID_API Tree { 278e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchoukpublic: 2799c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines Tree(Group* rootNode) : mRootNode(rootNode) {} 280ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk void draw(Canvas* outCanvas, SkColorFilter* colorFilter, 281ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk const SkRect& bounds, bool needsMirroring, bool canReuseCache); 282ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk void drawCachedBitmapWithRootAlpha(Canvas* outCanvas, SkColorFilter* filter, 283ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk const SkRect& originalBounds); 284ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk 285ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk void updateCachedBitmap(int width, int height); 286ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk void createCachedBitmapIfNeeded(int width, int height); 287ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk bool canReuseBitmap(int width, int height); 288ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk void setAllowCaching(bool allowCaching) { 289ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk mAllowCaching = allowCaching; 2900826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 2910826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams bool setRootAlpha(float rootAlpha) { 2920826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams return VD_SET_PROP(mRootAlpha, rootAlpha); 2930826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 2940826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams 2950826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams float getRootAlpha() { 2960826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams return mRootAlpha; 2970826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 2980826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams void setViewportSize(float viewportWidth, float viewportHeight) { 2990826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mViewportWidth = viewportWidth; 3000826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams mViewportHeight = viewportHeight; 3010826a6f90f049bf94fc39fb23ad3a736a14b96ebJason Sams } 3029c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines 303ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchoukprivate: 304ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk // Cap the bitmap size, such that it won't hurt the performance too much 305ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk // and it won't crash due to a very large scale. 306ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk // The drawable will look blurry above this size. 307ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk const static int MAX_CACHED_BITMAP_SIZE; 308ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk 309ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk bool mCacheDirty = true; 310e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk bool mAllowCaching = true; 311e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk float mViewportWidth = 0; 312e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk float mViewportHeight = 0; 313e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk float mRootAlpha = 1.0f; 314e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk 315e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk Group* mRootNode; 316e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk SkRect mBounds; 317e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk SkMatrix mCanvasMatrix; 3189c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines SkPaint mPaint; 319ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk SkPathMeasure mPathMeasure; 320ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk SkBitmap mCachedBitmap; 321ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk 322ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk}; 323ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk 324ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk} // namespace VectorDrawable 325ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk 326b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouktypedef VectorDrawable::Path::Data PathData; 327b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk} // namespace uirenderer 328b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk} // namespace android 329b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 330b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk#endif // ANDROID_HWUI_VPATH_H 331b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk