bitmap.cpp revision eba8254c8cae92d653c5203f65cb36f3fc724f9d
15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/* 25460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * Copyright (C) 2009 The Android Open Source Project 35460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * 45460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * Licensed under the Apache License, Version 2.0 (the "License"); 55460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * you may not use this file except in compliance with the License. 65460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * You may obtain a copy of the License at 75460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * 85460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * http://www.apache.org/licenses/LICENSE-2.0 937b74a387bb3993387029859c2d9d051c41c724eStephen Hines * 1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines * Unless required by applicable law or agreed to in writing, software 115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * distributed under the License is distributed on an "AS IS" BASIS, 1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines * See the License for the specific language governing permissions and 1437b74a387bb3993387029859c2d9d051c41c724eStephen Hines * limitations under the License. 155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */ 16f767be5432ccac097334be48698e48621d730190Shih-wei Liao 175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <android/bitmap.h> 185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <GraphicsJNI.h> 195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoint AndroidBitmap_getInfo(JNIEnv* env, jobject jbitmap, 215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao AndroidBitmapInfo* info) { 226f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines if (NULL == env || NULL == jbitmap) { 235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return ANDROID_BITMAP_RESULT_BAD_PARAMETER; 2437b74a387bb3993387029859c2d9d051c41c724eStephen Hines } 255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao SkBitmap* bm = GraphicsJNI::getNativeBitmap(env, jbitmap); 2737b74a387bb3993387029859c2d9d051c41c724eStephen Hines if (NULL == bm) { 2837b74a387bb3993387029859c2d9d051c41c724eStephen Hines return ANDROID_BITMAP_RESULT_JNI_EXCEPTION; 2937b74a387bb3993387029859c2d9d051c41c724eStephen Hines } 305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 3137b74a387bb3993387029859c2d9d051c41c724eStephen Hines if (info) { 325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao info->width = bm->width(); 335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao info->height = bm->height(); 345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao info->stride = bm->rowBytes(); 355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao info->flags = 0; 365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao switch (bm->config()) { 3837b74a387bb3993387029859c2d9d051c41c724eStephen Hines case SkBitmap::kARGB_8888_Config: 395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao info->format = ANDROID_BITMAP_FORMAT_RGBA_8888; 405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao break; 4137b74a387bb3993387029859c2d9d051c41c724eStephen Hines case SkBitmap::kRGB_565_Config: 4237b74a387bb3993387029859c2d9d051c41c724eStephen Hines info->format = ANDROID_BITMAP_FORMAT_RGB_565; 435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao break; 445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao case SkBitmap::kARGB_4444_Config: 455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao info->format = ANDROID_BITMAP_FORMAT_RGBA_4444; 465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao break; 475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao case SkBitmap::kA8_Config: 485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao info->format = ANDROID_BITMAP_FORMAT_A_8; 495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao break; 505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao default: 515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao info->format = ANDROID_BITMAP_FORMAT_NONE; 525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao break; 5337b74a387bb3993387029859c2d9d051c41c724eStephen Hines } 5437b74a387bb3993387029859c2d9d051c41c724eStephen Hines } 555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return ANDROID_BITMAP_RESULT_SUCCESS; 565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 5737b74a387bb3993387029859c2d9d051c41c724eStephen Hines 5837b74a387bb3993387029859c2d9d051c41c724eStephen Hinesint AndroidBitmap_lockPixels(JNIEnv* env, jobject jbitmap, void** addrPtr) { 5937b74a387bb3993387029859c2d9d051c41c724eStephen Hines if (NULL == env || NULL == jbitmap) { 605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return ANDROID_BITMAP_RESULT_BAD_PARAMETER; 6137b74a387bb3993387029859c2d9d051c41c724eStephen Hines } 625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao SkBitmap* bm = GraphicsJNI::getNativeBitmap(env, jbitmap); 645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (NULL == bm) { 655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return ANDROID_BITMAP_RESULT_JNI_EXCEPTION; 665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 6837b74a387bb3993387029859c2d9d051c41c724eStephen Hines bm->lockPixels(); 695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void* addr = bm->getPixels(); 70f767be5432ccac097334be48698e48621d730190Shih-wei Liao if (NULL == addr) { 7137b74a387bb3993387029859c2d9d051c41c724eStephen Hines bm->unlockPixels(); 7237b74a387bb3993387029859c2d9d051c41c724eStephen Hines return ANDROID_BITMAP_RESULT_ALLOCATION_FAILED; 735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (addrPtr) { 765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *addrPtr = addr; 775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return ANDROID_BITMAP_RESULT_SUCCESS; 795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoint AndroidBitmap_unlockPixels(JNIEnv* env, jobject jbitmap) { 825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (NULL == env || NULL == jbitmap) { 8337b74a387bb3993387029859c2d9d051c41c724eStephen Hines return ANDROID_BITMAP_RESULT_BAD_PARAMETER; 8437b74a387bb3993387029859c2d9d051c41c724eStephen Hines } 855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao SkBitmap* bm = GraphicsJNI::getNativeBitmap(env, jbitmap); 8737b74a387bb3993387029859c2d9d051c41c724eStephen Hines if (NULL == bm) { 8837b74a387bb3993387029859c2d9d051c41c724eStephen Hines return ANDROID_BITMAP_RESULT_JNI_EXCEPTION; 8937b74a387bb3993387029859c2d9d051c41c724eStephen Hines } 9037b74a387bb3993387029859c2d9d051c41c724eStephen Hines 9137b74a387bb3993387029859c2d9d051c41c724eStephen Hines // notifyPixelsChanged() needs be called to apply writes to GL-backed 9237b74a387bb3993387029859c2d9d051c41c724eStephen Hines // bitmaps. Note that this will slow down read-only accesses to the 9337b74a387bb3993387029859c2d9d051c41c724eStephen Hines // bitmaps, but the NDK methods are primarily intended to be used for 9437b74a387bb3993387029859c2d9d051c41c724eStephen Hines // writes. 9537b74a387bb3993387029859c2d9d051c41c724eStephen Hines bm->notifyPixelsChanged(); 9637b74a387bb3993387029859c2d9d051c41c724eStephen Hines 9737b74a387bb3993387029859c2d9d051c41c724eStephen Hines bm->unlockPixels(); 9837b74a387bb3993387029859c2d9d051c41c724eStephen Hines return ANDROID_BITMAP_RESULT_SUCCESS; 9937b74a387bb3993387029859c2d9d051c41c724eStephen Hines} 10037b74a387bb3993387029859c2d9d051c41c724eStephen Hines 10137b74a387bb3993387029859c2d9d051c41c724eStephen Hines