diff options
| -rw-r--r-- | core/jni/android/graphics/BitmapFactory.cpp | 2 | ||||
| -rw-r--r-- | core/jni/android/graphics/BitmapRegionDecoder.cpp | 2 | ||||
| -rw-r--r-- | core/jni/android/graphics/Graphics.cpp | 17 | ||||
| -rw-r--r-- | core/jni/android/graphics/GraphicsJNI.h | 4 | ||||
| -rw-r--r-- | core/jni/android/graphics/pdf/PdfRenderer.cpp | 19 | ||||
| -rw-r--r-- | core/jni/android/opengl/util.cpp | 18 | ||||
| -rw-r--r-- | core/jni/android_view_PointerIcon.cpp | 5 | ||||
| -rw-r--r-- | core/jni/com_google_android_gles_jni_EGLImpl.cpp | 13 | ||||
| -rw-r--r-- | graphics/java/android/graphics/pdf/PdfRenderer.java | 4 | ||||
| -rw-r--r-- | media/jni/android_media_MediaMetadataRetriever.cpp | 9 | ||||
| -rw-r--r-- | native/graphics/jni/bitmap.cpp | 35 | ||||
| -rw-r--r-- | rs/jni/android_renderscript_RenderScript.cpp | 25 | 
12 files changed, 84 insertions, 69 deletions
| diff --git a/core/jni/android/graphics/BitmapFactory.cpp b/core/jni/android/graphics/BitmapFactory.cpp index 4c4a39d98485..d4069a1e8662 100644 --- a/core/jni/android/graphics/BitmapFactory.cpp +++ b/core/jni/android/graphics/BitmapFactory.cpp @@ -261,7 +261,7 @@ static jobject doDecode(JNIEnv* env, SkStreamRewindable* stream, jobject padding      SkBitmap* outputBitmap = NULL;      unsigned int existingBufferSize = 0;      if (javaBitmap != NULL) { -        outputBitmap = GraphicsJNI::getSkBitmap(env, javaBitmap); +        outputBitmap = GraphicsJNI::getSkBitmapDeprecated(env, javaBitmap);          if (outputBitmap->isImmutable()) {              ALOGW("Unable to reuse an immutable bitmap as an image decoder target.");              javaBitmap = NULL; diff --git a/core/jni/android/graphics/BitmapRegionDecoder.cpp b/core/jni/android/graphics/BitmapRegionDecoder.cpp index 3525d0753cd2..aeea80823be9 100644 --- a/core/jni/android/graphics/BitmapRegionDecoder.cpp +++ b/core/jni/android/graphics/BitmapRegionDecoder.cpp @@ -217,7 +217,7 @@ static jobject nativeDecodeRegion(JNIEnv* env, jobject, jlong brdHandle,      if (tileBitmap != NULL) {          // Re-use bitmap. -        bitmap = GraphicsJNI::getSkBitmap(env, tileBitmap); +        bitmap = GraphicsJNI::getSkBitmapDeprecated(env, tileBitmap);      }      if (bitmap == NULL) {          bitmap = new SkBitmap; diff --git a/core/jni/android/graphics/Graphics.cpp b/core/jni/android/graphics/Graphics.cpp index 07479699ce67..f0bd5ddf29a0 100644 --- a/core/jni/android/graphics/Graphics.cpp +++ b/core/jni/android/graphics/Graphics.cpp @@ -338,7 +338,7 @@ SkColorType GraphicsJNI::legacyBitmapConfigToColorType(jint legacyConfig) {      return static_cast<SkColorType>(gConfig2ColorType[legacyConfig]);  } -SkBitmap* GraphicsJNI::getSkBitmap(JNIEnv* env, jobject bitmap) { +SkBitmap* GraphicsJNI::getSkBitmapDeprecated(JNIEnv* env, jobject bitmap) {      SkASSERT(env);      SkASSERT(bitmap);      SkASSERT(env->IsInstanceOf(bitmap, gBitmap_class)); @@ -348,6 +348,21 @@ SkBitmap* GraphicsJNI::getSkBitmap(JNIEnv* env, jobject bitmap) {      return b;  } +void GraphicsJNI::getSkBitmap(JNIEnv* env, jobject bitmap, SkBitmap* outBitmap) { +    SkPixelRef* pixelRef = getSkPixelRef(env, bitmap); +    // TODO: pixelRef->rowBytes() is only valid if the pixels are locked +    // (which is currently always true on android), switch this to querying +    // from the wrapper once that exists instead +    outBitmap->setInfo(pixelRef->info(), pixelRef->rowBytes()); +    outBitmap->setPixelRef(pixelRef); +} + +SkPixelRef* GraphicsJNI::getSkPixelRef(JNIEnv* env, jobject bitmap) { +    jlong bitmapHandle = env->GetLongField(bitmap, gBitmap_skBitmapPtr); +    SkBitmap* b = reinterpret_cast<SkBitmap*>(bitmapHandle); +    return b->pixelRef(); +} +  SkColorType GraphicsJNI::getNativeBitmapColorType(JNIEnv* env, jobject jconfig) {      SkASSERT(env);      if (NULL == jconfig) { diff --git a/core/jni/android/graphics/GraphicsJNI.h b/core/jni/android/graphics/GraphicsJNI.h index 422d3f1a6646..49def13e48f0 100644 --- a/core/jni/android/graphics/GraphicsJNI.h +++ b/core/jni/android/graphics/GraphicsJNI.h @@ -48,7 +48,9 @@ public:      static void point_to_jpointf(const SkPoint& point, JNIEnv*, jobject jpointf);      static SkCanvas* getNativeCanvas(JNIEnv*, jobject canvas); -    static SkBitmap* getSkBitmap(JNIEnv*, jobject bitmap); +    static SkBitmap* getSkBitmapDeprecated(JNIEnv*, jobject bitmap); +    static void getSkBitmap(JNIEnv*, jobject bitmap, SkBitmap* outBitmap); +    static SkPixelRef* getSkPixelRef(JNIEnv*, jobject bitmap);      static SkRegion* getNativeRegion(JNIEnv*, jobject region);      // Given the 'native' long held by the Rasterizer.java object, return a diff --git a/core/jni/android/graphics/pdf/PdfRenderer.cpp b/core/jni/android/graphics/pdf/PdfRenderer.cpp index fc98cf96afed..876bea46ccb3 100644 --- a/core/jni/android/graphics/pdf/PdfRenderer.cpp +++ b/core/jni/android/graphics/pdf/PdfRenderer.cpp @@ -243,19 +243,21 @@ static void renderPageBitmap(FPDF_BITMAP bitmap, FPDF_PAGE page, int destLeft, i  }  static void nativeRenderPage(JNIEnv* env, jclass thiz, jlong documentPtr, jlong pagePtr, -        jlong bitmapPtr, jint destLeft, jint destTop, jint destRight, jint destBottom, +        jobject jbitmap, jint destLeft, jint destTop, jint destRight, jint destBottom,          jlong matrixPtr, jint renderMode) {      FPDF_PAGE page = reinterpret_cast<FPDF_PAGE>(pagePtr); -    SkBitmap* skBitmap = reinterpret_cast<SkBitmap*>(bitmapPtr);      SkMatrix* skMatrix = reinterpret_cast<SkMatrix*>(matrixPtr); -    skBitmap->lockPixels(); +    SkBitmap skBitmap; +    GraphicsJNI::getSkBitmap(env, jbitmap, &skBitmap); -    const int stride = skBitmap->width() * 4; +    SkAutoLockPixels alp(skBitmap); -    FPDF_BITMAP bitmap = FPDFBitmap_CreateEx(skBitmap->width(), skBitmap->height(), -            FPDFBitmap_BGRA, skBitmap->getPixels(), stride); +    const int stride = skBitmap.width() * 4; + +    FPDF_BITMAP bitmap = FPDFBitmap_CreateEx(skBitmap.width(), skBitmap.height(), +            FPDFBitmap_BGRA, skBitmap.getPixels(), stride);      if (!bitmap) {          ALOGE("Erorr creating bitmap"); @@ -278,8 +280,7 @@ static void nativeRenderPage(JNIEnv* env, jclass thiz, jlong documentPtr, jlong      renderPageBitmap(bitmap, page, destLeft, destTop, destRight,              destBottom, skMatrix, renderFlags); -    skBitmap->notifyPixelsChanged(); -    skBitmap->unlockPixels(); +    skBitmap.notifyPixelsChanged();  }  static JNINativeMethod gPdfRenderer_Methods[] = { @@ -287,7 +288,7 @@ static JNINativeMethod gPdfRenderer_Methods[] = {      {"nativeClose", "(J)V", (void*) nativeClose},      {"nativeGetPageCount", "(J)I", (void*) nativeGetPageCount},      {"nativeScaleForPrinting", "(J)Z", (void*) nativeScaleForPrinting}, -    {"nativeRenderPage", "(JJJIIIIJI)V", (void*) nativeRenderPage}, +    {"nativeRenderPage", "(JJLandroid/graphics/Bitmap;IIIIJI)V", (void*) nativeRenderPage},      {"nativeOpenPageAndGetSize", "(JILandroid/graphics/Point;)J", (void*) nativeOpenPageAndGetSize},      {"nativeClosePage", "(J)V", (void*) nativeClosePage}  }; diff --git a/core/jni/android/opengl/util.cpp b/core/jni/android/opengl/util.cpp index 5c2d0d0bb5cb..bce2b33d3cda 100644 --- a/core/jni/android/opengl/util.cpp +++ b/core/jni/android/opengl/util.cpp @@ -618,23 +618,25 @@ static int getType(SkColorType colorType)  static jint util_getInternalFormat(JNIEnv *env, jclass clazz,          jobject jbitmap)  { -    SkBitmap const * nativeBitmap = GraphicsJNI::getSkBitmap(env, jbitmap); -    return getInternalFormat(nativeBitmap->colorType()); +    SkBitmap nativeBitmap; +    GraphicsJNI::getSkBitmap(env, jbitmap, &nativeBitmap); +    return getInternalFormat(nativeBitmap.colorType());  }  static jint util_getType(JNIEnv *env, jclass clazz,          jobject jbitmap)  { -    SkBitmap const * nativeBitmap = GraphicsJNI::getSkBitmap(env, jbitmap); -    return getType(nativeBitmap->colorType()); +    SkBitmap nativeBitmap; +    GraphicsJNI::getSkBitmap(env, jbitmap, &nativeBitmap); +    return getType(nativeBitmap.colorType());  }  static jint util_texImage2D(JNIEnv *env, jclass clazz,          jint target, jint level, jint internalformat,          jobject jbitmap, jint type, jint border)  { -    SkBitmap const * nativeBitmap = GraphicsJNI::getSkBitmap(env, jbitmap); -    const SkBitmap& bitmap(*nativeBitmap); +    SkBitmap bitmap; +    GraphicsJNI::getSkBitmap(env, jbitmap, &bitmap);      SkColorType colorType = bitmap.colorType();      if (internalformat < 0) {          internalformat = getInternalFormat(colorType); @@ -680,8 +682,8 @@ static jint util_texSubImage2D(JNIEnv *env, jclass clazz,          jint target, jint level, jint xoffset, jint yoffset,          jobject jbitmap, jint format, jint type)  { -    SkBitmap const * nativeBitmap = GraphicsJNI::getSkBitmap(env, jbitmap); -    const SkBitmap& bitmap(*nativeBitmap); +    SkBitmap bitmap; +    GraphicsJNI::getSkBitmap(env, jbitmap, &bitmap);      SkColorType colorType = bitmap.colorType();      if (format < 0) {          format = getInternalFormat(colorType); diff --git a/core/jni/android_view_PointerIcon.cpp b/core/jni/android_view_PointerIcon.cpp index f6d9a1a95ee0..d04adbfc742b 100644 --- a/core/jni/android_view_PointerIcon.cpp +++ b/core/jni/android_view_PointerIcon.cpp @@ -80,10 +80,7 @@ status_t android_view_PointerIcon_load(JNIEnv* env, jobject pointerIconObj, jobj      jobject bitmapObj = env->GetObjectField(loadedPointerIconObj, gPointerIconClassInfo.mBitmap);      if (bitmapObj) { -        SkBitmap* bitmap = GraphicsJNI::getSkBitmap(env, bitmapObj); -        if (bitmap) { -            outPointerIcon->bitmap = *bitmap; // use a shared pixel ref -        } +        GraphicsJNI::getSkBitmap(env, bitmapObj, &(outPointerIcon->bitmap));          env->DeleteLocalRef(bitmapObj);      } diff --git a/core/jni/com_google_android_gles_jni_EGLImpl.cpp b/core/jni/com_google_android_gles_jni_EGLImpl.cpp index 7080e2ab5a78..baeb7dd98bc4 100644 --- a/core/jni/com_google_android_gles_jni_EGLImpl.cpp +++ b/core/jni/com_google_android_gles_jni_EGLImpl.cpp @@ -277,8 +277,9 @@ static void jni_eglCreatePixmapSurface(JNIEnv *_env, jobject _this, jobject out_      EGLConfig  cnf = getConfig(_env, config);      jint* base = 0; -    SkBitmap const * nativeBitmap = GraphicsJNI::getSkBitmap(_env, native_pixmap); -    SkPixelRef* ref = nativeBitmap ? nativeBitmap->pixelRef() : 0; +    SkBitmap nativeBitmap; +    GraphicsJNI::getSkBitmap(_env, native_pixmap, &nativeBitmap); +    SkPixelRef* ref = nativeBitmap.pixelRef();      if (ref == NULL) {          jniThrowException(_env, "java/lang/IllegalArgumentException", "Bitmap has no PixelRef");          return; @@ -289,10 +290,10 @@ static void jni_eglCreatePixmapSurface(JNIEnv *_env, jobject _this, jobject out_      egl_native_pixmap_t pixmap;      pixmap.version = sizeof(pixmap); -    pixmap.width  = nativeBitmap->width(); -    pixmap.height = nativeBitmap->height(); -    pixmap.stride = nativeBitmap->rowBytes() / nativeBitmap->bytesPerPixel(); -    pixmap.format = convertPixelFormat(nativeBitmap->colorType()); +    pixmap.width  = nativeBitmap.width(); +    pixmap.height = nativeBitmap.height(); +    pixmap.stride = nativeBitmap.rowBytes() / nativeBitmap.bytesPerPixel(); +    pixmap.format = convertPixelFormat(nativeBitmap.colorType());      pixmap.data   = (uint8_t*)ref->pixels();      base = beginNativeAttribList(_env, attrib_list); diff --git a/graphics/java/android/graphics/pdf/PdfRenderer.java b/graphics/java/android/graphics/pdf/PdfRenderer.java index b32dcc69ea7b..feb805260cb7 100644 --- a/graphics/java/android/graphics/pdf/PdfRenderer.java +++ b/graphics/java/android/graphics/pdf/PdfRenderer.java @@ -380,7 +380,7 @@ public final class PdfRenderer implements AutoCloseable {              final long transformPtr = (transform != null) ? transform.native_instance : 0; -            nativeRenderPage(mNativeDocument, mNativePage, destination.getSkBitmap(), contentLeft, +            nativeRenderPage(mNativeDocument, mNativePage, destination, contentLeft,                      contentTop, contentRight, contentBottom, transformPtr, renderMode);          } @@ -425,7 +425,7 @@ public final class PdfRenderer implements AutoCloseable {      private static native void nativeClose(long documentPtr);      private static native int nativeGetPageCount(long documentPtr);      private static native boolean nativeScaleForPrinting(long documentPtr); -    private static native void nativeRenderPage(long documentPtr, long pagePtr, long destPtr, +    private static native void nativeRenderPage(long documentPtr, long pagePtr, Bitmap dest,              int destLeft, int destTop, int destRight, int destBottom, long matrixPtr, int renderMode);      private static native long nativeOpenPageAndGetSize(long documentPtr, int pageIndex,              Point outSize); diff --git a/media/jni/android_media_MediaMetadataRetriever.cpp b/media/jni/android_media_MediaMetadataRetriever.cpp index 2f6bbf4cc9b4..c6fa3790d73a 100644 --- a/media/jni/android_media_MediaMetadataRetriever.cpp +++ b/media/jni/android_media_MediaMetadataRetriever.cpp @@ -281,15 +281,16 @@ static jobject android_media_MediaMetadataRetriever_getFrameAtTime(JNIEnv *env,          return NULL;      } -    SkBitmap *bitmap = GraphicsJNI::getSkBitmap(env, jBitmap); +    SkBitmap bitmap; +    GraphicsJNI::getSkBitmap(env, jBitmap, &bitmap); -    bitmap->lockPixels(); -    rotate((uint16_t*)bitmap->getPixels(), +    bitmap.lockPixels(); +    rotate((uint16_t*)bitmap.getPixels(),             (uint16_t*)((char*)videoFrame + sizeof(VideoFrame)),             videoFrame->mWidth,             videoFrame->mHeight,             videoFrame->mRotationAngle); -    bitmap->unlockPixels(); +    bitmap.unlockPixels();      if (videoFrame->mDisplayWidth  != videoFrame->mWidth ||          videoFrame->mDisplayHeight != videoFrame->mHeight) { diff --git a/native/graphics/jni/bitmap.cpp b/native/graphics/jni/bitmap.cpp index ddb01a0671ed..05218336878c 100644 --- a/native/graphics/jni/bitmap.cpp +++ b/native/graphics/jni/bitmap.cpp @@ -27,18 +27,16 @@ int AndroidBitmap_getInfo(JNIEnv* env, jobject jbitmap,          return ANDROID_BITMAP_RESULT_BAD_PARAMETER;      } -    SkBitmap* bm = GraphicsJNI::getSkBitmap(env, jbitmap); -    if (NULL == bm) { -        return ANDROID_BITMAP_RESULT_JNI_EXCEPTION; -    } +    SkBitmap bm; +    GraphicsJNI::getSkBitmap(env, jbitmap, &bm);      if (info) { -        info->width     = bm->width(); -        info->height    = bm->height(); -        info->stride    = bm->rowBytes(); +        info->width     = bm.width(); +        info->height    = bm.height(); +        info->stride    = bm.rowBytes();          info->flags     = 0; -        switch (bm->colorType()) { +        switch (bm.colorType()) {              case kN32_SkColorType:                  info->format = ANDROID_BITMAP_FORMAT_RGBA_8888;                  break; @@ -64,17 +62,18 @@ int AndroidBitmap_lockPixels(JNIEnv* env, jobject jbitmap, void** addrPtr) {          return ANDROID_BITMAP_RESULT_BAD_PARAMETER;      } -    SkBitmap* bm = GraphicsJNI::getSkBitmap(env, jbitmap); -    if (NULL == bm) { +    SkPixelRef* pixelRef = GraphicsJNI::getSkPixelRef(env, jbitmap); +    if (!pixelRef) {          return ANDROID_BITMAP_RESULT_JNI_EXCEPTION;      } -    bm->lockPixels(); -    void* addr = bm->getPixels(); +    pixelRef->lockPixels(); +    void* addr = pixelRef->pixels();      if (NULL == addr) { -        bm->unlockPixels(); +        pixelRef->unlockPixels();          return ANDROID_BITMAP_RESULT_ALLOCATION_FAILED;      } +    pixelRef->ref();      if (addrPtr) {          *addrPtr = addr; @@ -87,8 +86,8 @@ int AndroidBitmap_unlockPixels(JNIEnv* env, jobject jbitmap) {          return ANDROID_BITMAP_RESULT_BAD_PARAMETER;      } -    SkBitmap* bm = GraphicsJNI::getSkBitmap(env, jbitmap); -    if (NULL == bm) { +    SkPixelRef* pixelRef = GraphicsJNI::getSkPixelRef(env, jbitmap); +    if (!pixelRef) {          return ANDROID_BITMAP_RESULT_JNI_EXCEPTION;      } @@ -96,9 +95,11 @@ int AndroidBitmap_unlockPixels(JNIEnv* env, jobject jbitmap) {      // bitmaps.  Note that this will slow down read-only accesses to the      // bitmaps, but the NDK methods are primarily intended to be used for      // writes. -    bm->notifyPixelsChanged(); +    pixelRef->notifyPixelsChanged(); + +    pixelRef->unlockPixels(); +    pixelRef->unref(); -    bm->unlockPixels();      return ANDROID_BITMAP_RESULT_SUCCESS;  } diff --git a/rs/jni/android_renderscript_RenderScript.cpp b/rs/jni/android_renderscript_RenderScript.cpp index 40fad388e3d1..841e684469e5 100644 --- a/rs/jni/android_renderscript_RenderScript.cpp +++ b/rs/jni/android_renderscript_RenderScript.cpp @@ -1063,9 +1063,8 @@ static jlong  nAllocationCreateFromBitmap(JNIEnv *_env, jobject _this, jlong con, jlong type, jint mip,                              jobject jbitmap, jint usage)  { -    SkBitmap const * nativeBitmap = -            GraphicsJNI::getSkBitmap(_env, jbitmap); -    const SkBitmap& bitmap(*nativeBitmap); +    SkBitmap bitmap; +    GraphicsJNI::getSkBitmap(_env, jbitmap, &bitmap);      bitmap.lockPixels();      const void* ptr = bitmap.getPixels(); @@ -1080,9 +1079,8 @@ static jlong  nAllocationCreateBitmapBackedAllocation(JNIEnv *_env, jobject _this, jlong con, jlong type,                                          jint mip, jobject jbitmap, jint usage)  { -    SkBitmap const * nativeBitmap = -            GraphicsJNI::getSkBitmap(_env, jbitmap); -    const SkBitmap& bitmap(*nativeBitmap); +    SkBitmap bitmap; +    GraphicsJNI::getSkBitmap(_env, jbitmap, &bitmap);      bitmap.lockPixels();      const void* ptr = bitmap.getPixels(); @@ -1097,9 +1095,8 @@ static jlong  nAllocationCubeCreateFromBitmap(JNIEnv *_env, jobject _this, jlong con, jlong type, jint mip,                                  jobject jbitmap, jint usage)  { -    SkBitmap const * nativeBitmap = -            GraphicsJNI::getSkBitmap(_env, jbitmap); -    const SkBitmap& bitmap(*nativeBitmap); +    SkBitmap bitmap; +    GraphicsJNI::getSkBitmap(_env, jbitmap, &bitmap);      bitmap.lockPixels();      const void* ptr = bitmap.getPixels(); @@ -1113,9 +1110,8 @@ nAllocationCubeCreateFromBitmap(JNIEnv *_env, jobject _this, jlong con, jlong ty  static void  nAllocationCopyFromBitmap(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jobject jbitmap)  { -    SkBitmap const * nativeBitmap = -            GraphicsJNI::getSkBitmap(_env, jbitmap); -    const SkBitmap& bitmap(*nativeBitmap); +    SkBitmap bitmap; +    GraphicsJNI::getSkBitmap(_env, jbitmap, &bitmap);      int w = bitmap.width();      int h = bitmap.height(); @@ -1130,9 +1126,8 @@ nAllocationCopyFromBitmap(JNIEnv *_env, jobject _this, jlong con, jlong alloc, j  static void  nAllocationCopyToBitmap(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jobject jbitmap)  { -    SkBitmap const * nativeBitmap = -            GraphicsJNI::getSkBitmap(_env, jbitmap); -    const SkBitmap& bitmap(*nativeBitmap); +    SkBitmap bitmap; +    GraphicsJNI::getSkBitmap(_env, jbitmap, &bitmap);      bitmap.lockPixels();      void* ptr = bitmap.getPixels(); |