-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Start with breaking up the avatar into multiple components
- Loading branch information
Showing
13 changed files
with
314 additions
and
131 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
module Cheers | ||
class Background < Component | ||
|
||
attr_reader :color | ||
|
||
def initialize(canvas, randomizer) | ||
super | ||
|
||
@color = Avatar::BACKGROUND_COLORS.sample(random: randomizer) | ||
end | ||
|
||
def apply | ||
# Work around instance_eval wonkiness by declaring local variables: | ||
color = self.color | ||
|
||
background = Magick::Image.new(512, 512) do | ||
self.background_color = color | ||
end | ||
|
||
canvas.composite!(background, 0, 0, Magick::OverCompositeOp) | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
module Cheers | ||
class Component | ||
|
||
attr_reader :canvas, :randomizer | ||
|
||
def initialize(canvas, randomizer) | ||
@canvas = canvas | ||
@randomizer = randomizer | ||
end | ||
|
||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
module Cheers | ||
class ContrastingColorPicker | ||
|
||
MAX_RETRIES = 10 | ||
|
||
attr_reader :palette, :colors | ||
|
||
def initialize(palette, *colors) | ||
@palette = palette.map { |c| Color.new(c) } | ||
@colors = colors.map { |c| Color.new(c) } | ||
end | ||
|
||
def pick(randomizer = Random.new) | ||
pick = palette.sample(random: randomizer) | ||
|
||
try = 0 | ||
while colors.any? { |c| c.similar?(pick) } && try <= MAX_RETRIES | ||
try += 1 | ||
pick = palette.sample(random: randomizer) | ||
end | ||
|
||
pick.to_s | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
module Cheers | ||
class Decoration < ImageComponent | ||
|
||
IMAGES = %w( decorations/1.png | ||
decorations/2.png ) | ||
|
||
attr_reader :color, :image | ||
|
||
def initialize(canvas, color_randomizer, image_randomizer = nil) | ||
super | ||
|
||
@color = ContrastingColorPicker.new(Avatar::BACKGROUND_COLORS, canvas.background_color).pick | ||
@image = IMAGES.sample random: self.image_randomizer | ||
end | ||
|
||
def apply? | ||
[true, true, false].sample(random: image_randomizer) | ||
end | ||
|
||
def apply | ||
return unless apply? | ||
|
||
mask = Magick::Image.read(image_path(image))[0] | ||
color = self.color | ||
|
||
decoration = Magick::Image.new(512, 512) do | ||
self.background_color = color | ||
end | ||
|
||
canvas.add_compose_mask(mask) | ||
canvas.composite!(decoration, 0, 0, Magick::OverCompositeOp) | ||
canvas.delete_compose_mask | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
module Cheers | ||
class Eyes < ImageComponent | ||
|
||
IMAGES = %w( eyes/1.png | ||
eyes/2.png | ||
eyes/3.png | ||
eyes/4.png | ||
eyes/5.png ) | ||
|
||
attr_reader :color, :image | ||
|
||
def initialize(canvas, color_randomizer, image_randomizer = nil) | ||
super | ||
|
||
@color = ContrastingColorPicker.new(Avatar::COMPONENT_COLORS, canvas.background_color).pick | ||
@image = IMAGES.sample random: self.image_randomizer | ||
end | ||
|
||
def apply | ||
mask = Magick::Image.read(image_path(image))[0] | ||
color = self.color | ||
|
||
eyes = Magick::Image.new(512, 512) do | ||
self.background_color = color | ||
end | ||
|
||
canvas.add_compose_mask(mask) | ||
canvas.composite!(eyes, 0, 0, Magick::OverCompositeOp) | ||
canvas.delete_compose_mask | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
module Cheers | ||
class Face < ImageComponent | ||
|
||
def apply | ||
[UpperGlow, LowerGlow, Texture, Mouth].each do |klass| | ||
klass.new(canvas, color_randomizer, image_randomizer.dup).apply | ||
end | ||
end | ||
|
||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
module Cheers | ||
class ImageComponent | ||
|
||
attr_reader :canvas, :color_randomizer, :image_randomizer | ||
|
||
def initialize(canvas, color_randomizer, image_randomizer = nil) | ||
@canvas = canvas | ||
@color_randomizer = color_randomizer | ||
@image_randomizer = image_randomizer || color_randomizer | ||
end | ||
|
||
private | ||
|
||
def image_path(component) | ||
[Cheers.root, 'components', component].join '/' | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
module Cheers | ||
class LowerGlow < ImageComponent | ||
|
||
GLOW_IMAGES = %w( mouths/1-smile-glow.png | ||
mouths/2-smile-glow.png | ||
mouths/3-smile-glow.png ) | ||
|
||
MASK_IMAGES = %w( mouths/1-bgmask.png | ||
mouths/2-bgmask.png | ||
mouths/3-bgmask.png ) | ||
|
||
attr_reader :background_color, :glow_color, :glow_image, :mask_image | ||
|
||
def initialize(canvas, color_randomizer, element_randomizer = nil) | ||
super | ||
|
||
@background_color = ContrastingColorPicker.new(Avatar::BACKGROUND_COLORS, canvas.background_color).pick | ||
@glow_color = ContrastingColorPicker.new(Avatar::COMPONENT_COLORS, canvas.background_color, background_color).pick | ||
@glow_image = GLOW_IMAGES.sample random: element_randomizer.dup | ||
@mask_image = MASK_IMAGES.sample random: element_randomizer.dup | ||
end | ||
|
||
def apply | ||
glow = Magick::Image.read(image_path(glow_image))[0] | ||
mask = Magick::Image.read(image_path(mask_image))[0] | ||
|
||
# Work around instance_eval wonkiness by declaring local variables: | ||
glow_color = self.glow_color | ||
background_color = self.background_color | ||
|
||
# 2. Lets create lower background | ||
background = Magick::Image.new(512, 512) do | ||
self.background_color = background_color | ||
end | ||
|
||
# Create another smile glow layer but put it on lower background | ||
glow_background = Magick::Image.new(512, 512) do | ||
self.background_color = glow_color | ||
end | ||
|
||
background.add_compose_mask(glow) | ||
background.composite!(glow_background, 0, 0, Magick::OverCompositeOp) | ||
background.delete_compose_mask | ||
|
||
canvas.add_compose_mask(mask) | ||
canvas.composite!(background, 0, 0, Magick::OverCompositeOp) | ||
canvas.delete_compose_mask | ||
end | ||
end | ||
end |
Oops, something went wrong.