VectorDrawable.h revision dccca44ffda4836b56a21da95a046c9708ffd49c
14bbc2931263b232fba61807fca00e127573eff42Doris Liu/*
24bbc2931263b232fba61807fca00e127573eff42Doris Liu * Copyright (C) 2015 The Android Open Source Project
34bbc2931263b232fba61807fca00e127573eff42Doris Liu *
44bbc2931263b232fba61807fca00e127573eff42Doris Liu * Licensed under the Apache License, Version 2.0 (the "License");
54bbc2931263b232fba61807fca00e127573eff42Doris Liu * you may not use this file except in compliance with the License.
64bbc2931263b232fba61807fca00e127573eff42Doris Liu * You may obtain a copy of the License at
74bbc2931263b232fba61807fca00e127573eff42Doris Liu *
84bbc2931263b232fba61807fca00e127573eff42Doris Liu *      http://www.apache.org/licenses/LICENSE-2.0
94bbc2931263b232fba61807fca00e127573eff42Doris Liu *
104bbc2931263b232fba61807fca00e127573eff42Doris Liu * Unless required by applicable law or agreed to in writing, software
114bbc2931263b232fba61807fca00e127573eff42Doris Liu * distributed under the License is distributed on an "AS IS" BASIS,
124bbc2931263b232fba61807fca00e127573eff42Doris Liu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134bbc2931263b232fba61807fca00e127573eff42Doris Liu * See the License for the specific language governing permissions and
144bbc2931263b232fba61807fca00e127573eff42Doris Liu * limitations under the License.
154bbc2931263b232fba61807fca00e127573eff42Doris Liu */
164bbc2931263b232fba61807fca00e127573eff42Doris Liu
174bbc2931263b232fba61807fca00e127573eff42Doris Liu#ifndef ANDROID_HWUI_VPATH_H
184bbc2931263b232fba61807fca00e127573eff42Doris Liu#define ANDROID_HWUI_VPATH_H
194bbc2931263b232fba61807fca00e127573eff42Doris Liu
20dccca44ffda4836b56a21da95a046c9708ffd49csergeyv#include "hwui/Canvas.h"
21766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
224bbc2931263b232fba61807fca00e127573eff42Doris Liu#include <SkBitmap.h>
234bbc2931263b232fba61807fca00e127573eff42Doris Liu#include <SkColor.h>
24c2de46fadd4ca9c6aa2d9dd7a65b161b28fc6f3bDoris Liu#include <SkCanvas.h>
254bbc2931263b232fba61807fca00e127573eff42Doris Liu#include <SkMatrix.h>
264bbc2931263b232fba61807fca00e127573eff42Doris Liu#include <SkPaint.h>
274bbc2931263b232fba61807fca00e127573eff42Doris Liu#include <SkPath.h>
284bbc2931263b232fba61807fca00e127573eff42Doris Liu#include <SkPathMeasure.h>
294bbc2931263b232fba61807fca00e127573eff42Doris Liu#include <SkRect.h>
30dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu#include <SkShader.h>
314bbc2931263b232fba61807fca00e127573eff42Doris Liu
324bbc2931263b232fba61807fca00e127573eff42Doris Liu#include <cutils/compiler.h>
334bbc2931263b232fba61807fca00e127573eff42Doris Liu#include <stddef.h>
344bbc2931263b232fba61807fca00e127573eff42Doris Liu#include <vector>
354bbc2931263b232fba61807fca00e127573eff42Doris Liu#include <string>
364bbc2931263b232fba61807fca00e127573eff42Doris Liu
374bbc2931263b232fba61807fca00e127573eff42Doris Liunamespace android {
384bbc2931263b232fba61807fca00e127573eff42Doris Liunamespace uirenderer {
394bbc2931263b232fba61807fca00e127573eff42Doris Liu
404bbc2931263b232fba61807fca00e127573eff42Doris Liunamespace VectorDrawable {
414bbc2931263b232fba61807fca00e127573eff42Doris Liu#define VD_SET_PROP_WITH_FLAG(field, value, flag) (VD_SET_PROP(field, value) ? (flag = true, true): false);
424bbc2931263b232fba61807fca00e127573eff42Doris Liu#define VD_SET_PROP(field, value) (value != field ? (field = value, true) : false)
434bbc2931263b232fba61807fca00e127573eff42Doris Liu
444bbc2931263b232fba61807fca00e127573eff42Doris Liu/* A VectorDrawable is composed of a tree of nodes.
454bbc2931263b232fba61807fca00e127573eff42Doris Liu * Each node can be a group node, or a path.
464bbc2931263b232fba61807fca00e127573eff42Doris Liu * A group node can have groups or paths as children, but a path node has
474bbc2931263b232fba61807fca00e127573eff42Doris Liu * no children.
484bbc2931263b232fba61807fca00e127573eff42Doris Liu * One example can be:
494bbc2931263b232fba61807fca00e127573eff42Doris Liu *                 Root Group
504bbc2931263b232fba61807fca00e127573eff42Doris Liu *                /    |     \
514bbc2931263b232fba61807fca00e127573eff42Doris Liu *           Group    Path    Group
524bbc2931263b232fba61807fca00e127573eff42Doris Liu *          /     \             |
534bbc2931263b232fba61807fca00e127573eff42Doris Liu *         Path   Path         Path
544bbc2931263b232fba61807fca00e127573eff42Doris Liu *
554bbc2931263b232fba61807fca00e127573eff42Doris Liu */
564bbc2931263b232fba61807fca00e127573eff42Doris Liuclass ANDROID_API Node {
574bbc2931263b232fba61807fca00e127573eff42Doris Liupublic:
584bbc2931263b232fba61807fca00e127573eff42Doris Liu    Node(const Node& node) {
594bbc2931263b232fba61807fca00e127573eff42Doris Liu        mName = node.mName;
604bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
614bbc2931263b232fba61807fca00e127573eff42Doris Liu    Node() {}
62c2de46fadd4ca9c6aa2d9dd7a65b161b28fc6f3bDoris Liu    virtual void draw(SkCanvas* outCanvas, const SkMatrix& currentMatrix,
634bbc2931263b232fba61807fca00e127573eff42Doris Liu            float scaleX, float scaleY) = 0;
644bbc2931263b232fba61807fca00e127573eff42Doris Liu    virtual void dump() = 0;
654bbc2931263b232fba61807fca00e127573eff42Doris Liu    void setName(const char* name) {
664bbc2931263b232fba61807fca00e127573eff42Doris Liu        mName = name;
674bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
684bbc2931263b232fba61807fca00e127573eff42Doris Liu    virtual ~Node(){}
694bbc2931263b232fba61807fca00e127573eff42Doris Liuprotected:
704bbc2931263b232fba61807fca00e127573eff42Doris Liu    std::string mName;
714bbc2931263b232fba61807fca00e127573eff42Doris Liu};
724bbc2931263b232fba61807fca00e127573eff42Doris Liu
734bbc2931263b232fba61807fca00e127573eff42Doris Liuclass ANDROID_API Path : public Node {
744bbc2931263b232fba61807fca00e127573eff42Doris Liupublic:
754bbc2931263b232fba61807fca00e127573eff42Doris Liu    struct ANDROID_API Data {
764bbc2931263b232fba61807fca00e127573eff42Doris Liu        std::vector<char> verbs;
774bbc2931263b232fba61807fca00e127573eff42Doris Liu        std::vector<size_t> verbSizes;
784bbc2931263b232fba61807fca00e127573eff42Doris Liu        std::vector<float> points;
794bbc2931263b232fba61807fca00e127573eff42Doris Liu        bool operator==(const Data& data) const {
804bbc2931263b232fba61807fca00e127573eff42Doris Liu            return verbs == data.verbs && verbSizes == data.verbSizes
814bbc2931263b232fba61807fca00e127573eff42Doris Liu                    && points == data.points;
824bbc2931263b232fba61807fca00e127573eff42Doris Liu        }
834bbc2931263b232fba61807fca00e127573eff42Doris Liu    };
844bbc2931263b232fba61807fca00e127573eff42Doris Liu    Path(const Data& nodes);
854bbc2931263b232fba61807fca00e127573eff42Doris Liu    Path(const Path& path);
864bbc2931263b232fba61807fca00e127573eff42Doris Liu    Path(const char* path, size_t strLength);
874bbc2931263b232fba61807fca00e127573eff42Doris Liu    Path() {}
884bbc2931263b232fba61807fca00e127573eff42Doris Liu    void dump() override;
894bbc2931263b232fba61807fca00e127573eff42Doris Liu    bool canMorph(const Data& path);
904bbc2931263b232fba61807fca00e127573eff42Doris Liu    bool canMorph(const Path& path);
91c2de46fadd4ca9c6aa2d9dd7a65b161b28fc6f3bDoris Liu    void draw(SkCanvas* outCanvas, const SkMatrix& groupStackedMatrix,
924bbc2931263b232fba61807fca00e127573eff42Doris Liu            float scaleX, float scaleY) override;
934bbc2931263b232fba61807fca00e127573eff42Doris Liu    void setPath(const char* path, size_t strLength);
944bbc2931263b232fba61807fca00e127573eff42Doris Liu    void setPathData(const Data& data);
954bbc2931263b232fba61807fca00e127573eff42Doris Liu    static float getMatrixScale(const SkMatrix& groupStackedMatrix);
964bbc2931263b232fba61807fca00e127573eff42Doris Liu
974bbc2931263b232fba61807fca00e127573eff42Doris Liuprotected:
984bbc2931263b232fba61807fca00e127573eff42Doris Liu    virtual const SkPath& getUpdatedPath();
9946591f4a2dbd785bcae2b82bb490e78208605ec8Teng-Hui Zhu    virtual void drawPath(SkCanvas *outCanvas, SkPath& renderPath,
100dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu            float strokeScale, const SkMatrix& matrix) = 0;
1014bbc2931263b232fba61807fca00e127573eff42Doris Liu    Data mData;
1024bbc2931263b232fba61807fca00e127573eff42Doris Liu    SkPath mSkPath;
1034bbc2931263b232fba61807fca00e127573eff42Doris Liu    bool mSkPathDirty = true;
1044bbc2931263b232fba61807fca00e127573eff42Doris Liu};
1054bbc2931263b232fba61807fca00e127573eff42Doris Liu
1064bbc2931263b232fba61807fca00e127573eff42Doris Liuclass ANDROID_API FullPath: public Path {
1074bbc2931263b232fba61807fca00e127573eff42Doris Liupublic:
108766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
109766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liustruct Properties {
110766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    float strokeWidth = 0;
111766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    SkColor strokeColor = SK_ColorTRANSPARENT;
112766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    float strokeAlpha = 1;
113766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    SkColor fillColor = SK_ColorTRANSPARENT;
114766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    float fillAlpha = 1;
115766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    float trimPathStart = 0;
116766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    float trimPathEnd = 1;
117766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    float trimPathOffset = 0;
118766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    int32_t strokeLineCap = SkPaint::Cap::kButt_Cap;
119766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    int32_t strokeLineJoin = SkPaint::Join::kMiter_Join;
120766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    float strokeMiterLimit = 4;
12146591f4a2dbd785bcae2b82bb490e78208605ec8Teng-Hui Zhu    int fillType = 0; /* non-zero or kWinding_FillType in Skia */
122766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu};
123766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
1244bbc2931263b232fba61807fca00e127573eff42Doris Liu    FullPath(const FullPath& path); // for cloning
1254bbc2931263b232fba61807fca00e127573eff42Doris Liu    FullPath(const char* path, size_t strLength) : Path(path, strLength) {}
1264bbc2931263b232fba61807fca00e127573eff42Doris Liu    FullPath() : Path() {}
1274bbc2931263b232fba61807fca00e127573eff42Doris Liu    FullPath(const Data& nodes) : Path(nodes) {}
1284bbc2931263b232fba61807fca00e127573eff42Doris Liu
129dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu    ~FullPath() {
130dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu        SkSafeUnref(mFillGradient);
131dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu        SkSafeUnref(mStrokeGradient);
132dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu    }
133dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu
1344bbc2931263b232fba61807fca00e127573eff42Doris Liu    void updateProperties(float strokeWidth, SkColor strokeColor,
1354bbc2931263b232fba61807fca00e127573eff42Doris Liu            float strokeAlpha, SkColor fillColor, float fillAlpha,
1364bbc2931263b232fba61807fca00e127573eff42Doris Liu            float trimPathStart, float trimPathEnd, float trimPathOffset,
13746591f4a2dbd785bcae2b82bb490e78208605ec8Teng-Hui Zhu            float strokeMiterLimit, int strokeLineCap, int strokeLineJoin, int fillType);
138766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    // TODO: Cleanup: Remove the setter and getters below, and their counterparts in java and JNI
1394bbc2931263b232fba61807fca00e127573eff42Doris Liu    float getStrokeWidth() {
140766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        return mProperties.strokeWidth;
1414bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
1424bbc2931263b232fba61807fca00e127573eff42Doris Liu    void setStrokeWidth(float strokeWidth) {
143766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        mProperties.strokeWidth = strokeWidth;
1444bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
1454bbc2931263b232fba61807fca00e127573eff42Doris Liu    SkColor getStrokeColor() {
146766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        return mProperties.strokeColor;
1474bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
1484bbc2931263b232fba61807fca00e127573eff42Doris Liu    void setStrokeColor(SkColor strokeColor) {
149766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        mProperties.strokeColor = strokeColor;
1504bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
1514bbc2931263b232fba61807fca00e127573eff42Doris Liu    float getStrokeAlpha() {
152766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        return mProperties.strokeAlpha;
1534bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
1544bbc2931263b232fba61807fca00e127573eff42Doris Liu    void setStrokeAlpha(float strokeAlpha) {
155766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        mProperties.strokeAlpha = strokeAlpha;
1564bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
1574bbc2931263b232fba61807fca00e127573eff42Doris Liu    SkColor getFillColor() {
158766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        return mProperties.fillColor;
1594bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
1604bbc2931263b232fba61807fca00e127573eff42Doris Liu    void setFillColor(SkColor fillColor) {
161766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        mProperties.fillColor = fillColor;
1624bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
1634bbc2931263b232fba61807fca00e127573eff42Doris Liu    float getFillAlpha() {
164766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        return mProperties.fillAlpha;
1654bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
1664bbc2931263b232fba61807fca00e127573eff42Doris Liu    void setFillAlpha(float fillAlpha) {
167766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        mProperties.fillAlpha = fillAlpha;
1684bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
1694bbc2931263b232fba61807fca00e127573eff42Doris Liu    float getTrimPathStart() {
170766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        return mProperties.trimPathStart;
1714bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
1724bbc2931263b232fba61807fca00e127573eff42Doris Liu    void setTrimPathStart(float trimPathStart) {
173766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        VD_SET_PROP_WITH_FLAG(mProperties.trimPathStart, trimPathStart, mTrimDirty);
1744bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
1754bbc2931263b232fba61807fca00e127573eff42Doris Liu    float getTrimPathEnd() {
176766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        return mProperties.trimPathEnd;
1774bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
1784bbc2931263b232fba61807fca00e127573eff42Doris Liu    void setTrimPathEnd(float trimPathEnd) {
179766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        VD_SET_PROP_WITH_FLAG(mProperties.trimPathEnd, trimPathEnd, mTrimDirty);
1804bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
1814bbc2931263b232fba61807fca00e127573eff42Doris Liu    float getTrimPathOffset() {
182766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        return mProperties.trimPathOffset;
1834bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
1844bbc2931263b232fba61807fca00e127573eff42Doris Liu    void setTrimPathOffset(float trimPathOffset) {
185766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        VD_SET_PROP_WITH_FLAG(mProperties.trimPathOffset, trimPathOffset, mTrimDirty);
1864bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
1874bbc2931263b232fba61807fca00e127573eff42Doris Liu    bool getProperties(int8_t* outProperties, int length);
188766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    void setColorPropertyValue(int propertyId, int32_t value);
189766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    void setPropertyValue(int propertyId, float value);
1904bbc2931263b232fba61807fca00e127573eff42Doris Liu
191dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu    void setFillGradient(SkShader* fillGradient) {
192dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu        SkRefCnt_SafeAssign(mFillGradient, fillGradient);
193dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu    };
194dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu    void setStrokeGradient(SkShader* strokeGradient) {
195dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu        SkRefCnt_SafeAssign(mStrokeGradient, strokeGradient);
196dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu    };
197dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu
198dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu
1994bbc2931263b232fba61807fca00e127573eff42Doris Liuprotected:
2004bbc2931263b232fba61807fca00e127573eff42Doris Liu    const SkPath& getUpdatedPath() override;
20146591f4a2dbd785bcae2b82bb490e78208605ec8Teng-Hui Zhu    void drawPath(SkCanvas* outCanvas, SkPath& renderPath,
202dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu            float strokeScale, const SkMatrix& matrix) override;
2034bbc2931263b232fba61807fca00e127573eff42Doris Liu
2044bbc2931263b232fba61807fca00e127573eff42Doris Liuprivate:
205766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    enum class Property {
206766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        StrokeWidth = 0,
207766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        StrokeColor,
208766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        StrokeAlpha,
209766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        FillColor,
210766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        FillAlpha,
211766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        TrimPathStart,
212766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        TrimPathEnd,
213766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        TrimPathOffset,
214766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        StrokeLineCap,
215766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        StrokeLineJoin,
216766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        StrokeMiterLimit,
21746591f4a2dbd785bcae2b82bb490e78208605ec8Teng-Hui Zhu        FillType,
218766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        Count,
219766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    };
2204bbc2931263b232fba61807fca00e127573eff42Doris Liu    // Applies trimming to the specified path.
2214bbc2931263b232fba61807fca00e127573eff42Doris Liu    void applyTrim();
222766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    Properties mProperties;
2234bbc2931263b232fba61807fca00e127573eff42Doris Liu    bool mTrimDirty = true;
2244bbc2931263b232fba61807fca00e127573eff42Doris Liu    SkPath mTrimmedSkPath;
2254bbc2931263b232fba61807fca00e127573eff42Doris Liu    SkPaint mPaint;
226766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    SkShader* mStrokeGradient = nullptr;
227766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    SkShader* mFillGradient = nullptr;
2284bbc2931263b232fba61807fca00e127573eff42Doris Liu};
2294bbc2931263b232fba61807fca00e127573eff42Doris Liu
2304bbc2931263b232fba61807fca00e127573eff42Doris Liuclass ANDROID_API ClipPath: public Path {
2314bbc2931263b232fba61807fca00e127573eff42Doris Liupublic:
2324bbc2931263b232fba61807fca00e127573eff42Doris Liu    ClipPath(const ClipPath& path) : Path(path) {}
2334bbc2931263b232fba61807fca00e127573eff42Doris Liu    ClipPath(const char* path, size_t strLength) : Path(path, strLength) {}
2344bbc2931263b232fba61807fca00e127573eff42Doris Liu    ClipPath() : Path() {}
2354bbc2931263b232fba61807fca00e127573eff42Doris Liu    ClipPath(const Data& nodes) : Path(nodes) {}
2364bbc2931263b232fba61807fca00e127573eff42Doris Liu
2374bbc2931263b232fba61807fca00e127573eff42Doris Liuprotected:
23846591f4a2dbd785bcae2b82bb490e78208605ec8Teng-Hui Zhu    void drawPath(SkCanvas* outCanvas, SkPath& renderPath,
239dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu            float strokeScale, const SkMatrix& matrix) override;
2404bbc2931263b232fba61807fca00e127573eff42Doris Liu};
2414bbc2931263b232fba61807fca00e127573eff42Doris Liu
2424bbc2931263b232fba61807fca00e127573eff42Doris Liuclass ANDROID_API Group: public Node {
2434bbc2931263b232fba61807fca00e127573eff42Doris Liupublic:
244766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    struct Properties {
245766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        float rotate = 0;
246766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        float pivotX = 0;
247766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        float pivotY = 0;
248766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        float scaleX = 1;
249766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        float scaleY = 1;
250766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        float translateX = 0;
251766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        float translateY = 0;
252766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    };
2534bbc2931263b232fba61807fca00e127573eff42Doris Liu    Group(const Group& group);
2544bbc2931263b232fba61807fca00e127573eff42Doris Liu    Group() {}
2554bbc2931263b232fba61807fca00e127573eff42Doris Liu    float getRotation() {
256766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        return mProperties.rotate;
2574bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
2584bbc2931263b232fba61807fca00e127573eff42Doris Liu    void setRotation(float rotation) {
259766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        mProperties.rotate = rotation;
2604bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
2614bbc2931263b232fba61807fca00e127573eff42Doris Liu    float getPivotX() {
262766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        return mProperties.pivotX;
2634bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
2644bbc2931263b232fba61807fca00e127573eff42Doris Liu    void setPivotX(float pivotX) {
265766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        mProperties.pivotX = pivotX;
2664bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
2674bbc2931263b232fba61807fca00e127573eff42Doris Liu    float getPivotY() {
268766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        return mProperties.pivotY;
2694bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
2704bbc2931263b232fba61807fca00e127573eff42Doris Liu    void setPivotY(float pivotY) {
271766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        mProperties.pivotY = pivotY;
2724bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
2734bbc2931263b232fba61807fca00e127573eff42Doris Liu    float getScaleX() {
274766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        return mProperties.scaleX;
2754bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
2764bbc2931263b232fba61807fca00e127573eff42Doris Liu    void setScaleX(float scaleX) {
277766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        mProperties.scaleX = scaleX;
2784bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
2794bbc2931263b232fba61807fca00e127573eff42Doris Liu    float getScaleY() {
280766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        return mProperties.scaleY;
2814bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
2824bbc2931263b232fba61807fca00e127573eff42Doris Liu    void setScaleY(float scaleY) {
283766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        mProperties.scaleY = scaleY;
2844bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
2854bbc2931263b232fba61807fca00e127573eff42Doris Liu    float getTranslateX() {
286766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        return mProperties.translateX;
2874bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
2884bbc2931263b232fba61807fca00e127573eff42Doris Liu    void setTranslateX(float translateX) {
289766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        mProperties.translateX = translateX;
2904bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
2914bbc2931263b232fba61807fca00e127573eff42Doris Liu    float getTranslateY() {
292766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        return mProperties.translateY;
2934bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
2944bbc2931263b232fba61807fca00e127573eff42Doris Liu    void setTranslateY(float translateY) {
295766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        mProperties.translateY = translateY;
2964bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
297c2de46fadd4ca9c6aa2d9dd7a65b161b28fc6f3bDoris Liu    virtual void draw(SkCanvas* outCanvas, const SkMatrix& currentMatrix,
2984bbc2931263b232fba61807fca00e127573eff42Doris Liu            float scaleX, float scaleY) override;
2994bbc2931263b232fba61807fca00e127573eff42Doris Liu    void updateLocalMatrix(float rotate, float pivotX, float pivotY,
3004bbc2931263b232fba61807fca00e127573eff42Doris Liu            float scaleX, float scaleY, float translateX, float translateY);
3014bbc2931263b232fba61807fca00e127573eff42Doris Liu    void getLocalMatrix(SkMatrix* outMatrix);
3024bbc2931263b232fba61807fca00e127573eff42Doris Liu    void addChild(Node* child);
3034bbc2931263b232fba61807fca00e127573eff42Doris Liu    void dump() override;
3044bbc2931263b232fba61807fca00e127573eff42Doris Liu    bool getProperties(float* outProperties, int length);
305766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    float getPropertyValue(int propertyId) const;
306766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    void setPropertyValue(int propertyId, float value);
307766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    static bool isValidProperty(int propertyId);
3084bbc2931263b232fba61807fca00e127573eff42Doris Liu
3094bbc2931263b232fba61807fca00e127573eff42Doris Liuprivate:
3104bbc2931263b232fba61807fca00e127573eff42Doris Liu    enum class Property {
311766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        Rotate = 0,
312766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        PivotX,
313766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        PivotY,
314766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        ScaleX,
315766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        ScaleY,
316766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        TranslateX,
317766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        TranslateY,
3184bbc2931263b232fba61807fca00e127573eff42Doris Liu        // Count of the properties, must be at the end.
3194bbc2931263b232fba61807fca00e127573eff42Doris Liu        Count,
3204bbc2931263b232fba61807fca00e127573eff42Doris Liu    };
321ef062ebd20032efe697741d6c3dfd1faec54f590Doris Liu    std::vector< std::unique_ptr<Node> > mChildren;
322766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    Properties mProperties;
3234bbc2931263b232fba61807fca00e127573eff42Doris Liu};
3244bbc2931263b232fba61807fca00e127573eff42Doris Liu
325766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liuclass ANDROID_API Tree : public VirtualLightRefBase {
3264bbc2931263b232fba61807fca00e127573eff42Doris Liupublic:
3274bbc2931263b232fba61807fca00e127573eff42Doris Liu    Tree(Group* rootNode) : mRootNode(rootNode) {}
3284bbc2931263b232fba61807fca00e127573eff42Doris Liu    void draw(Canvas* outCanvas, SkColorFilter* colorFilter,
3294bbc2931263b232fba61807fca00e127573eff42Doris Liu            const SkRect& bounds, bool needsMirroring, bool canReuseCache);
3304bbc2931263b232fba61807fca00e127573eff42Doris Liu
331766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    const SkBitmap& getBitmapUpdateIfDirty();
3324bbc2931263b232fba61807fca00e127573eff42Doris Liu    void createCachedBitmapIfNeeded(int width, int height);
3334bbc2931263b232fba61807fca00e127573eff42Doris Liu    bool canReuseBitmap(int width, int height);
3344bbc2931263b232fba61807fca00e127573eff42Doris Liu    void setAllowCaching(bool allowCaching) {
3354bbc2931263b232fba61807fca00e127573eff42Doris Liu        mAllowCaching = allowCaching;
3364bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
3374bbc2931263b232fba61807fca00e127573eff42Doris Liu    bool setRootAlpha(float rootAlpha) {
3384bbc2931263b232fba61807fca00e127573eff42Doris Liu        return VD_SET_PROP(mRootAlpha, rootAlpha);
3394bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
3404bbc2931263b232fba61807fca00e127573eff42Doris Liu
3414bbc2931263b232fba61807fca00e127573eff42Doris Liu    float getRootAlpha() {
3424bbc2931263b232fba61807fca00e127573eff42Doris Liu        return mRootAlpha;
3434bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
3444bbc2931263b232fba61807fca00e127573eff42Doris Liu    void setViewportSize(float viewportWidth, float viewportHeight) {
3454bbc2931263b232fba61807fca00e127573eff42Doris Liu        mViewportWidth = viewportWidth;
3464bbc2931263b232fba61807fca00e127573eff42Doris Liu        mViewportHeight = viewportHeight;
3474bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
348766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    SkPaint* getPaint();
349766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    const SkRect& getBounds() const {
350766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        return mBounds;
351766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    }
3524bbc2931263b232fba61807fca00e127573eff42Doris Liu
3534bbc2931263b232fba61807fca00e127573eff42Doris Liuprivate:
3544bbc2931263b232fba61807fca00e127573eff42Doris Liu    // Cap the bitmap size, such that it won't hurt the performance too much
3554bbc2931263b232fba61807fca00e127573eff42Doris Liu    // and it won't crash due to a very large scale.
3564bbc2931263b232fba61807fca00e127573eff42Doris Liu    // The drawable will look blurry above this size.
3574bbc2931263b232fba61807fca00e127573eff42Doris Liu    const static int MAX_CACHED_BITMAP_SIZE;
3584bbc2931263b232fba61807fca00e127573eff42Doris Liu
3594bbc2931263b232fba61807fca00e127573eff42Doris Liu    bool mCacheDirty = true;
3604bbc2931263b232fba61807fca00e127573eff42Doris Liu    bool mAllowCaching = true;
3614bbc2931263b232fba61807fca00e127573eff42Doris Liu    float mViewportWidth = 0;
3624bbc2931263b232fba61807fca00e127573eff42Doris Liu    float mViewportHeight = 0;
3634bbc2931263b232fba61807fca00e127573eff42Doris Liu    float mRootAlpha = 1.0f;
3644bbc2931263b232fba61807fca00e127573eff42Doris Liu
365ef062ebd20032efe697741d6c3dfd1faec54f590Doris Liu    std::unique_ptr<Group> mRootNode;
3664bbc2931263b232fba61807fca00e127573eff42Doris Liu    SkRect mBounds;
3674bbc2931263b232fba61807fca00e127573eff42Doris Liu    SkMatrix mCanvasMatrix;
3684bbc2931263b232fba61807fca00e127573eff42Doris Liu    SkPaint mPaint;
3694bbc2931263b232fba61807fca00e127573eff42Doris Liu    SkPathMeasure mPathMeasure;
3704bbc2931263b232fba61807fca00e127573eff42Doris Liu    SkBitmap mCachedBitmap;
3714bbc2931263b232fba61807fca00e127573eff42Doris Liu
3724bbc2931263b232fba61807fca00e127573eff42Doris Liu};
3734bbc2931263b232fba61807fca00e127573eff42Doris Liu
3744bbc2931263b232fba61807fca00e127573eff42Doris Liu} // namespace VectorDrawable
3754bbc2931263b232fba61807fca00e127573eff42Doris Liu
3764bbc2931263b232fba61807fca00e127573eff42Doris Liutypedef VectorDrawable::Path::Data PathData;
3774bbc2931263b232fba61807fca00e127573eff42Doris Liu} // namespace uirenderer
3784bbc2931263b232fba61807fca00e127573eff42Doris Liu} // namespace android
3794bbc2931263b232fba61807fca00e127573eff42Doris Liu
3804bbc2931263b232fba61807fca00e127573eff42Doris Liu#endif // ANDROID_HWUI_VPATH_H
381