readium / readium-sdk

A C++ ePub renderer SDK
BSD 3-Clause "New" or "Revised" License
385 stars 164 forks source link

Add method getCoverManifestItem #241

Closed TienHai closed 7 years ago

TienHai commented 8 years ago

A method exist in sdk/ePub3/package.cpp for get cover item from manifest, but this method not implemented in jni for java side.

TienHai commented 8 years ago

After in java side:

ManifestItem coverItm = package.getCoverManifestItem();
if (coverItm == null)
    return;
PackageResource pckgRsc = package.getResourceAtRelativePath(coverItm.getHref());
byte[] data = pckgRsc.readDataFull();
Bitmap epubCover = BitmapFactory.decodeByteArray(data , 0, data.length);
danielweck commented 8 years ago

For reference: https://github.com/readium/readium-sdk/blob/develop/ePub3/ePub/package.cpp#L1597

shared_ptr<ManifestItem> Package::CoverManifestItem() const
{
    string EPUB2CoverID = EPUB2PropertyMatching(string("cover"));
    for (auto& item : _manifestByID)
    {
        if (item.second->HasProperty(ePub3::ItemProperties::CoverImage) || item.second->Identifier() == EPUB2CoverID) {
            return item.second;
        }
    }

    return nullptr;
}

Note that iOS RDServices does not implement this utility function either (the ReadiumSDK API is currently not consistently 1-to-1 mapped across platform-specific layers): https://github.com/readium/readium-sdk/blob/develop/Platform/Apple/RDServices/Main/RDPackage.mm

danielweck commented 8 years ago

I do not have any objections to merge this PR.

danielweck commented 7 years ago

Ric and I reviewed this code change. Let's merge. Note: for consistency sake, RDServices should probably align too at some point, but as I said above, there is no 1-to-1 mapping between C++ and the platform-specific code layers, yet.