Changes needed to support Skia at r10377.
Change-Id: Id1e1c8c5938ee1a33c6fa3caabd2c28e89243eb4
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -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 \
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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);
|
||||
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 @@ 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;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user