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