Merge "Fix translationY not being set correctly for VD during animation" into nyc-dev

This commit is contained in:
Doris Liu
2016-04-13 17:22:18 +00:00
committed by Android (Google) Code Review
2 changed files with 54 additions and 19 deletions

View File

@@ -40,11 +40,11 @@ namespace android {
namespace uirenderer { namespace uirenderer {
namespace VectorDrawable { namespace VectorDrawable {
#define VD_SET_PROP_WITH_FLAG(field, value, flag) (VD_SET_PROP_AND_NOTIFY(field, value) ? (flag = true, true) : false) #define VD_SET_PRIMITIVE_FIELD_WITH_FLAG(field, value, flag) (VD_SET_PRIMITIVE_FIELD_AND_NOTIFY(field, (value)) ? ((flag) = true, true) : false)
#define VD_SET_PROP(field, value) (value != field ? (field = value, true) : false) #define VD_SET_PROP(field, value) ((value) != (field) ? ((field) = (value), true) : false)
#define VD_SET_PROP_AND_NOTIFY(field, value) ({ bool retVal = VD_SET_PROP(field, value);\ #define VD_SET_PRIMITIVE_FIELD_AND_NOTIFY(field, value) ({ bool retVal = VD_SET_PROP((mPrimitiveFields.field), (value));\
onPropertyChanged(); retVal;}) onPropertyChanged(); retVal;})
#define UPDATE_SKPROP(field, value) ({bool retVal = (field != value); if (field != value) SkRefCnt_SafeAssign(field, value); retVal;}) #define UPDATE_SKPROP(field, value) ({bool retVal = ((field) != (value)); if ((field) != (value)) SkRefCnt_SafeAssign((field), (value)); retVal;})
/* A VectorDrawable is composed of a tree of nodes. /* A VectorDrawable is composed of a tree of nodes.
* Each node can be a group node, or a path. * Each node can be a group node, or a path.
@@ -248,49 +248,49 @@ public:
return mPrimitiveFields.strokeWidth; return mPrimitiveFields.strokeWidth;
} }
void setStrokeWidth(float strokeWidth) { void setStrokeWidth(float strokeWidth) {
VD_SET_PROP_AND_NOTIFY(strokeWidth, strokeWidth); VD_SET_PRIMITIVE_FIELD_AND_NOTIFY(strokeWidth, strokeWidth);
} }
SkColor getStrokeColor() const{ SkColor getStrokeColor() const{
return mPrimitiveFields.strokeColor; return mPrimitiveFields.strokeColor;
} }
void setStrokeColor(SkColor strokeColor) { void setStrokeColor(SkColor strokeColor) {
VD_SET_PROP_AND_NOTIFY(mPrimitiveFields.strokeColor, strokeColor); VD_SET_PRIMITIVE_FIELD_AND_NOTIFY(strokeColor, strokeColor);
} }
float getStrokeAlpha() const{ float getStrokeAlpha() const{
return mPrimitiveFields.strokeAlpha; return mPrimitiveFields.strokeAlpha;
} }
void setStrokeAlpha(float strokeAlpha) { void setStrokeAlpha(float strokeAlpha) {
VD_SET_PROP_AND_NOTIFY(mPrimitiveFields.strokeAlpha, strokeAlpha); VD_SET_PRIMITIVE_FIELD_AND_NOTIFY(strokeAlpha, strokeAlpha);
} }
SkColor getFillColor() const { SkColor getFillColor() const {
return mPrimitiveFields.fillColor; return mPrimitiveFields.fillColor;
} }
void setFillColor(SkColor fillColor) { void setFillColor(SkColor fillColor) {
VD_SET_PROP_AND_NOTIFY(mPrimitiveFields.fillColor, fillColor); VD_SET_PRIMITIVE_FIELD_AND_NOTIFY(fillColor, fillColor);
} }
float getFillAlpha() const{ float getFillAlpha() const{
return mPrimitiveFields.fillAlpha; return mPrimitiveFields.fillAlpha;
} }
void setFillAlpha(float fillAlpha) { void setFillAlpha(float fillAlpha) {
VD_SET_PROP_AND_NOTIFY(mPrimitiveFields.fillAlpha, fillAlpha); VD_SET_PRIMITIVE_FIELD_AND_NOTIFY(fillAlpha, fillAlpha);
} }
float getTrimPathStart() const{ float getTrimPathStart() const{
return mPrimitiveFields.trimPathStart; return mPrimitiveFields.trimPathStart;
} }
void setTrimPathStart(float trimPathStart) { void setTrimPathStart(float trimPathStart) {
VD_SET_PROP_WITH_FLAG(mPrimitiveFields.trimPathStart, trimPathStart, mTrimDirty); VD_SET_PRIMITIVE_FIELD_WITH_FLAG(trimPathStart, trimPathStart, mTrimDirty);
} }
float getTrimPathEnd() const{ float getTrimPathEnd() const{
return mPrimitiveFields.trimPathEnd; return mPrimitiveFields.trimPathEnd;
} }
void setTrimPathEnd(float trimPathEnd) { void setTrimPathEnd(float trimPathEnd) {
VD_SET_PROP_WITH_FLAG(mPrimitiveFields.trimPathEnd, trimPathEnd, mTrimDirty); VD_SET_PRIMITIVE_FIELD_WITH_FLAG(trimPathEnd, trimPathEnd, mTrimDirty);
} }
float getTrimPathOffset() const{ float getTrimPathOffset() const{
return mPrimitiveFields.trimPathOffset; return mPrimitiveFields.trimPathOffset;
} }
void setTrimPathOffset(float trimPathOffset) { void setTrimPathOffset(float trimPathOffset) {
VD_SET_PROP_WITH_FLAG(mPrimitiveFields.trimPathOffset, trimPathOffset, mTrimDirty); VD_SET_PRIMITIVE_FIELD_WITH_FLAG(trimPathOffset, trimPathOffset, mTrimDirty);
} }
float getStrokeMiterLimit() const { float getStrokeMiterLimit() const {
@@ -425,43 +425,43 @@ public:
return mPrimitiveFields.rotate; return mPrimitiveFields.rotate;
} }
void setRotation(float rotation) { void setRotation(float rotation) {
VD_SET_PROP_AND_NOTIFY(mPrimitiveFields.rotate, rotation); VD_SET_PRIMITIVE_FIELD_AND_NOTIFY(rotate, rotation);
} }
float getPivotX() const { float getPivotX() const {
return mPrimitiveFields.pivotX; return mPrimitiveFields.pivotX;
} }
void setPivotX(float pivotX) { void setPivotX(float pivotX) {
VD_SET_PROP_AND_NOTIFY(mPrimitiveFields.pivotX, pivotX); VD_SET_PRIMITIVE_FIELD_AND_NOTIFY(pivotX, pivotX);
} }
float getPivotY() const { float getPivotY() const {
return mPrimitiveFields.pivotY; return mPrimitiveFields.pivotY;
} }
void setPivotY(float pivotY) { void setPivotY(float pivotY) {
VD_SET_PROP_AND_NOTIFY(mPrimitiveFields.pivotY, pivotY); VD_SET_PRIMITIVE_FIELD_AND_NOTIFY(pivotY, pivotY);
} }
float getScaleX() const { float getScaleX() const {
return mPrimitiveFields.scaleX; return mPrimitiveFields.scaleX;
} }
void setScaleX(float scaleX) { void setScaleX(float scaleX) {
VD_SET_PROP_AND_NOTIFY(mPrimitiveFields.scaleX, scaleX); VD_SET_PRIMITIVE_FIELD_AND_NOTIFY(scaleX, scaleX);
} }
float getScaleY() const { float getScaleY() const {
return mPrimitiveFields.scaleY; return mPrimitiveFields.scaleY;
} }
void setScaleY(float scaleY) { void setScaleY(float scaleY) {
VD_SET_PROP_AND_NOTIFY(mPrimitiveFields.scaleY, scaleY); VD_SET_PRIMITIVE_FIELD_AND_NOTIFY(scaleY, scaleY);
} }
float getTranslateX() const { float getTranslateX() const {
return mPrimitiveFields.translateX; return mPrimitiveFields.translateX;
} }
void setTranslateX(float translateX) { void setTranslateX(float translateX) {
VD_SET_PROP_AND_NOTIFY(mPrimitiveFields.translateX, translateX); VD_SET_PRIMITIVE_FIELD_AND_NOTIFY(translateX, translateX);
} }
float getTranslateY() const { float getTranslateY() const {
return mPrimitiveFields.translateY; return mPrimitiveFields.translateY;
} }
void setTranslateY(float translateY) { void setTranslateY(float translateY) {
VD_SET_PROP_AND_NOTIFY(translateY, translateY); VD_SET_PRIMITIVE_FIELD_AND_NOTIFY(translateY, translateY);
} }
void updateProperties(float rotate, float pivotX, float pivotY, void updateProperties(float rotate, float pivotX, float pivotY,
float scaleX, float scaleY, float translateX, float translateY) { float scaleX, float scaleY, float translateX, float translateY) {

View File

@@ -390,5 +390,40 @@ TEST(VectorDrawable, matrixScale) {
EXPECT_EQ(matrixAndScale.matrixScale, actualMatrixScale); EXPECT_EQ(matrixAndScale.matrixScale, actualMatrixScale);
} }
} }
TEST(VectorDrawable, groupProperties) {
//TODO: Also need to test property sync and dirty flag when properties change.
VectorDrawable::Group group;
VectorDrawable::Group::GroupProperties* properties = group.mutateProperties();
// Test default values, change values through setters and verify the change through getters.
EXPECT_EQ(0.0f, properties->getTranslateX());
properties->setTranslateX(1.0f);
EXPECT_EQ(1.0f, properties->getTranslateX());
EXPECT_EQ(0.0f, properties->getTranslateY());
properties->setTranslateY(1.0f);
EXPECT_EQ(1.0f, properties->getTranslateY());
EXPECT_EQ(0.0f, properties->getRotation());
properties->setRotation(1.0f);
EXPECT_EQ(1.0f, properties->getRotation());
EXPECT_EQ(1.0f, properties->getScaleX());
properties->setScaleX(0.0f);
EXPECT_EQ(0.0f, properties->getScaleX());
EXPECT_EQ(1.0f, properties->getScaleY());
properties->setScaleY(0.0f);
EXPECT_EQ(0.0f, properties->getScaleY());
EXPECT_EQ(0.0f, properties->getPivotX());
properties->setPivotX(1.0f);
EXPECT_EQ(1.0f, properties->getPivotX());
EXPECT_EQ(0.0f, properties->getPivotY());
properties->setPivotY(1.0f);
EXPECT_EQ(1.0f, properties->getPivotY());
}
}; // namespace uirenderer }; // namespace uirenderer
}; // namespace android }; // namespace android