if (canvas && canvas->quickReject(bounds, SkCanvas::kBW_EdgeType)) {
return;
}
+
+ SkPaint defaultPaint;
+ if (NULL == paint) {
+ // matches default dither in NinePatchDrawable.java.
+ defaultPaint.setDither(true);
+ paint = &defaultPaint;
+ }
// if our canvas is GL, draw this as a mesh, which will be faster than
// in parts (which is faster for raster)
if (bitmap.getPixels() == NULL)
return;
- SkPaint defaultPaint;
- if (NULL == paint) {
- paint = &defaultPaint;
- }
-
const bool hasXfer = paint->getXfermode() != NULL;
SkRect dst;
SkIRect src;
*/
public class BitmapDrawable extends Drawable {
- private static final int DEFAULT_PAINT_FLAGS = Paint.FILTER_BITMAP_FLAG;
+ private static final int DEFAULT_PAINT_FLAGS =
+ Paint.FILTER_BITMAP_FLAG | Paint.DITHER_FLAG;
private BitmapState mBitmapState;
private Bitmap mBitmap;
private final Rect mDstRect = new Rect(); // Gravity.apply() sets this
import android.graphics.*;
public class DrawableContainer extends Drawable implements Drawable.Callback {
-
+
+ /**
+ * To be proper, we should have a getter for dither (and alpha, etc.)
+ * so that proxy classes like this can save/restore their delegates'
+ * values, but we don't have getters. Since we do have setters
+ * (e.g. setDither), which this proxy forwards on, we have to have some
+ * default/initial setting.
+ *
+ * The initial setting for dither is now true, since it almost always seems
+ * to improve the quality at negligible cost.
+ */
+ private static final boolean DEFAULT_DITHER = true;
private DrawableContainerState mDrawableContainerState;
private Drawable mCurrDrawable;
private int mAlpha = 0xFF;
private ColorFilter mColorFilter;
- private boolean mDither;
+ private boolean mDither = DEFAULT_DITHER;
private int mCurIndex = -1;
private boolean mMutated;
*
*/
public class NinePatchDrawable extends Drawable {
+ // dithering helps a lot, and is pretty cheap, so default is true
+ private static final boolean DEFAULT_DITHER = true;
private NinePatchState mNinePatchState;
private NinePatch mNinePatch;
private Rect mPadding;
mNinePatch = state.mNinePatch;
mPadding = state.mPadding;
mTargetDensity = state.mTargetDensity;
- if (state.mDither) setDither(state.mDither);
+ if (DEFAULT_DITHER != state.mDither) {
+ // avoid calling the setter unless we need to, since it does a
+ // lazy allocation of a paint
+ setDither(state.mDither);
+ }
if (mNinePatch != null) {
computeBitmapSize();
}
}
final boolean dither = a.getBoolean(
- com.android.internal.R.styleable.NinePatchDrawable_dither, false);
+ com.android.internal.R.styleable.NinePatchDrawable_dither,
+ DEFAULT_DITHER);
final BitmapFactory.Options options = new BitmapFactory.Options();
if (dither) {
options.inDither = false;
a.recycle();
}
-
public Paint getPaint() {
if (mPaint == null) {
mPaint = new Paint();
- // dithering helps a lot, and is pretty cheap, so default on
- mPaint.setDither(true);
+ mPaint.setDither(DEFAULT_DITHER);
}
return mPaint;
}
int mTargetDensity = DisplayMetrics.DENSITY_DEFAULT;
NinePatchState(NinePatch ninePatch, Rect padding) {
- this(ninePatch, padding, false);
+ this(ninePatch, padding, DEFAULT_DITHER);
}
NinePatchState(NinePatch ninePatch, Rect rect, boolean dither) {
* @attr ref android.R.styleable#DrawableStates_state_pressed
*/
public class StateListDrawable extends DrawableContainer {
+ /**
+ * To be proper, we should have a getter for dither (and alpha, etc.)
+ * so that proxy classes like this can save/restore their delegates'
+ * values, but we don't have getters. Since we do have setters
+ * (e.g. setDither), which this proxy forwards on, we have to have some
+ * default/initial setting.
+ *
+ * The initial setting for dither is now true, since it almost always seems
+ * to improve the quality at negligible cost.
+ */
+ private static final boolean DEFAULT_DITHER = true;
private final StateListState mStateListState;
private boolean mMutated;
mStateListState.setConstantSize(a.getBoolean(
com.android.internal.R.styleable.StateListDrawable_constantSize, false));
- setDither(a.getBoolean(com.android.internal.R.styleable.StateListDrawable_dither, false));
+ setDither(a.getBoolean(com.android.internal.R.styleable.StateListDrawable_dither,
+ DEFAULT_DITHER));
a.recycle();