Changes needed to support Skia at r10377.
Change-Id: Id1e1c8c5938ee1a33c6fa3caabd2c28e89243eb4
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 @@
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 @@
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 @@
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 @@
}
}
- 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 @@
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 @@
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 @@
*/
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 @@
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);
+ SkAutoTUnref<SkData> data(SkData::NewFromFD(descriptor));
+ SkMemoryStream* stream = new SkMemoryStream(data);
- SkFDStream* fdStream = new SkFDStream(descriptor, false);
- if (!fdStream->isValid()) {
- fdStream->unref();
- return NULL;
- }
- stream = buildSkMemoryStream(fdStream);
- fdStream->unref();
- }
-
- 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 @@
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 @@
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>