aboutsummaryrefslogtreecommitdiff
path: root/plugins/openpgp/src/util.vala
blob: 7c42b57840e46fc474dd41834fe4d5af491074d3 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
using Gtk;

using Dino.Entities;

namespace Dino.Plugins.OpenPgp {

/* Adapted from OpenKeychain */
public static string markup_colorize_id(string s, bool is_fingerprint) {
    string markup = is_fingerprint ? "" : "0x";
    for (int i = 0; i < s.length; i += 4) {
        string four_chars = s.substring(i, 4).down();

        int raw = (int) four_chars.to_long(null, 16);
        uint8[] bytes = {(uint8) ((raw >> 8) & 0xff - 128), (uint8) (raw & 0xff - 128)};

        Checksum checksum = new Checksum(ChecksumType.SHA1);
        checksum.update(bytes, bytes.length);
        uint8[] digest = new uint8[20];
        size_t len = 20;
        checksum.get_digest(digest, ref len);

        uint8 r = digest[0];
        uint8 g = digest[1];
        uint8 b = digest[2];

        if (r == 0 && g == 0 && b == 0) r = g = b = 1;

        double brightness = 0.2126 * r + 0.7152 * g + 0.0722 * b;

        if (brightness < 80) {
            double factor = 80.0 / brightness;
            r = uint8.min(255, (uint8) (r * factor));
            g = uint8.min(255, (uint8) (g * factor));
            b = uint8.min(255, (uint8) (b * factor));

        } else if (brightness > 180) {
            double factor = 180.0 / brightness;
            r = (uint8) (r * factor);
            g = (uint8) (g * factor);
            b = (uint8) (b * factor);
        }

        if (i == 4 * 5) markup += "\n";
        markup += @"<span foreground=\"$("#%02x%02x%02x".printf(r, g, b))\">$four_chars</span>";
        if (is_fingerprint) markup += " ";
    }
    return "<span font_family='monospace' font='8'>" + markup + "</span>";
}

}