diff --git a/src/image.cpp b/src/image.cpp index e8d3d34..a9c6358 100644 --- a/src/image.cpp +++ b/src/image.cpp @@ -71,7 +71,25 @@ void write(Magick::Image &img, const std::optional magick_force) { std::string magick{magick_force.value_or(img.magick())}; std::transform(magick.begin(), magick.end(), magick.begin(), ::tolower); + + const auto quality{[&img, &magick]() -> size_t { + if (img.quality() != 0) { + return img.quality(); // same as source + } + if (magick == "png") { + return 100; // highest compression + } + if (magick == "webp") { + if (img.magick() == "WEBP" || img.magick() == "PNG" + || img.magick() == "GIF" || img.magick() == "SVG") { + return 100; // lossless + } + } + return 0; // default + }()}; + img.magick(magick); + img.quality(quality); Magick::Blob buffer; img.write(&buffer); diff --git a/src/image.hpp b/src/image.hpp index 27bb54a..5015384 100644 --- a/src/image.hpp +++ b/src/image.hpp @@ -34,7 +34,7 @@ namespace libravatarserv::image { // write image with headers to stdout void write(Magick::Image &img, - std::optional magick_force = nullptr); + std::optional magick_force = {}); } // namespace libravatarserv::image diff --git a/src/request.cpp b/src/request.cpp index 862b6e2..e6b01d6 100644 --- a/src/request.cpp +++ b/src/request.cpp @@ -20,6 +20,7 @@ #include "types.hpp" #include +#include #include #include #include @@ -47,6 +48,25 @@ request_t parse(const std::string_view uri) { std::transform(uri.begin() + offset, uri.begin() + pos, req.hash.begin(), ::tolower); + if (const auto pos_dot{req.hash.find('.')}; pos_dot != std::string::npos) { + std::string magick{req.hash.substr(pos_dot + 1)}; + req.hash = req.hash.substr(0, pos_dot); + + if (magick == "jpg") { + magick = "jpeg"; + } + constexpr std::array allowed{ + {"jpeg", "png", "gif", "webp"} + }; + if (std::any_of(allowed.begin(), allowed.end(), + [magick](const std::string_view supplied) { + return magick == supplied; + })) { + req.magick = magick; + } + } + std::cout << req.hash << " - " << req.magick << '\n'; + if (req.hash.size() == 64 && hash::is_valid(req.hash)) { req.algo = algorithm_t::SHA256; } else if (req.hash.size() == 32 && hash::is_valid(req.hash)) { diff --git a/src/types.hpp b/src/types.hpp index 1347c4f..a121343 100644 --- a/src/types.hpp +++ b/src/types.hpp @@ -31,6 +31,7 @@ struct request_t { algorithm_t algo; std::int16_t size; std::string fallback; + std::string magick; }; } // namespace libravatarserv