Various cleanups in the drag viz code.

Most importantly:
- Don't allocate a new Paint object in CellLayout.onDraw
- Scale holographic outlines based on the screen density
diff --git a/src/com/android/launcher2/CellLayout.java b/src/com/android/launcher2/CellLayout.java
index c9be887..d94bacf 100644
--- a/src/com/android/launcher2/CellLayout.java
+++ b/src/com/android/launcher2/CellLayout.java
@@ -49,6 +49,8 @@
 import android.view.animation.DecelerateInterpolator;
 import android.view.animation.LayoutAnimationController;
 
+import java.util.Arrays;
+
 public class CellLayout extends ViewGroup implements Dimmable {
     static final String TAG = "CellLayout";
 
@@ -107,6 +109,7 @@
 
     // Used as an index into the above 3 arrays; indicates which is the most current value.
     private int mDragOutlineCurrent = 0;
+    private final Paint mDragOutlinePaint = new Paint();
 
     private Drawable mCrosshairsDrawable = null;
     private InterruptibleInOutAnimator mCrosshairsAnimator = null;
@@ -188,7 +191,7 @@
         mCrosshairsAnimator.getAnimator().addUpdateListener(new AnimatorUpdateListener() {
             public void onAnimationUpdate(ValueAnimator animation) {
                 mCrosshairsVisibility = ((Float) animation.getAnimatedValue()).floatValue();
-                CellLayout.this.invalidate();
+                invalidate();
             }
         });
         mCrosshairsAnimator.getAnimator().setInterpolator(mEaseOutInterpolator);
@@ -205,9 +208,7 @@
         final float fromAlphaValue = 0;
         final float toAlphaValue = (float)res.getInteger(R.integer.config_dragOutlineMaxAlpha);
 
-        for (int i = 0; i < mDragOutlineAlphas.length; i++) {
-            mDragOutlineAlphas[i] = fromAlphaValue;
-        }
+        Arrays.fill(mDragOutlineAlphas, fromAlphaValue);
 
         for (int i = 0; i < mDragOutlineAnims.length; i++) {
             final InterruptibleInOutAnimator anim =
@@ -404,7 +405,7 @@
             }
         }
 
