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