From a8873627b87527a560b7797ef0c322105ea0ec00 Mon Sep 17 00:00:00 2001 From: Tanishq Dubey Date: Sun, 16 Jun 2024 10:10:13 -0400 Subject: [PATCH 01/21] add basic cmakelists --- CMakeLists.txt | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..bcfae93 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,43 @@ +cmake_minimum_required(VERSION 3.10) + +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD_REQUIRED True) + +project(tview) + +set (SOURCES +/lib/backends/imgui_impl_opengl3.cpp +/lib/backends/imgui_impl_opengl3.h +/lib/backends/imgui_impl_opengl3_loader.h +/lib/backends/imgui_impl_sdl2.cpp +/lib/backends/imgui_impl_sdl2.h +/lib/backends/tex_inspect_opengl.h +/lib/backends/tex_inspect_opengl.cpp +/lib/context_wrapper.h +/lib/image_model.h +/lib/imconfig.h +/lib/imfilebrowser.h +/lib/imgui.cpp +/lib/imgui.h +/lib/imgui_bezier_math.h +/lib/imgui_bezier_math.inl +/lib/imgui_demo.cpp +/lib/imgui_draw.cpp +/lib/imgui_extra_math.h +/lib/imgui_extra_math.inl +/lib/imgui_internal.h +/lib/imgui_tables.cpp +/lib/imgui_widgets.cpp +/lib/imstb_rectpack.h +/lib/imstb_textedit.h +/lib/imstb_truetype.h +/lib/stb_image.h +/lib/imgui_tex_inspect.h +/lib/imgui_tex_inspect_internal.h +/lib/imgui_tex_inspect.cpp +/lib/argparse.hpp +/lib/histogram.h +main.cpp +) + +add_executable(tview ${SOURCES}) -- 2.47.2 From eb3e093998df52f11d07589e1baff7b25c5f23a7 Mon Sep 17 00:00:00 2001 From: Tanishq Dubey Date: Sun, 16 Jun 2024 10:23:53 -0400 Subject: [PATCH 02/21] switch to cmake --- .gitignore | 15 +++++++++ CMakeLists.txt | 69 +++++++++++++++++++++----------------- Makefile | 91 -------------------------------------------------- 3 files changed, 53 insertions(+), 122 deletions(-) delete mode 100644 Makefile diff --git a/.gitignore b/.gitignore index 0f3c454..a6efe49 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,18 @@ imgui.ini tview + +#CMake +CMakeLists.txt.user +CMakeCache.txt +CMakeFiles +CMakeScripts +Testing +Makefile +cmake_install.cmake +install_manifest.txt +compile_commands.json +CTestTestfile.cmake +_deps +CMakeUserPresets.json + diff --git a/CMakeLists.txt b/CMakeLists.txt index bcfae93..9ce4a22 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,38 +6,45 @@ set(CMAKE_CXX_STANDARD_REQUIRED True) project(tview) set (SOURCES -/lib/backends/imgui_impl_opengl3.cpp -/lib/backends/imgui_impl_opengl3.h -/lib/backends/imgui_impl_opengl3_loader.h -/lib/backends/imgui_impl_sdl2.cpp -/lib/backends/imgui_impl_sdl2.h -/lib/backends/tex_inspect_opengl.h -/lib/backends/tex_inspect_opengl.cpp -/lib/context_wrapper.h -/lib/image_model.h -/lib/imconfig.h -/lib/imfilebrowser.h -/lib/imgui.cpp -/lib/imgui.h -/lib/imgui_bezier_math.h -/lib/imgui_bezier_math.inl -/lib/imgui_demo.cpp -/lib/imgui_draw.cpp -/lib/imgui_extra_math.h -/lib/imgui_extra_math.inl -/lib/imgui_internal.h -/lib/imgui_tables.cpp -/lib/imgui_widgets.cpp -/lib/imstb_rectpack.h -/lib/imstb_textedit.h -/lib/imstb_truetype.h -/lib/stb_image.h -/lib/imgui_tex_inspect.h -/lib/imgui_tex_inspect_internal.h -/lib/imgui_tex_inspect.cpp -/lib/argparse.hpp -/lib/histogram.h +lib/backends/imgui_impl_opengl3.cpp +lib/backends/imgui_impl_opengl3.h +lib/backends/imgui_impl_opengl3_loader.h +lib/backends/imgui_impl_sdl2.cpp +lib/backends/imgui_impl_sdl2.h +lib/backends/tex_inspect_opengl.h +lib/backends/tex_inspect_opengl.cpp +lib/context_wrapper.h +lib/image_model.h +lib/imconfig.h +lib/imfilebrowser.h +lib/imgui.cpp +lib/imgui.h +lib/imgui_bezier_math.h +lib/imgui_bezier_math.inl +lib/imgui_demo.cpp +lib/imgui_draw.cpp +lib/imgui_extra_math.h +lib/imgui_extra_math.inl +lib/imgui_internal.h +lib/imgui_tables.cpp +lib/imgui_widgets.cpp +lib/imstb_rectpack.h +lib/imstb_textedit.h +lib/imstb_truetype.h +lib/stb_image.h +lib/imgui_tex_inspect.h +lib/imgui_tex_inspect_internal.h +lib/imgui_tex_inspect.cpp +lib/argparse.hpp +lib/histogram.h main.cpp ) +set(OpenGL_GL_PREFERENCE GLVND) +find_package(SDL2 REQUIRED) +find_package(OpenGL REQUIRED) +find_package(exiv2 REQUIRED) +include_directories(${SDL2_INCLUDE_DIRS} ${OPENGL_INCLUDE_DIRS}) + add_executable(tview ${SOURCES}) +target_link_libraries(tview ${SDL2_LIBRARIES} ${OPENGL_LIBRARIES} exiv2lib) diff --git a/Makefile b/Makefile deleted file mode 100644 index b53f171..0000000 --- a/Makefile +++ /dev/null @@ -1,91 +0,0 @@ -# -# Cross Platform Makefile -# Compatible with MSYS2/MINGW, Ubuntu 14.04.1 and Mac OS X -# -# You will need SDL2 (http://www.libsdl.org): -# Linux: -# apt-get install libsdl2-dev -# Mac OS X: -# brew install sdl2 -# MSYS2: -# pacman -S mingw-w64-i686-SDL2 -# - -#CXX = g++ -#CXX = clang++ - -EXE = tview -IMGUI_DIR = lib -SOURCES = main.cpp -SOURCES += $(wildcard $(IMGUI_DIR)/*.cpp) -SOURCES += $(wildcard $(IMGUI_DIR)/backends/*.cpp) -OBJS = $(addsuffix .o, $(basename $(notdir $(SOURCES)))) -UNAME_S := $(shell uname -s) -LINUX_GL_LIBS = -lGL - -CXXFLAGS = -std=c++20 -I$(IMGUI_DIR) -I$(IMGUI_DIR)/backends -CXXFLAGS += -DIMGUI_DEFINE_MATH_OPERATORS -O3 -DGL_SILENCE_DEPRECATION -LIBS = -lexiv2 - -##--------------------------------------------------------------------- -## OPENGL ES -##--------------------------------------------------------------------- - -## This assumes a GL ES library available in the system, e.g. libGLESv2.so -# CXXFLAGS += -DIMGUI_IMPL_OPENGL_ES2 -# LINUX_GL_LIBS = -lGLESv2 -## If you're on a Raspberry Pi and want to use the legacy drivers, -## use the following instead: -# LINUX_GL_LIBS = -L/opt/vc/lib -lbrcmGLESv2 - -##--------------------------------------------------------------------- -## BUILD FLAGS PER PLATFORM -##--------------------------------------------------------------------- - -ifeq ($(UNAME_S), Linux) #LINUX - ECHO_MESSAGE = "Linux" - LIBS += $(LINUX_GL_LIBS) -ldl -L/usr/lib -lSDL2 - - CXXFLAGS += -I/usr/include/SDL2 -D_REENTRANT - CFLAGS = $(CXXFLAGS) -endif - -ifeq ($(UNAME_S), Darwin) #APPLE - ECHO_MESSAGE = "Mac OS X" - LIBS += -framework OpenGL -framework Cocoa -framework IOKit -framework CoreVideo `sdl2-config --libs` - LIBS += -L/usr/local/lib -L/opt/local/lib - - CXXFLAGS += `sdl2-config --cflags` - CXXFLAGS += -I/usr/local/include -I/opt/local/include - CFLAGS = $(CXXFLAGS) -endif - -ifeq ($(OS), Windows_NT) - ECHO_MESSAGE = "MinGW" - LIBS += -lgdi32 -lopengl32 -limm32 `pkg-config --static --libs sdl2` - - CXXFLAGS += `pkg-config --cflags sdl2` - CFLAGS = $(CXXFLAGS) -endif - -##--------------------------------------------------------------------- -## BUILD RULES -##--------------------------------------------------------------------- - -%.o:%.cpp - $(CXX) $(CXXFLAGS) -c -o $@ $< - -%.o:$(IMGUI_DIR)/%.cpp - $(CXX) $(CXXFLAGS) -c -o $@ $< - -%.o:$(IMGUI_DIR)/backends/%.cpp - $(CXX) $(CXXFLAGS) -c -o $@ $< - -all: $(EXE) - @echo Build complete for $(ECHO_MESSAGE) - -$(EXE): $(OBJS) - $(CXX) -o $@ $^ $(CXXFLAGS) $(LIBS) - -clean: - rm -f $(EXE) $(OBJS) -- 2.47.2 From dd6c006a3482414639c153cf3c86c484b55b16cf Mon Sep 17 00:00:00 2001 From: Tanishq Dubey Date: Wed, 12 Jun 2024 18:20:35 -0400 Subject: [PATCH 03/21] image rotation --- main.cpp | 467 +++++++++++-------------------------------------------- 1 file changed, 90 insertions(+), 377 deletions(-) diff --git a/main.cpp b/main.cpp index c06d690..db2ae2b 100644 --- a/main.cpp +++ b/main.cpp @@ -1,3 +1,14 @@ +// Dear ImGui: standalone example application for SDL2 + OpenGL +// (SDL is a cross-platform general purpose library for handling windows, +// inputs, OpenGL/Vulkan/Metal graphics context creation, etc.) + +// Learn about Dear ImGui: +// - FAQ https://dearimgui.com/faq +// - Getting Started https://dearimgui.com/getting-started +// - Documentation https://dearimgui.com/docs (same as your local docs/ +// folder). +// - Introduction, links and more at the top of imgui.cpp + #include #include #include @@ -7,7 +18,6 @@ #include "lib/imgui.h" #include "lib/imgui_internal.h" #include -#include #include #include #include @@ -35,141 +45,50 @@ #include "lib/backends/tex_inspect_opengl.h" #include "lib/argparse.hpp" -#include - -#include "lib/histogram.h" - struct Args : public argparse::Args { std::string &fpath = arg("path to the image"); }; - -struct EXIFData { - std::string CameraMake; - std::string CameraModel; - std::string LensModel; - std::string ImageOrientation; - std::string ImageDimensionX; - std::string ImageDimensiony; - std::string ISO; - std::string ShutterSpeed; - std::string FNumber; - std::string FocalLength; - std::string ExposureBias; - std::string MeteringMode; - std::string Flash; - std::string Time; - std::string TimeTaken; - std::string TimeTakenOffset; - std::string GPSLat; - std::string GPSLatref; - std::string GPSLon; - std::string GPSLonref; -}; - struct Texture { ImTextureID texture; ImVec2 size; int channels; - EXIFData exif; }; static uint8_t* image = nullptr; +Texture LoadTexture(const char * path) +{ + const int channelCount = 4; + int imageFileChannelCount; + int width, height; + image = (uint8_t *)stbi_load(path, &width, &height, &imageFileChannelCount, channelCount); + if (image == NULL) + { + fprintf(stderr, "%s\nFailed to open %s\n", stbi_failure_reason(), path); -EXIFData printExifData(const std::string& imagePath) { - EXIFData d; - d.CameraMake = "NULL"; - try { - // Load the image - Exiv2::Image::UniquePtr img = Exiv2::ImageFactory::open(imagePath); - if (img.get() == 0) { - std::cerr << "Error: Could not open image file " << imagePath << std::endl; - return d; - } - img->readMetadata(); - - // Get the Exif data - Exiv2::ExifData &exifData = img->exifData(); - if (exifData.empty()) { - std::cerr << "No EXIF data found in file " << imagePath << std::endl; - return d; - } - - // Helper function to print EXIF data if available - auto printExifValue = [&exifData](const char* key, std::string *d) { - Exiv2::ExifKey exifKey(key); - Exiv2::ExifData::const_iterator pos = exifData.findKey(exifKey); - if (pos != exifData.end()) { - *d = pos->value().toString(); - } - }; - - // Print common EXIF data - printExifValue("Exif.Image.Make", &d.CameraMake); - printExifValue("Exif.Image.Model", &d.CameraModel); - printExifValue("Exif.Photo.LensModel", &d.LensModel); - - printExifValue("Exif.Image.Orientation", &d.ImageOrientation); - // - printExifValue("Exif.Photo.ExposureTime", &d.ShutterSpeed); - printExifValue("Exif.Photo.FNumber", &d.FNumber); - printExifValue("Exif.Photo.ISOSpeedRatings", &d.ISO); - printExifValue("Exif.Photo.FocalLength", &d.FocalLength); - printExifValue("Exif.Photo.ExposureBiasValue", &d.ExposureBias); - printExifValue("Exif.Photo.MeteringMode", &d.MeteringMode); - printExifValue("Exif.Photo.Flash", &d.Flash); - - printExifValue("Exif.Image.DateTime", &d.Time); - printExifValue("Exif.Photo.DateTimeOriginal", &d.TimeTaken); - printExifValue("Exif.Photo.OffsetTime", &d.TimeTakenOffset); - printExifValue("Exif.Photo.PixelXDimension", &d.ImageDimensionX); - printExifValue("Exif.Photo.PixelYDimension", &d.ImageDimensiony); - - printExifValue("Exif.GPSInfo.GPSLatitudeRef", &d.GPSLatref); - printExifValue("Exif.GPSInfo.GPSLatitude", &d.GPSLat); - printExifValue("Exif.GPSInfo.GPSLongitudeRef", &d.GPSLonref); - printExifValue("Exif.GPSInfo.GPSLongitude", &d.GPSLon); - - -/* -Exif.Image.Make 0x010f Ascii 5 SONY -Exif.Image.Model 0x0110 Ascii 10 ILCE-7RM5 - -Exif.Image.Orientation 0x0112 Short 1 8 -Exif.Photo.PixelXDimension 0xa002 Long 1 9504 -Exif.Photo.PixelYDimension 0xa003 Long 1 6336 - -Exif.Photo.ExposureTime 0x829a Rational 1 1/400 -Exif.Photo.FNumber 0x829d Rational 1 56/10 -Exif.Photo.ISOSpeedRatings 0x8827 Short 1 100 -Exif.Photo.FocalLength 0x920a Rational 1 400/10 -Exif.Photo.ExposureBiasValue 0x9204 SRational 1 -10/10 -Exif.Photo.MeteringMode 0x9207 Short 1 5 -Exif.Photo.Flash 0x9209 Short 1 16 - -Exif.Image.DateTime 0x0132 Ascii 20 2024:06:07 08:58:07 -Exif.Photo.DateTimeOriginal 0x9003 Ascii 20 2024:06:07 08:58:07 -Exif.Photo.OffsetTime 0x9010 Ascii 7 -05:00 - -Exif.GPSInfo.GPSLatitudeRef 0x0001 Ascii 2 N -Exif.GPSInfo.GPSLatitude 0x0002 Rational 3 40/1 43/1 32231/1000 -Exif.GPSInfo.GPSLongitudeRef 0x0003 Ascii 2 W -Exif.GPSInfo.GPSLongitude 0x0004 Rational 3 73/1 59/1 16688/1000 -*/ - - } catch (Exiv2::Error& e) { - std::cerr << "Error: " << e.what() << std::endl; + return {nullptr,{0,0}}; } - return d; + GLenum dataFormat = GL_RGBA; + GLuint textureHandle; + glGenTextures(1, &textureHandle); + glBindTexture(GL_TEXTURE_2D, textureHandle); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, dataFormat, GL_UNSIGNED_BYTE, image); + + Texture t; + t.texture = (void*)(uintptr_t)(textureHandle); + t.size = ImVec2((float)width,(float)height); + t.channels = channelCount; + + return t; } - - -Texture ReloadTexture(Texture tin, int width, int height) { - GLuint tid = (GLuint)(uintptr_t)tin.texture; +Texture ReloadTexture(ImTextureID id, int width, int height) { + GLuint tid = (GLuint)(uintptr_t)id; glDeleteTextures((GLsizei)1, &tid); GLenum dataFormat = GL_RGBA; @@ -183,107 +102,50 @@ Texture ReloadTexture(Texture tin, int width, int height) { Texture t; t.texture = (void*)(uintptr_t)(textureHandle); t.size = ImVec2((float)width,(float)height); - t.exif = tin.exif; - t.channels = tin.channels; return t; } +void rotate90() +{ +} + void RotateImage(Texture t) { int height = t.size.y; int width = t.size.x; int channels = t.channels; - const unsigned int sizeBuffer = width * height * channels; - unsigned char *tempBuffer = new unsigned char[sizeBuffer]; + const unsigned int sizeBuffer = width * height * channels; + unsigned char *tempBuffer = new unsigned char[sizeBuffer]; - int nidx = 0; - for (int x = 0; x < width; x++) - { - for (int y = height - 1; y >= 0; y--) + + int nidx = 0; + for (int x = 0; x < width; x++) { - int idx = (x + y * width) * channels; - for (int i = 0; i < channels; i++) - tempBuffer[nidx + i] = image[idx + i]; + for (int y = height - 1; y >= 0; y--) + { + int idx = (x + y * width) * channels; + for (int i = 0; i < channels; i++) + tempBuffer[nidx + i] = image[idx + i]; - nidx = nidx + 4; - } - } - - memcpy(image, tempBuffer, sizeBuffer); - delete[] tempBuffer; -} - -Texture LoadImage(const char * path) { - const int channelCount = 4; - int imageFileChannelCount; - int width, height; - image = (uint8_t *)stbi_load(path, &width, &height, &imageFileChannelCount, channelCount); - if (image == NULL) { - fprintf(stderr, "%s\nFailed to open %s\n", stbi_failure_reason(), path); - return {nullptr,{0,0}}; - } - auto exif = printExifData(path); - - Texture t; - t.size = ImVec2((float)width,(float)height); - t.channels = channelCount; - t.exif = exif; - return t; -} - -Texture LoadTexture(Texture tin) { - GLenum dataFormat = GL_RGBA; - GLuint textureHandle; - glGenTextures(1, &textureHandle); - glBindTexture(GL_TEXTURE_2D, textureHandle); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tin.size.x, tin.size.y, 0, dataFormat, GL_UNSIGNED_BYTE, image); - - Texture t = tin; - t.texture = (void*)(uintptr_t)(textureHandle); - - if (t.exif.ImageOrientation == "3") { - RotateImage(t); - ReloadTexture(t, t.size.x, t.size.y); - t = ReloadTexture(t, t.size.y, t.size.x); - RotateImage(t); - t = ReloadTexture(t, t.size.y, t.size.x); - } else if (t.exif.ImageOrientation == "6") { - RotateImage(t); - t = ReloadTexture(t, t.size.y, t.size.x); - } else if (t.exif.ImageOrientation == "8") { - RotateImage(t); - t = ReloadTexture(t, t.size.y, t.size.x); - RotateImage(t); - t = ReloadTexture(t, t.size.y, t.size.x); - RotateImage(t); - t = ReloadTexture(t, t.size.y, t.size.x); + nidx = nidx + 4; + } } - return t; + // Copy rotated pixels + + memcpy(image, tempBuffer, sizeBuffer); + delete[] tempBuffer; } - -const int MAX_ANNOATED_TEXELS = 10000; +static bool init = true; +static bool showHelp = false; +static int mode = 0; +const int maxAnnotatedTexels = 10000; // Main code int main(int argc, char* argv[]) { - Texture t; - - try { - auto args = argparse::parse(argc, argv, true); - t = LoadImage(args.fpath.c_str()); - if (t.texture == nullptr) { - std::cerr << "failed load image" << std::endl; - return -1; - } - } catch (const std::runtime_error &e) { - std::cerr << "failed to parse arguments: " << e.what() << std::endl; - return -1; - } // Setup SDL if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_GAMECONTROLLER) != 0) { @@ -294,10 +156,6 @@ int main(int argc, char* argv[]) { bool TOOLTIP_ENABLED = false; bool GRID_ENABLED = false; bool AA_ENABLED = true; - bool SHOW_HELP = false; - bool SHOW_EXIF = false; - bool SHOW_HISTOGRAM = false; - int MODE = 0; // Decide GL+GLSL versions #if defined(IMGUI_IMPL_OPENGL_ES2) @@ -337,17 +195,9 @@ int main(int argc, char* argv[]) { SDL_WindowFlags window_flags = (SDL_WindowFlags)(SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI); - - - int wh = 800; - int ww = 1280; - if (t.size.y > t.size.x) { - ww = 500; - wh = 1280; - } SDL_Window *window = SDL_CreateWindow("tview", SDL_WINDOWPOS_CENTERED, - SDL_WINDOWPOS_CENTERED, ww, wh, window_flags); + SDL_WINDOWPOS_CENTERED, 1280, 720, window_flags); if (window == nullptr) { printf("Error: SDL_CreateWindow(): %s\n", SDL_GetError()); return -1; @@ -359,6 +209,7 @@ int main(int argc, char* argv[]) { // Setup Dear ImGui context IMGUI_CHECKVERSION(); + ImGui::CreateContext(); ImGuiIO &io = ImGui::GetIO(); (void)io; @@ -367,22 +218,34 @@ int main(int argc, char* argv[]) { ImGuiTexInspect::ImplOpenGL3_Init(); // Or DirectX 11 equivalent (check your chosen backend header file) ImGuiTexInspect::Init(); ImGuiTexInspect::CreateContext(); + ImGui::StyleColorsDark(); + ImGuiStyle &style = ImGui::GetStyle(); + ImGui_ImplSDL2_InitForOpenGL(window, gl_context); ImGui_ImplOpenGL3_Init(glsl_version); ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); - auto flags = ImGuiTexInspect::InspectorFlags_FillVertical | ImGuiTexInspect::InspectorFlags_FillHorizontal; - t = LoadTexture(t); - Histogram histogram = Histogram(t.size.x, t.size.y, t.channels); - histogram.Load(image); + Texture t; + + if (init) { + init = false; + try { + auto args = argparse::parse(argc, argv, true); + t = LoadTexture(args.fpath.c_str()); + } catch (const std::runtime_error &e) { + std::cerr << "failed to parse arguments: " << e.what() << std::endl; + return -1; + } + } // Main loop bool done = false; while (!done) { + auto flags = ImGuiTexInspect::InspectorFlags_FillVertical | ImGuiTexInspect::InspectorFlags_FillHorizontal; // Poll and handle events (inputs, window resize, etc.) SDL_Event event; @@ -409,24 +272,18 @@ int main(int argc, char* argv[]) { AA_ENABLED = !AA_ENABLED; break; case SDL_SCANCODE_H: - SHOW_HELP = !SHOW_HELP; + showHelp = !showHelp; break; case SDL_SCANCODE_D: - MODE = (MODE + 1) % 5; + mode = (mode + 1) % 5; break; case SDL_SCANCODE_R: RotateImage(t); - t = ReloadTexture(t, t.size.y, t.size.x); + t = ReloadTexture(t.texture, t.size.y, t.size.x); break; case SDL_SCANCODE_Q: done = true; break; - case SDL_SCANCODE_E: - SHOW_EXIF = !SHOW_EXIF; - break; - case SDL_SCANCODE_C: - SHOW_HISTOGRAM = !SHOW_HISTOGRAM; - break; default: break; } @@ -454,7 +311,7 @@ int main(int argc, char* argv[]) { ImGui::SetNextWindowPos(viewport->Pos); ImGui::SetNextWindowSize(viewport->Size); ImGui::Begin("Main", NULL, - ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoBringToFrontOnFocus); + ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoResize); auto wSize = ImGui::GetContentRegionAvail(); if (t.texture != 0) { @@ -488,18 +345,18 @@ int main(int argc, char* argv[]) { CurrentInspector_SetFlags(ImGuiTexInspect::InspectorFlags_NoForceFilterNearest); } - switch(MODE) { + switch(mode) { case 1: - ImGuiTexInspect::DrawAnnotations(ImGuiTexInspect::Arrow().UsePreset(ImGuiTexInspect::Arrow::NormalMap), MAX_ANNOATED_TEXELS); + ImGuiTexInspect::DrawAnnotations(ImGuiTexInspect::Arrow().UsePreset(ImGuiTexInspect::Arrow::NormalMap), maxAnnotatedTexels); break; case 2: - ImGuiTexInspect::DrawAnnotations(ImGuiTexInspect::ValueText(ImGuiTexInspect::ValueText::Format::HexString), MAX_ANNOATED_TEXELS); + ImGuiTexInspect::DrawAnnotations(ImGuiTexInspect::ValueText(ImGuiTexInspect::ValueText::Format::HexString), maxAnnotatedTexels); break; case 3: - ImGuiTexInspect::DrawAnnotations(ImGuiTexInspect::ValueText(ImGuiTexInspect::ValueText::Format::BytesDec), MAX_ANNOATED_TEXELS); + ImGuiTexInspect::DrawAnnotations(ImGuiTexInspect::ValueText(ImGuiTexInspect::ValueText::Format::BytesDec), maxAnnotatedTexels); break; case 4: - ImGuiTexInspect::DrawAnnotations(ImGuiTexInspect::ValueText(ImGuiTexInspect::ValueText::Format::Floats), MAX_ANNOATED_TEXELS); + ImGuiTexInspect::DrawAnnotations(ImGuiTexInspect::ValueText(ImGuiTexInspect::ValueText::Format::Floats), maxAnnotatedTexels); break; default: break; @@ -512,11 +369,10 @@ int main(int argc, char* argv[]) { ImGui::PopStyleVar(); ImGui::PopStyleVar(); - if (SHOW_HELP){ + if (showHelp){ ImGui::OpenPopup("HelpPopup"); - SHOW_HELP = !SHOW_HELP; + showHelp = !showHelp; } - if (ImGui::BeginPopup("HelpPopup")) { ImGui::Text("tview Help"); ImGui::Separator(); @@ -534,156 +390,13 @@ int main(int argc, char* argv[]) { ImGui::Text("\tFloat Values"); ImGui::Separator(); ImGui::Text("h - show help popup"); - ImGui::Text("c - toggle color histogram"); - ImGui::Text("e - toggle EXIF info"); - ImGui::Separator(); ImGui::Text("q - quit"); ImGui::Separator(); ImGui::Text("click anywhere to continue"); ImGui::EndPopup(); } - if (SHOW_EXIF && t.exif.CameraMake != "NULL") { - ImGuiWindowClass topmost; - topmost.ClassId = ImHashStr("TopMost"); - topmost.ViewportFlagsOverrideSet = ImGuiViewportFlags_TopMost; - ImGui::SetNextWindowClass(&topmost); - ImGui::Begin("EXIF", NULL, ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoFocusOnAppearing); - if(ImGui::BeginTable("Hardware", 2)) { - ImGui::TableNextRow(); - ImGui::TableSetColumnIndex(0); - ImGui::Text("Make"); - ImGui::TableSetColumnIndex(1); - ImGui::Text("%s", t.exif.CameraMake.c_str()); - - ImGui::TableNextRow(); - ImGui::TableSetColumnIndex(0); - ImGui::Text("Model"); - ImGui::TableSetColumnIndex(1); - ImGui::Text("%s", t.exif.CameraModel.c_str()); - - ImGui::TableNextRow(); - ImGui::TableSetColumnIndex(0); - ImGui::Text("Lens"); - ImGui::TableSetColumnIndex(1); - ImGui::Text("%s", t.exif.LensModel.c_str()); - - ImGui::EndTable(); - } - - ImGui::Separator(); - - if(ImGui::BeginTable("Photo", 2)) { - ImGui::TableNextRow(); - ImGui::TableSetColumnIndex(0); - ImGui::Text("Shutter Speed"); - ImGui::TableSetColumnIndex(1); - ImGui::Text("%s", t.exif.ShutterSpeed.c_str()); - - ImGui::TableNextRow(); - ImGui::TableSetColumnIndex(0); - ImGui::Text("F-Stop"); - ImGui::TableSetColumnIndex(1); - ImGui::Text("%s", t.exif.FNumber.c_str()); - - ImGui::TableNextRow(); - ImGui::TableSetColumnIndex(0); - ImGui::Text("ISO"); - ImGui::TableSetColumnIndex(1); - ImGui::Text("%s", t.exif.ISO.c_str()); - - ImGui::TableNextRow(); - ImGui::TableSetColumnIndex(0); - ImGui::Text("Focal Length"); - ImGui::TableSetColumnIndex(1); - ImGui::Text("%s", t.exif.FocalLength.c_str()); - - ImGui::TableNextRow(); - ImGui::TableSetColumnIndex(0); - ImGui::Text("Exposure Comp"); - ImGui::TableSetColumnIndex(1); - ImGui::Text("%s", t.exif.ExposureBias.c_str()); - - ImGui::TableNextRow(); - ImGui::TableSetColumnIndex(0); - ImGui::Text("Metering Mode"); - ImGui::TableSetColumnIndex(1); - ImGui::Text("%s", t.exif.MeteringMode.c_str()); - - ImGui::TableNextRow(); - ImGui::TableSetColumnIndex(0); - ImGui::Text("Flash"); - ImGui::TableSetColumnIndex(1); - ImGui::Text("%s", t.exif.Flash.c_str()); - - ImGui::EndTable(); - } - - ImGui::Separator(); - - if(ImGui::BeginTable("Meta", 2)) { - ImGui::TableNextRow(); - ImGui::TableSetColumnIndex(0); - ImGui::Text("Date"); - ImGui::TableSetColumnIndex(1); - ImGui::Text("%s %s", t.exif.TimeTaken.c_str(), t.exif.TimeTakenOffset.c_str()); - - - ImGui::TableNextRow(); - ImGui::TableSetColumnIndex(0); - ImGui::Text("Dimensions"); - ImGui::TableSetColumnIndex(1); - ImGui::Text("%sx%s", t.exif.ImageDimensionX.c_str(), t.exif.ImageDimensiony.c_str()); - - ImGui::TableNextRow(); - ImGui::TableSetColumnIndex(0); - ImGui::Text("Orientation"); - ImGui::TableSetColumnIndex(1); - ImGui::Text("%s", t.exif.ImageOrientation.c_str()); - - ImGui::EndTable(); - } - - ImGui::Separator(); - - if(ImGui::BeginTable("Location", 2)) { - ImGui::TableNextRow(); - ImGui::TableSetColumnIndex(0); - ImGui::Text("Latitude"); - ImGui::TableSetColumnIndex(1); - ImGui::Text("%s %s", t.exif.GPSLat.c_str(), t.exif.GPSLatref.c_str()); - - - ImGui::TableNextRow(); - ImGui::TableSetColumnIndex(0); - ImGui::Text("Longitude"); - ImGui::TableSetColumnIndex(1); - ImGui::Text("%s %s", t.exif.GPSLon.c_str(), t.exif.GPSLonref.c_str()); - - ImGui::EndTable(); - } - - ImGui::Separator(); - ImGui::Text("Press e to hide"); - - ImGui::End(); - } - - - if (SHOW_HISTOGRAM) { - ImGuiWindowClass topmost; - topmost.ClassId = ImHashStr("TopMost"); - topmost.ViewportFlagsOverrideSet = ImGuiViewportFlags_TopMost; - ImGui::SetNextWindowClass(&topmost); - ImGui::Begin("Histogram", NULL, ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoFocusOnAppearing); - histogram.Draw(); - ImGui::Separator(); - ImGui::Text("Press c to hide"); - - ImGui::End(); - } } - // Rendering ImGui::Render(); glViewport(0, 0, (int)io.DisplaySize.x, (int)io.DisplaySize.y); -- 2.47.2 From 6f1f82889ef9825725e24507e5c7ce0bb57fa77c Mon Sep 17 00:00:00 2001 From: Tanishq Dubey Date: Wed, 12 Jun 2024 23:20:10 -0400 Subject: [PATCH 04/21] 99 percent complete --- main.cpp | 400 +++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 314 insertions(+), 86 deletions(-) diff --git a/main.cpp b/main.cpp index db2ae2b..eb1c881 100644 --- a/main.cpp +++ b/main.cpp @@ -1,14 +1,3 @@ -// Dear ImGui: standalone example application for SDL2 + OpenGL -// (SDL is a cross-platform general purpose library for handling windows, -// inputs, OpenGL/Vulkan/Metal graphics context creation, etc.) - -// Learn about Dear ImGui: -// - FAQ https://dearimgui.com/faq -// - Getting Started https://dearimgui.com/getting-started -// - Documentation https://dearimgui.com/docs (same as your local docs/ -// folder). -// - Introduction, links and more at the top of imgui.cpp - #include #include #include @@ -18,6 +7,7 @@ #include "lib/imgui.h" #include "lib/imgui_internal.h" #include +#include #include #include #include @@ -45,50 +35,139 @@ #include "lib/backends/tex_inspect_opengl.h" #include "lib/argparse.hpp" +#include + struct Args : public argparse::Args { std::string &fpath = arg("path to the image"); }; + +struct EXIFData { + std::string CameraMake; + std::string CameraModel; + std::string LensModel; + std::string ImageOrientation; + std::string ImageDimensionX; + std::string ImageDimensiony; + std::string ISO; + std::string ShutterSpeed; + std::string FNumber; + std::string FocalLength; + std::string ExposureBias; + std::string MeteringMode; + std::string Flash; + std::string Time; + std::string TimeTaken; + std::string TimeTakenOffset; + std::string GPSLat; + std::string GPSLatref; + std::string GPSLon; + std::string GPSLonref; +}; + struct Texture { ImTextureID texture; ImVec2 size; int channels; + EXIFData exif; }; static uint8_t* image = nullptr; -Texture LoadTexture(const char * path) -{ - const int channelCount = 4; - int imageFileChannelCount; - int width, height; - image = (uint8_t *)stbi_load(path, &width, &height, &imageFileChannelCount, channelCount); - if (image == NULL) - { - fprintf(stderr, "%s\nFailed to open %s\n", stbi_failure_reason(), path); - return {nullptr,{0,0}}; +EXIFData printExifData(const std::string& imagePath) { + EXIFData d; + d.CameraMake = "NULL"; + try { + // Load the image + Exiv2::Image::UniquePtr img = Exiv2::ImageFactory::open(imagePath); + if (img.get() == 0) { + std::cerr << "Error: Could not open image file " << imagePath << std::endl; + return d; + } + img->readMetadata(); + + // Get the Exif data + Exiv2::ExifData &exifData = img->exifData(); + if (exifData.empty()) { + std::cerr << "No EXIF data found in file " << imagePath << std::endl; + return d; + } + + // Helper function to print EXIF data if available + auto printExifValue = [&exifData](const char* key, std::string *d) { + Exiv2::ExifKey exifKey(key); + Exiv2::ExifData::const_iterator pos = exifData.findKey(exifKey); + if (pos != exifData.end()) { + *d = pos->value().toString(); + } + }; + + // Print common EXIF data + printExifValue("Exif.Image.Make", &d.CameraMake); + printExifValue("Exif.Image.Model", &d.CameraModel); + printExifValue("Exif.Photo.LensModel", &d.LensModel); + + printExifValue("Exif.Image.Orientation", &d.ImageOrientation); + // + printExifValue("Exif.Photo.ExposureTime", &d.ShutterSpeed); + printExifValue("Exif.Photo.FNumber", &d.FNumber); + printExifValue("Exif.Photo.ISOSpeedRatings", &d.ISO); + printExifValue("Exif.Photo.FocalLength", &d.FocalLength); + printExifValue("Exif.Photo.ExposureBiasValue", &d.ExposureBias); + printExifValue("Exif.Photo.MeteringMode", &d.MeteringMode); + printExifValue("Exif.Photo.Flash", &d.Flash); + + printExifValue("Exif.Image.DateTime", &d.Time); + printExifValue("Exif.Photo.DateTimeOriginal", &d.TimeTaken); + printExifValue("Exif.Photo.OffsetTime", &d.TimeTakenOffset); + printExifValue("Exif.Photo.PixelXDimension", &d.ImageDimensionX); + printExifValue("Exif.Photo.PixelYDimension", &d.ImageDimensiony); + + printExifValue("Exif.GPSInfo.GPSLatitudeRef", &d.GPSLatref); + printExifValue("Exif.GPSInfo.GPSLatitude", &d.GPSLat); + printExifValue("Exif.GPSInfo.GPSLongitudeRef", &d.GPSLonref); + printExifValue("Exif.GPSInfo.GPSLongitude", &d.GPSLon); + + +/* +Exif.Image.Make 0x010f Ascii 5 SONY +Exif.Image.Model 0x0110 Ascii 10 ILCE-7RM5 + +Exif.Image.Orientation 0x0112 Short 1 8 +Exif.Photo.PixelXDimension 0xa002 Long 1 9504 +Exif.Photo.PixelYDimension 0xa003 Long 1 6336 + +Exif.Photo.ExposureTime 0x829a Rational 1 1/400 +Exif.Photo.FNumber 0x829d Rational 1 56/10 +Exif.Photo.ISOSpeedRatings 0x8827 Short 1 100 +Exif.Photo.FocalLength 0x920a Rational 1 400/10 +Exif.Photo.ExposureBiasValue 0x9204 SRational 1 -10/10 +Exif.Photo.MeteringMode 0x9207 Short 1 5 +Exif.Photo.Flash 0x9209 Short 1 16 + +Exif.Image.DateTime 0x0132 Ascii 20 2024:06:07 08:58:07 +Exif.Photo.DateTimeOriginal 0x9003 Ascii 20 2024:06:07 08:58:07 +Exif.Photo.OffsetTime 0x9010 Ascii 7 -05:00 + +Exif.GPSInfo.GPSLatitudeRef 0x0001 Ascii 2 N +Exif.GPSInfo.GPSLatitude 0x0002 Rational 3 40/1 43/1 32231/1000 +Exif.GPSInfo.GPSLongitudeRef 0x0003 Ascii 2 W +Exif.GPSInfo.GPSLongitude 0x0004 Rational 3 73/1 59/1 16688/1000 +*/ + + } catch (Exiv2::Error& e) { + std::cerr << "Error: " << e.what() << std::endl; } - GLenum dataFormat = GL_RGBA; - GLuint textureHandle; - glGenTextures(1, &textureHandle); - glBindTexture(GL_TEXTURE_2D, textureHandle); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, dataFormat, GL_UNSIGNED_BYTE, image); - - Texture t; - t.texture = (void*)(uintptr_t)(textureHandle); - t.size = ImVec2((float)width,(float)height); - t.channels = channelCount; - - return t; + return d; } -Texture ReloadTexture(ImTextureID id, int width, int height) { - GLuint tid = (GLuint)(uintptr_t)id; + + +Texture ReloadTexture(Texture tin, int width, int height) { + GLuint tid = (GLuint)(uintptr_t)tin.texture; glDeleteTextures((GLsizei)1, &tid); GLenum dataFormat = GL_RGBA; @@ -102,47 +181,76 @@ Texture ReloadTexture(ImTextureID id, int width, int height) { Texture t; t.texture = (void*)(uintptr_t)(textureHandle); t.size = ImVec2((float)width,(float)height); + t.exif = tin.exif; + t.channels = tin.channels; return t; } -void rotate90() -{ -} - void RotateImage(Texture t) { int height = t.size.y; int width = t.size.x; int channels = t.channels; - const unsigned int sizeBuffer = width * height * channels; - unsigned char *tempBuffer = new unsigned char[sizeBuffer]; + const unsigned int sizeBuffer = width * height * channels; + unsigned char *tempBuffer = new unsigned char[sizeBuffer]; - - int nidx = 0; - for (int x = 0; x < width; x++) + int nidx = 0; + for (int x = 0; x < width; x++) + { + for (int y = height - 1; y >= 0; y--) { - for (int y = height - 1; y >= 0; y--) - { - int idx = (x + y * width) * channels; - for (int i = 0; i < channels; i++) - tempBuffer[nidx + i] = image[idx + i]; + int idx = (x + y * width) * channels; + for (int i = 0; i < channels; i++) + tempBuffer[nidx + i] = image[idx + i]; - nidx = nidx + 4; - } + nidx = nidx + 4; + } + } + + memcpy(image, tempBuffer, sizeBuffer); + delete[] tempBuffer; +} + +Texture LoadTexture(const char * path) +{ + const int channelCount = 4; + int imageFileChannelCount; + int width, height; + image = (uint8_t *)stbi_load(path, &width, &height, &imageFileChannelCount, channelCount); + + if (image == NULL) + { + fprintf(stderr, "%s\nFailed to open %s\n", stbi_failure_reason(), path); + + return {nullptr,{0,0}}; } - // Copy rotated pixels + auto exif = printExifData(path); - memcpy(image, tempBuffer, sizeBuffer); - delete[] tempBuffer; + + + GLenum dataFormat = GL_RGBA; + GLuint textureHandle; + glGenTextures(1, &textureHandle); + glBindTexture(GL_TEXTURE_2D, textureHandle); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, dataFormat, GL_UNSIGNED_BYTE, image); + + Texture t; + t.texture = (void*)(uintptr_t)(textureHandle); + t.size = ImVec2((float)width,(float)height); + t.channels = channelCount; + t.exif = exif; + + + return t; } -static bool init = true; -static bool showHelp = false; -static int mode = 0; -const int maxAnnotatedTexels = 10000; + +const int MAX_ANNOATED_TEXELS = 10000; // Main code int main(int argc, char* argv[]) { @@ -156,6 +264,9 @@ int main(int argc, char* argv[]) { bool TOOLTIP_ENABLED = false; bool GRID_ENABLED = false; bool AA_ENABLED = true; + bool SHOW_HELP = false; + bool SHOW_EXIF = false; + int MODE = 0; // Decide GL+GLSL versions #if defined(IMGUI_IMPL_OPENGL_ES2) @@ -209,7 +320,6 @@ int main(int argc, char* argv[]) { // Setup Dear ImGui context IMGUI_CHECKVERSION(); - ImGui::CreateContext(); ImGuiIO &io = ImGui::GetIO(); (void)io; @@ -218,34 +328,27 @@ int main(int argc, char* argv[]) { ImGuiTexInspect::ImplOpenGL3_Init(); // Or DirectX 11 equivalent (check your chosen backend header file) ImGuiTexInspect::Init(); ImGuiTexInspect::CreateContext(); - ImGui::StyleColorsDark(); - ImGuiStyle &style = ImGui::GetStyle(); - ImGui_ImplSDL2_InitForOpenGL(window, gl_context); ImGui_ImplOpenGL3_Init(glsl_version); ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); - Texture t; + auto flags = ImGuiTexInspect::InspectorFlags_FillVertical | ImGuiTexInspect::InspectorFlags_FillHorizontal; - if (init) { - init = false; - try { - auto args = argparse::parse(argc, argv, true); - t = LoadTexture(args.fpath.c_str()); - } catch (const std::runtime_error &e) { - std::cerr << "failed to parse arguments: " << e.what() << std::endl; - return -1; - } + try { + auto args = argparse::parse(argc, argv, true); + t = LoadTexture(args.fpath.c_str()); + } catch (const std::runtime_error &e) { + std::cerr << "failed to parse arguments: " << e.what() << std::endl; + return -1; } // Main loop bool done = false; while (!done) { - auto flags = ImGuiTexInspect::InspectorFlags_FillVertical | ImGuiTexInspect::InspectorFlags_FillHorizontal; // Poll and handle events (inputs, window resize, etc.) SDL_Event event; @@ -272,18 +375,21 @@ int main(int argc, char* argv[]) { AA_ENABLED = !AA_ENABLED; break; case SDL_SCANCODE_H: - showHelp = !showHelp; + SHOW_HELP = !SHOW_HELP; break; case SDL_SCANCODE_D: - mode = (mode + 1) % 5; + MODE = (MODE + 1) % 5; break; case SDL_SCANCODE_R: RotateImage(t); - t = ReloadTexture(t.texture, t.size.y, t.size.x); + t = ReloadTexture(t, t.size.y, t.size.x); break; case SDL_SCANCODE_Q: done = true; break; + case SDL_SCANCODE_E: + SHOW_EXIF = !SHOW_EXIF; + break; default: break; } @@ -311,7 +417,7 @@ int main(int argc, char* argv[]) { ImGui::SetNextWindowPos(viewport->Pos); ImGui::SetNextWindowSize(viewport->Size); ImGui::Begin("Main", NULL, - ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoResize); + ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoBringToFrontOnFocus); auto wSize = ImGui::GetContentRegionAvail(); if (t.texture != 0) { @@ -345,18 +451,18 @@ int main(int argc, char* argv[]) { CurrentInspector_SetFlags(ImGuiTexInspect::InspectorFlags_NoForceFilterNearest); } - switch(mode) { + switch(MODE) { case 1: - ImGuiTexInspect::DrawAnnotations(ImGuiTexInspect::Arrow().UsePreset(ImGuiTexInspect::Arrow::NormalMap), maxAnnotatedTexels); + ImGuiTexInspect::DrawAnnotations(ImGuiTexInspect::Arrow().UsePreset(ImGuiTexInspect::Arrow::NormalMap), MAX_ANNOATED_TEXELS); break; case 2: - ImGuiTexInspect::DrawAnnotations(ImGuiTexInspect::ValueText(ImGuiTexInspect::ValueText::Format::HexString), maxAnnotatedTexels); + ImGuiTexInspect::DrawAnnotations(ImGuiTexInspect::ValueText(ImGuiTexInspect::ValueText::Format::HexString), MAX_ANNOATED_TEXELS); break; case 3: - ImGuiTexInspect::DrawAnnotations(ImGuiTexInspect::ValueText(ImGuiTexInspect::ValueText::Format::BytesDec), maxAnnotatedTexels); + ImGuiTexInspect::DrawAnnotations(ImGuiTexInspect::ValueText(ImGuiTexInspect::ValueText::Format::BytesDec), MAX_ANNOATED_TEXELS); break; case 4: - ImGuiTexInspect::DrawAnnotations(ImGuiTexInspect::ValueText(ImGuiTexInspect::ValueText::Format::Floats), maxAnnotatedTexels); + ImGuiTexInspect::DrawAnnotations(ImGuiTexInspect::ValueText(ImGuiTexInspect::ValueText::Format::Floats), MAX_ANNOATED_TEXELS); break; default: break; @@ -369,10 +475,11 @@ int main(int argc, char* argv[]) { ImGui::PopStyleVar(); ImGui::PopStyleVar(); - if (showHelp){ + if (SHOW_HELP){ ImGui::OpenPopup("HelpPopup"); - showHelp = !showHelp; + SHOW_HELP = !SHOW_HELP; } + if (ImGui::BeginPopup("HelpPopup")) { ImGui::Text("tview Help"); ImGui::Separator(); @@ -390,11 +497,132 @@ int main(int argc, char* argv[]) { ImGui::Text("\tFloat Values"); ImGui::Separator(); ImGui::Text("h - show help popup"); + ImGui::Text("e - toggle EXIF info"); + ImGui::Separator(); ImGui::Text("q - quit"); ImGui::Separator(); ImGui::Text("click anywhere to continue"); ImGui::EndPopup(); } + if (SHOW_EXIF && t.exif.CameraMake != "NULL") { + ImGuiWindowClass topmost; + topmost.ClassId = ImHashStr("TopMost"); + topmost.ViewportFlagsOverrideSet = ImGuiViewportFlags_TopMost; + ImGui::SetNextWindowClass(&topmost); + ImGui::Begin("EXIF", NULL, ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoFocusOnAppearing); + if(ImGui::BeginTable("Hardware", 2)) { + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); + ImGui::Text("Make"); + ImGui::TableSetColumnIndex(1); + ImGui::Text("%s", t.exif.CameraMake.c_str()); + + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); + ImGui::Text("Model"); + ImGui::TableSetColumnIndex(1); + ImGui::Text("%s", t.exif.CameraModel.c_str()); + + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); + ImGui::Text("Lens"); + ImGui::TableSetColumnIndex(1); + ImGui::Text("%s", t.exif.LensModel.c_str()); + + ImGui::EndTable(); + } + + ImGui::Separator(); + + if(ImGui::BeginTable("Photo", 2)) { + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); + ImGui::Text("Shutter Speed"); + ImGui::TableSetColumnIndex(1); + ImGui::Text("%s", t.exif.ShutterSpeed.c_str()); + + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); + ImGui::Text("F-Stop"); + ImGui::TableSetColumnIndex(1); + ImGui::Text("%s", t.exif.FNumber.c_str()); + + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); + ImGui::Text("ISO"); + ImGui::TableSetColumnIndex(1); + ImGui::Text("%s", t.exif.ISO.c_str()); + + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); + ImGui::Text("Focal Length"); + ImGui::TableSetColumnIndex(1); + ImGui::Text("%s", t.exif.FocalLength.c_str()); + + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); + ImGui::Text("Exposure Comp"); + ImGui::TableSetColumnIndex(1); + ImGui::Text("%s", t.exif.ExposureBias.c_str()); + + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); + ImGui::Text("Metering Mode"); + ImGui::TableSetColumnIndex(1); + ImGui::Text("%s", t.exif.MeteringMode.c_str()); + + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); + ImGui::Text("Flash"); + ImGui::TableSetColumnIndex(1); + ImGui::Text("%s", t.exif.Flash.c_str()); + + ImGui::EndTable(); + } + + ImGui::Separator(); + + if(ImGui::BeginTable("Meta", 2)) { + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); + ImGui::Text("Date"); + ImGui::TableSetColumnIndex(1); + ImGui::Text("%s %s", t.exif.TimeTaken.c_str(), t.exif.TimeTakenOffset.c_str()); + + + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); + ImGui::Text("Dimensions"); + ImGui::TableSetColumnIndex(1); + ImGui::Text("%sx%s", t.exif.ImageDimensionX.c_str(), t.exif.ImageDimensiony.c_str()); + + ImGui::EndTable(); + } + + ImGui::Separator(); + + if(ImGui::BeginTable("Location", 2)) { + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); + ImGui::Text("Latitude"); + ImGui::TableSetColumnIndex(1); + ImGui::Text("%s %s", t.exif.GPSLat.c_str(), t.exif.GPSLatref.c_str()); + + + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); + ImGui::Text("Longitude"); + ImGui::TableSetColumnIndex(1); + ImGui::Text("%s %s", t.exif.GPSLon.c_str(), t.exif.GPSLonref.c_str()); + + ImGui::EndTable(); + } + + ImGui::Separator(); + ImGui::Text("Press e to hide"); + + ImGui::End(); + } } // Rendering -- 2.47.2 From 01e85f5dc8c35aefbc5b10952f35ebff038cb3af Mon Sep 17 00:00:00 2001 From: Tanishq Dubey Date: Thu, 13 Jun 2024 10:50:16 -0400 Subject: [PATCH 05/21] test cicd --- .gitea/workflows/demo.yaml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 .gitea/workflows/demo.yaml diff --git a/.gitea/workflows/demo.yaml b/.gitea/workflows/demo.yaml new file mode 100644 index 0000000..aa09f55 --- /dev/null +++ b/.gitea/workflows/demo.yaml @@ -0,0 +1,19 @@ +name: Gitea Actions Demo +run-name: ${{ gitea.actor }} is testing out Gitea Actions +on: [push] + +jobs: + Explore-Gitea-Actions: + runs-on: ubuntu-latest + steps: + - run: echo "The job was automatically triggered by a ${{ gitea.event_name }} event." + - run: echo "This job is now running on a ${{ runner.os }} server hosted by Gitea!" + - run: echo "The name of your branch is ${{ gitea.ref }} and your repository is ${{ gitea.repository }}." + - name: Check out repository code + uses: actions/checkout@v4 + - run: echo "The ${{ gitea.repository }} repository has been cloned to the runner." + - run: echo "The workflow is now ready to test your code on the runner." + - name: List files in the repository + run: | + ls ${{ gitea.workspace }} + - run: echo "This job's status is ${{ job.status }}." -- 2.47.2 From 3dd8f101a9d9300e26c114897f927eba4cef1fb0 Mon Sep 17 00:00:00 2001 From: Tanishq Dubey Date: Sun, 16 Jun 2024 10:29:51 -0400 Subject: [PATCH 06/21] get proper main.cpp --- main.cpp | 103 +++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 81 insertions(+), 22 deletions(-) diff --git a/main.cpp b/main.cpp index eb1c881..c06d690 100644 --- a/main.cpp +++ b/main.cpp @@ -37,6 +37,8 @@ #include +#include "lib/histogram.h" + struct Args : public argparse::Args { std::string &fpath = arg("path to the image"); }; @@ -212,38 +214,53 @@ void RotateImage(Texture t) { delete[] tempBuffer; } -Texture LoadTexture(const char * path) -{ +Texture LoadImage(const char * path) { const int channelCount = 4; int imageFileChannelCount; int width, height; image = (uint8_t *)stbi_load(path, &width, &height, &imageFileChannelCount, channelCount); - - if (image == NULL) - { + if (image == NULL) { fprintf(stderr, "%s\nFailed to open %s\n", stbi_failure_reason(), path); - return {nullptr,{0,0}}; } - auto exif = printExifData(path); + Texture t; + t.size = ImVec2((float)width,(float)height); + t.channels = channelCount; + t.exif = exif; + return t; +} - +Texture LoadTexture(Texture tin) { GLenum dataFormat = GL_RGBA; GLuint textureHandle; glGenTextures(1, &textureHandle); glBindTexture(GL_TEXTURE_2D, textureHandle); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, dataFormat, GL_UNSIGNED_BYTE, image); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tin.size.x, tin.size.y, 0, dataFormat, GL_UNSIGNED_BYTE, image); - Texture t; + Texture t = tin; t.texture = (void*)(uintptr_t)(textureHandle); - t.size = ImVec2((float)width,(float)height); - t.channels = channelCount; - t.exif = exif; + if (t.exif.ImageOrientation == "3") { + RotateImage(t); + ReloadTexture(t, t.size.x, t.size.y); + t = ReloadTexture(t, t.size.y, t.size.x); + RotateImage(t); + t = ReloadTexture(t, t.size.y, t.size.x); + } else if (t.exif.ImageOrientation == "6") { + RotateImage(t); + t = ReloadTexture(t, t.size.y, t.size.x); + } else if (t.exif.ImageOrientation == "8") { + RotateImage(t); + t = ReloadTexture(t, t.size.y, t.size.x); + RotateImage(t); + t = ReloadTexture(t, t.size.y, t.size.x); + RotateImage(t); + t = ReloadTexture(t, t.size.y, t.size.x); + } return t; } @@ -254,6 +271,19 @@ const int MAX_ANNOATED_TEXELS = 10000; // Main code int main(int argc, char* argv[]) { + Texture t; + + try { + auto args = argparse::parse(argc, argv, true); + t = LoadImage(args.fpath.c_str()); + if (t.texture == nullptr) { + std::cerr << "failed load image" << std::endl; + return -1; + } + } catch (const std::runtime_error &e) { + std::cerr << "failed to parse arguments: " << e.what() << std::endl; + return -1; + } // Setup SDL if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_GAMECONTROLLER) != 0) { @@ -266,6 +296,7 @@ int main(int argc, char* argv[]) { bool AA_ENABLED = true; bool SHOW_HELP = false; bool SHOW_EXIF = false; + bool SHOW_HISTOGRAM = false; int MODE = 0; // Decide GL+GLSL versions @@ -306,9 +337,17 @@ int main(int argc, char* argv[]) { SDL_WindowFlags window_flags = (SDL_WindowFlags)(SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI); + + + int wh = 800; + int ww = 1280; + if (t.size.y > t.size.x) { + ww = 500; + wh = 1280; + } SDL_Window *window = SDL_CreateWindow("tview", SDL_WINDOWPOS_CENTERED, - SDL_WINDOWPOS_CENTERED, 1280, 720, window_flags); + SDL_WINDOWPOS_CENTERED, ww, wh, window_flags); if (window == nullptr) { printf("Error: SDL_CreateWindow(): %s\n", SDL_GetError()); return -1; @@ -334,16 +373,11 @@ int main(int argc, char* argv[]) { ImGui_ImplOpenGL3_Init(glsl_version); ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); - Texture t; auto flags = ImGuiTexInspect::InspectorFlags_FillVertical | ImGuiTexInspect::InspectorFlags_FillHorizontal; - try { - auto args = argparse::parse(argc, argv, true); - t = LoadTexture(args.fpath.c_str()); - } catch (const std::runtime_error &e) { - std::cerr << "failed to parse arguments: " << e.what() << std::endl; - return -1; - } + t = LoadTexture(t); + Histogram histogram = Histogram(t.size.x, t.size.y, t.channels); + histogram.Load(image); // Main loop bool done = false; @@ -390,6 +424,9 @@ int main(int argc, char* argv[]) { case SDL_SCANCODE_E: SHOW_EXIF = !SHOW_EXIF; break; + case SDL_SCANCODE_C: + SHOW_HISTOGRAM = !SHOW_HISTOGRAM; + break; default: break; } @@ -497,6 +534,7 @@ int main(int argc, char* argv[]) { ImGui::Text("\tFloat Values"); ImGui::Separator(); ImGui::Text("h - show help popup"); + ImGui::Text("c - toggle color histogram"); ImGui::Text("e - toggle EXIF info"); ImGui::Separator(); ImGui::Text("q - quit"); @@ -596,6 +634,12 @@ int main(int argc, char* argv[]) { ImGui::TableSetColumnIndex(1); ImGui::Text("%sx%s", t.exif.ImageDimensionX.c_str(), t.exif.ImageDimensiony.c_str()); + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); + ImGui::Text("Orientation"); + ImGui::TableSetColumnIndex(1); + ImGui::Text("%s", t.exif.ImageOrientation.c_str()); + ImGui::EndTable(); } @@ -623,8 +667,23 @@ int main(int argc, char* argv[]) { ImGui::End(); } + + + if (SHOW_HISTOGRAM) { + ImGuiWindowClass topmost; + topmost.ClassId = ImHashStr("TopMost"); + topmost.ViewportFlagsOverrideSet = ImGuiViewportFlags_TopMost; + ImGui::SetNextWindowClass(&topmost); + ImGui::Begin("Histogram", NULL, ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoFocusOnAppearing); + histogram.Draw(); + ImGui::Separator(); + ImGui::Text("Press c to hide"); + + ImGui::End(); + } } + // Rendering ImGui::Render(); glViewport(0, 0, (int)io.DisplaySize.x, (int)io.DisplaySize.y); -- 2.47.2 From ac1eb1eed87a5d66fbfc9d5a5e4444dd3db93b75 Mon Sep 17 00:00:00 2001 From: Tanishq Dubey Date: Sun, 16 Jun 2024 10:48:57 -0400 Subject: [PATCH 07/21] try build --- .gitea/workflows/demo.yaml | 19 ------------------- .gitea/workflows/run_build.yaml | 20 ++++++++++++++++++++ 2 files changed, 20 insertions(+), 19 deletions(-) delete mode 100644 .gitea/workflows/demo.yaml create mode 100644 .gitea/workflows/run_build.yaml diff --git a/.gitea/workflows/demo.yaml b/.gitea/workflows/demo.yaml deleted file mode 100644 index aa09f55..0000000 --- a/.gitea/workflows/demo.yaml +++ /dev/null @@ -1,19 +0,0 @@ -name: Gitea Actions Demo -run-name: ${{ gitea.actor }} is testing out Gitea Actions -on: [push] - -jobs: - Explore-Gitea-Actions: - runs-on: ubuntu-latest - steps: - - run: echo "The job was automatically triggered by a ${{ gitea.event_name }} event." - - run: echo "This job is now running on a ${{ runner.os }} server hosted by Gitea!" - - run: echo "The name of your branch is ${{ gitea.ref }} and your repository is ${{ gitea.repository }}." - - name: Check out repository code - uses: actions/checkout@v4 - - run: echo "The ${{ gitea.repository }} repository has been cloned to the runner." - - run: echo "The workflow is now ready to test your code on the runner." - - name: List files in the repository - run: | - ls ${{ gitea.workspace }} - - run: echo "This job's status is ${{ job.status }}." diff --git a/.gitea/workflows/run_build.yaml b/.gitea/workflows/run_build.yaml new file mode 100644 index 0000000..3c21416 --- /dev/null +++ b/.gitea/workflows/run_build.yaml @@ -0,0 +1,20 @@ +name: Run Build +run-name: ${{ gitea.actor }} is building tview +on: [push] + +jobs: + run-builds: + name: Run build + container: + image: ubuntu:latest + steps: + - name: Checkout repo + uses: actions/checkout@v2 + - name: Run ls + run: ls + - name: Install things + run: apt update && apt install build-essential cmake libsdl2-dev libexiv2-dev mesa-utils + - name: Generate + run: cmake . + - name: Build + run: cmake --build . -- 2.47.2 From 498f209287dcde2a72e23dab99a7885b5bfd5cb6 Mon Sep 17 00:00:00 2001 From: Tanishq Dubey Date: Sun, 16 Jun 2024 10:50:26 -0400 Subject: [PATCH 08/21] maybe I need runs on --- .gitea/workflows/run_build.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitea/workflows/run_build.yaml b/.gitea/workflows/run_build.yaml index 3c21416..83772c3 100644 --- a/.gitea/workflows/run_build.yaml +++ b/.gitea/workflows/run_build.yaml @@ -4,6 +4,7 @@ on: [push] jobs: run-builds: + runs-on: ubuntu-latest name: Run build container: image: ubuntu:latest -- 2.47.2 From 9e33c72484bc3ca2d6dcec6aadb6fd2d82745166 Mon Sep 17 00:00:00 2001 From: Tanishq Dubey Date: Sun, 16 Jun 2024 10:52:18 -0400 Subject: [PATCH 09/21] indentation --- .gitea/workflows/run_build.yaml | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/.gitea/workflows/run_build.yaml b/.gitea/workflows/run_build.yaml index 83772c3..e2df725 100644 --- a/.gitea/workflows/run_build.yaml +++ b/.gitea/workflows/run_build.yaml @@ -4,18 +4,16 @@ on: [push] jobs: run-builds: - runs-on: ubuntu-latest - name: Run build container: image: ubuntu:latest - steps: - - name: Checkout repo - uses: actions/checkout@v2 - - name: Run ls - run: ls - - name: Install things - run: apt update && apt install build-essential cmake libsdl2-dev libexiv2-dev mesa-utils - - name: Generate - run: cmake . - - name: Build - run: cmake --build . + steps: + - name: Check out repository code + uses: actions/checkout@v4 + - name: Run ls + run: ls + - name: Install things + run: apt update && apt install build-essential cmake libsdl2-dev libexiv2-dev mesa-utils + - name: Generate + run: cmake . + - name: Build + run: cmake --build . -- 2.47.2 From 1a28004dd095ccb29ec7a40b5e3790bc7396b9c5 Mon Sep 17 00:00:00 2001 From: Tanishq Dubey Date: Sun, 16 Jun 2024 10:53:17 -0400 Subject: [PATCH 10/21] reorder --- .gitea/workflows/run_build.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitea/workflows/run_build.yaml b/.gitea/workflows/run_build.yaml index e2df725..352ef1f 100644 --- a/.gitea/workflows/run_build.yaml +++ b/.gitea/workflows/run_build.yaml @@ -7,12 +7,12 @@ jobs: container: image: ubuntu:latest steps: + - name: Install things + run: apt update && apt install build-essential cmake libsdl2-dev libexiv2-dev mesa-utils - name: Check out repository code uses: actions/checkout@v4 - name: Run ls run: ls - - name: Install things - run: apt update && apt install build-essential cmake libsdl2-dev libexiv2-dev mesa-utils - name: Generate run: cmake . - name: Build -- 2.47.2 From fe259c80e9b8d628abeaae382c936242f6c30fde Mon Sep 17 00:00:00 2001 From: Tanishq Dubey Date: Sun, 16 Jun 2024 10:54:23 -0400 Subject: [PATCH 11/21] apt flags --- .gitea/workflows/run_build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitea/workflows/run_build.yaml b/.gitea/workflows/run_build.yaml index 352ef1f..9007f19 100644 --- a/.gitea/workflows/run_build.yaml +++ b/.gitea/workflows/run_build.yaml @@ -8,7 +8,7 @@ jobs: image: ubuntu:latest steps: - name: Install things - run: apt update && apt install build-essential cmake libsdl2-dev libexiv2-dev mesa-utils + run: apt update && apt install --no-install-recommends -y build-essential cmake libsdl2-dev libexiv2-dev mesa-utils - name: Check out repository code uses: actions/checkout@v4 - name: Run ls -- 2.47.2 From 1635528802c0909f6fee6ca47c838f9ab8320165 Mon Sep 17 00:00:00 2001 From: Tanishq Dubey Date: Sun, 16 Jun 2024 10:55:51 -0400 Subject: [PATCH 12/21] add node for checkout I guess --- .gitea/workflows/run_build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitea/workflows/run_build.yaml b/.gitea/workflows/run_build.yaml index 9007f19..8d380d7 100644 --- a/.gitea/workflows/run_build.yaml +++ b/.gitea/workflows/run_build.yaml @@ -8,7 +8,7 @@ jobs: image: ubuntu:latest steps: - name: Install things - run: apt update && apt install --no-install-recommends -y build-essential cmake libsdl2-dev libexiv2-dev mesa-utils + run: apt update && apt install --no-install-recommends -y build-essential cmake libsdl2-dev libexiv2-dev mesa-utils nodejs - name: Check out repository code uses: actions/checkout@v4 - name: Run ls -- 2.47.2 From 66b8e56fd69e9ea9da72999e95672e8ce2a9afbb Mon Sep 17 00:00:00 2001 From: Tanishq Dubey Date: Sun, 16 Jun 2024 10:57:25 -0400 Subject: [PATCH 13/21] update certs --- .gitea/workflows/run_build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitea/workflows/run_build.yaml b/.gitea/workflows/run_build.yaml index 8d380d7..8dcaad6 100644 --- a/.gitea/workflows/run_build.yaml +++ b/.gitea/workflows/run_build.yaml @@ -8,7 +8,7 @@ jobs: image: ubuntu:latest steps: - name: Install things - run: apt update && apt install --no-install-recommends -y build-essential cmake libsdl2-dev libexiv2-dev mesa-utils nodejs + run: apt update && apt install --no-install-recommends -y build-essential cmake libsdl2-dev libexiv2-dev mesa-utils nodejs ca-certificates git - name: Check out repository code uses: actions/checkout@v4 - name: Run ls -- 2.47.2 From a4459af174be99bd00a3097f7bf55249c09b844d Mon Sep 17 00:00:00 2001 From: Tanishq Dubey Date: Sun, 16 Jun 2024 11:10:48 -0400 Subject: [PATCH 14/21] multi system build --- .gitea/workflows/run_build.yaml | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/.gitea/workflows/run_build.yaml b/.gitea/workflows/run_build.yaml index 8dcaad6..eed2bd9 100644 --- a/.gitea/workflows/run_build.yaml +++ b/.gitea/workflows/run_build.yaml @@ -3,7 +3,7 @@ run-name: ${{ gitea.actor }} is building tview on: [push] jobs: - run-builds: + run-build-ubuntu: container: image: ubuntu:latest steps: @@ -17,3 +17,17 @@ jobs: run: cmake . - name: Build run: cmake --build . + run-build-arch: + container: + image: archlinux:multilib-devel + steps: + - name: Install things + run: pacman -Sy --no-confirm sdl2 mesa-utils exiv2 cmake nodejs git + - name: Check out repository code + uses: actions/checkout@v4 + - name: Run ls + run: ls + - name: Generate + run: cmake . + - name: Build + run: cmake --build . -- 2.47.2 From 686d68ce277373d1707e92283821a8159ff2ce6b Mon Sep 17 00:00:00 2001 From: Tanishq Dubey Date: Sun, 16 Jun 2024 11:12:56 -0400 Subject: [PATCH 15/21] flags --- .gitea/workflows/run_build.yaml | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/.gitea/workflows/run_build.yaml b/.gitea/workflows/run_build.yaml index eed2bd9..13df846 100644 --- a/.gitea/workflows/run_build.yaml +++ b/.gitea/workflows/run_build.yaml @@ -3,6 +3,20 @@ run-name: ${{ gitea.actor }} is building tview on: [push] jobs: + run-build-arch: + container: + image: archlinux:multilib-devel + steps: + - name: Install things + run: pacman -Sy --noconfirm sdl2 mesa-utils exiv2 cmake nodejs git + - name: Check out repository code + uses: actions/checkout@v4 + - name: Run ls + run: ls + - name: Generate + run: cmake . + - name: Build + run: cmake --build . run-build-ubuntu: container: image: ubuntu:latest @@ -17,17 +31,3 @@ jobs: run: cmake . - name: Build run: cmake --build . - run-build-arch: - container: - image: archlinux:multilib-devel - steps: - - name: Install things - run: pacman -Sy --no-confirm sdl2 mesa-utils exiv2 cmake nodejs git - - name: Check out repository code - uses: actions/checkout@v4 - - name: Run ls - run: ls - - name: Generate - run: cmake . - - name: Build - run: cmake --build . -- 2.47.2 From 702214e20c83210c2b7f3b3f7c220d27dc1a0a89 Mon Sep 17 00:00:00 2001 From: Tanishq Dubey Date: Sun, 16 Jun 2024 11:14:20 -0400 Subject: [PATCH 16/21] updat system --- .gitea/workflows/run_build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitea/workflows/run_build.yaml b/.gitea/workflows/run_build.yaml index 13df846..9b1584c 100644 --- a/.gitea/workflows/run_build.yaml +++ b/.gitea/workflows/run_build.yaml @@ -8,7 +8,7 @@ jobs: image: archlinux:multilib-devel steps: - name: Install things - run: pacman -Sy --noconfirm sdl2 mesa-utils exiv2 cmake nodejs git + run: pacman -Sy --noconfirm sdl2 mesa-utils exiv2 cmake nodejs git && pacman -Syu --noconfirm - name: Check out repository code uses: actions/checkout@v4 - name: Run ls -- 2.47.2 From 1dc7b58212eab2b843da7fb22ae83ddd7888c67f Mon Sep 17 00:00:00 2001 From: Tanishq Dubey Date: Sun, 16 Jun 2024 11:30:22 -0400 Subject: [PATCH 17/21] try exiv version fix for ubuntu --- main.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/main.cpp b/main.cpp index c06d690..8b27282 100644 --- a/main.cpp +++ b/main.cpp @@ -8,6 +8,7 @@ #include "lib/imgui_internal.h" #include #include +#include #include #include #include @@ -39,6 +40,8 @@ #include "lib/histogram.h" + + struct Args : public argparse::Args { std::string &fpath = arg("path to the image"); }; @@ -83,7 +86,11 @@ EXIFData printExifData(const std::string& imagePath) { d.CameraMake = "NULL"; try { // Load the image + #if EXIV2_TEST_VERSION(0,28,0) Exiv2::Image::UniquePtr img = Exiv2::ImageFactory::open(imagePath); + #else + Exiv2::Image::AutoPtr img = Exiv2::ImageFactory::open(imagePath); + #endif if (img.get() == 0) { std::cerr << "Error: Could not open image file " << imagePath << std::endl; return d; -- 2.47.2 From b29b376414dba2185a4a90e7cb024abaf72db5d2 Mon Sep 17 00:00:00 2001 From: Tanishq Dubey Date: Sun, 16 Jun 2024 11:35:25 -0400 Subject: [PATCH 18/21] add debian build to cicd, clean up labels --- .gitea/workflows/run_build.yaml | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/.gitea/workflows/run_build.yaml b/.gitea/workflows/run_build.yaml index 9b1584c..e3772b9 100644 --- a/.gitea/workflows/run_build.yaml +++ b/.gitea/workflows/run_build.yaml @@ -7,27 +7,37 @@ jobs: container: image: archlinux:multilib-devel steps: - - name: Install things + - name: Install dependencies run: pacman -Sy --noconfirm sdl2 mesa-utils exiv2 cmake nodejs git && pacman -Syu --noconfirm - name: Check out repository code uses: actions/checkout@v4 - name: Run ls run: ls - - name: Generate + - name: Generate build files run: cmake . - name: Build run: cmake --build . run-build-ubuntu: container: - image: ubuntu:latest + image: ubuntu:24.04 steps: - - name: Install things + - name: Install dependencies run: apt update && apt install --no-install-recommends -y build-essential cmake libsdl2-dev libexiv2-dev mesa-utils nodejs ca-certificates git - name: Check out repository code uses: actions/checkout@v4 - - name: Run ls - run: ls - - name: Generate + - name: Generate build files + run: cmake . + - name: Build + run: cmake --build . + run-build-debian: + container: + image: debian:bookworm + steps: + - name: Install dependencies + run: apt update && apt install --no-install-recommends -y build-essential cmake libsdl2-dev libexiv2-dev mesa-utils nodejs ca-certificates git + - name: Check out repository code + uses: actions/checkout@v4 + - name: Generate build files run: cmake . - name: Build run: cmake --build . -- 2.47.2 From 7fb2c40213ebf31fa36545519a971c785ef9975b Mon Sep 17 00:00:00 2001 From: Tanishq Dubey Date: Sun, 16 Jun 2024 16:30:59 -0400 Subject: [PATCH 19/21] add debian build and build optimization --- .gitea/workflows/run_build.yaml | 12 ++++++++++++ CMakeLists.txt | 8 ++++++++ 2 files changed, 20 insertions(+) diff --git a/.gitea/workflows/run_build.yaml b/.gitea/workflows/run_build.yaml index e3772b9..cdccda6 100644 --- a/.gitea/workflows/run_build.yaml +++ b/.gitea/workflows/run_build.yaml @@ -41,3 +41,15 @@ jobs: run: cmake . - name: Build run: cmake --build . + run-build-debian: + container: + image: debian:bookworm + steps: + - name: Install dependencies + run: apt update && apt install --no-install-recommends -y build-essential cmake libsdl2-dev libexiv2-dev mesa-utils nodejs ca-certificates git + - name: Check out repository code + uses: actions/checkout@v4 + - name: Generate build files + run: cmake . + - name: Build + run: cmake --build . diff --git a/CMakeLists.txt b/CMakeLists.txt index 9ce4a22..4ff0d0e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,9 @@ cmake_minimum_required(VERSION 3.10) +if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE Release) +endif() + set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED True) @@ -46,5 +50,9 @@ find_package(OpenGL REQUIRED) find_package(exiv2 REQUIRED) include_directories(${SDL2_INCLUDE_DIRS} ${OPENGL_INCLUDE_DIRS}) +set(CMAKE_CXX_FLAGS "-Wall -Wextra") +set(CMAKE_CXX_FLAGS_DEBUG "-g") +set(CMAKE_CXX_FLAGS_RELEASE "-O2") + add_executable(tview ${SOURCES}) target_link_libraries(tview ${SDL2_LIBRARIES} ${OPENGL_LIBRARIES} exiv2lib) -- 2.47.2 From fa1548ccc7d9f45266a7c88cc9e55be14d6a0c57 Mon Sep 17 00:00:00 2001 From: Tanishq Dubey Date: Sun, 16 Jun 2024 16:32:56 -0400 Subject: [PATCH 20/21] trigger cicd -- 2.47.2 From ac16e0431d2df93df5a70c25c0b4dbf25e893142 Mon Sep 17 00:00:00 2001 From: Tanishq Dubey Date: Sun, 16 Jun 2024 16:34:48 -0400 Subject: [PATCH 21/21] remove duplicate debian --- .gitea/workflows/run_build.yaml | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/.gitea/workflows/run_build.yaml b/.gitea/workflows/run_build.yaml index cdccda6..e3772b9 100644 --- a/.gitea/workflows/run_build.yaml +++ b/.gitea/workflows/run_build.yaml @@ -41,15 +41,3 @@ jobs: run: cmake . - name: Build run: cmake --build . - run-build-debian: - container: - image: debian:bookworm - steps: - - name: Install dependencies - run: apt update && apt install --no-install-recommends -y build-essential cmake libsdl2-dev libexiv2-dev mesa-utils nodejs ca-certificates git - - name: Check out repository code - uses: actions/checkout@v4 - - name: Generate build files - run: cmake . - - name: Build - run: cmake --build . -- 2.47.2