diff options
| -rw-r--r-- | cmds/bootanimation/BootAnimation.cpp | 2 | ||||
| -rw-r--r-- | core/jni/Android.mk | 4 | ||||
| -rw-r--r-- | core/jni/android/graphics/BitmapFactory.cpp | 21 | ||||
| -rw-r--r-- | core/jni/android/graphics/BitmapRegionDecoder.cpp | 87 | ||||
| -rw-r--r-- | core/jni/android/graphics/GraphicsJNI.h | 4 | ||||
| -rw-r--r-- | core/jni/android/graphics/Picture.cpp | 2 | ||||
| -rw-r--r-- | graphics/jni/android_renderscript_RenderScript.cpp | 1 |
7 files changed, 63 insertions, 58 deletions
diff --git a/cmds/bootanimation/BootAnimation.cpp b/cmds/bootanimation/BootAnimation.cpp index 8511735..ad4e4c8 100644 --- a/cmds/bootanimation/BootAnimation.cpp +++ b/cmds/bootanimation/BootAnimation.cpp @@ -44,7 +44,7 @@ #include <core/SkBitmap.h> #include <core/SkStream.h> -#include <images/SkImageDecoder.h> +#include <core/SkImageDecoder.h> #include <GLES/gl.h> #include <GLES/glext.h> diff --git a/core/jni/Android.mk b/core/jni/Android.mk index 4fc885c..0efa227 100644 --- a/core/jni/Android.mk +++ b/core/jni/Android.mk @@ -17,10 +17,6 @@ endif LOCAL_CFLAGS += -DGL_GLEXT_PROTOTYPES -DEGL_EGLEXT_PROTOTYPES -# When built as part of the system image we can enable certian non-NDK compliant -# Skia optimizations. -LOCAL_CFLAGS += -DSK_BUILD_FOR_ANDROID_FRAMEWORK - LOCAL_SRC_FILES:= \ AndroidRuntime.cpp \ Time.cpp \ diff --git a/core/jni/android/graphics/BitmapFactory.cpp b/core/jni/android/graphics/BitmapFactory.cpp index f58f35d..49e3aa4 100644 --- a/core/jni/android/graphics/BitmapFactory.cpp +++ b/core/jni/android/graphics/BitmapFactory.cpp @@ -2,6 +2,7 @@ #include "BitmapFactory.h" #include "NinePatchPeeker.h" +#include "SkData.h" #include "SkImageDecoder.h" #include "SkImageRef_ashmem.h" #include "SkImageRef_GlobalPool.h" @@ -137,7 +138,6 @@ static SkBitmap::Config configForScaledOutput(SkBitmap::Config config) { switch (config) { case SkBitmap::kNo_Config: case SkBitmap::kIndex8_Config: - case SkBitmap::kRLE_Index8_Config: return SkBitmap::kARGB_8888_Config; default: break; @@ -475,6 +475,12 @@ static jobject nativeDecodeFileDescriptor(JNIEnv* env, jobject clazz, jobject fi jint descriptor = jniGetFDFromFileDescriptor(env, fileDescriptor); + struct stat fdStat; + if (fstat(descriptor, &fdStat) == -1) { + doThrowIOE(env, "broken file descriptor"); + return nullObjectReturn("fstat return -1"); + } + bool isPurgeable = optionsPurgeable(env, bitmapFactoryOptions); bool isShareable = optionsShareable(env, bitmapFactoryOptions); bool weOwnTheFD = false; @@ -486,17 +492,8 @@ static jobject nativeDecodeFileDescriptor(JNIEnv* env, jobject clazz, jobject fi } } - SkFDStream* stream = new SkFDStream(descriptor, weOwnTheFD); - SkAutoUnref aur(stream); - if (!stream->isValid()) { - return NULL; - } - - /* Restore our offset when we leave, so we can be called more than once - with the same descriptor. This is only required if we didn't dup the - file descriptor, but it is OK to do it all the time. - */ - AutoFDSeek as(descriptor); + SkAutoTUnref<SkData> data(SkData::NewFromFD(descriptor)); + SkAutoTUnref<SkMemoryStream> stream(new SkMemoryStream(data)); /* Allow purgeable iff we own the FD, i.e., in the puregeable and shareable case. diff --git a/core/jni/android/graphics/BitmapRegionDecoder.cpp b/core/jni/android/graphics/BitmapRegionDecoder.cpp index b218bcd..10ef60a 100644 --- a/core/jni/android/graphics/BitmapRegionDecoder.cpp +++ b/core/jni/android/graphics/BitmapRegionDecoder.cpp @@ -17,6 +17,7 @@ #define LOG_TAG "BitmapRegionDecoder" #include "SkBitmap.h" +#include "SkData.h" #include "SkImageEncoder.h" #include "GraphicsJNI.h" #include "SkUtils.h" @@ -25,7 +26,6 @@ #include "SkStream.h" #include "BitmapFactory.h" #include "AutoDecodeCancel.h" -#include "SkBitmapRegionDecoder.h" #include "CreateJavaOutputStreamAdaptor.h" #include "Utils.h" #include "JNIHelp.h" @@ -49,6 +49,33 @@ using namespace android; +class SkBitmapRegionDecoder { +public: + SkBitmapRegionDecoder(SkImageDecoder* decoder, int width, int height) { + fDecoder = decoder; + fWidth = width; + fHeight = height; + } + ~SkBitmapRegionDecoder() { + SkDELETE(fDecoder); + } + + bool decodeRegion(SkBitmap* bitmap, const SkIRect& rect, + SkBitmap::Config pref, int sampleSize) { + fDecoder->setSampleSize(sampleSize); + return fDecoder->decodeRegion(bitmap, rect, pref); + } + + SkImageDecoder* getDecoder() const { return fDecoder; } + int getWidth() const { return fWidth; } + int getHeight() const { return fHeight; } + +private: + SkImageDecoder* fDecoder; + int fWidth; + int fHeight; +}; + static SkMemoryStream* buildSkMemoryStream(SkStream *stream) { size_t bufferSize = 4096; size_t streamLen = 0; @@ -70,7 +97,7 @@ static SkMemoryStream* buildSkMemoryStream(SkStream *stream) { return streamMem; } -static jobject doBuildTileIndex(JNIEnv* env, SkStream* stream) { +static jobject createBitmapRegionDecoder(JNIEnv* env, SkStream* stream) { SkImageDecoder* decoder = SkImageDecoder::Factory(stream); int width, height; if (NULL == decoder) { @@ -87,11 +114,11 @@ static jobject doBuildTileIndex(JNIEnv* env, SkStream* stream) { snprintf(msg, sizeof(msg), "Image failed to decode using %s decoder", decoder->getFormatName()); doThrowIOE(env, msg); + SkDELETE(decoder); return nullObjectReturn("decoder->buildTileIndex returned false"); } - SkBitmapRegionDecoder *bm = new SkBitmapRegionDecoder(decoder, stream, width, height); - + SkBitmapRegionDecoder *bm = new SkBitmapRegionDecoder(decoder, width, height); return GraphicsJNI::createBitmapRegionDecoder(env, bm); } @@ -103,7 +130,10 @@ static jobject nativeNewInstanceFromByteArray(JNIEnv* env, jobject, jbyteArray b */ AutoJavaByteArray ar(env, byteArray); SkStream* stream = new SkMemoryStream(ar.ptr() + offset, length, true); - return doBuildTileIndex(env, stream); + + jobject brd = createBitmapRegionDecoder(env, stream); + SkSafeUnref(stream); // the decoder now holds a reference + return brd; } static jobject nativeNewInstanceFromFileDescriptor(JNIEnv* env, jobject clazz, @@ -111,56 +141,36 @@ static jobject nativeNewInstanceFromFileDescriptor(JNIEnv* env, jobject clazz, NPE_CHECK_RETURN_ZERO(env, fileDescriptor); jint descriptor = jniGetFDFromFileDescriptor(env, fileDescriptor); - SkStream *stream = NULL; + struct stat fdStat; - int newFD; if (fstat(descriptor, &fdStat) == -1) { doThrowIOE(env, "broken file descriptor"); return nullObjectReturn("fstat return -1"); } - if (isShareable && - S_ISREG(fdStat.st_mode) && - (newFD = ::dup(descriptor)) != -1) { - SkFDStream* fdStream = new SkFDStream(newFD, true); - if (!fdStream->isValid()) { - fdStream->unref(); - return NULL; - } - stream = fdStream; - } else { - /* Restore our offset when we leave, so we can be called more than once - with the same descriptor. This is only required if we didn't dup the - file descriptor, but it is OK to do it all the time. - */ - AutoFDSeek as(descriptor); - - SkFDStream* fdStream = new SkFDStream(descriptor, false); - if (!fdStream->isValid()) { - fdStream->unref(); - return NULL; - } - stream = buildSkMemoryStream(fdStream); - fdStream->unref(); - } + SkAutoTUnref<SkData> data(SkData::NewFromFD(descriptor)); + SkMemoryStream* stream = new SkMemoryStream(data); - return doBuildTileIndex(env, stream); + jobject brd = createBitmapRegionDecoder(env, stream); + SkSafeUnref(stream); // the decoder now holds a reference + return brd; } static jobject nativeNewInstanceFromStream(JNIEnv* env, jobject clazz, jobject is, // InputStream jbyteArray storage, // byte[] jboolean isShareable) { - jobject largeBitmap = NULL; + jobject brd = NULL; SkStream* stream = CreateJavaInputStreamAdaptor(env, is, storage, 1024); if (stream) { // for now we don't allow shareable with java inputstreams - SkMemoryStream *mStream = buildSkMemoryStream(stream); - largeBitmap = doBuildTileIndex(env, mStream); + SkMemoryStream* mStream = buildSkMemoryStream(stream); + brd = createBitmapRegionDecoder(env, mStream); + SkSafeUnref(mStream); // the decoder now holds a reference stream->unref(); } - return largeBitmap; + return brd; } static jobject nativeNewInstanceFromAsset(JNIEnv* env, jobject clazz, @@ -171,7 +181,10 @@ static jobject nativeNewInstanceFromAsset(JNIEnv* env, jobject clazz, assStream = new AssetStreamAdaptor(asset); stream = buildSkMemoryStream(assStream); assStream->unref(); - return doBuildTileIndex(env, stream); + + jobject brd = createBitmapRegionDecoder(env, stream); + SkSafeUnref(stream); // the decoder now holds a reference + return brd; } /* diff --git a/core/jni/android/graphics/GraphicsJNI.h b/core/jni/android/graphics/GraphicsJNI.h index 69b67cb..b676527 100644 --- a/core/jni/android/graphics/GraphicsJNI.h +++ b/core/jni/android/graphics/GraphicsJNI.h @@ -7,10 +7,10 @@ #include "SkMallocPixelRef.h" #include "SkPoint.h" #include "SkRect.h" -#include "../images/SkBitmapRegionDecoder.h" -#include "../images/SkImageDecoder.h" +#include "SkImageDecoder.h" #include <jni.h> +class SkBitmapRegionDecoder; class SkCanvas; class SkPaint; class SkPicture; diff --git a/core/jni/android/graphics/Picture.cpp b/core/jni/android/graphics/Picture.cpp index f28fc26..9c02219 100644 --- a/core/jni/android/graphics/Picture.cpp +++ b/core/jni/android/graphics/Picture.cpp @@ -40,7 +40,7 @@ public: SkPicture* picture = NULL; SkStream* strm = CreateJavaInputStreamAdaptor(env, jstream, jstorage); if (strm) { - picture = new SkPicture(strm); + picture = SkPicture::CreateFromStream(strm); delete strm; } return picture; diff --git a/graphics/jni/android_renderscript_RenderScript.cpp b/graphics/jni/android_renderscript_RenderScript.cpp index b9f8713..690493d 100644 --- a/graphics/jni/android_renderscript_RenderScript.cpp +++ b/graphics/jni/android_renderscript_RenderScript.cpp @@ -27,7 +27,6 @@ #include <core/SkPixelRef.h> #include <core/SkStream.h> #include <core/SkTemplates.h> -#include <images/SkImageDecoder.h> #include <androidfw/Asset.h> #include <androidfw/AssetManager.h> |
