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

Commit b311b342 authored by Leon Scroggins III's avatar Leon Scroggins III Committed by Android (Google) Code Review
Browse files

Merge "Merge AssetStream with AssetStreamAdaptor."

parents c6a0a574 b9c58ab6
Loading
Loading
Loading
Loading
+3 −1
Original line number Original line Diff line number Diff line
@@ -541,7 +541,9 @@ static jobject nativeDecodeAsset(JNIEnv* env, jobject clazz, jint native_asset,
    } else {
    } else {
        // since we know we'll be done with the asset when we return, we can
        // since we know we'll be done with the asset when we return, we can
        // just use a simple wrapper
        // just use a simple wrapper
        stream = new AssetStreamAdaptor(asset);
        stream = new AssetStreamAdaptor(asset,
                                        AssetStreamAdaptor::kNo_OwnAsset,
                                        AssetStreamAdaptor::kNo_HasMemoryBase);
    }
    }
    SkAutoUnref aur(stream);
    SkAutoUnref aur(stream);
    return doDecode(env, stream, padding, options, forcePurgeable, forcePurgeable);
    return doDecode(env, stream, padding, options, forcePurgeable, forcePurgeable);
+3 −1
Original line number Original line Diff line number Diff line
@@ -85,7 +85,9 @@ static void movie_draw(JNIEnv* env, jobject movie, jobject canvas,
static jobject movie_decodeAsset(JNIEnv* env, jobject clazz, jint native_asset) {
static jobject movie_decodeAsset(JNIEnv* env, jobject clazz, jint native_asset) {
    android::Asset* asset = reinterpret_cast<android::Asset*>(native_asset);
    android::Asset* asset = reinterpret_cast<android::Asset*>(native_asset);
    if (asset == NULL) return NULL;
    if (asset == NULL) return NULL;
    SkAutoTUnref<SkStreamRewindable> stream (new android::AssetStreamAdaptor(asset));
    SkAutoTUnref<SkStreamRewindable> stream (new android::AssetStreamAdaptor(asset,
            android::AssetStreamAdaptor::kNo_OwnAsset,
            android::AssetStreamAdaptor::kNo_HasMemoryBase));
    SkMovie* moov = SkMovie::DecodeStream(stream.get());
    SkMovie* moov = SkMovie::DecodeStream(stream.get());
    return create_jmovie(env, moov);
    return create_jmovie(env, moov);
}
}
+7 −61
Original line number Original line Diff line number Diff line
@@ -32,68 +32,10 @@
#endif
#endif


#include "TypefaceImpl.h"
#include "TypefaceImpl.h"
#include "Utils.h"


namespace android {
namespace android {


class AssetStream : public SkStream {
public:
    AssetStream(Asset* asset, bool hasMemoryBase) : fAsset(asset)
    {
        fMemoryBase = hasMemoryBase ? fAsset->getBuffer(false) : NULL;
    }

    virtual ~AssetStream()
    {
        delete fAsset;
    }

    virtual const void* getMemoryBase()
    {
        return fMemoryBase;
    }

    virtual bool rewind()
    {
        off64_t pos = fAsset->seek(0, SEEK_SET);
        return pos != (off64_t)-1;
    }

    virtual size_t read(void* buffer, size_t size)
    {
        ssize_t amount;

        if (NULL == buffer)
        {
            if (0 == size)  // caller is asking us for our total length
                return fAsset->getLength();

            // asset->seek returns new total offset
            // we want to return amount that was skipped

            off64_t oldOffset = fAsset->seek(0, SEEK_CUR);
            if (-1 == oldOffset)
                return 0;
            off64_t newOffset = fAsset->seek(size, SEEK_CUR);
            if (-1 == newOffset)
                return 0;

            amount = newOffset - oldOffset;
        }
        else
        {
            amount = fAsset->read(buffer, size);
        }

        if (amount < 0)
            amount = 0;
        return amount;
    }

private:
    Asset*      fAsset;
    const void* fMemoryBase;
};

#ifdef USE_MINIKIN
#ifdef USE_MINIKIN


// Any weight greater than or equal to this is considered "bold" for
// Any weight greater than or equal to this is considered "bold" for
@@ -194,7 +136,9 @@ TypefaceImpl* TypefaceImpl_createFromFile(const char* filename) {
}
}


TypefaceImpl* TypefaceImpl_createFromAsset(Asset* asset) {
TypefaceImpl* TypefaceImpl_createFromAsset(Asset* asset) {
    SkStream* stream = new AssetStream(asset, true);
    SkStream* stream = new AssetStreamAdaptor(asset,
                                              AssetStreamAdaptor::kYes_OwnAsset,
                                              AssetStreamAdaptor::kYes_HasMemoryBase);
    SkTypeface* face = SkTypeface::CreateFromStream(stream);
    SkTypeface* face = SkTypeface::CreateFromStream(stream);
    // SkTypeFace::CreateFromStream calls ref() on the stream, so we
    // SkTypeFace::CreateFromStream calls ref() on the stream, so we
    // need to unref it here or it won't be freed later on
    // need to unref it here or it won't be freed later on
@@ -234,7 +178,9 @@ TypefaceImpl* TypefaceImpl_createFromFile(const char* filename) {
}
}


TypefaceImpl* TypefaceImpl_createFromAsset(Asset* asset) {
TypefaceImpl* TypefaceImpl_createFromAsset(Asset* asset) {
    SkStream* stream = new AssetStream(asset, true);
    SkStream* stream = new AssetStreamAdaptor(asset,
                                              AssetStreamAdaptor::kYes_OwnAsset,
                                              AssetStreamAdaptor::kYes_HasMemoryBase);
    SkTypeface* face = SkTypeface::CreateFromStream(stream);
    SkTypeface* face = SkTypeface::CreateFromStream(stream);
    // SkTypeFace::CreateFromStream calls ref() on the stream, so we
    // SkTypeFace::CreateFromStream calls ref() on the stream, so we
    // need to unref it here or it won't be freed later on
    // need to unref it here or it won't be freed later on
+15 −0
Original line number Original line Diff line number Diff line
@@ -19,6 +19,21 @@


using namespace android;
using namespace android;


AssetStreamAdaptor::AssetStreamAdaptor(Asset* asset, OwnAsset ownAsset,
                                       HasMemoryBase hasMemoryBase)
    : fAsset(asset)
    , fMemoryBase(kYes_HasMemoryBase == hasMemoryBase ?
                  asset->getBuffer(false) : NULL)
    , fOwnAsset(ownAsset)
{
}

AssetStreamAdaptor::~AssetStreamAdaptor() {
    if (kYes_OwnAsset == fOwnAsset) {
        delete fAsset;
    }
}

bool AssetStreamAdaptor::rewind() {
bool AssetStreamAdaptor::rewind() {
    off64_t pos = fAsset->seek(0, SEEK_SET);
    off64_t pos = fAsset->seek(0, SEEK_SET);
    if (pos == (off64_t)-1) {
    if (pos == (off64_t)-1) {
+22 −2
Original line number Original line Diff line number Diff line
@@ -28,16 +28,36 @@ namespace android {


class AssetStreamAdaptor : public SkStreamRewindable {
class AssetStreamAdaptor : public SkStreamRewindable {
public:
public:
    AssetStreamAdaptor(Asset* a) : fAsset(a) {}
    // Enum passed to constructor. If set to kYes_OwnAsset,
    // the passed in Asset will be deleted upon destruction.
    enum OwnAsset {
        kYes_OwnAsset,
        kNo_OwnAsset,
    };

    // Enum passed to constructor. If set to kYes_HasMemoryBase,
    // getMemoryBase will return the Asset's buffer.
    enum HasMemoryBase {
        kYes_HasMemoryBase,
        kNo_HasMemoryBase,
    };

    AssetStreamAdaptor(Asset*, OwnAsset, HasMemoryBase);
    ~AssetStreamAdaptor();

    virtual bool rewind();
    virtual bool rewind();
    virtual size_t read(void* buffer, size_t size);
    virtual size_t read(void* buffer, size_t size);
    virtual bool hasLength() const { return true; }
    virtual bool hasLength() const { return true; }
    virtual size_t getLength() const;
    virtual size_t getLength() const;
    virtual bool isAtEnd() const;
    virtual bool isAtEnd() const;


    virtual const void* getMemoryBase() { return fMemoryBase; }

    virtual SkStreamRewindable* duplicate() const;
    virtual SkStreamRewindable* duplicate() const;
private:
private:
    Asset*              fAsset;
    Asset*              fAsset;
    const void* const   fMemoryBase;
    const OwnAsset      fOwnAsset;
};
};


/**
/**