resolved conflicts for merge of 86e43034 to honeycomb-plus-aosp

Change-Id: Ia9ad4c3b79821fef6ab8493f4c93ca58f877f9ce
This commit is contained in:
Xavier Ducrohet
2011-02-24 17:19:38 -08:00
61 changed files with 1438 additions and 541 deletions

View File

@@ -8,6 +8,6 @@
<classpathentry kind="var" path="ANDROID_PLAT_SRC/prebuilt/common/kxml2/kxml2-2.3.0.jar" sourcepath="/ANDROID_PLAT_SRC/dalvik/libcore/xml/src/main/java"/> <classpathentry kind="var" path="ANDROID_PLAT_SRC/prebuilt/common/kxml2/kxml2-2.3.0.jar" sourcepath="/ANDROID_PLAT_SRC/dalvik/libcore/xml/src/main/java"/>
<classpathentry kind="var" path="ANDROID_PLAT_SRC/out/host/common/obj/JAVA_LIBRARIES/temp_layoutlib_intermediates/javalib.jar" sourcepath="/ANDROID_PLAT_SRC/frameworks/base"/> <classpathentry kind="var" path="ANDROID_PLAT_SRC/out/host/common/obj/JAVA_LIBRARIES/temp_layoutlib_intermediates/javalib.jar" sourcepath="/ANDROID_PLAT_SRC/frameworks/base"/>
<classpathentry kind="var" path="ANDROID_PLAT_SRC/prebuilt/common/ninepatch/ninepatch-prebuilt.jar"/> <classpathentry kind="var" path="ANDROID_PLAT_SRC/prebuilt/common/ninepatch/ninepatch-prebuilt.jar"/>
<classpathentry kind="var" path="ANDROID_PLAT_SRC/prebuilt/common/common/common-prebuilt.jar"/> <classpathentry kind="var" path="ANDROID_PLAT_SRC/prebuilt/common/tools-common/tools-common-prebuilt.jar"/>
<classpathentry kind="output" path="bin"/> <classpathentry kind="output" path="bin"/>
</classpath> </classpath>

View File

@@ -23,7 +23,7 @@ LOCAL_JAVA_RESOURCE_DIRS := resources
LOCAL_JAVA_LIBRARIES := \ LOCAL_JAVA_LIBRARIES := \
kxml2-2.3.0 \ kxml2-2.3.0 \
layoutlib_api-prebuilt \ layoutlib_api-prebuilt \
common-prebuilt tools-common-prebuilt
LOCAL_STATIC_JAVA_LIBRARIES := \ LOCAL_STATIC_JAVA_LIBRARIES := \
temp_layoutlib \ temp_layoutlib \

View File

@@ -9,5 +9,7 @@
android:layout_width="wrap_content"/> android:layout_width="wrap_content"/>
<ImageView <ImageView
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_width="wrap_content"/> android:layout_width="wrap_content"
android:layout_marginLeft="3dip"
android:layout_marginRight="5dip"/>
</merge> </merge>

View File

