Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e242e2f2 authored by Derek Sollenberger's avatar Derek Sollenberger Committed by Android (Google) Code Review
Browse files

Merge "Changes needed to support Skia at r10377."

parents 045b309a 5827cb50
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -44,7 +44,7 @@


#include <core/SkBitmap.h>
#include <core/SkBitmap.h>
#include <core/SkStream.h>
#include <core/SkStream.h>
#include <images/SkImageDecoder.h>
#include <core/SkImageDecoder.h>


#include <GLES/gl.h>
#include <GLES/gl.h>
#include <GLES/glext.h>
#include <GLES/glext.h>
+0 −4
Original line number Original line Diff line number Diff line
@@ -17,10 +17,6 @@ endif


LOCAL_CFLAGS += -DGL_GLEXT_PROTOTYPES -DEGL_EGLEXT_PROTOTYPES
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:= \
LOCAL_SRC_FILES:= \
	AndroidRuntime.cpp \
	AndroidRuntime.cpp \
	Time.cpp \
	Time.cpp \
+9 −12
Original line number Original line Diff line number Diff line
@@ -2,6 +2,7 @@


#include "BitmapFactory.h"
#include "BitmapFactory.h"
#include "NinePatchPeeker.h"
#include "NinePatchPeeker.h"
#include "SkData.h"
#include "SkImageDecoder.h"
#include "SkImageDecoder.h"
#include "SkImageRef_ashmem.h"
#include "SkImageRef_ashmem.h"
#include "SkImageRef_GlobalPool.h"
#include "SkImageRef_GlobalPool.h"
@@ -137,7 +138,6 @@ static SkBitmap::Config configForScaledOutput(SkBitmap::Config config) {
    switch (config) {
    switch (config) {
        case SkBitmap::kNo_Config:
        case SkBitmap::kNo_Config:
        case SkBitmap::kIndex8_Config:
        case SkBitmap::kIndex8_Config:
        case SkBitmap::kRLE_Index8_Config:
            return SkBitmap::kARGB_8888_Config;
            return SkBitmap::kARGB_8888_Config;
        default:
        default:
            break;
            break;
@@ -475,6 +475,12 @@ static jobject nativeDecodeFileDescriptor(JNIEnv* env, jobject clazz, jobject fi


    jint descriptor = jniGetFDFromFileDescriptor(env, fileDescriptor);
    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 isPurgeable = optionsPurgeable(env, bitmapFactoryOptions);
    bool isShareable = optionsShareable(env, bitmapFactoryOptions);
    bool isShareable = optionsShareable(env, bitmapFactoryOptions);
    bool weOwnTheFD = false;
    bool weOwnTheFD = false;
@@ -486,17 +492,8 @@ static jobject nativeDecodeFileDescriptor(JNIEnv* env, jobject clazz, jobject fi
        }
        }
    }
    }


    SkFDStream* stream = new SkFDStream(descriptor, weOwnTheFD);
    SkAutoTUnref<SkData> data(SkData::NewFromFD(descriptor));
    SkAutoUnref aur(stream);
    SkAutoTUnref<SkMemoryStream> stream(new SkMemoryStream(data));
    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);


    /* Allow purgeable iff we own the FD, i.e., in the puregeable and
    /* Allow purgeable iff we own the FD, i.e., in the puregeable and
       shareable case.
       shareable case.
+50 −37
Original line number Original line Diff line number Diff line
@@ -17,6 +17,7 @@
#define LOG_TAG "BitmapRegionDecoder"
#define LOG_TAG "BitmapRegionDecoder"


#include "SkBitmap.h"
#include "SkBitmap.h"
#include "SkData.h"
#include "SkImageEncoder.h"
#include "SkImageEncoder.h"
#include "GraphicsJNI.h"
#include "GraphicsJNI.h"
#include "SkUtils.h"
#include "SkUtils.h"
@@ -25,7 +26,6 @@
#include "SkStream.h"
#include "SkStream.h"
#include "BitmapFactory.h"
#include "BitmapFactory.h"
#include "AutoDecodeCancel.h"
#include "AutoDecodeCancel.h"
#include "SkBitmapRegionDecoder.h"
#include "CreateJavaOutputStreamAdaptor.h"
#include "CreateJavaOutputStreamAdaptor.h"
#include "Utils.h"
#include "Utils.h"
#include "JNIHelp.h"
#include "JNIHelp.h"
@@ -49,6 +49,33 @@


using namespace android;
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) {
static SkMemoryStream* buildSkMemoryStream(SkStream *stream) {
    size_t bufferSize = 4096;
    size_t bufferSize = 4096;
    size_t streamLen = 0;
    size_t streamLen = 0;
@@ -70,7 +97,7 @@ static SkMemoryStream* buildSkMemoryStream(SkStream *stream) {
    return streamMem;
    return streamMem;
}
}


static jobject doBuildTileIndex(JNIEnv* env, SkStream* stream) {
static jobject createBitmapRegionDecoder(JNIEnv* env, SkStream* stream) {
    SkImageDecoder* decoder = SkImageDecoder::Factory(stream);
    SkImageDecoder* decoder = SkImageDecoder::Factory(stream);
    int width, height;
    int width, height;
    if (NULL == decoder) {
    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",
        snprintf(msg, sizeof(msg), "Image failed to decode using %s decoder",
                decoder->getFormatName());
                decoder->getFormatName());
        doThrowIOE(env, msg);
        doThrowIOE(env, msg);
        SkDELETE(decoder);
        return nullObjectReturn("decoder->buildTileIndex returned false");
        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);
    return GraphicsJNI::createBitmapRegionDecoder(env, bm);
}
}


@@ -103,7 +130,10 @@ static jobject nativeNewInstanceFromByteArray(JNIEnv* env, jobject, jbyteArray b
     */
     */
    AutoJavaByteArray ar(env, byteArray);
    AutoJavaByteArray ar(env, byteArray);
    SkStream* stream = new SkMemoryStream(ar.ptr() + offset, length, true);
    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,