-        final Paint paint = new Paint();
+        final Paint paint = mDragOutlinePaint;
         for (int i = 0; i < mDragOutlines.length; i++) {
             final float alpha = mDragOutlineAlphas[i];
             if (alpha > 0) {
diff --git a/src/com/android/launcher2/HolographicOutlineHelper.java b/src/com/android/launcher2/HolographicOutlineHelper.java
index ea4b01a..bca3f71 100644
--- a/src/com/android/launcher2/HolographicOutlineHelper.java
+++ b/src/com/android/launcher2/HolographicOutlineHelper.java
@@ -23,7 +23,6 @@
 import android.graphics.Paint;
 import android.graphics.PorterDuff;
 import android.graphics.PorterDuffXfermode;
-import android.graphics.Rect;
 import android.graphics.TableMaskFilter;
 
 public class HolographicOutlineHelper {
@@ -31,19 +30,24 @@
     private final Paint mBlurPaint = new Paint();
     private final Paint mErasePaint = new Paint();
 
-    private static final BlurMaskFilter sLargeGlowBlurMaskFilter = new BlurMaskFilter(
-            10.0f, BlurMaskFilter.Blur.OUTER);
-    private static final BlurMaskFilter sThickOuterBlurMaskFilter = new BlurMaskFilter(
-            6.0f, BlurMaskFilter.Blur.OUTER);
-    private static final BlurMaskFilter sMediumOuterBlurMaskFilter = new BlurMaskFilter(
-            2.0f, BlurMaskFilter.Blur.OUTER);
-    private static final BlurMaskFilter sThinOuterBlurMaskFilter = new BlurMaskFilter(
-            1.0f, BlurMaskFilter.Blur.OUTER);
+    public static final int OUTER_BLUR_RADIUS;
 
-    private static final BlurMaskFilter sThickInnerBlurMaskFilter = new BlurMaskFilter(
-            4.0f, BlurMaskFilter.Blur.NORMAL);
-    private static final BlurMaskFilter sThinInnerBlurMaskFilter = new BlurMaskFilter(
-            1.0f, BlurMaskFilter.Blur.INNER);
+    private static final BlurMaskFilter sThickOuterBlurMaskFilter;
+    private static final BlurMaskFilter sMediumOuterBlurMaskFilter;
+    private static final BlurMaskFilter sThinOuterBlurMaskFilter;
+    private static final BlurMaskFilter sThickInnerBlurMaskFilter;
+
+    static {
+        final float scale = LauncherApplication.getScreenDensity();
+
+        OUTER_BLUR_RADIUS = (int) (scale * 6.0f);
+
+        sThickOuterBlurMaskFilter = new BlurMaskFilter(OUTER_BLUR_RADIUS,
+                BlurMaskFilter.Blur.OUTER);
+        sMediumOuterBlurMaskFilter = new BlurMaskFilter(scale * 2.0f, BlurMaskFilter.Blur.OUTER);
+        sThinOuterBlurMaskFilter = new BlurMaskFilter(scale * 1.0f, BlurMaskFilter.Blur.OUTER);
+        sThickInnerBlurMaskFilter = new BlurMaskFilter(scale * 4.0f, BlurMaskFilter.Blur.NORMAL);
+    }
 
     private static final MaskFilter sFineClipTable = TableMaskFilter.CreateClipTable(0, 20);
     private static final MaskFilter sCoarseClipTable = TableMaskFilter.CreateClipTable(0, 200);
@@ -81,7 +85,12 @@
         }
     }
 
-    void applyGlow(Bitmap bitmap, Canvas canvas, int color) {
+    /**
+     * Apply an outer blur to the given bitmap.
+     * You should use OUTER_BLUR_RADIUS to ensure that the bitmap is big enough to draw
+     * the blur without clipping.
+     */
+    void applyOuterBlur(Bitmap bitmap, Canvas canvas, int color) {
         mBlurPaint.setMaskFilter(sThickOuterBlurMaskFilter);
         Bitmap glow = bitmap.extractAlpha(mBlurPaint, mTempOffset);
 
diff --git a/src/com/android/launcher2/LauncherApplication.java b/src/com/android/launcher2/LauncherApplication.java
index ca08378..8a18317 100644
--- a/src/com/android/launcher2/LauncherApplication.java
+++ b/src/com/android/launcher2/LauncherApplication.java
@@ -29,6 +29,7 @@
     public LauncherModel mModel;
     public IconCache mIconCache;
     private static boolean sIsScreenXLarge;
+    private static float sScreenDensity;
     private static final boolean ENABLE_ROTATION = false;
 
     @Override
@@ -40,6 +41,7 @@
         mIconCache = new IconCache(this);
         mModel = new LauncherModel(this, mIconCache);
         sIsScreenXLarge = (getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_XLARGE;
+        sScreenDensity = getResources().getDisplayMetrics().density;
 
         // Register intent receivers
         IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED);
@@ -101,4 +103,8 @@
     public static boolean isScreenXLarge() {
         return sIsScreenXLarge;
     }
+
+    public static float getScreenDensity() {
+        return sScreenDensity;
+    }
 }
diff --git a/src/com/android/launcher2/Workspace.java b/src/com/android/launcher2/Workspace.java
index dd622a6..d123374 100644
--- a/src/com/android/launcher2/Workspace.java
+++ b/src/com/android/launcher2/Workspace.java
@@ -139,10 +139,10 @@
 
     private boolean mInScrollArea = false;
 
-    private HolographicOutlineHelper mOutlineHelper = new HolographicOutlineHelper();
+    private final HolographicOutlineHelper mOutlineHelper = new HolographicOutlineHelper();
     private Bitmap mDragOutline = null;
-    private Rect mTempRect = new Rect();
-    private int[] mTempXY = new int[2];
+    private final Rect mTempRect = new Rect();
+    private final int[] mTempXY = new int[2];
 
     /**
      * Used to inflate the Workspace from XML.
@@ -991,14 +991,13 @@
         canvas.setBitmap(b);
         canvas.drawBitmap(mDragOutline, 0, 0, null);
         drawDragView(v, canvas, padding);
-        mOutlineHelper.applyGlow(b, canvas, outlineColor);
+        mOutlineHelper.applyOuterBlur(b, canvas, outlineColor);
 
         return b;
     }
 
     void startDrag(CellLayout.CellInfo cellInfo) {
         View child = cellInfo.cell;
-        final int blurPadding = 40;
 
         // Make sure the drag was started by a long press as opposed to a long click.
         if (!child.isInTouchMode()) {
@@ -1017,11 +1016,14 @@
 
         final Canvas canvas = new Canvas();
 
+        // We need to add extra padding to the bitmap to make room for the glow effect
+        final int bitmapPadding = HolographicOutlineHelper.OUTER_BLUR_RADIUS;
+
         // The outline is used to visualize where the item will land if dropped
-        mDragOutline = createDragOutline(child, canvas, blurPadding);
+        mDragOutline = createDragOutline(child, canvas, bitmapPadding);
 
         // The drag bitmap follows the touch point around on the screen
-        final Bitmap b = createDragBitmap(child, canvas, blurPadding);
+        final Bitmap b = createDragBitmap(child, canvas, bitmapPadding);
 
         final int bmpWidth = b.getWidth();
         final int bmpHeight = b.getHeight();