Transition to C++23 (#11)

* enum field renaming

* renderer cleanups

* compiling for C++23

* version bump

* fix build
This commit is contained in:
m-aXimilian
2025-10-07 12:18:00 +02:00
committed by Maximilian Kueffner
parent 1ea83d9d11
commit fec5c08aaa
15 changed files with 60 additions and 55 deletions
+5 -5
View File
@@ -1,9 +1,9 @@
cmake_minimum_required(VERSION 3.23) cmake_minimum_required(VERSION 3.23)
project(pixelarium VERSION 0.0.4) project(pixelarium VERSION 0.0.5)
set(CMAKE_VERBOSE_MAKEFILE ON) set(CMAKE_VERBOSE_MAKEFILE ON)
set(CXX_STANDARD 20) set(CXX_STANDARD 23)
set(CXX_STANDARD_REQUIRED true) set(CXX_STANDARD_REQUIRED true)
# setting global module directories # setting global module directories
@@ -28,13 +28,13 @@ option(PIXELARIUM_BUILD_DOCS "Generate Documentation" ON)
if(WIN32) if(WIN32)
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>") set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
set(CMAKE_CXX_FLAGS "/std:c++20 /Zi /EHsc") set(CMAKE_CXX_FLAGS "/std:c++23 /Zi /EHsc")
else() else()
set(CMAKE_CXX_FLAGS "-Wall -Wextra -g --std=c++20") set(CMAKE_CXX_FLAGS "-Wall -Wextra -g --std=c++23")
endif() endif()
endif() endif()
if(UNIX) if(UNIX)
set(CMAKE_CXX_FLAGS "-Wall -Wextra -g --std=c++20") set(CMAKE_CXX_FLAGS "-Wall -Wextra -g --std=c++23")
endif() endif()
string(TOUPPER "${CMAKE_PROJECT_NAME}" PIXELARIUM_TITLE) string(TOUPPER "${CMAKE_PROJECT_NAME}" PIXELARIUM_TITLE)
+1
View File
@@ -2,6 +2,7 @@
| Version | Description | | Version | Description |
|:-------:|:------------------------------------------------------------------------| |:-------:|:------------------------------------------------------------------------|
| 0.0.5 | Compile for C++23 and code style adaptions |
| 0.0.4 | Fix MSVC build, some cosmetics, explicit initial window size for images | | 0.0.4 | Fix MSVC build, some cosmetics, explicit initial window size for images |
| 0.0.3 | Fetch subblocks based on the dimension selection sliders | | 0.0.3 | Fetch subblocks based on the dimension selection sliders |
| 0.0.2 | Add Dimension selector sliders to CZI image view | | 0.0.2 | Add Dimension selector sliders to CZI image view |
+6 -6
View File
@@ -14,15 +14,15 @@ using ImageQueryFunctor = std::function<void(const std::string&, void*, int*)>;
enum class ImageFileType enum class ImageFileType
{ {
/// @brief Represents an unknown or unsupported file type. /// @brief Represents an unknown or unsupported file type.
UNKNOWN = -10, kUnknown = -10,
/// @brief Represents an abstract image type (e.g., a placeholder). /// @brief Represents an abstract image type (e.g., a placeholder).
ABSTRACT = 0, kAbstract = 0,
/// @brief Represents a PNG image file. /// @brief Represents a PNG image file.
PNG = 1, kPng = 1,
/// @brief Represents a JPG image file. /// @brief Represents a JPG image file.
JPG = 2, kJpg = 2,
/// @brief Represents a CZI image file. /// @brief Represents a CZI image file.
CZI = 3, kCzi = 3,
}; };
/// @brief An abstract interface to define a semantic query /// @brief An abstract interface to define a semantic query
@@ -83,7 +83,7 @@ class IPixelariumImage
} }
public: public:
const static ImageFileType type_{ImageFileType::ABSTRACT}; const static ImageFileType type_{ImageFileType::kAbstract};
protected: protected:
std::filesystem::path uri_; std::filesystem::path uri_;
+5 -5
View File
@@ -16,19 +16,19 @@ pixelarium::imaging::PixelariumImageFactory::CreateImage(const std::string& uri,
switch (target_type) switch (target_type)
{ {
case ImageFileType::UNKNOWN: case ImageFileType::kUnknown:
return {}; return {};
break; break;
case ImageFileType::ABSTRACT: case ImageFileType::kAbstract:
return {}; return {};
break; break;
case ImageFileType::PNG: case ImageFileType::kPng:
return std::make_unique<PixelariumPng>(uri); return std::make_unique<PixelariumPng>(uri);
break; break;
case ImageFileType::JPG: case ImageFileType::kJpg:
return std::make_unique<PixelariumJpg>(uri); return std::make_unique<PixelariumJpg>(uri);
break; break;
case ImageFileType::CZI: case ImageFileType::kCzi:
return std::make_unique<PixelariumCzi>(uri, log); return std::make_unique<PixelariumCzi>(uri, log);
break; break;
} }
+4 -4
View File
@@ -13,18 +13,18 @@ constexpr pixelarium::imaging::ImageFileType ExtensionToType(const std::string&
if (lower_ext == ".jpg" || lower_ext == ".jpeg") if (lower_ext == ".jpg" || lower_ext == ".jpeg")
{ {
return pixelarium::imaging::ImageFileType::JPG; return pixelarium::imaging::ImageFileType::kJpg;
} }
if (lower_ext == ".png") if (lower_ext == ".png")
{ {
return pixelarium::imaging::ImageFileType::PNG; return pixelarium::imaging::ImageFileType::kPng;
} }
if (lower_ext == ".czi") if (lower_ext == ".czi")
{ {
return pixelarium::imaging::ImageFileType::CZI; return pixelarium::imaging::ImageFileType::kCzi;
} }
return pixelarium::imaging::ImageFileType::UNKNOWN; return pixelarium::imaging::ImageFileType::kUnknown;
} }
/// @brief Factory for instantiating implementations of IPixelariumImage based on the given file type. /// @brief Factory for instantiating implementations of IPixelariumImage based on the given file type.
+1 -1
View File
@@ -46,7 +46,7 @@ class PixelariumCzi : public IPixelariumImage
const libCZI::SubBlockStatistics& GetStatistics() const { return this->image_statistics_; } const libCZI::SubBlockStatistics& GetStatistics() const { return this->image_statistics_; }
public: public:
const static ImageFileType type_{ImageFileType::CZI}; const static ImageFileType type_{ImageFileType::kCzi};
private: private:
std::unique_ptr<cv::Mat> SubblockToCvMat(int index); std::unique_ptr<cv::Mat> SubblockToCvMat(int index);
+1 -1
View File
@@ -32,7 +32,7 @@ class PixelariumJpg : public IPixelariumImage
bool Empty() const noexcept override { return this->is_empty_; } bool Empty() const noexcept override { return this->is_empty_; }
public: public:
const static ImageFileType type_{ImageFileType::JPG}; const static ImageFileType type_{ImageFileType::kJpg};
private: private:
// this should be set by each image getter // this should be set by each image getter
+1 -1
View File
@@ -32,7 +32,7 @@ class PixelariumPng : public IPixelariumImage
bool Empty() const noexcept override { return this->is_empty_; } bool Empty() const noexcept override { return this->is_empty_; }
public: public:
const static ImageFileType type_{ImageFileType::PNG}; const static ImageFileType type_{ImageFileType::kPng};
private: private:
// this should be set by each image getter // this should be set by each image getter
+13 -9
View File
@@ -55,21 +55,25 @@ GLuint pixelarium::render::CvMatRender::uploadTexture()
const int width = img_.cols; const int width = img_.cols;
const int height = img_.rows; const int height = img_.rows;
// see
switch (img_.type()) { // https://stackoverflow.com/questions/10167534/how-to-find-out-what-type-of-a-mat-object-is-with-mattype-in-opencv
// for pixel a pixel type table
switch (img_.type())
{
case CV_8U:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_BYTE, img_.data);
break;
case CV_16U: case CV_16U:
case CV_16UC3: case CV_16UC3:
case 26: case CV_16UC4:
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_SHORT, img_.data); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_SHORT, img_.data);
break; break;
case 5: case CV_32F:
case 29: case CV_32FC4:
glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, width, height, 0, GL_DEPTH_COMPONENT, GL_FLOAT,
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_FLOAT, img_.data); img_.data);
break; break;
default: default:
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, img_.cols, img_.rows, 0, GL_RGBA, GL_UNSIGNED_BYTE, img_.data); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, img_.cols, img_.rows, 0, GL_RGBA, GL_UNSIGNED_BYTE, img_.data);
break; break;
} }
+5 -5
View File
@@ -33,15 +33,15 @@ std::unique_ptr<pixelarium::render::IPixelariumImageView> pixelarium::render::Im
switch (type) switch (type)
{ {
case imaging::ImageFileType::UNKNOWN: case imaging::ImageFileType::kUnknown:
case imaging::ImageFileType::ABSTRACT: case imaging::ImageFileType::kAbstract:
return {}; return {};
case imaging::ImageFileType::PNG: case imaging::ImageFileType::kPng:
case imaging::ImageFileType::JPG: case imaging::ImageFileType::kJpg:
log_.Info(std::format("{}: Creating a Default View", __PRETTY_FUNCTION__)); log_.Info(std::format("{}: Creating a Default View", __PRETTY_FUNCTION__));
// beware: here we copy the actual image resource over to the new image // beware: here we copy the actual image resource over to the new image
return std::make_unique<PixelariumImageViewDefault>(img); return std::make_unique<PixelariumImageViewDefault>(img);
case imaging::ImageFileType::CZI: case imaging::ImageFileType::kCzi:
log_.Info(std::format("{}: Creating a CZI View", __PRETTY_FUNCTION__)); log_.Info(std::format("{}: Creating a CZI View", __PRETTY_FUNCTION__));
// beware: here we copy the actual image resource over to the new image // beware: here we copy the actual image resource over to the new image
return std::make_unique<PixelariumImageViewCzi>(img, log_); return std::make_unique<PixelariumImageViewCzi>(img, log_);
+1 -1
View File
@@ -51,7 +51,7 @@ void pixelarium::render::PixelariumImageViewCzi::ShowImage()
this->is_dirty_ = false; this->is_dirty_ = false;
} }
if (czi_img->Empty() || this->img_->type_ == imaging::ImageFileType::UNKNOWN || !cached_image_ || if (czi_img->Empty() || this->img_->type_ == imaging::ImageFileType::kUnknown || !cached_image_ ||
czi_img->Name().empty()) czi_img->Name().empty())
{ {
// do nothing // do nothing
+1 -1
View File
@@ -18,7 +18,7 @@ void pixelarium::render::PixelariumImageViewDefault::ShowImage()
this->is_dirty_ = false; this->is_dirty_ = false;
} }
if (this->img_->Empty() || this->img_->type_ == imaging::ImageFileType::UNKNOWN || !cached_image_ || if (this->img_->Empty() || this->img_->type_ == imaging::ImageFileType::kUnknown || !cached_image_ ||
this->img_->Name().empty()) this->img_->Name().empty())
{ {
// do nothing // do nothing
+5 -5
View File
@@ -10,11 +10,11 @@ namespace pixelarium::utils::log
{ {
enum class LogLevel enum class LogLevel
{ {
Trace = 1 << 0, kTrace = 1 << 0,
Debug = 1 << 1, kDebug = 1 << 1,
Info = 1 << 2, kInfo = 1 << 2,
Warn = 1 << 3, kWarn = 1 << 3,
Error = 1 << 4, kError = 1 << 4,
}; };
/// @brief Interface for logging implementations. /// @brief Interface for logging implementations.
class ILog class ILog
+10 -10
View File
@@ -30,15 +30,15 @@ void SpdLogger::ChangeLevel(LogLevel lvl) const
{ {
switch (l) switch (l)
{ {
case LogLevel::Trace: case LogLevel::kTrace:
return "Trace"; return "Trace";
case LogLevel::Debug: case LogLevel::kDebug:
return "Debug"; return "Debug";
case LogLevel::Info: case LogLevel::kInfo:
return "Info"; return "Info";
case LogLevel::Warn: case LogLevel::kWarn:
return "Warn"; return "Warn";
case LogLevel::Error: case LogLevel::kError:
return "Error"; return "Error";
default: default:
return "Not Found"; return "Not Found";
@@ -47,23 +47,23 @@ void SpdLogger::ChangeLevel(LogLevel lvl) const
switch (lvl) switch (lvl)
{ {
case LogLevel::Trace: case LogLevel::kTrace:
this->logger_->set_level(spdlog::level::trace); this->logger_->set_level(spdlog::level::trace);
spdlog::flush_on(spdlog::level::trace); spdlog::flush_on(spdlog::level::trace);
break; break;
case LogLevel::Info: case LogLevel::kInfo:
this->logger_->set_level(spdlog::level::info); this->logger_->set_level(spdlog::level::info);
spdlog::flush_on(spdlog::level::info); spdlog::flush_on(spdlog::level::info);
break; break;
case LogLevel::Warn: case LogLevel::kWarn:
this->logger_->set_level(spdlog::level::warn); this->logger_->set_level(spdlog::level::warn);
spdlog::flush_on(spdlog::level::warn); spdlog::flush_on(spdlog::level::warn);
break; break;
case LogLevel::Error: case LogLevel::kError:
this->logger_->set_level(spdlog::level::err); this->logger_->set_level(spdlog::level::err);
spdlog::flush_on(spdlog::level::err); spdlog::flush_on(spdlog::level::err);
break; break;
case LogLevel::Debug: case LogLevel::kDebug:
default: default:
this->logger_->set_level(spdlog::level::debug); this->logger_->set_level(spdlog::level::debug);
spdlog::flush_on(spdlog::level::debug); spdlog::flush_on(spdlog::level::debug);
+1 -1
View File
@@ -17,7 +17,7 @@ int main(int argc, char** argv)
#endif #endif
logger->Info(std::format("{}: Starting Application {}", __FUNCTION__, "Pixelarium")); logger->Info(std::format("{}: Starting Application {}", __FUNCTION__, "Pixelarium"));
logger->ChangeLevel(utils::log::LogLevel::Debug); logger->ChangeLevel(utils::log::LogLevel::kDebug);
auto image_pool{std::make_unique<resources::ImageResourcePool>()}; auto image_pool{std::make_unique<resources::ImageResourcePool>()};
pixelarium::ui::DefaultApp app = pixelarium::ui::DefaultApp(*logger, *image_pool); pixelarium::ui::DefaultApp app = pixelarium::ui::DefaultApp(*logger, *image_pool);