bitmap.cpp revision cad87d78da79c3d2ac83e1dce6ee2a9d2f6d64e5
1/* 2 * Copyright (C) 2009 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#include <android/bitmap.h> 18 19#pragma GCC diagnostic push 20#pragma GCC diagnostic ignored "-Wunused-parameter" 21#include <GraphicsJNI.h> 22#pragma GCC diagnostic pop 23 24int AndroidBitmap_getInfo(JNIEnv* env, jobject jbitmap, 25 AndroidBitmapInfo* info) { 26 if (NULL == env || NULL == jbitmap) { 27 return ANDROID_BITMAP_RESULT_BAD_PARAMETER; 28 } 29 30 SkBitmap* bm = GraphicsJNI::getNativeBitmap(env, jbitmap); 31 if (NULL == bm) { 32 return ANDROID_BITMAP_RESULT_JNI_EXCEPTION; 33 } 34 35 if (info) { 36 info->width = bm->width(); 37 info->height = bm->height(); 38 info->stride = bm->rowBytes(); 39 info->flags = 0; 40 41 switch (bm->colorType()) { 42 case kN32_SkColorType: 43 info->format = ANDROID_BITMAP_FORMAT_RGBA_8888; 44 break; 45 case kRGB_565_SkColorType: 46 info->format = ANDROID_BITMAP_FORMAT_RGB_565; 47 break; 48 case kARGB_4444_SkColorType: 49 info->format = ANDROID_BITMAP_FORMAT_RGBA_4444; 50 break; 51 case kAlpha_8_SkColorType: 52 info->format = ANDROID_BITMAP_FORMAT_A_8; 53 break; 54 default: 55 info->format = ANDROID_BITMAP_FORMAT_NONE; 56 break; 57 } 58 } 59 return ANDROID_BITMAP_RESULT_SUCCESS; 60} 61 62int AndroidBitmap_lockPixels(JNIEnv* env, jobject jbitmap, void** addrPtr) { 63 if (NULL == env || NULL == jbitmap) { 64 return ANDROID_BITMAP_RESULT_BAD_PARAMETER; 65 } 66 67 SkBitmap* bm = GraphicsJNI::getNativeBitmap(env, jbitmap); 68 if (NULL == bm) { 69 return ANDROID_BITMAP_RESULT_JNI_EXCEPTION; 70 } 71 72 bm->lockPixels(); 73 void* addr = bm->getPixels(); 74 if (NULL == addr) { 75 bm->unlockPixels(); 76 return ANDROID_BITMAP_RESULT_ALLOCATION_FAILED; 77 } 78 79 if (addrPtr) { 80 *addrPtr = addr; 81 } 82 return ANDROID_BITMAP_RESULT_SUCCESS; 83} 84 85int AndroidBitmap_unlockPixels(JNIEnv* env, jobject jbitmap) { 86 if (NULL == env || NULL == jbitmap) { 87 return ANDROID_BITMAP_RESULT_BAD_PARAMETER; 88 } 89 90 SkBitmap* bm = GraphicsJNI::getNativeBitmap(env, jbitmap); 91 if (NULL == bm) { 92 return ANDROID_BITMAP_RESULT_JNI_EXCEPTION; 93 } 94 95 // notifyPixelsChanged() needs be called to apply writes to GL-backed 96 // bitmaps. Note that this will slow down read-only accesses to the 97 // bitmaps, but the NDK methods are primarily intended to be used for 98 // writes. 99 bm->notifyPixelsChanged(); 100 101 bm->unlockPixels(); 102 return ANDROID_BITMAP_RESULT_SUCCESS; 103} 104 105