diff --git a/src/api-impl/android/graphics/drawable/BitmapDrawable.java b/src/api-impl/android/graphics/drawable/BitmapDrawable.java index d2689ff8..ffb74f5e 100644 --- a/src/api-impl/android/graphics/drawable/BitmapDrawable.java +++ b/src/api-impl/android/graphics/drawable/BitmapDrawable.java @@ -41,5 +41,5 @@ public class BitmapDrawable extends Drawable { a.recycle(); } - private static native long native_paintable_from_pixbuf(long pixbuf); + static native long native_paintable_from_pixbuf(long pixbuf); } diff --git a/src/api-impl/android/graphics/drawable/Drawable.java b/src/api-impl/android/graphics/drawable/Drawable.java index e5337ba2..2fd81562 100644 --- a/src/api-impl/android/graphics/drawable/Drawable.java +++ b/src/api-impl/android/graphics/drawable/Drawable.java @@ -134,6 +134,10 @@ public class Drawable { } else if ("ripple".equals(parser.getName())) { // FIXME: the non-pressed state of RippleDrawable should be equivalent to this return new ColorDrawable(0); + } else if ("vector".equals(parser.getName())) { + VectorDrawable drawable = new VectorDrawable(); + drawable.inflate(resources, parser, parser, null); + return drawable; } return null; } diff --git a/src/api-impl/android/graphics/drawable/VectorDrawable.java b/src/api-impl/android/graphics/drawable/VectorDrawable.java new file mode 100644 index 00000000..768c62d9 --- /dev/null +++ b/src/api-impl/android/graphics/drawable/VectorDrawable.java @@ -0,0 +1,56 @@ +package android.graphics.drawable; + +import java.io.IOException; + +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; + +import com.android.internal.R; + +import android.content.res.Resources; +import android.content.res.Resources.Theme; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.content.res.TypedArray; +import android.util.AttributeSet; + +public class VectorDrawable extends Drawable { + + public VectorDrawable() { + super(); + } + + public void inflate(Resources r, XmlPullParser parser, AttributeSet attrs, Theme theme) throws XmlPullParserException, IOException { + final int innerDepth = parser.getDepth() + 1; + int type; + TypedArray a = r.obtainAttributes(attrs, R.styleable.VectorDrawable); + int tint = a.getColor(R.styleable.VectorDrawable_tint, 0); + float viewportWidth = a.getFloat(R.styleable.VectorDrawable_viewportWidth, 24); + float viewportHeight = a.getFloat(R.styleable.VectorDrawable_viewportHeight, 24); + a.recycle(); + StringBuilder sb = new StringBuilder(); + sb.append(String.format("", + viewportWidth, viewportHeight, viewportWidth, viewportHeight)); + while ((type = parser.next()) != XmlPullParser.END_DOCUMENT + && (parser.getDepth() >= innerDepth + || type != XmlPullParser.END_TAG)) { + + if (type == XmlPullParser.START_TAG && parser.getName().equals("path")) { + a = r.obtainAttributes(attrs, R.styleable.VectorDrawablePath); + String pathData = a.getString(R.styleable.VectorDrawablePath_pathData); + int fillColor = tint != 0 ? tint : a.getColor(R.styleable.VectorDrawablePath_fillColor, 0); + int strokeColor = tint != 0 ? tint : a.getColor(R.styleable.VectorDrawablePath_strokeColor, 0); + float strokeWidth = a.getFloat(R.styleable.VectorDrawablePath_strokeWidth, 0); + a.recycle(); + sb.append(String.format("", + fillColor & 0xFFFFFF, (fillColor >> 24) & 0xFF, strokeColor & 0xFFFFFF, (strokeColor >> 24) & 0xFF, strokeWidth, pathData)); + } + } + sb.append(""); + String svg = sb.toString(); + byte[] bytes = svg.getBytes(); + Bitmap bm = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); + this.paintable = BitmapDrawable.native_paintable_from_pixbuf(bm.pixbuf); + } + +} diff --git a/src/api-impl/meson.build b/src/api-impl/meson.build index 3c632de6..03be365e 100644 --- a/src/api-impl/meson.build +++ b/src/api-impl/meson.build @@ -187,6 +187,7 @@ hax_jar = jar('hax', [ 'android/graphics/drawable/ScaleDrawable.java', 'android/graphics/drawable/ShapeDrawable.java', 'android/graphics/drawable/StateListDrawable.java', + 'android/graphics/drawable/VectorDrawable.java', 'android/graphics/drawable/shapes/OvalShape.java', 'android/graphics/drawable/shapes/Shape.java', 'android/hardware/ConsumerIrManager.java',