Compare commits
No commits in common. "master" and "0.7.1" have entirely different histories.
77
.drone.yml
77
.drone.yml
|
@ -99,7 +99,7 @@ trigger:
|
||||||
- tag
|
- tag
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Debian stretch
|
- name: deb
|
||||||
image: debian:stretch-slim
|
image: debian:stretch-slim
|
||||||
pull: always
|
pull: always
|
||||||
environment:
|
environment:
|
||||||
|
@ -110,74 +110,49 @@ steps:
|
||||||
- rm /etc/apt/apt.conf.d/docker-clean
|
- rm /etc/apt/apt.conf.d/docker-clean
|
||||||
- alias apt-get='rm -f /var/cache/apt/archives/lock && apt-get'
|
- alias apt-get='rm -f /var/cache/apt/archives/lock && apt-get'
|
||||||
- apt-get update -q
|
- apt-get update -q
|
||||||
- apt-get install -qy g++-6 cmake pkg-config libmagick++-dev gnupg dpkg-dev d-shlibs lsb-release
|
- apt-get install -qy g++-6 cmake pkg-config libmagick++-dev gnupg
|
||||||
- rm -rf build && mkdir -p build && cd build
|
- rm -rf build && mkdir -p build && cd build
|
||||||
- cmake -DWITH_DEB=YES ..
|
- cmake -DWITH_DEB=YES ..
|
||||||
- make package
|
- make package
|
||||||
- gpg --import /var/autosign_gpg.key
|
- gpg --import /var/autosign_gpg.key
|
||||||
- gpg --verbose --detach-sign *.deb
|
- gpg --verbose --detach-sign *.deb
|
||||||
- cp -v identiconpp_${DRONE_TAG}-0_amd64_stretch.deb ..
|
- cp -v identiconpp_${DRONE_TAG}-0_amd64.deb ..
|
||||||
- cp -v identiconpp_${DRONE_TAG}-0_amd64_stretch.deb.sig ..
|
- cp -v identiconpp_${DRONE_TAG}-0_amd64.deb.sig ..
|
||||||
volumes:
|
volumes:
|
||||||
- name: debian-package-cache
|
- name: debian-package-cache
|
||||||
path: /var/cache/apt/archives
|
path: /var/cache/apt/archives
|
||||||
- name: gpg-key
|
- name: gpg-key
|
||||||
path: /var/autosign_gpg.key
|
path: /var/autosign_gpg.key
|
||||||
|
|
||||||
- name: Debian buster
|
- name: rpm
|
||||||
image: debian:buster-slim
|
image: centos:7
|
||||||
pull: always
|
pull: always
|
||||||
environment:
|
environment:
|
||||||
CXX: g++-8
|
CXX: /opt/rh/devtoolset-6/root/usr/bin/g++
|
||||||
CXXFLAGS: -pipe -O2
|
CXXFLAGS: -pipe -O2
|
||||||
LANG: en_US.utf-8
|
LANG: en_US.utf-8
|
||||||
commands:
|
commands:
|
||||||
- rm /etc/apt/apt.conf.d/docker-clean
|
- sed -i 's/keepcache=0/keepcache=1/' /etc/yum.conf
|
||||||
- alias apt-get='rm -f /var/cache/apt/archives/lock && apt-get'
|
- curl -s -o /var/cache/yum/epel-release-latest-7.noarch.rpm http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
|
||||||
- apt-get update -q
|
- rpm -i /var/cache/yum/epel-release-latest-7.noarch.rpm
|
||||||
- apt-get install -qy build-essential cmake pkg-config libmagick++-dev gnupg dpkg-dev d-shlibs lsb-release
|
- yum install -qy centos-release-scl
|
||||||
|
- yum install -qy devtoolset-6
|
||||||
|
- scl enable devtoolset-6 bash
|
||||||
|
- yum install -qy rpm-build ImageMagick-c++-devel gnupg
|
||||||
|
- yum --enablerepo=epel install -qy cmake3
|
||||||
- rm -rf build && mkdir -p build && cd build
|
- rm -rf build && mkdir -p build && cd build
|
||||||
- cmake -DWITH_DEB=YES ..
|
- cmake3 -DWITH_RPM=YES ..
|
||||||
- make package
|
- make package
|
||||||
- gpg --import /var/autosign_gpg.key
|
- gpg --import /var/autosign_gpg.key
|
||||||
- gpg --verbose --detach-sign *.deb
|
- gpg --verbose --detach-sign *.rpm
|
||||||
- cp -v identiconpp_${DRONE_TAG}-0_amd64_buster.deb ..
|
- cp -v identiconpp-${DRONE_TAG}-0.x86_64.rpm ..
|
||||||
- cp -v identiconpp_${DRONE_TAG}-0_amd64_buster.deb.sig ..
|
- cp -v identiconpp-${DRONE_TAG}-0.x86_64.rpm.sig ..
|
||||||
volumes:
|
volumes:
|
||||||
- name: debian-package-cache
|
- name: centos-package-cache
|
||||||
path: /var/cache/apt/archives
|
path: /var/cache/yum
|
||||||
- name: gpg-key
|
- name: gpg-key
|
||||||
path: /var/autosign_gpg.key
|
path: /var/autosign_gpg.key
|
||||||
|
|
||||||
# - name: CentOS 7
|
|
||||||
# image: centos:7
|
|
||||||
# pull: always
|
|
||||||
# environment:
|
|
||||||
# CXX: /opt/rh/devtoolset-6/root/usr/bin/g++
|
|
||||||
# CXXFLAGS: -pipe -O2
|
|
||||||
# LANG: en_US.utf-8
|
|
||||||
# commands:
|
|
||||||
# - sed -i 's/keepcache=0/keepcache=1/' /etc/yum.conf
|
|
||||||
# - curl -s -o /var/cache/yum/epel-release-latest-7.noarch.rpm http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
|
|
||||||
# - rpm -i /var/cache/yum/epel-release-latest-7.noarch.rpm
|
|
||||||
# - yum install -qy centos-release-scl
|
|
||||||
# - yum install -qy devtoolset-6
|
|
||||||
# - scl enable devtoolset-6 bash
|
|
||||||
# - yum install -qy rpm-build ImageMagick-c++-devel gnupg redhat-lsb-core
|
|
||||||
# - yum --enablerepo=epel install -qy cmake3
|
|
||||||
# - rm -rf build && mkdir -p build && cd build
|
|
||||||
# - cmake3 -DWITH_RPM=YES ..
|
|
||||||
# - make package
|
|
||||||
# - gpg --import /var/autosign_gpg.key
|
|
||||||
# - gpg --verbose --detach-sign *.rpm
|
|
||||||
# - cp -v identiconpp-${DRONE_TAG}-0.x86_64.centos7.rpm ..
|
|
||||||
# - cp -v identiconpp-${DRONE_TAG}-0.x86_64.centos7.rpm.sig ..
|
|
||||||
# volumes:
|
|
||||||
# - name: centos-package-cache
|
|
||||||
# path: /var/cache/yum
|
|
||||||
# - name: gpg-key
|
|
||||||
# path: /var/autosign_gpg.key
|
|
||||||
|
|
||||||
- name: release
|
- name: release
|
||||||
image: plugins/gitea-release
|
image: plugins/gitea-release
|
||||||
pull: always
|
pull: always
|
||||||
|
@ -188,12 +163,10 @@ steps:
|
||||||
title: ${DRONE_TAG}
|
title: ${DRONE_TAG}
|
||||||
prerelease: true
|
prerelease: true
|
||||||
files:
|
files:
|
||||||
- identiconpp_${DRONE_TAG}-0_amd64_stretch.deb
|
- identiconpp_${DRONE_TAG}-0_amd64.deb
|
||||||
- identiconpp_${DRONE_TAG}-0_amd64_stretch.deb.sig
|
- identiconpp_${DRONE_TAG}-0_amd64.deb.sig
|
||||||
- identiconpp_${DRONE_TAG}-0_amd64_buster.deb
|
- identiconpp-${DRONE_TAG}-0.x86_64.rpm
|
||||||
- identiconpp_${DRONE_TAG}-0_amd64_buster.deb.sig
|
- identiconpp-${DRONE_TAG}-0.x86_64.rpm.sig
|
||||||
# - identiconpp-${DRONE_TAG}-0.x86_64.centos7.rpm
|
|
||||||
# - identiconpp-${DRONE_TAG}-0.x86_64.centos7.rpm.sig
|
|
||||||
checksum:
|
checksum:
|
||||||
- sha512
|
- sha512
|
||||||
|
|
||||||
|
|
|
@ -1,20 +0,0 @@
|
||||||
# Configuration file for EditorConfig.
|
|
||||||
# More information is available under <https://editorconfig.org/>.
|
|
||||||
|
|
||||||
root = true
|
|
||||||
|
|
||||||
[*]
|
|
||||||
indent_style = space
|
|
||||||
end_of_line = lf
|
|
||||||
charset = utf-8
|
|
||||||
trim_trailing_whitespace = true
|
|
||||||
insert_final_newline = true
|
|
||||||
max_line_length = 80
|
|
||||||
|
|
||||||
[*.?pp]
|
|
||||||
indent_size = 4
|
|
||||||
tab_width = 4
|
|
||||||
|
|
||||||
[{CMakeLists.txt,*.cmake}]
|
|
||||||
indent_size = 2
|
|
||||||
tab_width = 2
|
|
|
@ -7,7 +7,7 @@ if(${CMAKE_VERSION} VERSION_LESS 3.12)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
project(identiconpp
|
project(identiconpp
|
||||||
VERSION 0.7.3
|
VERSION 0.7.1
|
||||||
LANGUAGES CXX)
|
LANGUAGES CXX)
|
||||||
# DESCRIPTION was introduced in version 3.9.
|
# DESCRIPTION was introduced in version 3.9.
|
||||||
if(NOT (${CMAKE_VERSION} VERSION_LESS 3.9))
|
if(NOT (${CMAKE_VERSION} VERSION_LESS 3.9))
|
||||||
|
|
|
@ -1,49 +0,0 @@
|
||||||
:contact-coc: tastytea@tastytea.de
|
|
||||||
|
|
||||||
== Code of Conduct
|
|
||||||
|
|
||||||
In the interest of fostering an open and welcoming environment, we as
|
|
||||||
contributors and maintainers pledge to making participation in our project and
|
|
||||||
our community a harassment-free experience for everyone, regardless of age, body
|
|
||||||
size, disability, education, ethnicity, gender identity and expression, level of
|
|
||||||
experience, nationality, personal appearance, race, religion, sex
|
|
||||||
characteristics, sexual identity and orientation or socio-economic status.
|
|
||||||
|
|
||||||
=== Examples
|
|
||||||
|
|
||||||
Examples of behavior that contributes to creating a positive environment
|
|
||||||
include:
|
|
||||||
|
|
||||||
* Using welcoming and inclusive language.
|
|
||||||
* Being respectful of differing viewpoints and experiences.
|
|
||||||
* Gracefully accepting constructive criticism.
|
|
||||||
* Focusing on what is best for the community.
|
|
||||||
* Showing empathy towards other community members.
|
|
||||||
|
|
||||||
Examples of unacceptable behavior by participants include:
|
|
||||||
|
|
||||||
* The use of sexualized language or imagery and unwelcome sexual attention or
|
|
||||||
advances.
|
|
||||||
* Trolling, insulting/derogatory comments, and personal attacks.
|
|
||||||
* Public or private harassment.
|
|
||||||
* Publishing others’ private information, such as a physical or electronic
|
|
||||||
address, without explicit permission.
|
|
||||||
|
|
||||||
=== Enforcement
|
|
||||||
|
|
||||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
|
||||||
reported by contacting the project team at {contact-coc}.
|
|
||||||
|
|
||||||
All complaints will be reviewed and investigated and will result in a response
|
|
||||||
that is deemed necessary and appropriate to the circumstances. The project team
|
|
||||||
is obligated to maintain confidentiality with regard to the reporter of an
|
|
||||||
incident.
|
|
||||||
|
|
||||||
=== Attribution
|
|
||||||
|
|
||||||
This Code of Conduct is adapted from the Contributor Covenant, version 1.4,
|
|
||||||
available at
|
|
||||||
https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
|
|
||||||
|
|
||||||
For answers to common questions about this code of conduct, see
|
|
||||||
https://www.contributor-covenant.org/faq
|
|
|
@ -1,29 +0,0 @@
|
||||||
:project: identiconpp
|
|
||||||
:uri-base: https://schlomp.space/tastytea/{project}
|
|
||||||
:uri-coc: {uri-base}/src/branch/master/CODE_OF_CONDUCT.adoc
|
|
||||||
:contact-email: tastytea@tastytea.de
|
|
||||||
:contact-xmpp: {contact-email}
|
|
||||||
:contact-fediverse: https://likeable.space/users/tastytea
|
|
||||||
|
|
||||||
== How to contribute
|
|
||||||
|
|
||||||
Read the link:{uri-coc}[Code of Conduct].
|
|
||||||
|
|
||||||
=== Reporting bugs or suggesting enhancements
|
|
||||||
|
|
||||||
Before reporting a bug, please
|
|
||||||
https://schlomp.space/tastytea/{project}/issues[perform a search] to see if the
|
|
||||||
problem has already been reported. If it has, add a comment to the existing
|
|
||||||
issue instead of opening a new one. Same for enhancements.
|
|
||||||
|
|
||||||
You can also contact me via mailto:{contact-email}[E-Mail],
|
|
||||||
link:xmpp:{contact-xmpp}[XMPP] or the {contact-fediverse}[Fediverse] if you
|
|
||||||
don't want to open an account.
|
|
||||||
|
|
||||||
=== Pull requests
|
|
||||||
|
|
||||||
Please use similar coding conventions as the rest of the project. The basic rule
|
|
||||||
to remember is to write code in the same style as the existing/surrounding code.
|
|
||||||
|
|
||||||
You can also send me your patches via mailto:{contact-email}[E-Mail], ideally
|
|
||||||
using `git format-patch` or `git send-email`.
|
|
194
README.adoc
194
README.adoc
|
@ -1,194 +0,0 @@
|
||||||
= identiconpp
|
|
||||||
:toc: preamble
|
|
||||||
|
|
||||||
:project: identiconpp
|
|
||||||
:uri-base: https://schlomp.space/tastytea/{project}
|
|
||||||
:uri-branch-master: {uri-base}/src/branch/master
|
|
||||||
:uri-reference-base: https://doc.schlomp.space/{project}
|
|
||||||
:uri-images-base: {uri-reference-base}
|
|
||||||
:uri-sigil: https://github.com/cupcake/sigil/
|
|
||||||
:uri-pydenticon: https://github.com/azaghal/pydenticon/
|
|
||||||
:uri-overlay: https://schlomp.space/tastytea/overlay
|
|
||||||
:uri-pgpkey: https://tastytea.de/tastytea_autosign.asc
|
|
||||||
:uri-gcc: https://gcc.gnu.org/
|
|
||||||
:uri-clang: https://clang.llvm.org/
|
|
||||||
:uri-cmake: https://cmake.org/
|
|
||||||
:uri-imagemagick: https://www.imagemagick.org/
|
|
||||||
:uri-asciidoc: http://asciidoc.org/
|
|
||||||
:uri-catch: https://github.com/catchorg/Catch2
|
|
||||||
|
|
||||||
*identiconpp* is a library to generate identicons for C++.
|
|
||||||
|
|
||||||
You get the images as `Magick::Image`. This allows you to make all kinds of
|
|
||||||
modifications.
|
|
||||||
|
|
||||||
.Used algorithms, left to right: 4x4 ltr_symmetric, 20px padding; 5x5 sigil; 5x5 ltr_asymmetric; 6x4 ltr_symmetric, 10px padding
|
|
||||||
====
|
|
||||||
image:{uri-images-base}/identicon1.png[]
|
|
||||||
image:{uri-images-base}/identicon2.png[]
|
|
||||||
image:{uri-images-base}/identicon3.png[]
|
|
||||||
image:{uri-images-base}/identicon4.png[]
|
|
||||||
|
|
||||||
The example images above are generated using
|
|
||||||
link:{uri-branch-master}/examples/example.cpp[example.cpp].
|
|
||||||
====
|
|
||||||
|
|
||||||
== Features
|
|
||||||
|
|
||||||
* [x] Symmetric identicons
|
|
||||||
* [x] sigil identicons
|
|
||||||
* [x] Asymmetric identicons
|
|
||||||
* [x] Padding
|
|
||||||
|
|
||||||
== Usage
|
|
||||||
|
|
||||||
The HTML reference can be generated with `build_doc.sh`, if doxygen is
|
|
||||||
installed. It is also available at
|
|
||||||
link:{uri-reference-base}/classIdenticonpp.html[doc.schlomp.space/identiconpp/].
|
|
||||||
|
|
||||||
You need to generate hashes yourself, any hexadecimal string will do. Make sure
|
|
||||||
to use a safe hashing algorithm for sensitive data (*not MD5*). You can select
|
|
||||||
as many columns and rows as you like, but make sure you have enough entropy.
|
|
||||||
If something seems to be wrong, exceptions will be thrown.
|
|
||||||
|
|
||||||
The "sigil" algorithm generates the same results as link:{uri-sigil}[sigil] and
|
|
||||||
link:{uri-pydenticon}[pydenticon].
|
|
||||||
|
|
||||||
=== Example
|
|
||||||
|
|
||||||
[source,c++]
|
|
||||||
----
|
|
||||||
// Compile with g++ $(pkg-config --libs --cflags identiconpp)
|
|
||||||
#include <iostream>
|
|
||||||
#include <identiconpp.hpp>
|
|
||||||
#include <Magick++/Image.h>
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
Identiconpp identicon(5, 5, Identiconpp::algorithm::ltr_symmetric,
|
|
||||||
"ffffff80", { "800000ff" }, { 10, 10 });
|
|
||||||
Magick::Image img;
|
|
||||||
img = identicon.generate("55502f40dc8b7c769880b10874abc9d0", 200);
|
|
||||||
img.write("identicon.png");
|
|
||||||
|
|
||||||
std::cout << identicon.generate_base64("png", "5550", 200) << std::endl;
|
|
||||||
}
|
|
||||||
----
|
|
||||||
|
|
||||||
== Install
|
|
||||||
|
|
||||||
=== Gentoo
|
|
||||||
|
|
||||||
Gentoo ebuilds are available via my link:{uri-overlay}[repository].
|
|
||||||
|
|
||||||
=== Automatically generated packages
|
|
||||||
|
|
||||||
Binary packages are generated automatically for each
|
|
||||||
link:{uri-base}/releases[release]. They are signed with my
|
|
||||||
link:{uri-pgpkey}[automatic signing key].
|
|
||||||
|
|
||||||
=== From source
|
|
||||||
|
|
||||||
==== Dependencies
|
|
||||||
|
|
||||||
* C++ compiler (tested: link:{uri-gcc}[gcc] 6/8/9, link:{uri-clang}[clang] 7)
|
|
||||||
* {uri-cmake}[cmake] (at least 3.6)
|
|
||||||
* link:{uri-imagemagick}[imagemagick] (tested: 7.0 / 6.7)
|
|
||||||
* Optional:
|
|
||||||
** Manpage: {uri-asciidoc}[asciidoc] (tested: 8.6)
|
|
||||||
** Tests: {uri-catch}[catch] (tested: 2.5 / 1.2)
|
|
||||||
|
|
||||||
On a Debian system, install the packages:
|
|
||||||
`build-essential cmake libmagick++-dev`.
|
|
||||||
|
|
||||||
==== Compile
|
|
||||||
|
|
||||||
[source,shell]
|
|
||||||
----
|
|
||||||
mkdir build
|
|
||||||
cd build
|
|
||||||
cmake ..
|
|
||||||
cmake --build .
|
|
||||||
make install
|
|
||||||
----
|
|
||||||
|
|
||||||
.cmake options:
|
|
||||||
* `-DCMAKE_BUILD_TYPE=Debug` for a debug build
|
|
||||||
* `-DWITH_TESTS=YES` to build tests
|
|
||||||
* One of:
|
|
||||||
** `-DWITH_DEB=YES` to generate a deb-package
|
|
||||||
** `-DWITH_RPM=YES` to generate an rpm-package
|
|
||||||
|
|
||||||
To generate a binary package, run `make package`.
|
|
||||||
|
|
||||||
include::{uri-base}/raw/branch/master/CONTRIBUTING.adoc[]
|
|
||||||
|
|
||||||
== Algorithms
|
|
||||||
|
|
||||||
=== ltr_symmetric
|
|
||||||
|
|
||||||
* Create image with width=columns, height=rows.
|
|
||||||
* Set background color.
|
|
||||||
* Select half of the columns, or half of the columns + 1 if uneven.
|
|
||||||
** `columns / 2 + columns % 2`
|
|
||||||
* Pixels are drawn from left to right, top to bottom.
|
|
||||||
* Use bits from digest to determine if a pixel is painted(1) or not(0).
|
|
||||||
* Mirror the pixels vertically.
|
|
||||||
* Use the following bits to pick the foreground color.
|
|
||||||
** You need `floor(log2(n_colors)) + 1` bits.
|
|
||||||
* Scale image proportionally to requested width.
|
|
||||||
|
|
||||||
----
|
|
||||||
0111 0011 1101 1100 […] 1111 0111 0101 0111
|
|
||||||
^ ^
|
|
||||||
+----------------------------+-------------->
|
|
||||||
| |
|
|
||||||
pixel matrix foreground color
|
|
||||||
----
|
|
||||||
|
|
||||||
Implemented in
|
|
||||||
link:{uri-branch-master}/src/ltr_symmetric.cpp[ltr_symmetric.cpp].
|
|
||||||
|
|
||||||
=== ltr_asymmetric
|
|
||||||
|
|
||||||
* Create image with width=columns, height=rows.
|
|
||||||
* Set background color.
|
|
||||||
* Pixels are drawn from left to right, top to bottom.
|
|
||||||
* Use bits from digest to determine if a pixel is painted(1) or not(0).
|
|
||||||
* Use the following bits to pick the foreground color.
|
|
||||||
** You need `floor(log2(n_colors)) + 1` bits.
|
|
||||||
* Scale image proportionally to requested width.
|
|
||||||
|
|
||||||
----
|
|
||||||
0111 0011 1101 1100 […] 1111 0111 0101 0111
|
|
||||||
^ ^
|
|
||||||
+----------------------------+-------------->
|
|
||||||
| |
|
|
||||||
pixel matrix foreground color
|
|
||||||
----
|
|
||||||
|
|
||||||
Implemented in
|
|
||||||
link:{uri-branch-master}/src/ltr_asymmetric.cpp[ltr_asymmetric.cpp].
|
|
||||||
|
|
||||||
=== sigil
|
|
||||||
|
|
||||||
* Create image with width=columns, height=rows.
|
|
||||||
* Set background color.
|
|
||||||
* Select half of the columns, or half of the columns + 1 if uneven.
|
|
||||||
** `columns / 2 + columns % 2`
|
|
||||||
* Pixels are drawn from top to bottom, left to right.
|
|
||||||
* Use the first 8 bits to pick the foreground color.
|
|
||||||
* Use the following bits to determine if a pixel is painted(1) or not(0).
|
|
||||||
* Mirror the pixels vertically.
|
|
||||||
* Scale image proportionally to requested width.
|
|
||||||
|
|
||||||
----
|
|
||||||
0111 0011 1101 1100
|
|
||||||
^ ^
|
|
||||||
+---------+--------->
|
|
||||||
| |
|
|
||||||
foreground color |
|
|
||||||
pixel matrix
|
|
||||||
----
|
|
||||||
|
|
||||||
Implemented in link:{uri-branch-master}/src/sigil.cpp[sigil.cpp].
|
|
197
README.md
Normal file
197
README.md
Normal file
|
@ -0,0 +1,197 @@
|
||||||
|
**identiconpp** is a library to generate identicons for C++.
|
||||||
|
|
||||||
|
You get the images as `Magick::Image`. This allows you to make all kinds of
|
||||||
|
modifications.
|
||||||
|
|
||||||
|
![](https://doc.schlomp.space/identiconpp/identicon1.png
|
||||||
|
"4x4 identicon, ltr_symmetric, 20px padding")
|
||||||
|
![](https://doc.schlomp.space/identiconpp/identicon2.png
|
||||||
|
"5x5 identicon, sigil")
|
||||||
|
![](https://doc.schlomp.space/identiconpp/identicon3.png
|
||||||
|
"5x5 identicon, ltr_asymmetric")
|
||||||
|
![](https://doc.schlomp.space/identiconpp/identicon4.png
|
||||||
|
"6x4 identicon, ltr_symmetric, 10px padding")
|
||||||
|
|
||||||
|
The example images above are generated using [example.cpp]
|
||||||
|
(https://schlomp.space/tastytea/identiconpp/src/branch/master/examples/example.cpp).
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
* [x] Symmetric identicons
|
||||||
|
* [x] sigil identicons
|
||||||
|
* [x] Asymmetric identicons
|
||||||
|
* [x] Padding
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
The HTML reference can be generated with `build_doc.sh`, if doxygen is
|
||||||
|
installed. It is also available at [doc.schlomp.space/identiconpp/]
|
||||||
|
(https://doc.schlomp.space/identiconpp/classIdenticonpp.html).
|
||||||
|
|
||||||
|
You need to generate hashes yourself, any hexadecimal string will do. Make sure
|
||||||
|
to use a safe hashing algorithm for sensitive data (**not MD5**). You can select
|
||||||
|
as many columns and rows as you like, but make sure you have enough entropy.
|
||||||
|
If something seems to be wrong, exceptions will be thrown.
|
||||||
|
|
||||||
|
The "sigil" algorithm generates the same results as
|
||||||
|
[sigil](https://github.com/cupcake/sigil/) and
|
||||||
|
[pydenticon](https://github.com/azaghal/pydenticon/).
|
||||||
|
|
||||||
|
### Example
|
||||||
|
|
||||||
|
``` c++
|
||||||
|
// Compile with g++ $(pkg-config --libs --cflags identiconpp)
|
||||||
|
#include <iostream>
|
||||||
|
#include <identiconpp.hpp>
|
||||||
|
#include <Magick++/Image.h>
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
Identiconpp identicon(5, 5, Identiconpp::algorithm::ltr_symmetric,
|
||||||
|
"ffffff80", { "800000ff" }, { 10, 10 });
|
||||||
|
Magick::Image img;
|
||||||
|
img = identicon.generate("55502f40dc8b7c769880b10874abc9d0", 200);
|
||||||
|
img.write("identicon.png");
|
||||||
|
|
||||||
|
std::cout << identicon.generate_base64("png", "5550", 200) << std::endl;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Install
|
||||||
|
|
||||||
|
### Gentoo
|
||||||
|
|
||||||
|
Gentoo ebuilds are available via my
|
||||||
|
[repository](https://schlomp.space/tastytea/overlay).
|
||||||
|
|
||||||
|
### Automatically generated packages
|
||||||
|
|
||||||
|
Binary packages are generated automatically for each
|
||||||
|
[release](https://schlomp.space/tastytea/identiconpp/releases) in the formats
|
||||||
|
`deb` and `rpm`. They are signed with my [automatic signing
|
||||||
|
key](https://tastytea.de/tastytea_autosign.asc).
|
||||||
|
|
||||||
|
### From source
|
||||||
|
|
||||||
|
#### Dependencies
|
||||||
|
|
||||||
|
* C++ compiler (tested: [gcc](https://gcc.gnu.org/) 6/8/9,
|
||||||
|
[clang](https://llvm.org/) 7)
|
||||||
|
* [cmake](https://cmake.org/) (at least 3.6)
|
||||||
|
* [imagemagick](https://www.imagemagick.org/) (tested: 7.0 / 6.7)
|
||||||
|
* Optional:
|
||||||
|
* Tests: [Catch](https://github.com/catchorg/Catch2) (tested: 2.3 / 1.2)
|
||||||
|
|
||||||
|
On a Debian system, install the packages:
|
||||||
|
`build-essential cmake libmagick++-dev`.
|
||||||
|
|
||||||
|
#### Compile
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
mkdir build
|
||||||
|
cd build
|
||||||
|
cmake ..
|
||||||
|
make
|
||||||
|
make install
|
||||||
|
```
|
||||||
|
|
||||||
|
##### cmake options
|
||||||
|
|
||||||
|
* `-DCMAKE_BUILD_TYPE=Debug` for a debug build
|
||||||
|
* `-DWITH_TESTS=YES` to build tests
|
||||||
|
* One of:
|
||||||
|
* `-DWITH_DEB=YES` to generate a deb-package
|
||||||
|
* `-DWITH_RPM=YES` to generate an rpm-package
|
||||||
|
|
||||||
|
To generate a binary package, execute `make package`
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
Contributions are always welcome. You can submit them as pull requests on
|
||||||
|
schlomp.space or via email to `tastytea`@`tastytea.de` (ideally using
|
||||||
|
`git format-patch` or `git send-email`). Please do not submit them via GitHub,
|
||||||
|
it is just a mirror.
|
||||||
|
|
||||||
|
## Contact
|
||||||
|
|
||||||
|
See https://tastytea.de/
|
||||||
|
|
||||||
|
## License & Copyright
|
||||||
|
|
||||||
|
``` text
|
||||||
|
Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>.
|
||||||
|
License GPLv3: GNU GPL version 3 <https://www.gnu.org/licenses/gpl-3.0.html>.
|
||||||
|
This program comes with ABSOLUTELY NO WARRANTY. This is free software,
|
||||||
|
and you are welcome to redistribute it under certain conditions.
|
||||||
|
```
|
||||||
|
|
||||||
|
## Algorithms
|
||||||
|
|
||||||
|
### ltr_symmetric
|
||||||
|
|
||||||
|
* Create image with width=columns, height=rows.
|
||||||
|
* Set background color.
|
||||||
|
* Select half of the columns, or half of the columns + 1 if uneven.
|
||||||
|
* `columns / 2 + columns % 2`
|
||||||
|
* Pixels are drawn from left to right, top to bottom.
|
||||||
|
* Use bits from digest to determine if a pixel is painted(1) or not(0).
|
||||||
|
* Mirror the pixels vertically.
|
||||||
|
* Use the following bits to pick the foreground color.
|
||||||
|
* You need `floor(log2(n_colors)) + 1` bits.
|
||||||
|
* Scale image proportionally to requested width.
|
||||||
|
|
||||||
|
```PLAIN
|
||||||
|
0111 0011 1101 1100 […] 1111 0111 0101 0111
|
||||||
|
^ ^
|
||||||
|
+----------------------------+-------------->
|
||||||
|
| |
|
||||||
|
pixel matrix foreground color
|
||||||
|
```
|
||||||
|
|
||||||
|
Implemented in [ltr_symmetric.cpp]
|
||||||
|
(https://schlomp.space/tastytea/identiconpp/src/branch/master/src/ltr_symmetric.cpp)
|
||||||
|
|
||||||
|
### ltr_asymmetric
|
||||||
|
|
||||||
|
* Create image with width=columns, height=rows.
|
||||||
|
* Set background color.
|
||||||
|
* Pixels are drawn from left to right, top to bottom.
|
||||||
|
* Use bits from digest to determine if a pixel is painted(1) or not(0).
|
||||||
|
* Use the following bits to pick the foreground color.
|
||||||
|
* You need `floor(log2(n_colors)) + 1` bits.
|
||||||
|
* Scale image proportionally to requested width.
|
||||||
|
|
||||||
|
```PLAIN
|
||||||
|
0111 0011 1101 1100 […] 1111 0111 0101 0111
|
||||||
|
^ ^
|
||||||
|
+----------------------------+-------------->
|
||||||
|
| |
|
||||||
|
pixel matrix foreground color
|
||||||
|
```
|
||||||
|
|
||||||
|
Implemented in [ltr_asymmetric.cpp]
|
||||||
|
(https://schlomp.space/tastytea/identiconpp/src/branch/master/src/ltr_asymmetric.cpp)
|
||||||
|
|
||||||
|
### sigil
|
||||||
|
|
||||||
|
* Create image with width=columns, height=rows.
|
||||||
|
* Set background color.
|
||||||
|
* Select half of the columns, or half of the columns + 1 if uneven.
|
||||||
|
* `columns / 2 + columns % 2`
|
||||||
|
* Pixels are drawn from top to bottom, left to right.
|
||||||
|
* Use the first 8 bits to pick the foreground color.
|
||||||
|
* Use the following bits to determine if a pixel is painted(1) or not(0).
|
||||||
|
* Mirror the pixels vertically.
|
||||||
|
* Scale image proportionally to requested width.
|
||||||
|
|
||||||
|
```PLAIN
|
||||||
|
0111 0011 1101 1100
|
||||||
|
^ ^
|
||||||
|
+---------+--------->
|
||||||
|
| |
|
||||||
|
foreground color |
|
||||||
|
pixel matrix
|
||||||
|
```
|
||||||
|
|
||||||
|
Implemented in [sigil.cpp]
|
||||||
|
(https://schlomp.space/tastytea/identiconpp/src/branch/master/src/sigil.cpp)
|
|
@ -8,7 +8,7 @@ set(CPACK_PACKAGE_DESCRIPTION_SUMMARY
|
||||||
"Library to generate identicons for C++ and C.")
|
"Library to generate identicons for C++ and C.")
|
||||||
set(CPACK_PACKAGE_CONTACT "tastytea <tastytea@tastytea.de>")
|
set(CPACK_PACKAGE_CONTACT "tastytea <tastytea@tastytea.de>")
|
||||||
set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE")
|
set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE")
|
||||||
set(CPACK_RESOURCE_FILE_README "${PROJECT_SOURCE_DIR}/README.adoc")
|
set(CPACK_RESOURCE_FILE_README "${PROJECT_SOURCE_DIR}/README.md")
|
||||||
list(APPEND CPACK_SOURCE_IGNORE_FILES "/\\\\.git"
|
list(APPEND CPACK_SOURCE_IGNORE_FILES "/\\\\.git"
|
||||||
"/.gitignore"
|
"/.gitignore"
|
||||||
"/build/"
|
"/build/"
|
||||||
|
@ -31,11 +31,8 @@ if (WITH_DEB)
|
||||||
execute_process(COMMAND dpkg --print-architecture
|
execute_process(COMMAND dpkg --print-architecture
|
||||||
OUTPUT_VARIABLE CPACK_DEBIAN_PACKAGE_ARCHITECTURE
|
OUTPUT_VARIABLE CPACK_DEBIAN_PACKAGE_ARCHITECTURE
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||||
execute_process(COMMAND lsb_release --codename --short
|
|
||||||
OUTPUT_VARIABLE DEBIAN_CODENAME
|
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
||||||
set(CPACK_PACKAGE_FILE_NAME
|
set(CPACK_PACKAGE_FILE_NAME
|
||||||
"${CPACK_PACKAGE_NAME}_${CPACK_PACKAGE_VERSION}-0_${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}_${DEBIAN_CODENAME}")
|
"${CPACK_PACKAGE_NAME}_${CPACK_PACKAGE_VERSION}-0_${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (WITH_RPM)
|
if (WITH_RPM)
|
||||||
|
@ -43,19 +40,9 @@ if (WITH_RPM)
|
||||||
set(CPACK_RPM_PACKAGE_LICENSE "GPL-3")
|
set(CPACK_RPM_PACKAGE_LICENSE "GPL-3")
|
||||||
set(CPACK_RPM_PACKAGE_URL
|
set(CPACK_RPM_PACKAGE_URL
|
||||||
"https://schlomp.space/tastytea/${CMAKE_PROJECT_NAME}")
|
"https://schlomp.space/tastytea/${CMAKE_PROJECT_NAME}")
|
||||||
set(CPACK_RPM_PACKAGE_REQUIRES "libMagick++")
|
set(CPACK_RPM_PACKAGE_REQUIRES "libMagick++, libxdg-basedir >= 1.2.0")
|
||||||
set(CPACK_PACKAGE_FILE_NAME
|
set(CPACK_PACKAGE_FILE_NAME
|
||||||
"${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-0.${CPACK_PACKAGE_ARCHITECTURE}")
|
"${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-0.${CPACK_PACKAGE_ARCHITECTURE}")
|
||||||
execute_process(COMMAND lsb_release --id --short
|
|
||||||
OUTPUT_VARIABLE OS
|
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
||||||
if("${OS}" STREQUAL "CentOS")
|
|
||||||
execute_process(COMMAND rpm -E %{rhel}
|
|
||||||
OUTPUT_VARIABLE OS_RELEASE
|
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
||||||
set(CPACK_PACKAGE_FILE_NAME
|
|
||||||
"${CPACK_PACKAGE_FILE_NAME}.centos${OS_RELEASE}")
|
|
||||||
endif()
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
include(CPack)
|
include(CPack)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user