static jobject nativeNewInstanceFromFileDescriptor(JNIEnv* env, jobject clazz,
@@ -111,56 +141,36 @@ static jobject nativeNewInstanceFromFileDescriptor(JNIEnv* env, jobject clazz,
    NPE_CHECK_RETURN_ZERO(env, fileDescriptor);
    NPE_CHECK_RETURN_ZERO(env, fileDescriptor);


    jint descriptor = jniGetFDFromFileDescriptor(env, fileDescriptor);
    jint descriptor = jniGetFDFromFileDescriptor(env, fileDescriptor);
    SkStream *stream = NULL;

    struct stat fdStat;
    struct stat fdStat;
    int newFD;
    if (fstat(descriptor, &fdStat) == -1) {
    if (fstat(descriptor, &fdStat) == -1) {
        doThrowIOE(env, "broken file descriptor");
        doThrowIOE(env, "broken file descriptor");
        return nullObjectReturn("fstat return -1");
        return nullObjectReturn("fstat return -1");
    }
    }


    if (isShareable &&
    SkAutoTUnref<SkData> data(SkData::NewFromFD(descriptor));
            S_ISREG(fdStat.st_mode) &&
    SkMemoryStream* stream = new SkMemoryStream(data);
            (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();
    }


    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,
static jobject nativeNewInstanceFromStream(JNIEnv* env, jobject clazz,
                                  jobject is,       // InputStream
                                  jobject is,       // InputStream
                                  jbyteArray storage, // byte[]
                                  jbyteArray storage, // byte[]
                                  jboolean isShareable) {
                                  jboolean isShareable) {
    jobject largeBitmap = NULL;
    jobject brd = NULL;
    SkStream* stream = CreateJavaInputStreamAdaptor(env, is, storage, 1024);
    SkStream* stream = CreateJavaInputStreamAdaptor(env, is, storage, 1024);


    if (stream) {
    if (stream) {
        // for now we don't allow shareable with java inputstreams
        // for now we don't allow shareable with java inputstreams
        SkMemoryStream* mStream = buildSkMemoryStream(stream);
        SkMemoryStream* mStream = buildSkMemoryStream(stream);
        largeBitmap = doBuildTileIndex(env, mStream);
        brd = createBitmapRegionDecoder(env, mStream);
        SkSafeUnref(mStream); // the decoder now holds a reference
        stream->unref();
        stream->unref();
    }
    }
    return largeBitmap;
    return brd;
}
}


static jobject nativeNewInstanceFromAsset(JNIEnv* env, jobject clazz,
static jobject nativeNewInstanceFromAsset(JNIEnv* env, jobject clazz,
@@ -171,7 +181,10 @@ static jobject nativeNewInstanceFromAsset(JNIEnv* env, jobject clazz,
    assStream = new AssetStreamAdaptor(asset);
    assStream = new AssetStreamAdaptor(asset);
    stream = buildSkMemoryStream(assStream);
    stream = buildSkMemoryStream(assStream);
    assStream->unref();
    assStream->unref();
    return doBuildTileIndex(env, stream);

    jobject brd = createBitmapRegionDecoder(env, stream);
    SkSafeUnref(stream); // the decoder now holds a reference
    return brd;
}
}


/*
/*
+2 −2
Original line number Original line Diff line number Diff line
@@ -7,10 +7,10 @@
#include "SkMallocPixelRef.h"
#include "SkMallocPixelRef.h"
#include "SkPoint.h"
#include "SkPoint.h"
#include "SkRect.h"
#include "SkRect.h"
#include "../images/SkBitmapRegionDecoder.h"
#include "SkImageDecoder.h"
#include "../images/SkImageDecoder.h"
#include <jni.h>
#include <jni.h>


class SkBitmapRegionDecoder;
class SkCanvas;
class SkCanvas;
class SkPaint;
class SkPaint;
class SkPicture;
class SkPicture;
Loading