diff -r 395ef682ad1a prism-j2d/src/com/sun/prism/j2d/J2DResourceFactory.java
--- a/prism-j2d/src/com/sun/prism/j2d/J2DResourceFactory.java	Thu Jul 21 13:38:28 2011 -0700
+++ b/prism-j2d/src/com/sun/prism/j2d/J2DResourceFactory.java	Thu Jul 21 14:13:58 2011 -0700
@@ -102,8 +102,8 @@
             case BYTE_GRAY:
             case INT_ARGB_PRE:
             case BYTE_BGRA_PRE:
+            case BYTE_ALPHA:
                 return true;
-            case BYTE_ALPHA:
             case BYTE_APPLE_422:
             case MULTI_YCbCr_420:
             case FLOAT_XYZW:
diff -r 395ef682ad1a prism-j2d/src/com/sun/prism/j2d/J2DTexture.java
--- a/prism-j2d/src/com/sun/prism/j2d/J2DTexture.java	Thu Jul 21 13:38:28 2011 -0700
+++ b/prism-j2d/src/com/sun/prism/j2d/J2DTexture.java	Thu Jul 21 14:13:58 2011 -0700
@@ -10,6 +10,9 @@
 import com.sun.prism.Texture;
 import com.sun.prism.Texture.WrapMode;
 import java.awt.image.BufferedImage;
+import java.awt.image.ColorModel;
+import java.awt.image.DirectColorModel;
+import java.awt.image.WritableRaster;
 import java.nio.Buffer;
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
@@ -40,10 +43,20 @@
                 type = BufferedImage.TYPE_INT_ARGB_PRE;
                 updater = IntArgbPreUpdater.INT_ARGB_PRE_INSTANCE;
                 break;
+            case BYTE_ALPHA:
+                type = BufferedImage.TYPE_CUSTOM;
+                ColorModel cm = new DirectColorModel(8, 0, 0, 0, 0xff);
+                WritableRaster raster = cm.createCompatibleWritableRaster(w, h);
+                bimg = new BufferedImage(cm, raster, false, null);
+                updater = ByteAlphaUpdater.BYTE_ALPHA_INSTANCE;
+                break;
             default:
                 throw new InternalError("Unrecognized PixelFormat ("+format+")!");
         }
-        bimg = new BufferedImage(w, h, type);
+
+        if (type != BufferedImage.TYPE_CUSTOM) {
+            bimg = new BufferedImage(w, h, type);
+        }
     }
 
     public void dispose() {
@@ -63,6 +76,8 @@
                 return PixelFormat.BYTE_GRAY;
             case BufferedImage.TYPE_INT_ARGB_PRE:
                 return PixelFormat.INT_ARGB_PRE;
+            case BufferedImage.TYPE_CUSTOM:
+                return PixelFormat.BYTE_ALPHA;
             default:
                 throw new InternalError("Unrecognized BufferedImage type ("+bimg.getType()+")!");
         }
@@ -164,6 +179,12 @@
                                              srcw, srch, srcscan,
                                              2, 1, 0, 3, 4, true);
                 return;
+            case BYTE_ALPHA:
+                updater.updateFromByteBuffer(bimg, (ByteBuffer) buffer,
+                                             dstx, dsty,
+                                             srcw, srch, srcscan,
+                                             0, 0, 0, 0, 1, false);
+                return;
             default:
                 throw new UnsupportedOperationException("Pixel format "+format+" not supported yet.");
         }
@@ -450,4 +471,51 @@
             }
         }
     }
+
+    static class ByteAlphaUpdater extends Updater {
+        static ByteAlphaUpdater BYTE_ALPHA_INSTANCE =
+            new ByteAlphaUpdater();
+
+        private ByteAlphaUpdater() {}
+
+        @Override
+        void updateFromByteBuffer(BufferedImage bimg, ByteBuffer bbuf,
+                                  int dstx, int dsty,
+                                  int srcw, int srch, int srcscan,
+                                  int roff, int goff, int boff, int aoff,
+                                  int pstride, boolean ispremult)
+        {
+            byte dstbuf[] = ((java.awt.image.DataBufferByte)
+                             bimg.getRaster().getDataBuffer()).getData();
+            int dstscan = bimg.getWidth();
+            int dstoffset = dsty * dstscan + dstx;
+            byte srcbuf[];
+            int srcoffset;
+            if (bbuf.hasArray()) {
+                srcbuf = bbuf.array();
+                srcoffset = bbuf.arrayOffset();
+            } else {
+                srcbuf = new byte[srcw * pstride];
+                srcoffset = 0;
+            }
+            srcscan -= pstride * srcw;
+            dstscan -= srcw;
+            for (int sy = 0; sy < srch; sy++) {
+                if (!bbuf.hasArray()) {
+                    bbuf.get(srcbuf);
+                    if (srcscan != 0) {
+                        bbuf.position(bbuf.position() + srcscan);
+                    }
+                    srcoffset = 0;
+                }
+                for (int sx = 0; sx < srcw; sx++) {
+                    dstbuf[dstoffset] = srcbuf[srcoffset + aoff];
+                    srcoffset += pstride;
+                    dstoffset++;
+                }
+                srcoffset += srcscan;
+                dstoffset += dstscan;
+            }
+        }
+    }
 }
