From eaffd0b00551c7eb286d7d3dd12ada73bcbe095f Mon Sep 17 00:00:00 2001 From: tastytea Date: Wed, 26 Dec 2018 22:16:11 +0100 Subject: [PATCH] libravatar/sigil algorithm, first try --- example.cpp | 28 ++++++++++++++-------------- src/identiconpp.cpp | 8 ++++---- src/identiconpp.hpp | 6 ++++++ src/libravatar.cpp | 21 ++++++++++++++++++++- src/simple.cpp | 2 -- 5 files changed, 44 insertions(+), 21 deletions(-) diff --git a/example.cpp b/example.cpp index ad4ca50..3ca8e3f 100644 --- a/example.cpp +++ b/example.cpp @@ -34,20 +34,20 @@ int main(int argc, char *argv[]) img.write("identicon_example_simple.png"); } - // { - // Identiconpp identicon(10, 10, Identiconpp::identicon_type::libravatar, - // "ffffffff", - // { - // "000000ff", - // "ff0000ff", - // "ffff00ff", - // "00ff00ff", - // "00ffffff", - // "0000ffff" - // }); - // img = identicon.generate(digest, 500); - // img.write("identicon_example_libravatar.png"); - // } + { + Identiconpp identicon(5, 5, Identiconpp::identicon_type::libravatar, + "ffffffff", + { + "000000ff", + "ff0000ff", + "ffff00ff", + "00ff00ff", + "00ffffff", + "0000ffff" + }); + img = identicon.generate("5a105e8b9d40e1329780d62ea2265d8a", 500); + img.write("identicon_example_libravatar.png"); + } return 0; } diff --git a/src/identiconpp.cpp b/src/identiconpp.cpp index 5920546..dcf8219 100644 --- a/src/identiconpp.cpp +++ b/src/identiconpp.cpp @@ -101,12 +101,12 @@ Magick::Color Identiconpp::get_color(const uint16_t firstbit, // Get rid of excess bits bits = bits & (1 << colorbits) - 1; - if (bits > _foreground.size()) + if (bits > (_foreground.size() - 1)) { - bits -= _foreground.size(); + bits -= (_foreground.size() - 1); } // Lookup und set color - ttdebug << "Color: #" << _foreground[bits - 1] << '\n'; - return Magick::Color("#" + _foreground[bits - 1]); + ttdebug << "Color: #" << _foreground[bits] << '\n'; + return Magick::Color("#" + _foreground[bits]); } diff --git a/src/identiconpp.hpp b/src/identiconpp.hpp index c972cba..b349e4c 100644 --- a/src/identiconpp.hpp +++ b/src/identiconpp.hpp @@ -83,6 +83,9 @@ private: /*! * @brief Generate simple identicon. * + * Use bits 0 to (columns / 2 + columns % 2) * _rows, use the + * following bits to determine foreground color. + * * @param digest The pre-computed digest * @param width The width of the image * @param height The height of the image @@ -96,6 +99,9 @@ private: /*! * @brief Generate libravatar-style / sigil identicon. * + * Use bits 9 to (columns / 2 + columns % 2) * _rows, use the first + * 8 bits to determine foreground color. + * * @param digest The pre-computed digest * @param width The width of the image * @param height The height of the image diff --git a/src/libravatar.cpp b/src/libravatar.cpp index 1e07911..95fbfec 100644 --- a/src/libravatar.cpp +++ b/src/libravatar.cpp @@ -21,8 +21,27 @@ Magick::Image Identiconpp::generate_libravatar(const string &digest, const uint16_t width, const uint16_t height) { - throw "Not implemented."; + // throw "Not implemented."; Magick::Image img(Magick::Geometry(_columns, _rows), Magick::Color("#" + _background)); + Magick::Color dotcolor = get_color(0, digest); + + uint8_t used_columns = _columns / 2 + _columns % 2; + uint8_t cells = _rows * used_columns; + for (uint8_t cur_cell = 0; cur_cell < cells; ++cur_cell) + { + if (get_bit(8 + cur_cell, digest)) + { + const uint8_t column = cur_cell / _columns; + const uint8_t row = cur_cell % _rows; + ttdebug << "col=" << std::to_string(column) + << ", row=" << std::to_string(row) << '\n'; + img.pixelColor(column, row, dotcolor); + img.pixelColor(_columns - column - 1, row, dotcolor); + } + } + + img.scale(Magick::Geometry(width, height)); + img.magick("png"); return img; } diff --git a/src/simple.cpp b/src/simple.cpp index 98bcf26..5b7367a 100644 --- a/src/simple.cpp +++ b/src/simple.cpp @@ -34,8 +34,6 @@ Magick::Image Identiconpp::generate_simple(const string &digest, { ttdebug << "col=" << std::to_string(column) << ", row=" << std::to_string(row) << '\n'; - ttdebug << "col=" << std::to_string(used_columns - 1 + column) - << ", row=" << std::to_string(_rows - 1 - row) << '\n'; img.pixelColor(column, row, dotcolor); img.pixelColor(_columns - 1 - column, row, dotcolor); }