VectorDrawable.h revision ef062ebd20032efe697741d6c3dfd1faec54f590
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
204bbc2931263b232fba61807fca00e127573eff42Doris Liu#include "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();
99c2de46fadd4ca9c6aa2d9dd7a65b161b28fc6f3bDoris Liu    virtual void drawPath(SkCanvas *outCanvas, const 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;
121766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu};
122766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
1234bbc2931263b232fba61807fca00e127573eff42Doris Liu    FullPath(const FullPath& path); // for cloning
1244bbc2931263b232fba61807fca00e127573eff42Doris Liu    FullPath(const char* path, size_t strLength) : Path(path, strLength) {}
1254bbc2931263b232fba61807fca00e127573eff42Doris Liu    FullPath() : Path() {}
1264bbc2931263b232fba61807fca00e127573eff42Doris Liu    FullPath(const Data& nodes) : Path(nodes) {}
1274bbc2931263b232fba61807fca00e127573eff42Doris Liu
128dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu    ~FullPath() {
129dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu        SkSafeUnref(mFillGradient);
130dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu        SkSafeUnref(mStrokeGradient);
131dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu    }
132dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu
1334bbc2931263b232fba61807fca00e127573eff42Doris Liu    void updateProperties(float strokeWidth, SkColor strokeColor,
1344bbc2931263b232fba61807fca00e127573eff42Doris Liu            float strokeAlpha, SkColor fillColor, float fillAlpha,
1354bbc2931263b232fba61807fca00e127573eff42Doris Liu            float trimPathStart, float trimPathEnd, float trimPathOffset,
1364bbc2931263b232fba61807fca00e127573eff42Doris Liu            float strokeMiterLimit, int strokeLineCap, int strokeLineJoin);
137766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    // TODO: Cleanup: Remove the setter and getters below, and their counterparts in java and JNI
1384bbc2931263b232fba61807fca00e127573eff42Doris Liu    float getStrokeWidth() {
139766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        return mProperties.strokeWidth;
1404bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
1414bbc2931263b232fba61807fca00e127573eff42Doris Liu    void setStrokeWidth(float strokeWidth) {
142766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        mProperties.strokeWidth = strokeWidth;
1434bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
1444bbc2931263b232fba61807fca00e127573eff42Doris Liu    SkColor getStrokeColor() {
145766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        return mProperties.strokeColor;
1464bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
1474bbc2931263b232fba61807fca00e127573eff42Doris Liu    void setStrokeColor(SkColor strokeColor) {
148766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        mProperties.strokeColor = strokeColor;
1494bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
1504bbc2931263b232fba61807fca00e127573eff42Doris Liu    float getStrokeAlpha() {
151766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        return mProperties.strokeAlpha;
1524bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
1534bbc2931263b232fba61807fca00e127573eff42Doris Liu    void setStrokeAlpha(float strokeAlpha) {
154766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        mProperties.strokeAlpha = strokeAlpha;
1554bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
1564bbc2931263b232fba61807fca00e127573eff42Doris Liu    SkColor getFillColor() {
157766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        return mProperties.fillColor;
1584bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
1594bbc2931263b232fba61807fca00e127573eff42Doris Liu    void setFillColor(SkColor fillColor) {
160766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        mProperties.fillColor = fillColor;
1614bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
1624bbc2931263b232fba61807fca00e127573eff42Doris Liu    float getFillAlpha() {
163766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        return mProperties.fillAlpha;
1644bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
1654bbc2931263b232fba61807fca00e127573eff42Doris Liu    void setFillAlpha(float fillAlpha) {
166766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        mProperties.fillAlpha = fillAlpha;
1674bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
1684bbc2931263b232fba61807fca00e127573eff42Doris Liu    float getTrimPathStart() {
169766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        return mProperties.trimPathStart;
1704bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
1714bbc2931263b232fba61807fca00e127573eff42Doris Liu    void setTrimPathStart(float trimPathStart) {
172766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        VD_SET_PROP_WITH_FLAG(mProperties.trimPathStart, trimPathStart, mTrimDirty);
1734bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
1744bbc2931263b232fba61807fca00e127573eff42Doris Liu    float getTrimPathEnd() {
175766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        return mProperties.trimPathEnd;
1764bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
1774bbc2931263b232fba61807fca00e127573eff42Doris Liu    void setTrimPathEnd(float trimPathEnd) {
178766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        VD_SET_PROP_WITH_FLAG(mProperties.trimPathEnd, trimPathEnd, mTrimDirty);
1794bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
1804bbc2931263b232fba61807fca00e127573eff42Doris Liu    float getTrimPathOffset() {
181766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        return mProperties.trimPathOffset;
1824bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
1834bbc2931263b232fba61807fca00e127573eff42Doris Liu    void setTrimPathOffset(float trimPathOffset) {
184766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        VD_SET_PROP_WITH_FLAG(mProperties.trimPathOffset, trimPathOffset, mTrimDirty);
1854bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
1864bbc2931263b232fba61807fca00e127573eff42Doris Liu    bool getProperties(int8_t* outProperties, int length);
187766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    void setColorPropertyValue(int propertyId, int32_t value);
188766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    void setPropertyValue(int propertyId, float value);
1894bbc2931263b232fba61807fca00e127573eff42Doris Liu
190dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu    void setFillGradient(SkShader* fillGradient) {
191dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu        SkRefCnt_SafeAssign(mFillGradient, fillGradient);
192dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu    };
193dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu    void setStrokeGradient(SkShader* strokeGradient) {
194dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu        SkRefCnt_SafeAssign(mStrokeGradient, strokeGradient);
195dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu    };
196dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu
197dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu
1984bbc2931263b232fba61807fca00e127573eff42Doris Liuprotected:
1994bbc2931263b232fba61807fca00e127573eff42Doris Liu    const SkPath& getUpdatedPath() override;
200c2de46fadd4ca9c6aa2d9dd7a65b161b28fc6f3bDoris Liu    void drawPath(SkCanvas* outCanvas, const SkPath& renderPath,
201dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu            float strokeScale, const SkMatrix& matrix) override;
2024bbc2931263b232fba61807fca00e127573eff42Doris Liu
2034bbc2931263b232fba61807fca00e127573eff42Doris Liuprivate:
204766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    enum class Property {
205766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        StrokeWidth = 0,
206766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        StrokeColor,
207766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        StrokeAlpha,
208766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        FillColor,
209766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        FillAlpha,
210766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        TrimPathStart,
211766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        TrimPathEnd,
212766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        TrimPathOffset,
213766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        StrokeLineCap,
214766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        StrokeLineJoin,
215766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        StrokeMiterLimit,
216766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        Count,
217766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    };
2184bbc2931263b232fba61807fca00e127573eff42Doris Liu    // Applies trimming to the specified path.
2194bbc2931263b232fba61807fca00e127573eff42Doris Liu    void applyTrim();
220766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    Properties mProperties;
2214bbc2931263b232fba61807fca00e127573eff42Doris Liu    bool mTrimDirty = true;
2224bbc2931263b232fba61807fca00e127573eff42Doris Liu    SkPath mTrimmedSkPath;
2234bbc2931263b232fba61807fca00e127573eff42Doris Liu    SkPaint mPaint;
224766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    SkShader* mStrokeGradient = nullptr;
225766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    SkShader* mFillGradient = nullptr;
2264bbc2931263b232fba61807fca00e127573eff42Doris Liu};
2274bbc2931263b232fba61807fca00e127573eff42Doris Liu
2284bbc2931263b232fba61807fca00e127573eff42Doris Liuclass ANDROID_API ClipPath: public Path {
2294bbc2931263b232fba61807fca00e127573eff42Doris Liupublic:
2304bbc2931263b232fba61807fca00e127573eff42Doris Liu    ClipPath(const ClipPath& path) : Path(path) {}
2314bbc2931263b232fba61807fca00e127573eff42Doris Liu    ClipPath(const char* path, size_t strLength) : Path(path, strLength) {}
2324bbc2931263b232fba61807fca00e127573eff42Doris Liu    ClipPath() : Path() {}
2334bbc2931263b232fba61807fca00e127573eff42Doris Liu    ClipPath(const Data& nodes) : Path(nodes) {}
2344bbc2931263b232fba61807fca00e127573eff42Doris Liu
2354bbc2931263b232fba61807fca00e127573eff42Doris Liuprotected:
236c2de46fadd4ca9c6aa2d9dd7a65b161b28fc6f3bDoris Liu    void drawPath(SkCanvas* outCanvas, const SkPath& renderPath,
237dbee9bb342cdfaa5155b1918f90262c05e2464cbTeng-Hui Zhu            float strokeScale, const SkMatrix& matrix) override;
2384bbc2931263b232fba61807fca00e127573eff42Doris Liu};
2394bbc2931263b232fba61807fca00e127573eff42Doris Liu
2404bbc2931263b232fba61807fca00e127573eff42Doris Liuclass ANDROID_API Group: public Node {
2414bbc2931263b232fba61807fca00e127573eff42Doris Liupublic:
242766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    struct Properties {
243766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        float rotate = 0;
244766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        float pivotX = 0;
245766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        float pivotY = 0;
246766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        float scaleX = 1;
247766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        float scaleY = 1;
248766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        float translateX = 0;
249766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        float translateY = 0;
250766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    };
2514bbc2931263b232fba61807fca00e127573eff42Doris Liu    Group(const Group& group);
2524bbc2931263b232fba61807fca00e127573eff42Doris Liu    Group() {}
2534bbc2931263b232fba61807fca00e127573eff42Doris Liu    float getRotation() {
254766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        return mProperties.rotate;
2554bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
2564bbc2931263b232fba61807fca00e127573eff42Doris Liu    void setRotation(float rotation) {
257766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        mProperties.rotate = rotation;
2584bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
2594bbc2931263b232fba61807fca00e127573eff42Doris Liu    float getPivotX() {
260766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        return mProperties.pivotX;
2614bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
2624bbc2931263b232fba61807fca00e127573eff42Doris Liu    void setPivotX(float pivotX) {
263766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        mProperties.pivotX = pivotX;
2644bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
2654bbc2931263b232fba61807fca00e127573eff42Doris Liu    float getPivotY() {
266766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        return mProperties.pivotY;
2674bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
2684bbc2931263b232fba61807fca00e127573eff42Doris Liu    void setPivotY(float pivotY) {
269766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        mProperties.pivotY = pivotY;
2704bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
2714bbc2931263b232fba61807fca00e127573eff42Doris Liu    float getScaleX() {
272766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        return mProperties.scaleX;
2734bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
2744bbc2931263b232fba61807fca00e127573eff42Doris Liu    void setScaleX(float scaleX) {
275766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        mProperties.scaleX = scaleX;
2764bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
2774bbc2931263b232fba61807fca00e127573eff42Doris Liu    float getScaleY() {
278766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        return mProperties.scaleY;
2794bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
2804bbc2931263b232fba61807fca00e127573eff42Doris Liu    void setScaleY(float scaleY) {
281766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        mProperties.scaleY = scaleY;
2824bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
2834bbc2931263b232fba61807fca00e127573eff42Doris Liu    float getTranslateX() {
284766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        return mProperties.translateX;
2854bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
2864bbc2931263b232fba61807fca00e127573eff42Doris Liu    void setTranslateX(float translateX) {
287766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        mProperties.translateX = translateX;
2884bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
2894bbc2931263b232fba61807fca00e127573eff42Doris Liu    float getTranslateY() {
290766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        return mProperties.translateY;
2914bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
2924bbc2931263b232fba61807fca00e127573eff42Doris Liu    void setTranslateY(float translateY) {
293766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        mProperties.translateY = translateY;
2944bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
295c2de46fadd4ca9c6aa2d9dd7a65b161b28fc6f3bDoris Liu    virtual void draw(SkCanvas* outCanvas, const SkMatrix& currentMatrix,
2964bbc2931263b232fba61807fca00e127573eff42Doris Liu            float scaleX, float scaleY) override;
2974bbc2931263b232fba61807fca00e127573eff42Doris Liu    void updateLocalMatrix(float rotate, float pivotX, float pivotY,
2984bbc2931263b232fba61807fca00e127573eff42Doris Liu            float scaleX, float scaleY, float translateX, float translateY);
2994bbc2931263b232fba61807fca00e127573eff42Doris Liu    void getLocalMatrix(SkMatrix* outMatrix);
3004bbc2931263b232fba61807fca00e127573eff42Doris Liu    void addChild(Node* child);
3014bbc2931263b232fba61807fca00e127573eff42Doris Liu    void dump() override;
3024bbc2931263b232fba61807fca00e127573eff42Doris Liu    bool getProperties(float* outProperties, int length);
303766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    float getPropertyValue(int propertyId) const;
304766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    void setPropertyValue(int propertyId, float value);
305766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    static bool isValidProperty(int propertyId);
3064bbc2931263b232fba61807fca00e127573eff42Doris Liu
3074bbc2931263b232fba61807fca00e127573eff42Doris Liuprivate:
3084bbc2931263b232fba61807fca00e127573eff42Doris Liu    enum class Property {
309766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        Rotate = 0,
310766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        PivotX,
311766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        PivotY,
312766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        ScaleX,
313766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        ScaleY,
314766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        TranslateX,
315766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        TranslateY,
3164bbc2931263b232fba61807fca00e127573eff42Doris Liu        // Count of the properties, must be at the end.
3174bbc2931263b232fba61807fca00e127573eff42Doris Liu        Count,
3184bbc2931263b232fba61807fca00e127573eff42Doris Liu    };
319ef062ebd20032efe697741d6c3dfd1faec54f590Doris Liu    std::vector< std::unique_ptr<Node> > mChildren;
320766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    Properties mProperties;
3214bbc2931263b232fba61807fca00e127573eff42Doris Liu};
3224bbc2931263b232fba61807fca00e127573eff42Doris Liu
323766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liuclass ANDROID_API Tree : public VirtualLightRefBase {
3244bbc2931263b232fba61807fca00e127573eff42Doris Liupublic:
3254bbc2931263b232fba61807fca00e127573eff42Doris Liu    Tree(Group* rootNode) : mRootNode(rootNode) {}
3264bbc2931263b232fba61807fca00e127573eff42Doris Liu    void draw(Canvas* outCanvas, SkColorFilter* colorFilter,
3274bbc2931263b232fba61807fca00e127573eff42Doris Liu            const SkRect& bounds, bool needsMirroring, bool canReuseCache);
3284bbc2931263b232fba61807fca00e127573eff42Doris Liu
329766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    const SkBitmap& getBitmapUpdateIfDirty();
3304bbc2931263b232fba61807fca00e127573eff42Doris Liu    void createCachedBitmapIfNeeded(int width, int height);
3314bbc2931263b232fba61807fca00e127573eff42Doris Liu    bool canReuseBitmap(int width, int height);
3324bbc2931263b232fba61807fca00e127573eff42Doris Liu    void setAllowCaching(bool allowCaching) {
3334bbc2931263b232fba61807fca00e127573eff42Doris Liu        mAllowCaching = allowCaching;
3344bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
3354bbc2931263b232fba61807fca00e127573eff42Doris Liu    bool setRootAlpha(float rootAlpha) {
3364bbc2931263b232fba61807fca00e127573eff42Doris Liu        return VD_SET_PROP(mRootAlpha, rootAlpha);
3374bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
3384bbc2931263b232fba61807fca00e127573eff42Doris Liu
3394bbc2931263b232fba61807fca00e127573eff42Doris Liu    float getRootAlpha() {
3404bbc2931263b232fba61807fca00e127573eff42Doris Liu        return mRootAlpha;
3414bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
3424bbc2931263b232fba61807fca00e127573eff42Doris Liu    void setViewportSize(float viewportWidth, float viewportHeight) {
3434bbc2931263b232fba61807fca00e127573eff42Doris Liu        mViewportWidth = viewportWidth;
3444bbc2931263b232fba61807fca00e127573eff42Doris Liu        mViewportHeight = viewportHeight;
3454bbc2931263b232fba61807fca00e127573eff42Doris Liu    }
346766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    SkPaint* getPaint();
347766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    const SkRect& getBounds() const {
348766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        return mBounds;
349766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    }
3504bbc2931263b232fba61807fca00e127573eff42Doris Liu
3514bbc2931263b232fba61807fca00e127573eff42Doris Liuprivate:
3524bbc2931263b232fba61807fca00e127573eff42Doris Liu    // Cap the bitmap size, such that it won't hurt the performance too much
3534bbc2931263b232fba61807fca00e127573eff42Doris Liu    // and it won't crash due to a very large scale.
3544bbc2931263b232fba61807fca00e127573eff42Doris Liu    // The drawable will look blurry above this size.
3554bbc2931263b232fba61807fca00e127573eff42Doris Liu    const static int MAX_CACHED_BITMAP_SIZE;
3564bbc2931263b232fba61807fca00e127573eff42Doris Liu
3574bbc2931263b232fba61807fca00e127573eff42Doris Liu    bool mCacheDirty = true;
3584bbc2931263b232fba61807fca00e127573eff42Doris Liu    bool mAllowCaching = true;
3594bbc2931263b232fba61807fca00e127573eff42Doris Liu    float mViewportWidth = 0;
3604bbc2931263b232fba61807fca00e127573eff42Doris Liu    float mViewportHeight = 0;
3614bbc2931263b232fba61807fca00e127573eff42Doris Liu    float mRootAlpha = 1.0f;
3624bbc2931263b232fba61807fca00e127573eff42Doris Liu
363ef062ebd20032efe697741d6c3dfd1faec54f590Doris Liu    std::unique_ptr<Group> mRootNode;
3644bbc2931263b232fba61807fca00e127573eff42Doris Liu    SkRect mBounds;
3654bbc2931263b232fba61807fca00e127573eff42Doris Liu    SkMatrix mCanvasMatrix;
3664bbc2931263b232fba61807fca00e127573eff42Doris Liu    SkPaint mPaint;
3674bbc2931263b232fba61807fca00e127573eff42Doris Liu    SkPathMeasure mPathMeasure;
3684bbc2931263b232fba61807fca00e127573eff42Doris Liu    SkBitmap mCachedBitmap;
3694bbc2931263b232fba61807fca00e127573eff42Doris Liu
3704bbc2931263b232fba61807fca00e127573eff42Doris Liu};
3714bbc2931263b232fba61807fca00e127573eff42Doris Liu
3724bbc2931263b232fba61807fca00e127573eff42Doris Liu} // namespace VectorDrawable
3734bbc2931263b232fba61807fca00e127573eff42Doris Liu
3744bbc2931263b232fba61807fca00e127573eff42Doris Liutypedef VectorDrawable::Path::Data PathData;
3754bbc2931263b232fba61807fca00e127573eff42Doris Liu} // namespace uirenderer
3764bbc2931263b232fba61807fca00e127573eff42Doris Liu} // namespace android
3774bbc2931263b232fba61807fca00e127573eff42Doris Liu
3784bbc2931263b232fba61807fca00e127573eff42Doris Liu#endif // ANDROID_HWUI_VPATH_H
379