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

Commit b9c58ab6 authored by Leon Scroggins III's avatar Leon Scroggins III
Browse files

Merge AssetStream with AssetStreamAdaptor.

Add enums to the constructor for AssetStreamAdaptor to choose the
different behaviors used by the (former) two different classes.

The old clients of AssetStream now get the following features of
AssetStreamAdaptor
- Debugging statements on error.
- The stream is an SkStreamRewindable.
- getLength() returns the correct value, and the old way of getting
  the length (read(NULL, 0)) is no longer implemented, since it is
  no longer used.
- isAtEnd() returns the correct value. ToT Skia makes it pure virtual,
  so some implementation is necessary.

Change-Id: I2a5395914e4f53830aaefee396556459083a1c56
parent 0a11eb10
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;
};
};


/**
/**