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