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