#include #include #include "image.hpp" namespace mbgl { namespace android { mbgl::style::Image Image::getImage(jni::JNIEnv& env, const jni::Object& image) { static auto& javaClass = jni::Class::Singleton(env); static auto widthField = javaClass.GetField(env, "width"); static auto heightField = javaClass.GetField(env, "height"); static auto pixelRatioField = javaClass.GetField(env, "pixelRatio"); static auto bufferField = javaClass.GetField>(env, "buffer"); static auto nameField = javaClass.GetField(env, "name"); static auto sdfField = javaClass.GetField(env, "sdf"); static auto contentField = javaClass.GetField>(env, "content"); static auto stretchXField = javaClass.GetField>(env, "stretchX"); static auto stretchYField = javaClass.GetField>(env, "stretchY"); auto height = image.Get(env, heightField); auto width = image.Get(env, widthField); auto pixelRatio = image.Get(env, pixelRatioField); auto pixels = image.Get(env, bufferField); auto name = jni::Make(env, image.Get(env, nameField)); auto sdf = (bool)image.Get(env, sdfField); auto content = image.Get(env, contentField); auto stretchX = image.Get(env, stretchXField); auto stretchY = image.Get(env, stretchYField); jni::NullCheck(env, pixels.get()); std::size_t size = pixels.Length(env); mbgl::PremultipliedImage premultipliedImage({static_cast(width), static_cast(height)}); if (premultipliedImage.bytes() != uint32_t(size)) { throw mbgl::util::StyleImageException("Image pixel count mismatch"); } jni::GetArrayRegion(env, *pixels, 0, size, reinterpret_cast(premultipliedImage.data.get())); style::ImageStretches imageStretchesX = {}; style::ImageStretches imageStretchesY = {}; if (stretchX.get()) { std::size_t sizeX = stretchX.Length(env); for (jni::jsize i = 0; i < sizeX - 1; i += 2) { imageStretchesX.push_back({stretchX.Get(env, i), stretchX.Get(env, i + 1)}); } } if (stretchY.get()) { std::size_t sizeY = stretchY.Length(env); for (jni::jsize i = 0; i < sizeY - 1; i += 2) { imageStretchesY.push_back({stretchY.Get(env, i), stretchY.Get(env, i + 1)}); } } if (content) { const style::ImageContent imageContent = style::ImageContent{ content.Get(env, 0), content.Get(env, 1), content.Get(env, 2), content.Get(env, 3)}; return mbgl::style::Image{name, std::move(premultipliedImage), pixelRatio, sdf, imageStretchesX, imageStretchesY, std::move(imageContent)}; } return mbgl::style::Image{name, std::move(premultipliedImage), pixelRatio, sdf, imageStretchesX, imageStretchesY}; } void Image::registerNative(jni::JNIEnv& env) { jni::Class::Singleton(env); } } // namespace android } // namespace mbgl