summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt19
-rw-r--r--src/demo.cpp324
-rw-r--r--src/demo.hpp12
-rw-r--r--src/image.cpp185
-rw-r--r--src/main.cpp9
5 files changed, 374 insertions, 175 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 060e8db..f611384 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -8,12 +8,15 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CXX_CPPCHECK "project=build/compile_commands.json;enable=information;force")
set(CMAKE_EXPORT_COMPILE_COMMANDS true)
+add_library(stb_image SHARED
+ src/stb_image.cpp)
+
add_executable(bookmouse
src/main.cpp
src/archive.cpp
src/image.cpp
src/fud_mem.cpp
- src/stb_image.cpp
+ src/demo.cpp
# src/main_window.cpp
# src/bookmouse.cpp
)
@@ -22,16 +25,30 @@ include(warnings.cmake)
find_package(spdlog REQUIRED)
find_package(Fud REQUIRED)
+find_package(SDL2 REQUIRED)
+find_package(SDL2_image REQUIRED)
+find_package(SDL2_ttf REQUIRED)
+include(FindPkgConfig)
+PKG_SEARCH_MODULE(SDL2_gfx REQUIRED SDL2_gfx)
+find_package(OpenGL REQUIRED)
target_include_directories(bookmouse PRIVATE
${FUD_INCLUDE_DIR}
${spdlog_INCLUDE_DIR}
+ ${SDL2_INCLUDE_DIRS}
)
target_link_libraries(bookmouse PRIVATE
zip
spdlog::spdlog
fud
+ stb_image
+ imgui
+ ${SDL2_LIBRARIES}
+ SDL2_image::SDL2_image
+ SDL2_ttf::SDL2_ttf
+ SDL2_gfx
+ OpenGL
)
target_compile_options(bookmouse PRIVATE ${BOOKMOUSE_WARNINGS})
diff --git a/src/demo.cpp b/src/demo.cpp
new file mode 100644
index 0000000..c571006
--- /dev/null
+++ b/src/demo.cpp
@@ -0,0 +1,324 @@
+#include "demo.hpp"
+
+#include "stb_image.h"
+
+#include <SDL.h>
+#include <SDL_opengl.h>
+#include <cstdio>
+#include <fud_c_file.hpp>
+#include <fud_string.hpp>
+#include <imgui/imgui.h>
+#include <imgui/imgui_impl_opengl3.h>
+#include <imgui/imgui_impl_sdl2.h>
+#include <spdlog/spdlog.h>
+#include <vector>
+
+namespace bookworm {
+
+// Simple helper function to load an image into a OpenGL texture with common settings
+bool LoadTextureFromMemory(const void* data, size_t data_size, GLuint* out_texture, int* out_width, int* out_height)
+{
+ // Load from file
+ int width = 0;
+ int height = 0;
+ int channelsInFile = 4;
+ unsigned char*
+ image_data = stbi_load_from_memory((const unsigned char*)data, (int)data_size, &width, &height, nullptr, 4);
+ if (image_data == nullptr) {
+ spdlog::error("Failed to get data from");
+ return false;
+ }
+
+ spdlog::info("Got result: {} pixels per row of {} scanlines with {} channels", width, height, channelsInFile);
+
+ // Create a OpenGL texture identifier
+ GLuint image_texture;
+ glGenTextures(1, &image_texture);
+ glBindTexture(GL_TEXTURE_2D, image_texture);
+
+ // Setup filtering parameters for display
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+
+ // Upload pixels into texture
+ glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image_data);
+ stbi_image_free(image_data);
+
+ *out_texture = image_texture;
+ *out_width = width;
+ *out_height = height;
+
+ return true;
+}
+
+// Open and read a file, then forward to LoadTextureFromMemory()
+bool LoadTextureFromFile(const fud::String& filename, GLuint* out_texture, int* out_width, int* out_height)
+{
+ fud::CBinaryFile inFile{filename, fud::CFileMode::ReadOnly};
+ auto fileResult = inFile.open();
+ using fud::FileStatus;
+ if (fileResult == FileStatus::Error) {
+ spdlog::error("can't open {}", filename.c_str());
+ // return err(ImageError::FileError);
+ return false;
+ }
+
+ auto fileSizeResult = inFile.size();
+ if (fileSizeResult.isError()) {
+ spdlog::error("bad file size {} {}", filename.c_str(), FileStatusToString(fileSizeResult.getError()));
+ return false;
+ }
+ auto fileSize = fileSizeResult.getOkay();
+
+ auto* filePtr = inFile.file();
+ if (filePtr == nullptr) {
+ spdlog::error("File associated with {} returned nullptr", filename.c_str());
+ // return err(ImageError::FileError);
+ return false;
+ }
+
+ std::vector<char> fileData{};
+ fileData.resize(fileSize);
+
+ auto readStatus = inFile.read(fileData.data(), fileSize, fileSize);
+ if (readStatus != FileStatus::Success) {
+ spdlog::error("bad read {} {}", filename.c_str(), FileStatusToString(readStatus));
+ return false;
+ }
+
+ bool ret = LoadTextureFromMemory(fileData.data(), fileSize, out_texture, out_width, out_height);
+ return ret;
+}
+
+int demo(const fud::String& m_filename)
+{
+
+ // Setup SDL
+ if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_GAMECONTROLLER) != 0) {
+ printf("Error: %s\n", SDL_GetError());
+ return -1;
+ }
+
+ // Decide GL+GLSL versions
+#if defined(IMGUI_IMPL_OPENGL_ES2)
+ // GL ES 2.0 + GLSL 100
+ const char* glsl_version = "#version 100";
+ SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, 0);
+ SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES);
+ SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
+ SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
+#elif defined(__APPLE__)
+ // GL 3.2 Core + GLSL 150
+ const char* glsl_version = "#version 150";
+ SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG); // Always required on Mac
+ SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
+ SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
+ SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
+#else
+ // GL 3.0 + GLSL 130
+ const char* glsl_version = "#version 130";
+ SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, 0);
+ SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
+ SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
+ SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
+#endif
+
+ // From 2.0.18: Enable native IME.
+#ifdef SDL_HINT_IME_SHOW_UI
+ SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1");
+#endif
+
+ // Create window with graphics context
+ SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
+ SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
+ SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8);
+ SDL_WindowFlags window_flags = (SDL_WindowFlags)(SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE |
+ SDL_WINDOW_ALLOW_HIGHDPI);
+ SDL_Window* window = SDL_CreateWindow(
+ "Dear ImGui SDL2+OpenGL3 example",
+ SDL_WINDOWPOS_CENTERED,
+ SDL_WINDOWPOS_CENTERED,
+ 1280,
+ 720,
+ window_flags);
+ if (window == nullptr) {
+ printf("Error: SDL_CreateWindow(): %s\n", SDL_GetError());
+ return -1;
+ }
+
+ SDL_GLContext gl_context = SDL_GL_CreateContext(window);
+ SDL_GL_MakeCurrent(window, gl_context);
+ SDL_GL_SetSwapInterval(1); // Enable vsync
+
+ // Setup Dear ImGui context
+ IMGUI_CHECKVERSION();
+ ImGui::CreateContext();
+ ImGuiIO& io = ImGui::GetIO();
+ (void)io;
+ io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls
+ io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls
+
+ // Setup Dear ImGui style
+ ImGui::StyleColorsDark();
+ // ImGui::StyleColorsLight();
+
+ // Setup Platform/Renderer backends
+ ImGui_ImplSDL2_InitForOpenGL(window, gl_context);
+ ImGui_ImplOpenGL3_Init(glsl_version);
+
+ int my_image_width = 0;
+ int my_image_height = 0;
+ GLuint my_image_texture = 0;
+ bool ret = LoadTextureFromFile(m_filename, &my_image_texture, &my_image_width, &my_image_height);
+ IM_ASSERT(ret);
+
+ // Load Fonts
+ // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use
+ // ImGui::PushFont()/PopFont() to select them.
+ // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple.
+ // - If the file cannot be loaded, the function will return a nullptr. Please handle those errors in your
+ // application (e.g. use an assertion, or display an error and quit).
+ // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling
+ // ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call.
+ // - Use '#define IMGUI_ENABLE_FREETYPE' in your imconfig file to use Freetype for higher quality font rendering.
+ // - Read 'docs/FONTS.md' for more instructions and details.
+ // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double
+ // backslash \\ !
+ // - Our Emscripten build process allows embedding fonts to be accessible at runtime from the "fonts/" folder. See
+ // Makefile.emscripten for details.
+ // io.Fonts->AddFontDefault();
+ // io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\segoeui.ttf", 18.0f);
+ // io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f);
+ // io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f);
+ // io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f);
+ // ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, nullptr,
+ // io.Fonts->GetGlyphRangesJapanese()); IM_ASSERT(font != nullptr);
+
+ // Our state
+ bool show_demo_window = true;
+ bool show_another_window = false;
+ ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f);
+
+ // Main loop
+ bool done = false;
+#ifdef __EMSCRIPTEN__
+ // For an Emscripten build we are disabling file-system access, so let's not attempt to do a fopen() of the
+ // imgui.ini file. You may manually call LoadIniSettingsFromMemory() to load settings from your own storage.
+ io.IniFilename = nullptr;
+ EMSCRIPTEN_MAINLOOP_BEGIN
+#else
+ while (!done)
+#endif
+ {
+ // Poll and handle events (inputs, window resize, etc.)
+ // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your
+ // inputs.
+ // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or
+ // clear/overwrite your copy of the mouse data.
+ // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or
+ // clear/overwrite your copy of the keyboard data.
+ // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those
+ // two flags.
+ SDL_Event event;
+ while (SDL_PollEvent(&event)) {
+ ImGui_ImplSDL2_ProcessEvent(&event);
+ if (event.type == SDL_QUIT)
+ done = true;
+ if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_CLOSE &&
+ event.window.windowID == SDL_GetWindowID(window))
+ done = true;
+ }
+ if (SDL_GetWindowFlags(window) & SDL_WINDOW_MINIMIZED) {
+ SDL_Delay(10);
+ continue;
+ }
+
+ // Start the Dear ImGui frame
+ ImGui_ImplOpenGL3_NewFrame();
+ ImGui_ImplSDL2_NewFrame();
+ ImGui::NewFrame();
+
+ // 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code
+ // to learn more about Dear ImGui!).
+ if (show_demo_window)
+ ImGui::ShowDemoWindow(&show_demo_window);
+
+ // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window.
+ {
+ ImGui::Begin("OpenGL Texture Text");
+ ImGui::Text("pointer = %x", my_image_texture);
+ ImGui::Text("size = %d x %d", my_image_width, my_image_height);
+ ImGui::Image(
+ (void*)(intptr_t)my_image_texture,
+ ImVec2(static_cast<float>(my_image_width), static_cast<float>(my_image_height)));
+ ImGui::End();
+
+ static float f = 0.0f;
+ static int counter = 0;
+
+ // Create a window called "Hello, world!" and append into it.
+ ImGui::Begin("Hello, world!");
+
+ // Display some text (you can use a format strings too)
+ ImGui::Text("This is some useful text.");
+ // Edit bools storing our window open/close state
+ ImGui::Checkbox("Demo Window", &show_demo_window);
+ ImGui::Checkbox("Another Window", &show_another_window);
+
+ // Edit 1 float using a slider from 0.0f to 1.0f
+ ImGui::SliderFloat("float", &f, 0.0f, 1.0f);
+ // Edit 3 floats representing a color
+ ImGui::ColorEdit3("clear color", (float*)&clear_color);
+
+ // Buttons return true when clicked (most widgets return true when edited/activated)
+ if (ImGui::Button("Button"))
+ counter++;
+ ImGui::SameLine();
+ ImGui::Text("counter = %d", counter);
+
+ ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate);
+ ImGui::End();
+ }
+
+ // 3. Show another simple window.
+ if (show_another_window) {
+ // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when
+ // clicked)
+ ImGui::Begin("Another Window", &show_another_window);
+ ImGui::Text("Hello from another window!");
+ if (ImGui::Button("Close Me"))
+ show_another_window = false;
+ ImGui::End();
+ }
+
+ // Rendering
+ ImGui::Render();
+ glViewport(0, 0, (int)io.DisplaySize.x, (int)io.DisplaySize.y);
+ glClearColor(
+ clear_color.x * clear_color.w,
+ clear_color.y * clear_color.w,
+ clear_color.z * clear_color.w,
+ clear_color.w);
+ glClear(GL_COLOR_BUFFER_BIT);
+ ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
+ SDL_GL_SwapWindow(window);
+ }
+#ifdef __EMSCRIPTEN__
+ EMSCRIPTEN_MAINLOOP_END;
+#endif
+
+ // Cleanup
+ ImGui_ImplOpenGL3_Shutdown();
+ ImGui_ImplSDL2_Shutdown();
+ ImGui::DestroyContext();
+
+ SDL_GL_DeleteContext(gl_context);
+ SDL_DestroyWindow(window);
+ SDL_Quit();
+ // return ImageResult::okay(image);
+
+ return 0;
+}
+
+} // namespace bookworm
diff --git a/src/demo.hpp b/src/demo.hpp
new file mode 100644
index 0000000..0219af0
--- /dev/null
+++ b/src/demo.hpp
@@ -0,0 +1,12 @@
+#ifndef DEMO_HPP
+#define DEMO_HPP
+
+#include <fud_string.hpp>
+
+namespace bookworm {
+
+int demo(const fud::String& m_filename);
+
+} // namespace bookworm
+
+#endif
diff --git a/src/image.cpp b/src/image.cpp
index ab0b2f9..786c4ba 100644
--- a/src/image.cpp
+++ b/src/image.cpp
@@ -7,200 +7,39 @@
#include <fud_c_file.hpp>
#include <spdlog/spdlog.h>
-// Include jpeglib last
-#include <jpeglib.h>
-#include <turbojpeg.h>
-
namespace bookmouse {
+#if 0
class JpegFile {
public:
~JpegFile();
void decompress(fud::CBinaryFile& inFile);
private:
- jpeg_decompress_struct m_cinfo{};
};
-
-JpegFile::~JpegFile()
-{
- jpeg_destroy_decompress(&m_cinfo);
-}
-
-void JpegFile::decompress(fud::CBinaryFile& inFile)
-{
- jpeg_create_decompress(&m_cinfo);
- auto* file = inFile.file();
- if (file == nullptr) {
- // early return
- }
- jpeg_stdio_src(&m_cinfo, inFile.file());
- auto result = jpeg_read_header(&m_cinfo, true);
- if (result == JPEG_SUSPENDED) {
- // early return
- }
-}
-
-struct my_error_mgr {
- struct jpeg_error_mgr pub; /* "public" fields */
-
- jmp_buf setjmp_buffer; /* for return to caller */
-};
-
-typedef struct my_error_mgr* my_error_ptr;
-
-METHODDEF(void)
-my_error_exit(j_common_ptr cinfo) __attribute__((__noreturn__));
-
-METHODDEF(void)
-my_error_exit(j_common_ptr cinfo)
-{
- /* cinfo->err really points to a my_error_mgr struct, so coerce pointer */
- my_error_ptr myerr = (my_error_ptr)cinfo->err;
-
- /* Always display the message. */
- /* We could postpone this until after returning, if we chose. */
- (*cinfo->err->output_message)(cinfo);
-
- /* Return control to the setjmp point */
- longjmp(myerr->setjmp_buffer, 1);
-}
+#endif
ImageResult JpegImage::output() const
{
auto err = [](ImageError eid) { return ImageResult::error(eid); };
ImageOutput image{};
-
- struct jpeg_decompress_struct cinfo;
-
- struct my_error_mgr jerr;
-
- fud::CBinaryFile infile{m_filename, fud::CFileMode::ReadOnly};
- JSAMPARRAY buffer = nullptr; /* Output row buffer */
- J12SAMPARRAY buffer12 = nullptr; /* 12-bit output row buffer */
- int col;
- int row_stride; /* physical row width in output buffer */
-
- /* In this example we want to open the input and output files before doing
- * anything else, so that the setjmp() error recovery below can assume the
- * files are open.
- *
- * VERY IMPORTANT: use "b" option to fopen() if you are on a machine that
- * requires it in order to read/write binary files.
- */
-
- auto fileResult = infile.open();
- using fud::FileResult;
- if (fileResult == FileResult::Error) {
+ fud::CBinaryFile inFile{m_filename, fud::CFileMode::ReadOnly};
+ auto fileResult = inFile.open();
+ using fud::FileStatus;
+ if (fileResult == FileStatus::Error) {
spdlog::error("can't open {}\n", m_filename.c_str());
return err(ImageError::FileError);
}
- /* Step 1: allocate and initialize JPEG decompression object */
-
- /* We set up the normal JPEG error routines, then override error_exit. */
- cinfo.err = jpeg_std_error(&jerr.pub);
- jerr.pub.error_exit = my_error_exit;
- /* Establish the setjmp return context for my_error_exit to use. */
- if (setjmp(jerr.setjmp_buffer)) {
- /* If we get here, the JPEG code has signaled an error.
- * We need to clean up the JPEG object, close the input file, and return.
- */
- jpeg_destroy_decompress(&cinfo);
- return err(ImageError::JpegError);
- }
- /* Now we can initialize the JPEG decompression object. */
- jpeg_create_decompress(&cinfo);
-
- /* Step 2: specify data source (eg, a file) */
- jpeg_stdio_src(&cinfo, infile.file());
-
- /* Step 3: read file parameters with jpeg_read_header() */
-
- (void)jpeg_read_header(&cinfo, TRUE);
- /* We can ignore the return value from jpeg_read_header since
- * (a) suspension is not possible with the stdio data source, and
- * (b) we passed TRUE to reject a tables-only JPEG file as an error.
- * See libjpeg.txt for more info.
- */
-
- /* Step 4: Start decompressor */
-
- jpeg_start_decompress(&cinfo);
- /* We can ignore the return value since suspension is not possible
- * with the stdio data source.
- */
-
- /* We may need to do some setup of our own at this point before reading
- * the data. After jpeg_start_decompress() we have the correct scaled
- * output image dimensions available, as well as the output colormap
- * if we asked for color quantization.
- * In this example, we need to make an output work buffer of the right size.
- */
- /* Samples per row in output buffer */
- if (cinfo.output_components < 0) {
- // handle it
- return err(ImageError::JpegError);
- }
- row_stride = static_cast<int>(cinfo.output_width) * cinfo.output_components;
- /* Make a one-row-high sample array that will go away when done with image */
- if (cinfo.data_precision == 12) {
- buffer12 = (J12SAMPARRAY)(*cinfo.mem->alloc_sarray)(
- (j_common_ptr)&cinfo,
- JPOOL_IMAGE,
- static_cast<JDIMENSION>(row_stride),
- 1);
- } else {
- buffer = (*cinfo.mem->alloc_sarray)((j_common_ptr)&cinfo, JPOOL_IMAGE, static_cast<JDIMENSION>(row_stride), 1);
- }
-
- /* Step 5: while (scan lines remain to be read) */
- /* jpeg_read_scanlines(...); */
-
- /* Here we use the library's state variable cinfo.output_scanline as the
- * loop counter, so that we don't have to keep track ourselves.
- */
- if (cinfo.data_precision == 12) {
- while (cinfo.output_scanline < cinfo.output_height) {
- /* jpeg12_read_scanlines expects an array of pointers to scanlines.
- * Here the array is only one element long, but you could ask for
- * more than one scanline at a time if that's more convenient.
- */
- (void)jpeg12_read_scanlines(&cinfo, buffer12, 1);
- /* Swap MSB and LSB in each sample */
- for (col = 0; col < row_stride; col++) {
- buffer12[0][col] = // break
- static_cast<J12SAMPLE>((buffer12[0][col] & 0xFF) << 8) | // break
- static_cast<J12SAMPLE>((buffer12[0][col] >> 8) & 0xFF);
- }
- }
- } else {
- while (cinfo.output_scanline < cinfo.output_height) {
- /* jpeg_read_scanlines expects an array of pointers to scanlines.
- * Here the array is only one element long, but you could ask for
- * more than one scanline at a time if that's more convenient.
- */
- (void)jpeg_read_scanlines(&cinfo, buffer, 1);
- }
+ auto* filePtr = inFile.file();
+ if (filePtr == nullptr) {
+ return err(ImageError::FileError);
}
- /* Step 6: Finish decompression */
-
- (void)jpeg_finish_decompress(&cinfo);
- /* We can ignore the return value since suspension is not possible
- * with the stdio data source.
- */
-
- /* Step 7: Release JPEG decompression object */
-
- /* This is an important step since it will release a good deal of memory. */
-
- /* At this point you may want to check to see whether any corrupt-data
- * warnings occurred (test whether jerr.pub.num_warnings is nonzero).
- */
+ // stbi_load_from_file(filePtr,
- /* And we're done! */
- return ImageResult::okay(image);
+ // return ImageResult::okay(image);
+ return err(ImageError::FileError);
}
} // namespace bookmouse
diff --git a/src/main.cpp b/src/main.cpp
index f933426..90aef42 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -2,6 +2,9 @@
#include <spdlog/spdlog.h>
// #include "main_window.hpp"
+#include "stb_image.h"
+#include "demo.hpp"
+
void setupLogging()
{
spdlog::cfg::load_env_levels();
@@ -16,6 +19,9 @@ int main(int argc, char* argv[])
setupLogging();
+ fud::String filename{"Excel Saga Vol. 01/000.jpg"};
+ return bookworm::demo(filename);
+
#if 0
bookmouse::BookmouseApp bookmouse{};
@@ -31,7 +37,8 @@ int main(int argc, char* argv[])
return 0;
}
-void load_levels_example() {
+void load_levels_example()
+{
// Set the log level to "info" and mylogger to "trace":
// SPDLOG_LEVEL=info,mylogger=trace && ./example
spdlog::cfg::load_env_levels();