diff options
Diffstat (limited to 'tools')
9 files changed, 395 insertions, 348 deletions
diff --git a/tools/layoutlib/bridge/src/android/graphics/Bitmap.java b/tools/layoutlib/bridge/src/android/graphics/Bitmap.java deleted file mode 100644 index 35f022e..0000000 --- a/tools/layoutlib/bridge/src/android/graphics/Bitmap.java +++ /dev/null @@ -1,278 +0,0 @@ -/* - * Copyright (C) 2008 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 android.graphics; - - -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; - -import javax.imageio.ImageIO; - -public final class Bitmap extends _Original_Bitmap { - - private BufferedImage mImage; - - public Bitmap(File input) throws IOException { - super(1, true, null, -1); - - mImage = ImageIO.read(input); - } - - public Bitmap(InputStream is) throws IOException { - super(1, true, null, -1); - - mImage = ImageIO.read(is); - } - - Bitmap(BufferedImage image) { - super(1, true, null, -1); - mImage = image; - } - - public BufferedImage getImage() { - return mImage; - } - - // ----- overriden methods - - public enum Config { - // these native values must match up with the enum in SkBitmap.h - ALPHA_8 (2), - RGB_565 (4), - ARGB_4444 (5), - ARGB_8888 (6); - - Config(int ni) { - this.nativeInt = ni; - } - final int nativeInt; - - /* package */ static Config nativeToConfig(int ni) { - return sConfigs[ni]; - } - - private static Config sConfigs[] = { - null, null, ALPHA_8, null, RGB_565, ARGB_4444, ARGB_8888 - }; - } - - @Override - public int getWidth() { - return mImage.getWidth(); - } - - @Override - public int getHeight() { - return mImage.getHeight(); - } - - /** - * Returns an immutable bitmap from the source bitmap. The new bitmap may - * be the same object as source, or a copy may have been made. - */ - public static Bitmap createBitmap(Bitmap src) { - return createBitmap(src, 0, 0, src.getWidth(), src.getHeight(), null, false); - } - - /** - * Returns an immutable bitmap from the specified subset of the source - * bitmap. The new bitmap may be the same object as source, or a copy may - * have been made. - * - * @param source The bitmap we are subsetting - * @param x The x coordinate of the first pixel in source - * @param y The y coordinate of the first pixel in source - * @param width The number of pixels in each row - * @param height The number of rows - */ - public static Bitmap createBitmap(Bitmap source, int x, int y, - int width, int height) { - return new Bitmap(source.mImage.getSubimage(x, y, width, height)); - } - - /** - * Returns an immutable bitmap from subset of the source bitmap, - * transformed by the optional matrix. - * - * @param source The bitmap we are subsetting - * @param x The x coordinate of the first pixel in source - * @param y The y coordinate of the first pixel in source - * @param width The number of pixels in each row - * @param height The number of rows - * @param m Option matrix to be applied to the pixels - * @param filter true if the source should be filtered. - * Only applies if the matrix contains more than just - * translation. - * @return A bitmap that represents the specified subset of source - * @throws IllegalArgumentException if the x, y, width, height values are - * outside of the dimensions of the source bitmap. - */ - public static Bitmap createBitmap(Bitmap source, int x, int y, int width, - int height, Matrix m, boolean filter) { - checkXYSign(x, y); - checkWidthHeight(width, height); - if (x + width > source.getWidth()) { - throw new IllegalArgumentException( - "x + width must be <= bitmap.width()"); - } - if (y + height > source.getHeight()) { - throw new IllegalArgumentException( - "y + height must be <= bitmap.height()"); - } - - // check if we can just return our argument unchanged - if (!source.isMutable() && x == 0 && y == 0 - && width == source.getWidth() && height == source.getHeight() - && (m == null || m.isIdentity())) { - return source; - } - - if (m == null || m.isIdentity()) { - return new Bitmap(source.mImage.getSubimage(x, y, width, height)); - } - - int neww = width; - int newh = height; - Paint paint; - - Rect srcR = new Rect(x, y, x + width, y + height); - RectF dstR = new RectF(0, 0, width, height); - - /* the dst should have alpha if the src does, or if our matrix - doesn't preserve rectness - */ - boolean hasAlpha = source.hasAlpha() || !m.rectStaysRect(); - RectF deviceR = new RectF(); - m.mapRect(deviceR, dstR); - neww = Math.round(deviceR.width()); - newh = Math.round(deviceR.height()); - - Canvas canvas = new Canvas(neww, newh); - - canvas.translate(-deviceR.left, -deviceR.top); - canvas.concat(m); - paint = new Paint(); - paint.setFilterBitmap(filter); - if (!m.rectStaysRect()) { - paint.setAntiAlias(true); - } - - canvas.drawBitmap(source, srcR, dstR, paint); - - return new Bitmap(canvas.getImage()); - } - - /** - * Returns a mutable bitmap with the specified width and height. - * - * @param width The width of the bitmap - * @param height The height of the bitmap - * @param config The bitmap config to create. - * @throws IllegalArgumentException if the width or height are <= 0 - */ - public static Bitmap createBitmap(int width, int height, Config config) { - return new Bitmap(new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB)); - } - - /** - * Returns a immutable bitmap with the specified width and height, with each - * pixel value set to the corresponding value in the colors array. - * - * @param colors Array of {@link Color} used to initialize the pixels. - * @param offset Number of values to skip before the first color in the - * array of colors. - * @param stride Number of colors in the array between rows (must be >= - * width or <= -width). - * @param width The width of the bitmap - * @param height The height of the bitmap - * @param config The bitmap config to create. If the config does not - * support per-pixel alpha (e.g. RGB_565), then the alpha - * bytes in the colors[] will be ignored (assumed to be FF) - * @throws IllegalArgumentException if the width or height are <= 0, or if - * the color array's length is less than the number of pixels. - */ - public static Bitmap createBitmap(int colors[], int offset, int stride, - int width, int height, Config config) { - checkWidthHeight(width, height); - if (Math.abs(stride) < width) { - throw new IllegalArgumentException("abs(stride) must be >= width"); - } - int lastScanline = offset + (height - 1) * stride; - int length = colors.length; - if (offset < 0 || (offset + width > length) - || lastScanline < 0 - || (lastScanline + width > length)) { - throw new ArrayIndexOutOfBoundsException(); - } - - // TODO: create an immutable bitmap... - throw new UnsupportedOperationException(); - } - - /** - * Returns a immutable bitmap with the specified width and height, with each - * pixel value set to the corresponding value in the colors array. - * - * @param colors Array of {@link Color} used to initialize the pixels. - * This array must be at least as large as width * height. - * @param width The width of the bitmap - * @param height The height of the bitmap - * @param config The bitmap config to create. If the config does not - * support per-pixel alpha (e.g. RGB_565), then the alpha - * bytes in the colors[] will be ignored (assumed to be FF) - * @throws IllegalArgumentException if the width or height are <= 0, or if - * the color array's length is less than the number of pixels. - */ - public static Bitmap createBitmap(int colors[], int width, int height, - Config config) { - return createBitmap(colors, 0, width, width, height, config); - } - - public static Bitmap createScaledBitmap(Bitmap src, int dstWidth, - int dstHeight, boolean filter) { - Matrix m; - synchronized (Bitmap.class) { - // small pool of just 1 matrix - m = sScaleMatrix; - sScaleMatrix = null; - } - - if (m == null) { - m = new Matrix(); - } - - final int width = src.getWidth(); - final int height = src.getHeight(); - final float sx = dstWidth / (float)width; - final float sy = dstHeight / (float)height; - m.setScale(sx, sy); - Bitmap b = Bitmap.createBitmap(src, 0, 0, width, height, m, filter); - - synchronized (Bitmap.class) { - // do we need to check for null? why not just assign everytime? - if (sScaleMatrix == null) { - sScaleMatrix = m; - } - } - - return b; - } - - -} diff --git a/tools/layoutlib/bridge/src/android/graphics/BitmapFactory.java b/tools/layoutlib/bridge/src/android/graphics/BitmapFactory.java index e978fe8..6fd59c4 100644 --- a/tools/layoutlib/bridge/src/android/graphics/BitmapFactory.java +++ b/tools/layoutlib/bridge/src/android/graphics/BitmapFactory.java @@ -16,6 +16,8 @@ package android.graphics; +import com.android.layoutlib.api.IDensityBasedResourceValue.Density; + import android.content.res.AssetManager; import android.content.res.Resources; import android.util.DisplayMetrics; @@ -454,7 +456,7 @@ public class BitmapFactory { // into is.read(...) This number is not related to the value passed // to mark(...) above. try { - bm = new Bitmap(is); + bm = Bitmap_Delegate.createBitmap(is, Density.MEDIUM); } catch (IOException e) { return null; } diff --git a/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java new file mode 100644 index 0000000..24fba72 --- /dev/null +++ b/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java @@ -0,0 +1,327 @@ +/* + * Copyright (C) 2010 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 android.graphics; + +import com.android.layoutlib.api.IDensityBasedResourceValue.Density; +import com.android.layoutlib.bridge.DelegateManager; + +import android.graphics.Bitmap.Config; +import android.os.Parcel; + +import java.awt.Graphics2D; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.Buffer; + +import javax.imageio.ImageIO; + +/** + * Delegate implementing the native methods of android.graphics.Bitmap + * + * Through the layoutlib_create tool, the original native methods of Bitmap have been replaced + * by calls to methods of the same name in this delegate class. + * + * This class behaves like the original native implementation, but in Java, keeping previously + * native data into its own objects and mapping them to int that are sent back and forth between + * it and the original Bitmap class. + * + * @see DelegateManager + * + */ +public class Bitmap_Delegate { + + // ---- delegate manager ---- + private static final DelegateManager<Bitmap_Delegate> sManager = + new DelegateManager<Bitmap_Delegate>(); + + // ---- delegate helper data ---- + + // ---- delegate data ---- + private BufferedImage mImage; + private boolean mHasAlpha = true; + + // ---- Public Helper methods ---- + + /** + * Creates and returns a {@link Bitmap} initialized with the given file content. + */ + public static Bitmap createBitmap(File input, Density density) throws IOException { + // create a delegate with the content of the file. + Bitmap_Delegate delegate = new Bitmap_Delegate(ImageIO.read(input)); + + return createBitmap(delegate, density.getValue()); + } + + /** + * Creates and returns a {@link Bitmap} initialized with the given stream content. + */ + public static Bitmap createBitmap(InputStream input, Density density) throws IOException { + // create a delegate with the content of the stream. + Bitmap_Delegate delegate = new Bitmap_Delegate(ImageIO.read(input)); + + return createBitmap(delegate, density.getValue()); + } + + /** + * Creates and returns a {@link Bitmap} initialized with the given {@link BufferedImage} + */ + public static Bitmap createBitmap(BufferedImage image, Density density) throws IOException { + // create a delegate with the given image. + Bitmap_Delegate delegate = new Bitmap_Delegate(image); + + return createBitmap(delegate, density.getValue()); + } + + /** + * Returns the {@link BufferedImage} used by the delegate of the given {@link Bitmap}. + */ + public static BufferedImage getImage(Bitmap bitmap) { + // get the delegate from the native int. + Bitmap_Delegate delegate = sManager.getDelegate(bitmap.mNativeBitmap); + if (delegate == null) { + assert false; + return null; + } + + return delegate.mImage; + } + + public static int getBufferedImageType(int nativeBitmapConfig) { + switch (Config.sConfigs[nativeBitmapConfig]) { + case ALPHA_8: + return BufferedImage.TYPE_INT_ARGB; + case RGB_565: + return BufferedImage.TYPE_INT_ARGB; + case ARGB_4444: + return BufferedImage.TYPE_INT_ARGB; + case ARGB_8888: + return BufferedImage.TYPE_INT_ARGB; + } + + return BufferedImage.TYPE_INT_ARGB; + } + + // ---- native methods ---- + + /*package*/ static Bitmap nativeCreate(int[] colors, int offset, int stride, int width, + int height, int nativeConfig, boolean mutable) { + int imageType = getBufferedImageType(nativeConfig); + + // create the image + BufferedImage image = new BufferedImage(width, height, imageType); + + // fill it + //image.setRGB(x, y, rgb) + + // create a delegate with the content of the stream. + Bitmap_Delegate delegate = new Bitmap_Delegate(image); + + return createBitmap(delegate, Bitmap.getDefaultDensity()); + } + + /*package*/ static Bitmap nativeCopy(int srcBitmap, int nativeConfig, boolean isMutable) { + // FIXME implement native delegate + throw new UnsupportedOperationException("Native delegate needed for Bitmap"); + } + + /*package*/ static void nativeDestructor(int nativeBitmap) { + // FIXME implement native delegate + throw new UnsupportedOperationException("Native delegate needed for Bitmap"); + } + + /*package*/ static void nativeRecycle(int nativeBitmap) { + // FIXME implement native delegate + throw new UnsupportedOperationException("Native delegate needed for Bitmap"); + } + + /*package*/ static boolean nativeCompress(int nativeBitmap, int format, int quality, + OutputStream stream, byte[] tempStorage) { + // FIXME implement native delegate + throw new UnsupportedOperationException("Native delegate needed for Bitmap"); + } + + /*package*/ static void nativeErase(int nativeBitmap, int color) { + // get the delegate from the native int. + Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); + if (delegate == null) { + assert false; + return; + } + + BufferedImage image = delegate.mImage; + + Graphics2D g = image.createGraphics(); + try { + if (delegate.mHasAlpha == false) { + color |= color & 0xFF000000; + } + g.setColor(new java.awt.Color(color)); + + g.fillRect(0, 0, image.getWidth(), image.getHeight()); + } finally { + g.dispose(); + } + } + + /*package*/ static int nativeWidth(int nativeBitmap) { + // get the delegate from the native int. + Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); + if (delegate == null) { + assert false; + return 0; + } + + return delegate.mImage.getWidth(); + } + + /*package*/ static int nativeHeight(int nativeBitmap) { + // get the delegate from the native int. + Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); + if (delegate == null) { + assert false; + return 0; + } + + return delegate.mImage.getHeight(); + } + + /*package*/ static int nativeRowBytes(int nativeBitmap) { + // get the delegate from the native int. + Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); + if (delegate == null) { + assert false; + return 0; + } + + return delegate.mImage.getWidth(); + } + + /*package*/ static int nativeConfig(int nativeBitmap) { + return Config.ARGB_8888.nativeInt; + } + + /*package*/ static boolean nativeHasAlpha(int nativeBitmap) { + // get the delegate from the native int. + Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); + if (delegate == null) { + assert false; + return true; + } + + return delegate.mHasAlpha; + } + + /*package*/ static int nativeGetPixel(int nativeBitmap, int x, int y) { + // get the delegate from the native int. + Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); + if (delegate == null) { + assert false; + return 0; + } + + return delegate.mImage.getRGB(x, y); + } + + /*package*/ static void nativeGetPixels(int nativeBitmap, int[] pixels, int offset, + int stride, int x, int y, int width, int height) { + // FIXME implement native delegate + throw new UnsupportedOperationException("Native delegate needed for Bitmap.nativeGetPixels"); + } + + + /*package*/ static void nativeSetPixel(int nativeBitmap, int x, int y, int color) { + // FIXME implement native delegate + throw new UnsupportedOperationException("Native delegate needed for Bitmap.nativeSetPixel"); + } + + /*package*/ static void nativeSetPixels(int nativeBitmap, int[] colors, int offset, + int stride, int x, int y, int width, int height) { + // FIXME implement native delegate + throw new UnsupportedOperationException("Native delegate needed for Bitmap.nativeSetPixels"); + } + + /*package*/ static void nativeCopyPixelsToBuffer(int nativeBitmap, Buffer dst) { + // FIXME implement native delegate + throw new UnsupportedOperationException("Native delegate needed for Bitmap.nativeCopyPixelsToBuffer"); + } + + /*package*/ static void nativeCopyPixelsFromBuffer(int nb, Buffer src) { + // FIXME implement native delegate + throw new UnsupportedOperationException("Native delegate needed for Bitmap.nativeCopyPixelsFromBuffer"); + } + + /*package*/ static int nativeGenerationId(int nativeBitmap) { + // FIXME implement native delegate + throw new UnsupportedOperationException("Native delegate needed for Bitmap.nativeGenerationId"); + } + + /*package*/ static Bitmap nativeCreateFromParcel(Parcel p) { + // FIXME implement native delegate + throw new UnsupportedOperationException("Native delegate needed for Bitmap.nativeCreateFromParcel"); + } + + /*package*/ static boolean nativeWriteToParcel(int nativeBitmap, boolean isMutable, + int density, Parcel p) { + // FIXME implement native delegate + throw new UnsupportedOperationException("Native delegate needed for Bitmap.nativeWriteToParcel"); + } + + /*package*/ static Bitmap nativeExtractAlpha(int nativeBitmap, int nativePaint, + int[] offsetXY) { + // FIXME implement native delegate + throw new UnsupportedOperationException("Native delegate needed for Bitmap.nativeExtractAlpha"); + } + + + /*package*/ static void nativePrepareToDraw(int nativeBitmap) { + // FIXME implement native delegate + throw new UnsupportedOperationException("Native delegate needed for Bitmap.nativePrepareToDraw"); + } + + /*package*/ static void nativeSetHasAlpha(int nativeBitmap, boolean hasAlpha) { + // get the delegate from the native int. + Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); + if (delegate == null) { + assert false; + return; + } + + delegate.mHasAlpha = hasAlpha; + } + + /*package*/ static boolean nativeSameAs(int nb0, int nb1) { + // FIXME implement native delegate + throw new UnsupportedOperationException("Native delegate needed for Bitmap.nativeSameAs"); + } + + // ---- Private delegate/helper methods ---- + + private Bitmap_Delegate(BufferedImage image) { + mImage = image; + } + + private static Bitmap createBitmap(Bitmap_Delegate delegate, int density) { + // get its native_int + int nativeInt = sManager.addDelegate(delegate); + + // and create/return a new Bitmap with it + return new Bitmap(nativeInt, true /*isMutable*/, null /*ninePatchChunk*/, density); + } +} diff --git a/tools/layoutlib/bridge/src/android/graphics/Canvas.java b/tools/layoutlib/bridge/src/android/graphics/Canvas.java index 0dccc0d6..24da812 100644 --- a/tools/layoutlib/bridge/src/android/graphics/Canvas.java +++ b/tools/layoutlib/bridge/src/android/graphics/Canvas.java @@ -51,7 +51,7 @@ public class Canvas extends _Original_Canvas { public Canvas(Bitmap bitmap) { mLogger = null; - mBufferedImage = bitmap.getImage(); + mBufferedImage = Bitmap_Delegate.getImage(bitmap); mGraphicsStack.push(mBufferedImage.createGraphics()); } @@ -227,7 +227,7 @@ public class Canvas extends _Original_Canvas { */ @Override public void setBitmap(Bitmap bitmap) { - mBufferedImage = bitmap.getImage(); + mBufferedImage = Bitmap_Delegate.getImage(bitmap); mGraphicsStack.push(mBufferedImage.createGraphics()); } @@ -557,7 +557,7 @@ public class Canvas extends _Original_Canvas { private void drawBitmap(Bitmap bitmap, int sleft, int stop, int sright, int sbottom, int dleft, int dtop, int dright, int dbottom, Paint paint) { - BufferedImage image = bitmap.getImage(); + BufferedImage image = Bitmap_Delegate.getImage(bitmap); Graphics2D g = getGraphics2d(); diff --git a/tools/layoutlib/bridge/src/android/graphics/Matrix_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Matrix_Delegate.java index ed2eff2..cc4a80c 100644 --- a/tools/layoutlib/bridge/src/android/graphics/Matrix_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/Matrix_Delegate.java @@ -76,7 +76,7 @@ public final class Matrix_Delegate { // ---- native methods ---- - public static int native_create(int native_src_or_zero) { + /*package*/ static int native_create(int native_src_or_zero) { // create the delegate Matrix_Delegate newDelegate = new Matrix_Delegate(); @@ -94,7 +94,7 @@ public final class Matrix_Delegate { return sManager.addDelegate(newDelegate); } - public static boolean native_isIdentity(int native_object) { + /*package*/ static boolean native_isIdentity(int native_object) { Matrix_Delegate d = sManager.getDelegate(native_object); if (d == null) { assert false; @@ -112,7 +112,7 @@ public final class Matrix_Delegate { return true; } - public static boolean native_rectStaysRect(int native_object) { + /*package*/ static boolean native_rectStaysRect(int native_object) { Matrix_Delegate d = sManager.getDelegate(native_object); if (d == null) { assert false; @@ -122,7 +122,7 @@ public final class Matrix_Delegate { return (d.computeTypeMask() & kRectStaysRect_Mask) != 0; } - public static void native_reset(int native_object) { + /*package*/ static void native_reset(int native_object) { Matrix_Delegate d = sManager.getDelegate(native_object); if (d == null) { assert false; @@ -132,7 +132,7 @@ public final class Matrix_Delegate { reset(d.mValues); } - public 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); if (d == null) { assert false; @@ -148,7 +148,7 @@ public final class Matrix_Delegate { System.arraycopy(src.mValues, 0, d.mValues, 0, MATRIX_SIZE); } - public 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); if (d == null) { assert false; @@ -158,7 +158,7 @@ public final class Matrix_Delegate { setTranslate(d.mValues, dx, dy); } - public static void native_setScale(int native_object, float sx, float sy, float px, float py) { + /*package*/ static void native_setScale(int native_object, float sx, float sy, float px, float py) { Matrix_Delegate d = sManager.getDelegate(native_object); if (d == null) { assert false; @@ -168,7 +168,7 @@ public final class Matrix_Delegate { d.mValues = getScale(sx, sy, px, py); } - public 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); if (d == null) { assert false; @@ -186,7 +186,7 @@ public final class Matrix_Delegate { d.mValues[8] = 1; } - public 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); if (d == null) { assert false; @@ -196,7 +196,7 @@ public final class Matrix_Delegate { d.mValues = getRotate(degrees, px, py); } - public 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); if (d == null) { assert false; @@ -206,7 +206,7 @@ public final class Matrix_Delegate { setRotate(d.mValues, degrees); } - public 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) { Matrix_Delegate d = sManager.getDelegate(native_object); if (d == null) { @@ -225,7 +225,7 @@ public final class Matrix_Delegate { d.postTransform(getTranslate(px, py)); } - public 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); if (d == null) { assert false; @@ -235,7 +235,7 @@ public final class Matrix_Delegate { setRotate(d.mValues, sinValue, cosValue); } - public static void native_setSkew(int native_object, float kx, float ky, float px, float py) { + /*package*/ static void native_setSkew(int native_object, float kx, float ky, float px, float py) { Matrix_Delegate d = sManager.getDelegate(native_object); if (d == null) { assert false; @@ -245,7 +245,7 @@ public final class Matrix_Delegate { d.mValues = getSkew(kx, ky, px, py); } - public 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); if (d == null) { assert false; @@ -263,7 +263,7 @@ public final class Matrix_Delegate { d.mValues[8] = 1; } - public 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) { return native_preConcat(native_object, b); } else if (b == native_object) { @@ -293,7 +293,7 @@ public final class Matrix_Delegate { return true; } - public 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); if (d == null) { assert false; @@ -304,7 +304,7 @@ public final class Matrix_Delegate { return true; } - public 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) { Matrix_Delegate d = sManager.getDelegate(native_object); if (d == null) { @@ -316,7 +316,7 @@ public final class Matrix_Delegate { return true; } - public 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); if (d == null) { assert false; @@ -327,7 +327,7 @@ public final class Matrix_Delegate { return true; } - public static boolean native_preRotate(int native_object, float degrees, float px, float py) { + /*package*/ static boolean native_preRotate(int native_object, float degrees, float px, float py) { Matrix_Delegate d = sManager.getDelegate(native_object); if (d == null) { assert false; @@ -338,7 +338,7 @@ public final class Matrix_Delegate { return true; } - public 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); if (d == null) { assert false; @@ -353,7 +353,7 @@ public final class Matrix_Delegate { return true; } - public 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) { Matrix_Delegate d = sManager.getDelegate(native_object); if (d == null) { @@ -365,7 +365,7 @@ public final class Matrix_Delegate { return true; } - public 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); if (d == null) { assert false; @@ -376,7 +376,7 @@ public final class Matrix_Delegate { return true; } - public 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); if (d == null) { assert false; @@ -393,7 +393,7 @@ public final class Matrix_Delegate { return true; } - public 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); if (d == null) { assert false; @@ -404,7 +404,7 @@ public final class Matrix_Delegate { return true; } - public 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) { Matrix_Delegate d = sManager.getDelegate(native_object); if (d == null) { @@ -416,7 +416,7 @@ public final class Matrix_Delegate { return true; } - public 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); if (d == null) { assert false; @@ -427,7 +427,7 @@ public final class Matrix_Delegate { return true; } - public static boolean native_postRotate(int native_object, float degrees, float px, float py) { + /*package*/ static boolean native_postRotate(int native_object, float degrees, float px, float py) { Matrix_Delegate d = sManager.getDelegate(native_object); if (d == null) { assert false; @@ -438,7 +438,7 @@ public final class Matrix_Delegate { return true; } - public 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); if (d == null) { assert false; @@ -449,7 +449,7 @@ public final class Matrix_Delegate { return true; } - public 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) { Matrix_Delegate d = sManager.getDelegate(native_object); if (d == null) { @@ -461,7 +461,7 @@ public final class Matrix_Delegate { return true; } - public 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); if (d == null) { assert false; @@ -472,7 +472,7 @@ public final class Matrix_Delegate { return true; } - public 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); if (d == null) { assert false; @@ -489,7 +489,7 @@ public final class Matrix_Delegate { return true; } - public static boolean native_setRectToRect(int native_object, RectF src, RectF dst, int stf) { + /*package*/ static boolean native_setRectToRect(int native_object, RectF src, RectF dst, int stf) { Matrix_Delegate d = sManager.getDelegate(native_object); if (d == null) { assert false; @@ -553,13 +553,13 @@ public final class Matrix_Delegate { return true; } - public 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) { // FIXME - throw new UnsupportedOperationException("NATIVE DELEGATE NEEDED"); + throw new UnsupportedOperationException("Native delegate needed: Matrix_Delegate.native_setPolyToPoly"); } - public 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); if (d == null) { assert false; @@ -589,7 +589,7 @@ public final class Matrix_Delegate { } } - public 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) { Matrix_Delegate d = sManager.getDelegate(native_object); if (d == null) { @@ -602,11 +602,11 @@ public final class Matrix_Delegate { } else { // src is vectors // FIXME - throw new UnsupportedOperationException("NATIVE DELEGATE NEEDED"); + throw new UnsupportedOperationException("Native delegate needed: Matrix_Delegate.native_mapPoints"); } } - public 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); if (d == null) { assert false; @@ -635,12 +635,12 @@ public final class Matrix_Delegate { return (d.computeTypeMask() & kRectStaysRect_Mask) != 0; } - public static float native_mapRadius(int native_object, float radius) { + /*package*/ static float native_mapRadius(int native_object, float radius) { // FIXME - throw new UnsupportedOperationException(); + throw new UnsupportedOperationException("Native delegate needed: Matrix_Delegate.native_mapRadius"); } - public 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); if (d == null) { assert false; @@ -650,7 +650,7 @@ public final class Matrix_Delegate { System.arraycopy(d.mValues, 0, d.mValues, 0, MATRIX_SIZE); } - public 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); if (d == null) { assert false; @@ -660,7 +660,7 @@ public final class Matrix_Delegate { System.arraycopy(values, 0, d.mValues, 0, MATRIX_SIZE); } - public 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); if (a == null) { assert false; @@ -682,7 +682,7 @@ public final class Matrix_Delegate { return true; } - public static void finalizer(int native_instance) { + /*package*/ static void finalizer(int native_instance) { sManager.removeDelegate(native_instance); } diff --git a/tools/layoutlib/bridge/src/android/graphics/Typeface_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Typeface_Delegate.java index 309d934..248bdab 100644 --- a/tools/layoutlib/bridge/src/android/graphics/Typeface_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/Typeface_Delegate.java @@ -34,7 +34,7 @@ import java.util.List; * * This class behaves like the original native implementation, but in Java, keeping previously * native data into its own objects and mapping them to int that are sent back and forth between - * it and the original Matrix class. + * it and the original Typeface class. * * @see DelegateManager * @@ -84,7 +84,7 @@ public final class Typeface_Delegate { // ---- native methods ---- - public static synchronized int nativeCreate(String familyName, int style) { + /*package*/ static synchronized int nativeCreate(String familyName, int style) { if (familyName == null) { familyName = DEFAULT_FAMILY; } @@ -102,7 +102,7 @@ public final class Typeface_Delegate { return sManager.addDelegate(newDelegate); } - public 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); if (delegate == null) { assert false; @@ -122,21 +122,21 @@ public final class Typeface_Delegate { return sManager.addDelegate(newDelegate); } - public static synchronized int nativeCreateFromAsset(AssetManager mgr, String path) { + /*package*/ static synchronized int nativeCreateFromAsset(AssetManager mgr, String path) { // FIXME - throw new UnsupportedOperationException(); + throw new UnsupportedOperationException("Native delegate needed: Typeface_Delegate.nativeCreateFromAsset"); } - public static synchronized int nativeCreateFromFile(String path) { + /*package*/ static synchronized int nativeCreateFromFile(String path) { // FIXME - throw new UnsupportedOperationException(); + throw new UnsupportedOperationException("Native delegate needed: Typeface_Delegate.nativeCreateFromFile"); } - public static void nativeUnref(int native_instance) { + /*package*/ static void nativeUnref(int native_instance) { sManager.removeDelegate(native_instance); } - public static int nativeGetStyle(int native_instance) { + /*package*/ static int nativeGetStyle(int native_instance) { Typeface_Delegate delegate = sManager.getDelegate(native_instance); if (delegate == null) { assert false; @@ -146,7 +146,7 @@ public final class Typeface_Delegate { return delegate.mStyle; } - public static void setGammaForText(float blackGamma, float whiteGamma) { + /*package*/ static void setGammaForText(float blackGamma, float whiteGamma) { // This is for device testing only: pass } diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/ResourceHelper.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/ResourceHelper.java index f624753..f13ecdc 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/ResourceHelper.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/ResourceHelper.java @@ -17,8 +17,8 @@ package com.android.layoutlib.bridge; import com.android.layoutlib.api.IDensityBasedResourceValue; -import com.android.layoutlib.api.IResourceValue; import com.android.layoutlib.api.IDensityBasedResourceValue.Density; +import com.android.layoutlib.api.IResourceValue; import com.android.ninepatch.NinePatch; import org.kxml2.io.KXmlParser; @@ -26,6 +26,7 @@ import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import android.graphics.Bitmap; +import android.graphics.Bitmap_Delegate; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; @@ -105,7 +106,8 @@ public final class ResourceHelper { * @param isFramework indicates whether the resource is a framework resources. * Framework resources are cached, and loaded only once. */ - public static Drawable getDrawable(IResourceValue value, BridgeContext context, boolean isFramework) { + public static Drawable getDrawable(IResourceValue value, BridgeContext context, + boolean isFramework) { Drawable d = null; String stringValue = value.getValue(); @@ -168,14 +170,8 @@ public final class ResourceHelper { isFramework ? null : context.getProjectKey()); if (bitmap == null) { - bitmap = new Bitmap(bmpFile); - try { - bitmap.setDensity(Density.MEDIUM.getValue()); - } catch (NoClassDefFoundError error) { - // look like we're running in an older version of ADT that doesn't - // include the new layoutlib_api. Let's just ignore this, the drawing - // will just be wrong. - } + // always create the cache copy in the original density. + bitmap = Bitmap_Delegate.createBitmap(bmpFile, Density.MEDIUM); Bridge.setCachedBitmap(stringValue, bitmap, isFramework ? null : context.getProjectKey()); } diff --git a/tools/layoutlib/bridge/tests/com/android/layoutlib/bridge/TestNativeDelegate.java b/tools/layoutlib/bridge/tests/com/android/layoutlib/bridge/TestNativeDelegate.java index 6eed8ba..7c1eecd 100644 --- a/tools/layoutlib/bridge/tests/com/android/layoutlib/bridge/TestNativeDelegate.java +++ b/tools/layoutlib/bridge/tests/com/android/layoutlib/bridge/TestNativeDelegate.java @@ -87,7 +87,7 @@ public class TestNativeDelegate extends TestCase { try { // try to load the method with the given parameter types. - delegateClass.getMethod(originalMethod.getName(), parameters); + delegateClass.getDeclaredMethod(originalMethod.getName(), parameters); } catch (NoSuchMethodException e) { // compute a full class name that's long but not too long. StringBuilder sb = new StringBuilder(originalMethod.getName() + "("); diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java index f6d11fe..0ecb474 100644 --- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java +++ b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java @@ -103,6 +103,7 @@ public final class CreateInfo implements ICreateInfo { * The list of classes on which to delegate all native methods. */ private final static String[] DELEGATE_CLASS_NATIVES = new String[] { + "android.graphics.Bitmap", "android.graphics.Matrix", "android.graphics.Typeface", }; @@ -123,7 +124,6 @@ public final class CreateInfo implements ICreateInfo { */ private final static String[] RENAMED_CLASSES = new String[] { - "android.graphics.Bitmap", "android.graphics._Original_Bitmap", "android.graphics.BitmapFactory", "android.graphics._Original_BitmapFactory", "android.graphics.BitmapShader", "android.graphics._Original_BitmapShader", "android.graphics.Canvas", "android.graphics._Original_Canvas", |