|
1 | | -require 'digest/md5' |
2 | | -require 'faraday' |
3 | | -require 'RMagick' |
4 | | - |
5 | | -def gravatar_image(email, dims = 46) |
6 | | - client = Faraday::Connection.new(:url => "http://www.gravatar.com/") |
7 | | - hash = Digest::MD5.hexdigest(email.downcase.strip) |
8 | | - client.get("/avatar/#{hash}?s=#{dims}&d=mm").body |
| 1 | +require_relative "./gravatar" |
| 2 | +require "rmagick" |
| 3 | + |
| 4 | +# TODO: better names |
| 5 | +BACKGROUND = "#3B3F40" |
| 6 | +CIRCLE = "#1B1D1A" |
| 7 | +CIRLCE_OFF = "#5D5F5E" |
| 8 | +CIRCLE_CENTER = "#1B1D1A" |
| 9 | +GREEN = "#6BBC6F" |
| 10 | + |
| 11 | +TRANSPARENT = "rgba(0,0,0,255)" |
| 12 | +FULL_OPACITY = "rgba(255,255,255,255)" |
| 13 | + |
| 14 | +def draw_circle(draw, x, y, radius) |
| 15 | + draw.circle(x, y, x, y + radius) |
| 16 | +end |
| 17 | + |
| 18 | +def draw_rounded_area(draw, width, height) |
| 19 | + radius = height / 2 |
| 20 | + draw_circle(draw, radius, radius, radius) |
| 21 | + draw_circle(draw, width - radius - 1, radius, radius) |
| 22 | + draw.rectangle(radius, 0, width - radius - 1, height) |
9 | 23 | end |
10 | 24 |
|
11 | | -def achievement(first_line, second_line, gravatar = nil) |
12 | | - canvas = Magick::Image.new(423, 67) { |c| c.background_color = "none"; c.format = "png" } |
| 25 | +def achievement(first_line, second_line, email: nil) |
| 26 | + width = 423 |
| 27 | + height = 67 |
| 28 | + |
13 | 29 | draw = Magick::Draw.new |
14 | 30 |
|
15 | | - draw.fill("#3B3F40") |
16 | | - draw.circle(33,33, 33,66) |
17 | | - draw.circle(423 - 34,33, 423 - 34,66) |
18 | | - draw.rectangle(33, 0, 423 - 34,67) |
19 | | - |
20 | | - draw.fill("#1B1D1A") |
21 | | - draw.circle(33,33, 33,62) |
| 31 | + draw.fill(BACKGROUND) |
| 32 | + draw_rounded_area(draw, width, height) |
| 33 | + |
| 34 | + radius = height / 2 |
| 35 | + dark_circle_radius = radius - 4 |
| 36 | + |
| 37 | + draw.fill(CIRCLE) |
| 38 | + draw_circle(draw, radius, radius, dark_circle_radius) |
22 | 39 |
|
23 | | - draw.fill("#5D5F5E") |
24 | | - draw.circle(33,33, 33,60) |
| 40 | + player_circle_outer_radius = dark_circle_radius - 2 |
| 41 | + draw.fill(CIRLCE_OFF) |
| 42 | + draw_circle(draw, radius, radius, player_circle_outer_radius) |
| 43 | + |
| 44 | + # |
25 | 45 |
|
26 | 46 | odraw = Magick::Draw.new |
27 | 47 | mdraw = Magick::Draw.new |
28 | | - overlay = Magick::Image.new(423, 67) |
29 | | - mask = Magick::Image.new(423, 67) |
| 48 | + overlay = Magick::Image.new(width, height) |
| 49 | + mask = Magick::Image.new(width, height) |
30 | 50 |
|
31 | | - odraw.fill("#6BBC6F") |
32 | | - odraw.rectangle(0,0,423,67) |
| 51 | + odraw.fill(GREEN) |
| 52 | + odraw.rectangle(0, 0, width, height) |
33 | 53 | odraw.draw(overlay) |
34 | | - |
35 | | - mdraw.fill("rgba(0,0,0,255)") |
36 | | - mdraw.rectangle(0, 0, 423,67) |
37 | | - mdraw.fill("rgba(255,255,255,255)") |
38 | | - mdraw.circle(33,33, 33,60) |
39 | | - mdraw.fill("rgba(0,0,0,255)") |
40 | | - mdraw.rectangle(33, 0, 423,67) |
41 | | - mdraw.rectangle(0, 33, 423,67) |
42 | | - |
| 54 | + |
| 55 | + # mdraw.fill(TRANSPARENT) |
| 56 | + mdraw.rectangle(0, 0, width, height) |
| 57 | + mdraw.fill(FULL_OPACITY) |
| 58 | + |
| 59 | + player_circle_highlight_outer_radius = player_circle_outer_radius - 1 |
| 60 | + draw_circle(mdraw, radius, radius, player_circle_highlight_outer_radius) |
| 61 | + |
| 62 | + mdraw.fill(TRANSPARENT) |
| 63 | + mdraw.rectangle(radius, 0, width, height) |
| 64 | + mdraw.rectangle(0, radius, radius, height) |
| 65 | + |
43 | 66 | mdraw.draw(mask) |
44 | | - |
45 | | - mask.matte = false |
46 | | - overlay.matte = true |
47 | | - overlay.composite!(mask, 0, 0, Magick::CopyOpacityCompositeOp) |
48 | | - draw.composite(0, 0, 423, 67, overlay) |
49 | 67 |
|
| 68 | + mask.alpha(Magick::OffAlphaChannel) |
| 69 | + # mask.matte = false |
| 70 | + # overlay.matte = true |
| 71 | + overlay.alpha(Magick::OnAlphaChannel) |
| 72 | + |
| 73 | + overlay.composite!(mask, 0, 0, Magick::CopyAlphaCompositeOp) |
| 74 | + draw.composite(0, 0, width, height, overlay) |
50 | 75 |
|
51 | | - draw.fill("#1B1D1A") |
52 | | - draw.rectangle(30, 6, 36,60) |
53 | | - draw.rectangle(6, 30, 60,36) |
54 | | - draw.circle(33,33, 33,54) |
| 76 | + # Crosshair |
| 77 | + draw.fill(CIRCLE_CENTER) |
| 78 | + crosshair_width = 6 |
| 79 | + draw.rectangle(radius - crosshair_width / 2, radius - player_circle_highlight_outer_radius - 1, radius + crosshair_width / 2, radius * 2 - crosshair_width) |
| 80 | + draw.rectangle(radius - player_circle_highlight_outer_radius - 1, radius - crosshair_width / 2, radius * 2 - crosshair_width, radius + crosshair_width / 2) |
| 81 | + player_circle_highlight_inner_radius = player_circle_outer_radius - 7 |
| 82 | + draw_circle(draw, radius, radius, player_circle_highlight_inner_radius) |
55 | 83 |
|
56 | | - if gravatar && (avatar = gravatar_image(gravatar)) |
| 84 | + if email && (avatar = Gravatar.new(email).image_data) |
57 | 85 | odraw = Magick::Draw.new |
58 | 86 | mdraw = Magick::Draw.new |
59 | 87 | aimg = Magick::Image.from_blob(avatar).first |
60 | | - overlay = Magick::Image.new(423, 67) |
61 | | - mask = Magick::Image.new(423, 67) |
| 88 | + overlay = Magick::Image.new(width, height) |
| 89 | + mask = Magick::Image.new(width, height) |
62 | 90 |
|
63 | | - odraw.composite(6, 8, 54, 54, aimg) |
| 91 | + odraw.composite(radius - player_circle_highlight_outer_radius - 1, radius - player_circle_highlight_outer_radius - 1, 54, 54, aimg) |
64 | 92 | odraw.draw(overlay) |
65 | | - mdraw.fill("rgba(0,0,0,255)") |
66 | | - mdraw.rectangle(0, 0, 423,67) |
67 | | - mdraw.fill("rgba(255,255,255,255)") |
68 | | - mdraw.circle(33, 33, 33, 52) |
| 93 | + mdraw.fill(TRANSPARENT) |
| 94 | + mdraw.rectangle(0, 0, width, height) |
| 95 | + mdraw.fill(FULL_OPACITY) |
| 96 | + draw_circle(mdraw, radius, radius, 16) |
69 | 97 | mdraw.draw(mask) |
70 | | - mask.matte = false |
71 | | - overlay.matte = true |
72 | | - overlay.composite!(mask, 0, 0, Magick::CopyOpacityCompositeOp) |
73 | | - draw.composite(0, 0, 423, 67, overlay) |
| 98 | + mask.alpha(Magick::OffAlphaChannel) |
| 99 | + # mask.matte = false |
| 100 | + # overlay.matte = true |
| 101 | + overlay.alpha(Magick::OnAlphaChannel) |
| 102 | + |
| 103 | + overlay.composite!(mask, 0, 0, Magick::CopyAlphaCompositeOp) |
| 104 | + draw.composite(0, 0, width, height, overlay) |
74 | 105 | end |
75 | 106 |
|
76 | 107 | draw.fill("#FFFFFF") |
77 | 108 |
|
78 | | - draw.font('fonts/LiberationSans-Regular.ttf') |
79 | | - draw.font_size('15.5') |
80 | | - draw.kerning('0.65') |
81 | | - draw.text(75,29, first_line) |
| 109 | + draw.font("fonts/LiberationSans-Regular.ttf") |
| 110 | + draw.font_size("15.5") |
| 111 | + draw.kerning("0.65") |
| 112 | + draw.text(75, 29, first_line) |
82 | 113 |
|
83 | | - draw.font_size('15.5') |
84 | | - draw.kerning('0.4') |
85 | | - draw.text(75,50, second_line) |
| 114 | + draw.font_size("15.5") |
| 115 | + draw.kerning("0.4") |
| 116 | + draw.text(75, 50, second_line) |
86 | 117 |
|
| 118 | + canvas = Magick::Image.new(width, height) { |c| c.background_color = "none"; c.format = "png" } |
87 | 119 | draw.draw(canvas) |
88 | 120 | canvas |
89 | 121 | end |
0 commit comments