diff --git a/libs/hwui/AssetAtlas.cpp b/libs/hwui/AssetAtlas.cpp
index cf8cc97..d8c9071 100644
--- a/libs/hwui/AssetAtlas.cpp
+++ b/libs/hwui/AssetAtlas.cpp
@@ -14,14 +14,10 @@
  * limitations under the License.
  */
 
-#define LOG_TAG "OpenGLRenderer"
-
 #include "AssetAtlas.h"
 
 #include <GLES2/gl2ext.h>
 
-#include <utils/Log.h>
-
 namespace android {
 namespace uirenderer {
 
@@ -30,41 +26,26 @@
 ///////////////////////////////////////////////////////////////////////////////
 
 void AssetAtlas::init(sp<GraphicBuffer> buffer, int* map, int count) {
-    if (mImage != EGL_NO_IMAGE_KHR) {
+    if (mImage) {
         return;
     }
 
-    // Create the EGLImage object that maps the GraphicBuffer
-    EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
-    EGLClientBuffer clientBuffer = (EGLClientBuffer) buffer->getNativeBuffer();
-    EGLint attrs[] = { EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE };
+    mImage = new Image(buffer);
+    mTexture = mImage->getTexture();
 
-    mImage = eglCreateImageKHR(display, EGL_NO_CONTEXT,
-            EGL_NATIVE_BUFFER_ANDROID, clientBuffer, attrs);
+    if (mTexture) {
+        mWidth = buffer->getWidth();
+        mHeight = buffer->getHeight();
 
-    if (mImage == EGL_NO_IMAGE_KHR) {
-        ALOGW("Error creating atlas image (%#x)", eglGetError());
-        return;
+        createEntries(map, count);
+    } else {
+        delete mImage;
     }
-
-    // Create a 2D texture to sample from the EGLImage
-    glGenTextures(1, &mTexture);
-    glBindTexture(GL_TEXTURE_2D, mTexture);
-    glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, mImage);
-
-    mWidth = buffer->getWidth();
-    mHeight = buffer->getHeight();
-
-    createEntries(map, count);
 }
 
 void AssetAtlas::terminate() {
-    if (mImage != EGL_NO_IMAGE_KHR) {
-        eglDestroyImageKHR(eglGetDisplay(EGL_DEFAULT_DISPLAY), mImage);
-        mImage = EGL_NO_IMAGE_KHR;
-
-        glDeleteTextures(1, &mTexture);
-        mTexture = 0;
+    if (mImage) {
+        delete mImage;
 
         for (size_t i = 0; i < mEntries.size(); i++) {
             delete mEntries.valueAt(i);
diff --git a/libs/hwui/AssetAtlas.h b/libs/hwui/AssetAtlas.h
index 4ede716..0bbd2a7 100644
--- a/libs/hwui/AssetAtlas.h
+++ b/libs/hwui/AssetAtlas.h
@@ -19,9 +19,6 @@
 
 #include <GLES2/gl2.h>
 
-#include <EGL/egl.h>
-#include <EGL/eglext.h>
-
 #include <ui/GraphicBuffer.h>
 
 #include <utils/KeyedVector.h>
@@ -30,6 +27,7 @@
 
 #include <SkBitmap.h>
 
+#include "Image.h"
 #include "Texture.h"
 #include "UvMapper.h"
 
@@ -92,7 +90,7 @@
         friend class AssetAtlas;
     };
 
-    AssetAtlas(): mWidth(0), mHeight(0), mTexture(0), mImage(EGL_NO_IMAGE_KHR) { }
+    AssetAtlas(): mWidth(0), mHeight(0), mTexture(0), mImage(NULL) { }
     ~AssetAtlas() { terminate(); }
 
     /**
@@ -160,7 +158,7 @@
     uint32_t mHeight;
 
     GLuint mTexture;
-    EGLImageKHR mImage;
+    Image* mImage;
 
     KeyedVector<SkBitmap*, Entry*> mEntries;
 }; // class AssetAtlas
diff --git a/libs/hwui/Image.h b/libs/hwui/Image.h
new file mode 100644
index 0000000..3f2978f
--- /dev/null
+++ b/libs/hwui/Image.h
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+
+#ifndef ANDROID_HWUI_IMAGE_H
+#define ANDROID_HWUI_IMAGE_H
+
+#define LOG_TAG "OpenGLRenderer"
+
+#include <EGL/egl.h>
+#include <EGL/eglext.h>
+
+#include <GLES2/gl2.h>
+#include <GLES2/gl2ext.h>
+
+#include <ui/GraphicBuffer.h>
+
+#include <utils/Log.h>
+
+namespace android {
+namespace uirenderer {
+
+/**
+ * A simple wrapper that creates an EGLImage and a texture for a GraphicBuffer.
+ */
+class Image {
+public:
+    /**
+     * Creates a new image from the specified graphic buffer. If the image
+     * cannot be created, getTexture() will return 0 and getImage() will
+     * return EGL_NO_IMAGE_KHR.
+     */
+    Image(sp<GraphicBuffer> buffer) {
+        // Create the EGLImage object that maps the GraphicBuffer
+        EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+        EGLClientBuffer clientBuffer = (EGLClientBuffer) buffer->getNativeBuffer();
+        EGLint attrs[] = { EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE };
+
+        mImage = eglCreateImageKHR(display, EGL_NO_CONTEXT,
+                EGL_NATIVE_BUFFER_ANDROID, clientBuffer, attrs);
+
+        if (mImage == EGL_NO_IMAGE_KHR) {
+            ALOGW("Error creating image (%#x)", eglGetError());
+            mTexture = 0;
+        } else {
+            // Create a 2D texture to sample from the EGLImage
+            glGenTextures(1, &mTexture);
+            glBindTexture(GL_TEXTURE_2D, mTexture);
+            glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, mImage);
+
+            GLenum status = GL_NO_ERROR;
+            while ((status = glGetError()) != GL_NO_ERROR) {
+                ALOGW("Error creating image (%#x)", status);
+            }
+        }
+    }
+
+    ~Image() {
+        if (mImage != EGL_NO_IMAGE_KHR) {
+            eglDestroyImageKHR(eglGetDisplay(EGL_DEFAULT_DISPLAY), mImage);
+            mImage = EGL_NO_IMAGE_KHR;
+
+            glDeleteTextures(1, &mTexture);
+            mTexture = 0;
+        }
+    }
+
+    /**
+     * Returns the name of the GL texture that can be used to sample
+     * from this image.
+     */
+    GLuint getTexture() const {
+        return mTexture;
+    }
+
+    /**
+     * Returns the name of the EGL image represented by this object.
+     */
+    EGLImageKHR getImage() const {
+        return mImage;
+    }
+
+private:
+    GLuint mTexture;
+    EGLImageKHR mImage;
+}; // class Image
+
+}; // namespace uirenderer
+}; // namespace android
+
+#endif // ANDROID_HWUI_IMAGE_H
