Skip to content

Commit

Permalink
Android image file loading
Browse files Browse the repository at this point in the history
  • Loading branch information
justindriggers committed Feb 24, 2024
1 parent 0bb4ce4 commit 0f95c05
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 4 deletions.
8 changes: 8 additions & 0 deletions carbonara/app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,14 @@ android {
version = "3.22.1"
}
}
sourceSets {
named("main") {
assets.srcDirs(
"../../assets/audio/",
"../../assets/fonts/"
)
}
}
}

dependencies {
Expand Down
2 changes: 1 addition & 1 deletion carbonara/app/src/main/cpp/ApplicationAdapter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ ApplicationAdapter::ApplicationAdapter(android_app& app) {
_context = context;

auto renderer = std::shared_ptr<render::OpenGLRenderer>(
render::OpenGLRenderer::create(std::make_unique<AndroidOpenGLFileLoader>())
render::OpenGLRenderer::create(std::make_unique<AndroidOpenGLFileLoader>(*app.activity->assetManager))
);

auto logger = std::make_shared<AndroidLogger>();
Expand Down
33 changes: 30 additions & 3 deletions carbonara/app/src/main/cpp/platform/AndroidOpenGLFileLoader.cpp
Original file line number Diff line number Diff line change
@@ -1,12 +1,39 @@
#include "AndroidOpenGLFileLoader.h"

#include <string>

#include <android/imagedecoder.h>

namespace linguine::carbonara {

render::OpenGLFileLoader::ImageFile AndroidOpenGLFileLoader::getImage() const {
const auto filename = std::string("font.png");

auto image = AAssetManager_open(&_assetManager, filename.data(), AASSET_MODE_BUFFER);

AImageDecoder* decoder;
if (AImageDecoder_createFromAAsset(image, &decoder) != ANDROID_IMAGE_DECODER_SUCCESS) {
return {};
}

AImageDecoder_setAndroidBitmapFormat(decoder, ANDROID_BITMAP_FORMAT_RGBA_8888);

const AImageDecoderHeaderInfo* header;
header = AImageDecoder_getHeaderInfo(decoder);

auto width = AImageDecoderHeaderInfo_getWidth(header);
auto height = AImageDecoderHeaderInfo_getHeight(header);
auto stride = AImageDecoder_getMinimumStride(decoder);

auto data = std::vector<std::byte>(height * stride);
if (AImageDecoder_decodeImage(decoder, data.data(), stride, data.size()) != ANDROID_IMAGE_DECODER_SUCCESS) {
return {};
}

return ImageFile {
.width = 0,
.height = 0,
.data = std::vector<std::byte>(0)
.width = width,
.height = height,
.data = data
};
}

Expand Down
8 changes: 8 additions & 0 deletions carbonara/app/src/main/cpp/platform/AndroidOpenGLFileLoader.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,21 @@

#include <OpenGLFileLoader.h>

#include <android/asset_manager.h>

namespace linguine::carbonara {

class AndroidOpenGLFileLoader : public render::OpenGLFileLoader {
public:
explicit AndroidOpenGLFileLoader(AAssetManager& assetManager)
: _assetManager(assetManager) {}

~AndroidOpenGLFileLoader() override = default;

[[nodiscard]] ImageFile getImage() const override;

private:
AAssetManager& _assetManager;
};

} // namespace linguine::carbonara

0 comments on commit 0f95c05

Please sign in to comment.