Bitmap.cpp revision 59eecb526adc5bd7041e7b6147bfcc40dd2c200e
1163f88140e18f13575886e88af0336e0ab1ec846sergeyv/*
2163f88140e18f13575886e88af0336e0ab1ec846sergeyv * Copyright (C) 2015 The Android Open Source Project
3163f88140e18f13575886e88af0336e0ab1ec846sergeyv *
4163f88140e18f13575886e88af0336e0ab1ec846sergeyv * Licensed under the Apache License, Version 2.0 (the "License");
5163f88140e18f13575886e88af0336e0ab1ec846sergeyv * you may not use this file except in compliance with the License.
6163f88140e18f13575886e88af0336e0ab1ec846sergeyv * You may obtain a copy of the License at
7163f88140e18f13575886e88af0336e0ab1ec846sergeyv *
8163f88140e18f13575886e88af0336e0ab1ec846sergeyv *      http://www.apache.org/licenses/LICENSE-2.0
9163f88140e18f13575886e88af0336e0ab1ec846sergeyv *
10163f88140e18f13575886e88af0336e0ab1ec846sergeyv * Unless required by applicable law or agreed to in writing, software
11163f88140e18f13575886e88af0336e0ab1ec846sergeyv * distributed under the License is distributed on an "AS IS" BASIS,
12163f88140e18f13575886e88af0336e0ab1ec846sergeyv * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13163f88140e18f13575886e88af0336e0ab1ec846sergeyv * See the License for the specific language governing permissions and
14163f88140e18f13575886e88af0336e0ab1ec846sergeyv * limitations under the License.
15163f88140e18f13575886e88af0336e0ab1ec846sergeyv */
16c1c54062f8cc9d47bdea820ae5ab6aef260b4488sergeyv#include "Bitmap.h"
17163f88140e18f13575886e88af0336e0ab1ec846sergeyv
18163f88140e18f13575886e88af0336e0ab1ec846sergeyv#include "Caches.h"
19694d499662838123f474f41b31dea84ec5d563f0sergeyv#include "renderthread/RenderThread.h"
20694d499662838123f474f41b31dea84ec5d563f0sergeyv#include "renderthread/RenderProxy.h"
21163f88140e18f13575886e88af0336e0ab1ec846sergeyv
22163f88140e18f13575886e88af0336e0ab1ec846sergeyv#include <cutils/log.h>
23163f88140e18f13575886e88af0336e0ab1ec846sergeyv#include <sys/mman.h>
24163f88140e18f13575886e88af0336e0ab1ec846sergeyv#include <cutils/ashmem.h>
25163f88140e18f13575886e88af0336e0ab1ec846sergeyv
26694d499662838123f474f41b31dea84ec5d563f0sergeyv#include <GLES2/gl2.h>
27694d499662838123f474f41b31dea84ec5d563f0sergeyv#include <GLES2/gl2ext.h>
28694d499662838123f474f41b31dea84ec5d563f0sergeyv#include <EGL/egl.h>
29694d499662838123f474f41b31dea84ec5d563f0sergeyv#include <EGL/eglext.h>
30694d499662838123f474f41b31dea84ec5d563f0sergeyv
31694d499662838123f474f41b31dea84ec5d563f0sergeyv
32694d499662838123f474f41b31dea84ec5d563f0sergeyv#include <gui/IGraphicBufferAlloc.h>
33694d499662838123f474f41b31dea84ec5d563f0sergeyv#include <gui/ISurfaceComposer.h>
34694d499662838123f474f41b31dea84ec5d563f0sergeyv#include <private/gui/ComposerService.h>
35694d499662838123f474f41b31dea84ec5d563f0sergeyv#include <binder/IServiceManager.h>
36694d499662838123f474f41b31dea84ec5d563f0sergeyv#include <ui/PixelFormat.h>
37694d499662838123f474f41b31dea84ec5d563f0sergeyv
38694d499662838123f474f41b31dea84ec5d563f0sergeyv#include <SkCanvas.h>
39694d499662838123f474f41b31dea84ec5d563f0sergeyv
40163f88140e18f13575886e88af0336e0ab1ec846sergeyvnamespace android {
41163f88140e18f13575886e88af0336e0ab1ec846sergeyv
42fc9999505a36c66892d7ccce85187936105f4f36sergeyvstatic bool computeAllocationSize(size_t rowBytes, int height, size_t* size) {
43fc9999505a36c66892d7ccce85187936105f4f36sergeyv    int32_t rowBytes32 = SkToS32(rowBytes);
44fc9999505a36c66892d7ccce85187936105f4f36sergeyv    int64_t bigSize = (int64_t) height * rowBytes32;
45c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv    if (rowBytes32 < 0 || !sk_64_isS32(bigSize)) {
46c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv        return false; // allocation will be too large
47c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv    }
48c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv
49c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv    *size = sk_64_asS32(bigSize);
50c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv    return true;
51c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv}
52c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv
53c1c54062f8cc9d47bdea820ae5ab6aef260b4488sergeyvtypedef sk_sp<Bitmap> (*AllocPixeRef)(size_t allocSize, const SkImageInfo& info, size_t rowBytes,
54c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv        SkColorTable* ctable);
55c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv
56c1c54062f8cc9d47bdea820ae5ab6aef260b4488sergeyvstatic sk_sp<Bitmap> allocateBitmap(SkBitmap* bitmap, SkColorTable* ctable, AllocPixeRef alloc) {
57c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv    const SkImageInfo& info = bitmap->info();
58c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv    if (info.colorType() == kUnknown_SkColorType) {
59c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv        LOG_ALWAYS_FATAL("unknown bitmap configuration");
60c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv        return nullptr;
61c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv    }
62c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv
63c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv    size_t size;
64c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv
65c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv    // we must respect the rowBytes value already set on the bitmap instead of
66c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv    // attempting to compute our own.
67c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv    const size_t rowBytes = bitmap->rowBytes();
68fc9999505a36c66892d7ccce85187936105f4f36sergeyv    if (!computeAllocationSize(rowBytes, bitmap->height(), &size)) {
69fc9999505a36c66892d7ccce85187936105f4f36sergeyv        return nullptr;
70fc9999505a36c66892d7ccce85187936105f4f36sergeyv    }
71fc9999505a36c66892d7ccce85187936105f4f36sergeyv
72c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv    auto wrapper = alloc(size, info, rowBytes, ctable);
73c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv    if (wrapper) {
74c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv        wrapper->getSkBitmap(bitmap);
75c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv        // since we're already allocated, we lockPixels right away
76c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv        // HeapAllocator behaves this way too
77c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv        bitmap->lockPixels();
78c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv    }
79c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv    return wrapper;
80c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv}
81c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv
82c1c54062f8cc9d47bdea820ae5ab6aef260b4488sergeyvsk_sp<Bitmap> Bitmap::allocateAshmemBitmap(SkBitmap* bitmap, SkColorTable* ctable) {
83c1c54062f8cc9d47bdea820ae5ab6aef260b4488sergeyv   return allocateBitmap(bitmap, ctable, &Bitmap::allocateAshmemBitmap);
84c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv}
85c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv
86fc9999505a36c66892d7ccce85187936105f4f36sergeyvstatic sk_sp<Bitmap> allocateHeapBitmap(size_t size, const SkImageInfo& info, size_t rowBytes,
87c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv        SkColorTable* ctable) {
88c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv    void* addr = calloc(size, 1);
89c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv    if (!addr) {
90c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv        return nullptr;
91c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv    }
92c1c54062f8cc9d47bdea820ae5ab6aef260b4488sergeyv    return sk_sp<Bitmap>(new Bitmap(addr, size, info, rowBytes, ctable));
93c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv}
94c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv
95694d499662838123f474f41b31dea84ec5d563f0sergeyv#define FENCE_TIMEOUT 2000000000
96694d499662838123f474f41b31dea84ec5d563f0sergeyv
97694d499662838123f474f41b31dea84ec5d563f0sergeyv// TODO: handle SRGB sanely
98694d499662838123f474f41b31dea84ec5d563f0sergeyvstatic PixelFormat internalFormatToPixelFormat(GLint internalFormat) {
99694d499662838123f474f41b31dea84ec5d563f0sergeyv    switch (internalFormat) {
100694d499662838123f474f41b31dea84ec5d563f0sergeyv    case GL_ALPHA:
101694d499662838123f474f41b31dea84ec5d563f0sergeyv        return PIXEL_FORMAT_TRANSPARENT;
102694d499662838123f474f41b31dea84ec5d563f0sergeyv    case GL_LUMINANCE:
103694d499662838123f474f41b31dea84ec5d563f0sergeyv        return PIXEL_FORMAT_RGBA_8888;
104694d499662838123f474f41b31dea84ec5d563f0sergeyv    case GL_SRGB8_ALPHA8:
105694d499662838123f474f41b31dea84ec5d563f0sergeyv        return PIXEL_FORMAT_RGBA_8888;
106694d499662838123f474f41b31dea84ec5d563f0sergeyv    case GL_RGBA:
107694d499662838123f474f41b31dea84ec5d563f0sergeyv        return PIXEL_FORMAT_RGBA_8888;
108694d499662838123f474f41b31dea84ec5d563f0sergeyv    default:
109694d499662838123f474f41b31dea84ec5d563f0sergeyv        LOG_ALWAYS_FATAL("Unsupported bitmap colorType: %d", internalFormat);
110694d499662838123f474f41b31dea84ec5d563f0sergeyv        return PIXEL_FORMAT_UNKNOWN;
111694d499662838123f474f41b31dea84ec5d563f0sergeyv    }
112694d499662838123f474f41b31dea84ec5d563f0sergeyv}
113694d499662838123f474f41b31dea84ec5d563f0sergeyv
114694d499662838123f474f41b31dea84ec5d563f0sergeyvclass AutoEglFence {
115694d499662838123f474f41b31dea84ec5d563f0sergeyvpublic:
116694d499662838123f474f41b31dea84ec5d563f0sergeyv    AutoEglFence(EGLDisplay display)
117694d499662838123f474f41b31dea84ec5d563f0sergeyv            : mDisplay(display) {
118694d499662838123f474f41b31dea84ec5d563f0sergeyv        fence = eglCreateSyncKHR(mDisplay, EGL_SYNC_FENCE_KHR, NULL);
119694d499662838123f474f41b31dea84ec5d563f0sergeyv    }
120694d499662838123f474f41b31dea84ec5d563f0sergeyv
121694d499662838123f474f41b31dea84ec5d563f0sergeyv    ~AutoEglFence() {
122694d499662838123f474f41b31dea84ec5d563f0sergeyv        if (fence != EGL_NO_SYNC_KHR) {
123694d499662838123f474f41b31dea84ec5d563f0sergeyv            eglDestroySyncKHR(mDisplay, fence);
124694d499662838123f474f41b31dea84ec5d563f0sergeyv        }
125694d499662838123f474f41b31dea84ec5d563f0sergeyv    }
126694d499662838123f474f41b31dea84ec5d563f0sergeyv
127694d499662838123f474f41b31dea84ec5d563f0sergeyv    EGLSyncKHR fence = EGL_NO_SYNC_KHR;
128694d499662838123f474f41b31dea84ec5d563f0sergeyvprivate:
129694d499662838123f474f41b31dea84ec5d563f0sergeyv    EGLDisplay mDisplay = EGL_NO_DISPLAY;
130694d499662838123f474f41b31dea84ec5d563f0sergeyv};
131694d499662838123f474f41b31dea84ec5d563f0sergeyv
132694d499662838123f474f41b31dea84ec5d563f0sergeyvclass AutoEglImage {
133694d499662838123f474f41b31dea84ec5d563f0sergeyvpublic:
134694d499662838123f474f41b31dea84ec5d563f0sergeyv    AutoEglImage(EGLDisplay display, EGLClientBuffer clientBuffer)
135694d499662838123f474f41b31dea84ec5d563f0sergeyv            : mDisplay(display) {
136694d499662838123f474f41b31dea84ec5d563f0sergeyv        EGLint imageAttrs[] = { EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE };
137694d499662838123f474f41b31dea84ec5d563f0sergeyv        image = eglCreateImageKHR(display, EGL_NO_CONTEXT,
138694d499662838123f474f41b31dea84ec5d563f0sergeyv                EGL_NATIVE_BUFFER_ANDROID, clientBuffer, imageAttrs);
139694d499662838123f474f41b31dea84ec5d563f0sergeyv    }
140694d499662838123f474f41b31dea84ec5d563f0sergeyv
141694d499662838123f474f41b31dea84ec5d563f0sergeyv    ~AutoEglImage() {
142694d499662838123f474f41b31dea84ec5d563f0sergeyv        if (image != EGL_NO_IMAGE_KHR) {
143694d499662838123f474f41b31dea84ec5d563f0sergeyv            eglDestroyImageKHR(mDisplay, image);
144694d499662838123f474f41b31dea84ec5d563f0sergeyv        }
145694d499662838123f474f41b31dea84ec5d563f0sergeyv    }
146694d499662838123f474f41b31dea84ec5d563f0sergeyv
147694d499662838123f474f41b31dea84ec5d563f0sergeyv    EGLImageKHR image = EGL_NO_IMAGE_KHR;
148694d499662838123f474f41b31dea84ec5d563f0sergeyvprivate:
149694d499662838123f474f41b31dea84ec5d563f0sergeyv    EGLDisplay mDisplay = EGL_NO_DISPLAY;
150694d499662838123f474f41b31dea84ec5d563f0sergeyv};
151694d499662838123f474f41b31dea84ec5d563f0sergeyv
152694d499662838123f474f41b31dea84ec5d563f0sergeyvstatic bool uploadBitmapToGraphicBuffer(uirenderer::Caches& caches, SkBitmap& bitmap,
153694d499662838123f474f41b31dea84ec5d563f0sergeyv        GraphicBuffer& buffer, GLint format, GLint type) {
154694d499662838123f474f41b31dea84ec5d563f0sergeyv    SkAutoLockPixels alp(bitmap);
155694d499662838123f474f41b31dea84ec5d563f0sergeyv    EGLDisplay display = eglGetCurrentDisplay();
156694d499662838123f474f41b31dea84ec5d563f0sergeyv    LOG_ALWAYS_FATAL_IF(display == EGL_NO_DISPLAY,
157694d499662838123f474f41b31dea84ec5d563f0sergeyv                "Failed to get EGL_DEFAULT_DISPLAY! err=%s",
158694d499662838123f474f41b31dea84ec5d563f0sergeyv                uirenderer::renderthread::EglManager::eglErrorString());
159694d499662838123f474f41b31dea84ec5d563f0sergeyv    // These objects are initialized below but the default "null"
160694d499662838123f474f41b31dea84ec5d563f0sergeyv    // values are used to cleanup properly at any point in the
161694d499662838123f474f41b31dea84ec5d563f0sergeyv    // initialization sequenc
162694d499662838123f474f41b31dea84ec5d563f0sergeyv    GLuint texture = 0;
163694d499662838123f474f41b31dea84ec5d563f0sergeyv    // We use an EGLImage to access the content of the GraphicBuffer
164694d499662838123f474f41b31dea84ec5d563f0sergeyv    // The EGL image is later bound to a 2D texture
165694d499662838123f474f41b31dea84ec5d563f0sergeyv    EGLClientBuffer clientBuffer = (EGLClientBuffer) buffer.getNativeBuffer();
166694d499662838123f474f41b31dea84ec5d563f0sergeyv    AutoEglImage autoImage(display, clientBuffer);
167694d499662838123f474f41b31dea84ec5d563f0sergeyv    if (autoImage.image == EGL_NO_IMAGE_KHR) {
168694d499662838123f474f41b31dea84ec5d563f0sergeyv        ALOGW("Could not create EGL image, err =%s",
169694d499662838123f474f41b31dea84ec5d563f0sergeyv                uirenderer::renderthread::EglManager::eglErrorString());
170694d499662838123f474f41b31dea84ec5d563f0sergeyv        return false;
171694d499662838123f474f41b31dea84ec5d563f0sergeyv    }
172694d499662838123f474f41b31dea84ec5d563f0sergeyv    glGenTextures(1, &texture);
173694d499662838123f474f41b31dea84ec5d563f0sergeyv    caches.textureState().bindTexture(texture);
174694d499662838123f474f41b31dea84ec5d563f0sergeyv    glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, autoImage.image);
175694d499662838123f474f41b31dea84ec5d563f0sergeyv
176694d499662838123f474f41b31dea84ec5d563f0sergeyv    GL_CHECKPOINT(MODERATE);
177694d499662838123f474f41b31dea84ec5d563f0sergeyv
178694d499662838123f474f41b31dea84ec5d563f0sergeyv    glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, bitmap.width(), bitmap.height(),
179694d499662838123f474f41b31dea84ec5d563f0sergeyv            format, type, bitmap.getPixels());
180694d499662838123f474f41b31dea84ec5d563f0sergeyv
181694d499662838123f474f41b31dea84ec5d563f0sergeyv    GL_CHECKPOINT(MODERATE);
182694d499662838123f474f41b31dea84ec5d563f0sergeyv
183694d499662838123f474f41b31dea84ec5d563f0sergeyv    // The fence is used to wait for the texture upload to finish
184694d499662838123f474f41b31dea84ec5d563f0sergeyv    // properly. We cannot rely on glFlush() and glFinish() as
185694d499662838123f474f41b31dea84ec5d563f0sergeyv    // some drivers completely ignore these API calls
186694d499662838123f474f41b31dea84ec5d563f0sergeyv    AutoEglFence autoFence(display);
187694d499662838123f474f41b31dea84ec5d563f0sergeyv    if (autoFence.fence == EGL_NO_SYNC_KHR) {
188694d499662838123f474f41b31dea84ec5d563f0sergeyv        LOG_ALWAYS_FATAL("Could not create sync fence %#x", eglGetError());
189694d499662838123f474f41b31dea84ec5d563f0sergeyv        return false;
190694d499662838123f474f41b31dea84ec5d563f0sergeyv    }
191694d499662838123f474f41b31dea84ec5d563f0sergeyv    // The flag EGL_SYNC_FLUSH_COMMANDS_BIT_KHR will trigger a
192694d499662838123f474f41b31dea84ec5d563f0sergeyv    // pipeline flush (similar to what a glFlush() would do.)
193694d499662838123f474f41b31dea84ec5d563f0sergeyv    EGLint waitStatus = eglClientWaitSyncKHR(display, autoFence.fence,
194694d499662838123f474f41b31dea84ec5d563f0sergeyv            EGL_SYNC_FLUSH_COMMANDS_BIT_KHR, FENCE_TIMEOUT);
195694d499662838123f474f41b31dea84ec5d563f0sergeyv    if (waitStatus != EGL_CONDITION_SATISFIED_KHR) {
196694d499662838123f474f41b31dea84ec5d563f0sergeyv        LOG_ALWAYS_FATAL("Failed to wait for the fence %#x", eglGetError());
197694d499662838123f474f41b31dea84ec5d563f0sergeyv        return false;
198694d499662838123f474f41b31dea84ec5d563f0sergeyv    }
199694d499662838123f474f41b31dea84ec5d563f0sergeyv    return true;
200694d499662838123f474f41b31dea84ec5d563f0sergeyv}
201694d499662838123f474f41b31dea84ec5d563f0sergeyv
202694d499662838123f474f41b31dea84ec5d563f0sergeyvsk_sp<Bitmap> Bitmap::allocateHardwareBitmap(uirenderer::renderthread::RenderThread& renderThread,
203694d499662838123f474f41b31dea84ec5d563f0sergeyv        SkBitmap& skBitmap) {
204694d499662838123f474f41b31dea84ec5d563f0sergeyv    renderThread.eglManager().initialize();
205694d499662838123f474f41b31dea84ec5d563f0sergeyv    uirenderer::Caches& caches = uirenderer::Caches::getInstance();
206694d499662838123f474f41b31dea84ec5d563f0sergeyv
207694d499662838123f474f41b31dea84ec5d563f0sergeyv    sp<ISurfaceComposer> composer(ComposerService::getComposerService());
208694d499662838123f474f41b31dea84ec5d563f0sergeyv    sp<IGraphicBufferAlloc> alloc(composer->createGraphicBufferAlloc());
209694d499662838123f474f41b31dea84ec5d563f0sergeyv    if (alloc == NULL) {
210694d499662838123f474f41b31dea84ec5d563f0sergeyv        ALOGW("createGraphicBufferAlloc() failed in GraphicBuffer.create()");
211694d499662838123f474f41b31dea84ec5d563f0sergeyv        return nullptr;
212694d499662838123f474f41b31dea84ec5d563f0sergeyv    }
213694d499662838123f474f41b31dea84ec5d563f0sergeyv
214694d499662838123f474f41b31dea84ec5d563f0sergeyv    const SkImageInfo& info = skBitmap.info();
215694d499662838123f474f41b31dea84ec5d563f0sergeyv    if (info.colorType() == kUnknown_SkColorType) {
216694d499662838123f474f41b31dea84ec5d563f0sergeyv        ALOGW("unable to create hardware bitmap of configuration");
217694d499662838123f474f41b31dea84ec5d563f0sergeyv        return nullptr;
218694d499662838123f474f41b31dea84ec5d563f0sergeyv    }
219694d499662838123f474f41b31dea84ec5d563f0sergeyv
220ab12c1fe73734a18ac19a06b97f276528f6d027aMike Reed    sk_sp<SkColorSpace> sRGB = SkColorSpace::MakeNamed(SkColorSpace::kSRGB_Named);
221694d499662838123f474f41b31dea84ec5d563f0sergeyv    bool needSRGB = skBitmap.info().colorSpace() == sRGB.get();
222694d499662838123f474f41b31dea84ec5d563f0sergeyv    bool hasSRGB = caches.extensions().hasSRGB();
223694d499662838123f474f41b31dea84ec5d563f0sergeyv    GLint format, type, internalFormat;
224694d499662838123f474f41b31dea84ec5d563f0sergeyv    uirenderer::Texture::colorTypeToGlFormatAndType(caches, skBitmap.colorType(),
225694d499662838123f474f41b31dea84ec5d563f0sergeyv            needSRGB, &internalFormat, &format, &type);
226694d499662838123f474f41b31dea84ec5d563f0sergeyv
227694d499662838123f474f41b31dea84ec5d563f0sergeyv    PixelFormat pixelFormat = internalFormatToPixelFormat(internalFormat);
228694d499662838123f474f41b31dea84ec5d563f0sergeyv    status_t error;
229694d499662838123f474f41b31dea84ec5d563f0sergeyv    sp<GraphicBuffer> buffer = alloc->createGraphicBuffer(info.width(), info.height(), pixelFormat,
230850054cb46b25e20c1ae0b409734c0fa5c634b18Craig Donner            1, GraphicBuffer::USAGE_HW_TEXTURE | GraphicBuffer::USAGE_SW_WRITE_NEVER
231694d499662838123f474f41b31dea84ec5d563f0sergeyv            | GraphicBuffer::USAGE_SW_READ_NEVER , &error);
232694d499662838123f474f41b31dea84ec5d563f0sergeyv
233694d499662838123f474f41b31dea84ec5d563f0sergeyv    if (!buffer.get()) {
234694d499662838123f474f41b31dea84ec5d563f0sergeyv        ALOGW("createGraphicBuffer() failed in GraphicBuffer.create()");
235694d499662838123f474f41b31dea84ec5d563f0sergeyv        return nullptr;
236694d499662838123f474f41b31dea84ec5d563f0sergeyv    }
237694d499662838123f474f41b31dea84ec5d563f0sergeyv
238694d499662838123f474f41b31dea84ec5d563f0sergeyv    SkBitmap bitmap;
239694d499662838123f474f41b31dea84ec5d563f0sergeyv    if (CC_UNLIKELY(uirenderer::Texture::hasUnsupportedColorType(skBitmap.info(),
240694d499662838123f474f41b31dea84ec5d563f0sergeyv            hasSRGB, sRGB.get()))) {
241694d499662838123f474f41b31dea84ec5d563f0sergeyv        bitmap = uirenderer::Texture::uploadToN32(skBitmap, hasSRGB, std::move(sRGB));
242694d499662838123f474f41b31dea84ec5d563f0sergeyv    } else {
243694d499662838123f474f41b31dea84ec5d563f0sergeyv        bitmap = skBitmap;
244694d499662838123f474f41b31dea84ec5d563f0sergeyv    }
245694d499662838123f474f41b31dea84ec5d563f0sergeyv
246694d499662838123f474f41b31dea84ec5d563f0sergeyv    if (!uploadBitmapToGraphicBuffer(caches, bitmap, *buffer, format, type)) {
247694d499662838123f474f41b31dea84ec5d563f0sergeyv        return nullptr;
248694d499662838123f474f41b31dea84ec5d563f0sergeyv    }
249694d499662838123f474f41b31dea84ec5d563f0sergeyv    return sk_sp<Bitmap>(new Bitmap(std::move(buffer), info));
250694d499662838123f474f41b31dea84ec5d563f0sergeyv}
251694d499662838123f474f41b31dea84ec5d563f0sergeyv
252694d499662838123f474f41b31dea84ec5d563f0sergeyvsk_sp<Bitmap> Bitmap::allocateHardwareBitmap(SkBitmap& bitmap) {
253694d499662838123f474f41b31dea84ec5d563f0sergeyv    return uirenderer::renderthread::RenderProxy::allocateHardwareBitmap(bitmap);
254694d499662838123f474f41b31dea84ec5d563f0sergeyv}
255694d499662838123f474f41b31dea84ec5d563f0sergeyv
256fc9999505a36c66892d7ccce85187936105f4f36sergeyvsk_sp<Bitmap> Bitmap::allocateHeapBitmap(SkBitmap* bitmap, SkColorTable* ctable) {
257fc9999505a36c66892d7ccce85187936105f4f36sergeyv   return allocateBitmap(bitmap, ctable, &android::allocateHeapBitmap);
258fc9999505a36c66892d7ccce85187936105f4f36sergeyv}
259fc9999505a36c66892d7ccce85187936105f4f36sergeyv
260fc9999505a36c66892d7ccce85187936105f4f36sergeyvsk_sp<Bitmap> Bitmap::allocateHeapBitmap(const SkImageInfo& info) {
261fc9999505a36c66892d7ccce85187936105f4f36sergeyv    size_t size;
262fc9999505a36c66892d7ccce85187936105f4f36sergeyv    if (!computeAllocationSize(info.minRowBytes(), info.height(), &size)) {
263fc9999505a36c66892d7ccce85187936105f4f36sergeyv        LOG_ALWAYS_FATAL("trying to allocate too large bitmap");
264fc9999505a36c66892d7ccce85187936105f4f36sergeyv        return nullptr;
265fc9999505a36c66892d7ccce85187936105f4f36sergeyv    }
266fc9999505a36c66892d7ccce85187936105f4f36sergeyv    return android::allocateHeapBitmap(size, info, info.minRowBytes(), nullptr);
267fc9999505a36c66892d7ccce85187936105f4f36sergeyv}
268fc9999505a36c66892d7ccce85187936105f4f36sergeyv
269c1c54062f8cc9d47bdea820ae5ab6aef260b4488sergeyvsk_sp<Bitmap> Bitmap::allocateAshmemBitmap(size_t size, const SkImageInfo& info,
270c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv        size_t rowBytes, SkColorTable* ctable) {
271c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv    // Create new ashmem region with read/write priv
272c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv    int fd = ashmem_create_region("bitmap", size);
273c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv    if (fd < 0) {
274c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv        return nullptr;
275c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv    }
276c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv
277c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv    void* addr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
278c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv    if (addr == MAP_FAILED) {
279c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv        close(fd);
280c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv        return nullptr;
281c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv    }
282c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv
283c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv    if (ashmem_set_prot_region(fd, PROT_READ) < 0) {
284c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv        munmap(addr, size);
285c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv        close(fd);
286c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv        return nullptr;
287c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv    }
288c1c54062f8cc9d47bdea820ae5ab6aef260b4488sergeyv    return sk_sp<Bitmap>(new Bitmap(addr, fd, size, info, rowBytes, ctable));
289c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv}
290c36bd6c16ddfc160732ff7e4518564714c8aa66esergeyv
291aed7f58fb05a25ce2112829e77c0eb5dd268e8a7sergeyvvoid FreePixelRef(void* addr, void* context) {
292aed7f58fb05a25ce2112829e77c0eb5dd268e8a7sergeyv    auto pixelRef = (SkPixelRef*) context;
293aed7f58fb05a25ce2112829e77c0eb5dd268e8a7sergeyv    pixelRef->unlockPixels();
294aed7f58fb05a25ce2112829e77c0eb5dd268e8a7sergeyv    pixelRef->unref();
295aed7f58fb05a25ce2112829e77c0eb5dd268e8a7sergeyv}
296aed7f58fb05a25ce2112829e77c0eb5dd268e8a7sergeyv
297aed7f58fb05a25ce2112829e77c0eb5dd268e8a7sergeyvsk_sp<Bitmap> Bitmap::createFrom(const SkImageInfo& info, SkPixelRef& pixelRef) {
298aed7f58fb05a25ce2112829e77c0eb5dd268e8a7sergeyv    pixelRef.ref();
299aed7f58fb05a25ce2112829e77c0eb5dd268e8a7sergeyv    pixelRef.lockPixels();
300aed7f58fb05a25ce2112829e77c0eb5dd268e8a7sergeyv    return sk_sp<Bitmap>(new Bitmap((void*) pixelRef.pixels(), (void*) &pixelRef, FreePixelRef,
301aed7f58fb05a25ce2112829e77c0eb5dd268e8a7sergeyv            info, pixelRef.rowBytes(), pixelRef.colorTable()));
302aed7f58fb05a25ce2112829e77c0eb5dd268e8a7sergeyv}
303aed7f58fb05a25ce2112829e77c0eb5dd268e8a7sergeyv
304c1c54062f8cc9d47bdea820ae5ab6aef260b4488sergeyvvoid Bitmap::reconfigure(const SkImageInfo& newInfo, size_t rowBytes, SkColorTable* ctable) {
305163f88140e18f13575886e88af0336e0ab1ec846sergeyv    if (kIndex_8_SkColorType != newInfo.colorType()) {
306163f88140e18f13575886e88af0336e0ab1ec846sergeyv        ctable = nullptr;
307163f88140e18f13575886e88af0336e0ab1ec846sergeyv    }
308163f88140e18f13575886e88af0336e0ab1ec846sergeyv    mRowBytes = rowBytes;
309163f88140e18f13575886e88af0336e0ab1ec846sergeyv    if (mColorTable.get() != ctable) {
310003f14256271a6955baacba93e54f09d366f1c3bsergeyv        mColorTable.reset(SkSafeRef(ctable));
311163f88140e18f13575886e88af0336e0ab1ec846sergeyv    }
312163f88140e18f13575886e88af0336e0ab1ec846sergeyv
313163f88140e18f13575886e88af0336e0ab1ec846sergeyv    // Need to validate the alpha type to filter against the color type
314163f88140e18f13575886e88af0336e0ab1ec846sergeyv    // to prevent things like a non-opaque RGB565 bitmap
315163f88140e18f13575886e88af0336e0ab1ec846sergeyv    SkAlphaType alphaType;
316163f88140e18f13575886e88af0336e0ab1ec846sergeyv    LOG_ALWAYS_FATAL_IF(!SkColorTypeValidateAlphaType(
317163f88140e18f13575886e88af0336e0ab1ec846sergeyv            newInfo.colorType(), newInfo.alphaType(), &alphaType),
318163f88140e18f13575886e88af0336e0ab1ec846sergeyv            "Failed to validate alpha type!");
319163f88140e18f13575886e88af0336e0ab1ec846sergeyv
320163f88140e18f13575886e88af0336e0ab1ec846sergeyv    // Dirty hack is dirty
321163f88140e18f13575886e88af0336e0ab1ec846sergeyv    // TODO: Figure something out here, Skia's current design makes this
322163f88140e18f13575886e88af0336e0ab1ec846sergeyv    // really hard to work with. Skia really, really wants immutable objects,
323163f88140e18f13575886e88af0336e0ab1ec846sergeyv    // but with the nested-ref-count hackery going on that's just not
324163f88140e18f13575886e88af0336e0ab1ec846sergeyv    // feasible without going insane trying to figure it out
325163f88140e18f13575886e88af0336e0ab1ec846sergeyv    SkImageInfo* myInfo = const_cast<SkImageInfo*>(&this->info());
326163f88140e18f13575886e88af0336e0ab1ec846sergeyv    *myInfo = newInfo;
327163f88140e18f13575886e88af0336e0ab1ec846sergeyv    changeAlphaType(alphaType);
328163f88140e18f13575886e88af0336e0ab1ec846sergeyv
329163f88140e18f13575886e88af0336e0ab1ec846sergeyv    // Docs say to only call this in the ctor, but we're going to call
330163f88140e18f13575886e88af0336e0ab1ec846sergeyv    // it anyway even if this isn't always the ctor.
331163f88140e18f13575886e88af0336e0ab1ec846sergeyv    // TODO: Fix this too as part of the above TODO
332163f88140e18f13575886e88af0336e0ab1ec846sergeyv    setPreLocked(getStorage(), mRowBytes, mColorTable.get());
333163f88140e18f13575886e88af0336e0ab1ec846sergeyv}
334163f88140e18f13575886e88af0336e0ab1ec846sergeyv
335c1c54062f8cc9d47bdea820ae5ab6aef260b4488sergeyvBitmap::Bitmap(void* address, size_t size, const SkImageInfo& info, size_t rowBytes, SkColorTable* ctable)
336163f88140e18f13575886e88af0336e0ab1ec846sergeyv            : SkPixelRef(info)
337163f88140e18f13575886e88af0336e0ab1ec846sergeyv            , mPixelStorageType(PixelStorageType::Heap) {
338163f88140e18f13575886e88af0336e0ab1ec846sergeyv    mPixelStorage.heap.address = address;
339163f88140e18f13575886e88af0336e0ab1ec846sergeyv    mPixelStorage.heap.size = size;
340163f88140e18f13575886e88af0336e0ab1ec846sergeyv    reconfigure(info, rowBytes, ctable);
341163f88140e18f13575886e88af0336e0ab1ec846sergeyv}
342163f88140e18f13575886e88af0336e0ab1ec846sergeyv
343c1c54062f8cc9d47bdea820ae5ab6aef260b4488sergeyvBitmap::Bitmap(void* address, void* context, FreeFunc freeFunc,
344163f88140e18f13575886e88af0336e0ab1ec846sergeyv                const SkImageInfo& info, size_t rowBytes, SkColorTable* ctable)
345163f88140e18f13575886e88af0336e0ab1ec846sergeyv            : SkPixelRef(info)
346163f88140e18f13575886e88af0336e0ab1ec846sergeyv            , mPixelStorageType(PixelStorageType::External) {
347163f88140e18f13575886e88af0336e0ab1ec846sergeyv    mPixelStorage.external.address = address;
348163f88140e18f13575886e88af0336e0ab1ec846sergeyv    mPixelStorage.external.context = context;
349163f88140e18f13575886e88af0336e0ab1ec846sergeyv    mPixelStorage.external.freeFunc = freeFunc;
350163f88140e18f13575886e88af0336e0ab1ec846sergeyv    reconfigure(info, rowBytes, ctable);
351163f88140e18f13575886e88af0336e0ab1ec846sergeyv}
352163f88140e18f13575886e88af0336e0ab1ec846sergeyv
353c1c54062f8cc9d47bdea820ae5ab6aef260b4488sergeyvBitmap::Bitmap(void* address, int fd, size_t mappedSize,
354163f88140e18f13575886e88af0336e0ab1ec846sergeyv                const SkImageInfo& info, size_t rowBytes, SkColorTable* ctable)
355163f88140e18f13575886e88af0336e0ab1ec846sergeyv            : SkPixelRef(info)
356163f88140e18f13575886e88af0336e0ab1ec846sergeyv            , mPixelStorageType(PixelStorageType::Ashmem) {
357163f88140e18f13575886e88af0336e0ab1ec846sergeyv    mPixelStorage.ashmem.address = address;
358163f88140e18f13575886e88af0336e0ab1ec846sergeyv    mPixelStorage.ashmem.fd = fd;
359163f88140e18f13575886e88af0336e0ab1ec846sergeyv    mPixelStorage.ashmem.size = mappedSize;
360163f88140e18f13575886e88af0336e0ab1ec846sergeyv    reconfigure(info, rowBytes, ctable);
361163f88140e18f13575886e88af0336e0ab1ec846sergeyv}
362163f88140e18f13575886e88af0336e0ab1ec846sergeyv
363694d499662838123f474f41b31dea84ec5d563f0sergeyvBitmap::Bitmap(sp<GraphicBuffer>&& buffer, const SkImageInfo& info)
364694d499662838123f474f41b31dea84ec5d563f0sergeyv        : SkPixelRef(info)
365694d499662838123f474f41b31dea84ec5d563f0sergeyv        , mPixelStorageType(PixelStorageType::Hardware) {
366694d499662838123f474f41b31dea84ec5d563f0sergeyv    auto rawBuffer = buffer.get();
367694d499662838123f474f41b31dea84ec5d563f0sergeyv    mPixelStorage.hardware.buffer = rawBuffer;
368694d499662838123f474f41b31dea84ec5d563f0sergeyv    if (rawBuffer) {
369694d499662838123f474f41b31dea84ec5d563f0sergeyv        rawBuffer->incStrong(rawBuffer);
370694d499662838123f474f41b31dea84ec5d563f0sergeyv    }
371694d499662838123f474f41b31dea84ec5d563f0sergeyv    mRowBytes = bytesPerPixel(buffer->getPixelFormat()) * buffer->getStride();
372694d499662838123f474f41b31dea84ec5d563f0sergeyv}
373c1c54062f8cc9d47bdea820ae5ab6aef260b4488sergeyvBitmap::~Bitmap() {
374163f88140e18f13575886e88af0336e0ab1ec846sergeyv    switch (mPixelStorageType) {
375163f88140e18f13575886e88af0336e0ab1ec846sergeyv    case PixelStorageType::External:
376163f88140e18f13575886e88af0336e0ab1ec846sergeyv        mPixelStorage.external.freeFunc(mPixelStorage.external.address,
377163f88140e18f13575886e88af0336e0ab1ec846sergeyv                mPixelStorage.external.context);
378163f88140e18f13575886e88af0336e0ab1ec846sergeyv        break;
379163f88140e18f13575886e88af0336e0ab1ec846sergeyv    case PixelStorageType::Ashmem:
380163f88140e18f13575886e88af0336e0ab1ec846sergeyv        munmap(mPixelStorage.ashmem.address, mPixelStorage.ashmem.size);
381163f88140e18f13575886e88af0336e0ab1ec846sergeyv        close(mPixelStorage.ashmem.fd);
382163f88140e18f13575886e88af0336e0ab1ec846sergeyv        break;
383163f88140e18f13575886e88af0336e0ab1ec846sergeyv    case PixelStorageType::Heap:
384163f88140e18f13575886e88af0336e0ab1ec846sergeyv        free(mPixelStorage.heap.address);
385163f88140e18f13575886e88af0336e0ab1ec846sergeyv        break;
386694d499662838123f474f41b31dea84ec5d563f0sergeyv    case PixelStorageType::Hardware:
387694d499662838123f474f41b31dea84ec5d563f0sergeyv        auto buffer = mPixelStorage.hardware.buffer;
388694d499662838123f474f41b31dea84ec5d563f0sergeyv        buffer->decStrong(buffer);
389694d499662838123f474f41b31dea84ec5d563f0sergeyv        mPixelStorage.hardware.buffer = nullptr;
390694d499662838123f474f41b31dea84ec5d563f0sergeyv        break;
391694d499662838123f474f41b31dea84ec5d563f0sergeyv
392163f88140e18f13575886e88af0336e0ab1ec846sergeyv    }
393163f88140e18f13575886e88af0336e0ab1ec846sergeyv
394163f88140e18f13575886e88af0336e0ab1ec846sergeyv    if (android::uirenderer::Caches::hasInstance()) {
395163f88140e18f13575886e88af0336e0ab1ec846sergeyv        android::uirenderer::Caches::getInstance().textureCache.releaseTexture(getStableID());
396163f88140e18f13575886e88af0336e0ab1ec846sergeyv    }
397163f88140e18f13575886e88af0336e0ab1ec846sergeyv}
398163f88140e18f13575886e88af0336e0ab1ec846sergeyv
399c1c54062f8cc9d47bdea820ae5ab6aef260b4488sergeyvbool Bitmap::hasHardwareMipMap() const {
400163f88140e18f13575886e88af0336e0ab1ec846sergeyv    return mHasHardwareMipMap;
401163f88140e18f13575886e88af0336e0ab1ec846sergeyv}
402163f88140e18f13575886e88af0336e0ab1ec846sergeyv
403c1c54062f8cc9d47bdea820ae5ab6aef260b4488sergeyvvoid Bitmap::setHasHardwareMipMap(bool hasMipMap) {
404163f88140e18f13575886e88af0336e0ab1ec846sergeyv    mHasHardwareMipMap = hasMipMap;
405163f88140e18f13575886e88af0336e0ab1ec846sergeyv}
406163f88140e18f13575886e88af0336e0ab1ec846sergeyv
407c1c54062f8cc9d47bdea820ae5ab6aef260b4488sergeyvvoid* Bitmap::getStorage() const {
408163f88140e18f13575886e88af0336e0ab1ec846sergeyv    switch (mPixelStorageType) {
409163f88140e18f13575886e88af0336e0ab1ec846sergeyv    case PixelStorageType::External:
410163f88140e18f13575886e88af0336e0ab1ec846sergeyv        return mPixelStorage.external.address;
411163f88140e18f13575886e88af0336e0ab1ec846sergeyv    case PixelStorageType::Ashmem:
412163f88140e18f13575886e88af0336e0ab1ec846sergeyv        return mPixelStorage.ashmem.address;
413163f88140e18f13575886e88af0336e0ab1ec846sergeyv    case PixelStorageType::Heap:
414163f88140e18f13575886e88af0336e0ab1ec846sergeyv        return mPixelStorage.heap.address;
415694d499662838123f474f41b31dea84ec5d563f0sergeyv    case PixelStorageType::Hardware:
416694d499662838123f474f41b31dea84ec5d563f0sergeyv        return nullptr;
417163f88140e18f13575886e88af0336e0ab1ec846sergeyv    }
418163f88140e18f13575886e88af0336e0ab1ec846sergeyv}
419163f88140e18f13575886e88af0336e0ab1ec846sergeyv
420c1c54062f8cc9d47bdea820ae5ab6aef260b4488sergeyvbool Bitmap::onNewLockPixels(LockRec* rec) {
421163f88140e18f13575886e88af0336e0ab1ec846sergeyv    rec->fPixels = getStorage();
422163f88140e18f13575886e88af0336e0ab1ec846sergeyv    rec->fRowBytes = mRowBytes;
423163f88140e18f13575886e88af0336e0ab1ec846sergeyv    rec->fColorTable = mColorTable.get();
424163f88140e18f13575886e88af0336e0ab1ec846sergeyv    return true;
425163f88140e18f13575886e88af0336e0ab1ec846sergeyv}
426163f88140e18f13575886e88af0336e0ab1ec846sergeyv
427c1c54062f8cc9d47bdea820ae5ab6aef260b4488sergeyvsize_t Bitmap::getAllocatedSizeInBytes() const {
428163f88140e18f13575886e88af0336e0ab1ec846sergeyv    return info().getSafeSize(mRowBytes);
429163f88140e18f13575886e88af0336e0ab1ec846sergeyv}
430163f88140e18f13575886e88af0336e0ab1ec846sergeyv
431c1c54062f8cc9d47bdea820ae5ab6aef260b4488sergeyvint Bitmap::getAshmemFd() const {
432163f88140e18f13575886e88af0336e0ab1ec846sergeyv    switch (mPixelStorageType) {
433163f88140e18f13575886e88af0336e0ab1ec846sergeyv    case PixelStorageType::Ashmem:
434163f88140e18f13575886e88af0336e0ab1ec846sergeyv        return mPixelStorage.ashmem.fd;
435163f88140e18f13575886e88af0336e0ab1ec846sergeyv    default:
436163f88140e18f13575886e88af0336e0ab1ec846sergeyv        return -1;
437163f88140e18f13575886e88af0336e0ab1ec846sergeyv    }
438163f88140e18f13575886e88af0336e0ab1ec846sergeyv}
439163f88140e18f13575886e88af0336e0ab1ec846sergeyv
440c1c54062f8cc9d47bdea820ae5ab6aef260b4488sergeyvsize_t Bitmap::getAllocationByteCount() const {
441163f88140e18f13575886e88af0336e0ab1ec846sergeyv    switch (mPixelStorageType) {
442163f88140e18f13575886e88af0336e0ab1ec846sergeyv    case PixelStorageType::Heap:
443163f88140e18f13575886e88af0336e0ab1ec846sergeyv        return mPixelStorage.heap.size;
444163f88140e18f13575886e88af0336e0ab1ec846sergeyv    default:
445163f88140e18f13575886e88af0336e0ab1ec846sergeyv        return rowBytes() * height();
446163f88140e18f13575886e88af0336e0ab1ec846sergeyv    }
447163f88140e18f13575886e88af0336e0ab1ec846sergeyv}
448163f88140e18f13575886e88af0336e0ab1ec846sergeyv
449c1c54062f8cc9d47bdea820ae5ab6aef260b4488sergeyvvoid Bitmap::reconfigure(const SkImageInfo& info) {
450163f88140e18f13575886e88af0336e0ab1ec846sergeyv    reconfigure(info, info.minRowBytes(), nullptr);
451163f88140e18f13575886e88af0336e0ab1ec846sergeyv}
452163f88140e18f13575886e88af0336e0ab1ec846sergeyv
453c1c54062f8cc9d47bdea820ae5ab6aef260b4488sergeyvvoid Bitmap::setAlphaType(SkAlphaType alphaType) {
454163f88140e18f13575886e88af0336e0ab1ec846sergeyv    if (!SkColorTypeValidateAlphaType(info().colorType(), alphaType, &alphaType)) {
455163f88140e18f13575886e88af0336e0ab1ec846sergeyv        return;
456163f88140e18f13575886e88af0336e0ab1ec846sergeyv    }
457163f88140e18f13575886e88af0336e0ab1ec846sergeyv
458163f88140e18f13575886e88af0336e0ab1ec846sergeyv    changeAlphaType(alphaType);
459163f88140e18f13575886e88af0336e0ab1ec846sergeyv}
460163f88140e18f13575886e88af0336e0ab1ec846sergeyv
461c1c54062f8cc9d47bdea820ae5ab6aef260b4488sergeyvvoid Bitmap::getSkBitmap(SkBitmap* outBitmap) {
46259eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv    outBitmap->setHasHardwareMipMap(mHasHardwareMipMap);
463694d499662838123f474f41b31dea84ec5d563f0sergeyv    if (isHardware()) {
46459eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv        ALOGW("Warning: attempt to read pixels from hardware bitmap, which is very slow operation");
46559eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv        outBitmap->allocPixels(info());
46659eecb526adc5bd7041e7b6147bfcc40dd2c200esergeyv        uirenderer::renderthread::RenderProxy::copyGraphicBufferInto(graphicBuffer(), outBitmap);
467694d499662838123f474f41b31dea84ec5d563f0sergeyv        return;
468694d499662838123f474f41b31dea84ec5d563f0sergeyv    }
469163f88140e18f13575886e88af0336e0ab1ec846sergeyv    outBitmap->setInfo(info(), rowBytes());
470163f88140e18f13575886e88af0336e0ab1ec846sergeyv    outBitmap->setPixelRef(this);
471163f88140e18f13575886e88af0336e0ab1ec846sergeyv}
472163f88140e18f13575886e88af0336e0ab1ec846sergeyv
473554ffeb8b7c836da43a637c59eedfc617895b19dsergeyvvoid Bitmap::getSkBitmapForShaders(SkBitmap* outBitmap) {
474554ffeb8b7c836da43a637c59eedfc617895b19dsergeyv    outBitmap->setInfo(info(), rowBytes());
475554ffeb8b7c836da43a637c59eedfc617895b19dsergeyv    outBitmap->setPixelRef(this);
476554ffeb8b7c836da43a637c59eedfc617895b19dsergeyv    outBitmap->setHasHardwareMipMap(mHasHardwareMipMap);
477554ffeb8b7c836da43a637c59eedfc617895b19dsergeyv}
478554ffeb8b7c836da43a637c59eedfc617895b19dsergeyv
479ec4a4b13eae2241d1613890c1c1c096bed891845sergeyvvoid Bitmap::getBounds(SkRect* bounds) const {
480ec4a4b13eae2241d1613890c1c1c096bed891845sergeyv    SkASSERT(bounds);
481ec4a4b13eae2241d1613890c1c1c096bed891845sergeyv    bounds->set(0, 0, SkIntToScalar(info().width()), SkIntToScalar(info().height()));
482ec4a4b13eae2241d1613890c1c1c096bed891845sergeyv}
483ec4a4b13eae2241d1613890c1c1c096bed891845sergeyv
484694d499662838123f474f41b31dea84ec5d563f0sergeyvGraphicBuffer* Bitmap::graphicBuffer() {
485694d499662838123f474f41b31dea84ec5d563f0sergeyv    if (isHardware()) {
486694d499662838123f474f41b31dea84ec5d563f0sergeyv        return mPixelStorage.hardware.buffer;
487694d499662838123f474f41b31dea84ec5d563f0sergeyv    }
488694d499662838123f474f41b31dea84ec5d563f0sergeyv    return nullptr;
489694d499662838123f474f41b31dea84ec5d563f0sergeyv}
490694d499662838123f474f41b31dea84ec5d563f0sergeyv
491ab12c1fe73734a18ac19a06b97f276528f6d027aMike Reed} // namespace android
492