@@ -17,6 +17,7 @@
package android.animation; package android.animation;
import com.android.layoutlib.bridge.impl.DelegateManager; import com.android.layoutlib.bridge.impl.DelegateManager;
import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
/** /**
* Delegate implementing the native methods of android.animation.PropertyValuesHolder * Delegate implementing the native methods of android.animation.PropertyValuesHolder
@@ -34,20 +35,24 @@ import com.android.layoutlib.bridge.impl.DelegateManager;
*/ */
/*package*/ class PropertyValuesHolder_Delegate { /*package*/ class PropertyValuesHolder_Delegate {
@LayoutlibDelegate
/*package*/ static int nGetIntMethod(Class<?> targetClass, String methodName) { /*package*/ static int nGetIntMethod(Class<?> targetClass, String methodName) {
// return 0 to force PropertyValuesHolder to use Java reflection. // return 0 to force PropertyValuesHolder to use Java reflection.
return 0; return 0;
} }
@LayoutlibDelegate
/*package*/ static int nGetFloatMethod(Class<?> targetClass, String methodName) { /*package*/ static int nGetFloatMethod(Class<?> targetClass, String methodName) {
// return 0 to force PropertyValuesHolder to use Java reflection. // return 0 to force PropertyValuesHolder to use Java reflection.
return 0; return 0;
} }
@LayoutlibDelegate
/*package*/ static void nCallIntMethod(Object target, int methodID, int arg) { /*package*/ static void nCallIntMethod(Object target, int methodID, int arg) {
// do nothing // do nothing
} }
@LayoutlibDelegate
/*package*/ static void nCallFloatMethod(Object target, int methodID, float arg) { /*package*/ static void nCallFloatMethod(Object target, int methodID, float arg) {
// do nothing // do nothing
} }

View File

@@ -17,6 +17,7 @@
package android.app; package android.app;
import com.android.ide.common.rendering.api.IProjectCallback; import com.android.ide.common.rendering.api.IProjectCallback;
import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
import android.content.Context; import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
@@ -48,6 +49,7 @@ public class Fragment_Delegate {
* Like {@link #instantiate(Context, String, Bundle)} but with a null * Like {@link #instantiate(Context, String, Bundle)} but with a null
* argument Bundle. * argument Bundle.
*/ */
@LayoutlibDelegate
/*package*/ static Fragment instantiate(Context context, String fname) { /*package*/ static Fragment instantiate(Context context, String fname) {
return instantiate(context, fname, null); 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 * the given fragment class. This is a runtime exception; it is not
* normally expected to happen. * normally expected to happen.
*/ */
@LayoutlibDelegate
/*package*/ static Fragment instantiate(Context context, String fname, Bundle args) { /*package*/ static Fragment instantiate(Context context, String fname, Bundle args) {
try { try {
if (sProjectCallback != null) { if (sProjectCallback != null) {

View File

@@ -17,6 +17,7 @@
package android.content.res; package android.content.res;
import com.android.layoutlib.bridge.impl.RenderSessionImpl; 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.NotFoundException;
import android.content.res.Resources.Theme; import android.content.res.Resources.Theme;
@@ -32,12 +33,14 @@ import android.util.TypedValue;
*/ */
public class Resources_Theme_Delegate { public class Resources_Theme_Delegate {
@LayoutlibDelegate
/*package*/ static TypedArray obtainStyledAttributes( /*package*/ static TypedArray obtainStyledAttributes(
Resources thisResources, Theme thisTheme, Resources thisResources, Theme thisTheme,
int[] attrs) { int[] attrs) {
return RenderSessionImpl.getCurrentContext().obtainStyledAttributes(attrs); return RenderSessionImpl.getCurrentContext().obtainStyledAttributes(attrs);
} }
@LayoutlibDelegate
/*package*/ static TypedArray obtainStyledAttributes( /*package*/ static TypedArray obtainStyledAttributes(
Resources thisResources, Theme thisTheme, Resources thisResources, Theme thisTheme,
int resid, int[] attrs) int resid, int[] attrs)
@@ -45,6 +48,7 @@ public class Resources_Theme_Delegate {
return RenderSessionImpl.getCurrentContext().obtainStyledAttributes(resid, attrs); return RenderSessionImpl.getCurrentContext().obtainStyledAttributes(resid, attrs);
} }
@LayoutlibDelegate
/*package*/ static TypedArray obtainStyledAttributes( /*package*/ static TypedArray obtainStyledAttributes(
Resources thisResources, Theme thisTheme, Resources thisResources, Theme thisTheme,
AttributeSet set, int[] attrs, int defStyleAttr, int defStyleRes) { AttributeSet set, int[] attrs, int defStyleAttr, int defStyleRes) {
@@ -52,6 +56,7 @@ public class Resources_Theme_Delegate {
set, attrs, defStyleAttr, defStyleRes); set, attrs, defStyleAttr, defStyleRes);
} }
@LayoutlibDelegate
/*package*/ static boolean resolveAttribute( /*package*/ static boolean resolveAttribute(
Resources thisResources, Theme thisTheme, Resources thisResources, Theme thisTheme,
int resid, TypedValue outValue, int resid, TypedValue outValue,

View File

@@ -17,6 +17,7 @@
package android.graphics; package android.graphics;
import com.android.layoutlib.bridge.impl.DelegateManager; import com.android.layoutlib.bridge.impl.DelegateManager;
import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
import java.awt.Composite; import java.awt.Composite;
@@ -59,9 +60,10 @@ public class AvoidXfermode_Delegate extends Xfermode_Delegate {
// ---- native methods ---- // ---- native methods ----
@LayoutlibDelegate
/*package*/ static int nativeCreate(int opColor, int tolerance, int nativeMode) { /*package*/ static int nativeCreate(int opColor, int tolerance, int nativeMode) {
AvoidXfermode_Delegate newDelegate = new AvoidXfermode_Delegate(); AvoidXfermode_Delegate newDelegate = new AvoidXfermode_Delegate();
return sManager.addDelegate(newDelegate); return sManager.addNewDelegate(newDelegate);
} }
// ---- Private delegate/helper methods ---- // ---- Private delegate/helper methods ----

View File

@@ -21,6 +21,7 @@ import com.android.layoutlib.bridge.android.BridgeResources.NinePatchInputStream
import com.android.layoutlib.bridge.impl.DelegateManager; import com.android.layoutlib.bridge.impl.DelegateManager;
import com.android.ninepatch.NinePatchChunk; import com.android.ninepatch.NinePatchChunk;
import com.android.resources.Density; import com.android.resources.Density;
import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
import android.graphics.BitmapFactory.Options; import android.graphics.BitmapFactory.Options;
@@ -42,6 +43,7 @@ import java.io.InputStream;
// ------ Java delegates ------ // ------ Java delegates ------
@LayoutlibDelegate
/*package*/ static Bitmap finishDecode(Bitmap bm, Rect outPadding, Options opts) { /*package*/ static Bitmap finishDecode(Bitmap bm, Rect outPadding, Options opts) {
if (bm == null || opts == null) { if (bm == null || opts == null) {
return bm; return bm;
@@ -82,10 +84,12 @@ import java.io.InputStream;
// ------ Native Delegates ------ // ------ Native Delegates ------
@LayoutlibDelegate
/*package*/ static void nativeSetDefaultConfig(int nativeConfig) { /*package*/ static void nativeSetDefaultConfig(int nativeConfig) {
// pass // pass
} }
@LayoutlibDelegate
/*package*/ static Bitmap nativeDecodeStream(InputStream is, byte[] storage, /*package*/ static Bitmap nativeDecodeStream(InputStream is, byte[] storage,
Rect padding, Options opts) { Rect padding, Options opts) {
Bitmap bm = null; Bitmap bm = null;
@@ -129,29 +133,34 @@ import java.io.InputStream;
return bm; return bm;
} }
@LayoutlibDelegate
/*package*/ static Bitmap nativeDecodeFileDescriptor(FileDescriptor fd, /*package*/ static Bitmap nativeDecodeFileDescriptor(FileDescriptor fd,
Rect padding, Options opts) { Rect padding, Options opts) {
opts.inBitmap = null; opts.inBitmap = null;
return null; return null;
} }
@LayoutlibDelegate
/*package*/ static Bitmap nativeDecodeAsset(int asset, Rect padding, Options opts) { /*package*/ static Bitmap nativeDecodeAsset(int asset, Rect padding, Options opts) {
opts.inBitmap = null; opts.inBitmap = null;
return null; return null;
} }
@LayoutlibDelegate
/*package*/ static Bitmap nativeDecodeByteArray(byte[] data, int offset, /*package*/ static Bitmap nativeDecodeByteArray(byte[] data, int offset,
int length, Options opts) { int length, Options opts) {
opts.inBitmap = null; opts.inBitmap = null;
return null; return null;
} }
@LayoutlibDelegate
/*package*/ static byte[] nativeScaleNinePatch(byte[] chunk, float scale, Rect pad) { /*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 // don't scale for now. This should not be called anyway since we re-implement
// BitmapFactory.finishDecode(); // BitmapFactory.finishDecode();
return chunk; return chunk;
} }
@LayoutlibDelegate
/*package*/ static boolean nativeIsSeekable(FileDescriptor fd) { /*package*/ static boolean nativeIsSeekable(FileDescriptor fd) {
return true; return true;
} }

View File

@@ -19,6 +19,7 @@ package android.graphics;
import com.android.ide.common.rendering.api.LayoutLog; import com.android.ide.common.rendering.api.LayoutLog;
import com.android.layoutlib.bridge.Bridge; import com.android.layoutlib.bridge.Bridge;
import com.android.layoutlib.bridge.impl.DelegateManager; import com.android.layoutlib.bridge.impl.DelegateManager;
import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
import android.graphics.Shader.TileMode; import android.graphics.Shader.TileMode;
@@ -63,6 +64,7 @@ public class BitmapShader_Delegate extends Shader_Delegate {
// ---- native methods ---- // ---- native methods ----
@LayoutlibDelegate
/*package*/ static int nativeCreate(int native_bitmap, int shaderTileModeX, /*package*/ static int nativeCreate(int native_bitmap, int shaderTileModeX,
int shaderTileModeY) { int shaderTileModeY) {
Bitmap_Delegate bitmap = Bitmap_Delegate.getDelegate(native_bitmap); Bitmap_Delegate bitmap = Bitmap_Delegate.getDelegate(native_bitmap);
@@ -74,9 +76,10 @@ public class BitmapShader_Delegate extends Shader_Delegate {
bitmap.getImage(), bitmap.getImage(),
Shader_Delegate.getTileMode(shaderTileModeX), Shader_Delegate.getTileMode(shaderTileModeX),
Shader_Delegate.getTileMode(shaderTileModeY)); Shader_Delegate.getTileMode(shaderTileModeY));
return sManager.addDelegate(newDelegate); return sManager.addNewDelegate(newDelegate);
} }
@LayoutlibDelegate
/*package*/ static int nativePostCreate(int native_shader, int native_bitmap, /*package*/ static int nativePostCreate(int native_shader, int native_bitmap,
int shaderTileModeX, int shaderTileModeY) { int shaderTileModeX, int shaderTileModeY) {
// pass, not needed. // pass, not needed.

View File

@@ -20,6 +20,7 @@ import com.android.ide.common.rendering.api.LayoutLog;
import com.android.layoutlib.bridge.Bridge; import com.android.layoutlib.bridge.Bridge;
import com.android.layoutlib.bridge.impl.DelegateManager; import com.android.layoutlib.bridge.impl.DelegateManager;
import com.android.resources.Density; import com.android.resources.Density;
import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.Bitmap.Config; import android.graphics.Bitmap.Config;
@@ -53,7 +54,7 @@ public final class Bitmap_Delegate {
// ---- delegate manager ---- // ---- delegate manager ----
private static final DelegateManager<Bitmap_Delegate> sManager = private static final DelegateManager<Bitmap_Delegate> sManager =
new DelegateManager<Bitmap_Delegate>(); new DelegateManager<Bitmap_Delegate>(Bitmap_Delegate.class);
// ---- delegate helper data ---- // ---- delegate helper data ----
@@ -196,6 +197,7 @@ public final class Bitmap_Delegate {
// ---- native methods ---- // ---- native methods ----
@LayoutlibDelegate
/*package*/ static Bitmap nativeCreate(int[] colors, int offset, int stride, int width, /*package*/ static Bitmap nativeCreate(int[] colors, int offset, int stride, int width,
int height, int nativeConfig, boolean mutable) { int height, int nativeConfig, boolean mutable) {
int imageType = getBufferedImageType(nativeConfig); int imageType = getBufferedImageType(nativeConfig);
@@ -213,6 +215,7 @@ public final class Bitmap_Delegate {
return createBitmap(delegate, mutable, Bitmap.getDefaultDensity()); return createBitmap(delegate, mutable, Bitmap.getDefaultDensity());
} }
@LayoutlibDelegate
/*package*/ static Bitmap nativeCopy(int srcBitmap, int nativeConfig, boolean isMutable) { /*package*/ static Bitmap nativeCopy(int srcBitmap, int nativeConfig, boolean isMutable) {
Bitmap_Delegate srcBmpDelegate = sManager.getDelegate(srcBitmap); Bitmap_Delegate srcBmpDelegate = sManager.getDelegate(srcBitmap);
if (srcBmpDelegate == null) { if (srcBmpDelegate == null) {
@@ -240,14 +243,17 @@ public final class Bitmap_Delegate {
return createBitmap(delegate, isMutable, Bitmap.getDefaultDensity()); return createBitmap(delegate, isMutable, Bitmap.getDefaultDensity());
} }
@LayoutlibDelegate
/*package*/ static void nativeDestructor(int nativeBitmap) { /*package*/ static void nativeDestructor(int nativeBitmap) {
sManager.removeDelegate(nativeBitmap); sManager.removeJavaReferenceFor(nativeBitmap);
} }
@LayoutlibDelegate
/*package*/ static void nativeRecycle(int nativeBitmap) { /*package*/ static void nativeRecycle(int nativeBitmap) {
sManager.removeDelegate(nativeBitmap); sManager.removeJavaReferenceFor(nativeBitmap);
} }
@LayoutlibDelegate
/*package*/ static boolean nativeCompress(int nativeBitmap, int format, int quality, /*package*/ static boolean nativeCompress(int nativeBitmap, int format, int quality,
OutputStream stream, byte[] tempStorage) { OutputStream stream, byte[] tempStorage) {
Bridge.getLog().error(LayoutLog.TAG_UNSUPPORTED, Bridge.getLog().error(LayoutLog.TAG_UNSUPPORTED,
@@ -255,6 +261,7 @@ public final class Bitmap_Delegate {
return true; return true;
} }
@LayoutlibDelegate
/*package*/ static void nativeErase(int nativeBitmap, int color) { /*package*/ static void nativeErase(int nativeBitmap, int color) {
// get the delegate from the native int. // get the delegate from the native int.
Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap);
@@ -274,6 +281,7 @@ public final class Bitmap_Delegate {
} }
} }
@LayoutlibDelegate
/*package*/ static int nativeWidth(int nativeBitmap) { /*package*/ static int nativeWidth(int nativeBitmap) {
// get the delegate from the native int. // get the delegate from the native int.
Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap);
@@ -284,6 +292,7 @@ public final class Bitmap_Delegate {
return delegate.mImage.getWidth(); return delegate.mImage.getWidth();
} }
@LayoutlibDelegate
/*package*/ static int nativeHeight(int nativeBitmap) { /*package*/ static int nativeHeight(int nativeBitmap) {
// get the delegate from the native int. // get the delegate from the native int.
Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap);
@@ -294,6 +303,7 @@ public final class Bitmap_Delegate {
return delegate.mImage.getHeight(); return delegate.mImage.getHeight();
} }
@LayoutlibDelegate
/*package*/ static int nativeRowBytes(int nativeBitmap) { /*package*/ static int nativeRowBytes(int nativeBitmap) {
// get the delegate from the native int. // get the delegate from the native int.
Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap);
@@ -304,6 +314,7 @@ public final class Bitmap_Delegate {
return delegate.mImage.getWidth(); return delegate.mImage.getWidth();
} }
@LayoutlibDelegate
/*package*/ static int nativeConfig(int nativeBitmap) { /*package*/ static int nativeConfig(int nativeBitmap) {
// get the delegate from the native int. // get the delegate from the native int.
Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap);
@@ -314,6 +325,7 @@ public final class Bitmap_Delegate {
return delegate.mConfig.nativeInt; return delegate.mConfig.nativeInt;
} }
@LayoutlibDelegate
/*package*/ static boolean nativeHasAlpha(int nativeBitmap) { /*package*/ static boolean nativeHasAlpha(int nativeBitmap) {
// get the delegate from the native int. // get the delegate from the native int.
Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap);
@@ -324,6 +336,7 @@ public final class Bitmap_Delegate {
return delegate.mHasAlpha; return delegate.mHasAlpha;
} }
@LayoutlibDelegate
/*package*/ static int nativeGetPixel(int nativeBitmap, int x, int y) { /*package*/ static int nativeGetPixel(int nativeBitmap, int x, int y) {
// get the delegate from the native int. // get the delegate from the native int.
Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap);
@@ -334,6 +347,7 @@ public final class Bitmap_Delegate {
return delegate.mImage.getRGB(x, y); return delegate.mImage.getRGB(x, y);
} }
@LayoutlibDelegate
/*package*/ static void nativeGetPixels(int nativeBitmap, int[] pixels, int offset, /*package*/ static void nativeGetPixels(int nativeBitmap, int[] pixels, int offset,
int stride, int x, int y, int width, int height) { int stride, int x, int y, int width, int height) {
Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); 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) { /*package*/ static void nativeSetPixel(int nativeBitmap, int x, int y, int color) {
Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap);
if (delegate == null) { if (delegate == null) {
@@ -354,6 +369,7 @@ public final class Bitmap_Delegate {
delegate.getImage().setRGB(x, y, color); delegate.getImage().setRGB(x, y, color);
} }
@LayoutlibDelegate
/*package*/ static void nativeSetPixels(int nativeBitmap, int[] colors, int offset, /*package*/ static void nativeSetPixels(int nativeBitmap, int[] colors, int offset,
int stride, int x, int y, int width, int height) { int stride, int x, int y, int width, int height) {
Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); 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); delegate.getImage().setRGB(x, y, width, height, colors, offset, stride);
} }
@LayoutlibDelegate
/*package*/ static void nativeCopyPixelsToBuffer(int nativeBitmap, Buffer dst) { /*package*/ static void nativeCopyPixelsToBuffer(int nativeBitmap, Buffer dst) {
// FIXME implement native delegate // 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) { /*package*/ static void nativeCopyPixelsFromBuffer(int nb, Buffer src) {
// FIXME implement native delegate // 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) { /*package*/ static int nativeGenerationId(int nativeBitmap) {
Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap);
if (delegate == null) { if (delegate == null) {
@@ -383,6 +404,7 @@ public final class Bitmap_Delegate {
return delegate.mGenerationId; return delegate.mGenerationId;
} }
@LayoutlibDelegate
/*package*/ static Bitmap nativeCreateFromParcel(Parcel p) { /*package*/ static Bitmap nativeCreateFromParcel(Parcel p) {
// This is only called by Bitmap.CREATOR (Parcelable.Creator<Bitmap>), which is only // This is only called by Bitmap.CREATOR (Parcelable.Creator<Bitmap>), which is only
// used during aidl call so really this should not be called. // used during aidl call so really this should not be called.
@@ -392,6 +414,7 @@ public final class Bitmap_Delegate {
return null; return null;
} }
@LayoutlibDelegate
/*package*/ static boolean nativeWriteToParcel(int nativeBitmap, boolean isMutable, /*package*/ static boolean nativeWriteToParcel(int nativeBitmap, boolean isMutable,
int density, Parcel p) { int density, Parcel p) {
// This is only called when sending a bitmap through aidl, so really this should not // 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; return false;
} }
@LayoutlibDelegate
/*package*/ static Bitmap nativeExtractAlpha(int nativeBitmap, int nativePaint, /*package*/ static Bitmap nativeExtractAlpha(int nativeBitmap, int nativePaint,
int[] offsetXY) { int[] offsetXY) {
Bitmap_Delegate bitmap = sManager.getDelegate(nativeBitmap); Bitmap_Delegate bitmap = sManager.getDelegate(nativeBitmap);
@@ -429,10 +453,12 @@ public final class Bitmap_Delegate {
Density.DEFAULT_DENSITY /*density*/); Density.DEFAULT_DENSITY /*density*/);
} }
@LayoutlibDelegate
/*package*/ static void nativePrepareToDraw(int nativeBitmap) { /*package*/ static void nativePrepareToDraw(int nativeBitmap) {
// nothing to be done here. // nothing to be done here.
} }
@LayoutlibDelegate
/*package*/ static void nativeSetHasAlpha(int nativeBitmap, boolean hasAlpha) { /*package*/ static void nativeSetHasAlpha(int nativeBitmap, boolean hasAlpha) {
// get the delegate from the native int. // get the delegate from the native int.
Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap);
@@ -443,6 +469,7 @@ public final class Bitmap_Delegate {
delegate.mHasAlpha = hasAlpha; delegate.mHasAlpha = hasAlpha;
} }
@LayoutlibDelegate
/*package*/ static boolean nativeSameAs(int nb0, int nb1) { /*package*/ static boolean nativeSameAs(int nb0, int nb1) {
Bitmap_Delegate delegate1 = sManager.getDelegate(nb0); Bitmap_Delegate delegate1 = sManager.getDelegate(nb0);
if (delegate1 == null) { if (delegate1 == null) {
@@ -495,7 +522,7 @@ public final class Bitmap_Delegate {
private static Bitmap createBitmap(Bitmap_Delegate delegate, boolean isMutable, int density) { private static Bitmap createBitmap(Bitmap_Delegate delegate, boolean isMutable, int density) {
// get its native_int // get its native_int
int nativeInt = sManager.addDelegate(delegate); int nativeInt = sManager.addNewDelegate(delegate);
// and create/return a new Bitmap with it // and create/return a new Bitmap with it
return new Bitmap(nativeInt, null /* buffer */, isMutable, null /*ninePatchChunk*/, density); return new Bitmap(nativeInt, null /* buffer */, isMutable, null /*ninePatchChunk*/, density);

View File

@@ -17,6 +17,7 @@
package android.graphics; package android.graphics;
import com.android.layoutlib.bridge.impl.DelegateManager; import com.android.layoutlib.bridge.impl.DelegateManager;
import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
/** /**
* Delegate implementing the native methods of android.graphics.BlurMaskFilter * Delegate implementing the native methods of android.graphics.BlurMaskFilter
@@ -53,9 +54,10 @@ public class BlurMaskFilter_Delegate extends MaskFilter_Delegate {
// ---- native methods ---- // ---- native methods ----
@LayoutlibDelegate
/*package*/ static int nativeConstructor(float radius, int style) { /*package*/ static int nativeConstructor(float radius, int style) {
BlurMaskFilter_Delegate newDelegate = new BlurMaskFilter_Delegate(); BlurMaskFilter_Delegate newDelegate = new BlurMaskFilter_Delegate();
return sManager.addDelegate(newDelegate); return sManager.addNewDelegate(newDelegate);
} }
// ---- Private delegate/helper methods ---- // ---- Private delegate/helper methods ----

View File

@@ -20,6 +20,7 @@ import com.android.ide.common.rendering.api.LayoutLog;
import com.android.layoutlib.bridge.Bridge; import com.android.layoutlib.bridge.Bridge;
import com.android.layoutlib.bridge.impl.DelegateManager; import com.android.layoutlib.bridge.impl.DelegateManager;
import com.android.layoutlib.bridge.impl.GcSnapshot; import com.android.layoutlib.bridge.impl.GcSnapshot;
import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
import android.graphics.Bitmap.Config; import android.graphics.Bitmap.Config;
import android.graphics.Paint_Delegate.FontInfo; import android.graphics.Paint_Delegate.FontInfo;
@@ -53,7 +54,7 @@ public final class Canvas_Delegate {
// ---- delegate manager ---- // ---- delegate manager ----
private static final DelegateManager<Canvas_Delegate> sManager = private static final DelegateManager<Canvas_Delegate> sManager =
new DelegateManager<Canvas_Delegate>(); new DelegateManager<Canvas_Delegate>(Canvas_Delegate.class);
// ---- delegate helper data ---- // ---- delegate helper data ----
@@ -63,7 +64,7 @@ public final class Canvas_Delegate {
private Bitmap_Delegate mBitmap; private Bitmap_Delegate mBitmap;
private GcSnapshot mSnapshot; private GcSnapshot mSnapshot;
private int mDrawFilter = 0; private DrawFilter_Delegate mDrawFilter = null;
// ---- Public Helper methods ---- // ---- Public Helper methods ----
@@ -94,11 +95,12 @@ public final class Canvas_Delegate {
* @return the delegate or null. * @return the delegate or null.
*/ */
public DrawFilter_Delegate getDrawFilter() { public DrawFilter_Delegate getDrawFilter() {
return DrawFilter_Delegate.getDelegate(mDrawFilter); return mDrawFilter;
} }
// ---- native methods ---- // ---- native methods ----
@LayoutlibDelegate
/*package*/ static boolean isOpaque(Canvas thisCanvas) { /*package*/ static boolean isOpaque(Canvas thisCanvas) {
// get the delegate from the native int. // get the delegate from the native int.
Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas); Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas);
@@ -109,6 +111,7 @@ public final class Canvas_Delegate {
return canvasDelegate.mBitmap.getConfig() == Config.RGB_565; return canvasDelegate.mBitmap.getConfig() == Config.RGB_565;
} }
@LayoutlibDelegate
/*package*/ static int getWidth(Canvas thisCanvas) { /*package*/ static int getWidth(Canvas thisCanvas) {
// get the delegate from the native int. // get the delegate from the native int.
Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas); Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas);
@@ -119,6 +122,7 @@ public final class Canvas_Delegate {
return canvasDelegate.mBitmap.getImage().getWidth(); return canvasDelegate.mBitmap.getImage().getWidth();
} }
@LayoutlibDelegate
/*package*/ static int getHeight(Canvas thisCanvas) { /*package*/ static int getHeight(Canvas thisCanvas) {
// get the delegate from the native int. // get the delegate from the native int.
Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas); Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas);
@@ -129,7 +133,8 @@ public final class Canvas_Delegate {
return canvasDelegate.mBitmap.getImage().getHeight(); 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. // get the delegate from the native int.
Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas); Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas);
if (canvasDelegate == null) { if (canvasDelegate == null) {
@@ -139,6 +144,7 @@ public final class Canvas_Delegate {
canvasDelegate.getSnapshot().translate(dx, dy); canvasDelegate.getSnapshot().translate(dx, dy);
} }
@LayoutlibDelegate
/*package*/ static void rotate(Canvas thisCanvas, float degrees) { /*package*/ static void rotate(Canvas thisCanvas, float degrees) {
// get the delegate from the native int. // get the delegate from the native int.
Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas); Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas);
@@ -149,7 +155,8 @@ public final class Canvas_Delegate {
canvasDelegate.getSnapshot().rotate(Math.toRadians(degrees)); 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. // get the delegate from the native int.
Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas); Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas);
if (canvasDelegate == null) { if (canvasDelegate == null) {
@@ -159,7 +166,8 @@ public final class Canvas_Delegate {
canvasDelegate.getSnapshot().scale(sx, sy); 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. // get the delegate from the native int.
Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas); Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas);
if (canvasDelegate == null) { if (canvasDelegate == null) {
@@ -182,15 +190,18 @@ public final class Canvas_Delegate {
g.setTransform(currentTx); g.setTransform(currentTx);
} }
@LayoutlibDelegate
/*package*/ static boolean clipRect(Canvas thisCanvas, RectF rect) { /*package*/ static boolean clipRect(Canvas thisCanvas, RectF rect) {
return clipRect(thisCanvas, rect.left, rect.top, rect.right, rect.bottom); return clipRect(thisCanvas, rect.left, rect.top, rect.right, rect.bottom);
} }
@LayoutlibDelegate
/*package*/ static boolean clipRect(Canvas thisCanvas, Rect rect) { /*package*/ static boolean clipRect(Canvas thisCanvas, Rect rect) {
return clipRect(thisCanvas, (float) rect.left, (float) rect.top, return clipRect(thisCanvas, (float) rect.left, (float) rect.top,
(float) rect.right, (float) rect.bottom); (float) rect.right, (float) rect.bottom);
} }
@LayoutlibDelegate
/*package*/ static boolean clipRect(Canvas thisCanvas, float left, float top, float right, /*package*/ static boolean clipRect(Canvas thisCanvas, float left, float top, float right,
float bottom) { float bottom) {
// get the delegate from the native int. // 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); return canvasDelegate.clipRect(left, top, right, bottom, Region.Op.INTERSECT.nativeInt);
} }
@LayoutlibDelegate
/*package*/ static boolean clipRect(Canvas thisCanvas, int left, int top, int right, /*package*/ static boolean clipRect(Canvas thisCanvas, int left, int top, int right,
int bottom) { int bottom) {
return clipRect(thisCanvas, (float) left, (float) top, (float) right, (float) bottom); return clipRect(thisCanvas, (float) left, (float) top, (float) right, (float) bottom);
} }
@LayoutlibDelegate
/*package*/ static int save(Canvas thisCanvas) { /*package*/ static int save(Canvas thisCanvas) {
return save(thisCanvas, Canvas.MATRIX_SAVE_FLAG | Canvas.CLIP_SAVE_FLAG); return save(thisCanvas, Canvas.MATRIX_SAVE_FLAG | Canvas.CLIP_SAVE_FLAG);
} }
@LayoutlibDelegate
/*package*/ static int save(Canvas thisCanvas, int saveFlags) { /*package*/ static int save(Canvas thisCanvas, int saveFlags) {
// get the delegate from the native int. // get the delegate from the native int.
Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas); Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas);
@@ -222,6 +236,7 @@ public final class Canvas_Delegate {
return canvasDelegate.save(saveFlags); return canvasDelegate.save(saveFlags);
} }
@LayoutlibDelegate
/*package*/ static void restore(Canvas thisCanvas) { /*package*/ static void restore(Canvas thisCanvas) {
// get the delegate from the native int. // get the delegate from the native int.
Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas); Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas);
@@ -232,6 +247,7 @@ public final class Canvas_Delegate {
canvasDelegate.restore(); canvasDelegate.restore();
} }
@LayoutlibDelegate
/*package*/ static int getSaveCount(Canvas thisCanvas) { /*package*/ static int getSaveCount(Canvas thisCanvas) {
// get the delegate from the native int. // get the delegate from the native int.
Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas); Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas);
@@ -242,6 +258,7 @@ public final class Canvas_Delegate {
return canvasDelegate.getSnapshot().size(); return canvasDelegate.getSnapshot().size();
} }
@LayoutlibDelegate
/*package*/ static void restoreToCount(Canvas thisCanvas, int saveCount) { /*package*/ static void restoreToCount(Canvas thisCanvas, int saveCount) {
// get the delegate from the native int. // get the delegate from the native int.
Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas); Canvas_Delegate canvasDelegate = sManager.getDelegate(thisCanvas.mNativeCanvas);
@@ -252,17 +269,22 @@ public final class Canvas_Delegate {
canvasDelegate.restoreTo(saveCount); canvasDelegate.restoreTo(saveCount);
} }
@LayoutlibDelegate
/*package*/ static void drawPoints(Canvas thisCanvas, float[] pts, int offset, int count, /*package*/ static void drawPoints(Canvas thisCanvas, float[] pts, int offset, int count,
Paint paint) { Paint paint) {
// FIXME // 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) { /*package*/ static void drawPoint(Canvas thisCanvas, float x, float y, Paint paint) {
// FIXME // 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, /*package*/ static void drawLines(Canvas thisCanvas,
final float[] pts, final int offset, final int count, final float[] pts, final int offset, final int count,
Paint paint) { Paint paint) {
@@ -277,10 +299,12 @@ public final class Canvas_Delegate {
}); });
} }
@LayoutlibDelegate
/*package*/ static void freeCaches() { /*package*/ static void freeCaches() {
// nothing to be done here. // nothing to be done here.
} }
@LayoutlibDelegate
/*package*/ static int initRaster(int nativeBitmapOrZero) { /*package*/ static int initRaster(int nativeBitmapOrZero) {
if (nativeBitmapOrZero > 0) { if (nativeBitmapOrZero > 0) {
// get the Bitmap from the int // 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. // create a new Canvas_Delegate with the given bitmap and return its new native int.
Canvas_Delegate newDelegate = new Canvas_Delegate(bitmapDelegate); Canvas_Delegate newDelegate = new Canvas_Delegate(bitmapDelegate);
return sManager.addDelegate(newDelegate); return sManager.addNewDelegate(newDelegate);
} else { } else {
// create a new Canvas_Delegate and return its new native int. // create a new Canvas_Delegate and return its new native int.
Canvas_Delegate newDelegate = new Canvas_Delegate(); Canvas_Delegate newDelegate = new Canvas_Delegate();
return sManager.addDelegate(newDelegate); return sManager.addNewDelegate(newDelegate);
} }
} }
@LayoutlibDelegate
/*package*/ static void native_setBitmap(int nativeCanvas, int bitmap) { /*package*/ static void native_setBitmap(int nativeCanvas, int bitmap) {
// get the delegate from the native int. // get the delegate from the native int.
Canvas_Delegate canvasDelegate = sManager.getDelegate(nativeCanvas); Canvas_Delegate canvasDelegate = sManager.getDelegate(nativeCanvas);
@@ -314,6 +339,7 @@ public final class Canvas_Delegate {
canvasDelegate.setBitmap(bitmapDelegate); canvasDelegate.setBitmap(bitmapDelegate);
} }
@LayoutlibDelegate
/*package*/ static int native_saveLayer(int nativeCanvas, RectF bounds, /*package*/ static int native_saveLayer(int nativeCanvas, RectF bounds,
int paint, int layerFlags) { int paint, int layerFlags) {
// get the delegate from the native int. // get the delegate from the native int.
@@ -330,6 +356,7 @@ public final class Canvas_Delegate {
return canvasDelegate.saveLayer(bounds, paintDelegate, layerFlags); return canvasDelegate.saveLayer(bounds, paintDelegate, layerFlags);
} }
@LayoutlibDelegate
/*package*/ static int native_saveLayer(int nativeCanvas, float l, /*package*/ static int native_saveLayer(int nativeCanvas, float l,
float t, float r, float b, float t, float r, float b,
int paint, int layerFlags) { int paint, int layerFlags) {
@@ -348,6 +375,7 @@ public final class Canvas_Delegate {
paintDelegate, layerFlags); paintDelegate, layerFlags);
} }
@LayoutlibDelegate
/*package*/ static int native_saveLayerAlpha(int nativeCanvas, /*package*/ static int native_saveLayerAlpha(int nativeCanvas,
RectF bounds, int alpha, RectF bounds, int alpha,
int layerFlags) { int layerFlags) {
@@ -360,6 +388,7 @@ public final class Canvas_Delegate {
return canvasDelegate.saveLayerAlpha(bounds, alpha, layerFlags); return canvasDelegate.saveLayerAlpha(bounds, alpha, layerFlags);
} }
@LayoutlibDelegate
/*package*/ static int native_saveLayerAlpha(int nativeCanvas, float l, /*package*/ static int native_saveLayerAlpha(int nativeCanvas, float l,
float t, float r, float b, float t, float r, float b,
int alpha, int layerFlags) { int alpha, int layerFlags) {
@@ -373,6 +402,7 @@ public final class Canvas_Delegate {
} }
@LayoutlibDelegate
/*package*/ static void native_concat(int nCanvas, int nMatrix) { /*package*/ static void native_concat(int nCanvas, int nMatrix) {
// get the delegate from the native int. // get the delegate from the native int.
Canvas_Delegate canvasDelegate = sManager.getDelegate(nCanvas); Canvas_Delegate canvasDelegate = sManager.getDelegate(nCanvas);
@@ -400,6 +430,7 @@ public final class Canvas_Delegate {
snapshot.setTransform(currentTx); snapshot.setTransform(currentTx);
} }
@LayoutlibDelegate
/*package*/ static void native_setMatrix(int nCanvas, int nMatrix) { /*package*/ static void native_setMatrix(int nCanvas, int nMatrix) {
// get the delegate from the native int. // get the delegate from the native int.
Canvas_Delegate canvasDelegate = sManager.getDelegate(nCanvas); Canvas_Delegate canvasDelegate = sManager.getDelegate(nCanvas);
@@ -429,6 +460,7 @@ public final class Canvas_Delegate {
} }
} }
@LayoutlibDelegate
/*package*/ static boolean native_clipRect(int nCanvas, /*package*/ static boolean native_clipRect(int nCanvas,
float left, float top, float left, float top,
float right, float bottom, float right, float bottom,
@@ -443,6 +475,7 @@ public final class Canvas_Delegate {
return canvasDelegate.clipRect(left, top, right, bottom, regionOp); return canvasDelegate.clipRect(left, top, right, bottom, regionOp);
} }
@LayoutlibDelegate
/*package*/ static boolean native_clipPath(int nativeCanvas, /*package*/ static boolean native_clipPath(int nativeCanvas,
int nativePath, int nativePath,
int regionOp) { int regionOp) {
@@ -459,6 +492,7 @@ public final class Canvas_Delegate {
return canvasDelegate.mSnapshot.clip(pathDelegate.getJavaShape(), regionOp); return canvasDelegate.mSnapshot.clip(pathDelegate.getJavaShape(), regionOp);
} }
@LayoutlibDelegate
/*package*/ static boolean native_clipRegion(int nativeCanvas, /*package*/ static boolean native_clipRegion(int nativeCanvas,
int nativeRegion, int nativeRegion,
int regionOp) { int regionOp) {
@@ -475,29 +509,23 @@ public final class Canvas_Delegate {
return canvasDelegate.mSnapshot.clip(region.getJavaArea(), regionOp); return canvasDelegate.mSnapshot.clip(region.getJavaArea(), regionOp);
} }
/*package*/ static void nativeSetDrawFilter(int nativeCanvas, @LayoutlibDelegate
int nativeFilter) { /*package*/ static void nativeSetDrawFilter(int nativeCanvas, int nativeFilter) {
Canvas_Delegate canvasDelegate = sManager.getDelegate(nativeCanvas); Canvas_Delegate canvasDelegate = sManager.getDelegate(nativeCanvas);
if (canvasDelegate == null) { if (canvasDelegate == null) {
return; 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 if (canvasDelegate.mDrawFilter != null &&
// we can display the message now. canvasDelegate.mDrawFilter.isSupported() == false) {
DrawFilter_Delegate filterDelegate = DrawFilter_Delegate.getDelegate(nativeFilter);
if (canvasDelegate == null) {
return;
}
if (filterDelegate.isSupported() == false) {
Bridge.getLog().fidelityWarning(LayoutLog.TAG_DRAWFILTER, 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, /*package*/ static boolean native_getClipBounds(int nativeCanvas,
Rect bounds) { Rect bounds) {
// get the delegate from the native int. // get the delegate from the native int.
@@ -518,6 +546,7 @@ public final class Canvas_Delegate {
return false; return false;
} }
@LayoutlibDelegate
/*package*/ static void native_getCTM(int canvas, int matrix) { /*package*/ static void native_getCTM(int canvas, int matrix) {
// get the delegate from the native int. // get the delegate from the native int.
Canvas_Delegate canvasDelegate = sManager.getDelegate(canvas); Canvas_Delegate canvasDelegate = sManager.getDelegate(canvas);
@@ -534,6 +563,7 @@ public final class Canvas_Delegate {
matrixDelegate.set(Matrix_Delegate.makeValues(transform)); matrixDelegate.set(Matrix_Delegate.makeValues(transform));
} }
@LayoutlibDelegate
/*package*/ static boolean native_quickReject(int nativeCanvas, /*package*/ static boolean native_quickReject(int nativeCanvas,
RectF rect, RectF rect,
int native_edgeType) { int native_edgeType) {
@@ -541,6 +571,7 @@ public final class Canvas_Delegate {
return false; return false;
} }
@LayoutlibDelegate
/*package*/ static boolean native_quickReject(int nativeCanvas, /*package*/ static boolean native_quickReject(int nativeCanvas,
int path, int path,
int native_edgeType) { int native_edgeType) {
@@ -548,6 +579,7 @@ public final class Canvas_Delegate {
return false; return false;
} }
@LayoutlibDelegate
/*package*/ static boolean native_quickReject(int nativeCanvas, /*package*/ static boolean native_quickReject(int nativeCanvas,
float left, float top, float left, float top,
float right, float bottom, float right, float bottom,
@@ -556,21 +588,25 @@ public final class Canvas_Delegate {
return false; return false;
} }
@LayoutlibDelegate
/*package*/ static void native_drawRGB(int nativeCanvas, int r, int g, int b) { /*package*/ static void native_drawRGB(int nativeCanvas, int r, int g, int b) {
native_drawColor(nativeCanvas, 0xFF000000 | r << 16 | (g&0xFF) << 8 | (b&0xFF), native_drawColor(nativeCanvas, 0xFF000000 | r << 16 | (g&0xFF) << 8 | (b&0xFF),
PorterDuff.Mode.SRC_OVER.nativeInt); PorterDuff.Mode.SRC_OVER.nativeInt);
} }
@LayoutlibDelegate
/*package*/ static void native_drawARGB(int nativeCanvas, int a, int r, int g, int b) { /*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), native_drawColor(nativeCanvas, a << 24 | (r&0xFF) << 16 | (g&0xFF) << 8 | (b&0xFF),
PorterDuff.Mode.SRC_OVER.nativeInt); PorterDuff.Mode.SRC_OVER.nativeInt);
} }
@LayoutlibDelegate
/*package*/ static void native_drawColor(int nativeCanvas, int color) { /*package*/ static void native_drawColor(int nativeCanvas, int color) {
native_drawColor(nativeCanvas, color, PorterDuff.Mode.SRC_OVER.nativeInt); native_drawColor(nativeCanvas, color, PorterDuff.Mode.SRC_OVER.nativeInt);
} }
@LayoutlibDelegate
/*package*/ static void native_drawColor(int nativeCanvas, final int color, final int mode) { /*package*/ static void native_drawColor(int nativeCanvas, final int color, final int mode) {
// get the delegate from the native int. // get the delegate from the native int.
Canvas_Delegate canvasDelegate = sManager.getDelegate(nativeCanvas); 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) { /*package*/ static void native_drawPaint(int nativeCanvas, int paint) {
// FIXME // 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, /*package*/ static void native_drawLine(int nativeCanvas,
final float startX, final float startY, final float stopX, final float stopY, final float startX, final float startY, final float stopX, final float stopY,
int paint) { int paint) {
@@ -617,11 +656,13 @@ public final class Canvas_Delegate {
}); });
} }
@LayoutlibDelegate
/*package*/ static void native_drawRect(int nativeCanvas, RectF rect, /*package*/ static void native_drawRect(int nativeCanvas, RectF rect,
int paint) { int paint) {
native_drawRect(nativeCanvas, rect.left, rect.top, rect.right, rect.bottom, paint); native_drawRect(nativeCanvas, rect.left, rect.top, rect.right, rect.bottom, paint);
} }
@LayoutlibDelegate
/*package*/ static void native_drawRect(int nativeCanvas, /*package*/ static void native_drawRect(int nativeCanvas,
final float left, final float top, final float right, final float bottom, int paint) { 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) { /*package*/ static void native_drawOval(int nativeCanvas, final RectF oval, int paint) {
if (oval.right > oval.left && oval.bottom > oval.top) { if (oval.right > oval.left && oval.bottom > oval.top) {
draw(nativeCanvas, paint, false /*compositeOnly*/, false /*forceSrcMode*/, 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, @LayoutlibDelegate
float cy, float radius, /*package*/ static void native_drawCircle(int nativeCanvas,
int paint) { float cx, float cy, float radius, int paint) {
native_drawOval(nativeCanvas, native_drawOval(nativeCanvas,
new RectF(cx - radius, cy - radius, radius*2, radius*2), new RectF(cx - radius, cy - radius, radius*2, radius*2),
paint); paint);
} }
/*package*/ static void native_drawArc(int nativeCanvas, RectF oval, @LayoutlibDelegate
float startAngle, float sweep, /*package*/ static void native_drawArc(int nativeCanvas,
boolean useCenter, int paint) { RectF oval, float startAngle, float sweep, boolean useCenter, int paint) {
// FIXME // 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, /*package*/ static void native_drawRoundRect(int nativeCanvas,
final RectF rect, final float rx, final float ry, int paint) { 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, @LayoutlibDelegate
int paint) { /*package*/ static void native_drawPath(int nativeCanvas, int path, int paint) {
final Path_Delegate pathDelegate = Path_Delegate.getDelegate(path); final Path_Delegate pathDelegate = Path_Delegate.getDelegate(path);
if (pathDelegate == null) { if (pathDelegate == null) {
return; return;
@@ -739,6 +783,7 @@ public final class Canvas_Delegate {
}); });
} }
@LayoutlibDelegate
/*package*/ static void native_drawBitmap(Canvas thisCanvas, int nativeCanvas, int bitmap, /*package*/ static void native_drawBitmap(Canvas thisCanvas, int nativeCanvas, int bitmap,
float left, float top, float left, float top,
int nativePaintOrZero, int nativePaintOrZero,
@@ -760,6 +805,7 @@ public final class Canvas_Delegate {
(int)left, (int)top, (int)right, (int)bottom); (int)left, (int)top, (int)right, (int)bottom);
} }
@LayoutlibDelegate
/*package*/ static void native_drawBitmap(Canvas thisCanvas, int nativeCanvas, int bitmap, /*package*/ static void native_drawBitmap(Canvas thisCanvas, int nativeCanvas, int bitmap,
Rect src, RectF dst, Rect src, RectF dst,
int nativePaintOrZero, int nativePaintOrZero,
@@ -784,6 +830,7 @@ public final class Canvas_Delegate {
} }
} }
@LayoutlibDelegate
/*package*/ static void native_drawBitmap(int nativeCanvas, int bitmap, /*package*/ static void native_drawBitmap(int nativeCanvas, int bitmap,
Rect src, Rect dst, Rect src, Rect dst,
int nativePaintOrZero, int nativePaintOrZero,
@@ -808,6 +855,7 @@ public final class Canvas_Delegate {
} }
} }
@LayoutlibDelegate
/*package*/ static void native_drawBitmap(int nativeCanvas, int[] colors, /*package*/ static void native_drawBitmap(int nativeCanvas, int[] colors,
int offset, int stride, final float x, int offset, int stride, final float x,
final float y, int width, int height, 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, /*package*/ static void nativeDrawBitmapMatrix(int nCanvas, int nBitmap,
int nMatrix, int nPaint) { int nMatrix, int nPaint) {
// get the delegate from the native int. // get the delegate from the native int.
@@ -871,29 +920,35 @@ public final class Canvas_Delegate {
}, paintDelegate, true /*compositeOnly*/, false /*forceSrcMode*/); }, paintDelegate, true /*compositeOnly*/, false /*forceSrcMode*/);
} }
@LayoutlibDelegate
/*package*/ static void nativeDrawBitmapMesh(int nCanvas, int nBitmap, /*package*/ static void nativeDrawBitmapMesh(int nCanvas, int nBitmap,
int meshWidth, int meshHeight, int meshWidth, int meshHeight, float[] verts, int vertOffset, int[] colors,
float[] verts, int vertOffset, int colorOffset, int nPaint) {
int[] colors, int colorOffset, int nPaint) {
// FIXME // 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, /*package*/ static void nativeDrawVertices(int nCanvas, int mode, int n,
float[] verts, int vertOffset, float[] texs, int texOffset, float[] verts, int vertOffset,
int[] colors, int colorOffset, short[] indices, float[] texs, int texOffset,
int indexOffset, int indexCount, int nPaint) { int[] colors, int colorOffset,
short[] indices, int indexOffset,
int indexCount, int nPaint) {
// FIXME // 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, /*package*/ static void native_drawText(int nativeCanvas,
final char[] text, final int index, final int count, final char[] text, final int index, final int count,
final float startX, final float startY, int flags, int paint) { final float startX, final float startY, int flags, int paint) {
draw(nativeCanvas, paint, false /*compositeOnly*/, false /*forceSrcMode*/, draw(nativeCanvas, paint, false /*compositeOnly*/, false /*forceSrcMode*/,
new GcSnapshot.Drawable() { new GcSnapshot.Drawable() {
public void draw(Graphics2D graphics, Paint_Delegate paint) { 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 // Any change to this method should be reflected in Paint.measureText
// Paint.TextAlign indicates how the text is positioned relative to X. // Paint.TextAlign indicates how the text is positioned relative to X.
// LEFT is the default and there's nothing to do. // 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, /*package*/ static void native_drawText(int nativeCanvas, String text,
int start, int end, float x, int start, int end, float x,
float y, int flags, int paint) { 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); native_drawText(nativeCanvas, buffer, 0, count, x, y, flags, paint);
} }
@LayoutlibDelegate
/*package*/ static void native_drawTextRun(int nativeCanvas, String text, /*package*/ static void native_drawTextRun(int nativeCanvas, String text,
int start, int end, int contextStart, int contextEnd, int start, int end, int contextStart, int contextEnd,
float x, float y, int flags, int paint) { 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); native_drawText(nativeCanvas, buffer, start, end, x, y, flags, paint);
} }
@LayoutlibDelegate
/*package*/ static void native_drawTextRun(int nativeCanvas, char[] text, /*package*/ static void native_drawTextRun(int nativeCanvas, char[] text,
int start, int count, int contextStart, int contextCount, int start, int count, int contextStart, int contextCount,
float x, float y, int flags, int paint) { float x, float y, int flags, int paint) {
native_drawText(nativeCanvas, text, start, count, x, y, flags, paint); native_drawText(nativeCanvas, text, start, count, x, y, flags, paint);
} }
@LayoutlibDelegate
/*package*/ static void native_drawPosText(int nativeCanvas, /*package*/ static void native_drawPosText(int nativeCanvas,
char[] text, int index, char[] text, int index,
int count, float[] pos, int count, float[] pos,
int paint) { int paint) {
// FIXME // 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, /*package*/ static void native_drawPosText(int nativeCanvas,
String text, float[] pos, String text, float[] pos,
int paint) { int paint) {
// FIXME // 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, /*package*/ static void native_drawTextOnPath(int nativeCanvas,
char[] text, int index, char[] text, int index,
int count, int path, int count, int path,
@@ -1034,24 +1097,30 @@ public final class Canvas_Delegate {
float vOffset, int bidiFlags, float vOffset, int bidiFlags,
int paint) { int paint) {
// FIXME // 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, /*package*/ static void native_drawTextOnPath(int nativeCanvas,
String text, int path, String text, int path,
float hOffset, float hOffset,
float vOffset, float vOffset,
int flags, int paint) { int flags, int paint) {
// FIXME // 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, /*package*/ static void native_drawPicture(int nativeCanvas,
int nativePicture) { int nativePicture) {
// FIXME // 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) { /*package*/ static void finalizer(int nativeCanvas) {
// get the delegate from the native int so that it can be disposed. // get the delegate from the native int so that it can be disposed.
Canvas_Delegate canvasDelegate = sManager.getDelegate(nativeCanvas); Canvas_Delegate canvasDelegate = sManager.getDelegate(nativeCanvas);
@@ -1062,7 +1131,7 @@ public final class Canvas_Delegate {
canvasDelegate.dispose(); canvasDelegate.dispose();
// remove it from the manager. // remove it from the manager.
sManager.removeDelegate(nativeCanvas); sManager.removeJavaReferenceFor(nativeCanvas);
} }
// ---- Private delegate/helper methods ---- // ---- Private delegate/helper methods ----

View File

@@ -17,6 +17,7 @@
package android.graphics; package android.graphics;
import com.android.layoutlib.bridge.impl.DelegateManager; import com.android.layoutlib.bridge.impl.DelegateManager;
import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
/** /**
* Delegate implementing the native methods of android.graphics.ColorFilter * Delegate implementing the native methods of android.graphics.ColorFilter
@@ -37,7 +38,7 @@ public abstract class ColorFilter_Delegate {
// ---- delegate manager ---- // ---- delegate manager ----
protected static final DelegateManager<ColorFilter_Delegate> sManager = protected static final DelegateManager<ColorFilter_Delegate> sManager =
new DelegateManager<ColorFilter_Delegate>(); new DelegateManager<ColorFilter_Delegate>(ColorFilter_Delegate.class);
// ---- delegate helper data ---- // ---- delegate helper data ----
@@ -54,8 +55,9 @@ public abstract class ColorFilter_Delegate {
// ---- native methods ---- // ---- native methods ----
@LayoutlibDelegate
/*package*/ static void finalizer(int native_instance, int nativeColorFilter) { /*package*/ static void finalizer(int native_instance, int nativeColorFilter) {
sManager.removeDelegate(native_instance); sManager.removeJavaReferenceFor(native_instance);
} }
// ---- Private delegate/helper methods ---- // ---- Private delegate/helper methods ----

View File

@@ -17,6 +17,7 @@
package android.graphics; package android.graphics;
import com.android.layoutlib.bridge.impl.DelegateManager; import com.android.layoutlib.bridge.impl.DelegateManager;
import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
/** /**
* Delegate implementing the native methods of android.graphics.ColorMatrixColorFilter * Delegate implementing the native methods of android.graphics.ColorMatrixColorFilter
@@ -53,11 +54,13 @@ public class ColorMatrixColorFilter_Delegate extends ColorFilter_Delegate {
// ---- native methods ---- // ---- native methods ----
@LayoutlibDelegate
/*package*/ static int nativeColorMatrixFilter(float[] array) { /*package*/ static int nativeColorMatrixFilter(float[] array) {
ColorMatrixColorFilter_Delegate newDelegate = new ColorMatrixColorFilter_Delegate(); ColorMatrixColorFilter_Delegate newDelegate = new ColorMatrixColorFilter_Delegate();
return sManager.addDelegate(newDelegate); return sManager.addNewDelegate(newDelegate);
} }
@LayoutlibDelegate
/*package*/ static int nColorMatrixFilter(int nativeFilter, float[] array) { /*package*/ static int nColorMatrixFilter(int nativeFilter, float[] array) {
// pass // pass
return 0; return 0;

View File

@@ -17,6 +17,7 @@
package android.graphics; package android.graphics;
import com.android.layoutlib.bridge.impl.DelegateManager; import com.android.layoutlib.bridge.impl.DelegateManager;
import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
import java.awt.Stroke; import java.awt.Stroke;
@@ -60,9 +61,10 @@ public class ComposePathEffect_Delegate extends PathEffect_Delegate {
// ---- native methods ---- // ---- native methods ----
@LayoutlibDelegate
/*package*/ static int nativeCreate(int outerpe, int innerpe) { /*package*/ static int nativeCreate(int outerpe, int innerpe) {
ComposePathEffect_Delegate newDelegate = new ComposePathEffect_Delegate(); ComposePathEffect_Delegate newDelegate = new ComposePathEffect_Delegate();
return sManager.addDelegate(newDelegate); return sManager.addNewDelegate(newDelegate);
} }
// ---- Private delegate/helper methods ---- // ---- Private delegate/helper methods ----

View File

@@ -17,6 +17,7 @@
package android.graphics; package android.graphics;
import com.android.layoutlib.bridge.impl.DelegateManager; import com.android.layoutlib.bridge.impl.DelegateManager;
import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
import java.awt.Paint; import java.awt.Paint;
@@ -61,33 +62,36 @@ public class ComposeShader_Delegate extends Shader_Delegate {
// ---- native methods ---- // ---- native methods ----
@LayoutlibDelegate
/*package*/ static int nativeCreate1(int native_shaderA, int native_shaderB, /*package*/ static int nativeCreate1(int native_shaderA, int native_shaderB,
int native_mode) { int native_mode) {
// FIXME not supported yet. // FIXME not supported yet.
ComposeShader_Delegate newDelegate = new ComposeShader_Delegate(); 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, /*package*/ static int nativeCreate2(int native_shaderA, int native_shaderB,
int porterDuffMode) { int porterDuffMode) {
// FIXME not supported yet. // FIXME not supported yet.
ComposeShader_Delegate newDelegate = new ComposeShader_Delegate(); 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, /*package*/ static int nativePostCreate1(int native_shader, int native_skiaShaderA,
int native_skiaShaderB, int native_mode) { int native_skiaShaderB, int native_mode) {
// pass, not needed. // pass, not needed.
return 0; return 0;
} }
@LayoutlibDelegate
/*package*/ static int nativePostCreate2(int native_shader, int native_skiaShaderA, /*package*/ static int nativePostCreate2(int native_shader, int native_skiaShaderA,
int native_skiaShaderB, int porterDuffMode) { int native_skiaShaderB, int porterDuffMode) {
// pass, not needed. // pass, not needed.
return 0; return 0;
} }
// ---- Private delegate/helper methods ---- // ---- Private delegate/helper methods ----
} }

View File

@@ -17,6 +17,7 @@
package android.graphics; package android.graphics;
import com.android.layoutlib.bridge.impl.DelegateManager; import com.android.layoutlib.bridge.impl.DelegateManager;
import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
import java.awt.Stroke; import java.awt.Stroke;
@@ -60,9 +61,10 @@ public class CornerPathEffect_Delegate extends PathEffect_Delegate {
// ---- native methods ---- // ---- native methods ----
@LayoutlibDelegate
/*package*/ static int nativeCreate(float radius) { /*package*/ static int nativeCreate(float radius) {
CornerPathEffect_Delegate newDelegate = new CornerPathEffect_Delegate(); CornerPathEffect_Delegate newDelegate = new CornerPathEffect_Delegate();
return sManager.addDelegate(newDelegate); return sManager.addNewDelegate(newDelegate);
} }
// ---- Private delegate/helper methods ---- // ---- Private delegate/helper methods ----

View File

@@ -17,6 +17,7 @@
package android.graphics; package android.graphics;
import com.android.layoutlib.bridge.impl.DelegateManager; import com.android.layoutlib.bridge.impl.DelegateManager;
import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
import java.awt.BasicStroke; import java.awt.BasicStroke;
import java.awt.Stroke; import java.awt.Stroke;
@@ -71,9 +72,10 @@ public final class DashPathEffect_Delegate extends PathEffect_Delegate {
// ---- native methods ---- // ---- native methods ----
@LayoutlibDelegate
/*package*/ static int nativeCreate(float intervals[], float phase) { /*package*/ static int nativeCreate(float intervals[], float phase) {
DashPathEffect_Delegate newDelegate = new DashPathEffect_Delegate(intervals, phase); DashPathEffect_Delegate newDelegate = new DashPathEffect_Delegate(intervals, phase);
return sManager.addDelegate(newDelegate); return sManager.addNewDelegate(newDelegate);
} }
// ---- Private delegate/helper methods ---- // ---- Private delegate/helper methods ----

View File

@@ -17,6 +17,7 @@
package android.graphics; package android.graphics;
import com.android.layoutlib.bridge.impl.DelegateManager; import com.android.layoutlib.bridge.impl.DelegateManager;
import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
import java.awt.Stroke; import java.awt.Stroke;
@@ -60,9 +61,10 @@ public class DiscretePathEffect_Delegate extends PathEffect_Delegate {
// ---- native methods ---- // ---- native methods ----
@LayoutlibDelegate
/*package*/ static int nativeCreate(float length, float deviation) { /*package*/ static int nativeCreate(float length, float deviation) {
DiscretePathEffect_Delegate newDelegate = new DiscretePathEffect_Delegate(); DiscretePathEffect_Delegate newDelegate = new DiscretePathEffect_Delegate();
return sManager.addDelegate(newDelegate); return sManager.addNewDelegate(newDelegate);
} }
// ---- Private delegate/helper methods ---- // ---- Private delegate/helper methods ----

View File

@@ -17,6 +17,7 @@
package android.graphics; package android.graphics;
import com.android.layoutlib.bridge.impl.DelegateManager; import com.android.layoutlib.bridge.impl.DelegateManager;
import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
/** /**
* Delegate implementing the native methods of android.graphics.DrawFilter * Delegate implementing the native methods of android.graphics.DrawFilter
@@ -37,7 +38,7 @@ public abstract class DrawFilter_Delegate {
// ---- delegate manager ---- // ---- delegate manager ----
protected static final DelegateManager<DrawFilter_Delegate> sManager = protected static final DelegateManager<DrawFilter_Delegate> sManager =
new DelegateManager<DrawFilter_Delegate>(); new DelegateManager<DrawFilter_Delegate>(DrawFilter_Delegate.class);
// ---- delegate helper data ---- // ---- delegate helper data ----
@@ -54,8 +55,9 @@ public abstract class DrawFilter_Delegate {
// ---- native methods ---- // ---- native methods ----
@LayoutlibDelegate
/*package*/ static void nativeDestructor(int nativeDrawFilter) { /*package*/ static void nativeDestructor(int nativeDrawFilter) {
sManager.removeDelegate(nativeDrawFilter); sManager.removeJavaReferenceFor(nativeDrawFilter);
} }
// ---- Private delegate/helper methods ---- // ---- Private delegate/helper methods ----

View File

@@ -17,6 +17,7 @@
package android.graphics; package android.graphics;
import com.android.layoutlib.bridge.impl.DelegateManager; import com.android.layoutlib.bridge.impl.DelegateManager;
import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
/** /**
* Delegate implementing the native methods of android.graphics.EmbossMaskFilter * Delegate implementing the native methods of android.graphics.EmbossMaskFilter
@@ -53,10 +54,11 @@ public class EmbossMaskFilter_Delegate extends MaskFilter_Delegate {
// ---- native methods ---- // ---- native methods ----
@LayoutlibDelegate
/*package*/ static int nativeConstructor(float[] direction, float ambient, /*package*/ static int nativeConstructor(float[] direction, float ambient,
float specular, float blurRadius) { float specular, float blurRadius) {
EmbossMaskFilter_Delegate newDelegate = new EmbossMaskFilter_Delegate(); EmbossMaskFilter_Delegate newDelegate = new EmbossMaskFilter_Delegate();
return sManager.addDelegate(newDelegate); return sManager.addNewDelegate(newDelegate);
} }
// ---- Private delegate/helper methods ---- // ---- Private delegate/helper methods ----

View File

@@ -17,6 +17,7 @@
package android.graphics; package android.graphics;
import com.android.layoutlib.bridge.impl.DelegateManager; import com.android.layoutlib.bridge.impl.DelegateManager;
import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
/** /**
* Delegate implementing the native methods of android.graphics.LayerRasterizer * Delegate implementing the native methods of android.graphics.LayerRasterizer
@@ -53,11 +54,13 @@ public class LayerRasterizer_Delegate extends Rasterizer_Delegate {
// ---- native methods ---- // ---- native methods ----
@LayoutlibDelegate
/*package*/ static int nativeConstructor() { /*package*/ static int nativeConstructor() {
LayerRasterizer_Delegate newDelegate = new LayerRasterizer_Delegate(); 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) { /*package*/ static void nativeAddLayer(int native_layer, int native_paint, float dx, float dy) {
} }

View File

@@ -17,6 +17,7 @@
package android.graphics; package android.graphics;
import com.android.layoutlib.bridge.impl.DelegateManager; import com.android.layoutlib.bridge.impl.DelegateManager;
import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
/** /**
* Delegate implementing the native methods of android.graphics.LightingColorFilter * Delegate implementing the native methods of android.graphics.LightingColorFilter
@@ -53,11 +54,13 @@ public class LightingColorFilter_Delegate extends ColorFilter_Delegate {
// ---- native methods ---- // ---- native methods ----
@LayoutlibDelegate
/*package*/ static int native_CreateLightingFilter(int mul, int add) { /*package*/ static int native_CreateLightingFilter(int mul, int add) {
LightingColorFilter_Delegate newDelegate = new LightingColorFilter_Delegate(); 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) { /*package*/ static int nCreateLightingFilter(int nativeFilter, int mul, int add) {
// pass // pass
return 0; return 0;

View File

@@ -19,6 +19,7 @@ package android.graphics;
import com.android.ide.common.rendering.api.LayoutLog; import com.android.ide.common.rendering.api.LayoutLog;
import com.android.layoutlib.bridge.Bridge; import com.android.layoutlib.bridge.Bridge;
import com.android.layoutlib.bridge.impl.DelegateManager; import com.android.layoutlib.bridge.impl.DelegateManager;
import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
import android.graphics.Shader.TileMode; import android.graphics.Shader.TileMode;
@@ -52,13 +53,16 @@ public final class LinearGradient_Delegate extends Gradient_Delegate {
// ---- native methods ---- // ---- native methods ----
@LayoutlibDelegate
/*package*/ static int nativeCreate1(LinearGradient thisGradient, /*package*/ static int nativeCreate1(LinearGradient thisGradient,
float x0, float y0, float x1, float y1, float x0, float y0, float x1, float y1,
int colors[], float positions[], int tileMode) { int colors[], float positions[], int tileMode) {
LinearGradient_Delegate newDelegate = new LinearGradient_Delegate(x0, y0, x1, y1, LinearGradient_Delegate newDelegate = new LinearGradient_Delegate(x0, y0, x1, y1,
colors, positions, Shader_Delegate.getTileMode(tileMode)); colors, positions, Shader_Delegate.getTileMode(tileMode));
return sManager.addDelegate(newDelegate); return sManager.addNewDelegate(newDelegate);
} }
@LayoutlibDelegate
/*package*/ static int nativeCreate2(LinearGradient thisGradient, /*package*/ static int nativeCreate2(LinearGradient thisGradient,
float x0, float y0, float x1, float y1, float x0, float y0, float x1, float y1,
int color0, int color1, int tileMode) { 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*/, x0, y0, x1, y1, new int[] { color0, color1}, null /*positions*/,
tileMode); tileMode);
} }
@LayoutlibDelegate
/*package*/ static int nativePostCreate1(LinearGradient thisGradient, /*package*/ static int nativePostCreate1(LinearGradient thisGradient,
int native_shader, float x0, float y0, float x1, float y1, int native_shader, float x0, float y0, float x1, float y1,
int colors[], float positions[], int tileMode) { int colors[], float positions[], int tileMode) {
// nothing to be done here. // nothing to be done here.
return 0; return 0;
} }
@LayoutlibDelegate
/*package*/ static int nativePostCreate2(LinearGradient thisGradient, /*package*/ static int nativePostCreate2(LinearGradient thisGradient,
int native_shader, float x0, float y0, float x1, float y1, int native_shader, float x0, float y0, float x1, float y1,
int color0, int color1, int tileMode) { int color0, int color1, int tileMode) {

View File

@@ -17,6 +17,7 @@
package android.graphics; package android.graphics;
import com.android.layoutlib.bridge.impl.DelegateManager; import com.android.layoutlib.bridge.impl.DelegateManager;
import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
/** /**
* Delegate implementing the native methods of android.graphics.MaskFilter * Delegate implementing the native methods of android.graphics.MaskFilter
@@ -37,7 +38,7 @@ public abstract class MaskFilter_Delegate {
// ---- delegate manager ---- // ---- delegate manager ----
protected static final DelegateManager<MaskFilter_Delegate> sManager = protected static final DelegateManager<MaskFilter_Delegate> sManager =
new DelegateManager<MaskFilter_Delegate>(); new DelegateManager<MaskFilter_Delegate>(MaskFilter_Delegate.class);
// ---- delegate helper data ---- // ---- delegate helper data ----
@@ -54,8 +55,9 @@ public abstract class MaskFilter_Delegate {
// ---- native methods ---- // ---- native methods ----
@LayoutlibDelegate
/*package*/ static void nativeDestructor(int native_filter) { /*package*/ static void nativeDestructor(int native_filter) {
sManager.removeDelegate(native_filter); sManager.removeJavaReferenceFor(native_filter);
} }
// ---- Private delegate/helper methods ---- // ---- Private delegate/helper methods ----

View File

@@ -20,6 +20,7 @@ package android.graphics;
import com.android.ide.common.rendering.api.LayoutLog; import com.android.ide.common.rendering.api.LayoutLog;
import com.android.layoutlib.bridge.Bridge; import com.android.layoutlib.bridge.Bridge;
import com.android.layoutlib.bridge.impl.DelegateManager; import com.android.layoutlib.bridge.impl.DelegateManager;
import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
import android.graphics.Matrix.ScaleToFit; import android.graphics.Matrix.ScaleToFit;
@@ -45,7 +46,7 @@ public final class Matrix_Delegate {
// ---- delegate manager ---- // ---- delegate manager ----
private static final DelegateManager<Matrix_Delegate> sManager = private static final DelegateManager<Matrix_Delegate> sManager =
new DelegateManager<Matrix_Delegate>(); new DelegateManager<Matrix_Delegate>(Matrix_Delegate.class);
// ---- delegate data ---- // ---- delegate data ----
private float mValues[] = new float[MATRIX_SIZE]; private float mValues[] = new float[MATRIX_SIZE];
@@ -172,6 +173,7 @@ public final class Matrix_Delegate {
// ---- native methods ---- // ---- native methods ----
@LayoutlibDelegate
/*package*/ static int native_create(int native_src_or_zero) { /*package*/ static int native_create(int native_src_or_zero) {
// create the delegate // create the delegate
Matrix_Delegate newDelegate = new Matrix_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) { /*package*/ static boolean native_isIdentity(int native_object) {
Matrix_Delegate d = sManager.getDelegate(native_object); Matrix_Delegate d = sManager.getDelegate(native_object);
if (d == null) { if (d == null) {
@@ -199,6 +202,7 @@ public final class Matrix_Delegate {
return d.isIdentity(); return d.isIdentity();
} }
@LayoutlibDelegate
/*package*/ static boolean native_rectStaysRect(int native_object) { /*package*/ static boolean native_rectStaysRect(int native_object) {
Matrix_Delegate d = sManager.getDelegate(native_object); Matrix_Delegate d = sManager.getDelegate(native_object);
if (d == null) { if (d == null) {
@@ -208,6 +212,7 @@ public final class Matrix_Delegate {
return (d.computeTypeMask() & kRectStaysRect_Mask) != 0; return (d.computeTypeMask() & kRectStaysRect_Mask) != 0;
} }
@LayoutlibDelegate
/*package*/ static void native_reset(int native_object) { /*package*/ static void native_reset(int native_object) {
Matrix_Delegate d = sManager.getDelegate(native_object); Matrix_Delegate d = sManager.getDelegate(native_object);
if (d == null) { if (d == null) {
@@ -217,6 +222,7 @@ public final class Matrix_Delegate {
reset(d.mValues); reset(d.mValues);
} }
@LayoutlibDelegate
/*package*/ static void native_set(int native_object, int other) { /*package*/ static void native_set(int native_object, int other) {
Matrix_Delegate d = sManager.getDelegate(native_object); Matrix_Delegate d = sManager.getDelegate(native_object);
if (d == null) { if (d == null) {
@@ -231,6 +237,7 @@ public final class Matrix_Delegate {
System.arraycopy(src.mValues, 0, d.mValues, 0, MATRIX_SIZE); System.arraycopy(src.mValues, 0, d.mValues, 0, MATRIX_SIZE);
} }
@LayoutlibDelegate
/*package*/ static void native_setTranslate(int native_object, float dx, float dy) { /*package*/ static void native_setTranslate(int native_object, float dx, float dy) {
Matrix_Delegate d = sManager.getDelegate(native_object); Matrix_Delegate d = sManager.getDelegate(native_object);
if (d == null) { if (d == null) {
@@ -240,6 +247,7 @@ public final class Matrix_Delegate {
setTranslate(d.mValues, dx, dy); setTranslate(d.mValues, dx, dy);
} }
@LayoutlibDelegate
/*package*/ static void native_setScale(int native_object, float sx, float sy, /*package*/ static void native_setScale(int native_object, float sx, float sy,
float px, float py) { float px, float py) {
Matrix_Delegate d = sManager.getDelegate(native_object); Matrix_Delegate d = sManager.getDelegate(native_object);
@@ -250,6 +258,7 @@ public final class Matrix_Delegate {
d.mValues = getScale(sx, sy, px, py); d.mValues = getScale(sx, sy, px, py);
} }
@LayoutlibDelegate
/*package*/ static void native_setScale(int native_object, float sx, float sy) { /*package*/ static void native_setScale(int native_object, float sx, float sy) {
Matrix_Delegate d = sManager.getDelegate(native_object); Matrix_Delegate d = sManager.getDelegate(native_object);
if (d == null) { if (d == null) {
@@ -267,6 +276,7 @@ public final class Matrix_Delegate {
d.mValues[8] = 1; d.mValues[8] = 1;
} }
@LayoutlibDelegate
/*package*/ static void native_setRotate(int native_object, float degrees, float px, float py) { /*package*/ static void native_setRotate(int native_object, float degrees, float px, float py) {
Matrix_Delegate d = sManager.getDelegate(native_object); Matrix_Delegate d = sManager.getDelegate(native_object);
if (d == null) { if (d == null) {
@@ -276,6 +286,7 @@ public final class Matrix_Delegate {
d.mValues = getRotate(degrees, px, py); d.mValues = getRotate(degrees, px, py);
} }
@LayoutlibDelegate
/*package*/ static void native_setRotate(int native_object, float degrees) { /*package*/ static void native_setRotate(int native_object, float degrees) {
Matrix_Delegate d = sManager.getDelegate(native_object); Matrix_Delegate d = sManager.getDelegate(native_object);
if (d == null) { if (d == null) {
@@ -285,6 +296,7 @@ public final class Matrix_Delegate {
setRotate(d.mValues, degrees); setRotate(d.mValues, degrees);
} }
@LayoutlibDelegate
/*package*/ static void native_setSinCos(int native_object, float sinValue, float cosValue, /*package*/ static void native_setSinCos(int native_object, float sinValue, float cosValue,
float px, float py) { float px, float py) {
Matrix_Delegate d = sManager.getDelegate(native_object); Matrix_Delegate d = sManager.getDelegate(native_object);
@@ -303,6 +315,7 @@ public final class Matrix_Delegate {
d.postTransform(getTranslate(px, py)); d.postTransform(getTranslate(px, py));
} }
@LayoutlibDelegate
/*package*/ static void native_setSinCos(int native_object, float sinValue, float cosValue) { /*package*/ static void native_setSinCos(int native_object, float sinValue, float cosValue) {
Matrix_Delegate d = sManager.getDelegate(native_object); Matrix_Delegate d = sManager.getDelegate(native_object);
if (d == null) { if (d == null) {
@@ -312,6 +325,7 @@ public final class Matrix_Delegate {
setRotate(d.mValues, sinValue, cosValue); setRotate(d.mValues, sinValue, cosValue);
} }
@LayoutlibDelegate
/*package*/ static void native_setSkew(int native_object, float kx, float ky, /*package*/ static void native_setSkew(int native_object, float kx, float ky,
float px, float py) { float px, float py) {
Matrix_Delegate d = sManager.getDelegate(native_object); Matrix_Delegate d = sManager.getDelegate(native_object);
@@ -322,6 +336,7 @@ public final class Matrix_Delegate {
d.mValues = getSkew(kx, ky, px, py); d.mValues = getSkew(kx, ky, px, py);
} }
@LayoutlibDelegate
/*package*/ static void native_setSkew(int native_object, float kx, float ky) { /*package*/ static void native_setSkew(int native_object, float kx, float ky) {
Matrix_Delegate d = sManager.getDelegate(native_object); Matrix_Delegate d = sManager.getDelegate(native_object);
if (d == null) { if (d == null) {
@@ -339,6 +354,7 @@ public final class Matrix_Delegate {
d.mValues[8] = 1; d.mValues[8] = 1;
} }
@LayoutlibDelegate
/*package*/ static boolean native_setConcat(int native_object, int a, int b) { /*package*/ static boolean native_setConcat(int native_object, int a, int b) {
if (a == native_object) { if (a == native_object) {
return native_preConcat(native_object, b); return native_preConcat(native_object, b);
@@ -366,6 +382,7 @@ public final class Matrix_Delegate {
return true; return true;
} }
@LayoutlibDelegate
/*package*/ static boolean native_preTranslate(int native_object, float dx, float dy) { /*package*/ static boolean native_preTranslate(int native_object, float dx, float dy) {
Matrix_Delegate d = sManager.getDelegate(native_object); Matrix_Delegate d = sManager.getDelegate(native_object);
if (d == null) { if (d == null) {
@@ -376,6 +393,7 @@ public final class Matrix_Delegate {
return true; return true;
} }
@LayoutlibDelegate
/*package*/ static boolean native_preScale(int native_object, float sx, float sy, /*package*/ static boolean native_preScale(int native_object, float sx, float sy,
float px, float py) { float px, float py) {
Matrix_Delegate d = sManager.getDelegate(native_object); Matrix_Delegate d = sManager.getDelegate(native_object);
@@ -387,6 +405,7 @@ public final class Matrix_Delegate {
return true; return true;
} }
@LayoutlibDelegate
/*package*/ static boolean native_preScale(int native_object, float sx, float sy) { /*package*/ static boolean native_preScale(int native_object, float sx, float sy) {
Matrix_Delegate d = sManager.getDelegate(native_object); Matrix_Delegate d = sManager.getDelegate(native_object);
if (d == null) { if (d == null) {
@@ -397,6 +416,7 @@ public final class Matrix_Delegate {
return true; return true;
} }
@LayoutlibDelegate
/*package*/ static boolean native_preRotate(int native_object, float degrees, /*package*/ static boolean native_preRotate(int native_object, float degrees,
float px, float py) { float px, float py) {
Matrix_Delegate d = sManager.getDelegate(native_object); Matrix_Delegate d = sManager.getDelegate(native_object);
@@ -408,6 +428,7 @@ public final class Matrix_Delegate {
return true; return true;
} }
@LayoutlibDelegate
/*package*/ static boolean native_preRotate(int native_object, float degrees) { /*package*/ static boolean native_preRotate(int native_object, float degrees) {
Matrix_Delegate d = sManager.getDelegate(native_object); Matrix_Delegate d = sManager.getDelegate(native_object);
if (d == null) { if (d == null) {
@@ -422,6 +443,7 @@ public final class Matrix_Delegate {
return true; return true;
} }
@LayoutlibDelegate
/*package*/ static boolean native_preSkew(int native_object, float kx, float ky, /*package*/ static boolean native_preSkew(int native_object, float kx, float ky,
float px, float py) { float px, float py) {
Matrix_Delegate d = sManager.getDelegate(native_object); Matrix_Delegate d = sManager.getDelegate(native_object);
@@ -433,6 +455,7 @@ public final class Matrix_Delegate {
return true; return true;
} }
@LayoutlibDelegate
/*package*/ static boolean native_preSkew(int native_object, float kx, float ky) { /*package*/ static boolean native_preSkew(int native_object, float kx, float ky) {
Matrix_Delegate d = sManager.getDelegate(native_object); Matrix_Delegate d = sManager.getDelegate(native_object);
if (d == null) { if (d == null) {
@@ -443,6 +466,7 @@ public final class Matrix_Delegate {
return true; return true;
} }
@LayoutlibDelegate
/*package*/ static boolean native_preConcat(int native_object, int other_matrix) { /*package*/ static boolean native_preConcat(int native_object, int other_matrix) {
Matrix_Delegate d = sManager.getDelegate(native_object); Matrix_Delegate d = sManager.getDelegate(native_object);
if (d == null) { if (d == null) {
@@ -458,6 +482,7 @@ public final class Matrix_Delegate {
return true; return true;
} }
@LayoutlibDelegate
/*package*/ static boolean native_postTranslate(int native_object, float dx, float dy) { /*package*/ static boolean native_postTranslate(int native_object, float dx, float dy) {
Matrix_Delegate d = sManager.getDelegate(native_object); Matrix_Delegate d = sManager.getDelegate(native_object);
if (d == null) { if (d == null) {
@@ -468,6 +493,7 @@ public final class Matrix_Delegate {
return true; return true;
} }
@LayoutlibDelegate
/*package*/ static boolean native_postScale(int native_object, float sx, float sy, /*package*/ static boolean native_postScale(int native_object, float sx, float sy,
float px, float py) { float px, float py) {
Matrix_Delegate d = sManager.getDelegate(native_object); Matrix_Delegate d = sManager.getDelegate(native_object);
@@ -479,6 +505,7 @@ public final class Matrix_Delegate {
return true; return true;
} }
@LayoutlibDelegate
/*package*/ static boolean native_postScale(int native_object, float sx, float sy) { /*package*/ static boolean native_postScale(int native_object, float sx, float sy) {
Matrix_Delegate d = sManager.getDelegate(native_object); Matrix_Delegate d = sManager.getDelegate(native_object);
if (d == null) { if (d == null) {
@@ -489,6 +516,7 @@ public final class Matrix_Delegate {
return true; return true;
} }
@LayoutlibDelegate
/*package*/ static boolean native_postRotate(int native_object, float degrees, /*package*/ static boolean native_postRotate(int native_object, float degrees,
float px, float py) { float px, float py) {
Matrix_Delegate d = sManager.getDelegate(native_object); Matrix_Delegate d = sManager.getDelegate(native_object);
@@ -500,6 +528,7 @@ public final class Matrix_Delegate {
return true; return true;
} }
@LayoutlibDelegate
/*package*/ static boolean native_postRotate(int native_object, float degrees) { /*package*/ static boolean native_postRotate(int native_object, float degrees) {
Matrix_Delegate d = sManager.getDelegate(native_object); Matrix_Delegate d = sManager.getDelegate(native_object);
if (d == null) { if (d == null) {
@@ -510,6 +539,7 @@ public final class Matrix_Delegate {
return true; return true;
} }
@LayoutlibDelegate
/*package*/ static boolean native_postSkew(int native_object, float kx, float ky, /*package*/ static boolean native_postSkew(int native_object, float kx, float ky,
float px, float py) { float px, float py) {
Matrix_Delegate d = sManager.getDelegate(native_object); Matrix_Delegate d = sManager.getDelegate(native_object);
@@ -521,6 +551,7 @@ public final class Matrix_Delegate {
return true; return true;
} }
@LayoutlibDelegate
/*package*/ static boolean native_postSkew(int native_object, float kx, float ky) { /*package*/ static boolean native_postSkew(int native_object, float kx, float ky) {
Matrix_Delegate d = sManager.getDelegate(native_object); Matrix_Delegate d = sManager.getDelegate(native_object);
if (d == null) { if (d == null) {
@@ -531,6 +562,7 @@ public final class Matrix_Delegate {
return true; return true;
} }
@LayoutlibDelegate
/*package*/ static boolean native_postConcat(int native_object, int other_matrix) { /*package*/ static boolean native_postConcat(int native_object, int other_matrix) {
Matrix_Delegate d = sManager.getDelegate(native_object); Matrix_Delegate d = sManager.getDelegate(native_object);
if (d == null) { if (d == null) {
@@ -546,6 +578,7 @@ public final class Matrix_Delegate {
return true; return true;
} }
@LayoutlibDelegate
/*package*/ static boolean native_setRectToRect(int native_object, RectF src, /*package*/ static boolean native_setRectToRect(int native_object, RectF src,
RectF dst, int stf) { RectF dst, int stf) {
Matrix_Delegate d = sManager.getDelegate(native_object); Matrix_Delegate d = sManager.getDelegate(native_object);
@@ -610,6 +643,7 @@ public final class Matrix_Delegate {
return true; return true;
} }
@LayoutlibDelegate
/*package*/ static boolean native_setPolyToPoly(int native_object, float[] src, int srcIndex, /*package*/ static boolean native_setPolyToPoly(int native_object, float[] src, int srcIndex,
float[] dst, int dstIndex, int pointCount) { float[] dst, int dstIndex, int pointCount) {
// FIXME // FIXME
@@ -619,6 +653,7 @@ public final class Matrix_Delegate {
return false; return false;
} }
@LayoutlibDelegate
/*package*/ static boolean native_invert(int native_object, int inverse) { /*package*/ static boolean native_invert(int native_object, int inverse) {
Matrix_Delegate d = sManager.getDelegate(native_object); Matrix_Delegate d = sManager.getDelegate(native_object);
if (d == null) { 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, /*package*/ static void native_mapPoints(int native_object, float[] dst, int dstIndex,
float[] src, int srcIndex, int ptCount, boolean isPts) { float[] src, int srcIndex, int ptCount, boolean isPts) {
Matrix_Delegate d = sManager.getDelegate(native_object); 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) { /*package*/ static boolean native_mapRect(int native_object, RectF dst, RectF src) {
Matrix_Delegate d = sManager.getDelegate(native_object); Matrix_Delegate d = sManager.getDelegate(native_object);
if (d == null) { if (d == null) {
@@ -669,6 +706,7 @@ public final class Matrix_Delegate {
return d.mapRect(dst, src); return d.mapRect(dst, src);
} }
@LayoutlibDelegate
/*package*/ static float native_mapRadius(int native_object, float radius) { /*package*/ static float native_mapRadius(int native_object, float radius) {
Matrix_Delegate d = sManager.getDelegate(native_object); Matrix_Delegate d = sManager.getDelegate(native_object);
if (d == null) { if (d == null) {
@@ -684,6 +722,7 @@ public final class Matrix_Delegate {
return (float) Math.sqrt(l1 * l2); return (float) Math.sqrt(l1 * l2);
} }
@LayoutlibDelegate
/*package*/ static void native_getValues(int native_object, float[] values) { /*package*/ static void native_getValues(int native_object, float[] values) {
Matrix_Delegate d = sManager.getDelegate(native_object); Matrix_Delegate d = sManager.getDelegate(native_object);
if (d == null) { if (d == null) {
@@ -693,6 +732,7 @@ public final class Matrix_Delegate {
System.arraycopy(d.mValues, 0, d.mValues, 0, MATRIX_SIZE); System.arraycopy(d.mValues, 0, d.mValues, 0, MATRIX_SIZE);
} }
@LayoutlibDelegate
/*package*/ static void native_setValues(int native_object, float[] values) { /*package*/ static void native_setValues(int native_object, float[] values) {
Matrix_Delegate d = sManager.getDelegate(native_object); Matrix_Delegate d = sManager.getDelegate(native_object);
if (d == null) { if (d == null) {
@@ -702,6 +742,7 @@ public final class Matrix_Delegate {
System.arraycopy(values, 0, d.mValues, 0, MATRIX_SIZE); System.arraycopy(values, 0, d.mValues, 0, MATRIX_SIZE);
} }
@LayoutlibDelegate
/*package*/ static boolean native_equals(int native_a, int native_b) { /*package*/ static boolean native_equals(int native_a, int native_b) {
Matrix_Delegate a = sManager.getDelegate(native_a); Matrix_Delegate a = sManager.getDelegate(native_a);
if (a == null) { if (a == null) {
@@ -722,8 +763,9 @@ public final class Matrix_Delegate {
return true; return true;
} }
@LayoutlibDelegate
/*package*/ static void finalizer(int native_instance) { /*package*/ static void finalizer(int native_instance) {
sManager.removeDelegate(native_instance); sManager.removeJavaReferenceFor(native_instance);
} }
// ---- Private helper methods ---- // ---- Private helper methods ----

View File

@@ -21,6 +21,7 @@ import com.android.layoutlib.bridge.Bridge;
import com.android.layoutlib.bridge.impl.DelegateManager; import com.android.layoutlib.bridge.impl.DelegateManager;
import com.android.layoutlib.bridge.impl.GcSnapshot; import com.android.layoutlib.bridge.impl.GcSnapshot;
import com.android.ninepatch.NinePatchChunk; import com.android.ninepatch.NinePatchChunk;
import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
import android.graphics.drawable.NinePatchDrawable; import android.graphics.drawable.NinePatchDrawable;
@@ -137,6 +138,7 @@ public final class NinePatch_Delegate {
// ---- native methods ---- // ---- native methods ----
@LayoutlibDelegate
/*package*/ static boolean isNinePatchChunk(byte[] chunk) { /*package*/ static boolean isNinePatchChunk(byte[] chunk) {
NinePatchChunk chunkObject = getChunk(chunk); NinePatchChunk chunkObject = getChunk(chunk);
if (chunkObject != null) { if (chunkObject != null) {
@@ -146,12 +148,14 @@ public final class NinePatch_Delegate {
return false; return false;
} }
@LayoutlibDelegate
/*package*/ static void validateNinePatchChunk(int bitmap, byte[] chunk) { /*package*/ static void validateNinePatchChunk(int bitmap, byte[] chunk) {
// the default JNI implementation only checks that the byte[] has the same // 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 // 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. // will return different size depending on content), we do nothing.
} }
@LayoutlibDelegate
/*package*/ static void nativeDraw(int canvas_instance, RectF loc, int bitmap_instance, /*package*/ static void nativeDraw(int canvas_instance, RectF loc, int bitmap_instance,
byte[] c, int paint_instance_or_null, int destDensity, int srcDensity) { byte[] c, int paint_instance_or_null, int destDensity, int srcDensity) {
draw(canvas_instance, draw(canvas_instance,
@@ -160,6 +164,7 @@ public final class NinePatch_Delegate {
destDensity, srcDensity); destDensity, srcDensity);
} }
@LayoutlibDelegate
/*package*/ static void nativeDraw(int canvas_instance, Rect loc, int bitmap_instance, /*package*/ static void nativeDraw(int canvas_instance, Rect loc, int bitmap_instance,
byte[] c, int paint_instance_or_null, int destDensity, int srcDensity) { byte[] c, int paint_instance_or_null, int destDensity, int srcDensity) {
draw(canvas_instance, draw(canvas_instance,
@@ -168,54 +173,53 @@ public final class NinePatch_Delegate {
destDensity, srcDensity); destDensity, srcDensity);
} }
private static void draw(int canvas_instance, @LayoutlibDelegate
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*/);
}
/*package*/ static int nativeGetTransparentRegion(int bitmap, byte[] chunk, Rect location) { /*package*/ static int nativeGetTransparentRegion(int bitmap, byte[] chunk, Rect location) {
return 0; return 0;
} }
// ---- Private Helper methods ---- // ---- 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*/);
}
} }

View File

@@ -17,6 +17,7 @@
package android.graphics; package android.graphics;
import com.android.layoutlib.bridge.impl.DelegateManager; import com.android.layoutlib.bridge.impl.DelegateManager;
import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
/** /**
* Delegate implementing the native methods of android.graphics.PaintFlagsDrawFilter * Delegate implementing the native methods of android.graphics.PaintFlagsDrawFilter
@@ -53,9 +54,10 @@ public class PaintFlagsDrawFilter_Delegate extends DrawFilter_Delegate {
// ---- native methods ---- // ---- native methods ----
@LayoutlibDelegate
/*package*/ static int nativeConstructor(int clearBits, int setBits) { /*package*/ static int nativeConstructor(int clearBits, int setBits) {
PaintFlagsDrawFilter_Delegate newDelegate = new PaintFlagsDrawFilter_Delegate(); PaintFlagsDrawFilter_Delegate newDelegate = new PaintFlagsDrawFilter_Delegate();
return sManager.addDelegate(newDelegate); return sManager.addNewDelegate(newDelegate);
} }
// ---- Private delegate/helper methods ---- // ---- Private delegate/helper methods ----

View File

@@ -19,6 +19,7 @@ package android.graphics;
import com.android.ide.common.rendering.api.LayoutLog; import com.android.ide.common.rendering.api.LayoutLog;
import com.android.layoutlib.bridge.Bridge; import com.android.layoutlib.bridge.Bridge;
import com.android.layoutlib.bridge.impl.DelegateManager; import com.android.layoutlib.bridge.impl.DelegateManager;
import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
import android.graphics.Paint.FontMetrics; import android.graphics.Paint.FontMetrics;
import android.graphics.Paint.FontMetricsInt; import android.graphics.Paint.FontMetricsInt;
@@ -31,6 +32,7 @@ import java.awt.Stroke;
import java.awt.Toolkit; import java.awt.Toolkit;
import java.awt.font.FontRenderContext; import java.awt.font.FontRenderContext;
import java.awt.geom.AffineTransform; import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
@@ -60,7 +62,7 @@ public class Paint_Delegate {
// ---- delegate manager ---- // ---- delegate manager ----
private static final DelegateManager<Paint_Delegate> sManager = private static final DelegateManager<Paint_Delegate> sManager =
new DelegateManager<Paint_Delegate>(); new DelegateManager<Paint_Delegate>(Paint_Delegate.class);
// ---- delegate helper data ---- // ---- delegate helper data ----
private List<FontInfo> mFonts; private List<FontInfo> mFonts;
@@ -74,19 +76,19 @@ public class Paint_Delegate {
private int mCap; private int mCap;
private int mJoin; private int mJoin;
private int mTextAlign; private int mTextAlign;
private int mTypeface; private Typeface_Delegate mTypeface;
private float mStrokeWidth; private float mStrokeWidth;
private float mStrokeMiter; private float mStrokeMiter;
private float mTextSize; private float mTextSize;
private float mTextScaleX; private float mTextScaleX;
private float mTextSkewX; private float mTextSkewX;
private int mXfermode; private Xfermode_Delegate mXfermode;
private int mColorFilter; private ColorFilter_Delegate mColorFilter;
private int mShader; private Shader_Delegate mShader;
private int mPathEffect; private PathEffect_Delegate mPathEffect;
private int mMaskFilter; private MaskFilter_Delegate mMaskFilter;
private int mRasterizer; private Rasterizer_Delegate mRasterizer;
// ---- Public Helper methods ---- // ---- Public Helper methods ----
@@ -171,17 +173,16 @@ public class Paint_Delegate {
} }
public Stroke getJavaStroke() { public Stroke getJavaStroke() {
PathEffect_Delegate effectDelegate = PathEffect_Delegate.getDelegate(mPathEffect); if (mPathEffect != null) {
if (effectDelegate != null) { if (mPathEffect.isSupported()) {
if (effectDelegate.isSupported()) { Stroke stroke = mPathEffect.getStroke(this);
Stroke stroke = effectDelegate.getStroke(this);
assert stroke != null; assert stroke != null;
if (stroke != null) { if (stroke != null) {
return stroke; return stroke;
} }
} else { } else {
Bridge.getLog().fidelityWarning(LayoutLog.TAG_PATHEFFECT, Bridge.getLog().fidelityWarning(LayoutLog.TAG_PATHEFFECT,
effectDelegate.getSupportMessage(), mPathEffect.getSupportMessage(),
null, null /*data*/); null, null /*data*/);
} }
} }
@@ -200,7 +201,7 @@ public class Paint_Delegate {
* @return the delegate or null. * @return the delegate or null.
*/ */
public Xfermode_Delegate getXfermode() { public Xfermode_Delegate getXfermode() {
return Xfermode_Delegate.getDelegate(mXfermode); return mXfermode;
} }
/** /**
@@ -209,7 +210,7 @@ public class Paint_Delegate {
* @return the delegate or null. * @return the delegate or null.
*/ */
public ColorFilter_Delegate getColorFilter() { public ColorFilter_Delegate getColorFilter() {
return ColorFilter_Delegate.getDelegate(mColorFilter); return mColorFilter;
} }
/** /**
@@ -218,7 +219,7 @@ public class Paint_Delegate {
* @return the delegate or null. * @return the delegate or null.
*/ */
public Shader_Delegate getShader() { public Shader_Delegate getShader() {
return Shader_Delegate.getDelegate(mShader); return mShader;
} }
/** /**
@@ -227,7 +228,7 @@ public class Paint_Delegate {
* @return the delegate or null. * @return the delegate or null.
*/ */
public MaskFilter_Delegate getMaskFilter() { public MaskFilter_Delegate getMaskFilter() {
return MaskFilter_Delegate.getDelegate(mMaskFilter); return mMaskFilter;
} }
/** /**
@@ -236,11 +237,12 @@ public class Paint_Delegate {
* @return the delegate or null. * @return the delegate or null.
*/ */
public Rasterizer_Delegate getRasterizer() { public Rasterizer_Delegate getRasterizer() {
return Rasterizer_Delegate.getDelegate(mRasterizer); return mRasterizer;
} }
// ---- native methods ---- // ---- native methods ----
@LayoutlibDelegate
/*package*/ static int getFlags(Paint thisPaint) { /*package*/ static int getFlags(Paint thisPaint) {
// get the delegate from the native int. // get the delegate from the native int.
Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
@@ -251,6 +253,7 @@ public class Paint_Delegate {
return delegate.mFlags; return delegate.mFlags;
} }
@LayoutlibDelegate
/*package*/ static void setFlags(Paint thisPaint, int flags) { /*package*/ static void setFlags(Paint thisPaint, int flags) {
// get the delegate from the native int. // get the delegate from the native int.
Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
@@ -261,38 +264,47 @@ public class Paint_Delegate {
delegate.mFlags = flags; delegate.mFlags = flags;
} }
@LayoutlibDelegate
/*package*/ static void setFilterBitmap(Paint thisPaint, boolean filter) { /*package*/ static void setFilterBitmap(Paint thisPaint, boolean filter) {
setFlag(thisPaint, Paint.FILTER_BITMAP_FLAG, filter); setFlag(thisPaint, Paint.FILTER_BITMAP_FLAG, filter);
} }
@LayoutlibDelegate
/*package*/ static void setAntiAlias(Paint thisPaint, boolean aa) { /*package*/ static void setAntiAlias(Paint thisPaint, boolean aa) {
setFlag(thisPaint, Paint.ANTI_ALIAS_FLAG, aa); setFlag(thisPaint, Paint.ANTI_ALIAS_FLAG, aa);
} }
@LayoutlibDelegate
/*package*/ static void setSubpixelText(Paint thisPaint, boolean subpixelText) { /*package*/ static void setSubpixelText(Paint thisPaint, boolean subpixelText) {
setFlag(thisPaint, Paint.SUBPIXEL_TEXT_FLAG, subpixelText); setFlag(thisPaint, Paint.SUBPIXEL_TEXT_FLAG, subpixelText);
} }
@LayoutlibDelegate
/*package*/ static void setUnderlineText(Paint thisPaint, boolean underlineText) { /*package*/ static void setUnderlineText(Paint thisPaint, boolean underlineText) {
setFlag(thisPaint, Paint.UNDERLINE_TEXT_FLAG, underlineText); setFlag(thisPaint, Paint.UNDERLINE_TEXT_FLAG, underlineText);
} }
@LayoutlibDelegate
/*package*/ static void setStrikeThruText(Paint thisPaint, boolean strikeThruText) { /*package*/ static void setStrikeThruText(Paint thisPaint, boolean strikeThruText) {
setFlag(thisPaint, Paint.STRIKE_THRU_TEXT_FLAG, strikeThruText); setFlag(thisPaint, Paint.STRIKE_THRU_TEXT_FLAG, strikeThruText);
} }
@LayoutlibDelegate
/*package*/ static void setFakeBoldText(Paint thisPaint, boolean fakeBoldText) { /*package*/ static void setFakeBoldText(Paint thisPaint, boolean fakeBoldText) {
setFlag(thisPaint, Paint.FAKE_BOLD_TEXT_FLAG, fakeBoldText); setFlag(thisPaint, Paint.FAKE_BOLD_TEXT_FLAG, fakeBoldText);
} }
@LayoutlibDelegate
/*package*/ static void setDither(Paint thisPaint, boolean dither) { /*package*/ static void setDither(Paint thisPaint, boolean dither) {
setFlag(thisPaint, Paint.DITHER_FLAG, dither); setFlag(thisPaint, Paint.DITHER_FLAG, dither);
} }
@LayoutlibDelegate
/*package*/ static void setLinearText(Paint thisPaint, boolean linearText) { /*package*/ static void setLinearText(Paint thisPaint, boolean linearText) {
setFlag(thisPaint, Paint.LINEAR_TEXT_FLAG, linearText); setFlag(thisPaint, Paint.LINEAR_TEXT_FLAG, linearText);
} }
@LayoutlibDelegate
/*package*/ static int getColor(Paint thisPaint) { /*package*/ static int getColor(Paint thisPaint) {
// get the delegate from the native int. // get the delegate from the native int.
Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
@@ -303,6 +315,7 @@ public class Paint_Delegate {
return delegate.mColor; return delegate.mColor;
} }
@LayoutlibDelegate
/*package*/ static void setColor(Paint thisPaint, int color) { /*package*/ static void setColor(Paint thisPaint, int color) {
// get the delegate from the native int. // get the delegate from the native int.
Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
@@ -313,6 +326,7 @@ public class Paint_Delegate {
delegate.mColor = color; delegate.mColor = color;
} }
@LayoutlibDelegate
/*package*/ static int getAlpha(Paint thisPaint) { /*package*/ static int getAlpha(Paint thisPaint) {
// get the delegate from the native int. // get the delegate from the native int.
Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
@@ -323,6 +337,7 @@ public class Paint_Delegate {
return delegate.getAlpha(); return delegate.getAlpha();
} }
@LayoutlibDelegate
/*package*/ static void setAlpha(Paint thisPaint, int a) { /*package*/ static void setAlpha(Paint thisPaint, int a) {
// get the delegate from the native int. // get the delegate from the native int.
Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
@@ -333,6 +348,7 @@ public class Paint_Delegate {
delegate.setAlpha(a); delegate.setAlpha(a);
} }
@LayoutlibDelegate
/*package*/ static float getStrokeWidth(Paint thisPaint) { /*package*/ static float getStrokeWidth(Paint thisPaint) {
// get the delegate from the native int. // get the delegate from the native int.
Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
@@ -343,6 +359,7 @@ public class Paint_Delegate {
return delegate.mStrokeWidth; return delegate.mStrokeWidth;
} }
@LayoutlibDelegate
/*package*/ static void setStrokeWidth(Paint thisPaint, float width) { /*package*/ static void setStrokeWidth(Paint thisPaint, float width) {
// get the delegate from the native int. // get the delegate from the native int.
Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
@@ -353,6 +370,7 @@ public class Paint_Delegate {
delegate.mStrokeWidth = width; delegate.mStrokeWidth = width;
} }
@LayoutlibDelegate
/*package*/ static float getStrokeMiter(Paint thisPaint) { /*package*/ static float getStrokeMiter(Paint thisPaint) {
// get the delegate from the native int. // get the delegate from the native int.
Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
@@ -363,6 +381,7 @@ public class Paint_Delegate {
return delegate.mStrokeMiter; return delegate.mStrokeMiter;
} }
@LayoutlibDelegate
/*package*/ static void setStrokeMiter(Paint thisPaint, float miter) { /*package*/ static void setStrokeMiter(Paint thisPaint, float miter) {
// get the delegate from the native int. // get the delegate from the native int.
Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
@@ -373,6 +392,7 @@ public class Paint_Delegate {
delegate.mStrokeMiter = miter; delegate.mStrokeMiter = miter;
} }
@LayoutlibDelegate
/*package*/ static void nSetShadowLayer(Paint thisPaint, float radius, float dx, float dy, /*package*/ static void nSetShadowLayer(Paint thisPaint, float radius, float dx, float dy,
int color) { int color) {
// FIXME // FIXME
@@ -380,6 +400,7 @@ public class Paint_Delegate {
"Paint.setShadowLayer is not supported.", null, null /*data*/); "Paint.setShadowLayer is not supported.", null, null /*data*/);
} }
@LayoutlibDelegate
/*package*/ static float getTextSize(Paint thisPaint) { /*package*/ static float getTextSize(Paint thisPaint) {
// get the delegate from the native int. // get the delegate from the native int.
Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
@@ -390,6 +411,7 @@ public class Paint_Delegate {
return delegate.mTextSize; return delegate.mTextSize;
} }
@LayoutlibDelegate
/*package*/ static void setTextSize(Paint thisPaint, float textSize) { /*package*/ static void setTextSize(Paint thisPaint, float textSize) {
// get the delegate from the native int. // get the delegate from the native int.
Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
@@ -401,6 +423,7 @@ public class Paint_Delegate {
delegate.updateFontObject(); delegate.updateFontObject();
} }
@LayoutlibDelegate
/*package*/ static float getTextScaleX(Paint thisPaint) { /*package*/ static float getTextScaleX(Paint thisPaint) {
// get the delegate from the native int. // get the delegate from the native int.
Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
@@ -411,6 +434,7 @@ public class Paint_Delegate {
return delegate.mTextScaleX; return delegate.mTextScaleX;
} }
@LayoutlibDelegate
/*package*/ static void setTextScaleX(Paint thisPaint, float scaleX) { /*package*/ static void setTextScaleX(Paint thisPaint, float scaleX) {
// get the delegate from the native int. // get the delegate from the native int.
Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
@@ -422,6 +446,7 @@ public class Paint_Delegate {
delegate.updateFontObject(); delegate.updateFontObject();
} }
@LayoutlibDelegate
/*package*/ static float getTextSkewX(Paint thisPaint) { /*package*/ static float getTextSkewX(Paint thisPaint) {
// get the delegate from the native int. // get the delegate from the native int.
Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
@@ -432,6 +457,7 @@ public class Paint_Delegate {
return delegate.mTextSkewX; return delegate.mTextSkewX;
} }
@LayoutlibDelegate
/*package*/ static void setTextSkewX(Paint thisPaint, float skewX) { /*package*/ static void setTextSkewX(Paint thisPaint, float skewX) {
// get the delegate from the native int. // get the delegate from the native int.
Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
@@ -443,6 +469,7 @@ public class Paint_Delegate {
delegate.updateFontObject(); delegate.updateFontObject();
} }
@LayoutlibDelegate
/*package*/ static float ascent(Paint thisPaint) { /*package*/ static float ascent(Paint thisPaint) {
// get the delegate // get the delegate
Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
@@ -459,6 +486,7 @@ public class Paint_Delegate {
return 0; return 0;
} }
@LayoutlibDelegate
/*package*/ static float descent(Paint thisPaint) { /*package*/ static float descent(Paint thisPaint) {
// get the delegate // get the delegate
Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
@@ -475,6 +503,7 @@ public class Paint_Delegate {
} }
@LayoutlibDelegate
/*package*/ static float getFontMetrics(Paint thisPaint, FontMetrics metrics) { /*package*/ static float getFontMetrics(Paint thisPaint, FontMetrics metrics) {
// get the delegate // get the delegate
Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
@@ -485,6 +514,7 @@ public class Paint_Delegate {
return delegate.getFontMetrics(metrics); return delegate.getFontMetrics(metrics);
} }
@LayoutlibDelegate
/*package*/ static int getFontMetricsInt(Paint thisPaint, FontMetricsInt fmi) { /*package*/ static int getFontMetricsInt(Paint thisPaint, FontMetricsInt fmi) {
// get the delegate // get the delegate
Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
@@ -509,11 +539,9 @@ public class Paint_Delegate {
return 0; return 0;
} }
@LayoutlibDelegate
/*package*/ static float native_measureText(Paint thisPaint, char[] text, int index, /*package*/ static float native_measureText(Paint thisPaint, char[] text, int index,
int count) { 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 // get the delegate
Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint); Paint_Delegate delegate = sManager.getDelegate(thisPaint.mNativePaint);
if (delegate == null) { if (delegate == null) {
@@ -523,32 +551,73 @@ public class Paint_Delegate {
return delegate.measureText(text, index, count); return delegate.measureText(text, index, count);
} }
@LayoutlibDelegate
/*package*/ static float native_measureText(Paint thisPaint, String text, int start, int end) { /*package*/ static float native_measureText(Paint thisPaint, String text, int start, int end) {
return native_measureText(thisPaint, text.toCharArray(), start, end - start); return native_measureText(thisPaint, text.toCharArray(), start, end - start);
} }
@LayoutlibDelegate
/*package*/ static float native_measureText(Paint thisPaint, String text) { /*package*/ static float native_measureText(Paint thisPaint, String text) {
return native_measureText(thisPaint, text.toCharArray(), 0, text.length()); return native_measureText(thisPaint, text.toCharArray(), 0, text.length());
} }
@LayoutlibDelegate
/*package*/ static int native_breakText(Paint thisPaint, char[] text, int index, int count, /*package*/ static int native_breakText(Paint thisPaint, char[] text, int index, int count,
float maxWidth, float[] measuredWidth) { 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, /*package*/ static int native_breakText(Paint thisPaint, String text, boolean measureForwards,
float maxWidth, float[] measuredWidth) { float maxWidth, float[] measuredWidth) {
// FIXME return native_breakText(thisPaint, text.toCharArray(), 0, text.length(), maxWidth,
throw new UnsupportedOperationException(); measuredWidth);
} }
@LayoutlibDelegate
/*package*/ static int native_init() { /*package*/ static int native_init() {
Paint_Delegate newDelegate = new Paint_Delegate(); Paint_Delegate newDelegate = new Paint_Delegate();
return sManager.addDelegate(newDelegate); return sManager.addNewDelegate(newDelegate);
} }
@LayoutlibDelegate
/*package*/ static int native_initWithPaint(int paint) { /*package*/ static int native_initWithPaint(int paint) {
// get the delegate from the native int. // get the delegate from the native int.
Paint_Delegate delegate = sManager.getDelegate(paint); Paint_Delegate delegate = sManager.getDelegate(paint);
@@ -557,9 +626,10 @@ public class Paint_Delegate {
} }
Paint_Delegate newDelegate = new Paint_Delegate(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) { /*package*/ static void native_reset(int native_object) {
// get the delegate from the native int. // get the delegate from the native int.
Paint_Delegate delegate = sManager.getDelegate(native_object); Paint_Delegate delegate = sManager.getDelegate(native_object);
@@ -570,6 +640,7 @@ public class Paint_Delegate {
delegate.reset(); delegate.reset();
} }
@LayoutlibDelegate
/*package*/ static void native_set(int native_dst, int native_src) { /*package*/ static void native_set(int native_dst, int native_src) {
// get the delegate from the native int. // get the delegate from the native int.
Paint_Delegate delegate_dst = sManager.getDelegate(native_dst); Paint_Delegate delegate_dst = sManager.getDelegate(native_dst);
@@ -586,6 +657,7 @@ public class Paint_Delegate {
delegate_dst.set(delegate_src); delegate_dst.set(delegate_src);
} }
@LayoutlibDelegate
/*package*/ static int native_getStyle(int native_object) { /*package*/ static int native_getStyle(int native_object) {
// get the delegate from the native int. // get the delegate from the native int.
Paint_Delegate delegate = sManager.getDelegate(native_object); Paint_Delegate delegate = sManager.getDelegate(native_object);
@@ -596,6 +668,7 @@ public class Paint_Delegate {
return delegate.mStyle; return delegate.mStyle;
} }
@LayoutlibDelegate
/*package*/ static void native_setStyle(int native_object, int style) { /*package*/ static void native_setStyle(int native_object, int style) {
// get the delegate from the native int. // get the delegate from the native int.
Paint_Delegate delegate = sManager.getDelegate(native_object); Paint_Delegate delegate = sManager.getDelegate(native_object);
@@ -606,6 +679,7 @@ public class Paint_Delegate {
delegate.mStyle = style; delegate.mStyle = style;
} }
@LayoutlibDelegate
/*package*/ static int native_getStrokeCap(int native_object) { /*package*/ static int native_getStrokeCap(int native_object) {
// get the delegate from the native int. // get the delegate from the native int.
Paint_Delegate delegate = sManager.getDelegate(native_object); Paint_Delegate delegate = sManager.getDelegate(native_object);
@@ -616,6 +690,7 @@ public class Paint_Delegate {
return delegate.mCap; return delegate.mCap;
} }
@LayoutlibDelegate
/*package*/ static void native_setStrokeCap(int native_object, int cap) { /*package*/ static void native_setStrokeCap(int native_object, int cap) {
// get the delegate from the native int. // get the delegate from the native int.
Paint_Delegate delegate = sManager.getDelegate(native_object); Paint_Delegate delegate = sManager.getDelegate(native_object);
@@ -626,6 +701,7 @@ public class Paint_Delegate {
delegate.mCap = cap; delegate.mCap = cap;
} }
@LayoutlibDelegate
/*package*/ static int native_getStrokeJoin(int native_object) { /*package*/ static int native_getStrokeJoin(int native_object) {
// get the delegate from the native int. // get the delegate from the native int.
Paint_Delegate delegate = sManager.getDelegate(native_object); Paint_Delegate delegate = sManager.getDelegate(native_object);
@@ -636,6 +712,7 @@ public class Paint_Delegate {
return delegate.mJoin; return delegate.mJoin;
} }
@LayoutlibDelegate
/*package*/ static void native_setStrokeJoin(int native_object, int join) { /*package*/ static void native_setStrokeJoin(int native_object, int join) {
// get the delegate from the native int. // get the delegate from the native int.
Paint_Delegate delegate = sManager.getDelegate(native_object); Paint_Delegate delegate = sManager.getDelegate(native_object);
@@ -646,6 +723,7 @@ public class Paint_Delegate {
delegate.mJoin = join; delegate.mJoin = join;
} }
@LayoutlibDelegate
/*package*/ static boolean native_getFillPath(int native_object, int src, int dst) { /*package*/ static boolean native_getFillPath(int native_object, int src, int dst) {
Paint_Delegate paint = sManager.getDelegate(native_object); Paint_Delegate paint = sManager.getDelegate(native_object);
if (paint == null) { if (paint == null) {
@@ -671,6 +749,7 @@ public class Paint_Delegate {
return true; return true;
} }
@LayoutlibDelegate
/*package*/ static int native_setShader(int native_object, int shader) { /*package*/ static int native_setShader(int native_object, int shader) {
// get the delegate from the native int. // get the delegate from the native int.
Paint_Delegate delegate = sManager.getDelegate(native_object); Paint_Delegate delegate = sManager.getDelegate(native_object);
@@ -678,9 +757,12 @@ public class Paint_Delegate {
return shader; 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) { /*package*/ static int native_setColorFilter(int native_object, int filter) {
// get the delegate from the native int. // get the delegate from the native int.
Paint_Delegate delegate = sManager.getDelegate(native_object); Paint_Delegate delegate = sManager.getDelegate(native_object);
@@ -688,18 +770,18 @@ public class Paint_Delegate {
return filter; return filter;
} }
delegate.mColorFilter = filter; delegate.mColorFilter = ColorFilter_Delegate.getDelegate(filter);;
// since none of those are supported, display a fidelity warning right away // since none of those are supported, display a fidelity warning right away
ColorFilter_Delegate filterDelegate = delegate.getColorFilter(); if (delegate.mColorFilter != null && delegate.mColorFilter.isSupported() == false) {
if (filterDelegate != null && filterDelegate.isSupported() == false) {
Bridge.getLog().fidelityWarning(LayoutLog.TAG_COLORFILTER, Bridge.getLog().fidelityWarning(LayoutLog.TAG_COLORFILTER,
filterDelegate.getSupportMessage(), null, null /*data*/); delegate.mColorFilter.getSupportMessage(), null, null /*data*/);
} }
return filter; return filter;
} }
@LayoutlibDelegate
/*package*/ static int native_setXfermode(int native_object, int xfermode) { /*package*/ static int native_setXfermode(int native_object, int xfermode) {
// get the delegate from the native int. // get the delegate from the native int.
Paint_Delegate delegate = sManager.getDelegate(native_object); Paint_Delegate delegate = sManager.getDelegate(native_object);
@@ -707,9 +789,12 @@ public class Paint_Delegate {
return xfermode; 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) { /*package*/ static int native_setPathEffect(int native_object, int effect) {
// get the delegate from the native int. // get the delegate from the native int.
Paint_Delegate delegate = sManager.getDelegate(native_object); Paint_Delegate delegate = sManager.getDelegate(native_object);
@@ -717,9 +802,12 @@ public class Paint_Delegate {
return effect; 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) { /*package*/ static int native_setMaskFilter(int native_object, int maskfilter) {
// get the delegate from the native int. // get the delegate from the native int.
Paint_Delegate delegate = sManager.getDelegate(native_object); Paint_Delegate delegate = sManager.getDelegate(native_object);
@@ -727,18 +815,18 @@ public class Paint_Delegate {
return maskfilter; return maskfilter;
} }
delegate.mMaskFilter = maskfilter; delegate.mMaskFilter = MaskFilter_Delegate.getDelegate(maskfilter);
// since none of those are supported, display a fidelity warning right away // since none of those are supported, display a fidelity warning right away
MaskFilter_Delegate filterDelegate = delegate.getMaskFilter(); if (delegate.mMaskFilter != null && delegate.mMaskFilter.isSupported() == false) {
if (filterDelegate != null && filterDelegate.isSupported() == false) {
Bridge.getLog().fidelityWarning(LayoutLog.TAG_MASKFILTER, Bridge.getLog().fidelityWarning(LayoutLog.TAG_MASKFILTER,
filterDelegate.getSupportMessage(), null, null /*data*/); delegate.mMaskFilter.getSupportMessage(), null, null /*data*/);
} }
return maskfilter; return maskfilter;
} }
@LayoutlibDelegate
/*package*/ static int native_setTypeface(int native_object, int typeface) { /*package*/ static int native_setTypeface(int native_object, int typeface) {
// get the delegate from the native int. // get the delegate from the native int.
Paint_Delegate delegate = sManager.getDelegate(native_object); Paint_Delegate delegate = sManager.getDelegate(native_object);
@@ -746,11 +834,12 @@ public class Paint_Delegate {
return 0; return 0;
} }
delegate.mTypeface = typeface; delegate.mTypeface = Typeface_Delegate.getDelegate(typeface);
delegate.updateFontObject(); delegate.updateFontObject();
return delegate.mTypeface; return typeface;
} }
@LayoutlibDelegate
/*package*/ static int native_setRasterizer(int native_object, int rasterizer) { /*package*/ static int native_setRasterizer(int native_object, int rasterizer) {
// get the delegate from the native int. // get the delegate from the native int.
Paint_Delegate delegate = sManager.getDelegate(native_object); Paint_Delegate delegate = sManager.getDelegate(native_object);
@@ -758,18 +847,18 @@ public class Paint_Delegate {
return rasterizer; return rasterizer;
} }
delegate.mRasterizer = rasterizer; delegate.mRasterizer = Rasterizer_Delegate.getDelegate(rasterizer);
// since none of those are supported, display a fidelity warning right away // since none of those are supported, display a fidelity warning right away
Rasterizer_Delegate rasterizerDelegate = delegate.getRasterizer(); if (delegate.mRasterizer != null && delegate.mRasterizer.isSupported() == false) {
if (rasterizerDelegate != null && rasterizerDelegate.isSupported() == false) {
Bridge.getLog().fidelityWarning(LayoutLog.TAG_RASTERIZER, Bridge.getLog().fidelityWarning(LayoutLog.TAG_RASTERIZER,
rasterizerDelegate.getSupportMessage(), null, null /*data*/); delegate.mRasterizer.getSupportMessage(), null, null /*data*/);
} }
return rasterizer; return rasterizer;
} }
@LayoutlibDelegate
/*package*/ static int native_getTextAlign(int native_object) { /*package*/ static int native_getTextAlign(int native_object) {
// get the delegate from the native int. // get the delegate from the native int.
Paint_Delegate delegate = sManager.getDelegate(native_object); Paint_Delegate delegate = sManager.getDelegate(native_object);
@@ -780,6 +869,7 @@ public class Paint_Delegate {
return delegate.mTextAlign; return delegate.mTextAlign;
} }
@LayoutlibDelegate
/*package*/ static void native_setTextAlign(int native_object, int align) { /*package*/ static void native_setTextAlign(int native_object, int align) {
// get the delegate from the native int. // get the delegate from the native int.
Paint_Delegate delegate = sManager.getDelegate(native_object); Paint_Delegate delegate = sManager.getDelegate(native_object);
@@ -790,6 +880,7 @@ public class Paint_Delegate {
delegate.mTextAlign = align; delegate.mTextAlign = align;
} }
@LayoutlibDelegate
/*package*/ static float native_getFontMetrics(int native_paint, FontMetrics metrics) { /*package*/ static float native_getFontMetrics(int native_paint, FontMetrics metrics) {
// get the delegate from the native int. // get the delegate from the native int.
Paint_Delegate delegate = sManager.getDelegate(native_paint); Paint_Delegate delegate = sManager.getDelegate(native_paint);
@@ -800,18 +891,55 @@ public class Paint_Delegate {
return delegate.getFontMetrics(metrics); return delegate.getFontMetrics(metrics);
} }
@LayoutlibDelegate
/*package*/ static int native_getTextWidths(int native_object, char[] text, int index, /*package*/ static int native_getTextWidths(int native_object, char[] text, int index,
int count, float[] widths) { int count, float[] widths) {
// FIXME // get the delegate from the native int.
throw new UnsupportedOperationException(); 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, /*package*/ static int native_getTextWidths(int native_object, String text, int start,
int end, float[] widths) { int end, float[] widths) {
// FIXME return native_getTextWidths(native_object, text.toCharArray(), start, end - start, widths);
throw new UnsupportedOperationException();
} }
@LayoutlibDelegate
/*package*/ static float native_getTextRunAdvances(int native_object, /*package*/ static float native_getTextRunAdvances(int native_object,
char[] text, int index, int count, int contextIndex, int contextCount, char[] text, int index, int count, int contextIndex, int contextCount,
int flags, float[] advances, int advancesIndex) { int flags, float[] advances, int advancesIndex) {
@@ -855,6 +983,7 @@ public class Paint_Delegate {
} }
@LayoutlibDelegate
/*package*/ static float native_getTextRunAdvances(int native_object, /*package*/ static float native_getTextRunAdvances(int native_object,
String text, int start, int end, int contextStart, int contextEnd, String text, int start, int end, int contextStart, int contextEnd,
int flags, float[] advances, int advancesIndex) { int flags, float[] advances, int advancesIndex) {
@@ -867,44 +996,70 @@ public class Paint_Delegate {
contextEnd - contextStart, flags, advances, advancesIndex); contextEnd - contextStart, flags, advances, advancesIndex);
} }
@LayoutlibDelegate
/*package*/ static int native_getTextRunCursor(Paint thisPaint, int native_object, char[] text, /*package*/ static int native_getTextRunCursor(Paint thisPaint, int native_object, char[] text,
int contextStart, int contextLength, int flags, int offset, int cursorOpt) { int contextStart, int contextLength, int flags, int offset, int cursorOpt) {
// FIXME // 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, /*package*/ static int native_getTextRunCursor(Paint thisPaint, int native_object, String text,
int contextStart, int contextEnd, int flags, int offset, int cursorOpt) { int contextStart, int contextEnd, int flags, int offset, int cursorOpt) {
// FIXME // 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, /*package*/ static void native_getTextPath(int native_object, int bidiFlags,
char[] text, int index, int count, float x, float y, int path) { char[] text, int index, int count, float x, float y, int path) {
// FIXME // 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, /*package*/ static void native_getTextPath(int native_object, int bidiFlags,
String text, int start, int end, float x, float y, int path) { String text, int start, int end, float x, float y, int path) {
// FIXME // 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, /*package*/ static void nativeGetStringBounds(int nativePaint, String text, int start,
int end, Rect bounds) { int end, Rect bounds) {
// FIXME nativeGetCharArrayBounds(nativePaint, text.toCharArray(), start, end - start, bounds);
throw new UnsupportedOperationException();
} }
@LayoutlibDelegate
/*package*/ static void nativeGetCharArrayBounds(int nativePaint, char[] text, int index, /*package*/ static void nativeGetCharArrayBounds(int nativePaint, char[] text, int index,
int count, Rect bounds) { 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) { /*package*/ static void finalizer(int nativePaint) {
sManager.removeDelegate(nativePaint); sManager.removeJavaReferenceFor(nativePaint);
} }
// ---- Private delegate/helper methods ---- // ---- Private delegate/helper methods ----
@@ -946,18 +1101,18 @@ public class Paint_Delegate {
mCap = Paint.Cap.BUTT.nativeInt; mCap = Paint.Cap.BUTT.nativeInt;
mJoin = Paint.Join.MITER.nativeInt; mJoin = Paint.Join.MITER.nativeInt;
mTextAlign = 0; mTextAlign = 0;
mTypeface = Typeface.sDefaults[0].native_instance; mTypeface = Typeface_Delegate.getDelegate(Typeface.sDefaults[0].native_instance);
mStrokeWidth = 1.f; mStrokeWidth = 1.f;
mStrokeMiter = 4.f; mStrokeMiter = 4.f;
mTextSize = 20.f; mTextSize = 20.f;
mTextScaleX = 1.f; mTextScaleX = 1.f;
mTextSkewX = 0.f; mTextSkewX = 0.f;
mXfermode = 0; mXfermode = null;
mColorFilter = 0; mColorFilter = null;
mShader = 0; mShader = null;
mPathEffect = 0; mPathEffect = null;
mMaskFilter = 0; mMaskFilter = null;
mRasterizer = 0; mRasterizer = null;
updateFontObject(); updateFontObject();
} }
@@ -966,9 +1121,9 @@ public class Paint_Delegate {
*/ */
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
private void updateFontObject() { private void updateFontObject() {
if (mTypeface != 0) { if (mTypeface != null) {
// Get the fonts from the TypeFace object. // Get the fonts from the TypeFace object.
List<Font> fonts = Typeface_Delegate.getFonts(mTypeface); List<Font> fonts = mTypeface.getFonts();
// create new font objects as well as FontMetrics, based on the current text size // create new font objects as well as FontMetrics, based on the current text size
// and skew info. // and skew info.
@@ -991,6 +1146,10 @@ public class Paint_Delegate {
} }
/*package*/ float measureText(char[] text, int index, int count) { /*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) { if (mFonts.size() > 0) {
FontInfo mainFont = mFonts.get(0); FontInfo mainFont = mFonts.get(0);
int i = index; int i = index;
@@ -1038,6 +1197,8 @@ public class Paint_Delegate {
i += size; i += size;
} }
} }
return total;
} }
return 0; return 0;

View File

@@ -17,6 +17,7 @@
package android.graphics; package android.graphics;
import com.android.layoutlib.bridge.impl.DelegateManager; import com.android.layoutlib.bridge.impl.DelegateManager;
import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
import java.awt.Stroke; import java.awt.Stroke;
@@ -60,10 +61,11 @@ public class PathDashPathEffect_Delegate extends PathEffect_Delegate {
// ---- native methods ---- // ---- native methods ----
@LayoutlibDelegate
/*package*/ static int nativeCreate(int native_path, float advance, float phase, /*package*/ static int nativeCreate(int native_path, float advance, float phase,
int native_style) { int native_style) {
PathDashPathEffect_Delegate newDelegate = new PathDashPathEffect_Delegate(); PathDashPathEffect_Delegate newDelegate = new PathDashPathEffect_Delegate();
return sManager.addDelegate(newDelegate); return sManager.addNewDelegate(newDelegate);
} }
// ---- Private delegate/helper methods ---- // ---- Private delegate/helper methods ----

View File

@@ -17,6 +17,7 @@
package android.graphics; package android.graphics;
import com.android.layoutlib.bridge.impl.DelegateManager; import com.android.layoutlib.bridge.impl.DelegateManager;
import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
import java.awt.Stroke; import java.awt.Stroke;
@@ -39,7 +40,7 @@ public abstract class PathEffect_Delegate {
// ---- delegate manager ---- // ---- delegate manager ----
protected static final DelegateManager<PathEffect_Delegate> sManager = protected static final DelegateManager<PathEffect_Delegate> sManager =
new DelegateManager<PathEffect_Delegate>(); new DelegateManager<PathEffect_Delegate>(PathEffect_Delegate.class);
// ---- delegate helper data ---- // ---- delegate helper data ----
@@ -58,8 +59,9 @@ public abstract class PathEffect_Delegate {
// ---- native methods ---- // ---- native methods ----
@LayoutlibDelegate
/*package*/ static void nativeDestructor(int native_patheffect) { /*package*/ static void nativeDestructor(int native_patheffect) {
sManager.removeDelegate(native_patheffect); sManager.removeJavaReferenceFor(native_patheffect);
} }
// ---- Private delegate/helper methods ---- // ---- Private delegate/helper methods ----

View File

@@ -19,6 +19,7 @@ package android.graphics;
import com.android.ide.common.rendering.api.LayoutLog; import com.android.ide.common.rendering.api.LayoutLog;
import com.android.layoutlib.bridge.Bridge; import com.android.layoutlib.bridge.Bridge;
import com.android.layoutlib.bridge.impl.DelegateManager; import com.android.layoutlib.bridge.impl.DelegateManager;
import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
import android.graphics.Path.Direction; import android.graphics.Path.Direction;
import android.graphics.Path.FillType; import android.graphics.Path.FillType;
@@ -49,7 +50,7 @@ public final class Path_Delegate {
// ---- delegate manager ---- // ---- delegate manager ----
private static final DelegateManager<Path_Delegate> sManager = private static final DelegateManager<Path_Delegate> sManager =
new DelegateManager<Path_Delegate>(); new DelegateManager<Path_Delegate>(Path_Delegate.class);
// ---- delegate data ---- // ---- delegate data ----
private FillType mFillType = FillType.WINDING; private FillType mFillType = FillType.WINDING;
@@ -84,13 +85,15 @@ public final class Path_Delegate {
// ---- native methods ---- // ---- native methods ----
@LayoutlibDelegate
/*package*/ static int init1() { /*package*/ static int init1() {
// create the delegate // create the delegate
Path_Delegate newDelegate = new Path_Delegate(); Path_Delegate newDelegate = new Path_Delegate();
return sManager.addDelegate(newDelegate); return sManager.addNewDelegate(newDelegate);
} }
@LayoutlibDelegate
/*package*/ static int init2(int nPath) { /*package*/ static int init2(int nPath) {
// create the delegate // create the delegate
Path_Delegate newDelegate = new Path_Delegate(); Path_Delegate newDelegate = new Path_Delegate();
@@ -101,9 +104,10 @@ public final class Path_Delegate {
newDelegate.set(pathDelegate); newDelegate.set(pathDelegate);
} }
return sManager.addDelegate(newDelegate); return sManager.addNewDelegate(newDelegate);
} }
@LayoutlibDelegate
/*package*/ static void native_reset(int nPath) { /*package*/ static void native_reset(int nPath) {
Path_Delegate pathDelegate = sManager.getDelegate(nPath); Path_Delegate pathDelegate = sManager.getDelegate(nPath);
if (pathDelegate == null) { if (pathDelegate == null) {
@@ -113,12 +117,14 @@ public final class Path_Delegate {
pathDelegate.mPath.reset(); pathDelegate.mPath.reset();
} }
@LayoutlibDelegate
/*package*/ static void native_rewind(int nPath) { /*package*/ static void native_rewind(int nPath) {
// call out to reset since there's nothing to optimize in // call out to reset since there's nothing to optimize in
// terms of data structs. // terms of data structs.
native_reset(nPath); native_reset(nPath);
} }
@LayoutlibDelegate
/*package*/ static void native_set(int native_dst, int native_src) { /*package*/ static void native_set(int native_dst, int native_src) {
Path_Delegate pathDstDelegate = sManager.getDelegate(native_dst); Path_Delegate pathDstDelegate = sManager.getDelegate(native_dst);
if (pathDstDelegate == null) { if (pathDstDelegate == null) {
@@ -133,6 +139,7 @@ public final class Path_Delegate {
pathDstDelegate.set(pathSrcDelegate); pathDstDelegate.set(pathSrcDelegate);
} }
@LayoutlibDelegate
/*package*/ static int native_getFillType(int nPath) { /*package*/ static int native_getFillType(int nPath) {
Path_Delegate pathDelegate = sManager.getDelegate(nPath); Path_Delegate pathDelegate = sManager.getDelegate(nPath);
if (pathDelegate == null) { if (pathDelegate == null) {
@@ -142,6 +149,7 @@ public final class Path_Delegate {
return pathDelegate.mFillType.nativeInt; return pathDelegate.mFillType.nativeInt;
} }
@LayoutlibDelegate
/*package*/ static void native_setFillType(int nPath, int ft) { /*package*/ static void native_setFillType(int nPath, int ft) {
Path_Delegate pathDelegate = sManager.getDelegate(nPath); Path_Delegate pathDelegate = sManager.getDelegate(nPath);
if (pathDelegate == null) { if (pathDelegate == null) {
@@ -151,6 +159,7 @@ public final class Path_Delegate {
pathDelegate.mFillType = Path.sFillTypeArray[ft]; pathDelegate.mFillType = Path.sFillTypeArray[ft];
} }
@LayoutlibDelegate
/*package*/ static boolean native_isEmpty(int nPath) { /*package*/ static boolean native_isEmpty(int nPath) {
Path_Delegate pathDelegate = sManager.getDelegate(nPath); Path_Delegate pathDelegate = sManager.getDelegate(nPath);
if (pathDelegate == null) { if (pathDelegate == null) {
@@ -160,6 +169,7 @@ public final class Path_Delegate {
return pathDelegate.isEmpty(); return pathDelegate.isEmpty();
} }
@LayoutlibDelegate
/*package*/ static boolean native_isRect(int nPath, RectF rect) { /*package*/ static boolean native_isRect(int nPath, RectF rect) {
Path_Delegate pathDelegate = sManager.getDelegate(nPath); Path_Delegate pathDelegate = sManager.getDelegate(nPath);
if (pathDelegate == null) { if (pathDelegate == null) {
@@ -179,6 +189,7 @@ public final class Path_Delegate {
return false; return false;
} }
@LayoutlibDelegate
/*package*/ static void native_computeBounds(int nPath, RectF bounds) { /*package*/ static void native_computeBounds(int nPath, RectF bounds) {
Path_Delegate pathDelegate = sManager.getDelegate(nPath); Path_Delegate pathDelegate = sManager.getDelegate(nPath);
if (pathDelegate == null) { if (pathDelegate == null) {
@@ -188,11 +199,13 @@ public final class Path_Delegate {
pathDelegate.fillBounds(bounds); pathDelegate.fillBounds(bounds);
} }
@LayoutlibDelegate
/*package*/ static void native_incReserve(int nPath, int extraPtCount) { /*package*/ static void native_incReserve(int nPath, int extraPtCount) {
// since we use a java2D path, there's no way to pre-allocate new points, // since we use a java2D path, there's no way to pre-allocate new points,
// so we do nothing. // so we do nothing.
} }
@LayoutlibDelegate
/*package*/ static void native_moveTo(int nPath, float x, float y) { /*package*/ static void native_moveTo(int nPath, float x, float y) {
Path_Delegate pathDelegate = sManager.getDelegate(nPath); Path_Delegate pathDelegate = sManager.getDelegate(nPath);
if (pathDelegate == null) { if (pathDelegate == null) {
@@ -202,6 +215,7 @@ public final class Path_Delegate {
pathDelegate.moveTo(x, y); pathDelegate.moveTo(x, y);
} }
@LayoutlibDelegate
/*package*/ static void native_rMoveTo(int nPath, float dx, float dy) { /*package*/ static void native_rMoveTo(int nPath, float dx, float dy) {
Path_Delegate pathDelegate = sManager.getDelegate(nPath); Path_Delegate pathDelegate = sManager.getDelegate(nPath);
if (pathDelegate == null) { if (pathDelegate == null) {
@@ -211,6 +225,7 @@ public final class Path_Delegate {
pathDelegate.rMoveTo(dx, dy); pathDelegate.rMoveTo(dx, dy);
} }
@LayoutlibDelegate
/*package*/ static void native_lineTo(int nPath, float x, float y) { /*package*/ static void native_lineTo(int nPath, float x, float y) {
Path_Delegate pathDelegate = sManager.getDelegate(nPath); Path_Delegate pathDelegate = sManager.getDelegate(nPath);
if (pathDelegate == null) { if (pathDelegate == null) {
@@ -220,6 +235,7 @@ public final class Path_Delegate {
pathDelegate.lineTo(x, y); pathDelegate.lineTo(x, y);
} }
@LayoutlibDelegate
/*package*/ static void native_rLineTo(int nPath, float dx, float dy) { /*package*/ static void native_rLineTo(int nPath, float dx, float dy) {
Path_Delegate pathDelegate = sManager.getDelegate(nPath); Path_Delegate pathDelegate = sManager.getDelegate(nPath);
if (pathDelegate == null) { if (pathDelegate == null) {
@@ -229,6 +245,7 @@ public final class Path_Delegate {
pathDelegate.rLineTo(dx, dy); pathDelegate.rLineTo(dx, dy);
} }
@LayoutlibDelegate
/*package*/ static void native_quadTo(int nPath, float x1, float y1, float x2, float y2) { /*package*/ static void native_quadTo(int nPath, float x1, float y1, float x2, float y2) {
Path_Delegate pathDelegate = sManager.getDelegate(nPath); Path_Delegate pathDelegate = sManager.getDelegate(nPath);
if (pathDelegate == null) { if (pathDelegate == null) {
@@ -238,6 +255,7 @@ public final class Path_Delegate {
pathDelegate.quadTo(x1, y1, x2, y2); pathDelegate.quadTo(x1, y1, x2, y2);
} }
@LayoutlibDelegate
/*package*/ static void native_rQuadTo(int nPath, float dx1, float dy1, float dx2, float dy2) { /*package*/ static void native_rQuadTo(int nPath, float dx1, float dy1, float dx2, float dy2) {
Path_Delegate pathDelegate = sManager.getDelegate(nPath); Path_Delegate pathDelegate = sManager.getDelegate(nPath);
if (pathDelegate == null) { if (pathDelegate == null) {
@@ -247,6 +265,7 @@ public final class Path_Delegate {
pathDelegate.rQuadTo(dx1, dy1, dx2, dy2); pathDelegate.rQuadTo(dx1, dy1, dx2, dy2);
} }
@LayoutlibDelegate
/*package*/ static void native_cubicTo(int nPath, float x1, float y1, /*package*/ static void native_cubicTo(int nPath, float x1, float y1,
float x2, float y2, float x3, float y3) { float x2, float y2, float x3, float y3) {
Path_Delegate pathDelegate = sManager.getDelegate(nPath); Path_Delegate pathDelegate = sManager.getDelegate(nPath);
@@ -257,6 +276,7 @@ public final class Path_Delegate {
pathDelegate.cubicTo(x1, y1, x2, y2, x3, y3); pathDelegate.cubicTo(x1, y1, x2, y2, x3, y3);
} }
@LayoutlibDelegate
/*package*/ static void native_rCubicTo(int nPath, float x1, float y1, /*package*/ static void native_rCubicTo(int nPath, float x1, float y1,
float x2, float y2, float x3, float y3) { float x2, float y2, float x3, float y3) {
Path_Delegate pathDelegate = sManager.getDelegate(nPath); Path_Delegate pathDelegate = sManager.getDelegate(nPath);
@@ -267,6 +287,7 @@ public final class Path_Delegate {
pathDelegate.rCubicTo(x1, y1, x2, y2, x3, y3); pathDelegate.rCubicTo(x1, y1, x2, y2, x3, y3);
} }
@LayoutlibDelegate
/*package*/ static void native_arcTo(int nPath, RectF oval, /*package*/ static void native_arcTo(int nPath, RectF oval,
float startAngle, float sweepAngle, boolean forceMoveTo) { float startAngle, float sweepAngle, boolean forceMoveTo) {
Path_Delegate pathDelegate = sManager.getDelegate(nPath); Path_Delegate pathDelegate = sManager.getDelegate(nPath);
@@ -277,6 +298,7 @@ public final class Path_Delegate {
pathDelegate.arcTo(oval, startAngle, sweepAngle, forceMoveTo); pathDelegate.arcTo(oval, startAngle, sweepAngle, forceMoveTo);
} }
@LayoutlibDelegate
/*package*/ static void native_close(int nPath) { /*package*/ static void native_close(int nPath) {
Path_Delegate pathDelegate = sManager.getDelegate(nPath); Path_Delegate pathDelegate = sManager.getDelegate(nPath);
if (pathDelegate == null) { if (pathDelegate == null) {
@@ -286,6 +308,7 @@ public final class Path_Delegate {
pathDelegate.close(); pathDelegate.close();
} }
@LayoutlibDelegate
/*package*/ static void native_addRect(int nPath, RectF rect, int dir) { /*package*/ static void native_addRect(int nPath, RectF rect, int dir) {
Path_Delegate pathDelegate = sManager.getDelegate(nPath); Path_Delegate pathDelegate = sManager.getDelegate(nPath);
if (pathDelegate == null) { if (pathDelegate == null) {
@@ -295,6 +318,7 @@ public final class Path_Delegate {
pathDelegate.addRect(rect.left, rect.top, rect.right, rect.bottom, dir); pathDelegate.addRect(rect.left, rect.top, rect.right, rect.bottom, dir);
} }
@LayoutlibDelegate
/*package*/ static void native_addRect(int nPath, /*package*/ static void native_addRect(int nPath,
float left, float top, float right, float bottom, int dir) { float left, float top, float right, float bottom, int dir) {
Path_Delegate pathDelegate = sManager.getDelegate(nPath); Path_Delegate pathDelegate = sManager.getDelegate(nPath);
@@ -305,47 +329,63 @@ public final class Path_Delegate {
pathDelegate.addRect(left, top, right, bottom, dir); pathDelegate.addRect(left, top, right, bottom, dir);
} }
@LayoutlibDelegate
/*package*/ static void native_addOval(int nPath, RectF oval, int dir) { /*package*/ static void native_addOval(int nPath, RectF oval, int dir) {
// FIXME // 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) { /*package*/ static void native_addCircle(int nPath, float x, float y, float radius, int dir) {
// FIXME // 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, /*package*/ static void native_addArc(int nPath, RectF oval,
float startAngle, float sweepAngle) { float startAngle, float sweepAngle) {
// FIXME // 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, /*package*/ static void native_addRoundRect(int nPath, RectF rect,
float rx, float ry, int dir) { float rx, float ry, int dir) {
// FIXME // 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) { /*package*/ static void native_addRoundRect(int nPath, RectF r, float[] radii, int dir) {
// FIXME // 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) { /*package*/ static void native_addPath(int nPath, int src, float dx, float dy) {
// FIXME // 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) { /*package*/ static void native_addPath(int nPath, int src) {
native_addPath(nPath, src, 0, 0); native_addPath(nPath, src, 0, 0);
} }
@LayoutlibDelegate
/*package*/ static void native_addPath(int nPath, int src, int matrix) { /*package*/ static void native_addPath(int nPath, int src, int matrix) {
// FIXME // 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) { /*package*/ static void native_offset(int nPath, float dx, float dy, int dst_path) {
Path_Delegate pathDelegate = sManager.getDelegate(nPath); Path_Delegate pathDelegate = sManager.getDelegate(nPath);
if (pathDelegate == null) { if (pathDelegate == null) {
@@ -358,10 +398,12 @@ public final class Path_Delegate {
pathDelegate.offset(dx, dy, dstDelegate); pathDelegate.offset(dx, dy, dstDelegate);
} }
@LayoutlibDelegate
/*package*/ static void native_offset(int nPath, float dx, float dy) { /*package*/ static void native_offset(int nPath, float dx, float dy) {
native_offset(nPath, dx, dy, 0); native_offset(nPath, dx, dy, 0);
} }
@LayoutlibDelegate
/*package*/ static void native_setLastPoint(int nPath, float dx, float dy) { /*package*/ static void native_setLastPoint(int nPath, float dx, float dy) {
Path_Delegate pathDelegate = sManager.getDelegate(nPath); Path_Delegate pathDelegate = sManager.getDelegate(nPath);
if (pathDelegate == null) { if (pathDelegate == null) {
@@ -372,6 +414,7 @@ public final class Path_Delegate {
pathDelegate.mLastY = dy; pathDelegate.mLastY = dy;
} }
@LayoutlibDelegate
/*package*/ static void native_transform(int nPath, int matrix, /*package*/ static void native_transform(int nPath, int matrix,
int dst_path) { int dst_path) {
Path_Delegate pathDelegate = sManager.getDelegate(nPath); Path_Delegate pathDelegate = sManager.getDelegate(nPath);
@@ -390,12 +433,14 @@ public final class Path_Delegate {
pathDelegate.transform(matrixDelegate, dstDelegate); pathDelegate.transform(matrixDelegate, dstDelegate);
} }
@LayoutlibDelegate
/*package*/ static void native_transform(int nPath, int matrix) { /*package*/ static void native_transform(int nPath, int matrix) {
native_transform(nPath, matrix, 0); native_transform(nPath, matrix, 0);
} }
@LayoutlibDelegate
/*package*/ static void finalizer(int nPath) { /*package*/ static void finalizer(int nPath) {
sManager.removeDelegate(nPath); sManager.removeJavaReferenceFor(nPath);
} }

View File

@@ -17,6 +17,7 @@
package android.graphics; package android.graphics;
import com.android.layoutlib.bridge.impl.DelegateManager; import com.android.layoutlib.bridge.impl.DelegateManager;
import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
import java.awt.Composite; import java.awt.Composite;
@@ -59,9 +60,10 @@ public class PixelXorXfermode_Delegate extends Xfermode_Delegate {
// ---- native methods ---- // ---- native methods ----
@LayoutlibDelegate
/*package*/ static int nativeCreate(int opColor) { /*package*/ static int nativeCreate(int opColor) {
PixelXorXfermode_Delegate newDelegate = new PixelXorXfermode_Delegate(); PixelXorXfermode_Delegate newDelegate = new PixelXorXfermode_Delegate();
return sManager.addDelegate(newDelegate); return sManager.addNewDelegate(newDelegate);
} }
// ---- Private delegate/helper methods ---- // ---- Private delegate/helper methods ----

View File

@@ -17,6 +17,7 @@
package android.graphics; package android.graphics;
import com.android.layoutlib.bridge.impl.DelegateManager; import com.android.layoutlib.bridge.impl.DelegateManager;
import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
/** /**
* Delegate implementing the native methods of android.graphics.PorterDuffColorFilter * Delegate implementing the native methods of android.graphics.PorterDuffColorFilter
@@ -53,11 +54,13 @@ public class PorterDuffColorFilter_Delegate extends ColorFilter_Delegate {
// ---- native methods ---- // ---- native methods ----
@LayoutlibDelegate
/*package*/ static int native_CreatePorterDuffFilter(int srcColor, int porterDuffMode) { /*package*/ static int native_CreatePorterDuffFilter(int srcColor, int porterDuffMode) {
PorterDuffColorFilter_Delegate newDelegate = new PorterDuffColorFilter_Delegate(); PorterDuffColorFilter_Delegate newDelegate = new PorterDuffColorFilter_Delegate();
return sManager.addDelegate(newDelegate); return sManager.addNewDelegate(newDelegate);
} }
@LayoutlibDelegate
/*package*/ static int nCreatePorterDuffFilter(int nativeFilter, int srcColor, /*package*/ static int nCreatePorterDuffFilter(int nativeFilter, int srcColor,
int porterDuffMode) { int porterDuffMode) {
// pass // pass

View File

@@ -19,6 +19,7 @@ package android.graphics;
import com.android.ide.common.rendering.api.LayoutLog; import com.android.ide.common.rendering.api.LayoutLog;
import com.android.layoutlib.bridge.Bridge; import com.android.layoutlib.bridge.Bridge;
import com.android.layoutlib.bridge.impl.DelegateManager; import com.android.layoutlib.bridge.impl.DelegateManager;
import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
import java.awt.AlphaComposite; import java.awt.AlphaComposite;
import java.awt.Composite; import java.awt.Composite;
@@ -125,9 +126,10 @@ public class PorterDuffXfermode_Delegate extends Xfermode_Delegate {
// ---- native methods ---- // ---- native methods ----
@LayoutlibDelegate
/*package*/ static int nativeCreateXfermode(int mode) { /*package*/ static int nativeCreateXfermode(int mode) {
PorterDuffXfermode_Delegate newDelegate = new PorterDuffXfermode_Delegate(mode); PorterDuffXfermode_Delegate newDelegate = new PorterDuffXfermode_Delegate(mode);
return sManager.addDelegate(newDelegate); return sManager.addNewDelegate(newDelegate);
} }
// ---- Private delegate/helper methods ---- // ---- Private delegate/helper methods ----

View File

@@ -19,6 +19,7 @@ package android.graphics;
import com.android.ide.common.rendering.api.LayoutLog; import com.android.ide.common.rendering.api.LayoutLog;
import com.android.layoutlib.bridge.Bridge; import com.android.layoutlib.bridge.Bridge;
import com.android.layoutlib.bridge.impl.DelegateManager; import com.android.layoutlib.bridge.impl.DelegateManager;
import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
import android.graphics.Shader.TileMode; import android.graphics.Shader.TileMode;
@@ -52,25 +53,29 @@ public class RadialGradient_Delegate extends Gradient_Delegate {
// ---- native methods ---- // ---- native methods ----
@LayoutlibDelegate
/*package*/ static int nativeCreate1(float x, float y, float radius, /*package*/ static int nativeCreate1(float x, float y, float radius,
int colors[], float positions[], int tileMode) { int colors[], float positions[], int tileMode) {
RadialGradient_Delegate newDelegate = new RadialGradient_Delegate(x, y, radius, RadialGradient_Delegate newDelegate = new RadialGradient_Delegate(x, y, radius,
colors, positions, Shader_Delegate.getTileMode(tileMode)); 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, /*package*/ static int nativeCreate2(float x, float y, float radius,
int color0, int color1, int tileMode) { int color0, int color1, int tileMode) {
return nativeCreate1(x, y, radius, new int[] { color0, color1 }, null /*positions*/, return nativeCreate1(x, y, radius, new int[] { color0, color1 }, null /*positions*/,
tileMode); tileMode);
} }
@LayoutlibDelegate
/*package*/ static int nativePostCreate1(int native_shader, float x, float y, float radius, /*package*/ static int nativePostCreate1(int native_shader, float x, float y, float radius,
int colors[], float positions[], int tileMode) { int colors[], float positions[], int tileMode) {
// nothing to be done here. // nothing to be done here.
return 0; return 0;
} }
@LayoutlibDelegate
/*package*/ static int nativePostCreate2(int native_shader, float x, float y, float radius, /*package*/ static int nativePostCreate2(int native_shader, float x, float y, float radius,
int color0, int color1, int tileMode) { int color0, int color1, int tileMode) {
// nothing to be done here. // nothing to be done here.

View File

@@ -17,6 +17,7 @@
package android.graphics; package android.graphics;
import com.android.layoutlib.bridge.impl.DelegateManager; import com.android.layoutlib.bridge.impl.DelegateManager;
import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
/** /**
* Delegate implementing the native methods of android.graphics.Rasterizer * Delegate implementing the native methods of android.graphics.Rasterizer
@@ -37,7 +38,7 @@ public abstract class Rasterizer_Delegate {
// ---- delegate manager ---- // ---- delegate manager ----
protected static final DelegateManager<Rasterizer_Delegate> sManager = protected static final DelegateManager<Rasterizer_Delegate> sManager =
new DelegateManager<Rasterizer_Delegate>(); new DelegateManager<Rasterizer_Delegate>(Rasterizer_Delegate.class);
// ---- delegate helper data ---- // ---- delegate helper data ----
@@ -54,8 +55,9 @@ public abstract class Rasterizer_Delegate {
// ---- native methods ---- // ---- native methods ----
@LayoutlibDelegate
/*package*/ static void finalizer(int native_instance) { /*package*/ static void finalizer(int native_instance) {
sManager.removeDelegate(native_instance); sManager.removeJavaReferenceFor(native_instance);
} }
// ---- Private delegate/helper methods ---- // ---- Private delegate/helper methods ----

View File

@@ -19,6 +19,7 @@ package android.graphics;
import com.android.ide.common.rendering.api.LayoutLog; import com.android.ide.common.rendering.api.LayoutLog;
import com.android.layoutlib.bridge.Bridge; import com.android.layoutlib.bridge.Bridge;
import com.android.layoutlib.bridge.impl.DelegateManager; import com.android.layoutlib.bridge.impl.DelegateManager;
import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
import android.os.Parcel; import android.os.Parcel;
@@ -47,7 +48,7 @@ public class Region_Delegate {
// ---- delegate manager ---- // ---- delegate manager ----
protected static final DelegateManager<Region_Delegate> sManager = protected static final DelegateManager<Region_Delegate> sManager =
new DelegateManager<Region_Delegate>(); new DelegateManager<Region_Delegate>(Region_Delegate.class);
// ---- delegate helper data ---- // ---- delegate helper data ----
@@ -136,6 +137,7 @@ public class Region_Delegate {
// ---- native methods ---- // ---- native methods ----
@LayoutlibDelegate
/*package*/ static boolean isEmpty(Region thisRegion) { /*package*/ static boolean isEmpty(Region thisRegion) {
Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion); Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion);
if (regionDelegate == null) { if (regionDelegate == null) {
@@ -145,6 +147,7 @@ public class Region_Delegate {
return regionDelegate.mArea.isEmpty(); return regionDelegate.mArea.isEmpty();
} }
@LayoutlibDelegate
/*package*/ static boolean isRect(Region thisRegion) { /*package*/ static boolean isRect(Region thisRegion) {
Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion); Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion);
if (regionDelegate == null) { if (regionDelegate == null) {
@@ -154,6 +157,7 @@ public class Region_Delegate {
return regionDelegate.mArea.isRectangular(); return regionDelegate.mArea.isRectangular();
} }
@LayoutlibDelegate
/*package*/ static boolean isComplex(Region thisRegion) { /*package*/ static boolean isComplex(Region thisRegion) {
Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion); Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion);
if (regionDelegate == null) { if (regionDelegate == null) {
@@ -163,6 +167,7 @@ public class Region_Delegate {
return regionDelegate.mArea.isSingular() == false; return regionDelegate.mArea.isSingular() == false;
} }
@LayoutlibDelegate
/*package*/ static boolean contains(Region thisRegion, int x, int y) { /*package*/ static boolean contains(Region thisRegion, int x, int y) {
Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion); Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion);
if (regionDelegate == null) { if (regionDelegate == null) {
@@ -172,6 +177,7 @@ public class Region_Delegate {
return regionDelegate.mArea.contains(x, y); return regionDelegate.mArea.contains(x, y);
} }
@LayoutlibDelegate
/*package*/ static boolean quickContains(Region thisRegion, /*package*/ static boolean quickContains(Region thisRegion,
int left, int top, int right, int bottom) { int left, int top, int right, int bottom) {
Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion); Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion);
@@ -183,6 +189,7 @@ public class Region_Delegate {
regionDelegate.mArea.contains(left, top, right - left, bottom - top); regionDelegate.mArea.contains(left, top, right - left, bottom - top);
} }
@LayoutlibDelegate
/*package*/ static boolean quickReject(Region thisRegion, /*package*/ static boolean quickReject(Region thisRegion,
int left, int top, int right, int bottom) { int left, int top, int right, int bottom) {
Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion); 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; regionDelegate.mArea.intersects(left, top, right - left, bottom - top) == false;
} }
@LayoutlibDelegate
/*package*/ static boolean quickReject(Region thisRegion, Region rgn) { /*package*/ static boolean quickReject(Region thisRegion, Region rgn) {
Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion); Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion);
if (regionDelegate == null) { if (regionDelegate == null) {
@@ -211,6 +219,7 @@ public class Region_Delegate {
} }
@LayoutlibDelegate
/*package*/ static void translate(Region thisRegion, int dx, int dy, Region dst) { /*package*/ static void translate(Region thisRegion, int dx, int dy, Region dst) {
Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion); Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion);
if (regionDelegate == null) { if (regionDelegate == null) {
@@ -232,6 +241,7 @@ public class Region_Delegate {
} }
} }
@LayoutlibDelegate
/*package*/ static void scale(Region thisRegion, float scale, Region dst) { /*package*/ static void scale(Region thisRegion, float scale, Region dst) {
Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion); Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion);
if (regionDelegate == null) { if (regionDelegate == null) {
@@ -253,15 +263,18 @@ public class Region_Delegate {
} }
} }
@LayoutlibDelegate
/*package*/ static int nativeConstructor() { /*package*/ static int nativeConstructor() {
Region_Delegate newDelegate = new Region_Delegate(); Region_Delegate newDelegate = new Region_Delegate();
return sManager.addDelegate(newDelegate); return sManager.addNewDelegate(newDelegate);
} }
@LayoutlibDelegate
/*package*/ static void nativeDestructor(int native_region) { /*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) { /*package*/ static boolean nativeSetRegion(int native_dst, int native_src) {
Region_Delegate dstRegion = sManager.getDelegate(native_dst); Region_Delegate dstRegion = sManager.getDelegate(native_dst);
if (dstRegion == null) { if (dstRegion == null) {
@@ -279,6 +292,7 @@ public class Region_Delegate {
return true; return true;
} }
@LayoutlibDelegate
/*package*/ static boolean nativeSetRect(int native_dst, /*package*/ static boolean nativeSetRect(int native_dst,
int left, int top, int right, int bottom) { int left, int top, int right, int bottom) {
Region_Delegate dstRegion = sManager.getDelegate(native_dst); Region_Delegate dstRegion = sManager.getDelegate(native_dst);
@@ -290,6 +304,7 @@ public class Region_Delegate {
return dstRegion.mArea.getBounds().isEmpty() == false; return dstRegion.mArea.getBounds().isEmpty() == false;
} }
@LayoutlibDelegate
/*package*/ static boolean nativeSetPath(int native_dst, int native_path, int native_clip) { /*package*/ static boolean nativeSetPath(int native_dst, int native_path, int native_clip) {
Region_Delegate dstRegion = sManager.getDelegate(native_dst); Region_Delegate dstRegion = sManager.getDelegate(native_dst);
if (dstRegion == null) { if (dstRegion == null) {
@@ -311,6 +326,7 @@ public class Region_Delegate {
return dstRegion.mArea.getBounds().isEmpty() == false; return dstRegion.mArea.getBounds().isEmpty() == false;
} }
@LayoutlibDelegate
/*package*/ static boolean nativeGetBounds(int native_region, Rect rect) { /*package*/ static boolean nativeGetBounds(int native_region, Rect rect) {
Region_Delegate region = sManager.getDelegate(native_region); Region_Delegate region = sManager.getDelegate(native_region);
if (region == null) { if (region == null) {
@@ -330,6 +346,7 @@ public class Region_Delegate {
return true; return true;
} }
@LayoutlibDelegate
/*package*/ static boolean nativeGetBoundaryPath(int native_region, int native_path) { /*package*/ static boolean nativeGetBoundaryPath(int native_region, int native_path) {
Region_Delegate region = sManager.getDelegate(native_region); Region_Delegate region = sManager.getDelegate(native_region);
if (region == null) { if (region == null) {
@@ -350,6 +367,7 @@ public class Region_Delegate {
return true; return true;
} }
@LayoutlibDelegate
/*package*/ static boolean nativeOp(int native_dst, /*package*/ static boolean nativeOp(int native_dst,
int left, int top, int right, int bottom, int op) { int left, int top, int right, int bottom, int op) {
Region_Delegate region = sManager.getDelegate(native_dst); Region_Delegate region = sManager.getDelegate(native_dst);
@@ -368,6 +386,7 @@ public class Region_Delegate {
return region.mArea.getBounds().isEmpty() == false; return region.mArea.getBounds().isEmpty() == false;
} }
@LayoutlibDelegate
/*package*/ static boolean nativeOp(int native_dst, Rect rect, int native_region, int op) { /*package*/ static boolean nativeOp(int native_dst, Rect rect, int native_region, int op) {
Region_Delegate region = sManager.getDelegate(native_dst); Region_Delegate region = sManager.getDelegate(native_dst);
if (region == null) { if (region == null) {
@@ -385,6 +404,7 @@ public class Region_Delegate {
return region.mArea.getBounds().isEmpty() == false; return region.mArea.getBounds().isEmpty() == false;
} }
@LayoutlibDelegate
/*package*/ static boolean nativeOp(int native_dst, /*package*/ static boolean nativeOp(int native_dst,
int native_region1, int native_region2, int op) { int native_region1, int native_region2, int op) {
Region_Delegate dstRegion = sManager.getDelegate(native_dst); Region_Delegate dstRegion = sManager.getDelegate(native_dst);
@@ -413,6 +433,7 @@ public class Region_Delegate {
} }
@LayoutlibDelegate
/*package*/ static int nativeCreateFromParcel(Parcel p) { /*package*/ static int nativeCreateFromParcel(Parcel p) {
// This is only called by Region.CREATOR (Parcelable.Creator<Region>), which is only // This is only called by Region.CREATOR (Parcelable.Creator<Region>), which is only
// used during aidl call so really this should not be called. // used during aidl call so really this should not be called.
@@ -422,6 +443,7 @@ public class Region_Delegate {
return 0; return 0;
} }
@LayoutlibDelegate
/*package*/ static boolean nativeWriteToParcel(int native_region, /*package*/ static boolean nativeWriteToParcel(int native_region,
Parcel p) { Parcel p) {
// This is only called when sending a region through aidl, so really this should not // 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; return false;
} }
@LayoutlibDelegate
/*package*/ static boolean nativeEquals(int native_r1, int native_r2) { /*package*/ static boolean nativeEquals(int native_r1, int native_r2) {
Region_Delegate region1 = sManager.getDelegate(native_r1); Region_Delegate region1 = sManager.getDelegate(native_r1);
if (region1 == null) { if (region1 == null) {
@@ -446,6 +469,7 @@ public class Region_Delegate {
return region1.mArea.equals(region2.mArea); return region1.mArea.equals(region2.mArea);
} }
@LayoutlibDelegate
/*package*/ static String nativeToString(int native_region) { /*package*/ static String nativeToString(int native_region) {
Region_Delegate region = sManager.getDelegate(native_region); Region_Delegate region = sManager.getDelegate(native_region);
if (region == null) { if (region == null) {

View File

@@ -17,6 +17,7 @@
package android.graphics; package android.graphics;
import com.android.layoutlib.bridge.impl.DelegateManager; import com.android.layoutlib.bridge.impl.DelegateManager;
import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
import android.graphics.Shader.TileMode; import android.graphics.Shader.TileMode;
@@ -39,12 +40,12 @@ public abstract class Shader_Delegate {
// ---- delegate manager ---- // ---- delegate manager ----
protected static final DelegateManager<Shader_Delegate> sManager = protected static final DelegateManager<Shader_Delegate> sManager =
new DelegateManager<Shader_Delegate>(); new DelegateManager<Shader_Delegate>(Shader_Delegate.class);
// ---- delegate helper data ---- // ---- delegate helper data ----
// ---- delegate data ---- // ---- delegate data ----
private int mLocalMatrix = 0; private Matrix_Delegate mLocalMatrix = null;
// ---- Public Helper methods ---- // ---- Public Helper methods ----
@@ -74,36 +75,12 @@ public abstract class Shader_Delegate {
// ---- native methods ---- // ---- native methods ----
@LayoutlibDelegate
/*package*/ static void nativeDestructor(int native_shader, int native_skiaShader) { /*package*/ static void nativeDestructor(int native_shader, int native_skiaShader) {
sManager.removeDelegate(native_shader); sManager.removeJavaReferenceFor(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();
} }
@LayoutlibDelegate
/*package*/ static void nativeSetLocalMatrix(int native_shader, int native_skiaShader, /*package*/ static void nativeSetLocalMatrix(int native_shader, int native_skiaShader,
int matrix_instance) { int matrix_instance) {
// get the delegate from the native int. // get the delegate from the native int.
@@ -112,15 +89,14 @@ public abstract class Shader_Delegate {
return; return;
} }
shaderDelegate.mLocalMatrix = matrix_instance; shaderDelegate.mLocalMatrix = Matrix_Delegate.getDelegate(matrix_instance);
} }
// ---- Private delegate/helper methods ---- // ---- Private delegate/helper methods ----
protected java.awt.geom.AffineTransform getLocalMatrix() { protected java.awt.geom.AffineTransform getLocalMatrix() {
Matrix_Delegate localMatrixDelegate = Matrix_Delegate.getDelegate(mLocalMatrix); if (mLocalMatrix != null) {
if (localMatrixDelegate != null) { return mLocalMatrix.getAffineTransform();
return localMatrixDelegate.getAffineTransform();
} }
return new java.awt.geom.AffineTransform(); return new java.awt.geom.AffineTransform();

View File

@@ -17,6 +17,7 @@
package android.graphics; package android.graphics;
import com.android.layoutlib.bridge.impl.DelegateManager; import com.android.layoutlib.bridge.impl.DelegateManager;
import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
import java.awt.Stroke; import java.awt.Stroke;
@@ -60,9 +61,10 @@ public class SumPathEffect_Delegate extends PathEffect_Delegate {
// ---- native methods ---- // ---- native methods ----
@LayoutlibDelegate
/*package*/ static int nativeCreate(int first, int second) { /*package*/ static int nativeCreate(int first, int second) {
SumPathEffect_Delegate newDelegate = new SumPathEffect_Delegate(); SumPathEffect_Delegate newDelegate = new SumPathEffect_Delegate();
return sManager.addDelegate(newDelegate); return sManager.addNewDelegate(newDelegate);
} }
// ---- Private delegate/helper methods ---- // ---- Private delegate/helper methods ----

View File

@@ -19,6 +19,7 @@ package android.graphics;
import com.android.ide.common.rendering.api.LayoutLog; import com.android.ide.common.rendering.api.LayoutLog;
import com.android.layoutlib.bridge.Bridge; import com.android.layoutlib.bridge.Bridge;
import com.android.layoutlib.bridge.impl.DelegateManager; import com.android.layoutlib.bridge.impl.DelegateManager;
import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
/** /**
* Delegate implementing the native methods of android.graphics.SweepGradient * Delegate implementing the native methods of android.graphics.SweepGradient
@@ -50,21 +51,25 @@ public class SweepGradient_Delegate extends Gradient_Delegate {
// ---- native methods ---- // ---- native methods ----
@LayoutlibDelegate
/*package*/ static int nativeCreate1(float x, float y, int colors[], float positions[]) { /*package*/ static int nativeCreate1(float x, float y, int colors[], float positions[]) {
SweepGradient_Delegate newDelegate = new SweepGradient_Delegate(x, y, colors, 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) { /*package*/ static int nativeCreate2(float x, float y, int color0, int color1) {
return nativeCreate1(x, y, new int[] { color0, color1 }, null /*positions*/); return nativeCreate1(x, y, new int[] { color0, color1 }, null /*positions*/);
} }
@LayoutlibDelegate
/*package*/ static int nativePostCreate1(int native_shader, float cx, float cy, /*package*/ static int nativePostCreate1(int native_shader, float cx, float cy,
int[] colors, float[] positions) { int[] colors, float[] positions) {
// nothing to be done here. // nothing to be done here.
return 0; return 0;
} }
@LayoutlibDelegate
/*package*/ static int nativePostCreate2(int native_shader, float cx, float cy, /*package*/ static int nativePostCreate2(int native_shader, float cx, float cy,
int color0, int color1) { int color0, int color1) {
// nothing to be done here. // nothing to be done here.

View File

@@ -20,6 +20,7 @@ import com.android.ide.common.rendering.api.LayoutLog;
import com.android.layoutlib.bridge.Bridge; import com.android.layoutlib.bridge.Bridge;
import com.android.layoutlib.bridge.impl.DelegateManager; import com.android.layoutlib.bridge.impl.DelegateManager;
import com.android.layoutlib.bridge.impl.FontLoader; import com.android.layoutlib.bridge.impl.FontLoader;
import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
import android.content.res.AssetManager; import android.content.res.AssetManager;
@@ -45,7 +46,7 @@ public final class Typeface_Delegate {
// ---- delegate manager ---- // ---- delegate manager ----
private static final DelegateManager<Typeface_Delegate> sManager = private static final DelegateManager<Typeface_Delegate> sManager =
new DelegateManager<Typeface_Delegate>(); new DelegateManager<Typeface_Delegate>(Typeface_Delegate.class);
// ---- delegate helper data ---- // ---- delegate helper data ----
private static final String DEFAULT_FAMILY = "sans-serif"; private static final String DEFAULT_FAMILY = "sans-serif";
@@ -73,6 +74,10 @@ public final class Typeface_Delegate {
sPostInitDelegate.clear(); sPostInitDelegate.clear();
} }
public static Typeface_Delegate getDelegate(int nativeTypeface) {
return sManager.getDelegate(nativeTypeface);
}
public static List<Font> getFonts(Typeface typeface) { public static List<Font> getFonts(Typeface typeface) {
return getFonts(typeface.native_instance); return getFonts(typeface.native_instance);
} }
@@ -83,11 +88,16 @@ public final class Typeface_Delegate {
return null; return null;
} }
return delegate.mFonts; return delegate.getFonts();
}
public List<Font> getFonts() {
return mFonts;
} }
// ---- native methods ---- // ---- native methods ----
@LayoutlibDelegate
/*package*/ static synchronized int nativeCreate(String familyName, int style) { /*package*/ static synchronized int nativeCreate(String familyName, int style) {
if (familyName == null) { if (familyName == null) {
familyName = DEFAULT_FAMILY; familyName = DEFAULT_FAMILY;
@@ -103,9 +113,10 @@ public final class Typeface_Delegate {
sPostInitDelegate.add(newDelegate); sPostInitDelegate.add(newDelegate);
} }
return sManager.addDelegate(newDelegate); return sManager.addNewDelegate(newDelegate);
} }
@LayoutlibDelegate
/*package*/ static synchronized int nativeCreateFromTypeface(int native_instance, int style) { /*package*/ static synchronized int nativeCreateFromTypeface(int native_instance, int style) {
Typeface_Delegate delegate = sManager.getDelegate(native_instance); Typeface_Delegate delegate = sManager.getDelegate(native_instance);
if (delegate == null) { if (delegate == null) {
@@ -122,25 +133,29 @@ public final class Typeface_Delegate {
sPostInitDelegate.add(newDelegate); sPostInitDelegate.add(newDelegate);
} }
return sManager.addDelegate(newDelegate); return sManager.addNewDelegate(newDelegate);
} }
@LayoutlibDelegate
/*package*/ static synchronized int nativeCreateFromAsset(AssetManager mgr, String path) { /*package*/ static synchronized int nativeCreateFromAsset(AssetManager mgr, String path) {
Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED, Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED,
"Typeface.createFromAsset() is not supported.", null /*throwable*/, null /*data*/); "Typeface.createFromAsset() is not supported.", null /*throwable*/, null /*data*/);
return 0; return 0;
} }
@LayoutlibDelegate
/*package*/ static synchronized int nativeCreateFromFile(String path) { /*package*/ static synchronized int nativeCreateFromFile(String path) {
Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED, Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED,
"Typeface.createFromFile() is not supported.", null /*throwable*/, null /*data*/); "Typeface.createFromFile() is not supported.", null /*throwable*/, null /*data*/);
return 0; return 0;
} }
@LayoutlibDelegate
/*package*/ static void nativeUnref(int native_instance) { /*package*/ static void nativeUnref(int native_instance) {
sManager.removeDelegate(native_instance); sManager.removeJavaReferenceFor(native_instance);
} }
@LayoutlibDelegate
/*package*/ static int nativeGetStyle(int native_instance) { /*package*/ static int nativeGetStyle(int native_instance) {
Typeface_Delegate delegate = sManager.getDelegate(native_instance); Typeface_Delegate delegate = sManager.getDelegate(native_instance);
if (delegate == null) { if (delegate == null) {
@@ -150,6 +165,7 @@ public final class Typeface_Delegate {
return delegate.mStyle; return delegate.mStyle;
} }
@LayoutlibDelegate
/*package*/ static void setGammaForText(float blackGamma, float whiteGamma) { /*package*/ static void setGammaForText(float blackGamma, float whiteGamma) {
// This is for device testing only: pass // This is for device testing only: pass
} }

View File

@@ -17,6 +17,7 @@
package android.graphics; package android.graphics;
import com.android.layoutlib.bridge.impl.DelegateManager; import com.android.layoutlib.bridge.impl.DelegateManager;
import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
import java.awt.Composite; import java.awt.Composite;
@@ -39,7 +40,7 @@ public abstract class Xfermode_Delegate {
// ---- delegate manager ---- // ---- delegate manager ----
protected static final DelegateManager<Xfermode_Delegate> sManager = protected static final DelegateManager<Xfermode_Delegate> sManager =
new DelegateManager<Xfermode_Delegate>(); new DelegateManager<Xfermode_Delegate>(Xfermode_Delegate.class);
// ---- delegate helper data ---- // ---- delegate helper data ----
@@ -58,8 +59,9 @@ public abstract class Xfermode_Delegate {
// ---- native methods ---- // ---- native methods ----
@LayoutlibDelegate
/*package*/ static void finalizer(int native_instance) { /*package*/ static void finalizer(int native_instance) {
sManager.removeDelegate(native_instance); sManager.removeJavaReferenceFor(native_instance);
} }
// ---- Private delegate/helper methods ---- // ---- Private delegate/helper methods ----

View File

@@ -18,6 +18,7 @@ package android.os;
import com.android.layoutlib.bridge.Bridge; import com.android.layoutlib.bridge.Bridge;
import com.android.layoutlib.bridge.impl.DelegateManager; import com.android.layoutlib.bridge.impl.DelegateManager;
import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
import java.util.Map; import java.util.Map;
@@ -33,6 +34,7 @@ import java.util.Map;
*/ */
public class Build_Delegate { public class Build_Delegate {
@LayoutlibDelegate
/*package*/ static String getString(String property) { /*package*/ static String getString(String property) {
Map<String, String> properties = Bridge.getPlatformProperties(); Map<String, String> properties = Bridge.getPlatformProperties();
String value = properties.get(property); String value = properties.get(property);

View File

@@ -16,6 +16,8 @@
package android.os; package android.os;
import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
/** /**
* Delegate overriding selected methods of android.os.Handler * Delegate overriding selected methods of android.os.Handler
@@ -29,6 +31,7 @@ public class Handler_Delegate {
// -------- Delegate methods // -------- Delegate methods
@LayoutlibDelegate
/*package*/ static boolean sendMessageAtTime(Handler handler, Message msg, long uptimeMillis) { /*package*/ static boolean sendMessageAtTime(Handler handler, Message msg, long uptimeMillis) {
// get the callback // get the callback
IHandlerCallback callback = sCallbacks.get(); IHandlerCallback callback = sCallbacks.get();

View File

@@ -17,6 +17,7 @@
package android.os; package android.os;
import com.android.layoutlib.bridge.impl.DelegateManager; import com.android.layoutlib.bridge.impl.DelegateManager;
import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
/** /**
* Delegate implementing the native methods of android.os.SystemClock * Delegate implementing the native methods of android.os.SystemClock
@@ -31,6 +32,7 @@ import com.android.layoutlib.bridge.impl.DelegateManager;
public class SystemClock_Delegate { public class SystemClock_Delegate {
private static long sBootTime = System.currentTimeMillis(); private static long sBootTime = System.currentTimeMillis();
@LayoutlibDelegate
/*package*/ static boolean setCurrentTimeMillis(long millis) { /*package*/ static boolean setCurrentTimeMillis(long millis) {
return true; return true;
} }
@@ -42,6 +44,7 @@ public class SystemClock_Delegate {
* *
* @return milliseconds of non-sleep uptime since boot. * @return milliseconds of non-sleep uptime since boot.
*/ */
@LayoutlibDelegate
/*package*/ static long uptimeMillis() { /*package*/ static long uptimeMillis() {
return System.currentTimeMillis() - sBootTime; return System.currentTimeMillis() - sBootTime;
} }
@@ -51,6 +54,7 @@ public class SystemClock_Delegate {
* *
* @return elapsed milliseconds since boot. * @return elapsed milliseconds since boot.
*/ */
@LayoutlibDelegate
/*package*/ static long elapsedRealtime() { /*package*/ static long elapsedRealtime() {
return System.currentTimeMillis() - sBootTime; return System.currentTimeMillis() - sBootTime;
} }
@@ -60,6 +64,7 @@ public class SystemClock_Delegate {
* *
* @return elapsed milliseconds in the thread * @return elapsed milliseconds in the thread
*/ */
@LayoutlibDelegate
/*package*/ static long currentThreadTimeMillis() { /*package*/ static long currentThreadTimeMillis() {
return System.currentTimeMillis(); return System.currentTimeMillis();
} }

View File

@@ -17,6 +17,7 @@
package android.util; package android.util;
import com.android.layoutlib.bridge.impl.DelegateManager; import com.android.layoutlib.bridge.impl.DelegateManager;
import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
/** /**
* Delegate implementing the native methods of android.util.FloatMath * 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 * @param value to be converted
* @return the floor of value * @return the floor of value
*/ */
@LayoutlibDelegate
/*package*/ static float floor(float value) { /*package*/ static float floor(float value) {
return (float)Math.floor(value); return (float)Math.floor(value);
} }
@@ -51,6 +53,7 @@ import com.android.layoutlib.bridge.impl.DelegateManager;
* @param value to be converted * @param value to be converted
* @return the ceiling of value * @return the ceiling of value
*/ */
@LayoutlibDelegate
/*package*/ static float ceil(float value) { /*package*/ static float ceil(float value) {
return (float)Math.ceil(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 * @param angle to compute the cosine of, in radians
* @return the sine of angle * @return the sine of angle
*/ */
@LayoutlibDelegate
/*package*/ static float sin(float angle) { /*package*/ static float sin(float angle) {
return (float)Math.sin(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 * @param angle to compute the cosine of, in radians
* @return the cosine of angle * @return the cosine of angle
*/ */
@LayoutlibDelegate
/*package*/ static float cos(float angle) { /*package*/ static float cos(float angle) {
return (float)Math.cos(angle); return (float)Math.cos(angle);
} }
@@ -82,6 +87,7 @@ import com.android.layoutlib.bridge.impl.DelegateManager;
* @param value to compute sqrt of * @param value to compute sqrt of
* @return the square root of value * @return the square root of value
*/ */
@LayoutlibDelegate
/*package*/ static float sqrt(float value) { /*package*/ static float sqrt(float value) {
return (float)Math.sqrt(value); return (float)Math.sqrt(value);
} }

View File

@@ -17,6 +17,7 @@
package android.view; package android.view;
import com.android.layoutlib.bridge.android.BridgeInflater; import com.android.layoutlib.bridge.android.BridgeInflater;
import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserException;
@@ -38,6 +39,7 @@ public class LayoutInflater_Delegate {
* Recursive method used to descend down the xml hierarchy and instantiate * Recursive method used to descend down the xml hierarchy and instantiate
* views, instantiate their children, and then call onFinishInflate(). * views, instantiate their children, and then call onFinishInflate().
*/ */
@LayoutlibDelegate
/*package*/ static void rInflate(LayoutInflater thisInflater, /*package*/ static void rInflate(LayoutInflater thisInflater,
XmlPullParser parser, View parent, final AttributeSet attrs, XmlPullParser parser, View parent, final AttributeSet attrs,
boolean finishInflate) throws XmlPullParserException, IOException { boolean finishInflate) throws XmlPullParserException, IOException {

View File

@@ -16,6 +16,8 @@
package android.view; package android.view;
import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
/** /**
* Delegate used to provide new implementation of a select few methods of {@link View} * 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 { public class View_Delegate {
@LayoutlibDelegate
/*package*/ static boolean isInEditMode(View thisView) { /*package*/ static boolean isInEditMode(View thisView) {
return true; return true;
} }

View File

@@ -16,6 +16,8 @@
package com.android.internal.util; 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} * 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 { public class XmlUtils_Delegate {
@LayoutlibDelegate
/*package*/ static final int convertValueToInt(CharSequence charSeq, int defaultValue) { /*package*/ static final int convertValueToInt(CharSequence charSeq, int defaultValue) {
if (null == charSeq) if (null == charSeq)
return defaultValue; return defaultValue;

View File

@@ -192,6 +192,7 @@ public final class Bridge extends com.android.ide.common.rendering.api.Bridge {
Capability.UNBOUND_RENDERING, Capability.UNBOUND_RENDERING,
Capability.CUSTOM_BACKGROUND_COLOR, Capability.CUSTOM_BACKGROUND_COLOR,
Capability.RENDER, Capability.RENDER,
Capability.LAYOUT_ONLY,
Capability.EMBEDDED_LAYOUT, Capability.EMBEDDED_LAYOUT,
Capability.VIEW_MANIPULATION, Capability.VIEW_MANIPULATION,
Capability.PLAY_ANIMATION, Capability.PLAY_ANIMATION,

View File

@@ -425,36 +425,72 @@ public final class BridgeContext extends Activity {
} }
} }
if (defStyleValues == null && defStyleAttr != 0) { if (defStyleValues == null) {
// get the name from the int. if (defStyleAttr != 0) {
String defStyleName = searchAttr(defStyleAttr); // get the name from the int.
String defStyleName = searchAttr(defStyleAttr);
if (defaultPropMap != null) { if (defaultPropMap != null) {
defaultPropMap.put("style", defStyleName); 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;
} }
} else {
Bridge.getLog().error(null,
String.format(
"Failed to find style '%s' in current theme", defStyleName),
null /*data*/);
}
}
if (defStyleRes != 0) { // look for the style in the current theme, and its parent:
// FIXME: See what we need to do with this. ResourceValue item = mRenderResources.findItemInTheme(defStyleName);
throw new UnsupportedOperationException();
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<ResourceType, String> 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; String namespace = BridgeConstants.NS_RESOURCES;

View File

@@ -188,6 +188,10 @@ public final class BridgeTypedArray extends TypedArray {
String s = mResourceData[index].getValue(); String s = mResourceData[index].getValue();
if (RenderResources.REFERENCE_NULL.equals(s)) {
return defValue;
}
try { try {
return (s == null) ? defValue : XmlUtils.convertValueToInt(s, defValue); return (s == null) ? defValue : XmlUtils.convertValueToInt(s, defValue);
} catch (NumberFormatException e) { } catch (NumberFormatException e) {
@@ -301,6 +305,10 @@ public final class BridgeTypedArray extends TypedArray {
return null; return null;
} }
if (RenderResources.REFERENCE_NULL.equals(value)) {
return null;
}
// let the framework inflate the ColorStateList from the XML file. // let the framework inflate the ColorStateList from the XML file.
File f = new File(value); File f = new File(value);
if (f.isFile()) { 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*/); Bridge.getLog().error(LayoutLog.TAG_RESOURCES_FORMAT, e.getMessage(), e, null /*data*/);
} }
assert false;
return null; return null;
} }
@@ -408,6 +414,10 @@ public final class BridgeTypedArray extends TypedArray {
return LayoutParams.WRAP_CONTENT; return LayoutParams.WRAP_CONTENT;
} }
if (RenderResources.REFERENCE_NULL.equals(s)) {
return defValue;
}
if (ResourceHelper.stringToFloat(s, mValue)) { if (ResourceHelper.stringToFloat(s, mValue)) {
return mValue.getDimension(mBridgeResources.mMetrics); 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.", "\"%1$s\" in attribute \"%2$s\" is not a valid format.",
s, mNames[index]), null /*data*/); s, mNames[index]), null /*data*/);
assert false;
return defValue; return defValue;
} }
@@ -480,6 +488,10 @@ public final class BridgeTypedArray extends TypedArray {
return LayoutParams.WRAP_CONTENT; return LayoutParams.WRAP_CONTENT;
} }
if (RenderResources.REFERENCE_NULL.equals(s)) {
return defValue;
}
// FIXME huh? // FIXME huh?
float f = getDimension(index, defValue); float f = getDimension(index, defValue);
@@ -488,8 +500,11 @@ public final class BridgeTypedArray extends TypedArray {
if (f == 0) return 0; if (f == 0) return 0;
if (f > 0) return 1; if (f > 0) return 1;
throw new UnsupportedOperationException("Can't convert to dimension: " + Bridge.getLog().error(LayoutLog.TAG_RESOURCES_FORMAT,
Integer.toString(index)); "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.", "\"%1$s\" in attribute \"%2$s\" cannont be converted to a fraction.",
value, mNames[index]), null /*data*/); value, mNames[index]), null /*data*/);
assert false;
return defValue; return defValue;
} }
@@ -585,6 +598,10 @@ public final class BridgeTypedArray extends TypedArray {
return mContext.getDynamicIdByStyle((StyleResourceValue)resValue); 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), // 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 // then the xml attribute value was "resolved" which leads us to a ResourceValue with a
// valid getType() and getName() returning a resource name. // 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]), "Unable to resolve id \"%1$s\" for attribute \"%2$s\"", value, mNames[index]),
resValue); resValue);
assert false;
return defValue; return defValue;
} }
@@ -712,6 +727,10 @@ public final class BridgeTypedArray extends TypedArray {
String value = mResourceData[index].getValue(); String value = mResourceData[index].getValue();
if (value != null) { if (value != null) {
if (RenderResources.REFERENCE_NULL.equals(value)) {
return null;
}
return new CharSequence[] { value }; return new CharSequence[] { value };
} }

View File

@@ -30,7 +30,7 @@ import android.widget.TextView;
public class PhoneSystemBar extends CustomBar { public class PhoneSystemBar extends CustomBar {
public PhoneSystemBar(Context context, Density density) throws XmlPullParserException { 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); setGravity(mGravity | Gravity.RIGHT);
setBackgroundColor(0xFF000000); setBackgroundColor(0xFF000000);

View File

@@ -16,8 +16,15 @@
package com.android.layoutlib.bridge.impl; 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 android.util.SparseArray;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;
/** /**
* Manages native delegates. * 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. * 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 * 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 <T> the delegate class to manage * @param <T> the delegate class to manage
*/ */
public final class DelegateManager<T> { public final class DelegateManager<T> {
private final Class<T> mClass;
private final SparseArray<T> mDelegates = new SparseArray<T>(); private final SparseWeakArray<T> mDelegates = new SparseWeakArray<T>();
/** 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<T> mJavaReferences = new ArrayList<T>();
private int mDelegateCounter = 0; private int mDelegateCounter = 0;
public DelegateManager(Class<T> theClass) {
mClass = theClass;
}
/** /**
* Returns the delegate from the given native int. * Returns the delegate from the given native int.
* <p> * <p>
@@ -66,6 +97,14 @@ public final class DelegateManager<T> {
public T getDelegate(int native_object) { public T getDelegate(int native_object) {
if (native_object > 0) { if (native_object > 0) {
T delegate = mDelegates.get(native_object); 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; assert delegate != null;
return delegate; return delegate;
} }
@@ -77,17 +116,31 @@ public final class DelegateManager<T> {
* @param newDelegate the delegate to add * @param newDelegate the delegate to add
* @return a unique native int to identify the delegate * @return a unique native int to identify the delegate
*/ */
public int addDelegate(T newDelegate) { public int addNewDelegate(T newDelegate) {
int native_object = ++mDelegateCounter; int native_object = ++mDelegateCounter;
mDelegates.put(native_object, newDelegate); 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; return native_object;
} }
/** /**
* Removes the delegate matching the given native int. * Removes the main reference on the given delegate.
* @param native_object the native int. * @param native_object the native integer representing the delegate.
*/ */
public void removeDelegate(int native_object) { public void removeJavaReferenceFor(int native_object) {
mDelegates.remove(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);
} }
} }

View File

@@ -421,57 +421,63 @@ public class RenderSessionImpl extends RenderAction<SessionParams> {
// now do the layout. // now do the layout.
mViewRoot.layout(0, 0, mMeasuredScreenWidth, mMeasuredScreenHeight); 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 // draw the views
// create the BufferedImage into which the layout will be rendered. // create the BufferedImage into which the layout will be rendered.
boolean newImage = false; boolean newImage = false;
if (newRenderSize || mCanvas == null) { if (newRenderSize || mCanvas == null) {
if (params.getImageFactory() != null) { if (params.getImageFactory() != null) {
mImage = params.getImageFactory().getImage( mImage = params.getImageFactory().getImage(
mMeasuredScreenWidth, mMeasuredScreenWidth,
mMeasuredScreenHeight); mMeasuredScreenHeight);
} else { } else {
mImage = new BufferedImage( mImage = new BufferedImage(
mMeasuredScreenWidth, mMeasuredScreenWidth,
mMeasuredScreenHeight, mMeasuredScreenHeight,
BufferedImage.TYPE_INT_ARGB); BufferedImage.TYPE_INT_ARGB);
newImage = true; 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()) { if (freshRender && newImage == false) {
// since we override the content, it's the same as if it was a new image.
newImage = true;
Graphics2D gc = mImage.createGraphics(); Graphics2D gc = mImage.createGraphics();
gc.setColor(new Color(params.getOverrideBgColor(), true));
gc.setComposite(AlphaComposite.Src); 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(); gc.dispose();
} }
// create an Android bitmap around the BufferedImage mViewRoot.draw(mCanvas);
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 (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); mViewInfoList = startVisitingViews(mViewRoot, 0);
// success! // success!

View File

@@ -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;
}

View File

@@ -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<E> {
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 <code>null</code>
* 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 <code>0...size()-1</code>, returns
* the key from the <code>index</code>th key-value mapping that this
* SparseArray stores.
*/
public int keyAt(int index) {
if (mGarbage) {
gc();
}
return mKeys[index];
}
/**
* Given an index in the range <code>0...size()-1</code>, returns
* the value from the <code>index</code>th 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 <code>0...size()-1</code>, sets a new
* value for the <code>index</code>th 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;
}

View File

@@ -16,6 +16,8 @@
package libcore.icu; package libcore.icu;
import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
import java.util.Locale; import java.util.Locale;
/** /**
@@ -27,80 +29,101 @@ import java.util.Locale;
*/ */
public class ICU_Delegate { public class ICU_Delegate {
// --- Java delegates
@LayoutlibDelegate
/*package*/ static String toLowerCase(String s, String localeName) { /*package*/ static String toLowerCase(String s, String localeName) {
return s.toLowerCase(); return s.toLowerCase();
} }
@LayoutlibDelegate
/*package*/ static String toUpperCase(String s, String localeName) { /*package*/ static String toUpperCase(String s, String localeName) {
return s.toUpperCase(); return s.toUpperCase();
} }
// --- Native methods accessing ICU's database. // --- Native methods accessing ICU's database.
@LayoutlibDelegate
/*package*/ static String[] getAvailableBreakIteratorLocalesNative() { /*package*/ static String[] getAvailableBreakIteratorLocalesNative() {
return new String[0]; return new String[0];
} }
@LayoutlibDelegate
/*package*/ static String[] getAvailableCalendarLocalesNative() { /*package*/ static String[] getAvailableCalendarLocalesNative() {
return new String[0]; return new String[0];
} }
@LayoutlibDelegate
/*package*/ static String[] getAvailableCollatorLocalesNative() { /*package*/ static String[] getAvailableCollatorLocalesNative() {
return new String[0]; return new String[0];
} }
@LayoutlibDelegate
/*package*/ static String[] getAvailableDateFormatLocalesNative() { /*package*/ static String[] getAvailableDateFormatLocalesNative() {
return new String[0]; return new String[0];
} }
@LayoutlibDelegate
/*package*/ static String[] getAvailableLocalesNative() { /*package*/ static String[] getAvailableLocalesNative() {
return new String[0]; return new String[0];
} }
@LayoutlibDelegate
/*package*/ static String[] getAvailableNumberFormatLocalesNative() { /*package*/ static String[] getAvailableNumberFormatLocalesNative() {
return new String[0]; return new String[0];
} }
@LayoutlibDelegate
/*package*/ static String getCurrencyCodeNative(String locale) { /*package*/ static String getCurrencyCodeNative(String locale) {
return ""; return "";
} }
@LayoutlibDelegate
/*package*/ static int getCurrencyFractionDigitsNative(String currencyCode) { /*package*/ static int getCurrencyFractionDigitsNative(String currencyCode) {
return 0; return 0;
} }
@LayoutlibDelegate
/*package*/ static String getCurrencySymbolNative(String locale, String currencyCode) { /*package*/ static String getCurrencySymbolNative(String locale, String currencyCode) {
return ""; return "";
} }
@LayoutlibDelegate
/*package*/ static String getDisplayCountryNative(String countryCode, String locale) { /*package*/ static String getDisplayCountryNative(String countryCode, String locale) {
return ""; return "";
} }
@LayoutlibDelegate
/*package*/ static String getDisplayLanguageNative(String languageCode, String locale) { /*package*/ static String getDisplayLanguageNative(String languageCode, String locale) {
return ""; return "";
} }
@LayoutlibDelegate
/*package*/ static String getDisplayVariantNative(String variantCode, String locale) { /*package*/ static String getDisplayVariantNative(String variantCode, String locale) {
return ""; return "";
} }
@LayoutlibDelegate
/*package*/ static String getISO3CountryNative(String locale) { /*package*/ static String getISO3CountryNative(String locale) {
return ""; return "";
} }
@LayoutlibDelegate
/*package*/ static String getISO3LanguageNative(String locale) { /*package*/ static String getISO3LanguageNative(String locale) {
return ""; return "";
} }
@LayoutlibDelegate
/*package*/ static String[] getISOLanguagesNative() { /*package*/ static String[] getISOLanguagesNative() {
return Locale.getISOLanguages(); return Locale.getISOLanguages();
} }
@LayoutlibDelegate
/*package*/ static String[] getISOCountriesNative() { /*package*/ static String[] getISOCountriesNative() {
return Locale.getISOCountries(); return Locale.getISOCountries();
} }
@LayoutlibDelegate
/*package*/ static boolean initLocaleDataImpl(String locale, LocaleData result) { /*package*/ static boolean initLocaleDataImpl(String locale, LocaleData result) {
// Used by Calendar. // Used by Calendar.

View File

@@ -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.
* <p/>For instance if old class is <code>android.graphics._Original_Paint</code> and the
* new class is <code>android.graphics.Paint</code> and the class to adapt is
* <code>android.graphics._Original_Paint$Cap</code>, then the method will return a
* {@link Class} object representing <code>android.graphics.Paint$Cap</code>.
* <p/>
* 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;
}
}

View File

@@ -21,6 +21,8 @@ import com.android.tools.layoutlib.create.CreateInfo;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.lang.reflect.Modifier; import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.List;
import junit.framework.TestCase; import junit.framework.TestCase;
@@ -78,10 +80,15 @@ public class TestDelegates extends TestCase {
} }
private void compare(Class<?> originalClass, Class<?> delegateClass) throws SecurityException { private void compare(Class<?> originalClass, Class<?> delegateClass) throws SecurityException {
Method[] originalMethods = originalClass.getDeclaredMethods(); List<Method> checkedDelegateMethods = new ArrayList<Method>();
// 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) { 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) { if (originalMethod.getAnnotation(LayoutlibDelegate.class) == null) {
continue; continue;
} }
@@ -114,6 +121,14 @@ public class TestDelegates extends TestCase {
Method delegateMethod = delegateClass.getDeclaredMethod(originalMethod.getName(), Method delegateMethod = delegateClass.getDeclaredMethod(originalMethod.getName(),
parameters); 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 // check that the method is static
assertTrue( assertTrue(
String.format( String.format(
@@ -121,28 +136,62 @@ public class TestDelegates extends TestCase {
delegateMethod.getName(), delegateMethod.getName(),
originalClass.getName()), originalClass.getName()),
(delegateMethod.getModifiers() & Modifier.STATIC) == Modifier.STATIC); (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();
} }
} }