start rewriting rollo so it's a little more parameterized.
diff --git a/src/com/android/launcher2/AllAppsView.java b/src/com/android/launcher2/AllAppsView.java
index 7bf0c7c..0a522ae 100644
--- a/src/com/android/launcher2/AllAppsView.java
+++ b/src/com/android/launcher2/AllAppsView.java
@@ -243,6 +243,12 @@
         public static final int STATE_COUNT = 8;
         public static final int STATE_TOUCH = 9;
 
+        static final int ALLOC_PARAMS = 0;
+        static final int ALLOC_STATE = 1;
+        static final int ALLOC_SCRATCH = 2;
+        static final int ALLOC_ICON_IDS = 3;
+        static final int ALLOC_LABEL_IDS = 4;
+
         public RolloRS() {
         }
 
@@ -291,6 +297,7 @@
         private Sampler mSamplerText;
         private ProgramStore mPSBackground;
         private ProgramStore mPSText;
+        private ProgramFragment mPFDebug;
         private ProgramFragment mPFImages;
         private ProgramFragment mPFText;
         private ProgramVertex mPV;
@@ -312,6 +319,18 @@
         private int[] mAllocScratchBuf;
         private Allocation mAllocScratch;
 
+        Params mParams;
+
+        class Params extends IntAllocation {
+            Params(RenderScript rs) {
+                super(rs);
+            }
+            @AllocationIndex(0) public int bubbleWidth;
+            @AllocationIndex(1) public int bubbleHeight;
+            @AllocationIndex(2) public int bubbleBitmapWidth;
+            @AllocationIndex(3) public int bubbleBitmapHeight;
+        }
+
         private void initNamed() {
             Sampler.Builder sb = new Sampler.Builder(mRS);
             sb.setMin(Sampler.Value.LINEAR);//_MIP_LINEAR);
@@ -324,6 +343,9 @@
             sb.setMag(Sampler.Value.NEAREST);
             mSamplerText = sb.create();
 
+            ProgramFragment.Builder dbg = new ProgramFragment.Builder(mRS, null, null);
+            mPFDebug = dbg.create();
+            mPFDebug.setName("PFDebug");
 
             ProgramFragment.Builder bf = new ProgramFragment.Builder(mRS, null, null);
             bf.setTexEnable(true, 0);
@@ -380,6 +402,8 @@
         }
         
         private void initIcons(int count) {
+            mParams = new Params(mRS);
+
             mIcons = new Allocation[count];
             mAllocIconIDBuf = new int[count];
             mAllocIconID = Allocation.createSized(mRS,
@@ -394,6 +418,12 @@
 
             final Utilities.BubbleText bubble = new Utilities.BubbleText(getContext());
 
+            mParams.bubbleWidth = bubble.getBubbleWidth();
+            mParams.bubbleHeight = bubble.getMaxBubbleHeight();
+            mParams.bubbleBitmapWidth = bubble.getBitmapWidth();
+            mParams.bubbleBitmapHeight = bubble.getBitmapHeight();
+            mParams.save();
+
             for (int i=0; i<count; i++) {
                 mIcons[i] = Allocation.createFromBitmapResource(
                         mRS, mRes, R.raw.maps, ie8888, true);
@@ -430,10 +460,12 @@
             mAllocStateBuf = new int[] {0, 0, 0, 8, 0, 0, -1, 0, mAllocIconIDBuf.length, 0, 0};
             mAllocState = Allocation.createSized(mRS,
                 Element.USER_I32, mAllocStateBuf.length);
-            mScript.bindAllocation(mAllocState, 0);
-            mScript.bindAllocation(mAllocIconID, 1);
-            mScript.bindAllocation(mAllocScratch, 2);
-            mScript.bindAllocation(mAllocLabelID, 3);
+
+            mScript.bindAllocation(mParams.getAllocation(), ALLOC_PARAMS);
+            mScript.bindAllocation(mAllocState, ALLOC_STATE);
+            mScript.bindAllocation(mAllocIconID, ALLOC_ICON_IDS);
+            mScript.bindAllocation(mAllocScratch, ALLOC_SCRATCH);
+            mScript.bindAllocation(mAllocLabelID, ALLOC_LABEL_IDS);
             setPosition(0);
             setZoom(1);
 
diff --git a/src/com/android/launcher2/AllocationIndex.java b/src/com/android/launcher2/AllocationIndex.java
new file mode 100644
index 0000000..0202db5
--- /dev/null
+++ b/src/com/android/launcher2/AllocationIndex.java
@@ -0,0 +1,37 @@
+/*
+ * 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.launcher2;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Annotate fields of a subclass of {@link IntAllocaiton} or
+ * FloatAllocation with this, and the save() method on those
+ * those classes will find the field an save it.
+ * <p>
+ * TODO: This would be even better if the allocations were
+ * named, and renderscript automatically added them into to
+ * the renderscript namespace.
+ */
+@Retention(RetentionPolicy.RUNTIME)
+public @interface AllocationIndex {
+    /**
+     * The index in the allocation to use inside renderscript.
+     */
+    int value();
+}
diff --git a/src/com/android/launcher2/IntAllocation.java b/src/com/android/launcher2/IntAllocation.java
new file mode 100644
index 0000000..3d96c5e
--- /dev/null
+++ b/src/com/android/launcher2/IntAllocation.java
@@ -0,0 +1,67 @@
+/*
+ * 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.launcher2;
+
+import android.renderscript.Allocation;
+import android.renderscript.Element;
+import android.renderscript.RenderScript;
+
+import java.lang.reflect.Field;
+
+public class IntAllocation {
+    private RenderScript mRS;
+    private int[] mBuffer;
+    private Allocation mAlloc;
+
+    public IntAllocation(RenderScript rs) {
+        mRS = rs;
+    }
+
+    public void save() {
+        Field[] fields = this.getClass().getFields();
+        if (mBuffer == null) {
+            int maxIndex = 0;
+            for (Field f: fields) {
+                AllocationIndex index = f.getAnnotation(AllocationIndex.class);
+                if (index != null) {
+                    int value = index.value();
+                    if (value > maxIndex) {
+                        maxIndex = value;
+                    }
+                }
+            }
+            mBuffer = new int[maxIndex+1];
+            mAlloc = Allocation.createSized(mRS, Element.USER_I32, mBuffer.length);
+        }
+        int[] buf = mBuffer;
+        for (Field f: fields) {
+            AllocationIndex index = f.getAnnotation(AllocationIndex.class);
+            if (index != null) {
+                try {
+                    buf[index.value()] = f.getInt(this);
+                } catch (IllegalAccessException ex) {
+                    throw new RuntimeException(ex);
+                }
+            }
+        }
+        mAlloc.data(buf);
+    }
+
+    Allocation getAllocation() {
+        return mAlloc;
+    }
+}
diff --git a/src/com/android/launcher2/Utilities.java b/src/com/android/launcher2/Utilities.java
index c710615..9e715d1 100644
--- a/src/com/android/launcher2/Utilities.java
+++ b/src/com/android/launcher2/Utilities.java
@@ -234,7 +234,7 @@
             final float paddingRight = 5.0f * scale;
             final float cellWidth = resources.getDimension(R.dimen.workspace_cell_width);
             final float bubbleWidth = cellWidth - paddingLeft - paddingRight;
-            mBubblePadding = 5.0f * scale;
+            mBubblePadding = 3.0f * scale;
 
             RectF bubbleRect = mBubbleRect;
             bubbleRect.left = 0;
@@ -245,27 +245,29 @@
             mTextWidth = bubbleWidth - mBubblePadding - mBubblePadding;
 
             Paint rectPaint = mRectPaint = new Paint();
-            rectPaint.setColor(0xff000000);
+            rectPaint.setColor(0xaa000000);
+            rectPaint.setAntiAlias(true);
 
             TextPaint textPaint = mTextPaint = new TextPaint();
             textPaint.setTypeface(Typeface.DEFAULT_BOLD);
             textPaint.setTextSize(20);
             textPaint.setColor(0xffffffff);
+            textPaint.setAntiAlias(true);
 
             float ascent = -textPaint.ascent();
             float descent = textPaint.descent();
-            float leading = (ascent+descent) * 0.1f;
+            float leading = 0.0f;//(ascent+descent) * 0.1f;
             mLeading = (int)(leading + 0.5f);
             mFirstLineY = (int)(leading + ascent + 0.5f);
             mLineHeight = (int)(leading + ascent + descent + 0.5f);
 
             roundToPow2(64);
             mBitmapWidth = roundToPow2((int)(mBubbleRect.width() + 0.5f));
-            mBitmapHeight = roundToPow2((int)((MAX_LINES * mLineHeight) + mLeading + 0.5f));
+            mBitmapHeight = roundToPow2((int)((MAX_LINES * mLineHeight) + leading + 0.5f));
 
             Log.d(Launcher.LOG_TAG, "mBitmapWidth=" + mBitmapWidth + " mBitmapHeight="
                     + mBitmapHeight + " w=" + ((int)(mBubbleRect.width() + 0.5f))
-                    + " h=" + ((int)((MAX_LINES * mLineHeight) + mLeading + 0.5f)));
+                    + " h=" + ((int)((MAX_LINES * mLineHeight) + leading + 0.5f)));
         }
 
         /** You own the bitmap after this and you must call recycle on it. */
@@ -281,9 +283,8 @@
             }
             if (lineCount > 0) {
                 RectF bubbleRect = mBubbleRect;
-                bubbleRect.bottom = (int)((lineCount * mLineHeight) + mLeading + mLeading + 0.0f);
+                bubbleRect.bottom = height(lineCount);
                 c.drawRoundRect(bubbleRect, mCornerRadius, mCornerRadius, mRectPaint);
-                Log.d(Launcher.LOG_TAG, "bubbleRect=" + bubbleRect);
             }
             for (int i=0; i<lineCount; i++) {
                 int x = (int)((mBubbleRect.width() - layout.getLineMax(i)) / 2.0f);
@@ -294,6 +295,26 @@
 
             return b;
         }
+
+        private int height(int lineCount) {
+            return (int)((lineCount * mLineHeight) + mLeading + mLeading + 0.0f);
+        }
+
+        int getBubbleWidth() {
+            return (int)(mBubbleRect.width() + 0.5f);
+        }
+
+        int getMaxBubbleHeight() {
+            return height(MAX_LINES);
+        }
+
+        int getBitmapWidth() {
+            return mBitmapWidth;
+        }
+
+        int getBitmapHeight() {
+            return mBitmapHeight;
+        }
     }
 
     /** Only works for positive numbers. */