Merge "Copy native tree's property when mutate vector drawable" into nyc-dev

This commit is contained in:
Doris Liu
2016-05-27 22:16:59 +00:00
committed by Android (Google) Code Review
4 changed files with 28 additions and 3 deletions

View File

@@ -36,6 +36,13 @@ static jlong createTree(JNIEnv*, jobject, jlong groupPtr) {
return reinterpret_cast<jlong>(tree); return reinterpret_cast<jlong>(tree);
} }
static jlong createTreeFromCopy(JNIEnv*, jobject, jlong treePtr, jlong groupPtr) {
VectorDrawable::Group* rootGroup = reinterpret_cast<VectorDrawable::Group*>(groupPtr);
VectorDrawable::Tree* treeToCopy = reinterpret_cast<VectorDrawable::Tree*>(treePtr);
VectorDrawable::Tree* tree = new VectorDrawable::Tree(treeToCopy, rootGroup);
return reinterpret_cast<jlong>(tree);
}
static jlong createEmptyFullPath(JNIEnv*, jobject) { static jlong createEmptyFullPath(JNIEnv*, jobject) {
VectorDrawable::FullPath* newPath = new VectorDrawable::FullPath(); VectorDrawable::FullPath* newPath = new VectorDrawable::FullPath();
return reinterpret_cast<jlong>(newPath); return reinterpret_cast<jlong>(newPath);
@@ -344,6 +351,7 @@ static void setTrimPathOffset(JNIEnv*, jobject, jlong fullPathPtr, jfloat trimPa
static const JNINativeMethod gMethods[] = { static const JNINativeMethod gMethods[] = {
{"nCreateTree", "!(J)J", (void*)createTree}, {"nCreateTree", "!(J)J", (void*)createTree},
{"nCreateTreeFromCopy", "!(JJ)J", (void*)createTreeFromCopy},
{"nSetRendererViewportSize", "!(JFF)V", (void*)setTreeViewportSize}, {"nSetRendererViewportSize", "!(JFF)V", (void*)setTreeViewportSize},
{"nSetRootAlpha", "!(JF)Z", (void*)setRootAlpha}, {"nSetRootAlpha", "!(JF)Z", (void*)setRootAlpha},
{"nGetRootAlpha", "!(J)F", (void*)getRootAlpha}, {"nGetRootAlpha", "!(J)F", (void*)getRootAlpha},

View File

@@ -804,7 +804,7 @@ public class VectorDrawable extends Drawable {
mTintMode = copy.mTintMode; mTintMode = copy.mTintMode;
mAutoMirrored = copy.mAutoMirrored; mAutoMirrored = copy.mAutoMirrored;
mRootGroup = new VGroup(copy.mRootGroup, mVGTargetsMap); mRootGroup = new VGroup(copy.mRootGroup, mVGTargetsMap);
createNativeTree(mRootGroup); createNativeTreeFromCopy(copy, mRootGroup);
mBaseWidth = copy.mBaseWidth; mBaseWidth = copy.mBaseWidth;
mBaseHeight = copy.mBaseHeight; mBaseHeight = copy.mBaseHeight;
@@ -826,6 +826,16 @@ public class VectorDrawable extends Drawable {
VMRuntime.getRuntime().registerNativeAllocation(NATIVE_ALLOCATION_SIZE); VMRuntime.getRuntime().registerNativeAllocation(NATIVE_ALLOCATION_SIZE);
} }
// Create a new native tree with the given root group, and copy the properties from the
// given VectorDrawableState's native tree.
private void createNativeTreeFromCopy(VectorDrawableState copy, VGroup rootGroup) {
mNativeTree = new VirtualRefBasePtr(nCreateTreeFromCopy(
copy.mNativeTree.get(), rootGroup.mNativePtr));
// Register tree size
VMRuntime.getRuntime().registerNativeAllocation(NATIVE_ALLOCATION_SIZE);
}
void onTreeConstructionFinished() { void onTreeConstructionFinished() {
mRootGroup.setTree(mNativeTree); mRootGroup.setTree(mNativeTree);
mAllocationOfAllNodes = mRootGroup.getNativeSize(); mAllocationOfAllNodes = mRootGroup.getNativeSize();
@@ -1777,6 +1787,7 @@ public class VectorDrawable extends Drawable {
} }
private static native long nCreateTree(long rootGroupPtr); private static native long nCreateTree(long rootGroupPtr);
private static native long nCreateTreeFromCopy(long treeToCopy, long rootGroupPtr);
private static native void nSetRendererViewportSize(long rendererPtr, float viewportWidth, private static native void nSetRendererViewportSize(long rendererPtr, float viewportWidth,
float viewportHeight); float viewportHeight);
private static native boolean nSetRootAlpha(long rendererPtr, float alpha); private static native boolean nSetRootAlpha(long rendererPtr, float alpha);

View File

@@ -530,7 +530,7 @@ SkPaint* Tree::updatePaint(SkPaint* outPaint, TreeProperties* prop) {
if (prop->getRootAlpha() == 1.0f && prop->getColorFilter() == nullptr) { if (prop->getRootAlpha() == 1.0f && prop->getColorFilter() == nullptr) {
return nullptr; return nullptr;
} else { } else {
outPaint->setColorFilter(mStagingProperties.getColorFilter()); outPaint->setColorFilter(prop->getColorFilter());
outPaint->setFilterQuality(kLow_SkFilterQuality); outPaint->setFilterQuality(kLow_SkFilterQuality);
outPaint->setAlpha(prop->getRootAlpha() * 255); outPaint->setAlpha(prop->getRootAlpha() * 255);
return outPaint; return outPaint;

View File

@@ -542,6 +542,12 @@ public:
Tree(Group* rootNode) : mRootNode(rootNode) { Tree(Group* rootNode) : mRootNode(rootNode) {
mRootNode->setPropertyChangedListener(&mPropertyChangedListener); mRootNode->setPropertyChangedListener(&mPropertyChangedListener);
} }
// Copy properties from the tree and use the give node as the root node
Tree(const Tree* copy, Group* rootNode) : Tree(rootNode) {
mStagingProperties.syncAnimatableProperties(*copy->stagingProperties());
mStagingProperties.syncNonAnimatableProperties(*copy->stagingProperties());
}
// Draws the VD onto a bitmap cache, then the bitmap cache will be rendered onto the input // Draws the VD onto a bitmap cache, then the bitmap cache will be rendered onto the input
// canvas. Returns the number of pixels needed for the bitmap cache. // canvas. Returns the number of pixels needed for the bitmap cache.
int draw(Canvas* outCanvas, SkColorFilter* colorFilter, int draw(Canvas* outCanvas, SkColorFilter* colorFilter,
@@ -666,7 +672,7 @@ public:
}; };
void onPropertyChanged(TreeProperties* prop); void onPropertyChanged(TreeProperties* prop);
TreeProperties* mutateStagingProperties() { return &mStagingProperties; } TreeProperties* mutateStagingProperties() { return &mStagingProperties; }
const TreeProperties* stagingProperties() { return &mStagingProperties; } const TreeProperties* stagingProperties() const { return &mStagingProperties; }
PushStagingFunctor* getFunctor() { return &mFunctor;} PushStagingFunctor* getFunctor() { return &mFunctor;}
// This should only be called from animations on RT // This should only be called from animations on RT