blob: 0153f599738707ecd6f0ccf857ed333f0e67d079 [file] [log] [blame]
/*
* Copyright (C) 2014 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package org.robolectric.shadows;
import static android.os.Build.VERSION_CODES.N;
import static org.robolectric.shadows.ShadowVirtualRefBasePtr.get;
import static org.robolectric.shadows.ShadowVirtualRefBasePtr.put;
import android.graphics.drawable.VectorDrawable;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
@Implements(value = VectorDrawable.class, minSdk = N)
public class ShadowVectorDrawable extends ShadowDrawable {
// 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,
// float viewportHeight);
// private static native boolean nSetRootAlpha(long rendererPtr, float alpha);
// private static native float nGetRootAlpha(long rendererPtr);
// private static native void nSetAllowCaching(long rendererPtr, boolean allowCaching);
//
// private static native int nDraw(long rendererPtr, long canvasWrapperPtr,
// long colorFilterPtr, Rect bounds, boolean needsMirroring, boolean canReuseCache);
private static final int STROKE_WIDTH_INDEX = 0;
private static final int STROKE_COLOR_INDEX = 1;
private static final int STROKE_ALPHA_INDEX = 2;
private static final int FILL_COLOR_INDEX = 3;
private static final int FILL_ALPHA_INDEX = 4;
private static final int TRIM_PATH_START_INDEX = 5;
private static final int TRIM_PATH_END_INDEX = 6;
private static final int TRIM_PATH_OFFSET_INDEX = 7;
private static final int STROKE_LINE_CAP_INDEX = 8;
private static final int STROKE_LINE_JOIN_INDEX = 9;
private static final int STROKE_MITER_LIMIT_INDEX = 10;
private static final int FILL_TYPE_INDEX = 11;
private static final int TOTAL_PROPERTY_COUNT = 12;
private static class Path implements Cloneable {
float strokeWidth;
int strokeColor;
float strokeAlpha;
int fillColor;
float fillAlpha;
float trimPathStart;
float trimPathEnd;
float trimPathOffset;
int strokeLineCap;
int strokeLineJoin;
float strokeMiterLimit;
int fillType;
@Override
protected Object clone() {
try {
return super.clone();
} catch (CloneNotSupportedException e) {
throw new RuntimeException(e);
}
}
}
private static Path getPath(long pathPtr) {
return get(pathPtr, Path.class);
}
@Implementation
protected static long nCreateFullPath() {
return put(new Path());
}
@Implementation
protected static long nCreateFullPath(long nativeFullPathPtr) {
return put(getPath(nativeFullPathPtr).clone());
}
@Implementation
protected static boolean nGetFullPathProperties(long pathPtr, byte[] properties, int length) {
if (length != TOTAL_PROPERTY_COUNT * 4) return false;
Path path = getPath(pathPtr);
ByteBuffer propertiesBB = ByteBuffer.wrap(properties);
propertiesBB.order(ByteOrder.nativeOrder());
propertiesBB.putFloat(STROKE_WIDTH_INDEX * 4, path.strokeWidth);
propertiesBB.putInt(STROKE_COLOR_INDEX * 4, path.strokeColor);
propertiesBB.putFloat(STROKE_ALPHA_INDEX * 4, path.strokeAlpha);
propertiesBB.putInt(FILL_COLOR_INDEX * 4, path.fillColor);
propertiesBB.putFloat(FILL_ALPHA_INDEX * 4, path.fillAlpha);
propertiesBB.putFloat(TRIM_PATH_START_INDEX * 4, path.trimPathStart);
propertiesBB.putFloat(TRIM_PATH_END_INDEX * 4, path.trimPathEnd);
propertiesBB.putFloat(TRIM_PATH_OFFSET_INDEX * 4, path.trimPathOffset);
propertiesBB.putInt(STROKE_LINE_CAP_INDEX * 4, path.strokeLineCap);
propertiesBB.putInt(STROKE_LINE_JOIN_INDEX * 4, path.strokeLineJoin);
propertiesBB.putFloat(STROKE_MITER_LIMIT_INDEX * 4, path.strokeMiterLimit);
propertiesBB.putInt(FILL_TYPE_INDEX * 4, path.fillType);
return true;
}
@Implementation
protected static void nUpdateFullPathProperties(
long pathPtr,
float strokeWidth,
int strokeColor,
float strokeAlpha,
int fillColor,
float fillAlpha,
float trimPathStart,
float trimPathEnd,
float trimPathOffset,
float strokeMiterLimit,
int strokeLineCap,
int strokeLineJoin,
int fillType) {
Path path = getPath(pathPtr);
path.strokeWidth = strokeWidth;
path.strokeColor = strokeColor;
path.strokeAlpha = strokeAlpha;
path.fillColor = fillColor;
path.fillAlpha = fillAlpha;
path.trimPathStart = trimPathStart;
path.trimPathEnd = trimPathEnd;
path.trimPathOffset = trimPathOffset;
path.strokeLineCap = strokeLineCap;
path.strokeLineJoin = strokeLineJoin;
path.strokeMiterLimit = strokeMiterLimit;
path.fillType = fillType;
}
// @Implementation
// public static void nUpdateFullPathFillGradient(long pathPtr, long fillGradientPtr) {
//
// }
//
// @Implementation
// public static void nUpdateFullPathStrokeGradient(long pathPtr, long strokeGradientPtr) {
//
// }
//
// private static native long nCreateClipPath();
// private static native long nCreateClipPath(long clipPathPtr);
static class Group implements Cloneable {
float rotation;
float pivotX;
float pivotY;
float scaleX;
float scaleY;
float translateX;
float translateY;
@Override
protected Object clone() {
try {
return super.clone();
} catch (CloneNotSupportedException e) {
throw new RuntimeException(e);
}
}
}
private static Group getGroup(long groupPtr) {
return get(groupPtr, Group.class);
}
@Implementation
protected static long nCreateGroup() {
return put(new Group());
}
@Implementation
protected static long nCreateGroup(long groupPtr) {
return put(getGroup(groupPtr).clone());
}
// public static void nSetName(long nodePtr, String name) {
// }
@Implementation
protected static boolean nGetGroupProperties(long groupPtr, float[] properties, int length) {
if (length != 7) return false;
Group group = getGroup(groupPtr);
properties[0] = group.rotation;
properties[1] = group.pivotX;
properties[2] = group.pivotY;
properties[3] = group.scaleX;
properties[4] = group.scaleY;
properties[5] = group.translateX;
properties[6] = group.translateY;
return true;
}
@Implementation
protected static void nUpdateGroupProperties(
long groupPtr,
float rotate,
float pivotX,
float pivotY,
float scaleX,
float scaleY,
float translateX,
float translateY) {
Group group = getGroup(groupPtr);
group.rotation = rotate;
group.pivotX = pivotX;
group.pivotY = pivotY;
group.scaleX = scaleX;
group.scaleY = scaleY;
group.translateX = translateX;
group.translateY = translateY;
}
// private static native void nAddChild(long groupPtr, long nodePtr);
// private static native void nSetPathString(long pathPtr, String pathString, int length);
//
// /**
// * The setters and getters below for paths and groups are here temporarily, and will be
// * removed once the animation in AVD is replaced with RenderNodeAnimator, in which case the
// * animation will modify these properties in native. By then no JNI hopping would be necessary
// * for VD during animation, and these setters and getters will be obsolete.
// */
// // Setters and getters during animation.
// private static native float nGetRotation(long groupPtr);
// private static native void nSetRotation(long groupPtr, float rotation);
// private static native float nGetPivotX(long groupPtr);
// private static native void nSetPivotX(long groupPtr, float pivotX);
// private static native float nGetPivotY(long groupPtr);
// private static native void nSetPivotY(long groupPtr, float pivotY);
// private static native float nGetScaleX(long groupPtr);
// private static native void nSetScaleX(long groupPtr, float scaleX);
// private static native float nGetScaleY(long groupPtr);
// private static native void nSetScaleY(long groupPtr, float scaleY);
// private static native float nGetTranslateX(long groupPtr);
// private static native void nSetTranslateX(long groupPtr, float translateX);
// private static native float nGetTranslateY(long groupPtr);
// private static native void nSetTranslateY(long groupPtr, float translateY);
//
// // Setters and getters for VPath during animation.
// private static native void nSetPathData(long pathPtr, long pathDataPtr);
// private static native float nGetStrokeWidth(long pathPtr);
// private static native void nSetStrokeWidth(long pathPtr, float width);
// private static native int nGetStrokeColor(long pathPtr);
// private static native void nSetStrokeColor(long pathPtr, int strokeColor);
// private static native float nGetStrokeAlpha(long pathPtr);
// private static native void nSetStrokeAlpha(long pathPtr, float alpha);
// private static native int nGetFillColor(long pathPtr);
// private static native void nSetFillColor(long pathPtr, int fillColor);
// private static native float nGetFillAlpha(long pathPtr);
// private static native void nSetFillAlpha(long pathPtr, float fillAlpha);
// private static native float nGetTrimPathStart(long pathPtr);
// private static native void nSetTrimPathStart(long pathPtr, float trimPathStart);
// private static native float nGetTrimPathEnd(long pathPtr);
// private static native void nSetTrimPathEnd(long pathPtr, float trimPathEnd);
// private static native float nGetTrimPathOffset(long pathPtr);
// private static native void nSetTrimPathOffset(long pathPtr, float trimPathOffset);
}