aaf-lipstick 4.2.0 → 4.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 51c40a77140713b3547d8b516df90c8330ee5b56
4
- data.tar.gz: 439534035d5c998f865b5f37dcd04cbac9f987a3
2
+ SHA256:
3
+ metadata.gz: 78d935ff8ff247803b2bf7580d5284eb3470054e5ee6875be5d024fb1d5ae6fe
4
+ data.tar.gz: 42d1c91bf89f1e294809718641bec4390c178366082b4aa7c362735f6d89b6da
5
5
  SHA512:
6
- metadata.gz: 2a83ab4c24cdda9b10d0030ff42d2505608e41e936eec332331394a92248bd9bd74df8c15512c7b64af9f62badeda1efc48cdee5559aacb68dac4ca9ef32a242
7
- data.tar.gz: 5321a107c28a281c745774a5ffd1472afa4644da7b1efa1a322b0685eac09557b0c0c848e6fb4835c211a94c03f4331ec83f6d0720f724662f252787d27343d7
6
+ metadata.gz: 531ff037d5f0b6fcbebe46d02eb8bba04c583f42f66a69e5e3982e161762e4906e5a8838f4bfc6bad7752d2b023d48da018985d6b55675cc5e425c7cc5e4a426
7
+ data.tar.gz: 20c246377c4ce1b00eb248351aebce3f1249918dbb3b8988917c4cba187c2c9c5f2f0980d239b6a33ff572da05af33935bef94d37c46aebd0e5a5ace49e646b0
@@ -6,4 +6,5 @@ module Lipstick
6
6
  end
7
7
 
8
8
  require 'lipstick/images/email_banner'
9
+ require 'lipstick/images/logo_only_email_banner'
9
10
  require 'lipstick/images/processor'
@@ -28,17 +28,22 @@ module Lipstick
28
28
  #
29
29
  # For image compositing, (x, y) is the position of the top-left corner.
30
30
  class EmailBanner
31
- def initialize(image:, title:, environment:)
31
+ def initialize(image:, title:, environment:,
32
+ background_color:, resize_to:)
32
33
  @title = title
33
34
  @environment = environment
34
35
  @image = image
36
+ @background_color = background_color
37
+ @resize_to = resize_to
35
38
  end
36
39
 
37
40
  def to_png
41
+ bgcolor = @background_color
42
+
38
43
  canvas = Magick::ImageList.new
39
44
  canvas.new_image(WIDTH, HEIGHT) do |f|
40
45
  f.format = 'PNG'
41
- f.background_color = '#2A3685'
46
+ f.background_color = bgcolor
42
47
  end
43
48
 
44
49
  annotate_title(canvas)
@@ -90,7 +95,7 @@ module Lipstick
90
95
 
91
96
  def logo
92
97
  @logo ||= Magick::Image.read(@image.pathname.to_s).first
93
- .resize_to_fill(78, 78)
98
+ .resize_to_fill(@resize_to[0], @resize_to[1])
94
99
  end
95
100
 
96
101
  def gap
