diff --git a/tools/layoutlib/bridge/.classpath b/tools/layoutlib/bridge/.classpath index 2eaf8e3e7ab5b..5cfda29ae2e98 100644 --- a/tools/layoutlib/bridge/.classpath +++ b/tools/layoutlib/bridge/.classpath @@ -8,6 +8,6 @@ - + diff --git a/tools/layoutlib/bridge/Android.mk b/tools/layoutlib/bridge/Android.mk index ca7db8ccd63e4..7e70f330b7d9d 100644 --- a/tools/layoutlib/bridge/Android.mk +++ b/tools/layoutlib/bridge/Android.mk @@ -23,7 +23,7 @@ LOCAL_JAVA_RESOURCE_DIRS := resources LOCAL_JAVA_LIBRARIES := \ kxml2-2.3.0 \ layoutlib_api-prebuilt \ - common-prebuilt + tools-common-prebuilt LOCAL_STATIC_JAVA_LIBRARIES := \ temp_layoutlib \ diff --git a/tools/layoutlib/bridge/resources/bars/phone_system_bar.xml b/tools/layoutlib/bridge/resources/bars/phone_system_bar.xml index 5211b0a9b6e04..d3c492eacf43a 100644 --- a/tools/layoutlib/bridge/resources/bars/phone_system_bar.xml +++ b/tools/layoutlib/bridge/resources/bars/phone_system_bar.xml @@ -9,5 +9,7 @@ android:layout_width="wrap_content"/> + android:layout_width="wrap_content" + android:layout_marginLeft="3dip" + android:layout_marginRight="5dip"/> diff --git a/tools/layoutlib/bridge/src/android/animation/PropertyValuesHolder_Delegate.java b/tools/layoutlib/bridge/src/android/animation/PropertyValuesHolder_Delegate.java index 7d41d1c90d5ec..7b444aadb3037 100644 --- a/tools/layoutlib/bridge/src/android/animation/PropertyValuesHolder_Delegate.java +++ b/tools/layoutlib/bridge/src/android/animation/PropertyValuesHolder_Delegate.java @@ -17,6 +17,7 @@ package android.animation; import com.android.layoutlib.bridge.impl.DelegateManager; +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; /** * Delegate implementing the native methods of android.animation.PropertyValuesHolder @@ -34,20 +35,24 @@ import com.android.layoutlib.bridge.impl.DelegateManager; */ /*package*/ class PropertyValuesHolder_Delegate { + @LayoutlibDelegate /*package*/ static int nGetIntMethod(Class targetClass, String methodName) { // return 0 to force PropertyValuesHolder to use Java reflection. return 0; } + @LayoutlibDelegate /*package*/ static int nGetFloatMethod(Class targetClass, String methodName) { // return 0 to force PropertyValuesHolder to use Java reflection. return 0; } + @LayoutlibDelegate /*package*/ static void nCallIntMethod(Object target, int methodID, int arg) { // do nothing } + @LayoutlibDelegate /*package*/ static void nCallFloatMethod(Object target, int methodID, float arg) { // do nothing } diff --git a/tools/layoutlib/bridge/src/android/app/Fragment_Delegate.java b/tools/layoutlib/bridge/src/android/app/Fragment_Delegate.java index 60ad645c89675..aabd3f1fbd4ed 100644 --- a/tools/layoutlib/bridge/src/android/app/Fragment_Delegate.java +++ b/tools/layoutlib/bridge/src/android/app/Fragment_Delegate.java @@ -17,6 +17,7 @@ package android.app; import com.android.ide.common.rendering.api.IProjectCallback; +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; import android.content.Context; import android.os.Bundle; @@ -48,6 +49,7 @@ public class Fragment_Delegate { * Like {@link #instantiate(Context, String, Bundle)} but with a null * argument Bundle. */ + @LayoutlibDelegate /*package*/ static Fragment instantiate(Context context, String fname) { return instantiate(context, fname, null); } @@ -66,6 +68,7 @@ public class Fragment_Delegate { * the given fragment class. This is a runtime exception; it is not * normally expected to happen. */ + @LayoutlibDelegate /*package*/ static Fragment instantiate(Context context, String fname, Bundle args) { try { if (sProjectCallback != null) { diff --git a/tools/layoutlib/bridge/src/android/content/res/Resources_Theme_Delegate.java b/tools/layoutlib/bridge/src/android/content/res/Resources_Theme_Delegate.java index 03f39801d3b10..413894b026677 100644 --- a/tools/layoutlib/bridge/src/android/content/res/Resources_Theme_Delegate.java +++ b/tools/layoutlib/bridge/src/android/content/res/Resources_Theme_Delegate.java @@ -17,6 +17,7 @@ package android.content.res; import com.android.layoutlib.bridge.impl.RenderSessionImpl; +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; import android.content.res.Resources.NotFoundException; import android.content.res.Resources.Theme; @@ -32,12 +33,14 @@ import android.util.TypedValue; */ public class Resources_Theme_Delegate { + @LayoutlibDelegate /*package*/ static TypedArray obtainStyledAttributes( Resources thisResources, Theme thisTheme, int[] attrs) { return RenderSessionImpl.getCurrentContext().obtainStyledAttributes(attrs); } + @LayoutlibDelegate /*package*/ static TypedArray obtainStyledAttributes( Resources thisResources, Theme thisTheme, int resid, int[] attrs) @@ -45,6 +48,7 @@ public class Resources_Theme_Delegate { return RenderSessionImpl.getCurrentContext().obtainStyledAttributes(resid, attrs); } + @LayoutlibDelegate /*package*/ static TypedArray obtainStyledAttributes( Resources thisResources, Theme thisTheme, AttributeSet set, int[] attrs, int defStyleAttr, int defStyleRes) { @@ -52,6 +56,7 @@ public class Resources_Theme_Delegate { set, attrs, defStyleAttr, defStyleRes); } + @LayoutlibDelegate /*package*/ static boolean resolveAttribute( Resources thisResources, Theme thisTheme, int resid, TypedValue outValue, diff --git a/tools/layoutlib/bridge/src/android/graphics/AvoidXfermode_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/AvoidXfermode_Delegate.java index 190eb37d15bb7..a50a2bd039f56 100644 --- a/tools/layoutlib/bridge/src/android/graphics/AvoidXfermode_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/AvoidXfermode_Delegate.java @@ -17,6 +17,7 @@ package android.graphics; import com.android.layoutlib.bridge.impl.DelegateManager; +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; import java.awt.Composite; @@ -59,9 +60,10 @@ public class AvoidXfermode_Delegate extends Xfermode_Delegate { // ---- native methods ---- + @LayoutlibDelegate /*package*/ static int nativeCreate(int opColor, int tolerance, int nativeMode) { AvoidXfermode_Delegate newDelegate = new AvoidXfermode_Delegate(); - return sManager.addDelegate(newDelegate); + return sManager.addNewDelegate(newDelegate); } // ---- Private delegate/helper methods ---- diff --git a/tools/layoutlib/bridge/src/android/graphics/BitmapFactory_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/BitmapFactory_Delegate.java index c4fffc86ae360..080b85f743d45 100644 --- a/tools/layoutlib/bridge/src/android/graphics/BitmapFactory_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/BitmapFactory_Delegate.java @@ -21,6 +21,7 @@ import com.android.layoutlib.bridge.android.BridgeResources.NinePatchInputStream import com.android.layoutlib.bridge.impl.DelegateManager; import com.android.ninepatch.NinePatchChunk; import com.android.resources.Density; +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; import android.graphics.BitmapFactory.Options; @@ -42,6 +43,7 @@ import java.io.InputStream; // ------ Java delegates ------ + @LayoutlibDelegate /*package*/ static Bitmap finishDecode(Bitmap bm, Rect outPadding, Options opts) { if (bm == null || opts == null) { return bm; @@ -82,10 +84,12 @@ import java.io.InputStream; // ------ Native Delegates ------ + @LayoutlibDelegate /*package*/ static void nativeSetDefaultConfig(int nativeConfig) { // pass } + @LayoutlibDelegate /*package*/ static Bitmap nativeDecodeStream(InputStream is, byte[] storage, Rect padding, Options opts) { Bitmap bm = null; @@ -129,29 +133,34 @@ import java.io.InputStream; return bm; } + @LayoutlibDelegate /*package*/ static Bitmap nativeDecodeFileDescriptor(FileDescriptor fd, Rect padding, Options opts) { opts.inBitmap = null; return null; } + @LayoutlibDelegate /*package*/ static Bitmap nativeDecodeAsset(int asset, Rect padding, Options opts) { opts.inBitmap = null; return null; } + @LayoutlibDelegate /*package*/ static Bitmap nativeDecodeByteArray(byte[] data, int offset, int length, Options opts) { opts.inBitmap = null; return null; } + @LayoutlibDelegate /*package*/ static byte[] nativeScaleNinePatch(byte[] chunk, float scale, Rect pad) { // don't scale for now. This should not be called anyway since we re-implement // BitmapFactory.finishDecode(); return chunk; } + @LayoutlibDelegate /*package*/ static boolean nativeIsSeekable(FileDescriptor fd) { return true; } diff --git a/tools/layoutlib/bridge/src/android/graphics/BitmapShader_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/BitmapShader_Delegate.java index 73c5a1aceab49..9a8cf04621313 100644 --- a/tools/layoutlib/bridge/src/android/graphics/BitmapShader_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/BitmapShader_Delegate.java @@ -19,6 +19,7 @@ package android.graphics; import com.android.ide.common.rendering.api.LayoutLog; import com.android.layoutlib.bridge.Bridge; import com.android.layoutlib.bridge.impl.DelegateManager; +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; import android.graphics.Shader.TileMode; @@ -63,6 +64,7 @@ public class BitmapShader_Delegate extends Shader_Delegate { // ---- native methods ---- + @LayoutlibDelegate /*package*/ static int nativeCreate(int native_bitmap, int shaderTileModeX, int shaderTileModeY) { Bitmap_Delegate bitmap = Bitmap_Delegate.getDelegate(native_bitmap); @@ -74,9 +76,10 @@ public class BitmapShader_Delegate extends Shader_Delegate { bitmap.getImage(), Shader_Delegate.getTileMode(shaderTileModeX), Shader_Delegate.getTileMode(shaderTileModeY)); - return sManager.addDelegate(newDelegate); + return sManager.addNewDelegate(newDelegate); } + @LayoutlibDelegate /*package*/ static int nativePostCreate(int native_shader, int native_bitmap, int shaderTileModeX, int shaderTileModeY) { // pass, not needed. diff --git a/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java index 3e80614070177..66e59d8655340 100644 --- a/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java @@ -20,6 +20,7 @@ import com.android.ide.common.rendering.api.LayoutLog; import com.android.layoutlib.bridge.Bridge; import com.android.layoutlib.bridge.impl.DelegateManager; import com.android.resources.Density; +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; @@ -53,7 +54,7 @@ public final class Bitmap_Delegate { // ---- delegate manager ---- private static final DelegateManager sManager = - new DelegateManager(); + new DelegateManager(Bitmap_Delegate.class); // ---- delegate helper data ---- @@ -196,6 +197,7 @@ public final class Bitmap_Delegate { // ---- native methods ---- + @LayoutlibDelegate /*package*/ static Bitmap nativeCreate(int[] colors, int offset, int stride, int width, int height, int nativeConfig, boolean mutable) { int imageType = getBufferedImageType(nativeConfig); @@ -213,6 +215,7 @@ public final class Bitmap_Delegate { return createBitmap(delegate, mutable, Bitmap.getDefaultDensity()); } + @LayoutlibDelegate /*package*/ static Bitmap nativeCopy(int srcBitmap, int nativeConfig, boolean isMutable) { Bitmap_Delegate srcBmpDelegate = sManager.getDelegate(srcBitmap); if (srcBmpDelegate == null) { @@ -240,14 +243,17 @@ public final class Bitmap_Delegate { return createBitmap(delegate, isMutable, Bitmap.getDefaultDensity()); } + @LayoutlibDelegate /*package*/ static void nativeDestructor(int nativeBitmap) { - sManager.removeDelegate(nativeBitmap); + sManager.removeJavaReferenceFor(nativeBitmap); } + @LayoutlibDelegate /*package*/ static void nativeRecycle(int nativeBitmap) { - sManager.removeDelegate(nativeBitmap); + sManager.removeJavaReferenceFor(nativeBitmap); } + @LayoutlibDelegate /*package*/ static boolean nativeCompress(int nativeBitmap, int format, int quality, OutputStream stream, byte[] tempStorage) { Bridge.getLog().error(LayoutLog.TAG_UNSUPPORTED, @@ -255,6 +261,7 @@ public final class Bitmap_Delegate { return true; } + @LayoutlibDelegate /*package*/ static void nativeErase(int nativeBitmap, int color) { // get the delegate from the native int. Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); @@ -274,6 +281,7 @@ public final class Bitmap_Delegate { } } + @LayoutlibDelegate /*package*/ static int nativeWidth(int nativeBitmap) { // get the delegate from the native int. Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); @@ -284,6 +292,7 @@ public final class Bitmap_Delegate { return delegate.mImage.getWidth(); } + @LayoutlibDelegate /*package*/ static int nativeHeight(int nativeBitmap) { // get the delegate from the native int. Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); @@ -294,6 +303,7 @@ public final class Bitmap_Delegate { return delegate.mImage.getHeight(); } + @LayoutlibDelegate /*package*/ static int nativeRowBytes(int nativeBitmap) { // get the delegate from the native int. Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); @@ -304,6 +314,7 @@ public final class Bitmap_Delegate { return delegate.mImage.getWidth(); } + @LayoutlibDelegate /*package*/ static int nativeConfig(int nativeBitmap) { // get the delegate from the native int. Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); @@ -314,6 +325,7 @@ public final class Bitmap_Delegate { return delegate.mConfig.nativeInt; } + @LayoutlibDelegate /*package*/ static boolean nativeHasAlpha(int nativeBitmap) { // get the delegate from the native int. Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); @@ -324,6 +336,7 @@ public final class Bitmap_Delegate { return delegate.mHasAlpha; } + @LayoutlibDelegate /*package*/ static int nativeGetPixel(int nativeBitmap, int x, int y) { // get the delegate from the native int. Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); @@ -334,6 +347,7 @@ public final class Bitmap_Delegate { return delegate.mImage.getRGB(x, y); } + @LayoutlibDelegate /*package*/ static void nativeGetPixels(int nativeBitmap, int[] pixels, int offset, int stride, int x, int y, int width, int height) { Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); @@ -345,6 +359,7 @@ public final class Bitmap_Delegate { } + @LayoutlibDelegate /*package*/ static void nativeSetPixel(int nativeBitmap, int x, int y, int color) { Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); if (delegate == null) { @@ -354,6 +369,7 @@ public final class Bitmap_Delegate { delegate.getImage().setRGB(x, y, color); } + @LayoutlibDelegate /*package*/ static void nativeSetPixels(int nativeBitmap, int[] colors, int offset, int stride, int x, int y, int width, int height) { Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); @@ -364,16 +380,21 @@ public final class Bitmap_Delegate { delegate.getImage().setRGB(x, y, width, height, colors, offset, stride); } + @LayoutlibDelegate /*package*/ static void nativeCopyPixelsToBuffer(int nativeBitmap, Buffer dst) { // FIXME implement native delegate - throw new UnsupportedOperationException("Native delegate needed for Bitmap.nativeCopyPixelsToBuffer"); + Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED, + "Bitmap.copyPixelsToBuffer is not supported.", null, null /*data*/); } + @LayoutlibDelegate /*package*/ static void nativeCopyPixelsFromBuffer(int nb, Buffer src) { // FIXME implement native delegate - throw new UnsupportedOperationException("Native delegate needed for Bitmap.nativeCopyPixelsFromBuffer"); + Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED, + "Bitmap.copyPixelsFromBuffer is not supported.", null, null /*data*/); } + @LayoutlibDelegate /*package*/ static int nativeGenerationId(int nativeBitmap) { Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); if (delegate == null) { @@ -383,6 +404,7 @@ public final class Bitmap_Delegate { return delegate.mGenerationId; } + @LayoutlibDelegate /*package*/ static Bitmap nativeCreateFromParcel(Parcel p) { // This is only called by Bitmap.CREATOR (Parcelable.Creator), which is only // used during aidl call so really this should not be called. @@ -392,6 +414,7 @@ public final class Bitmap_Delegate { return null; } + @LayoutlibDelegate /*package*/ static boolean nativeWriteToParcel(int nativeBitmap, boolean isMutable, int density, Parcel p) { // This is only called when sending a bitmap through aidl, so really this should not @@ -402,6 +425,7 @@ public final class Bitmap_Delegate { return false; } + @LayoutlibDelegate /*package*/ static Bitmap nativeExtractAlpha(int nativeBitmap, int nativePaint, int[] offsetXY) { Bitmap_Delegate bitmap = sManager.getDelegate(nativeBitmap); @@ -429,10 +453,12 @@ public final class Bitmap_Delegate { Density.DEFAULT_DENSITY /*density*/); } + @LayoutlibDelegate /*package*/ static void nativePrepareToDraw(int nativeBitmap) { // nothing to be done here. } + @LayoutlibDelegate /*package*/ static void nativeSetHasAlpha(int nativeBitmap, boolean hasAlpha) { // get the delegate from the native int. Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); @@ -443,6 +469,7 @@ public final class Bitmap_Delegate { delegate.mHasAlpha = hasAlpha; } + @LayoutlibDelegate /*package*/ static boolean nativeSameAs(int nb0, int nb1) { Bitmap_Delegate delegate1 = sManager.getDelegate(nb0); if (delegate1 == null) { @@ -495,7 +522,7 @@ public final class Bitmap_Delegate { private static Bitmap createBitmap(Bitmap_Delegate delegate, boolean isMutable, int density) { // get its native_int - int nativeInt = sManager.addDelegate(delegate); + int nativeInt = sManager.addNewDelegate(delegate); // and create/return a new Bitmap with it return new Bitmap(nativeInt, null /* buffer */, isMutable, null /*ninePatchChunk*/, density); diff --git a/tools/layoutlib/bridge/src/android/graphics/BlurMaskFilter_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/BlurMaskFilter_Delegate.java index 34824b425fbfc..4becba130127e 100644 --- a/tools/layoutlib/bridge/src/android/graphics/BlurMaskFilter_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/BlurMaskFilter_Delegate.java @@ -17,6 +17,7 @@ package android.graphics; import com.android.layoutlib.bridge.impl.DelegateManager; +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; /** * Delegate implementing the native methods of android.graphics.BlurMaskFilter @@ -53,9 +54,10 @@ public class BlurMaskFilter_Delegate extends MaskFilter_Delegate { // ---- native methods ---- + @LayoutlibDelegate /*package*/ static int nativeConstructor(float radius, int style) { BlurMaskFilter_Delegate newDelegate = new BlurMaskFilter_Delegate(); - return sManager.addDelegate(newDelegate); + return sManager.addNewDelegate(newDelegate); } // ---- Private delegate/helper methods ---- diff --git a/tools/layoutlib/bridge/src/android/graphics/Canvas_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Canvas_Delegate.java index 5a6902c074dc9..4decd1a515e17 100644 --- a/tools/layoutlib/bridge/src/android/graphics/Canvas_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/Canvas_Delegate.java @@ -20,6 +20,7 @@ import com.android.ide.common.rendering.api.LayoutLog; import com.android.layoutlib.bridge.Bridge; import com.android.layoutlib.bridge.impl.DelegateManager; import com.android.layoutlib.bridge.impl.GcSnapshot; +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; import android.graphics.Bitmap.Config; import android.graphics.Paint_Delegate.FontInfo; @@ -53,7 +54,7 @@ public final class Canvas_Delegate { // ---- delegate manager ---- private static final DelegateManager sManager = - new DelegateManager(); + new DelegateManager(Canvas_Delegate.class); // ---- delegate helper data ---- @@ -63,7 +64,7 @@ public final class Canvas_Delegate { private Bitmap_Delegate mBitmap; private GcSnapshot mSnapshot; - private int mDrawFilter = 0; + private DrawFilter_Delegate mDrawFilter = null; // ---- Public Helper methods ---- @@ -94,11 +95,12 @@ public final class Canvas_Delegate { * @return the delegate or null. */ public DrawFilter_Delegate getDrawFilter() { - return DrawFilter_Delegate.getDelegate(mDrawFilter); + return mDrawFilter; } // ---- native methods ---- + @LayoutlibDelegate /*package*/ static boolean isOpaque(Canvas thisCanvas) { // get the delegate from the native int. Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas); @@ -109,6 +111,7 @@ public final class Canvas_Delegate { return canvasDelegate.mBitmap.getConfig() == Config.RGB_565; } + @LayoutlibDelegate /*package*/ static int getWidth(Canvas thisCanvas) { // get the delegate from the native int. Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas); @@ -119,6 +122,7 @@ public final class Canvas_Delegate { return canvasDelegate.mBitmap.getImage().getWidth(); } + @LayoutlibDelegate /*package*/ static int getHeight(Canvas thisCanvas) { // get the delegate from the native int. Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas); @@ -129,7 +133,8 @@ public final class Canvas_Delegate { return canvasDelegate.mBitmap.getImage().getHeight(); } - /*package*/ static void translate(Canvas thisCanvas, float dx, float dy) { + @LayoutlibDelegate + /*package*/ static void translate(Canvas thisCanvas, float dx, float dy) { // get the delegate from the native int. Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas); if (canvasDelegate == null) { @@ -139,6 +144,7 @@ public final class Canvas_Delegate { canvasDelegate.getSnapshot().translate(dx, dy); } + @LayoutlibDelegate /*package*/ static void rotate(Canvas thisCanvas, float degrees) { // get the delegate from the native int. Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas); @@ -149,7 +155,8 @@ public final class Canvas_Delegate { canvasDelegate.getSnapshot().rotate(Math.toRadians(degrees)); } - /*package*/ static void scale(Canvas thisCanvas, float sx, float sy) { + @LayoutlibDelegate + /*package*/ static void scale(Canvas thisCanvas, float sx, float sy) { // get the delegate from the native int. Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas); if (canvasDelegate == null) { @@ -159,7 +166,8 @@ public final class Canvas_Delegate { canvasDelegate.getSnapshot().scale(sx, sy); } - /*package*/ static void skew(Canvas thisCanvas, float kx, float ky) { + @LayoutlibDelegate + /*package*/ static void skew(Canvas thisCanvas, float kx, float ky) { // get the delegate from the native int. Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas); if (canvasDelegate == null) { @@ -182,15 +190,18 @@ public final class Canvas_Delegate { g.setTransform(currentTx); } + @LayoutlibDelegate /*package*/ static boolean clipRect(Canvas thisCanvas, RectF rect) { return clipRect(thisCanvas, rect.left, rect.top, rect.right, rect.bottom); } + @LayoutlibDelegate /*package*/ static boolean clipRect(Canvas thisCanvas, Rect rect) { return clipRect(thisCanvas, (float) rect.left, (float) rect.top, (float) rect.right, (float) rect.bottom); } + @LayoutlibDelegate /*package*/ static boolean clipRect(Canvas thisCanvas, float left, float top, float right, float bottom) { // get the delegate from the native int. @@ -202,16 +213,19 @@ public final class Canvas_Delegate { return canvasDelegate.clipRect(left, top, right, bottom, Region.Op.INTERSECT.nativeInt); } + @LayoutlibDelegate /*package*/ static boolean clipRect(Canvas thisCanvas, int left, int top, int right, int bottom) { return clipRect(thisCanvas, (float) left, (float) top, (float) right, (float) bottom); } + @LayoutlibDelegate /*package*/ static int save(Canvas thisCanvas) { return save(thisCanvas, Canvas.MATRIX_SAVE_FLAG | Canvas.CLIP_SAVE_FLAG); } + @LayoutlibDelegate /*package*/ static int save(Canvas thisCanvas, int saveFlags) { // get the delegate from the native int. Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas); @@ -222,6 +236,7 @@ public final class Canvas_Delegate { return canvasDelegate.save(saveFlags); } + @LayoutlibDelegate /*package*/ static void restore(Canvas thisCanvas) { // get the delegate from the native int. Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas); @@ -232,6 +247,7 @@ public final class Canvas_Delegate { canvasDelegate.restore(); } + @LayoutlibDelegate /*package*/ static int getSaveCount(Canvas thisCanvas) { // get the delegate from the native int. Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas); @@ -242,6 +258,7 @@ public final class Canvas_Delegate { return canvasDelegate.getSnapshot().size(); } + @LayoutlibDelegate /*package*/ static void restoreToCount(Canvas thisCanvas, int saveCount) { // get the delegate from the native int. Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas); @@ -252,17 +269,22 @@ public final class Canvas_Delegate { canvasDelegate.restoreTo(saveCount); } + @LayoutlibDelegate /*package*/ static void drawPoints(Canvas thisCanvas, float[] pts, int offset, int count, Paint paint) { // FIXME - throw new UnsupportedOperationException(); + Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED, + "Canvas.drawPoint is not supported.", null, null /*data*/); } + @LayoutlibDelegate /*package*/ static void drawPoint(Canvas thisCanvas, float x, float y, Paint paint) { // FIXME - throw new UnsupportedOperationException(); + Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED, + "Canvas.drawPoint is not supported.", null, null /*data*/); } + @LayoutlibDelegate /*package*/ static void drawLines(Canvas thisCanvas, final float[] pts, final int offset, final int count, Paint paint) { @@ -277,10 +299,12 @@ public final class Canvas_Delegate { }); } + @LayoutlibDelegate /*package*/ static void freeCaches() { // nothing to be done here. } + @LayoutlibDelegate /*package*/ static int initRaster(int nativeBitmapOrZero) { if (nativeBitmapOrZero > 0) { // get the Bitmap from the int @@ -289,15 +313,16 @@ public final class Canvas_Delegate { // create a new Canvas_Delegate with the given bitmap and return its new native int. Canvas_Delegate newDelegate = new Canvas_Delegate(bitmapDelegate); - return sManager.addDelegate(newDelegate); + return sManager.addNewDelegate(newDelegate); } else { // create a new Canvas_Delegate and return its new native int. Canvas_Delegate newDelegate = new Canvas_Delegate(); - return sManager.addDelegate(newDelegate); + return sManager.addNewDelegate(newDelegate); } } + @LayoutlibDelegate /*package*/ static void native_setBitmap(int nativeCanvas, int bitmap) { // get the delegate from the native int. Canvas_Delegate canvasDelegate = sManager.getDelegate(nativeCanvas); @@ -314,6 +339,7 @@ public final class Canvas_Delegate { canvasDelegate.setBitmap(bitmapDelegate); } + @LayoutlibDelegate /*package*/ static int native_saveLayer(int nativeCanvas, RectF bounds, int paint, int layerFlags) { // get the delegate from the native int. @@ -330,6 +356,7 @@ public final class Canvas_Delegate { return canvasDelegate.saveLayer(bounds, paintDelegate, layerFlags); } + @LayoutlibDelegate /*package*/ static int native_saveLayer(int nativeCanvas, float l, float t, float r, float b, int paint, int layerFlags) { @@ -348,6 +375,7 @@ public final class Canvas_Delegate { paintDelegate, layerFlags); } + @LayoutlibDelegate /*package*/ static int native_saveLayerAlpha(int nativeCanvas, RectF bounds, int alpha, int layerFlags) { @@ -360,6 +388,7 @@ public final class Canvas_Delegate { return canvasDelegate.saveLayerAlpha(bounds, alpha, layerFlags); } + @LayoutlibDelegate /*package*/ static int native_saveLayerAlpha(int nativeCanvas, float l, float t, float r, float b, int alpha, int layerFlags) { @@ -373,6 +402,7 @@ public final class Canvas_Delegate { } + @LayoutlibDelegate /*package*/ static void native_concat(int nCanvas, int nMatrix) { // get the delegate from the native int. Canvas_Delegate canvasDelegate = sManager.getDelegate(nCanvas); @@ -400,6 +430,7 @@ public final class Canvas_Delegate { snapshot.setTransform(currentTx); } + @LayoutlibDelegate /*package*/ static void native_setMatrix(int nCanvas, int nMatrix) { // get the delegate from the native int. Canvas_Delegate canvasDelegate = sManager.getDelegate(nCanvas); @@ -429,6 +460,7 @@ public final class Canvas_Delegate { } } + @LayoutlibDelegate /*package*/ static boolean native_clipRect(int nCanvas, float left, float top, float right, float bottom, @@ -443,6 +475,7 @@ public final class Canvas_Delegate { return canvasDelegate.clipRect(left, top, right, bottom, regionOp); } + @LayoutlibDelegate /*package*/ static boolean native_clipPath(int nativeCanvas, int nativePath, int regionOp) { @@ -459,6 +492,7 @@ public final class Canvas_Delegate { return canvasDelegate.mSnapshot.clip(pathDelegate.getJavaShape(), regionOp); } + @LayoutlibDelegate /*package*/ static boolean native_clipRegion(int nativeCanvas, int nativeRegion, int regionOp) { @@ -475,29 +509,23 @@ public final class Canvas_Delegate { return canvasDelegate.mSnapshot.clip(region.getJavaArea(), regionOp); } - /*package*/ static void nativeSetDrawFilter(int nativeCanvas, - int nativeFilter) { + @LayoutlibDelegate + /*package*/ static void nativeSetDrawFilter(int nativeCanvas, int nativeFilter) { Canvas_Delegate canvasDelegate = sManager.getDelegate(nativeCanvas); if (canvasDelegate == null) { return; } - canvasDelegate.mDrawFilter = nativeFilter; + canvasDelegate.mDrawFilter = DrawFilter_Delegate.getDelegate(nativeFilter); - // get the delegate only because we don't support them at all for the moment, so - // we can display the message now. - - DrawFilter_Delegate filterDelegate = DrawFilter_Delegate.getDelegate(nativeFilter); - if (canvasDelegate == null) { - return; - } - - if (filterDelegate.isSupported() == false) { + if (canvasDelegate.mDrawFilter != null && + canvasDelegate.mDrawFilter.isSupported() == false) { Bridge.getLog().fidelityWarning(LayoutLog.TAG_DRAWFILTER, - filterDelegate.getSupportMessage(), null, null /*data*/); + canvasDelegate.mDrawFilter.getSupportMessage(), null, null /*data*/); } } + @LayoutlibDelegate /*package*/ static boolean native_getClipBounds(int nativeCanvas, Rect bounds) { // get the delegate from the native int. @@ -518,6 +546,7 @@ public final class Canvas_Delegate { return false; } + @LayoutlibDelegate /*package*/ static void native_getCTM(int canvas, int matrix) { // get the delegate from the native int. Canvas_Delegate canvasDelegate = sManager.getDelegate(canvas); @@ -534,6 +563,7 @@ public final class Canvas_Delegate { matrixDelegate.set(Matrix_Delegate.makeValues(transform)); } + @LayoutlibDelegate /*package*/ static boolean native_quickReject(int nativeCanvas, RectF rect, int native_edgeType) { @@ -541,6 +571,7 @@ public final class Canvas_Delegate { return false; } + @LayoutlibDelegate /*package*/ static boolean native_quickReject(int nativeCanvas, int path, int native_edgeType) { @@ -548,6 +579,7 @@ public final class Canvas_Delegate { return false; } + @LayoutlibDelegate /*package*/ static boolean native_quickReject(int nativeCanvas, float left, float top, float right, float bottom, @@ -556,21 +588,25 @@ public final class Canvas_Delegate { return false; } + @LayoutlibDelegate /*package*/ static void native_drawRGB(int nativeCanvas, int r, int g, int b) { native_drawColor(nativeCanvas, 0xFF000000 | r << 16 | (g&0xFF) << 8 | (b&0xFF), PorterDuff.Mode.SRC_OVER.nativeInt); } + @LayoutlibDelegate /*package*/ static void native_drawARGB(int nativeCanvas, int a, int r, int g, int b) { native_drawColor(nativeCanvas, a << 24 | (r&0xFF) << 16 | (g&0xFF) << 8 | (b&0xFF), PorterDuff.Mode.SRC_OVER.nativeInt); } + @LayoutlibDelegate /*package*/ static void native_drawColor(int nativeCanvas, int color) { native_drawColor(nativeCanvas, color, PorterDuff.Mode.SRC_OVER.nativeInt); } + @LayoutlibDelegate /*package*/ static void native_drawColor(int nativeCanvas, final int color, final int mode) { // get the delegate from the native int. Canvas_Delegate canvasDelegate = sManager.getDelegate(nativeCanvas); @@ -600,11 +636,14 @@ public final class Canvas_Delegate { }); } + @LayoutlibDelegate /*package*/ static void native_drawPaint(int nativeCanvas, int paint) { // FIXME - throw new UnsupportedOperationException(); + Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED, + "Canvas.drawPaint is not supported.", null, null /*data*/); } + @LayoutlibDelegate /*package*/ static void native_drawLine(int nativeCanvas, final float startX, final float startY, final float stopX, final float stopY, int paint) { @@ -617,11 +656,13 @@ public final class Canvas_Delegate { }); } + @LayoutlibDelegate /*package*/ static void native_drawRect(int nativeCanvas, RectF rect, int paint) { native_drawRect(nativeCanvas, rect.left, rect.top, rect.right, rect.bottom, paint); } + @LayoutlibDelegate /*package*/ static void native_drawRect(int nativeCanvas, final float left, final float top, final float right, final float bottom, int paint) { @@ -646,6 +687,7 @@ public final class Canvas_Delegate { }); } + @LayoutlibDelegate /*package*/ static void native_drawOval(int nativeCanvas, final RectF oval, int paint) { if (oval.right > oval.left && oval.bottom > oval.top) { draw(nativeCanvas, paint, false /*compositeOnly*/, false /*forceSrcMode*/, @@ -670,21 +712,23 @@ public final class Canvas_Delegate { } } - /*package*/ static void native_drawCircle(int nativeCanvas, float cx, - float cy, float radius, - int paint) { + @LayoutlibDelegate + /*package*/ static void native_drawCircle(int nativeCanvas, + float cx, float cy, float radius, int paint) { native_drawOval(nativeCanvas, new RectF(cx - radius, cy - radius, radius*2, radius*2), paint); } - /*package*/ static void native_drawArc(int nativeCanvas, RectF oval, - float startAngle, float sweep, - boolean useCenter, int paint) { + @LayoutlibDelegate + /*package*/ static void native_drawArc(int nativeCanvas, + RectF oval, float startAngle, float sweep, boolean useCenter, int paint) { // FIXME - throw new UnsupportedOperationException(); + Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED, + "Canvas.drawArc is not supported.", null, null /*data*/); } + @LayoutlibDelegate /*package*/ static void native_drawRoundRect(int nativeCanvas, final RectF rect, final float rx, final float ry, int paint) { @@ -713,8 +757,8 @@ public final class Canvas_Delegate { }); } - /*package*/ static void native_drawPath(int nativeCanvas, int path, - int paint) { + @LayoutlibDelegate + /*package*/ static void native_drawPath(int nativeCanvas, int path, int paint) { final Path_Delegate pathDelegate = Path_Delegate.getDelegate(path); if (pathDelegate == null) { return; @@ -739,6 +783,7 @@ public final class Canvas_Delegate { }); } + @LayoutlibDelegate /*package*/ static void native_drawBitmap(Canvas thisCanvas, int nativeCanvas, int bitmap, float left, float top, int nativePaintOrZero, @@ -760,6 +805,7 @@ public final class Canvas_Delegate { (int)left, (int)top, (int)right, (int)bottom); } + @LayoutlibDelegate /*package*/ static void native_drawBitmap(Canvas thisCanvas, int nativeCanvas, int bitmap, Rect src, RectF dst, int nativePaintOrZero, @@ -784,6 +830,7 @@ public final class Canvas_Delegate { } } + @LayoutlibDelegate /*package*/ static void native_drawBitmap(int nativeCanvas, int bitmap, Rect src, Rect dst, int nativePaintOrZero, @@ -808,6 +855,7 @@ public final class Canvas_Delegate { } } + @LayoutlibDelegate /*package*/ static void native_drawBitmap(int nativeCanvas, int[] colors, int offset, int stride, final float x, final float y, int width, int height, @@ -832,6 +880,7 @@ public final class Canvas_Delegate { }); } + @LayoutlibDelegate /*package*/ static void nativeDrawBitmapMatrix(int nCanvas, int nBitmap, int nMatrix, int nPaint) { // get the delegate from the native int. @@ -871,29 +920,35 @@ public final class Canvas_Delegate { }, paintDelegate, true /*compositeOnly*/, false /*forceSrcMode*/); } + @LayoutlibDelegate /*package*/ static void nativeDrawBitmapMesh(int nCanvas, int nBitmap, - int meshWidth, int meshHeight, - float[] verts, int vertOffset, - int[] colors, int colorOffset, int nPaint) { + int meshWidth, int meshHeight, float[] verts, int vertOffset, int[] colors, + int colorOffset, int nPaint) { // FIXME - throw new UnsupportedOperationException(); + Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED, + "Canvas.drawBitmapMesh is not supported.", null, null /*data*/); } + @LayoutlibDelegate /*package*/ static void nativeDrawVertices(int nCanvas, int mode, int n, - float[] verts, int vertOffset, float[] texs, int texOffset, - int[] colors, int colorOffset, short[] indices, - int indexOffset, int indexCount, int nPaint) { + float[] verts, int vertOffset, + float[] texs, int texOffset, + int[] colors, int colorOffset, + short[] indices, int indexOffset, + int indexCount, int nPaint) { // FIXME - throw new UnsupportedOperationException(); + Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED, + "Canvas.drawVertices is not supported.", null, null /*data*/); } + @LayoutlibDelegate /*package*/ static void native_drawText(int nativeCanvas, final char[] text, final int index, final int count, final float startX, final float startY, int flags, int paint) { draw(nativeCanvas, paint, false /*compositeOnly*/, false /*forceSrcMode*/, new GcSnapshot.Drawable() { public void draw(Graphics2D graphics, Paint_Delegate paint) { - // WARNING: the logic in this method is similar to Paint.measureText. + // WARNING: the logic in this method is similar to Paint_Delegate.measureText. // Any change to this method should be reflected in Paint.measureText // Paint.TextAlign indicates how the text is positioned relative to X. // LEFT is the default and there's nothing to do. @@ -986,6 +1041,7 @@ public final class Canvas_Delegate { }); } + @LayoutlibDelegate /*package*/ static void native_drawText(int nativeCanvas, String text, int start, int end, float x, float y, int flags, int paint) { @@ -996,6 +1052,7 @@ public final class Canvas_Delegate { native_drawText(nativeCanvas, buffer, 0, count, x, y, flags, paint); } + @LayoutlibDelegate /*package*/ static void native_drawTextRun(int nativeCanvas, String text, int start, int end, int contextStart, int contextEnd, float x, float y, int flags, int paint) { @@ -1006,27 +1063,33 @@ public final class Canvas_Delegate { native_drawText(nativeCanvas, buffer, start, end, x, y, flags, paint); } + @LayoutlibDelegate /*package*/ static void native_drawTextRun(int nativeCanvas, char[] text, int start, int count, int contextStart, int contextCount, float x, float y, int flags, int paint) { native_drawText(nativeCanvas, text, start, count, x, y, flags, paint); } + @LayoutlibDelegate /*package*/ static void native_drawPosText(int nativeCanvas, char[] text, int index, int count, float[] pos, int paint) { // FIXME - throw new UnsupportedOperationException(); + Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED, + "Canvas.drawPosText is not supported.", null, null /*data*/); } + @LayoutlibDelegate /*package*/ static void native_drawPosText(int nativeCanvas, String text, float[] pos, int paint) { // FIXME - throw new UnsupportedOperationException(); + Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED, + "Canvas.drawPosText is not supported.", null, null /*data*/); } + @LayoutlibDelegate /*package*/ static void native_drawTextOnPath(int nativeCanvas, char[] text, int index, int count, int path, @@ -1034,24 +1097,30 @@ public final class Canvas_Delegate { float vOffset, int bidiFlags, int paint) { // FIXME - throw new UnsupportedOperationException(); + Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED, + "Canvas.drawTextOnPath is not supported.", null, null /*data*/); } + @LayoutlibDelegate /*package*/ static void native_drawTextOnPath(int nativeCanvas, String text, int path, float hOffset, float vOffset, int flags, int paint) { // FIXME - throw new UnsupportedOperationException(); + Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED, + "Canvas.drawTextOnPath is not supported.", null, null /*data*/); } + @LayoutlibDelegate /*package*/ static void native_drawPicture(int nativeCanvas, int nativePicture) { // FIXME - throw new UnsupportedOperationException(); + Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED, + "Canvas.drawPicture is not supported.", null, null /*data*/); } + @LayoutlibDelegate /*package*/ static void finalizer(int nativeCanvas) { // get the delegate from the native int so that it can be disposed. Canvas_Delegate canvasDelegate = sManager.getDelegate(nativeCanvas); @@ -1062,7 +1131,7 @@ public final class Canvas_Delegate { canvasDelegate.dispose(); // remove it from the manager. - sManager.removeDelegate(nativeCanvas); + sManager.removeJavaReferenceFor(nativeCanvas); } // ---- Private delegate/helper methods ---- diff --git a/tools/layoutlib/bridge/src/android/graphics/ColorFilter_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/ColorFilter_Delegate.java index 3df170f284e03..e5a7ab6d0d234 100644 --- a/tools/layoutlib/bridge/src/android/graphics/ColorFilter_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/ColorFilter_Delegate.java @@ -17,6 +17,7 @@ package android.graphics; import com.android.layoutlib.bridge.impl.DelegateManager; +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; /** * Delegate implementing the native methods of android.graphics.ColorFilter @@ -37,7 +38,7 @@ public abstract class ColorFilter_Delegate { // ---- delegate manager ---- protected static final DelegateManager sManager = - new DelegateManager(); + new DelegateManager(ColorFilter_Delegate.class); // ---- delegate helper data ---- @@ -54,8 +55,9 @@ public abstract class ColorFilter_Delegate { // ---- native methods ---- + @LayoutlibDelegate /*package*/ static void finalizer(int native_instance, int nativeColorFilter) { - sManager.removeDelegate(native_instance); + sManager.removeJavaReferenceFor(native_instance); } // ---- Private delegate/helper methods ---- diff --git a/tools/layoutlib/bridge/src/android/graphics/ColorMatrixColorFilter_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/ColorMatrixColorFilter_Delegate.java index 42843279ef0b1..2de344b41f8ac 100644 --- a/tools/layoutlib/bridge/src/android/graphics/ColorMatrixColorFilter_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/ColorMatrixColorFilter_Delegate.java @@ -17,6 +17,7 @@ package android.graphics; import com.android.layoutlib.bridge.impl.DelegateManager; +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; /** * Delegate implementing the native methods of android.graphics.ColorMatrixColorFilter @@ -53,11 +54,13 @@ public class ColorMatrixColorFilter_Delegate extends ColorFilter_Delegate { // ---- native methods ---- + @LayoutlibDelegate /*package*/ static int nativeColorMatrixFilter(float[] array) { ColorMatrixColorFilter_Delegate newDelegate = new ColorMatrixColorFilter_Delegate(); - return sManager.addDelegate(newDelegate); + return sManager.addNewDelegate(newDelegate); } + @LayoutlibDelegate /*package*/ static int nColorMatrixFilter(int nativeFilter, float[] array) { // pass return 0; diff --git a/tools/layoutlib/bridge/src/android/graphics/ComposePathEffect_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/ComposePathEffect_Delegate.java index 39cbbc6122b91..7c04a8709db22 100644 --- a/tools/layoutlib/bridge/src/android/graphics/ComposePathEffect_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/ComposePathEffect_Delegate.java @@ -17,6 +17,7 @@ package android.graphics; import com.android.layoutlib.bridge.impl.DelegateManager; +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; import java.awt.Stroke; @@ -60,9 +61,10 @@ public class ComposePathEffect_Delegate extends PathEffect_Delegate { // ---- native methods ---- + @LayoutlibDelegate /*package*/ static int nativeCreate(int outerpe, int innerpe) { ComposePathEffect_Delegate newDelegate = new ComposePathEffect_Delegate(); - return sManager.addDelegate(newDelegate); + return sManager.addNewDelegate(newDelegate); } // ---- Private delegate/helper methods ---- diff --git a/tools/layoutlib/bridge/src/android/graphics/ComposeShader_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/ComposeShader_Delegate.java index b4baa6f44f7d9..f6e1d00949255 100644 --- a/tools/layoutlib/bridge/src/android/graphics/ComposeShader_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/ComposeShader_Delegate.java @@ -17,6 +17,7 @@ package android.graphics; import com.android.layoutlib.bridge.impl.DelegateManager; +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; import java.awt.Paint; @@ -61,33 +62,36 @@ public class ComposeShader_Delegate extends Shader_Delegate { // ---- native methods ---- + @LayoutlibDelegate /*package*/ static int nativeCreate1(int native_shaderA, int native_shaderB, int native_mode) { // FIXME not supported yet. ComposeShader_Delegate newDelegate = new ComposeShader_Delegate(); - return sManager.addDelegate(newDelegate); + return sManager.addNewDelegate(newDelegate); } + @LayoutlibDelegate /*package*/ static int nativeCreate2(int native_shaderA, int native_shaderB, int porterDuffMode) { // FIXME not supported yet. ComposeShader_Delegate newDelegate = new ComposeShader_Delegate(); - return sManager.addDelegate(newDelegate); + return sManager.addNewDelegate(newDelegate); } + @LayoutlibDelegate /*package*/ static int nativePostCreate1(int native_shader, int native_skiaShaderA, int native_skiaShaderB, int native_mode) { // pass, not needed. return 0; } + @LayoutlibDelegate /*package*/ static int nativePostCreate2(int native_shader, int native_skiaShaderA, int native_skiaShaderB, int porterDuffMode) { // pass, not needed. return 0; } - // ---- Private delegate/helper methods ---- } diff --git a/tools/layoutlib/bridge/src/android/graphics/CornerPathEffect_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/CornerPathEffect_Delegate.java index 0307cfb77ea55..b0f8168aa3a02 100644 --- a/tools/layoutlib/bridge/src/android/graphics/CornerPathEffect_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/CornerPathEffect_Delegate.java @@ -17,6 +17,7 @@ package android.graphics; import com.android.layoutlib.bridge.impl.DelegateManager; +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; import java.awt.Stroke; @@ -60,9 +61,10 @@ public class CornerPathEffect_Delegate extends PathEffect_Delegate { // ---- native methods ---- + @LayoutlibDelegate /*package*/ static int nativeCreate(float radius) { CornerPathEffect_Delegate newDelegate = new CornerPathEffect_Delegate(); - return sManager.addDelegate(newDelegate); + return sManager.addNewDelegate(newDelegate); } // ---- Private delegate/helper methods ---- diff --git a/tools/layoutlib/bridge/src/android/graphics/DashPathEffect_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/DashPathEffect_Delegate.java index 5a704a70e958b..d97c2eccd5081 100644 --- a/tools/layoutlib/bridge/src/android/graphics/DashPathEffect_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/DashPathEffect_Delegate.java @@ -17,6 +17,7 @@ package android.graphics; import com.android.layoutlib.bridge.impl.DelegateManager; +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; import java.awt.BasicStroke; import java.awt.Stroke; @@ -71,9 +72,10 @@ public final class DashPathEffect_Delegate extends PathEffect_Delegate { // ---- native methods ---- + @LayoutlibDelegate /*package*/ static int nativeCreate(float intervals[], float phase) { DashPathEffect_Delegate newDelegate = new DashPathEffect_Delegate(intervals, phase); - return sManager.addDelegate(newDelegate); + return sManager.addNewDelegate(newDelegate); } // ---- Private delegate/helper methods ---- diff --git a/tools/layoutlib/bridge/src/android/graphics/DiscretePathEffect_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/DiscretePathEffect_Delegate.java index 04d71700a5b94..ec4a810fbda58 100644 --- a/tools/layoutlib/bridge/src/android/graphics/DiscretePathEffect_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/DiscretePathEffect_Delegate.java @@ -17,6 +17,7 @@ package android.graphics; import com.android.layoutlib.bridge.impl.DelegateManager; +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; import java.awt.Stroke; @@ -60,9 +61,10 @@ public class DiscretePathEffect_Delegate extends PathEffect_Delegate { // ---- native methods ---- + @LayoutlibDelegate /*package*/ static int nativeCreate(float length, float deviation) { DiscretePathEffect_Delegate newDelegate = new DiscretePathEffect_Delegate(); - return sManager.addDelegate(newDelegate); + return sManager.addNewDelegate(newDelegate); } // ---- Private delegate/helper methods ---- diff --git a/tools/layoutlib/bridge/src/android/graphics/DrawFilter_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/DrawFilter_Delegate.java index ddf20b6247fba..870c46b8f5dd1 100644 --- a/tools/layoutlib/bridge/src/android/graphics/DrawFilter_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/DrawFilter_Delegate.java @@ -17,6 +17,7 @@ package android.graphics; import com.android.layoutlib.bridge.impl.DelegateManager; +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; /** * Delegate implementing the native methods of android.graphics.DrawFilter @@ -37,7 +38,7 @@ public abstract class DrawFilter_Delegate { // ---- delegate manager ---- protected static final DelegateManager sManager = - new DelegateManager(); + new DelegateManager(DrawFilter_Delegate.class); // ---- delegate helper data ---- @@ -54,8 +55,9 @@ public abstract class DrawFilter_Delegate { // ---- native methods ---- + @LayoutlibDelegate /*package*/ static void nativeDestructor(int nativeDrawFilter) { - sManager.removeDelegate(nativeDrawFilter); + sManager.removeJavaReferenceFor(nativeDrawFilter); } // ---- Private delegate/helper methods ---- diff --git a/tools/layoutlib/bridge/src/android/graphics/EmbossMaskFilter_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/EmbossMaskFilter_Delegate.java index 82f1da3033f51..ebc1c1d2eca4f 100644 --- a/tools/layoutlib/bridge/src/android/graphics/EmbossMaskFilter_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/EmbossMaskFilter_Delegate.java @@ -17,6 +17,7 @@ package android.graphics; import com.android.layoutlib.bridge.impl.DelegateManager; +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; /** * Delegate implementing the native methods of android.graphics.EmbossMaskFilter @@ -53,10 +54,11 @@ public class EmbossMaskFilter_Delegate extends MaskFilter_Delegate { // ---- native methods ---- + @LayoutlibDelegate /*package*/ static int nativeConstructor(float[] direction, float ambient, float specular, float blurRadius) { EmbossMaskFilter_Delegate newDelegate = new EmbossMaskFilter_Delegate(); - return sManager.addDelegate(newDelegate); + return sManager.addNewDelegate(newDelegate); } // ---- Private delegate/helper methods ---- diff --git a/tools/layoutlib/bridge/src/android/graphics/LayerRasterizer_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/LayerRasterizer_Delegate.java index 132004f97d547..51e0576169c49 100644 --- a/tools/layoutlib/bridge/src/android/graphics/LayerRasterizer_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/LayerRasterizer_Delegate.java @@ -17,6 +17,7 @@ package android.graphics; import com.android.layoutlib.bridge.impl.DelegateManager; +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; /** * Delegate implementing the native methods of android.graphics.LayerRasterizer @@ -53,11 +54,13 @@ public class LayerRasterizer_Delegate extends Rasterizer_Delegate { // ---- native methods ---- + @LayoutlibDelegate /*package*/ static int nativeConstructor() { LayerRasterizer_Delegate newDelegate = new LayerRasterizer_Delegate(); - return sManager.addDelegate(newDelegate); + return sManager.addNewDelegate(newDelegate); } + @LayoutlibDelegate /*package*/ static void nativeAddLayer(int native_layer, int native_paint, float dx, float dy) { } diff --git a/tools/layoutlib/bridge/src/android/graphics/LightingColorFilter_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/LightingColorFilter_Delegate.java index ba2cfad838405..0ee883dcd68c0 100644 --- a/tools/layoutlib/bridge/src/android/graphics/LightingColorFilter_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/LightingColorFilter_Delegate.java @@ -17,6 +17,7 @@ package android.graphics; import com.android.layoutlib.bridge.impl.DelegateManager; +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; /** * Delegate implementing the native methods of android.graphics.LightingColorFilter @@ -53,11 +54,13 @@ public class LightingColorFilter_Delegate extends ColorFilter_Delegate { // ---- native methods ---- + @LayoutlibDelegate /*package*/ static int native_CreateLightingFilter(int mul, int add) { LightingColorFilter_Delegate newDelegate = new LightingColorFilter_Delegate(); - return sManager.addDelegate(newDelegate); + return sManager.addNewDelegate(newDelegate); } + @LayoutlibDelegate /*package*/ static int nCreateLightingFilter(int nativeFilter, int mul, int add) { // pass return 0; diff --git a/tools/layoutlib/bridge/src/android/graphics/LinearGradient_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/LinearGradient_Delegate.java index 9525dcf8e0490..a2ba758a7e0c4 100644 --- a/tools/layoutlib/bridge/src/android/graphics/LinearGradient_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/LinearGradient_Delegate.java @@ -19,6 +19,7 @@ package android.graphics; import com.android.ide.common.rendering.api.LayoutLog; import com.android.layoutlib.bridge.Bridge; import com.android.layoutlib.bridge.impl.DelegateManager; +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; import android.graphics.Shader.TileMode; @@ -52,13 +53,16 @@ public final class LinearGradient_Delegate extends Gradient_Delegate { // ---- native methods ---- + @LayoutlibDelegate /*package*/ static int nativeCreate1(LinearGradient thisGradient, float x0, float y0, float x1, float y1, int colors[], float positions[], int tileMode) { LinearGradient_Delegate newDelegate = new LinearGradient_Delegate(x0, y0, x1, y1, colors, positions, Shader_Delegate.getTileMode(tileMode)); - return sManager.addDelegate(newDelegate); + return sManager.addNewDelegate(newDelegate); } + + @LayoutlibDelegate /*package*/ static int nativeCreate2(LinearGradient thisGradient, float x0, float y0, float x1, float y1, int color0, int color1, int tileMode) { @@ -66,12 +70,16 @@ public final class LinearGradient_Delegate extends Gradient_Delegate { x0, y0, x1, y1, new int[] { color0, color1}, null /*positions*/, tileMode); } + + @LayoutlibDelegate /*package*/ static int nativePostCreate1(LinearGradient thisGradient, int native_shader, float x0, float y0, float x1, float y1, int colors[], float positions[], int tileMode) { // nothing to be done here. return 0; } + + @LayoutlibDelegate /*package*/ static int nativePostCreate2(LinearGradient thisGradient, int native_shader, float x0, float y0, float x1, float y1, int color0, int color1, int tileMode) { diff --git a/tools/layoutlib/bridge/src/android/graphics/MaskFilter_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/MaskFilter_Delegate.java index c582a91f9262f..c2f27e43c7bf5 100644 --- a/tools/layoutlib/bridge/src/android/graphics/MaskFilter_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/MaskFilter_Delegate.java @@ -17,6 +17,7 @@ package android.graphics; import com.android.layoutlib.bridge.impl.DelegateManager; +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; /** * Delegate implementing the native methods of android.graphics.MaskFilter @@ -37,7 +38,7 @@ public abstract class MaskFilter_Delegate { // ---- delegate manager ---- protected static final DelegateManager sManager = - new DelegateManager(); + new DelegateManager(MaskFilter_Delegate.class); // ---- delegate helper data ---- @@ -54,8 +55,9 @@ public abstract class MaskFilter_Delegate { // ---- native methods ---- + @LayoutlibDelegate /*package*/ static void nativeDestructor(int native_filter) { - sManager.removeDelegate(native_filter); + sManager.removeJavaReferenceFor(native_filter); } // ---- Private delegate/helper methods ---- diff --git a/tools/layoutlib/bridge/src/android/graphics/Matrix_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Matrix_Delegate.java index 2d77d40f6f542..451edd2f430d9 100644 --- a/tools/layoutlib/bridge/src/android/graphics/Matrix_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/Matrix_Delegate.java @@ -20,6 +20,7 @@ package android.graphics; import com.android.ide.common.rendering.api.LayoutLog; import com.android.layoutlib.bridge.Bridge; import com.android.layoutlib.bridge.impl.DelegateManager; +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; import android.graphics.Matrix.ScaleToFit; @@ -45,7 +46,7 @@ public final class Matrix_Delegate { // ---- delegate manager ---- private static final DelegateManager sManager = - new DelegateManager(); + new DelegateManager(Matrix_Delegate.class); // ---- delegate data ---- private float mValues[] = new float[MATRIX_SIZE]; @@ -172,6 +173,7 @@ public final class Matrix_Delegate { // ---- native methods ---- + @LayoutlibDelegate /*package*/ static int native_create(int native_src_or_zero) { // create the delegate Matrix_Delegate newDelegate = new Matrix_Delegate(); @@ -187,9 +189,10 @@ public final class Matrix_Delegate { } } - return sManager.addDelegate(newDelegate); + return sManager.addNewDelegate(newDelegate); } + @LayoutlibDelegate /*package*/ static boolean native_isIdentity(int native_object) { Matrix_Delegate d = sManager.getDelegate(native_object); if (d == null) { @@ -199,6 +202,7 @@ public final class Matrix_Delegate { return d.isIdentity(); } + @LayoutlibDelegate /*package*/ static boolean native_rectStaysRect(int native_object) { Matrix_Delegate d = sManager.getDelegate(native_object); if (d == null) { @@ -208,6 +212,7 @@ public final class Matrix_Delegate { return (d.computeTypeMask() & kRectStaysRect_Mask) != 0; } + @LayoutlibDelegate /*package*/ static void native_reset(int native_object) { Matrix_Delegate d = sManager.getDelegate(native_object); if (d == null) { @@ -217,6 +222,7 @@ public final class Matrix_Delegate { reset(d.mValues); } + @LayoutlibDelegate /*package*/ static void native_set(int native_object, int other) { Matrix_Delegate d = sManager.getDelegate(native_object); if (d == null) { @@ -231,6 +237,7 @@ public final class Matrix_Delegate { System.arraycopy(src.mValues, 0, d.mValues, 0, MATRIX_SIZE); } + @LayoutlibDelegate /*package*/ static void native_setTranslate(int native_object, float dx, float dy) { Matrix_Delegate d = sManager.getDelegate(native_object); if (d == null) { @@ -240,6 +247,7 @@ public final class Matrix_Delegate { setTranslate(d.mValues, dx, dy); } + @LayoutlibDelegate /*package*/ static void native_setScale(int native_object, float sx, float sy, float px, float py) { Matrix_Delegate d = sManager.getDelegate(native_object); @@ -250,6 +258,7 @@ public final class Matrix_Delegate { d.mValues = getScale(sx, sy, px, py); } + @LayoutlibDelegate /*package*/ static void native_setScale(int native_object, float sx, float sy) { Matrix_Delegate d = sManager.getDelegate(native_object); if (d == null) { @@ -267,6 +276,7 @@ public final class Matrix_Delegate { d.mValues[8] = 1; } + @LayoutlibDelegate /*package*/ static void native_setRotate(int native_object, float degrees, float px, float py) { Matrix_Delegate d = sManager.getDelegate(native_object); if (d == null) { @@ -276,6 +286,7 @@ public final class Matrix_Delegate { d.mValues = getRotate(degrees, px, py); } + @LayoutlibDelegate /*package*/ static void native_setRotate(int native_object, float degrees) { Matrix_Delegate d = sManager.getDelegate(native_object); if (d == null) { @@ -285,6 +296,7 @@ public final class Matrix_Delegate { setRotate(d.mValues, degrees); } + @LayoutlibDelegate /*package*/ static void native_setSinCos(int native_object, float sinValue, float cosValue, float px, float py) { Matrix_Delegate d = sManager.getDelegate(native_object); @@ -303,6 +315,7 @@ public final class Matrix_Delegate { d.postTransform(getTranslate(px, py)); } + @LayoutlibDelegate /*package*/ static void native_setSinCos(int native_object, float sinValue, float cosValue) { Matrix_Delegate d = sManager.getDelegate(native_object); if (d == null) { @@ -312,6 +325,7 @@ public final class Matrix_Delegate { setRotate(d.mValues, sinValue, cosValue); } + @LayoutlibDelegate /*package*/ static void native_setSkew(int native_object, float kx, float ky, float px, float py) { Matrix_Delegate d = sManager.getDelegate(native_object); @@ -322,6 +336,7 @@ public final class Matrix_Delegate { d.mValues = getSkew(kx, ky, px, py); } + @LayoutlibDelegate /*package*/ static void native_setSkew(int native_object, float kx, float ky) { Matrix_Delegate d = sManager.getDelegate(native_object); if (d == null) { @@ -339,6 +354,7 @@ public final class Matrix_Delegate { d.mValues[8] = 1; } + @LayoutlibDelegate /*package*/ static boolean native_setConcat(int native_object, int a, int b) { if (a == native_object) { return native_preConcat(native_object, b); @@ -366,6 +382,7 @@ public final class Matrix_Delegate { return true; } + @LayoutlibDelegate /*package*/ static boolean native_preTranslate(int native_object, float dx, float dy) { Matrix_Delegate d = sManager.getDelegate(native_object); if (d == null) { @@ -376,6 +393,7 @@ public final class Matrix_Delegate { return true; } + @LayoutlibDelegate /*package*/ static boolean native_preScale(int native_object, float sx, float sy, float px, float py) { Matrix_Delegate d = sManager.getDelegate(native_object); @@ -387,6 +405,7 @@ public final class Matrix_Delegate { return true; } + @LayoutlibDelegate /*package*/ static boolean native_preScale(int native_object, float sx, float sy) { Matrix_Delegate d = sManager.getDelegate(native_object); if (d == null) { @@ -397,6 +416,7 @@ public final class Matrix_Delegate { return true; } + @LayoutlibDelegate /*package*/ static boolean native_preRotate(int native_object, float degrees, float px, float py) { Matrix_Delegate d = sManager.getDelegate(native_object); @@ -408,6 +428,7 @@ public final class Matrix_Delegate { return true; } + @LayoutlibDelegate /*package*/ static boolean native_preRotate(int native_object, float degrees) { Matrix_Delegate d = sManager.getDelegate(native_object); if (d == null) { @@ -422,6 +443,7 @@ public final class Matrix_Delegate { return true; } + @LayoutlibDelegate /*package*/ static boolean native_preSkew(int native_object, float kx, float ky, float px, float py) { Matrix_Delegate d = sManager.getDelegate(native_object); @@ -433,6 +455,7 @@ public final class Matrix_Delegate { return true; } + @LayoutlibDelegate /*package*/ static boolean native_preSkew(int native_object, float kx, float ky) { Matrix_Delegate d = sManager.getDelegate(native_object); if (d == null) { @@ -443,6 +466,7 @@ public final class Matrix_Delegate { return true; } + @LayoutlibDelegate /*package*/ static boolean native_preConcat(int native_object, int other_matrix) { Matrix_Delegate d = sManager.getDelegate(native_object); if (d == null) { @@ -458,6 +482,7 @@ public final class Matrix_Delegate { return true; } + @LayoutlibDelegate /*package*/ static boolean native_postTranslate(int native_object, float dx, float dy) { Matrix_Delegate d = sManager.getDelegate(native_object); if (d == null) { @@ -468,6 +493,7 @@ public final class Matrix_Delegate { return true; } + @LayoutlibDelegate /*package*/ static boolean native_postScale(int native_object, float sx, float sy, float px, float py) { Matrix_Delegate d = sManager.getDelegate(native_object); @@ -479,6 +505,7 @@ public final class Matrix_Delegate { return true; } + @LayoutlibDelegate /*package*/ static boolean native_postScale(int native_object, float sx, float sy) { Matrix_Delegate d = sManager.getDelegate(native_object); if (d == null) { @@ -489,6 +516,7 @@ public final class Matrix_Delegate { return true; } + @LayoutlibDelegate /*package*/ static boolean native_postRotate(int native_object, float degrees, float px, float py) { Matrix_Delegate d = sManager.getDelegate(native_object); @@ -500,6 +528,7 @@ public final class Matrix_Delegate { return true; } + @LayoutlibDelegate /*package*/ static boolean native_postRotate(int native_object, float degrees) { Matrix_Delegate d = sManager.getDelegate(native_object); if (d == null) { @@ -510,6 +539,7 @@ public final class Matrix_Delegate { return true; } + @LayoutlibDelegate /*package*/ static boolean native_postSkew(int native_object, float kx, float ky, float px, float py) { Matrix_Delegate d = sManager.getDelegate(native_object); @@ -521,6 +551,7 @@ public final class Matrix_Delegate { return true; } + @LayoutlibDelegate /*package*/ static boolean native_postSkew(int native_object, float kx, float ky) { Matrix_Delegate d = sManager.getDelegate(native_object); if (d == null) { @@ -531,6 +562,7 @@ public final class Matrix_Delegate { return true; } + @LayoutlibDelegate /*package*/ static boolean native_postConcat(int native_object, int other_matrix) { Matrix_Delegate d = sManager.getDelegate(native_object); if (d == null) { @@ -546,6 +578,7 @@ public final class Matrix_Delegate { return true; } + @LayoutlibDelegate /*package*/ static boolean native_setRectToRect(int native_object, RectF src, RectF dst, int stf) { Matrix_Delegate d = sManager.getDelegate(native_object); @@ -610,6 +643,7 @@ public final class Matrix_Delegate { return true; } + @LayoutlibDelegate /*package*/ static boolean native_setPolyToPoly(int native_object, float[] src, int srcIndex, float[] dst, int dstIndex, int pointCount) { // FIXME @@ -619,6 +653,7 @@ public final class Matrix_Delegate { return false; } + @LayoutlibDelegate /*package*/ static boolean native_invert(int native_object, int inverse) { Matrix_Delegate d = sManager.getDelegate(native_object); if (d == null) { @@ -646,6 +681,7 @@ public final class Matrix_Delegate { } } + @LayoutlibDelegate /*package*/ static void native_mapPoints(int native_object, float[] dst, int dstIndex, float[] src, int srcIndex, int ptCount, boolean isPts) { Matrix_Delegate d = sManager.getDelegate(native_object); @@ -660,6 +696,7 @@ public final class Matrix_Delegate { } } + @LayoutlibDelegate /*package*/ static boolean native_mapRect(int native_object, RectF dst, RectF src) { Matrix_Delegate d = sManager.getDelegate(native_object); if (d == null) { @@ -669,6 +706,7 @@ public final class Matrix_Delegate { return d.mapRect(dst, src); } + @LayoutlibDelegate /*package*/ static float native_mapRadius(int native_object, float radius) { Matrix_Delegate d = sManager.getDelegate(native_object); if (d == null) { @@ -684,6 +722,7 @@ public final class Matrix_Delegate { return (float) Math.sqrt(l1 * l2); } + @LayoutlibDelegate /*package*/ static void native_getValues(int native_object, float[] values) { Matrix_Delegate d = sManager.getDelegate(native_object); if (d == null) { @@ -693,6 +732,7 @@ public final class Matrix_Delegate { System.arraycopy(d.mValues, 0, d.mValues, 0, MATRIX_SIZE); } + @LayoutlibDelegate /*package*/ static void native_setValues(int native_object, float[] values) { Matrix_Delegate d = sManager.getDelegate(native_object); if (d == null) { @@ -702,6 +742,7 @@ public final class Matrix_Delegate { System.arraycopy(values, 0, d.mValues, 0, MATRIX_SIZE); } + @LayoutlibDelegate /*package*/ static boolean native_equals(int native_a, int native_b) { Matrix_Delegate a = sManager.getDelegate(native_a); if (a == null) { @@ -722,8 +763,9 @@ public final class Matrix_Delegate { return true; } + @LayoutlibDelegate /*package*/ static void finalizer(int native_instance) { - sManager.removeDelegate(native_instance); + sManager.removeJavaReferenceFor(native_instance); } // ---- Private helper methods ---- diff --git a/tools/layoutlib/bridge/src/android/graphics/NinePatch_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/NinePatch_Delegate.java index 61ed71ee36a6e..5e882ce44390c 100644 --- a/tools/layoutlib/bridge/src/android/graphics/NinePatch_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/NinePatch_Delegate.java @@ -21,6 +21,7 @@ import com.android.layoutlib.bridge.Bridge; import com.android.layoutlib.bridge.impl.DelegateManager; import com.android.layoutlib.bridge.impl.GcSnapshot; import com.android.ninepatch.NinePatchChunk; +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; import android.graphics.drawable.NinePatchDrawable; @@ -137,6 +138,7 @@ public final class NinePatch_Delegate { // ---- native methods ---- + @LayoutlibDelegate /*package*/ static boolean isNinePatchChunk(byte[] chunk) { NinePatchChunk chunkObject = getChunk(chunk); if (chunkObject != null) { @@ -146,12 +148,14 @@ public final class NinePatch_Delegate { return false; } + @LayoutlibDelegate /*package*/ static void validateNinePatchChunk(int bitmap, byte[] chunk) { // the default JNI implementation only checks that the byte[] has the same // size as the C struct it represent. Since we cannot do the same check (serialization // will return different size depending on content), we do nothing. } + @LayoutlibDelegate /*package*/ static void nativeDraw(int canvas_instance, RectF loc, int bitmap_instance, byte[] c, int paint_instance_or_null, int destDensity, int srcDensity) { draw(canvas_instance, @@ -160,6 +164,7 @@ public final class NinePatch_Delegate { destDensity, srcDensity); } + @LayoutlibDelegate /*package*/ static void nativeDraw(int canvas_instance, Rect loc, int bitmap_instance, byte[] c, int paint_instance_or_null, int destDensity, int srcDensity) { draw(canvas_instance, @@ -168,54 +173,53 @@ public final class NinePatch_Delegate { destDensity, srcDensity); } - private static void draw(int canvas_instance, - final int left, final int top, final int right, final int bottom, - int bitmap_instance, byte[] c, int paint_instance_or_null, - final int destDensity, final int srcDensity) { - // get the delegate from the native int. - final Bitmap_Delegate bitmap_delegate = Bitmap_Delegate.getDelegate(bitmap_instance); - if (bitmap_delegate == null) { - return; - } - - if (c == null) { - // not a 9-patch? - BufferedImage image = bitmap_delegate.getImage(); - Canvas_Delegate.native_drawBitmap(canvas_instance, bitmap_instance, - new Rect(0, 0, image.getWidth(), image.getHeight()), - new Rect(left, top, right, bottom), - paint_instance_or_null, destDensity, srcDensity); - return; - } - - final NinePatchChunk chunkObject = getChunk(c); - assert chunkObject != null; - if (chunkObject == null) { - return; - } - - Canvas_Delegate canvas_delegate = Canvas_Delegate.getDelegate(canvas_instance); - if (canvas_delegate == null) { - return; - } - - // this one can be null - Paint_Delegate paint_delegate = Paint_Delegate.getDelegate(paint_instance_or_null); - - canvas_delegate.getSnapshot().draw(new GcSnapshot.Drawable() { - public void draw(Graphics2D graphics, Paint_Delegate paint) { - chunkObject.draw(bitmap_delegate.getImage(), graphics, - left, top, right - left, bottom - top, destDensity, srcDensity); - } - }, paint_delegate, true /*compositeOnly*/, false /*forceSrcMode*/); - - } - + @LayoutlibDelegate /*package*/ static int nativeGetTransparentRegion(int bitmap, byte[] chunk, Rect location) { return 0; } // ---- Private Helper methods ---- + private static void draw(int canvas_instance, + final int left, final int top, final int right, final int bottom, + int bitmap_instance, byte[] c, int paint_instance_or_null, + final int destDensity, final int srcDensity) { + // get the delegate from the native int. + final Bitmap_Delegate bitmap_delegate = Bitmap_Delegate.getDelegate(bitmap_instance); + if (bitmap_delegate == null) { + return; + } + if (c == null) { + // not a 9-patch? + BufferedImage image = bitmap_delegate.getImage(); + Canvas_Delegate.native_drawBitmap(canvas_instance, bitmap_instance, + new Rect(0, 0, image.getWidth(), image.getHeight()), + new Rect(left, top, right, bottom), + paint_instance_or_null, destDensity, srcDensity); + return; + } + + final NinePatchChunk chunkObject = getChunk(c); + assert chunkObject != null; + if (chunkObject == null) { + return; + } + + Canvas_Delegate canvas_delegate = Canvas_Delegate.getDelegate(canvas_instance); + if (canvas_delegate == null) { + return; + } + + // this one can be null + Paint_Delegate paint_delegate = Paint_Delegate.getDelegate(paint_instance_or_null); + + canvas_delegate.getSnapshot().draw(new GcSnapshot.Drawable() { + public void draw(Graphics2D graphics, Paint_Delegate paint) { + chunkObject.draw(bitmap_delegate.getImage(), graphics, + left, top, right - left, bottom - top, destDensity, srcDensity); + } + }, paint_delegate, true /*compositeOnly*/, false /*forceSrcMode*/); + + } } diff --git a/tools/layoutlib/bridge/src/android/graphics/PaintFlagsDrawFilter_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/PaintFlagsDrawFilter_Delegate.java index ec92507f303ea..71d346a935536 100644 --- a/tools/layoutlib/bridge/src/android/graphics/PaintFlagsDrawFilter_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/PaintFlagsDrawFilter_Delegate.java @@ -17,6 +17,7 @@ package android.graphics; import com.android.layoutlib.bridge.impl.DelegateManager; +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; /** * Delegate implementing the native methods of android.graphics.PaintFlagsDrawFilter @@ -53,9 +54,10 @@ public class PaintFlagsDrawFilter_Delegate extends DrawFilter_Delegate { // ---- native methods ---- + @LayoutlibDelegate /*package*/ static int nativeConstructor(int clearBits, int setBits) { PaintFlagsDrawFilter_Delegate newDelegate = new PaintFlagsDrawFilter_Delegate(); - return sManager.addDelegate(newDelegate); + return sManager.addNewDelegate(newDelegate); } // ---- Private delegate/helper methods ---- diff --git a/tools/layoutlib/bridge/src/android/graphics/Paint_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Paint_Delegate.java index 87164fb42e0bd..373f48249cff2 100644 --- a/tools/layoutlib/bridge/src/android/graphics/Paint_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/Paint_Delegate.java @@ -19,6 +19,7 @@ package android.graphics; import com.android.ide.common.rendering.api.LayoutLog; import com.android.layoutlib.bridge.Bridge; import com.android.layoutlib.bridge.impl.DelegateManager; +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; import android.graphics.Paint.FontMetrics; import android.graphics.Paint.FontMetricsInt; @@ -31,6 +32,7 @@ import java.awt.Stroke; import java.awt.Toolkit; import java.awt.font.FontRenderContext; import java.awt.geom.AffineTransform; +import java.awt.geom.Rectangle2D; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -60,7 +62,7 @@ public class Paint_Delegate { // ---- delegate manager ---- private static final DelegateManager sManager = - new DelegateManager(); + new DelegateManager(Paint_Delegate.class); // ---- delegate helper data ---- private List mFonts; @@ -74,19 +76,19 @@ public class Paint_Delegate { private int mCap; private int mJoin; private int mTextAlign; - private int mTypeface; + private Typeface_Delegate mTypeface; private float mStrokeWidth; private float mStrokeMiter; private float mTextSize; private float mTextScaleX; private float mTextSkewX; - private int mXfermode; - private int mColorFilter; - private int mShader; - private int mPathEffect; - private int mMaskFilter; - private int mRasterizer; + private Xfermode_Delegate mXfermode; + private ColorFilter_Delegate mColorFilter; + private Shader_Delegate mShader; + private PathEffect_Delegate mPathEffect; + private MaskFilter_Delegate mMaskFilter; + private Rasterizer_Delegate mRasterizer; // ---- Public Helper methods ---- @@ -171,17 +173,16 @@ public class Paint_Delegate { } public Stroke getJavaStroke() { - PathEffect_Delegate effectDelegate = PathEffect_Delegate.getDelegate(mPathEffect); - if (effectDelegate != null) { - if (effectDelegate.isSupported()) { - Stroke stroke = effectDelegate.getStroke(this); + if (mPathEffect != null) { + if (mPathEffect.isSupported()) { + Stroke stroke = mPathEffect.getStroke(this); assert stroke != null; if (stroke != null) { return stroke; } } else { Bridge.getLog().fidelityWarning(LayoutLog.TAG_PATHEFFECT, - effectDelegate.getSupportMessage(), + mPathEffect.getSupportMessage(), null, null /*data*/); } } @@ -200,7 +201,7 @@ public class Paint_Delegate { * @return the delegate or null. */ public Xfermode_Delegate getXfermode() { - return Xfermode_Delegate.getDelegate(mXfermode); + return mXfermode; } /** @@ -209,7 +210,7 @@ public class Paint_Delegate { * @return the delegate or null. */ public ColorFilter_Delegate getColorFilter() { - return ColorFilter_Delegate.getDelegate(mColorFilter); + return mColorFilter; } /** @@ -218,7 +219,7 @@ public class Paint_Delegate { * @return the delegate or null. */ public Shader_Delegate getShader() { - return Shader_Delegate.getDelegate(mShader); + return mShader; } /** @@ -227,7 +228,7 @@ public class Paint_Delegate { * @return the delegate or null. */ public MaskFilter_Delegate getMaskFilter() { - return MaskFilter_Delegate.getDelegate(mMaskFilter); + return mMaskFilter; } /** @@ -236,11 +237,12 @@ public class Paint_Delegate { * @return the delegate or null. */ public Rasterizer_Delegate getRasterizer() { - return Rasterizer_Delegate.getDelegate(mRasterizer); + return mRasterizer; } // ---- native methods ---- + @LayoutlibDelegate /*package*/ static int getFlags(Paint thisPaint) { // get the delegate from the native int. Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); @@ -251,6 +253,7 @@ public class Paint_Delegate { return delegate.mFlags; } + @LayoutlibDelegate /*package*/ static void setFlags(Paint thisPaint, int flags) { // get the delegate from the native int. Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); @@ -261,38 +264,47 @@ public class Paint_Delegate { delegate.mFlags = flags; } + @LayoutlibDelegate /*package*/ static void setFilterBitmap(Paint thisPaint, boolean filter) { setFlag(thisPaint, Paint.FILTER_BITMAP_FLAG, filter); } + @LayoutlibDelegate /*package*/ static void setAntiAlias(Paint thisPaint, boolean aa) { setFlag(thisPaint, Paint.ANTI_ALIAS_FLAG, aa); } + @LayoutlibDelegate /*package*/ static void setSubpixelText(Paint thisPaint, boolean subpixelText) { setFlag(thisPaint, Paint.SUBPIXEL_TEXT_FLAG, subpixelText); } + @LayoutlibDelegate /*package*/ static void setUnderlineText(Paint thisPaint, boolean underlineText) { setFlag(thisPaint, Paint.UNDERLINE_TEXT_FLAG, underlineText); } + @LayoutlibDelegate /*package*/ static void setStrikeThruText(Paint thisPaint, boolean strikeThruText) { setFlag(thisPaint, Paint.STRIKE_THRU_TEXT_FLAG, strikeThruText); } + @LayoutlibDelegate /*package*/ static void setFakeBoldText(Paint thisPaint, boolean fakeBoldText) { setFlag(thisPaint, Paint.FAKE_BOLD_TEXT_FLAG, fakeBoldText); } + @LayoutlibDelegate /*package*/ static void setDither(Paint thisPaint, boolean dither) { setFlag(thisPaint, Paint.DITHER_FLAG, dither); } + @LayoutlibDelegate /*package*/ static void setLinearText(Paint thisPaint, boolean linearText) { setFlag(thisPaint, Paint.LINEAR_TEXT_FLAG, linearText); } + @LayoutlibDelegate /*package*/ static int getColor(Paint thisPaint) { // get the delegate from the native int. Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); @@ -303,6 +315,7 @@ public class Paint_Delegate { return delegate.mColor; } + @LayoutlibDelegate /*package*/ static void setColor(Paint thisPaint, int color) { // get the delegate from the native int. Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); @@ -313,6 +326,7 @@ public class Paint_Delegate { delegate.mColor = color; } + @LayoutlibDelegate /*package*/ static int getAlpha(Paint thisPaint) { // get the delegate from the native int. Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); @@ -323,6 +337,7 @@ public class Paint_Delegate { return delegate.getAlpha(); } + @LayoutlibDelegate /*package*/ static void setAlpha(Paint thisPaint, int a) { // get the delegate from the native int. Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); @@ -333,6 +348,7 @@ public class Paint_Delegate { delegate.setAlpha(a); } + @LayoutlibDelegate /*package*/ static float getStrokeWidth(Paint thisPaint) { // get the delegate from the native int. Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); @@ -343,6 +359,7 @@ public class Paint_Delegate { return delegate.mStrokeWidth; } + @LayoutlibDelegate /*package*/ static void setStrokeWidth(Paint thisPaint, float width) { // get the delegate from the native int. Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); @@ -353,6 +370,7 @@ public class Paint_Delegate { delegate.mStrokeWidth = width; } + @LayoutlibDelegate /*package*/ static float getStrokeMiter(Paint thisPaint) { // get the delegate from the native int. Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); @@ -363,6 +381,7 @@ public class Paint_Delegate { return delegate.mStrokeMiter; } + @LayoutlibDelegate /*package*/ static void setStrokeMiter(Paint thisPaint, float miter) { // get the delegate from the native int. Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); @@ -373,6 +392,7 @@ public class Paint_Delegate { delegate.mStrokeMiter = miter; } + @LayoutlibDelegate /*package*/ static void nSetShadowLayer(Paint thisPaint, float radius, float dx, float dy, int color) { // FIXME @@ -380,6 +400,7 @@ public class Paint_Delegate { "Paint.setShadowLayer is not supported.", null, null /*data*/); } + @LayoutlibDelegate /*package*/ static float getTextSize(Paint thisPaint) { // get the delegate from the native int. Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); @@ -390,6 +411,7 @@ public class Paint_Delegate { return delegate.mTextSize; } + @LayoutlibDelegate /*package*/ static void setTextSize(Paint thisPaint, float textSize) { // get the delegate from the native int. Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); @@ -401,6 +423,7 @@ public class Paint_Delegate { delegate.updateFontObject(); } + @LayoutlibDelegate /*package*/ static float getTextScaleX(Paint thisPaint) { // get the delegate from the native int. Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); @@ -411,6 +434,7 @@ public class Paint_Delegate { return delegate.mTextScaleX; } + @LayoutlibDelegate /*package*/ static void setTextScaleX(Paint thisPaint, float scaleX) { // get the delegate from the native int. Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); @@ -422,6 +446,7 @@ public class Paint_Delegate { delegate.updateFontObject(); } + @LayoutlibDelegate /*package*/ static float getTextSkewX(Paint thisPaint) { // get the delegate from the native int. Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); @@ -432,6 +457,7 @@ public class Paint_Delegate { return delegate.mTextSkewX; } + @LayoutlibDelegate /*package*/ static void setTextSkewX(Paint thisPaint, float skewX) { // get the delegate from the native int. Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); @@ -443,6 +469,7 @@ public class Paint_Delegate { delegate.updateFontObject(); } + @LayoutlibDelegate /*package*/ static float ascent(Paint thisPaint) { // get the delegate Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); @@ -459,6 +486,7 @@ public class Paint_Delegate { return 0; } + @LayoutlibDelegate /*package*/ static float descent(Paint thisPaint) { // get the delegate Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); @@ -475,6 +503,7 @@ public class Paint_Delegate { } + @LayoutlibDelegate /*package*/ static float getFontMetrics(Paint thisPaint, FontMetrics metrics) { // get the delegate Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); @@ -485,6 +514,7 @@ public class Paint_Delegate { return delegate.getFontMetrics(metrics); } + @LayoutlibDelegate /*package*/ static int getFontMetricsInt(Paint thisPaint, FontMetricsInt fmi) { // get the delegate Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); @@ -509,11 +539,9 @@ public class Paint_Delegate { return 0; } + @LayoutlibDelegate /*package*/ static float native_measureText(Paint thisPaint, char[] text, int index, int count) { - // WARNING: the logic in this method is similar to Canvas.drawText. - // Any change to this method should be reflected in Canvas.drawText - // get the delegate Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); if (delegate == null) { @@ -523,32 +551,73 @@ public class Paint_Delegate { return delegate.measureText(text, index, count); } + @LayoutlibDelegate /*package*/ static float native_measureText(Paint thisPaint, String text, int start, int end) { return native_measureText(thisPaint, text.toCharArray(), start, end - start); } + @LayoutlibDelegate /*package*/ static float native_measureText(Paint thisPaint, String text) { return native_measureText(thisPaint, text.toCharArray(), 0, text.length()); } + @LayoutlibDelegate /*package*/ static int native_breakText(Paint thisPaint, char[] text, int index, int count, float maxWidth, float[] measuredWidth) { - // FIXME - throw new UnsupportedOperationException(); + + // get the delegate + Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); + if (delegate == null) { + return 0; + } + + int inc = count > 0 ? 1 : -1; + + int measureIndex = 0; + float measureAcc = 0; + for (int i = index; i != index + count; i += inc, measureIndex++) { + int start, end; + if (i < index) { + start = i; + end = index; + } else { + start = index; + end = i; + } + + // measure from start to end + float res = delegate.measureText(text, start, end - start + 1); + + if (measuredWidth != null) { + measuredWidth[measureIndex] = res; + } + + measureAcc += res; + if (res > maxWidth) { + // we should not return this char index, but since it's 0-based + // and we need to return a count, we simply return measureIndex; + return measureIndex; + } + + } + + return measureIndex; } + @LayoutlibDelegate /*package*/ static int native_breakText(Paint thisPaint, String text, boolean measureForwards, float maxWidth, float[] measuredWidth) { - // FIXME - throw new UnsupportedOperationException(); + return native_breakText(thisPaint, text.toCharArray(), 0, text.length(), maxWidth, + measuredWidth); } - + @LayoutlibDelegate /*package*/ static int native_init() { Paint_Delegate newDelegate = new Paint_Delegate(); - return sManager.addDelegate(newDelegate); + return sManager.addNewDelegate(newDelegate); } + @LayoutlibDelegate /*package*/ static int native_initWithPaint(int paint) { // get the delegate from the native int. Paint_Delegate delegate = sManager.getDelegate(paint); @@ -557,9 +626,10 @@ public class Paint_Delegate { } Paint_Delegate newDelegate = new Paint_Delegate(delegate); - return sManager.addDelegate(newDelegate); + return sManager.addNewDelegate(newDelegate); } + @LayoutlibDelegate /*package*/ static void native_reset(int native_object) { // get the delegate from the native int. Paint_Delegate delegate = sManager.getDelegate(native_object); @@ -570,6 +640,7 @@ public class Paint_Delegate { delegate.reset(); } + @LayoutlibDelegate /*package*/ static void native_set(int native_dst, int native_src) { // get the delegate from the native int. Paint_Delegate delegate_dst = sManager.getDelegate(native_dst); @@ -586,6 +657,7 @@ public class Paint_Delegate { delegate_dst.set(delegate_src); } + @LayoutlibDelegate /*package*/ static int native_getStyle(int native_object) { // get the delegate from the native int. Paint_Delegate delegate = sManager.getDelegate(native_object); @@ -596,6 +668,7 @@ public class Paint_Delegate { return delegate.mStyle; } + @LayoutlibDelegate /*package*/ static void native_setStyle(int native_object, int style) { // get the delegate from the native int. Paint_Delegate delegate = sManager.getDelegate(native_object); @@ -606,6 +679,7 @@ public class Paint_Delegate { delegate.mStyle = style; } + @LayoutlibDelegate /*package*/ static int native_getStrokeCap(int native_object) { // get the delegate from the native int. Paint_Delegate delegate = sManager.getDelegate(native_object); @@ -616,6 +690,7 @@ public class Paint_Delegate { return delegate.mCap; } + @LayoutlibDelegate /*package*/ static void native_setStrokeCap(int native_object, int cap) { // get the delegate from the native int. Paint_Delegate delegate = sManager.getDelegate(native_object); @@ -626,6 +701,7 @@ public class Paint_Delegate { delegate.mCap = cap; } + @LayoutlibDelegate /*package*/ static int native_getStrokeJoin(int native_object) { // get the delegate from the native int. Paint_Delegate delegate = sManager.getDelegate(native_object); @@ -636,6 +712,7 @@ public class Paint_Delegate { return delegate.mJoin; } + @LayoutlibDelegate /*package*/ static void native_setStrokeJoin(int native_object, int join) { // get the delegate from the native int. Paint_Delegate delegate = sManager.getDelegate(native_object); @@ -646,6 +723,7 @@ public class Paint_Delegate { delegate.mJoin = join; } + @LayoutlibDelegate /*package*/ static boolean native_getFillPath(int native_object, int src, int dst) { Paint_Delegate paint = sManager.getDelegate(native_object); if (paint == null) { @@ -671,6 +749,7 @@ public class Paint_Delegate { return true; } + @LayoutlibDelegate /*package*/ static int native_setShader(int native_object, int shader) { // get the delegate from the native int. Paint_Delegate delegate = sManager.getDelegate(native_object); @@ -678,9 +757,12 @@ public class Paint_Delegate { return shader; } - return delegate.mShader = shader; + delegate.mShader = Shader_Delegate.getDelegate(shader); + + return shader; } + @LayoutlibDelegate /*package*/ static int native_setColorFilter(int native_object, int filter) { // get the delegate from the native int. Paint_Delegate delegate = sManager.getDelegate(native_object); @@ -688,18 +770,18 @@ public class Paint_Delegate { return filter; } - delegate.mColorFilter = filter; + delegate.mColorFilter = ColorFilter_Delegate.getDelegate(filter);; // since none of those are supported, display a fidelity warning right away - ColorFilter_Delegate filterDelegate = delegate.getColorFilter(); - if (filterDelegate != null && filterDelegate.isSupported() == false) { + if (delegate.mColorFilter != null && delegate.mColorFilter.isSupported() == false) { Bridge.getLog().fidelityWarning(LayoutLog.TAG_COLORFILTER, - filterDelegate.getSupportMessage(), null, null /*data*/); + delegate.mColorFilter.getSupportMessage(), null, null /*data*/); } return filter; } + @LayoutlibDelegate /*package*/ static int native_setXfermode(int native_object, int xfermode) { // get the delegate from the native int. Paint_Delegate delegate = sManager.getDelegate(native_object); @@ -707,9 +789,12 @@ public class Paint_Delegate { return xfermode; } - return delegate.mXfermode = xfermode; + delegate.mXfermode = Xfermode_Delegate.getDelegate(xfermode); + + return xfermode; } + @LayoutlibDelegate /*package*/ static int native_setPathEffect(int native_object, int effect) { // get the delegate from the native int. Paint_Delegate delegate = sManager.getDelegate(native_object); @@ -717,9 +802,12 @@ public class Paint_Delegate { return effect; } - return delegate.mPathEffect = effect; + delegate.mPathEffect = PathEffect_Delegate.getDelegate(effect); + + return effect; } + @LayoutlibDelegate /*package*/ static int native_setMaskFilter(int native_object, int maskfilter) { // get the delegate from the native int. Paint_Delegate delegate = sManager.getDelegate(native_object); @@ -727,18 +815,18 @@ public class Paint_Delegate { return maskfilter; } - delegate.mMaskFilter = maskfilter; + delegate.mMaskFilter = MaskFilter_Delegate.getDelegate(maskfilter); // since none of those are supported, display a fidelity warning right away - MaskFilter_Delegate filterDelegate = delegate.getMaskFilter(); - if (filterDelegate != null && filterDelegate.isSupported() == false) { + if (delegate.mMaskFilter != null && delegate.mMaskFilter.isSupported() == false) { Bridge.getLog().fidelityWarning(LayoutLog.TAG_MASKFILTER, - filterDelegate.getSupportMessage(), null, null /*data*/); + delegate.mMaskFilter.getSupportMessage(), null, null /*data*/); } return maskfilter; } + @LayoutlibDelegate /*package*/ static int native_setTypeface(int native_object, int typeface) { // get the delegate from the native int. Paint_Delegate delegate = sManager.getDelegate(native_object); @@ -746,11 +834,12 @@ public class Paint_Delegate { return 0; } - delegate.mTypeface = typeface; + delegate.mTypeface = Typeface_Delegate.getDelegate(typeface); delegate.updateFontObject(); - return delegate.mTypeface; + return typeface; } + @LayoutlibDelegate /*package*/ static int native_setRasterizer(int native_object, int rasterizer) { // get the delegate from the native int. Paint_Delegate delegate = sManager.getDelegate(native_object); @@ -758,18 +847,18 @@ public class Paint_Delegate { return rasterizer; } - delegate.mRasterizer = rasterizer; + delegate.mRasterizer = Rasterizer_Delegate.getDelegate(rasterizer); // since none of those are supported, display a fidelity warning right away - Rasterizer_Delegate rasterizerDelegate = delegate.getRasterizer(); - if (rasterizerDelegate != null && rasterizerDelegate.isSupported() == false) { + if (delegate.mRasterizer != null && delegate.mRasterizer.isSupported() == false) { Bridge.getLog().fidelityWarning(LayoutLog.TAG_RASTERIZER, - rasterizerDelegate.getSupportMessage(), null, null /*data*/); + delegate.mRasterizer.getSupportMessage(), null, null /*data*/); } return rasterizer; } + @LayoutlibDelegate /*package*/ static int native_getTextAlign(int native_object) { // get the delegate from the native int. Paint_Delegate delegate = sManager.getDelegate(native_object); @@ -780,6 +869,7 @@ public class Paint_Delegate { return delegate.mTextAlign; } + @LayoutlibDelegate /*package*/ static void native_setTextAlign(int native_object, int align) { // get the delegate from the native int. Paint_Delegate delegate = sManager.getDelegate(native_object); @@ -790,6 +880,7 @@ public class Paint_Delegate { delegate.mTextAlign = align; } + @LayoutlibDelegate /*package*/ static float native_getFontMetrics(int native_paint, FontMetrics metrics) { // get the delegate from the native int. Paint_Delegate delegate = sManager.getDelegate(native_paint); @@ -800,18 +891,55 @@ public class Paint_Delegate { return delegate.getFontMetrics(metrics); } + @LayoutlibDelegate /*package*/ static int native_getTextWidths(int native_object, char[] text, int index, int count, float[] widths) { - // FIXME - throw new UnsupportedOperationException(); + // get the delegate from the native int. + Paint_Delegate delegate = sManager.getDelegate(native_object); + if (delegate == null) { + return 0; + } + + if (delegate.mFonts.size() > 0) { + // FIXME: handle multi-char characters (see measureText) + float totalAdvance = 0; + for (int i = 0; i < count; i++) { + char c = text[i + index]; + boolean found = false; + for (FontInfo info : delegate.mFonts) { + if (info.mFont.canDisplay(c)) { + float adv = info.mMetrics.charWidth(c); + totalAdvance += adv; + if (widths != null) { + widths[i] = adv; + } + + found = true; + break; + } + } + + if (found == false) { + // no advance for this char. + if (widths != null) { + widths[i] = 0.f; + } + } + } + + return (int) totalAdvance; + } + + return 0; } + @LayoutlibDelegate /*package*/ static int native_getTextWidths(int native_object, String text, int start, int end, float[] widths) { - // FIXME - throw new UnsupportedOperationException(); + return native_getTextWidths(native_object, text.toCharArray(), start, end - start, widths); } + @LayoutlibDelegate /*package*/ static float native_getTextRunAdvances(int native_object, char[] text, int index, int count, int contextIndex, int contextCount, int flags, float[] advances, int advancesIndex) { @@ -855,6 +983,7 @@ public class Paint_Delegate { } + @LayoutlibDelegate /*package*/ static float native_getTextRunAdvances(int native_object, String text, int start, int end, int contextStart, int contextEnd, int flags, float[] advances, int advancesIndex) { @@ -867,44 +996,70 @@ public class Paint_Delegate { contextEnd - contextStart, flags, advances, advancesIndex); } + @LayoutlibDelegate /*package*/ static int native_getTextRunCursor(Paint thisPaint, int native_object, char[] text, int contextStart, int contextLength, int flags, int offset, int cursorOpt) { // FIXME - throw new UnsupportedOperationException(); + Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED, + "Paint.getTextRunCursor is not supported.", null, null /*data*/); + return 0; } + @LayoutlibDelegate /*package*/ static int native_getTextRunCursor(Paint thisPaint, int native_object, String text, int contextStart, int contextEnd, int flags, int offset, int cursorOpt) { // FIXME - throw new UnsupportedOperationException(); + Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED, + "Paint.getTextRunCursor is not supported.", null, null /*data*/); + return 0; } + @LayoutlibDelegate /*package*/ static void native_getTextPath(int native_object, int bidiFlags, char[] text, int index, int count, float x, float y, int path) { // FIXME - throw new UnsupportedOperationException(); + Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED, + "Paint.getTextPath is not supported.", null, null /*data*/); } + @LayoutlibDelegate /*package*/ static void native_getTextPath(int native_object, int bidiFlags, String text, int start, int end, float x, float y, int path) { // FIXME - throw new UnsupportedOperationException(); + Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED, + "Paint.getTextPath is not supported.", null, null /*data*/); } + @LayoutlibDelegate /*package*/ static void nativeGetStringBounds(int nativePaint, String text, int start, int end, Rect bounds) { - // FIXME - throw new UnsupportedOperationException(); + nativeGetCharArrayBounds(nativePaint, text.toCharArray(), start, end - start, bounds); } + @LayoutlibDelegate /*package*/ static void nativeGetCharArrayBounds(int nativePaint, char[] text, int index, int count, Rect bounds) { - // FIXME - throw new UnsupportedOperationException(); + + // get the delegate from the native int. + Paint_Delegate delegate = sManager.getDelegate(nativePaint); + if (delegate == null) { + return; + } + + // FIXME should test if the main font can display all those characters. + // See MeasureText + if (delegate.mFonts.size() > 0) { + FontInfo mainInfo = delegate.mFonts.get(0); + + Rectangle2D rect = mainInfo.mFont.getStringBounds(text, index, index + count, + delegate.mFontContext); + bounds.set(0, 0, (int) rect.getWidth(), (int) rect.getHeight()); + } } + @LayoutlibDelegate /*package*/ static void finalizer(int nativePaint) { - sManager.removeDelegate(nativePaint); + sManager.removeJavaReferenceFor(nativePaint); } // ---- Private delegate/helper methods ---- @@ -946,18 +1101,18 @@ public class Paint_Delegate { mCap = Paint.Cap.BUTT.nativeInt; mJoin = Paint.Join.MITER.nativeInt; mTextAlign = 0; - mTypeface = Typeface.sDefaults[0].native_instance; + mTypeface = Typeface_Delegate.getDelegate(Typeface.sDefaults[0].native_instance); mStrokeWidth = 1.f; mStrokeMiter = 4.f; mTextSize = 20.f; mTextScaleX = 1.f; mTextSkewX = 0.f; - mXfermode = 0; - mColorFilter = 0; - mShader = 0; - mPathEffect = 0; - mMaskFilter = 0; - mRasterizer = 0; + mXfermode = null; + mColorFilter = null; + mShader = null; + mPathEffect = null; + mMaskFilter = null; + mRasterizer = null; updateFontObject(); } @@ -966,9 +1121,9 @@ public class Paint_Delegate { */ @SuppressWarnings("deprecation") private void updateFontObject() { - if (mTypeface != 0) { + if (mTypeface != null) { // Get the fonts from the TypeFace object. - List fonts = Typeface_Delegate.getFonts(mTypeface); + List fonts = mTypeface.getFonts(); // create new font objects as well as FontMetrics, based on the current text size // and skew info. @@ -991,6 +1146,10 @@ public class Paint_Delegate { } /*package*/ float measureText(char[] text, int index, int count) { + + // WARNING: the logic in this method is similar to Canvas_Delegate.native_drawText + // Any change to this method should be reflected there as well + if (mFonts.size() > 0) { FontInfo mainFont = mFonts.get(0); int i = index; @@ -1038,6 +1197,8 @@ public class Paint_Delegate { i += size; } } + + return total; } return 0; diff --git a/tools/layoutlib/bridge/src/android/graphics/PathDashPathEffect_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/PathDashPathEffect_Delegate.java index d12bfeaae2ea6..c448f0ec0f20b 100644 --- a/tools/layoutlib/bridge/src/android/graphics/PathDashPathEffect_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/PathDashPathEffect_Delegate.java @@ -17,6 +17,7 @@ package android.graphics; import com.android.layoutlib.bridge.impl.DelegateManager; +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; import java.awt.Stroke; @@ -60,10 +61,11 @@ public class PathDashPathEffect_Delegate extends PathEffect_Delegate { // ---- native methods ---- + @LayoutlibDelegate /*package*/ static int nativeCreate(int native_path, float advance, float phase, int native_style) { PathDashPathEffect_Delegate newDelegate = new PathDashPathEffect_Delegate(); - return sManager.addDelegate(newDelegate); + return sManager.addNewDelegate(newDelegate); } // ---- Private delegate/helper methods ---- diff --git a/tools/layoutlib/bridge/src/android/graphics/PathEffect_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/PathEffect_Delegate.java index c5884236d67e1..bd2b6de480da2 100644 --- a/tools/layoutlib/bridge/src/android/graphics/PathEffect_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/PathEffect_Delegate.java @@ -17,6 +17,7 @@ package android.graphics; import com.android.layoutlib.bridge.impl.DelegateManager; +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; import java.awt.Stroke; @@ -39,7 +40,7 @@ public abstract class PathEffect_Delegate { // ---- delegate manager ---- protected static final DelegateManager sManager = - new DelegateManager(); + new DelegateManager(PathEffect_Delegate.class); // ---- delegate helper data ---- @@ -58,8 +59,9 @@ public abstract class PathEffect_Delegate { // ---- native methods ---- + @LayoutlibDelegate /*package*/ static void nativeDestructor(int native_patheffect) { - sManager.removeDelegate(native_patheffect); + sManager.removeJavaReferenceFor(native_patheffect); } // ---- Private delegate/helper methods ---- diff --git a/tools/layoutlib/bridge/src/android/graphics/Path_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Path_Delegate.java index a4e43c1118793..6c9f48fb003c0 100644 --- a/tools/layoutlib/bridge/src/android/graphics/Path_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/Path_Delegate.java @@ -19,6 +19,7 @@ package android.graphics; import com.android.ide.common.rendering.api.LayoutLog; import com.android.layoutlib.bridge.Bridge; import com.android.layoutlib.bridge.impl.DelegateManager; +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; import android.graphics.Path.Direction; import android.graphics.Path.FillType; @@ -49,7 +50,7 @@ public final class Path_Delegate { // ---- delegate manager ---- private static final DelegateManager sManager = - new DelegateManager(); + new DelegateManager(Path_Delegate.class); // ---- delegate data ---- private FillType mFillType = FillType.WINDING; @@ -84,13 +85,15 @@ public final class Path_Delegate { // ---- native methods ---- + @LayoutlibDelegate /*package*/ static int init1() { // create the delegate Path_Delegate newDelegate = new Path_Delegate(); - return sManager.addDelegate(newDelegate); + return sManager.addNewDelegate(newDelegate); } + @LayoutlibDelegate /*package*/ static int init2(int nPath) { // create the delegate Path_Delegate newDelegate = new Path_Delegate(); @@ -101,9 +104,10 @@ public final class Path_Delegate { newDelegate.set(pathDelegate); } - return sManager.addDelegate(newDelegate); + return sManager.addNewDelegate(newDelegate); } + @LayoutlibDelegate /*package*/ static void native_reset(int nPath) { Path_Delegate pathDelegate = sManager.getDelegate(nPath); if (pathDelegate == null) { @@ -113,12 +117,14 @@ public final class Path_Delegate { pathDelegate.mPath.reset(); } + @LayoutlibDelegate /*package*/ static void native_rewind(int nPath) { // call out to reset since there's nothing to optimize in // terms of data structs. native_reset(nPath); } + @LayoutlibDelegate /*package*/ static void native_set(int native_dst, int native_src) { Path_Delegate pathDstDelegate = sManager.getDelegate(native_dst); if (pathDstDelegate == null) { @@ -133,6 +139,7 @@ public final class Path_Delegate { pathDstDelegate.set(pathSrcDelegate); } + @LayoutlibDelegate /*package*/ static int native_getFillType(int nPath) { Path_Delegate pathDelegate = sManager.getDelegate(nPath); if (pathDelegate == null) { @@ -142,6 +149,7 @@ public final class Path_Delegate { return pathDelegate.mFillType.nativeInt; } + @LayoutlibDelegate /*package*/ static void native_setFillType(int nPath, int ft) { Path_Delegate pathDelegate = sManager.getDelegate(nPath); if (pathDelegate == null) { @@ -151,6 +159,7 @@ public final class Path_Delegate { pathDelegate.mFillType = Path.sFillTypeArray[ft]; } + @LayoutlibDelegate /*package*/ static boolean native_isEmpty(int nPath) { Path_Delegate pathDelegate = sManager.getDelegate(nPath); if (pathDelegate == null) { @@ -160,6 +169,7 @@ public final class Path_Delegate { return pathDelegate.isEmpty(); } + @LayoutlibDelegate /*package*/ static boolean native_isRect(int nPath, RectF rect) { Path_Delegate pathDelegate = sManager.getDelegate(nPath); if (pathDelegate == null) { @@ -179,6 +189,7 @@ public final class Path_Delegate { return false; } + @LayoutlibDelegate /*package*/ static void native_computeBounds(int nPath, RectF bounds) { Path_Delegate pathDelegate = sManager.getDelegate(nPath); if (pathDelegate == null) { @@ -188,11 +199,13 @@ public final class Path_Delegate { pathDelegate.fillBounds(bounds); } + @LayoutlibDelegate /*package*/ static void native_incReserve(int nPath, int extraPtCount) { // since we use a java2D path, there's no way to pre-allocate new points, // so we do nothing. } + @LayoutlibDelegate /*package*/ static void native_moveTo(int nPath, float x, float y) { Path_Delegate pathDelegate = sManager.getDelegate(nPath); if (pathDelegate == null) { @@ -202,6 +215,7 @@ public final class Path_Delegate { pathDelegate.moveTo(x, y); } + @LayoutlibDelegate /*package*/ static void native_rMoveTo(int nPath, float dx, float dy) { Path_Delegate pathDelegate = sManager.getDelegate(nPath); if (pathDelegate == null) { @@ -211,6 +225,7 @@ public final class Path_Delegate { pathDelegate.rMoveTo(dx, dy); } + @LayoutlibDelegate /*package*/ static void native_lineTo(int nPath, float x, float y) { Path_Delegate pathDelegate = sManager.getDelegate(nPath); if (pathDelegate == null) { @@ -220,6 +235,7 @@ public final class Path_Delegate { pathDelegate.lineTo(x, y); } + @LayoutlibDelegate /*package*/ static void native_rLineTo(int nPath, float dx, float dy) { Path_Delegate pathDelegate = sManager.getDelegate(nPath); if (pathDelegate == null) { @@ -229,6 +245,7 @@ public final class Path_Delegate { pathDelegate.rLineTo(dx, dy); } + @LayoutlibDelegate /*package*/ static void native_quadTo(int nPath, float x1, float y1, float x2, float y2) { Path_Delegate pathDelegate = sManager.getDelegate(nPath); if (pathDelegate == null) { @@ -238,6 +255,7 @@ public final class Path_Delegate { pathDelegate.quadTo(x1, y1, x2, y2); } + @LayoutlibDelegate /*package*/ static void native_rQuadTo(int nPath, float dx1, float dy1, float dx2, float dy2) { Path_Delegate pathDelegate = sManager.getDelegate(nPath); if (pathDelegate == null) { @@ -247,6 +265,7 @@ public final class Path_Delegate { pathDelegate.rQuadTo(dx1, dy1, dx2, dy2); } + @LayoutlibDelegate /*package*/ static void native_cubicTo(int nPath, float x1, float y1, float x2, float y2, float x3, float y3) { Path_Delegate pathDelegate = sManager.getDelegate(nPath); @@ -257,6 +276,7 @@ public final class Path_Delegate { pathDelegate.cubicTo(x1, y1, x2, y2, x3, y3); } + @LayoutlibDelegate /*package*/ static void native_rCubicTo(int nPath, float x1, float y1, float x2, float y2, float x3, float y3) { Path_Delegate pathDelegate = sManager.getDelegate(nPath); @@ -267,6 +287,7 @@ public final class Path_Delegate { pathDelegate.rCubicTo(x1, y1, x2, y2, x3, y3); } + @LayoutlibDelegate /*package*/ static void native_arcTo(int nPath, RectF oval, float startAngle, float sweepAngle, boolean forceMoveTo) { Path_Delegate pathDelegate = sManager.getDelegate(nPath); @@ -277,6 +298,7 @@ public final class Path_Delegate { pathDelegate.arcTo(oval, startAngle, sweepAngle, forceMoveTo); } + @LayoutlibDelegate /*package*/ static void native_close(int nPath) { Path_Delegate pathDelegate = sManager.getDelegate(nPath); if (pathDelegate == null) { @@ -286,6 +308,7 @@ public final class Path_Delegate { pathDelegate.close(); } + @LayoutlibDelegate /*package*/ static void native_addRect(int nPath, RectF rect, int dir) { Path_Delegate pathDelegate = sManager.getDelegate(nPath); if (pathDelegate == null) { @@ -295,6 +318,7 @@ public final class Path_Delegate { pathDelegate.addRect(rect.left, rect.top, rect.right, rect.bottom, dir); } + @LayoutlibDelegate /*package*/ static void native_addRect(int nPath, float left, float top, float right, float bottom, int dir) { Path_Delegate pathDelegate = sManager.getDelegate(nPath); @@ -305,47 +329,63 @@ public final class Path_Delegate { pathDelegate.addRect(left, top, right, bottom, dir); } + @LayoutlibDelegate /*package*/ static void native_addOval(int nPath, RectF oval, int dir) { // FIXME - throw new UnsupportedOperationException(); + Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED, + "Path.addOval is not supported.", null, null /*data*/); } + @LayoutlibDelegate /*package*/ static void native_addCircle(int nPath, float x, float y, float radius, int dir) { // FIXME - throw new UnsupportedOperationException(); + Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED, + "Path.addCircle is not supported.", null, null /*data*/); } + @LayoutlibDelegate /*package*/ static void native_addArc(int nPath, RectF oval, float startAngle, float sweepAngle) { // FIXME - throw new UnsupportedOperationException(); + Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED, + "Path.addArc is not supported.", null, null /*data*/); } + @LayoutlibDelegate /*package*/ static void native_addRoundRect(int nPath, RectF rect, float rx, float ry, int dir) { // FIXME - throw new UnsupportedOperationException(); + Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED, + "Path.addRoundRect is not supported.", null, null /*data*/); } + @LayoutlibDelegate /*package*/ static void native_addRoundRect(int nPath, RectF r, float[] radii, int dir) { // FIXME - throw new UnsupportedOperationException(); + Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED, + "Path.addRoundRect is not supported.", null, null /*data*/); } + @LayoutlibDelegate /*package*/ static void native_addPath(int nPath, int src, float dx, float dy) { // FIXME - throw new UnsupportedOperationException(); + Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED, + "Path.addPath is not supported.", null, null /*data*/); } + @LayoutlibDelegate /*package*/ static void native_addPath(int nPath, int src) { native_addPath(nPath, src, 0, 0); } + @LayoutlibDelegate /*package*/ static void native_addPath(int nPath, int src, int matrix) { // FIXME - throw new UnsupportedOperationException(); + Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED, + "Path.addPath is not supported.", null, null /*data*/); } + @LayoutlibDelegate /*package*/ static void native_offset(int nPath, float dx, float dy, int dst_path) { Path_Delegate pathDelegate = sManager.getDelegate(nPath); if (pathDelegate == null) { @@ -358,10 +398,12 @@ public final class Path_Delegate { pathDelegate.offset(dx, dy, dstDelegate); } + @LayoutlibDelegate /*package*/ static void native_offset(int nPath, float dx, float dy) { native_offset(nPath, dx, dy, 0); } + @LayoutlibDelegate /*package*/ static void native_setLastPoint(int nPath, float dx, float dy) { Path_Delegate pathDelegate = sManager.getDelegate(nPath); if (pathDelegate == null) { @@ -372,6 +414,7 @@ public final class Path_Delegate { pathDelegate.mLastY = dy; } + @LayoutlibDelegate /*package*/ static void native_transform(int nPath, int matrix, int dst_path) { Path_Delegate pathDelegate = sManager.getDelegate(nPath); @@ -390,12 +433,14 @@ public final class Path_Delegate { pathDelegate.transform(matrixDelegate, dstDelegate); } + @LayoutlibDelegate /*package*/ static void native_transform(int nPath, int matrix) { native_transform(nPath, matrix, 0); } + @LayoutlibDelegate /*package*/ static void finalizer(int nPath) { - sManager.removeDelegate(nPath); + sManager.removeJavaReferenceFor(nPath); } diff --git a/tools/layoutlib/bridge/src/android/graphics/PixelXorXfermode_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/PixelXorXfermode_Delegate.java index 516a2b98a2147..4ab044bd107ab 100644 --- a/tools/layoutlib/bridge/src/android/graphics/PixelXorXfermode_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/PixelXorXfermode_Delegate.java @@ -17,6 +17,7 @@ package android.graphics; import com.android.layoutlib.bridge.impl.DelegateManager; +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; import java.awt.Composite; @@ -59,9 +60,10 @@ public class PixelXorXfermode_Delegate extends Xfermode_Delegate { // ---- native methods ---- + @LayoutlibDelegate /*package*/ static int nativeCreate(int opColor) { PixelXorXfermode_Delegate newDelegate = new PixelXorXfermode_Delegate(); - return sManager.addDelegate(newDelegate); + return sManager.addNewDelegate(newDelegate); } // ---- Private delegate/helper methods ---- diff --git a/tools/layoutlib/bridge/src/android/graphics/PorterDuffColorFilter_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/PorterDuffColorFilter_Delegate.java index 9038636a8b26c..c45dbaad344d2 100644 --- a/tools/layoutlib/bridge/src/android/graphics/PorterDuffColorFilter_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/PorterDuffColorFilter_Delegate.java @@ -17,6 +17,7 @@ package android.graphics; import com.android.layoutlib.bridge.impl.DelegateManager; +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; /** * Delegate implementing the native methods of android.graphics.PorterDuffColorFilter @@ -53,11 +54,13 @@ public class PorterDuffColorFilter_Delegate extends ColorFilter_Delegate { // ---- native methods ---- + @LayoutlibDelegate /*package*/ static int native_CreatePorterDuffFilter(int srcColor, int porterDuffMode) { PorterDuffColorFilter_Delegate newDelegate = new PorterDuffColorFilter_Delegate(); - return sManager.addDelegate(newDelegate); + return sManager.addNewDelegate(newDelegate); } + @LayoutlibDelegate /*package*/ static int nCreatePorterDuffFilter(int nativeFilter, int srcColor, int porterDuffMode) { // pass diff --git a/tools/layoutlib/bridge/src/android/graphics/PorterDuffXfermode_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/PorterDuffXfermode_Delegate.java index 147e1d0e76074..4301c1a2c5d73 100644 --- a/tools/layoutlib/bridge/src/android/graphics/PorterDuffXfermode_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/PorterDuffXfermode_Delegate.java @@ -19,6 +19,7 @@ package android.graphics; import com.android.ide.common.rendering.api.LayoutLog; import com.android.layoutlib.bridge.Bridge; import com.android.layoutlib.bridge.impl.DelegateManager; +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; import java.awt.AlphaComposite; import java.awt.Composite; @@ -125,9 +126,10 @@ public class PorterDuffXfermode_Delegate extends Xfermode_Delegate { // ---- native methods ---- + @LayoutlibDelegate /*package*/ static int nativeCreateXfermode(int mode) { PorterDuffXfermode_Delegate newDelegate = new PorterDuffXfermode_Delegate(mode); - return sManager.addDelegate(newDelegate); + return sManager.addNewDelegate(newDelegate); } // ---- Private delegate/helper methods ---- diff --git a/tools/layoutlib/bridge/src/android/graphics/RadialGradient_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/RadialGradient_Delegate.java index ffdf5ddb02c9e..9bf78b4c72490 100644 --- a/tools/layoutlib/bridge/src/android/graphics/RadialGradient_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/RadialGradient_Delegate.java @@ -19,6 +19,7 @@ package android.graphics; import com.android.ide.common.rendering.api.LayoutLog; import com.android.layoutlib.bridge.Bridge; import com.android.layoutlib.bridge.impl.DelegateManager; +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; import android.graphics.Shader.TileMode; @@ -52,25 +53,29 @@ public class RadialGradient_Delegate extends Gradient_Delegate { // ---- native methods ---- + @LayoutlibDelegate /*package*/ static int nativeCreate1(float x, float y, float radius, int colors[], float positions[], int tileMode) { RadialGradient_Delegate newDelegate = new RadialGradient_Delegate(x, y, radius, colors, positions, Shader_Delegate.getTileMode(tileMode)); - return sManager.addDelegate(newDelegate); + return sManager.addNewDelegate(newDelegate); } + @LayoutlibDelegate /*package*/ static int nativeCreate2(float x, float y, float radius, int color0, int color1, int tileMode) { return nativeCreate1(x, y, radius, new int[] { color0, color1 }, null /*positions*/, tileMode); } + @LayoutlibDelegate /*package*/ static int nativePostCreate1(int native_shader, float x, float y, float radius, int colors[], float positions[], int tileMode) { // nothing to be done here. return 0; } + @LayoutlibDelegate /*package*/ static int nativePostCreate2(int native_shader, float x, float y, float radius, int color0, int color1, int tileMode) { // nothing to be done here. diff --git a/tools/layoutlib/bridge/src/android/graphics/Rasterizer_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Rasterizer_Delegate.java index 9fd67bead1dea..2812b6b2539bd 100644 --- a/tools/layoutlib/bridge/src/android/graphics/Rasterizer_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/Rasterizer_Delegate.java @@ -17,6 +17,7 @@ package android.graphics; import com.android.layoutlib.bridge.impl.DelegateManager; +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; /** * Delegate implementing the native methods of android.graphics.Rasterizer @@ -37,7 +38,7 @@ public abstract class Rasterizer_Delegate { // ---- delegate manager ---- protected static final DelegateManager sManager = - new DelegateManager(); + new DelegateManager(Rasterizer_Delegate.class); // ---- delegate helper data ---- @@ -54,8 +55,9 @@ public abstract class Rasterizer_Delegate { // ---- native methods ---- + @LayoutlibDelegate /*package*/ static void finalizer(int native_instance) { - sManager.removeDelegate(native_instance); + sManager.removeJavaReferenceFor(native_instance); } // ---- Private delegate/helper methods ---- diff --git a/tools/layoutlib/bridge/src/android/graphics/Region_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Region_Delegate.java index d2b6b27bf543a..cb31b8fdb7115 100644 --- a/tools/layoutlib/bridge/src/android/graphics/Region_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/Region_Delegate.java @@ -19,6 +19,7 @@ package android.graphics; import com.android.ide.common.rendering.api.LayoutLog; import com.android.layoutlib.bridge.Bridge; import com.android.layoutlib.bridge.impl.DelegateManager; +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; import android.os.Parcel; @@ -47,7 +48,7 @@ public class Region_Delegate { // ---- delegate manager ---- protected static final DelegateManager sManager = - new DelegateManager(); + new DelegateManager(Region_Delegate.class); // ---- delegate helper data ---- @@ -136,6 +137,7 @@ public class Region_Delegate { // ---- native methods ---- + @LayoutlibDelegate /*package*/ static boolean isEmpty(Region thisRegion) { Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion); if (regionDelegate == null) { @@ -145,6 +147,7 @@ public class Region_Delegate { return regionDelegate.mArea.isEmpty(); } + @LayoutlibDelegate /*package*/ static boolean isRect(Region thisRegion) { Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion); if (regionDelegate == null) { @@ -154,6 +157,7 @@ public class Region_Delegate { return regionDelegate.mArea.isRectangular(); } + @LayoutlibDelegate /*package*/ static boolean isComplex(Region thisRegion) { Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion); if (regionDelegate == null) { @@ -163,6 +167,7 @@ public class Region_Delegate { return regionDelegate.mArea.isSingular() == false; } + @LayoutlibDelegate /*package*/ static boolean contains(Region thisRegion, int x, int y) { Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion); if (regionDelegate == null) { @@ -172,6 +177,7 @@ public class Region_Delegate { return regionDelegate.mArea.contains(x, y); } + @LayoutlibDelegate /*package*/ static boolean quickContains(Region thisRegion, int left, int top, int right, int bottom) { Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion); @@ -183,6 +189,7 @@ public class Region_Delegate { regionDelegate.mArea.contains(left, top, right - left, bottom - top); } + @LayoutlibDelegate /*package*/ static boolean quickReject(Region thisRegion, int left, int top, int right, int bottom) { Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion); @@ -194,6 +201,7 @@ public class Region_Delegate { regionDelegate.mArea.intersects(left, top, right - left, bottom - top) == false; } + @LayoutlibDelegate /*package*/ static boolean quickReject(Region thisRegion, Region rgn) { Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion); if (regionDelegate == null) { @@ -211,6 +219,7 @@ public class Region_Delegate { } + @LayoutlibDelegate /*package*/ static void translate(Region thisRegion, int dx, int dy, Region dst) { Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion); if (regionDelegate == null) { @@ -232,6 +241,7 @@ public class Region_Delegate { } } + @LayoutlibDelegate /*package*/ static void scale(Region thisRegion, float scale, Region dst) { Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion); if (regionDelegate == null) { @@ -253,15 +263,18 @@ public class Region_Delegate { } } + @LayoutlibDelegate /*package*/ static int nativeConstructor() { Region_Delegate newDelegate = new Region_Delegate(); - return sManager.addDelegate(newDelegate); + return sManager.addNewDelegate(newDelegate); } + @LayoutlibDelegate /*package*/ static void nativeDestructor(int native_region) { - sManager.removeDelegate(native_region); + sManager.removeJavaReferenceFor(native_region); } + @LayoutlibDelegate /*package*/ static boolean nativeSetRegion(int native_dst, int native_src) { Region_Delegate dstRegion = sManager.getDelegate(native_dst); if (dstRegion == null) { @@ -279,6 +292,7 @@ public class Region_Delegate { return true; } + @LayoutlibDelegate /*package*/ static boolean nativeSetRect(int native_dst, int left, int top, int right, int bottom) { Region_Delegate dstRegion = sManager.getDelegate(native_dst); @@ -290,6 +304,7 @@ public class Region_Delegate { return dstRegion.mArea.getBounds().isEmpty() == false; } + @LayoutlibDelegate /*package*/ static boolean nativeSetPath(int native_dst, int native_path, int native_clip) { Region_Delegate dstRegion = sManager.getDelegate(native_dst); if (dstRegion == null) { @@ -311,6 +326,7 @@ public class Region_Delegate { return dstRegion.mArea.getBounds().isEmpty() == false; } + @LayoutlibDelegate /*package*/ static boolean nativeGetBounds(int native_region, Rect rect) { Region_Delegate region = sManager.getDelegate(native_region); if (region == null) { @@ -330,6 +346,7 @@ public class Region_Delegate { return true; } + @LayoutlibDelegate /*package*/ static boolean nativeGetBoundaryPath(int native_region, int native_path) { Region_Delegate region = sManager.getDelegate(native_region); if (region == null) { @@ -350,6 +367,7 @@ public class Region_Delegate { return true; } + @LayoutlibDelegate /*package*/ static boolean nativeOp(int native_dst, int left, int top, int right, int bottom, int op) { Region_Delegate region = sManager.getDelegate(native_dst); @@ -368,6 +386,7 @@ public class Region_Delegate { return region.mArea.getBounds().isEmpty() == false; } + @LayoutlibDelegate /*package*/ static boolean nativeOp(int native_dst, Rect rect, int native_region, int op) { Region_Delegate region = sManager.getDelegate(native_dst); if (region == null) { @@ -385,6 +404,7 @@ public class Region_Delegate { return region.mArea.getBounds().isEmpty() == false; } + @LayoutlibDelegate /*package*/ static boolean nativeOp(int native_dst, int native_region1, int native_region2, int op) { Region_Delegate dstRegion = sManager.getDelegate(native_dst); @@ -413,6 +433,7 @@ public class Region_Delegate { } + @LayoutlibDelegate /*package*/ static int nativeCreateFromParcel(Parcel p) { // This is only called by Region.CREATOR (Parcelable.Creator), which is only // used during aidl call so really this should not be called. @@ -422,6 +443,7 @@ public class Region_Delegate { return 0; } + @LayoutlibDelegate /*package*/ static boolean nativeWriteToParcel(int native_region, Parcel p) { // This is only called when sending a region through aidl, so really this should not @@ -432,6 +454,7 @@ public class Region_Delegate { return false; } + @LayoutlibDelegate /*package*/ static boolean nativeEquals(int native_r1, int native_r2) { Region_Delegate region1 = sManager.getDelegate(native_r1); if (region1 == null) { @@ -446,6 +469,7 @@ public class Region_Delegate { return region1.mArea.equals(region2.mArea); } + @LayoutlibDelegate /*package*/ static String nativeToString(int native_region) { Region_Delegate region = sManager.getDelegate(native_region); if (region == null) { diff --git a/tools/layoutlib/bridge/src/android/graphics/Shader_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Shader_Delegate.java index 7903ac986dfea..368c0384ded57 100644 --- a/tools/layoutlib/bridge/src/android/graphics/Shader_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/Shader_Delegate.java @@ -17,6 +17,7 @@ package android.graphics; import com.android.layoutlib.bridge.impl.DelegateManager; +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; import android.graphics.Shader.TileMode; @@ -39,12 +40,12 @@ public abstract class Shader_Delegate { // ---- delegate manager ---- protected static final DelegateManager sManager = - new DelegateManager(); + new DelegateManager(Shader_Delegate.class); // ---- delegate helper data ---- // ---- delegate data ---- - private int mLocalMatrix = 0; + private Matrix_Delegate mLocalMatrix = null; // ---- Public Helper methods ---- @@ -74,36 +75,12 @@ public abstract class Shader_Delegate { // ---- native methods ---- + @LayoutlibDelegate /*package*/ static void nativeDestructor(int native_shader, int native_skiaShader) { - sManager.removeDelegate(native_shader); - } - - /*package*/ static boolean nativeGetLocalMatrix(int native_shader, int matrix_instance) { - // get the delegate from the native int. - Shader_Delegate shaderDelegate = sManager.getDelegate(native_shader); - if (shaderDelegate == null) { - return false; - } - - // can be null if shader has no matrix (int is 0) - Matrix_Delegate localMatrixDelegate = Matrix_Delegate.getDelegate( - shaderDelegate.mLocalMatrix); - - // can be null if the int is 0. - Matrix_Delegate destMatrixDelegate = Matrix_Delegate.getDelegate(matrix_instance); - if (destMatrixDelegate != null) { - if (localMatrixDelegate != null) { - destMatrixDelegate.set(localMatrixDelegate); - } else { - // since there's no local matrix, it's considered to be the identity, reset - // the destination matrix - destMatrixDelegate.reset(); - } - } - - return localMatrixDelegate == null || localMatrixDelegate.isIdentity(); + sManager.removeJavaReferenceFor(native_shader); } + @LayoutlibDelegate /*package*/ static void nativeSetLocalMatrix(int native_shader, int native_skiaShader, int matrix_instance) { // get the delegate from the native int. @@ -112,15 +89,14 @@ public abstract class Shader_Delegate { return; } - shaderDelegate.mLocalMatrix = matrix_instance; + shaderDelegate.mLocalMatrix = Matrix_Delegate.getDelegate(matrix_instance); } // ---- Private delegate/helper methods ---- protected java.awt.geom.AffineTransform getLocalMatrix() { - Matrix_Delegate localMatrixDelegate = Matrix_Delegate.getDelegate(mLocalMatrix); - if (localMatrixDelegate != null) { - return localMatrixDelegate.getAffineTransform(); + if (mLocalMatrix != null) { + return mLocalMatrix.getAffineTransform(); } return new java.awt.geom.AffineTransform(); diff --git a/tools/layoutlib/bridge/src/android/graphics/SumPathEffect_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/SumPathEffect_Delegate.java index 0f92ca517acbb..410df0cf72f50 100644 --- a/tools/layoutlib/bridge/src/android/graphics/SumPathEffect_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/SumPathEffect_Delegate.java @@ -17,6 +17,7 @@ package android.graphics; import com.android.layoutlib.bridge.impl.DelegateManager; +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; import java.awt.Stroke; @@ -60,9 +61,10 @@ public class SumPathEffect_Delegate extends PathEffect_Delegate { // ---- native methods ---- + @LayoutlibDelegate /*package*/ static int nativeCreate(int first, int second) { SumPathEffect_Delegate newDelegate = new SumPathEffect_Delegate(); - return sManager.addDelegate(newDelegate); + return sManager.addNewDelegate(newDelegate); } // ---- Private delegate/helper methods ---- diff --git a/tools/layoutlib/bridge/src/android/graphics/SweepGradient_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/SweepGradient_Delegate.java index 048990a21a75d..966e06e4a8b27 100644 --- a/tools/layoutlib/bridge/src/android/graphics/SweepGradient_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/SweepGradient_Delegate.java @@ -19,6 +19,7 @@ package android.graphics; import com.android.ide.common.rendering.api.LayoutLog; import com.android.layoutlib.bridge.Bridge; import com.android.layoutlib.bridge.impl.DelegateManager; +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; /** * Delegate implementing the native methods of android.graphics.SweepGradient @@ -50,21 +51,25 @@ public class SweepGradient_Delegate extends Gradient_Delegate { // ---- native methods ---- + @LayoutlibDelegate /*package*/ static int nativeCreate1(float x, float y, int colors[], float positions[]) { SweepGradient_Delegate newDelegate = new SweepGradient_Delegate(x, y, colors, positions); - return sManager.addDelegate(newDelegate); + return sManager.addNewDelegate(newDelegate); } + @LayoutlibDelegate /*package*/ static int nativeCreate2(float x, float y, int color0, int color1) { return nativeCreate1(x, y, new int[] { color0, color1 }, null /*positions*/); } + @LayoutlibDelegate /*package*/ static int nativePostCreate1(int native_shader, float cx, float cy, int[] colors, float[] positions) { // nothing to be done here. return 0; } + @LayoutlibDelegate /*package*/ static int nativePostCreate2(int native_shader, float cx, float cy, int color0, int color1) { // nothing to be done here. diff --git a/tools/layoutlib/bridge/src/android/graphics/Typeface_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Typeface_Delegate.java index 00a2a57951dd6..0f084f7d7fc78 100644 --- a/tools/layoutlib/bridge/src/android/graphics/Typeface_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/Typeface_Delegate.java @@ -20,6 +20,7 @@ import com.android.ide.common.rendering.api.LayoutLog; import com.android.layoutlib.bridge.Bridge; import com.android.layoutlib.bridge.impl.DelegateManager; import com.android.layoutlib.bridge.impl.FontLoader; +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; import android.content.res.AssetManager; @@ -45,7 +46,7 @@ public final class Typeface_Delegate { // ---- delegate manager ---- private static final DelegateManager sManager = - new DelegateManager(); + new DelegateManager(Typeface_Delegate.class); // ---- delegate helper data ---- private static final String DEFAULT_FAMILY = "sans-serif"; @@ -73,6 +74,10 @@ public final class Typeface_Delegate { sPostInitDelegate.clear(); } + public static Typeface_Delegate getDelegate(int nativeTypeface) { + return sManager.getDelegate(nativeTypeface); + } + public static List getFonts(Typeface typeface) { return getFonts(typeface.native_instance); } @@ -83,11 +88,16 @@ public final class Typeface_Delegate { return null; } - return delegate.mFonts; + return delegate.getFonts(); + } + + public List getFonts() { + return mFonts; } // ---- native methods ---- + @LayoutlibDelegate /*package*/ static synchronized int nativeCreate(String familyName, int style) { if (familyName == null) { familyName = DEFAULT_FAMILY; @@ -103,9 +113,10 @@ public final class Typeface_Delegate { sPostInitDelegate.add(newDelegate); } - return sManager.addDelegate(newDelegate); + return sManager.addNewDelegate(newDelegate); } + @LayoutlibDelegate /*package*/ static synchronized int nativeCreateFromTypeface(int native_instance, int style) { Typeface_Delegate delegate = sManager.getDelegate(native_instance); if (delegate == null) { @@ -122,25 +133,29 @@ public final class Typeface_Delegate { sPostInitDelegate.add(newDelegate); } - return sManager.addDelegate(newDelegate); + return sManager.addNewDelegate(newDelegate); } + @LayoutlibDelegate /*package*/ static synchronized int nativeCreateFromAsset(AssetManager mgr, String path) { Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED, "Typeface.createFromAsset() is not supported.", null /*throwable*/, null /*data*/); return 0; } + @LayoutlibDelegate /*package*/ static synchronized int nativeCreateFromFile(String path) { Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED, "Typeface.createFromFile() is not supported.", null /*throwable*/, null /*data*/); return 0; } + @LayoutlibDelegate /*package*/ static void nativeUnref(int native_instance) { - sManager.removeDelegate(native_instance); + sManager.removeJavaReferenceFor(native_instance); } + @LayoutlibDelegate /*package*/ static int nativeGetStyle(int native_instance) { Typeface_Delegate delegate = sManager.getDelegate(native_instance); if (delegate == null) { @@ -150,6 +165,7 @@ public final class Typeface_Delegate { return delegate.mStyle; } + @LayoutlibDelegate /*package*/ static void setGammaForText(float blackGamma, float whiteGamma) { // This is for device testing only: pass } diff --git a/tools/layoutlib/bridge/src/android/graphics/Xfermode_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Xfermode_Delegate.java index 312318aa44d24..962d69cb6e8d1 100644 --- a/tools/layoutlib/bridge/src/android/graphics/Xfermode_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/Xfermode_Delegate.java @@ -17,6 +17,7 @@ package android.graphics; import com.android.layoutlib.bridge.impl.DelegateManager; +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; import java.awt.Composite; @@ -39,7 +40,7 @@ public abstract class Xfermode_Delegate { // ---- delegate manager ---- protected static final DelegateManager sManager = - new DelegateManager(); + new DelegateManager(Xfermode_Delegate.class); // ---- delegate helper data ---- @@ -58,8 +59,9 @@ public abstract class Xfermode_Delegate { // ---- native methods ---- + @LayoutlibDelegate /*package*/ static void finalizer(int native_instance) { - sManager.removeDelegate(native_instance); + sManager.removeJavaReferenceFor(native_instance); } // ---- Private delegate/helper methods ---- diff --git a/tools/layoutlib/bridge/src/android/os/Build_Delegate.java b/tools/layoutlib/bridge/src/android/os/Build_Delegate.java index f71860f76ec0a..ff82a5e25f551 100644 --- a/tools/layoutlib/bridge/src/android/os/Build_Delegate.java +++ b/tools/layoutlib/bridge/src/android/os/Build_Delegate.java @@ -18,6 +18,7 @@ package android.os; import com.android.layoutlib.bridge.Bridge; import com.android.layoutlib.bridge.impl.DelegateManager; +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; import java.util.Map; @@ -33,6 +34,7 @@ import java.util.Map; */ public class Build_Delegate { + @LayoutlibDelegate /*package*/ static String getString(String property) { Map properties = Bridge.getPlatformProperties(); String value = properties.get(property); diff --git a/tools/layoutlib/bridge/src/android/os/Handler_Delegate.java b/tools/layoutlib/bridge/src/android/os/Handler_Delegate.java index 4d4ec7f4b6cdf..2152c8ad19aee 100644 --- a/tools/layoutlib/bridge/src/android/os/Handler_Delegate.java +++ b/tools/layoutlib/bridge/src/android/os/Handler_Delegate.java @@ -16,6 +16,8 @@ package android.os; +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; + /** * Delegate overriding selected methods of android.os.Handler @@ -29,6 +31,7 @@ public class Handler_Delegate { // -------- Delegate methods + @LayoutlibDelegate /*package*/ static boolean sendMessageAtTime(Handler handler, Message msg, long uptimeMillis) { // get the callback IHandlerCallback callback = sCallbacks.get(); diff --git a/tools/layoutlib/bridge/src/android/os/SystemClock_Delegate.java b/tools/layoutlib/bridge/src/android/os/SystemClock_Delegate.java index be222fc991ded..63711a78e5d87 100644 --- a/tools/layoutlib/bridge/src/android/os/SystemClock_Delegate.java +++ b/tools/layoutlib/bridge/src/android/os/SystemClock_Delegate.java @@ -17,6 +17,7 @@ package android.os; import com.android.layoutlib.bridge.impl.DelegateManager; +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; /** * Delegate implementing the native methods of android.os.SystemClock @@ -31,6 +32,7 @@ import com.android.layoutlib.bridge.impl.DelegateManager; public class SystemClock_Delegate { private static long sBootTime = System.currentTimeMillis(); + @LayoutlibDelegate /*package*/ static boolean setCurrentTimeMillis(long millis) { return true; } @@ -42,6 +44,7 @@ public class SystemClock_Delegate { * * @return milliseconds of non-sleep uptime since boot. */ + @LayoutlibDelegate /*package*/ static long uptimeMillis() { return System.currentTimeMillis() - sBootTime; } @@ -51,6 +54,7 @@ public class SystemClock_Delegate { * * @return elapsed milliseconds since boot. */ + @LayoutlibDelegate /*package*/ static long elapsedRealtime() { return System.currentTimeMillis() - sBootTime; } @@ -60,6 +64,7 @@ public class SystemClock_Delegate { * * @return elapsed milliseconds in the thread */ + @LayoutlibDelegate /*package*/ static long currentThreadTimeMillis() { return System.currentTimeMillis(); } diff --git a/tools/layoutlib/bridge/src/android/util/FloatMath_Delegate.java b/tools/layoutlib/bridge/src/android/util/FloatMath_Delegate.java index 9ca133892bbd2..1df78c2efaac5 100644 --- a/tools/layoutlib/bridge/src/android/util/FloatMath_Delegate.java +++ b/tools/layoutlib/bridge/src/android/util/FloatMath_Delegate.java @@ -17,6 +17,7 @@ package android.util; import com.android.layoutlib.bridge.impl.DelegateManager; +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; /** * Delegate implementing the native methods of android.util.FloatMath @@ -40,6 +41,7 @@ import com.android.layoutlib.bridge.impl.DelegateManager; * @param value to be converted * @return the floor of value */ + @LayoutlibDelegate /*package*/ static float floor(float value) { return (float)Math.floor(value); } @@ -51,6 +53,7 @@ import com.android.layoutlib.bridge.impl.DelegateManager; * @param value to be converted * @return the ceiling of value */ + @LayoutlibDelegate /*package*/ static float ceil(float value) { return (float)Math.ceil(value); } @@ -61,6 +64,7 @@ import com.android.layoutlib.bridge.impl.DelegateManager; * @param angle to compute the cosine of, in radians * @return the sine of angle */ + @LayoutlibDelegate /*package*/ static float sin(float angle) { return (float)Math.sin(angle); } @@ -71,6 +75,7 @@ import com.android.layoutlib.bridge.impl.DelegateManager; * @param angle to compute the cosine of, in radians * @return the cosine of angle */ + @LayoutlibDelegate /*package*/ static float cos(float angle) { return (float)Math.cos(angle); } @@ -82,6 +87,7 @@ import com.android.layoutlib.bridge.impl.DelegateManager; * @param value to compute sqrt of * @return the square root of value */ + @LayoutlibDelegate /*package*/ static float sqrt(float value) { return (float)Math.sqrt(value); } diff --git a/tools/layoutlib/bridge/src/android/view/LayoutInflater_Delegate.java b/tools/layoutlib/bridge/src/android/view/LayoutInflater_Delegate.java index 3946a2f5d66ff..0f3cf571cf8d4 100644 --- a/tools/layoutlib/bridge/src/android/view/LayoutInflater_Delegate.java +++ b/tools/layoutlib/bridge/src/android/view/LayoutInflater_Delegate.java @@ -17,6 +17,7 @@ package android.view; import com.android.layoutlib.bridge.android.BridgeInflater; +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; @@ -38,6 +39,7 @@ public class LayoutInflater_Delegate { * Recursive method used to descend down the xml hierarchy and instantiate * views, instantiate their children, and then call onFinishInflate(). */ + @LayoutlibDelegate /*package*/ static void rInflate(LayoutInflater thisInflater, XmlPullParser parser, View parent, final AttributeSet attrs, boolean finishInflate) throws XmlPullParserException, IOException { diff --git a/tools/layoutlib/bridge/src/android/view/View_Delegate.java b/tools/layoutlib/bridge/src/android/view/View_Delegate.java index ee6694c843c67..8215f7c7a2147 100644 --- a/tools/layoutlib/bridge/src/android/view/View_Delegate.java +++ b/tools/layoutlib/bridge/src/android/view/View_Delegate.java @@ -16,6 +16,8 @@ package android.view; +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; + /** * Delegate used to provide new implementation of a select few methods of {@link View} * @@ -25,6 +27,7 @@ package android.view; */ public class View_Delegate { + @LayoutlibDelegate /*package*/ static boolean isInEditMode(View thisView) { return true; } diff --git a/tools/layoutlib/bridge/src/com/android/internal/util/XmlUtils_Delegate.java b/tools/layoutlib/bridge/src/com/android/internal/util/XmlUtils_Delegate.java index 7fa1679838143..bf998b8737cd3 100644 --- a/tools/layoutlib/bridge/src/com/android/internal/util/XmlUtils_Delegate.java +++ b/tools/layoutlib/bridge/src/com/android/internal/util/XmlUtils_Delegate.java @@ -16,6 +16,8 @@ package com.android.internal.util; +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; + /** * Delegate used to provide new implementation of a select few methods of {@link XmlUtils} @@ -25,6 +27,8 @@ package com.android.internal.util; * */ public class XmlUtils_Delegate { + + @LayoutlibDelegate /*package*/ static final int convertValueToInt(CharSequence charSeq, int defaultValue) { if (null == charSeq) return defaultValue; diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java index 90dcc2727e7f5..acc7379990d4a 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java @@ -192,6 +192,7 @@ public final class Bridge extends com.android.ide.common.rendering.api.Bridge { Capability.UNBOUND_RENDERING, Capability.CUSTOM_BACKGROUND_COLOR, Capability.RENDER, + Capability.LAYOUT_ONLY, Capability.EMBEDDED_LAYOUT, Capability.VIEW_MANIPULATION, Capability.PLAY_ANIMATION, diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java index 33dd2144ec533..7d794bd1a7f60 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java @@ -425,36 +425,72 @@ public final class BridgeContext extends Activity { } } - if (defStyleValues == null && defStyleAttr != 0) { - // get the name from the int. - String defStyleName = searchAttr(defStyleAttr); + if (defStyleValues == null) { + if (defStyleAttr != 0) { + // get the name from the int. + String defStyleName = searchAttr(defStyleAttr); - if (defaultPropMap != null) { - defaultPropMap.put("style", defStyleName); - } - - // look for the style in the current theme, and its parent: - ResourceValue item = mRenderResources.findItemInTheme(defStyleName); - - if (item != null) { - // item is a reference to a style entry. Search for it. - item = mRenderResources.findResValue(item.getValue(), - false /*forceFrameworkOnly*/); - - if (item instanceof StyleResourceValue) { - defStyleValues = (StyleResourceValue)item; + if (defaultPropMap != null) { + defaultPropMap.put("style", defStyleName); } - } else { - Bridge.getLog().error(null, - String.format( - "Failed to find style '%s' in current theme", defStyleName), - null /*data*/); - } - } - if (defStyleRes != 0) { - // FIXME: See what we need to do with this. - throw new UnsupportedOperationException(); + // look for the style in the current theme, and its parent: + ResourceValue item = mRenderResources.findItemInTheme(defStyleName); + + if (item != null) { + // item is a reference to a style entry. Search for it. + item = mRenderResources.findResValue(item.getValue(), + false /*forceFrameworkOnly*/); + + if (item instanceof StyleResourceValue) { + defStyleValues = (StyleResourceValue)item; + } + } else { + Bridge.getLog().error(null, + String.format( + "Failed to find style '%s' in current theme", defStyleName), + null /*data*/); + } + } else if (defStyleRes != 0) { + Pair value = Bridge.resolveResourceId(defStyleRes); + if (value == null) { + value = mProjectCallback.resolveResourceId(defStyleRes); + } + + if (value != null) { + if (value.getFirst() == ResourceType.STYLE) { + // look for the style in the current theme, and its parent: + ResourceValue item = mRenderResources.findItemInTheme(value.getSecond()); + if (item != null) { + if (item instanceof StyleResourceValue) { + if (defaultPropMap != null) { + defaultPropMap.put("style", item.getName()); + } + + defStyleValues = (StyleResourceValue)item; + } + } else { + Bridge.getLog().error(null, + String.format( + "Style with id 0x%x (resolved to '%s') does not exist.", + defStyleRes, value.getSecond()), + null /*data*/); + } + } else { + Bridge.getLog().error(null, + String.format( + "Resouce id 0x%x is not of type STYLE (instead %s)", + defStyleRes, value.getFirst().toString()), + null /*data*/); + } + } else { + Bridge.getLog().error(null, + String.format( + "Failed to find style with id 0x%x in current theme", + defStyleRes), + null /*data*/); + } + } } String namespace = BridgeConstants.NS_RESOURCES; diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeTypedArray.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeTypedArray.java index 734f5addccb18..c1d7600691882 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeTypedArray.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeTypedArray.java @@ -188,6 +188,10 @@ public final class BridgeTypedArray extends TypedArray { String s = mResourceData[index].getValue(); + if (RenderResources.REFERENCE_NULL.equals(s)) { + return defValue; + } + try { return (s == null) ? defValue : XmlUtils.convertValueToInt(s, defValue); } catch (NumberFormatException e) { @@ -301,6 +305,10 @@ public final class BridgeTypedArray extends TypedArray { return null; } + if (RenderResources.REFERENCE_NULL.equals(value)) { + return null; + } + // let the framework inflate the ColorStateList from the XML file. File f = new File(value); if (f.isFile()) { @@ -337,8 +345,6 @@ public final class BridgeTypedArray extends TypedArray { Bridge.getLog().error(LayoutLog.TAG_RESOURCES_FORMAT, e.getMessage(), e, null /*data*/); } - assert false; - return null; } @@ -408,6 +414,10 @@ public final class BridgeTypedArray extends TypedArray { return LayoutParams.WRAP_CONTENT; } + if (RenderResources.REFERENCE_NULL.equals(s)) { + return defValue; + } + if (ResourceHelper.stringToFloat(s, mValue)) { return mValue.getDimension(mBridgeResources.mMetrics); } @@ -418,8 +428,6 @@ public final class BridgeTypedArray extends TypedArray { "\"%1$s\" in attribute \"%2$s\" is not a valid format.", s, mNames[index]), null /*data*/); - assert false; - return defValue; } @@ -480,6 +488,10 @@ public final class BridgeTypedArray extends TypedArray { return LayoutParams.WRAP_CONTENT; } + if (RenderResources.REFERENCE_NULL.equals(s)) { + return defValue; + } + // FIXME huh? float f = getDimension(index, defValue); @@ -488,8 +500,11 @@ public final class BridgeTypedArray extends TypedArray { if (f == 0) return 0; if (f > 0) return 1; - throw new UnsupportedOperationException("Can't convert to dimension: " + - Integer.toString(index)); + Bridge.getLog().error(LayoutLog.TAG_RESOURCES_FORMAT, + "Can't convert to dimension: " + Integer.toString(index), + null, null /*data*/); + + return defValue; } /** @@ -550,8 +565,6 @@ public final class BridgeTypedArray extends TypedArray { "\"%1$s\" in attribute \"%2$s\" cannont be converted to a fraction.", value, mNames[index]), null /*data*/); - assert false; - return defValue; } @@ -585,6 +598,10 @@ public final class BridgeTypedArray extends TypedArray { return mContext.getDynamicIdByStyle((StyleResourceValue)resValue); } + if (RenderResources.REFERENCE_NULL.equals(resValue.getValue())) { + return defValue; + } + // if the attribute was a reference to a resource, and not a declaration of an id (@+id), // then the xml attribute value was "resolved" which leads us to a ResourceValue with a // valid getType() and getName() returning a resource name. @@ -663,8 +680,6 @@ public final class BridgeTypedArray extends TypedArray { "Unable to resolve id \"%1$s\" for attribute \"%2$s\"", value, mNames[index]), resValue); - assert false; - return defValue; } @@ -712,6 +727,10 @@ public final class BridgeTypedArray extends TypedArray { String value = mResourceData[index].getValue(); if (value != null) { + if (RenderResources.REFERENCE_NULL.equals(value)) { + return null; + } + return new CharSequence[] { value }; } diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/PhoneSystemBar.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/PhoneSystemBar.java index 04d06e4bb45ef..9fab51a610927 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/PhoneSystemBar.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/PhoneSystemBar.java @@ -30,7 +30,7 @@ import android.widget.TextView; public class PhoneSystemBar extends CustomBar { public PhoneSystemBar(Context context, Density density) throws XmlPullParserException { - super(context, density, "/bars/tablet_system_bar.xml"); + super(context, density, "/bars/phone_system_bar.xml"); setGravity(mGravity | Gravity.RIGHT); setBackgroundColor(0xFF000000); diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/DelegateManager.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/DelegateManager.java index 05a258d56c660..ae1217d5c5d88 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/DelegateManager.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/DelegateManager.java @@ -16,8 +16,15 @@ package com.android.layoutlib.bridge.impl; +import com.android.layoutlib.bridge.util.Debug; +import com.android.layoutlib.bridge.util.SparseWeakArray; + import android.util.SparseArray; +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.List; + /** * Manages native delegates. * @@ -44,15 +51,39 @@ import android.util.SparseArray; * will do is call {@link #getDelegate(int)} to get the Java object matching the int. * * Typical native init methods are returning a new int back to the Java class, so - * {@link #addDelegate(Object)} does the same. + * {@link #addNewDelegate(Object)} does the same. + * + * The JNI references are counted, so we do the same through a {@link WeakReference}. Because + * the Java object needs to count as a reference (even though it only holds an int), we use the + * following mechanism: + * + * - {@link #addNewDelegate(Object)} and {@link #removeJavaReferenceFor(int)} adds and removes + * the delegate to/from a list. This list hold the reference and prevents the GC from reclaiming + * the delegate. + * + * - {@link #addNewDelegate(Object)} also adds the delegate to a {@link SparseArray} that holds a + * {@link WeakReference} to the delegate. This allows the delegate to be deleted automatically + * when nothing references it. This means that any class that holds a delegate (except for the + * Java main class) must not use the int but the Delegate class instead. The integers must + * only be used in the API between the main Java class and the Delegate. * * @param the delegate class to manage */ public final class DelegateManager { - - private final SparseArray mDelegates = new SparseArray(); + private final Class mClass; + private final SparseWeakArray mDelegates = new SparseWeakArray(); + /** list used to store delegates when their main object holds a reference to them. + * This is to ensure that the WeakReference in the SparseWeakArray doesn't get GC'ed + * @see #addNewDelegate(Object) + * @see #removeJavaReferenceFor(int) + */ + private final List mJavaReferences = new ArrayList(); private int mDelegateCounter = 0; + public DelegateManager(Class theClass) { + mClass = theClass; + } + /** * Returns the delegate from the given native int. *

@@ -66,6 +97,14 @@ public final class DelegateManager { public T getDelegate(int native_object) { if (native_object > 0) { T delegate = mDelegates.get(native_object); + + if (Debug.DEBUG) { + if (delegate == null) { + System.out.println("Unknown " + mClass.getSimpleName() + " with int " + + native_object); + } + } + assert delegate != null; return delegate; } @@ -77,17 +116,31 @@ public final class DelegateManager { * @param newDelegate the delegate to add * @return a unique native int to identify the delegate */ - public int addDelegate(T newDelegate) { + public int addNewDelegate(T newDelegate) { int native_object = ++mDelegateCounter; mDelegates.put(native_object, newDelegate); + assert !mJavaReferences.contains(newDelegate); + mJavaReferences.add(newDelegate); + + if (Debug.DEBUG) { + System.out.println("New " + mClass.getSimpleName() + " with int " + native_object); + } + return native_object; } /** - * Removes the delegate matching the given native int. - * @param native_object the native int. + * Removes the main reference on the given delegate. + * @param native_object the native integer representing the delegate. */ - public void removeDelegate(int native_object) { - mDelegates.remove(native_object); + public void removeJavaReferenceFor(int native_object) { + T delegate = getDelegate(native_object); + + if (Debug.DEBUG) { + System.out.println("Removing main Java ref on " + mClass.getSimpleName() + + " with int " + native_object); + } + + mJavaReferences.remove(delegate); } } diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java index fedd789fe258a..2fd58e425d9d7 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java @@ -421,57 +421,63 @@ public class RenderSessionImpl extends RenderAction { // now do the layout. mViewRoot.layout(0, 0, mMeasuredScreenWidth, mMeasuredScreenHeight); - mViewRoot.mAttachInfo.mTreeObserver.dispatchOnPreDraw(); + if (params.isLayoutOnly()) { + // delete the canvas and image to reset them on the next full rendering + mImage = null; + mCanvas = null; + } else { + mViewRoot.mAttachInfo.mTreeObserver.dispatchOnPreDraw(); - // draw the views - // create the BufferedImage into which the layout will be rendered. - boolean newImage = false; - if (newRenderSize || mCanvas == null) { - if (params.getImageFactory() != null) { - mImage = params.getImageFactory().getImage( - mMeasuredScreenWidth, - mMeasuredScreenHeight); - } else { - mImage = new BufferedImage( - mMeasuredScreenWidth, - mMeasuredScreenHeight, - BufferedImage.TYPE_INT_ARGB); - newImage = true; + // draw the views + // create the BufferedImage into which the layout will be rendered. + boolean newImage = false; + if (newRenderSize || mCanvas == null) { + if (params.getImageFactory() != null) { + mImage = params.getImageFactory().getImage( + mMeasuredScreenWidth, + mMeasuredScreenHeight); + } else { + mImage = new BufferedImage( + mMeasuredScreenWidth, + mMeasuredScreenHeight, + BufferedImage.TYPE_INT_ARGB); + newImage = true; + } + + if (params.isBgColorOverridden()) { + // since we override the content, it's the same as if it was a new image. + newImage = true; + Graphics2D gc = mImage.createGraphics(); + gc.setColor(new Color(params.getOverrideBgColor(), true)); + gc.setComposite(AlphaComposite.Src); + gc.fillRect(0, 0, mMeasuredScreenWidth, mMeasuredScreenHeight); + gc.dispose(); + } + + // create an Android bitmap around the BufferedImage + Bitmap bitmap = Bitmap_Delegate.createBitmap(mImage, + true /*isMutable*/, params.getDensity()); + + // create a Canvas around the Android bitmap + mCanvas = new Canvas(bitmap); + mCanvas.setDensity(params.getDensity().getDpiValue()); } - if (params.isBgColorOverridden()) { - // since we override the content, it's the same as if it was a new image. - newImage = true; + if (freshRender && newImage == false) { Graphics2D gc = mImage.createGraphics(); - gc.setColor(new Color(params.getOverrideBgColor(), true)); gc.setComposite(AlphaComposite.Src); - gc.fillRect(0, 0, mMeasuredScreenWidth, mMeasuredScreenHeight); + + gc.setColor(new Color(0x00000000, true)); + gc.fillRect(0, 0, + mMeasuredScreenWidth, mMeasuredScreenHeight); + + // done gc.dispose(); } - // create an Android bitmap around the BufferedImage - Bitmap bitmap = Bitmap_Delegate.createBitmap(mImage, - true /*isMutable*/, params.getDensity()); - - // create a Canvas around the Android bitmap - mCanvas = new Canvas(bitmap); - mCanvas.setDensity(params.getDensity().getDpiValue()); + mViewRoot.draw(mCanvas); } - if (freshRender && newImage == false) { - Graphics2D gc = mImage.createGraphics(); - gc.setComposite(AlphaComposite.Src); - - gc.setColor(new Color(0x00000000, true)); - gc.fillRect(0, 0, - mMeasuredScreenWidth, mMeasuredScreenHeight); - - // done - gc.dispose(); - } - - mViewRoot.draw(mCanvas); - mViewInfoList = startVisitingViews(mViewRoot, 0); // success! diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/util/Debug.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/util/Debug.java new file mode 100644 index 0000000000000..82eab8560acb8 --- /dev/null +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/util/Debug.java @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2011 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 com.android.layoutlib.bridge.util; + +public class Debug { + + public final static boolean DEBUG = false; + +} diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/util/SparseWeakArray.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/util/SparseWeakArray.java new file mode 100644 index 0000000000000..4d0c9ce3c71e7 --- /dev/null +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/util/SparseWeakArray.java @@ -0,0 +1,376 @@ +/* + * Copyright (C) 2011 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 com.android.layoutlib.bridge.util; + + +import com.android.internal.util.ArrayUtils; + +import android.util.SparseArray; + +import java.lang.ref.WeakReference; + +/** + * This is a custom {@link SparseArray} that uses {@link WeakReference} around the objects added + * to it. When the array is compacted, not only deleted indices but also empty references + * are removed, making the array efficient at removing references that were reclaimed. + * + * The code is taken from {@link SparseArray} directly and adapted to use weak references. + * + * Because our usage means that we never actually call {@link #remove(int)} or {@link #delete(int)}, + * we must manually check if there are reclaimed references to trigger an internal compact step + * (which is normally only triggered when an item is manually removed). + * + * SparseArrays map integers to Objects. Unlike a normal array of Objects, + * there can be gaps in the indices. It is intended to be more efficient + * than using a HashMap to map Integers to Objects. + */ +@SuppressWarnings("unchecked") +public class SparseWeakArray { + + private static final Object DELETED_REF = new Object(); + private static final WeakReference DELETED = new WeakReference(DELETED_REF); + private boolean mGarbage = false; + + /** + * Creates a new SparseArray containing no mappings. + */ + public SparseWeakArray() { + this(10); + } + + /** + * Creates a new SparseArray containing no mappings that will not + * require any additional memory allocation to store the specified + * number of mappings. + */ + public SparseWeakArray(int initialCapacity) { + initialCapacity = ArrayUtils.idealIntArraySize(initialCapacity); + + mKeys = new int[initialCapacity]; + mValues = new WeakReference[initialCapacity]; + mSize = 0; + } + + /** + * Gets the Object mapped from the specified key, or null + * if no such mapping has been made. + */ + public E get(int key) { + return get(key, null); + } + + /** + * Gets the Object mapped from the specified key, or the specified Object + * if no such mapping has been made. + */ + public E get(int key, E valueIfKeyNotFound) { + int i = binarySearch(mKeys, 0, mSize, key); + + if (i < 0 || mValues[i] == DELETED || mValues[i].get() == null) { + return valueIfKeyNotFound; + } else { + return (E) mValues[i].get(); + } + } + + /** + * Removes the mapping from the specified key, if there was any. + */ + public void delete(int key) { + int i = binarySearch(mKeys, 0, mSize, key); + + if (i >= 0) { + if (mValues[i] != DELETED) { + mValues[i] = DELETED; + mGarbage = true; + } + } + } + + /** + * Alias for {@link #delete(int)}. + */ + public void remove(int key) { + delete(key); + } + + /** + * Removes the mapping at the specified index. + */ + public void removeAt(int index) { + if (mValues[index] != DELETED) { + mValues[index] = DELETED; + mGarbage = true; + } + } + + private void gc() { + int n = mSize; + int o = 0; + int[] keys = mKeys; + WeakReference[] values = mValues; + + for (int i = 0; i < n; i++) { + WeakReference val = values[i]; + + // Don't keep any non DELETED values, but only the one that still have a valid + // reference. + if (val != DELETED && val.get() != null) { + if (i != o) { + keys[o] = keys[i]; + values[o] = val; + } + + o++; + } + } + + mGarbage = false; + mSize = o; + + int newSize = ArrayUtils.idealIntArraySize(mSize); + if (newSize < mKeys.length) { + int[] nkeys = new int[newSize]; + WeakReference[] nvalues = new WeakReference[newSize]; + + System.arraycopy(mKeys, 0, nkeys, 0, newSize); + System.arraycopy(mValues, 0, nvalues, 0, newSize); + + mKeys = nkeys; + mValues = nvalues; + } + } + + /** + * Adds a mapping from the specified key to the specified value, + * replacing the previous mapping from the specified key if there + * was one. + */ + public void put(int key, E value) { + int i = binarySearch(mKeys, 0, mSize, key); + + if (i >= 0) { + mValues[i] = new WeakReference(value); + } else { + i = ~i; + + if (i < mSize && (mValues[i] == DELETED || mValues[i].get() == null)) { + mKeys[i] = key; + mValues[i] = new WeakReference(value); + return; + } + + if (mSize >= mKeys.length && (mGarbage || hasReclaimedRefs())) { + gc(); + + // Search again because indices may have changed. + i = ~binarySearch(mKeys, 0, mSize, key); + } + + if (mSize >= mKeys.length) { + int n = ArrayUtils.idealIntArraySize(mSize + 1); + + int[] nkeys = new int[n]; + WeakReference[] nvalues = new WeakReference[n]; + + // Log.e("SparseArray", "grow " + mKeys.length + " to " + n); + System.arraycopy(mKeys, 0, nkeys, 0, mKeys.length); + System.arraycopy(mValues, 0, nvalues, 0, mValues.length); + + mKeys = nkeys; + mValues = nvalues; + } + + if (mSize - i != 0) { + // Log.e("SparseArray", "move " + (mSize - i)); + System.arraycopy(mKeys, i, mKeys, i + 1, mSize - i); + System.arraycopy(mValues, i, mValues, i + 1, mSize - i); + } + + mKeys[i] = key; + mValues[i] = new WeakReference(value); + mSize++; + } + } + + /** + * Returns the number of key-value mappings that this SparseArray + * currently stores. + */ + public int size() { + if (mGarbage) { + gc(); + } + + return mSize; + } + + /** + * Given an index in the range 0...size()-1, returns + * the key from the indexth key-value mapping that this + * SparseArray stores. + */ + public int keyAt(int index) { + if (mGarbage) { + gc(); + } + + return mKeys[index]; + } + + /** + * Given an index in the range 0...size()-1, returns + * the value from the indexth key-value mapping that this + * SparseArray stores. + */ + public E valueAt(int index) { + if (mGarbage) { + gc(); + } + + return (E) mValues[index].get(); + } + + /** + * Given an index in the range 0...size()-1, sets a new + * value for the indexth key-value mapping that this + * SparseArray stores. + */ + public void setValueAt(int index, E value) { + if (mGarbage) { + gc(); + } + + mValues[index] = new WeakReference(value); + } + + /** + * Returns the index for which {@link #keyAt} would return the + * specified key, or a negative number if the specified + * key is not mapped. + */ + public int indexOfKey(int key) { + if (mGarbage) { + gc(); + } + + return binarySearch(mKeys, 0, mSize, key); + } + + /** + * Returns an index for which {@link #valueAt} would return the + * specified key, or a negative number if no keys map to the + * specified value. + * Beware that this is a linear search, unlike lookups by key, + * and that multiple keys can map to the same value and this will + * find only one of them. + */ + public int indexOfValue(E value) { + if (mGarbage) { + gc(); + } + + for (int i = 0; i < mSize; i++) + if (mValues[i].get() == value) + return i; + + return -1; + } + + /** + * Removes all key-value mappings from this SparseArray. + */ + public void clear() { + int n = mSize; + WeakReference[] values = mValues; + + for (int i = 0; i < n; i++) { + values[i] = null; + } + + mSize = 0; + mGarbage = false; + } + + /** + * Puts a key/value pair into the array, optimizing for the case where + * the key is greater than all existing keys in the array. + */ + public void append(int key, E value) { + if (mSize != 0 && key <= mKeys[mSize - 1]) { + put(key, value); + return; + } + + if (mSize >= mKeys.length && (mGarbage || hasReclaimedRefs())) { + gc(); + } + + int pos = mSize; + if (pos >= mKeys.length) { + int n = ArrayUtils.idealIntArraySize(pos + 1); + + int[] nkeys = new int[n]; + WeakReference[] nvalues = new WeakReference[n]; + + // Log.e("SparseArray", "grow " + mKeys.length + " to " + n); + System.arraycopy(mKeys, 0, nkeys, 0, mKeys.length); + System.arraycopy(mValues, 0, nvalues, 0, mValues.length); + + mKeys = nkeys; + mValues = nvalues; + } + + mKeys[pos] = key; + mValues[pos] = new WeakReference(value); + mSize = pos + 1; + } + + private boolean hasReclaimedRefs() { + for (int i = 0 ; i < mSize ; i++) { + if (mValues[i].get() == null) { // DELETED.get() never returns null. + return true; + } + } + + return false; + } + + private static int binarySearch(int[] a, int start, int len, int key) { + int high = start + len, low = start - 1, guess; + + while (high - low > 1) { + guess = (high + low) / 2; + + if (a[guess] < key) + low = guess; + else + high = guess; + } + + if (high == start + len) + return ~(start + len); + else if (a[high] == key) + return high; + else + return ~high; + } + + private int[] mKeys; + private WeakReference[] mValues; + private int mSize; +} diff --git a/tools/layoutlib/bridge/src/libcore/icu/ICU_Delegate.java b/tools/layoutlib/bridge/src/libcore/icu/ICU_Delegate.java index ab01a3949d618..e6dc646487cba 100644 --- a/tools/layoutlib/bridge/src/libcore/icu/ICU_Delegate.java +++ b/tools/layoutlib/bridge/src/libcore/icu/ICU_Delegate.java @@ -16,6 +16,8 @@ package libcore.icu; +import com.android.tools.layoutlib.annotations.LayoutlibDelegate; + import java.util.Locale; /** @@ -27,80 +29,101 @@ import java.util.Locale; */ public class ICU_Delegate { + // --- Java delegates + + @LayoutlibDelegate /*package*/ static String toLowerCase(String s, String localeName) { return s.toLowerCase(); } + @LayoutlibDelegate /*package*/ static String toUpperCase(String s, String localeName) { return s.toUpperCase(); } // --- Native methods accessing ICU's database. + @LayoutlibDelegate /*package*/ static String[] getAvailableBreakIteratorLocalesNative() { return new String[0]; } + @LayoutlibDelegate /*package*/ static String[] getAvailableCalendarLocalesNative() { return new String[0]; } + @LayoutlibDelegate /*package*/ static String[] getAvailableCollatorLocalesNative() { return new String[0]; } + @LayoutlibDelegate /*package*/ static String[] getAvailableDateFormatLocalesNative() { return new String[0]; } + @LayoutlibDelegate /*package*/ static String[] getAvailableLocalesNative() { return new String[0]; } + @LayoutlibDelegate /*package*/ static String[] getAvailableNumberFormatLocalesNative() { return new String[0]; } + @LayoutlibDelegate /*package*/ static String getCurrencyCodeNative(String locale) { return ""; } + @LayoutlibDelegate /*package*/ static int getCurrencyFractionDigitsNative(String currencyCode) { return 0; } + @LayoutlibDelegate /*package*/ static String getCurrencySymbolNative(String locale, String currencyCode) { return ""; } + @LayoutlibDelegate /*package*/ static String getDisplayCountryNative(String countryCode, String locale) { return ""; } + @LayoutlibDelegate /*package*/ static String getDisplayLanguageNative(String languageCode, String locale) { return ""; } + @LayoutlibDelegate /*package*/ static String getDisplayVariantNative(String variantCode, String locale) { return ""; } + @LayoutlibDelegate /*package*/ static String getISO3CountryNative(String locale) { return ""; } + @LayoutlibDelegate /*package*/ static String getISO3LanguageNative(String locale) { return ""; } + @LayoutlibDelegate /*package*/ static String[] getISOLanguagesNative() { return Locale.getISOLanguages(); } + @LayoutlibDelegate /*package*/ static String[] getISOCountriesNative() { return Locale.getISOCountries(); } + @LayoutlibDelegate /*package*/ static boolean initLocaleDataImpl(String locale, LocaleData result) { // Used by Calendar. diff --git a/tools/layoutlib/bridge/tests/com/android/layoutlib/bridge/TestClassReplacement.java b/tools/layoutlib/bridge/tests/com/android/layoutlib/bridge/TestClassReplacement.java deleted file mode 100644 index a068ae273651c..0000000000000 --- a/tools/layoutlib/bridge/tests/com/android/layoutlib/bridge/TestClassReplacement.java +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Copyright (C) 2009 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 com.android.layoutlib.bridge; - -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; -import java.lang.reflect.Type; - -import junit.framework.TestCase; - -public class TestClassReplacement extends TestCase { - - public void testClassReplacements() { - // TODO: we want to test all the classes. For now only, no classes pass the test. -// final String[] classes = CreateInfo.RENAMED_CLASSES; - final String[] classes = new String[] { -// "android.graphics.Paint", "android.graphics._Original_Paint", -// "android.graphics.Canvas", "android.graphics._Original_Canvas", - }; - final int count = classes.length; - for (int i = 0 ; i < count ; i += 2) { - loadAndCompareClasses(classes[i], classes[i+1]); - } - } - - private void loadAndCompareClasses(String newClassName, String oldClassName) { - // load the classes - try { - Class newClass = TestClassReplacement.class.getClassLoader().loadClass(newClassName); - Class oldClass = TestClassReplacement.class.getClassLoader().loadClass(oldClassName); - - compare(newClass, oldClass); - } catch (ClassNotFoundException e) { - fail("Failed to load class: " + e.getMessage()); - } - } - - private void compare(Class newClass, Class oldClass) { - // first compare the methods. - Method[] newClassMethods = newClass.getDeclaredMethods(); - Method[] oldClassMethods = oldClass.getDeclaredMethods(); - - for (Method oldMethod : oldClassMethods) { - // we ignore anything that starts with native. This is because the class we are looking - // at has already been modified to remove the native modifiers. - if (oldMethod.getName().startsWith("native")) { - continue; - } - - // or static and private - int privateStatic = Modifier.STATIC | Modifier.PRIVATE; - if ((oldMethod.getModifiers() & privateStatic) == privateStatic) { - continue; - } - - boolean found = false; - for (Method newMethod : newClassMethods) { - - if (compareMethods(newClass, newMethod, oldClass, oldMethod)) { - found = true; - break; - } - } - - if (found == false) { - // compute a full class name that's long but not too long. - StringBuilder sb = new StringBuilder(oldMethod.getName() + "("); - Type[] params = oldMethod.getGenericParameterTypes(); - for (int j = 0; j < params.length; j++) { - if (params[j] instanceof Class) { - Class theClass = (Class)params[j]; - sb.append(theClass.getName()); - int dimensions = 0; - while (theClass.isArray()) { - dimensions++; - theClass = theClass.getComponentType(); - } - for (int i = 0; i < dimensions; i++) { - sb.append("[]"); - } - - } else { - sb.append(params[j].toString()); - } - if (j < (params.length - 1)) - sb.append(","); - } - sb.append(")"); - - fail(String.format("Missing %1$s.%2$s", newClass.getName(), sb.toString())); - } - } - - // TODO: check (somehow?) that the methods that were removed from the original class - // have been put back in the new class! - // For this we need the original unmodified class (ie renamed, but w/o the methods removed) - } - - private boolean compareMethods(Class newClass, Method newMethod, - Class oldClass, Method oldMethod) { - // first check the name of the method - if (newMethod.getName().equals(oldMethod.getName()) == false) { - return false; - } - - // check the return value - Class oldReturnType = oldMethod.getReturnType(); - // if it's the old class, or if it's a inner class of the oldclass, we need to change this. - oldReturnType = adapt(oldReturnType, newClass, oldClass); - - // compare the return types - Class newReturnType = newMethod.getReturnType(); - if (newReturnType.equals(oldReturnType) == false) { - return false; - } - - // now check the parameters type. - Class[] oldParameters = oldMethod.getParameterTypes(); - Class[] newParemeters = newMethod.getParameterTypes(); - if (oldParameters.length != newParemeters.length) { - return false; - } - - for (int i = 0 ; i < oldParameters.length ; i++) { - if (newParemeters[i].equals(adapt(oldParameters[i], newClass, oldClass)) == false) { - return false; - } - } - - return true; - } - - /** - * Adapts a class to deal with renamed classes. - *

For instance if old class is android.graphics._Original_Paint and the - * new class is android.graphics.Paint and the class to adapt is - * android.graphics._Original_Paint$Cap, then the method will return a - * {@link Class} object representing android.graphics.Paint$Cap. - *

- * This method will also ensure that all renamed classes contains all the proper inner classes - * that they should be declaring. - * @param theClass the class to adapt - * @param newClass the new class object - * @param oldClass the old class object - * @return the adapted class. - * @throws ClassNotFoundException - */ - private Class adapt(Class theClass, Class newClass, Class oldClass) { - // only look for a new class if it's not primitive as Class.forName() would fail otherwise. - if (theClass.isPrimitive() == false) { - String n = theClass.getName().replace(oldClass.getName(), newClass.getName()); - try { - return Class.forName(n); - } catch (ClassNotFoundException e) { - fail("Missing class: " + n); - } - } - - return theClass; - } -} diff --git a/tools/layoutlib/bridge/tests/com/android/layoutlib/bridge/TestDelegates.java b/tools/layoutlib/bridge/tests/com/android/layoutlib/bridge/TestDelegates.java index a4140e3cc906a..d3218dbd5bd3d 100644 --- a/tools/layoutlib/bridge/tests/com/android/layoutlib/bridge/TestDelegates.java +++ b/tools/layoutlib/bridge/tests/com/android/layoutlib/bridge/TestDelegates.java @@ -21,6 +21,8 @@ import com.android.tools.layoutlib.create.CreateInfo; import java.lang.reflect.Method; import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.List; import junit.framework.TestCase; @@ -78,10 +80,15 @@ public class TestDelegates extends TestCase { } private void compare(Class originalClass, Class delegateClass) throws SecurityException { - Method[] originalMethods = originalClass.getDeclaredMethods(); + List checkedDelegateMethods = new ArrayList(); + // loop on the methods of the original class, and for the ones that are annotated + // with @LayoutlibDelegate, look for a matching method in the delegate class. + // The annotation is automatically added by layoutlib_create when it replace a method + // by a call to a delegate + Method[] originalMethods = originalClass.getDeclaredMethods(); for (Method originalMethod : originalMethods) { - // look for methods that were native: they have the LayoutlibDelegate annotation + // look for methods that are delegated: they have the LayoutlibDelegate annotation if (originalMethod.getAnnotation(LayoutlibDelegate.class) == null) { continue; } @@ -114,6 +121,14 @@ public class TestDelegates extends TestCase { Method delegateMethod = delegateClass.getDeclaredMethod(originalMethod.getName(), parameters); + // check that the method has the annotation + assertNotNull( + String.format( + "Delegate method %1$s for class %2$s does not have the @LayoutlibDelegate annotation", + delegateMethod.getName(), + originalClass.getName()), + delegateMethod.getAnnotation(LayoutlibDelegate.class)); + // check that the method is static assertTrue( String.format( @@ -121,28 +136,62 @@ public class TestDelegates extends TestCase { delegateMethod.getName(), originalClass.getName()), (delegateMethod.getModifiers() & Modifier.STATIC) == Modifier.STATIC); - } catch (NoSuchMethodException e) { - // compute a full class name that's long but not too long. - StringBuilder sb = new StringBuilder(originalMethod.getName() + "("); - for (int j = 0; j < parameters.length; j++) { - Class theClass = parameters[j]; - sb.append(theClass.getName()); - int dimensions = 0; - while (theClass.isArray()) { - dimensions++; - theClass = theClass.getComponentType(); - } - for (int i = 0; i < dimensions; i++) { - sb.append("[]"); - } - if (j < (parameters.length - 1)) { - sb.append(","); - } - } - sb.append(")"); - fail(String.format("Missing %1$s.%2$s", delegateClass.getName(), sb.toString())); + // add the method as checked. + checkedDelegateMethods.add(delegateMethod); + } catch (NoSuchMethodException e) { + String name = getMethodName(originalMethod, parameters); + fail(String.format("Missing %1$s.%2$s", delegateClass.getName(), name)); } } + + // look for dead (delegate) code. + // This looks for all methods in the delegate class, and if they have the + // @LayoutlibDelegate annotation, make sure they have been previously found as a + // match for a method in the original class. + // If not, this means the method is a delegate for a method that either doesn't exist + // anymore or is not delegated anymore. + Method[] delegateMethods = delegateClass.getDeclaredMethods(); + for (Method delegateMethod : delegateMethods) { + // look for methods that are delegates: they have the LayoutlibDelegate annotation + if (delegateMethod.getAnnotation(LayoutlibDelegate.class) == null) { + continue; + } + + assertTrue( + String.format( + "Delegate method %1$s.%2$s is not used anymore and must be removed", + delegateClass.getName(), + getMethodName(delegateMethod)), + checkedDelegateMethods.contains(delegateMethod)); + } + + } + + private String getMethodName(Method method) { + return getMethodName(method, method.getParameterTypes()); + } + + private String getMethodName(Method method, Class[] parameters) { + // compute a full class name that's long but not too long. + StringBuilder sb = new StringBuilder(method.getName() + "("); + for (int j = 0; j < parameters.length; j++) { + Class theClass = parameters[j]; + sb.append(theClass.getName()); + int dimensions = 0; + while (theClass.isArray()) { + dimensions++; + theClass = theClass.getComponentType(); + } + for (int i = 0; i < dimensions; i++) { + sb.append("[]"); + } + if (j < (parameters.length - 1)) { + sb.append(","); + } + } + sb.append(")"); + + return sb.toString(); } }