Loading cmds/bootanimation/BootAnimation.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -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> Loading core/jni/Android.mk +0 −4 Original line number Diff line number Diff line Loading @@ -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 \ Loading core/jni/android/graphics/BitmapFactory.cpp +9 −12 Original line number Diff line number Diff line Loading @@ -2,6 +2,7 @@ #include "BitmapFactory.h" #include "NinePatchPeeker.h" #include "SkData.h" #include "SkImageDecoder.h" #include "SkImageRef_ashmem.h" #include "SkImageRef_GlobalPool.h" Loading Loading @@ -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; Loading Loading @@ -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; Loading @@ -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. Loading core/jni/android/graphics/BitmapRegionDecoder.cpp +50 −37 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ #define LOG_TAG "BitmapRegionDecoder" #include "SkBitmap.h" #include "SkData.h" #include "SkImageEncoder.h" #include "GraphicsJNI.h" #include "SkUtils.h" Loading @@ -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" Loading @@ -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; Loading @@ -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) { Loading @@ -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); } Loading @@ -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, Loading @@ -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); 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, Loading @@ -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; } /* Loading core/jni/android/graphics/GraphicsJNI.h +2 −2 Original line number Diff line number Diff line Loading @@ -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; Loading Loading
cmds/bootanimation/BootAnimation.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -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> Loading
core/jni/Android.mk +0 −4 Original line number Diff line number Diff line Loading @@ -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 \ Loading
core/jni/android/graphics/BitmapFactory.cpp +9 −12 Original line number Diff line number Diff line Loading @@ -2,6 +2,7 @@ #include "BitmapFactory.h" #include "NinePatchPeeker.h" #include "SkData.h" #include "SkImageDecoder.h" #include "SkImageRef_ashmem.h" #include "SkImageRef_GlobalPool.h" Loading Loading @@ -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; Loading Loading @@ -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; Loading @@ -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. Loading
core/jni/android/graphics/BitmapRegionDecoder.cpp +50 −37 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ #define LOG_TAG "BitmapRegionDecoder" #include "SkBitmap.h" #include "SkData.h" #include "SkImageEncoder.h" #include "GraphicsJNI.h" #include "SkUtils.h" Loading @@ -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" Loading @@ -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; Loading @@ -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) { Loading @@ -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); } Loading @@ -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, Loading @@ -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); 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, Loading @@ -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; } /* Loading
core/jni/android/graphics/GraphicsJNI.h +2 −2 Original line number Diff line number Diff line Loading @@ -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; Loading