@@ -0,0 +1,132 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rmagick'
4
+
5
+ require 'pry'
6
+
7
+ module Lipstick
8
+ module Images
9
+ # Creates a logo-only email banner, with two elements.
10
+ #
11
+ # 1. Logo, centered vertically and horizontally within the image.
12
+ # 2. Environment string, stamped across the logo.
13
+ #
14
+ # The math here seemed like it would be a lot simpler than the EmailBanner
15
+ # class, but then I went and made it all confusing by bringing trigonometry
16
+ # into it. I promise there was a good reason for doing it.
17
+ class LogoOnlyEmailBanner
18
+ def initialize(image:, environment:, background_color:)
19
+ @environment = environment.upcase
20
+ @image = image
21
+ @background_color = background_color
22
+ end
23
+
24
+ def to_png
25
+ bgcolor = @background_color
26
+
27
+ canvas = Magick::ImageList.new
28
+ canvas.new_image(WIDTH, HEIGHT) do |f|
29
+ f.format = 'PNG'
30
+ f.background_color = bgcolor
31
+ end
32
+
33
+ canvas.composite!(logo, logo_x, logo_y, Magick::SrcOverCompositeOp)
34
+
35
+ annotate_environment(canvas)
36
+
37
+ canvas.to_blob
38
+ end
39
+
40
+ private
41
+
42
+ WIDTH = 600
43
+ HEIGHT = 150
44
+ MID_Y = HEIGHT / 2
45
+ ANGLE_DEGREES = 10
46
+ ANGLE_RADIANS = Math::PI * ANGLE_DEGREES / 180
47
+ private_constant :WIDTH, :HEIGHT, :MID_Y, :ANGLE_DEGREES, :ANGLE_RADIANS
48
+
49
+ def environment_format
50
+ @environment_format ||= Magick::Draw.new do |title|
51
+ title.font_family = 'ArialB'
52
+ title.font_weight = 900
53
+ title.pointsize = 36
54
+ title.gravity = Magick::ForgetGravity
55
+ title.fill = '#bc2028'
56
+ title.rotation = (-1) * ANGLE_DEGREES
57
+ end
58
+ end
59
+
60
+ def blank_environment?
61
+ !@environment&.present?
62
+ end
63
+
64
+ def annotate_environment(canvas)
65
+ return if blank_environment?
66
+
67
+ environment_format.annotate(canvas, 0, 0, env_x, env_y, @environment)
68
+ end
69
+
70
+ def logo
71
+ @logo ||= Magick::Image.read(@image.pathname.to_s).first
72
+ end
73
+
74
+ def gap
75
+ @gap ||= environment_format.get_type_metrics('AAF').width
76
+ end
77
+
78
+ def logo_w
79
+ logo.bounding_box.width
80
+ end
81
+
82
+ # x position to vertically center logo
83
+ def logo_x
84
+ ((WIDTH - logo.bounding_box.width) / 2).round
85
+ end
86
+
87
+ # y position to vertically center logo
88
+ def logo_y
89
+ ((HEIGHT - logo.bounding_box.height) / 2).round
90
+ end
91
+
92
+ def env_metrics
93
+ return OpenStruct.new(width: 0, height: 0) if blank_environment?
94
+
95
+ environment_format.get_type_metrics(@environment)
96
+ end
97
+
98
+ def env_x
99
+ m = env_metrics
100
+
101
+ # The horizontal width of the environment text is found by:
102
+ # w cos(Θ) + h sin(Θ)
103
+ #
104
+ # w = text width
105
+ # h = text ascent
106
+ # Θ = angle of text rotation
107
+ #
108
+ # Contrary to the description in `EmailBanner`, since we're upper
109
+ # casing the environment string here, we don't need to worry about text
110
+ # descent.
111
+ w = Math.cos(ANGLE_RADIANS) * m.width +
112
+ Math.sin(ANGLE_RADIANS) * m.ascent
113
+
114
+ # We center that the same as for `logo_x`
115
+ ((WIDTH - w) / 2).round
116
+ end
117
+
118
+ def env_y
119
+ m = env_metrics
120
+
121
+ # The horizontal width of the environment text is found by:
122
+ # w sin(Θ) + h cos(Θ)
123
+ h = Math.sin(ANGLE_RADIANS) * m.width +
124
+ Math.cos(ANGLE_RADIANS) * m.ascent
125
+
126
+ # We use addition here instead of the usual subtraction, as the text
127
+ # moves in the upward direction from the position we set.
128
+ ((HEIGHT + h) / 2).round
129
+ end
130
+ end
131
+ end
132
+ end
@@ -16,11 +16,28 @@ module Lipstick
16
16
  end
17
17
  # rubocop:enable Security/Eval
18
18
 
19
- def email_banner(image: 'logo.png', title:, environment:)
19
+ def email_banner(image: 'logo.png', title:, environment:, **kwargs)
20
20
  @context.depend_on_asset(image)
21
21
  asset = @context.environment.find_asset(image)
22
- EmailBanner.new(image: asset, title: title, environment: environment)
23
- .to_png
22
+
23
+ EmailBanner.new(
24
+ image: asset,
25
+ title: title,
26
+ environment: environment,
27
+ background_color: kwargs[:background_color] || '#2A3685',
28
+ resize_to: kwargs[:resize_to] || [78, 78]
29
+ ).to_png
30
+ end
31
+
32
+ def logo_only_email_banner(image: 'logo.png', environment:, **kwargs)
33
+ @context.depend_on_asset(image)
34
+ asset = @context.environment.find_asset(image)
35
+
36
+ LogoOnlyEmailBanner.new(
37
+ image: asset,
38
+ environment: environment,
39
+ background_color: kwargs[:background_color] || '#2A3685'
40
+ ).to_png
24
41
  end
25
42
  end
26
43
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Lipstick
4
- VERSION = '4.2.0'
4
+ VERSION = '4.3.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aaf-lipstick
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.2.0
4
+ version: 4.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shaun Mangelsdorf
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-10-21 00:00:00.000000000 Z
11
+ date: 2019-12-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: erubis
@@ -324,6 +324,7 @@ files:
324
324
  - lib/lipstick/helpers/sortable_helper.rb
325
325
  - lib/lipstick/images.rb
326
326
  - lib/lipstick/images/email_banner.rb
327
+ - lib/lipstick/images/logo_only_email_banner.rb
327
328
  - lib/lipstick/images/processor.rb
328
329
  - lib/lipstick/sortable.rb
329
330
  - lib/lipstick/version.rb
@@ -346,8 +347,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
346
347
  - !ruby/object:Gem::Version
347
348
  version: '0'
348
349
  requirements: []
349
- rubyforge_project:
350
- rubygems_version: 2.5.2.3
350
+ rubygems_version: 3.0.3
351
351
  signing_key:
352
352
  specification_version: 4
353
353
  summary: A gem for applying AAF branding to our services