From e34e38778eb969efe262a5d692ff2ab70ead0e98 Mon Sep 17 00:00:00 2001 From: Tanishq Dubey Date: Wed, 12 Jun 2024 16:27:32 -0400 Subject: [PATCH 1/7] changes to get macos building --- imgui.ini | 2 +- lib/backends/tex_inspect_opengl.cpp | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/imgui.ini b/imgui.ini index 5b3f7e9..ea0cdee 100644 --- a/imgui.ini +++ b/imgui.ini @@ -14,7 +14,7 @@ Collapsed=0 [Window][Main] Pos=0,0 -Size=1654,1186 +Size=2560,1532 Collapsed=0 [Window][Help] diff --git a/lib/backends/tex_inspect_opengl.cpp b/lib/backends/tex_inspect_opengl.cpp index 29570fe..4ed0a3d 100644 --- a/lib/backends/tex_inspect_opengl.cpp +++ b/lib/backends/tex_inspect_opengl.cpp @@ -77,9 +77,8 @@ using namespace gl; #elif defined(IMGUI_IMPL_OPENGL_LOADER_EPOXY) #include #else -#include -#include -#include +#include +#include #endif #endif From 844d23b3fd90a877ee3f10291fa7e3476f7eeeef Mon Sep 17 00:00:00 2001 From: Tanishq Dubey Date: Fri, 14 Jun 2024 19:28:07 -0400 Subject: [PATCH 2/7] resolve conflict --- imgui.ini | 24 ----------------- main.cpp | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 76 insertions(+), 28 deletions(-) delete mode 100644 imgui.ini diff --git a/imgui.ini b/imgui.ini deleted file mode 100644 index ea0cdee..0000000 --- a/imgui.ini +++ /dev/null @@ -1,24 +0,0 @@ -[Window][Debug##Default] -Pos=341,6 -Size=400,400 -Collapsed=0 - -[Window][viewport_container] -Size=1101,598 -Collapsed=0 - -[Window][Editor] -Pos=33,52 -Size=1118,634 -Collapsed=0 - -[Window][Main] -Pos=0,0 -Size=2560,1532 -Collapsed=0 - -[Window][Help] -Pos=136,255 -Size=177,114 -Collapsed=0 - diff --git a/main.cpp b/main.cpp index e4b06d2..db2ae2b 100644 --- a/main.cpp +++ b/main.cpp @@ -17,6 +17,7 @@ #include "lib/backends/imgui_impl_sdl2.h" #include "lib/imgui.h" #include "lib/imgui_internal.h" +#include #include #include #include @@ -52,14 +53,17 @@ struct Texture { ImTextureID texture; ImVec2 size; + int channels; }; +static uint8_t* image = nullptr; + Texture LoadTexture(const char * path) { const int channelCount = 4; int imageFileChannelCount; int width, height; - uint8_t *image = (uint8_t *)stbi_load(path, &width, &height, &imageFileChannelCount, channelCount); + 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); @@ -78,11 +82,62 @@ Texture LoadTexture(const char * path) Texture t; t.texture = (void*)(uintptr_t)(textureHandle); t.size = ImVec2((float)width,(float)height); + t.channels = channelCount; - stbi_image_free(image); return t; } +Texture ReloadTexture(ImTextureID id, int width, int height) { + GLuint tid = (GLuint)(uintptr_t)id; + glDeleteTextures((GLsizei)1, &tid); + + 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); + + 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]; + + + int nidx = 0; + for (int x = 0; x < width; x++) + { + 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; + } + } + + // Copy rotated pixels + + memcpy(image, tempBuffer, sizeBuffer); + delete[] tempBuffer; +} + static bool init = true; static bool showHelp = false; @@ -99,7 +154,7 @@ int main(int argc, char* argv[]) { } bool TOOLTIP_ENABLED = false; - bool GRID_ENABLED = true; + bool GRID_ENABLED = false; bool AA_ENABLED = true; // Decide GL+GLSL versions @@ -222,6 +277,10 @@ int main(int argc, char* argv[]) { case SDL_SCANCODE_D: mode = (mode + 1) % 5; break; + case SDL_SCANCODE_R: + RotateImage(t); + t = ReloadTexture(t.texture, t.size.y, t.size.x); + break; case SDL_SCANCODE_Q: done = true; break; @@ -317,12 +376,21 @@ int main(int argc, char* argv[]) { if (ImGui::BeginPopup("HelpPopup")) { ImGui::Text("tview Help"); ImGui::Separator(); + ImGui::Text("r - rotate 90 deg clockwise"); ImGui::Text("g - toggle grid"); ImGui::Text("a - toggle filtering"); ImGui::Text("t - toggle tooltip"); ImGui::Text("d - cycle pixel detail mode"); - ImGui::Text("q - quit"); + ImGui::Separator(); + ImGui::Text("modes:"); + ImGui::Text("\tOff"); + ImGui::Text("\tGradient Arrow"); + ImGui::Text("\tHex Code"); + ImGui::Text("\tRGB Values"); + ImGui::Text("\tFloat Values"); + ImGui::Separator(); ImGui::Text("h - show help popup"); + ImGui::Text("q - quit"); ImGui::Separator(); ImGui::Text("click anywhere to continue"); ImGui::EndPopup(); @@ -339,6 +407,10 @@ int main(int argc, char* argv[]) { SDL_GL_SwapWindow(window); } + if (image != nullptr) { + stbi_image_free(image); + } + // Cleanup ImGui_ImplOpenGL3_Shutdown(); ImGui_ImplSDL2_Shutdown(); From 460e63af26cff2857f883561be4fa30a7a25ee4b Mon Sep 17 00:00:00 2001 From: Tanishq Dubey Date: Wed, 12 Jun 2024 18:24:11 -0400 Subject: [PATCH 3/7] a little lcean up --- lib/uuid.cpp | 35 ------------------------- lib/uuid.h | 12 --------- main.cpp | 74 +++++++++++++++++----------------------------------- 3 files changed, 24 insertions(+), 97 deletions(-) delete mode 100644 lib/uuid.cpp delete mode 100644 lib/uuid.h diff --git a/lib/uuid.cpp b/lib/uuid.cpp deleted file mode 100644 index 248836e..0000000 --- a/lib/uuid.cpp +++ /dev/null @@ -1,35 +0,0 @@ -#include "uuid.h" - -namespace uuid { -static std::random_device rd; -static std::mt19937 gen(rd()); -static std::uniform_int_distribution<> dis(0, 15); -static std::uniform_int_distribution<> dis2(8, 11); - -std::string generate_uuid_v4() { - std::stringstream ss; - int i; - ss << std::hex; - for (i = 0; i < 8; i++) { - ss << dis(gen); - } - ss << "-"; - for (i = 0; i < 4; i++) { - ss << dis(gen); - } - ss << "-4"; - for (i = 0; i < 3; i++) { - ss << dis(gen); - } - ss << "-"; - ss << dis2(gen); - for (i = 0; i < 3; i++) { - ss << dis(gen); - } - ss << "-"; - for (i = 0; i < 12; i++) { - ss << dis(gen); - }; - return ss.str(); -} -} // namespace uuid diff --git a/lib/uuid.h b/lib/uuid.h deleted file mode 100644 index 0f938d6..0000000 --- a/lib/uuid.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef UUID_H -#define UUID_H - -#include -#include -#include - -namespace uuid { -std::string generate_uuid_v4(); -} - -#endif // UUID_H diff --git a/main.cpp b/main.cpp index db2ae2b..ac38560 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 @@ -106,43 +95,33 @@ Texture ReloadTexture(ImTextureID id, int width, int height) { 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; } + } - // Copy rotated pixels - - memcpy(image, tempBuffer, sizeBuffer); - delete[] tempBuffer; + memcpy(image, tempBuffer, sizeBuffer); + delete[] tempBuffer; } -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 +135,8 @@ int main(int argc, char* argv[]) { bool TOOLTIP_ENABLED = false; bool GRID_ENABLED = false; bool AA_ENABLED = true; + bool SHOW_HELP = false; + int MODE = 0; // Decide GL+GLSL versions #if defined(IMGUI_IMPL_OPENGL_ES2) @@ -209,7 +190,6 @@ int main(int argc, char* argv[]) { // Setup Dear ImGui context IMGUI_CHECKVERSION(); - ImGui::CreateContext(); ImGuiIO &io = ImGui::GetIO(); (void)io; @@ -218,34 +198,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; @@ -373,6 +346,7 @@ int main(int argc, char* argv[]) { ImGui::OpenPopup("HelpPopup"); showHelp = !showHelp; } + if (ImGui::BeginPopup("HelpPopup")) { ImGui::Text("tview Help"); ImGui::Separator(); From 1d54148b3ef46b4763bb9b9c7ce7d7b4e3b12f80 Mon Sep 17 00:00:00 2001 From: Tanishq Dubey Date: Wed, 12 Jun 2024 18:25:10 -0400 Subject: [PATCH 4/7] fix build --- main.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/main.cpp b/main.cpp index ac38560..25cca24 100644 --- a/main.cpp +++ b/main.cpp @@ -245,10 +245,10 @@ 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); @@ -318,18 +318,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; @@ -342,9 +342,9 @@ 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")) { From a7aefc10ec1813758fe69e2e151198fab4e4d89d Mon Sep 17 00:00:00 2001 From: Tanishq Dubey Date: Fri, 14 Jun 2024 19:28:48 -0400 Subject: [PATCH 5/7] resolve conflict --- Makefile | 6 +- main.cpp | 310 ++++++++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 285 insertions(+), 31 deletions(-) diff --git a/Makefile b/Makefile index fc45bd6..7dbff72 100644 --- a/Makefile +++ b/Makefile @@ -25,7 +25,7 @@ LINUX_GL_LIBS = -lGL CXXFLAGS = -std=c++20 -I$(IMGUI_DIR) -I$(IMGUI_DIR)/backends CXXFLAGS += -DIMGUI_DEFINE_MATH_OPERATORS -Ofast -LIBS = +LIBS = -lexiv2 ##--------------------------------------------------------------------- ## OPENGL ES @@ -44,9 +44,9 @@ LIBS = ifeq ($(UNAME_S), Linux) #LINUX ECHO_MESSAGE = "Linux" - LIBS += $(LINUX_GL_LIBS) -ldl `sdl2-config --libs` + LIBS += $(LINUX_GL_LIBS) -ldl -L/usr/lib -lSDL2 - CXXFLAGS += `sdl2-config --cflags` + CXXFLAGS += -I/usr/include/SDL2 -D_REENTRANT CFLAGS = $(CXXFLAGS) endif diff --git a/main.cpp b/main.cpp index 25cca24..eb1c881 100644 --- a/main.cpp +++ b/main.cpp @@ -7,6 +7,7 @@ #include "lib/imgui.h" #include "lib/imgui_internal.h" #include +#include #include #include #include @@ -34,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; @@ -91,6 +181,8 @@ 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; } @@ -120,6 +212,43 @@ void RotateImage(Texture t) { 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}}; + } + + auto exif = printExifData(path); + + + + 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; +} + + const int MAX_ANNOATED_TEXELS = 10000; @@ -136,6 +265,7 @@ int main(int argc, char* argv[]) { bool GRID_ENABLED = false; bool AA_ENABLED = true; bool SHOW_HELP = false; + bool SHOW_EXIF = false; int MODE = 0; // Decide GL+GLSL versions @@ -252,11 +382,14 @@ int main(int argc, char* argv[]) { 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; } @@ -284,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) { @@ -364,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 From 6cafeb08349d6212ab31700647094745233752b5 Mon Sep 17 00:00:00 2001 From: Tanishq Dubey Date: Thu, 13 Jun 2024 09:13:57 -0400 Subject: [PATCH 6/7] remove gui ini --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index dcb7dd9..0f3c454 100644 --- a/.gitignore +++ b/.gitignore @@ -31,5 +31,6 @@ *.out *.app +imgui.ini tview From 5cf05f1419c8277342d68e65d599acc1abd50950 Mon Sep 17 00:00:00 2001 From: Tanishq Dubey Date: Fri, 14 Jun 2024 19:33:45 -0400 Subject: [PATCH 7/7] Add platform check --- Makefile | 2 +- lib/backends/tex_inspect_opengl.cpp | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 7dbff72..b53f171 100644 --- a/Makefile +++ b/Makefile @@ -24,7 +24,7 @@ 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 -Ofast +CXXFLAGS += -DIMGUI_DEFINE_MATH_OPERATORS -O3 -DGL_SILENCE_DEPRECATION LIBS = -lexiv2 ##--------------------------------------------------------------------- diff --git a/lib/backends/tex_inspect_opengl.cpp b/lib/backends/tex_inspect_opengl.cpp index 4ed0a3d..7cfae92 100644 --- a/lib/backends/tex_inspect_opengl.cpp +++ b/lib/backends/tex_inspect_opengl.cpp @@ -77,8 +77,14 @@ using namespace gl; #elif defined(IMGUI_IMPL_OPENGL_LOADER_EPOXY) #include #else +#if defined(__APPLE__) #include #include +#else +#include +#include +#include +#endif #endif #endif