Merge change 8616 into donut

* changes:
  Fiddle with default densities to try to sanitize the API.
This commit is contained in:
Android (Google) Code Review
2009-07-27 12:03:36 -07:00
3 changed files with 94 additions and 31 deletions

View File

@ -3753,6 +3753,14 @@ public final class ActivityThread {
data.info = getPackageInfoNoCheck(data.appInfo);
/**
* Switch this process to density compatibility mode if needed.
*/
if ((data.appInfo.flags&ApplicationInfo.FLAG_SUPPORTS_SCREEN_DENSITIES)
== 0) {
Bitmap.setDefaultDensity(DisplayMetrics.DENSITY_DEFAULT);
}
if (data.debugMode != IApplicationThread.DEBUG_OFF) {
// XXX should have option to change the port.
Debug.changeDebugPort(8100);

View File

@ -46,10 +46,29 @@ public final class Bitmap implements Parcelable {
private boolean mRecycled;
// Package-scoped for fast access.
/*package*/ int mDensity = DENSITY_NONE;
/*package*/ int mDensity = sDefaultDensity = getDefaultDensity();
private static volatile Matrix sScaleMatrix;
private static volatile int sDefaultDensity = -1;
/**
* For backwards compatibility, allows the app layer to change the default
* density when running old apps.
* @hide
*/
public static void setDefaultDensity(int density) {
sDefaultDensity = density;
}
/*package*/ static int getDefaultDensity() {
if (sDefaultDensity >= 0) {
return sDefaultDensity;
}
sDefaultDensity = DisplayMetrics.DENSITY_DEVICE;
return sDefaultDensity;
}
/**
* @noinspection UnusedDeclaration
*/
@ -72,9 +91,16 @@ public final class Bitmap implements Parcelable {
/**
* <p>Returns the density for this bitmap.</p>
*
* <p>The default density scale is {@link #DENSITY_NONE}.</p>
* <p>The default density is the same density as the current display,
* unless the current application does not support different screen
* densities in which case it is
* {@link android.util.DisplayMetrics#DENSITY_DEFAULT}. Note that
* compatibility mode is determined by the application that was initially
* loaded into a process -- applications that share the same process should
* all have the same compatibility, or ensure they explicitly set the
* density of their bitmaps appropriately.</p>
*
* @return A scaling factor of the default density (160) or {@link #DENSITY_NONE}
* @return A scaling factor of the default density or {@link #DENSITY_NONE}
* if the scaling factor is unknown.
*
* @see #setDensity(int)
@ -272,7 +298,8 @@ public final class Bitmap implements Parcelable {
* Tries to make a new bitmap based on the dimensions of this bitmap,
* setting the new bitmap's config to the one specified, and then copying
* this bitmap's pixels into the new bitmap. If the conversion is not
* supported, or the allocator fails, then this returns NULL.
* supported, or the allocator fails, then this returns NULL. The returned
* bitmap initially has the same density as the original.
*
* @param config The desired config for the resulting bitmap
* @param isMutable True if the resulting bitmap should be mutable (i.e.
@ -281,7 +308,11 @@ public final class Bitmap implements Parcelable {
*/
public Bitmap copy(Config config, boolean isMutable) {
checkRecycled("Can't copy a recycled bitmap");
return nativeCopy(mNativeBitmap, config.nativeInt, isMutable);
Bitmap b = nativeCopy(mNativeBitmap, config.nativeInt, isMutable);
if (b != null) {
b.mDensity = mDensity;
}
return b;
}
public static Bitmap createScaledBitmap(Bitmap src, int dstWidth,
@ -316,7 +347,8 @@ public final class Bitmap implements Parcelable {
/**
* 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.
* be the same object as source, or a copy may have been made. It is
* initialized with the same density as the original bitmap.
*/
public static Bitmap createBitmap(Bitmap src) {
return createBitmap(src, 0, 0, src.getWidth(), src.getHeight());
@ -325,7 +357,8 @@ public final class Bitmap implements Parcelable {
/**
* 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.
* have been made. It is
* initialized with the same density as the original bitmap.
*
* @param source The bitmap we are subsetting
* @param x The x coordinate of the first pixel in source
@ -339,7 +372,8 @@ public final class Bitmap implements Parcelable {
/**
* Returns an immutable bitmap from subset of the source bitmap,
* transformed by the optional matrix.
* transformed by the optional matrix. It is
* initialized with the same density as the original bitmap.
*
* @param source The bitmap we are subsetting
* @param x The x coordinate of the first pixel in source
@ -406,18 +440,20 @@ public final class Bitmap implements Parcelable {
paint.setAntiAlias(true);
}
}
canvas.setBitmap(bitmap);
canvas.drawBitmap(source, srcR, dstR, paint);
// The new bitmap was created from a known bitmap source so assume that
// they use the same density
bitmap.mDensity = source.mDensity;
canvas.setBitmap(bitmap);
canvas.drawBitmap(source, srcR, dstR, paint);
return bitmap;
}
/**
* Returns a mutable bitmap with the specified width and height.
* Returns a mutable bitmap with the specified width and height. Its
* initial density is as per {@link #getDensity}.
*
* @param width The width of the bitmap
* @param height The height of the bitmap
@ -432,7 +468,8 @@ public final class Bitmap implements Parcelable {
/**
* Returns a immutable bitmap with the specified width and height, with each
* pixel value set to the corresponding value in the colors array.
* pixel value set to the corresponding value in the colors array. Its
* initial density is as per {@link #getDensity}.
*
* @param colors Array of {@link Color} used to initialize the pixels.
* @param offset Number of values to skip before the first color in the
@ -466,7 +503,8 @@ public final class Bitmap implements Parcelable {
/**
* Returns a immutable bitmap with the specified width and height, with each
* pixel value set to the corresponding value in the colors array.
* pixel value set to the corresponding value in the colors array. Its
* initial density is as per {@link #getDensity}.
*
* @param colors Array of {@link Color} used to initialize the pixels.
* This array must be at least as large as width * height.
@ -882,6 +920,9 @@ public final class Bitmap implements Parcelable {
* -2, -2, so that drawing the alpha bitmap offset by (-2, -2) and then
* drawing the original would result in the blur visually aligning with
* the original.
*
* <p>The initial density of the returned bitmap is the same as the original's.
*
* @param paint Optional paint used to modify the alpha values in the
* resulting bitmap. Pass null for default behavior.
* @param offsetXY Optional array that returns the X (index 0) and Y
@ -899,6 +940,7 @@ public final class Bitmap implements Parcelable {
if (bm == null) {
throw new RuntimeException("Failed to extractAlpha on Bitmap");
}
bm.mDensity = mDensity;
return bm;
}

View File

@ -49,7 +49,7 @@ public class Canvas {
private DrawFilter mDrawFilter;
// Package-scoped for quick access.
/*package*/ int mDensity = DisplayMetrics.DENSITY_DEFAULT;
/*package*/ int mDensity = Bitmap.DENSITY_NONE;
// Used by native code
@SuppressWarnings({"UnusedDeclaration"})
@ -57,7 +57,9 @@ public class Canvas {
/**
* Construct an empty raster canvas. Use setBitmap() to specify a bitmap to
* draw into.
* draw into. The initial target density is {@link Bitmap#DENSITY_NONE};
* this will typically be replaced when a target bitmap is set for the
* canvas.
*/
public Canvas() {
// 0 means no native bitmap
@ -68,6 +70,9 @@ public class Canvas {
* Construct a canvas with the specified bitmap to draw into. The bitmap
* must be mutable.
*
* <p>The initial target density of the canvas is the same as the given
* bitmap's density.
*
* @param bitmap Specifies a mutable bitmap for the canvas to draw into.
*/
public Canvas(Bitmap bitmap) {
@ -78,9 +83,7 @@ public class Canvas {
throwIfRecycled(bitmap);
mNativeCanvas = initRaster(bitmap.ni());
mBitmap = bitmap;
final int density = bitmap.mDensity;
mDensity = density == Bitmap.DENSITY_NONE
? DisplayMetrics.DENSITY_DEFAULT : density;
mDensity = bitmap.mDensity;
}
/*package*/ Canvas(int nativeCanvas) {
@ -88,6 +91,7 @@ public class Canvas {
throw new IllegalStateException();
}
mNativeCanvas = nativeCanvas;
mDensity = Bitmap.getDefaultDensity();
}
/**
@ -96,10 +100,14 @@ public class Canvas {
* be supported in this mode (e.g. some GL implementations may not support
* antialiasing or certain effects like ColorMatrix or certain Xfermodes).
* However, no exception will be thrown in those cases.
*
* <p>The initial target density of the canvas is the same as the initial
* density of bitmaps as per {@link Bitmap#getDensity() Bitmap.getDensity()}.
*/
public Canvas(GL gl) {
mNativeCanvas = initGL();
mGL = gl;
mDensity = Bitmap.getDefaultDensity();
}
/**
@ -120,9 +128,13 @@ public class Canvas {
}
/**
* Specify a bitmap for the canvas to draw into.
* Specify a bitmap for the canvas to draw into. As a side-effect, also
* updates the canvas's target density to match that of the bitmap.
*
* @param bitmap Specifies a mutable bitmap for the canvas to draw into.
*
* @see #setDensity(int)
* @see #getDensity()
*/
public void setBitmap(Bitmap bitmap) {
if (!bitmap.isMutable()) {
@ -135,9 +147,7 @@ public class Canvas {
native_setBitmap(mNativeCanvas, bitmap.ni());
mBitmap = bitmap;
final int density = bitmap.mDensity;
mDensity = density == Bitmap.DENSITY_NONE
? DisplayMetrics.DENSITY_DEFAULT : density;
mDensity = bitmap.mDensity;
}
/**
@ -176,12 +186,12 @@ public class Canvas {
public native int getHeight();
/**
* <p>Returns the density for this Canvas' backing bitmap.</p>
* <p>Returns the target density of the canvas. The default density is
* derived from the density of its backing bitmap, or
* {@link Bitmap#DENSITY_NONE} if there is not one.</p>
*
* <p>The default density scale is {@link Bitmap#DENSITY_NONE}.</p>
*
* @return A scaling factor of the default density (160dpi) or
* {@link Bitmap#DENSITY_NONE} if the scaling factor is unknown.
* @return Returns the current target density of the canvas, which is used
* to determine the scaling factor when drawing a bitmap into it.
*
* @see #setDensity(int)
* @see Bitmap#getDensity()
@ -191,10 +201,13 @@ public class Canvas {
}
/**
* <p>Specifies the density for this Canvas' backing bitmap.
* <p>Specifies the density for this Canvas' backing bitmap. This modifies
* the target density of the canvas itself, as well as the density of its
* backing bitmap via {@link Bitmap#setDensity(int) Bitmap.setDensity(int)}.
*
* @param density The density scaling factor to use with this bitmap or
* {@link Bitmap#DENSITY_NONE} if the factor is unknown.
* @param density The new target density of the canvas, which is used
* to determine the scaling factor when drawing a bitmap into it. Use
* {@link Bitmap#DENSITY_NONE} to disable bitmap scaling.
*
* @see #getDensity()
* @see Bitmap#setDensity(int)