Changes needed to support Skia at r10377.

Change-Id: Id1e1c8c5938ee1a33c6fa3caabd2c28e89243eb4
This commit is contained in:
Derek Sollenberger
2013-07-26 14:58:06 -04:00
parent 3a6f25512c
commit 5827cb5059
7 changed files with 63 additions and 58 deletions

View File

@@ -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>

View File

@@ -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 \

View File

@@ -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.

View File

@@ -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;
}
/*

View File

@@ -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;

View File

@@ -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;

View File

@@ -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>