dynamic_images 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Manifest +27 -0
- data/README.rdoc +104 -0
- data/README_USAGE.rdoc +67 -0
- data/Rakefile +14 -0
- data/dynamic_images.gemspec +35 -0
- data/examples/gtk_window.rb +39 -0
- data/examples/named_colors_table.rb +13 -0
- data/init.rb +6 -0
- data/lib/dynamic_image.rb +240 -0
- data/lib/elements/block_element.rb +224 -0
- data/lib/elements/element_interface.rb +320 -0
- data/lib/elements/image_element.rb +82 -0
- data/lib/elements/table_cell_element.rb +34 -0
- data/lib/elements/table_element.rb +220 -0
- data/lib/elements/text_element.rb +195 -0
- data/lib/parsers/xml.dtd +154 -0
- data/lib/parsers/xml_parser.rb +135 -0
- data/lib/render_image.rb +60 -0
- data/lib/sources/color_source.rb +97 -0
- data/lib/sources/gradient_source.rb +200 -0
- data/lib/sources/source_factory.rb +36 -0
- data/test/asym.rb +54 -0
- data/test/performance.1.rb +86 -0
- data/test/performance.2.rb +159 -0
- data/test/performance.3.rb +236 -0
- data/test/performance.rb +51 -0
- data/test/units1.rb +185 -0
- data/test/units2.rb +162 -0
- metadata +115 -0
@@ -0,0 +1,36 @@
|
|
1
|
+
# Module keeps all source factories creating sources for drawing.
|
2
|
+
module DynamicImageSources
|
3
|
+
# Main source factory provides interface for source classes.
|
4
|
+
#
|
5
|
+
# It can also parse any supported source by parsing with all classes inherited from it.
|
6
|
+
class SourceFactory
|
7
|
+
private_class_method :new
|
8
|
+
|
9
|
+
private
|
10
|
+
def self.inherited(subclass)
|
11
|
+
@@factories ||= []
|
12
|
+
@@factories << subclass
|
13
|
+
end
|
14
|
+
|
15
|
+
public
|
16
|
+
# Returns source object by parsing with all classes inherited from SourceFactory or nil if there is no factory to parse it.
|
17
|
+
def self.parse(source)
|
18
|
+
raise Exception.new "not implemented in #{self}, but should be" unless self == SourceFactory
|
19
|
+
return source if source.is_a? SourceFactory
|
20
|
+
source = source.is_a?(Array) ? source.flatten.map(&:to_s).map(&:downcase) : source.to_s.downcase.split(/\s+/)
|
21
|
+
@@factories.each do |factory|
|
22
|
+
obj = factory.parse source
|
23
|
+
return obj if obj
|
24
|
+
end
|
25
|
+
nil
|
26
|
+
end
|
27
|
+
|
28
|
+
# Interface method for sources to sets them as source.
|
29
|
+
def set_source(context, x, y, w, h)
|
30
|
+
raise Exception.new "not implemented in #{self.class}, but should be"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
require File.dirname(__FILE__) + '/color_source.rb'
|
36
|
+
require File.dirname(__FILE__) + '/gradient_source.rb'
|
data/test/asym.rb
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'gtk2'
|
3
|
+
require File.dirname(__FILE__) + '/../init.rb'
|
4
|
+
|
5
|
+
# An array to store created files for removing it at the end
|
6
|
+
created_files = ["asym.png"]
|
7
|
+
|
8
|
+
def time_diff_milli(start, finish)
|
9
|
+
(finish - start) * 1000.0
|
10
|
+
end
|
11
|
+
|
12
|
+
# Run test for n = {1, 2, ...} for x times to get AVG
|
13
|
+
N = 1..10
|
14
|
+
x = 10
|
15
|
+
N.to_a.each do |n|
|
16
|
+
t1 = Time.now
|
17
|
+
x.times do
|
18
|
+
DynamicImage.new :w => 588, :h => 412*n, :antialias => :subpixel do
|
19
|
+
n.times do |nn|
|
20
|
+
block :w => 588, :h => 412, :position => :absolute, :y => 412*nn do
|
21
|
+
table :w => 588-173-4, :h => 258, :cols => 1, :margin => [-2, 0, 0, 173] do
|
22
|
+
cell do
|
23
|
+
text "Men in Black III", :auto_dir => false, :font => "Arial Narrow bold 30", :crop_to => [2, :lines], :crop_suffix => "..."
|
24
|
+
end
|
25
|
+
cell :h => 26
|
26
|
+
cell :h => "0%" do
|
27
|
+
text "Director: Barry Sonnenfeld\nCast: Will Smith, Tommy Lee Jones, Jemaine Clement, Josh Brolin, Lady Gaga, Emma Thompson, Alice Eve, Kevin Covais, Rip Torn, Nicole Scherzinger, Mike Pyle, Justin Bieber, Tim Burton",
|
28
|
+
:font => "Arial Narrow 13", :to_fix => :crop, :crop_suffix => " ..."
|
29
|
+
end
|
30
|
+
cell do
|
31
|
+
text " \nPrice: $3.99", :font => "Arial Narrow bold 13"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
block :w => "100%", :h => 588-258 do
|
35
|
+
text "An alien criminal kills the young Agent K in 1969, altering the timeline, changing the Agency and placing the Earth in danger. Veteran Agent J (Will Smith) must travel back in time to 1969 to before the murder and work with the young Agent K (Josh Brolin) to save him, the Agency, the Earth and humanity itself.",
|
36
|
+
:justify => true, :to_fit => :crop, :crop_suffix => " ...", :font => "Arial Narrow 13"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
save! File.dirname(__FILE__) + "/asym.png"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
t2 = Time.now
|
44
|
+
t = time_diff_milli t1, t2
|
45
|
+
puts "N = #{n}".ljust(8) + "#{t/x} ms"
|
46
|
+
end
|
47
|
+
|
48
|
+
# Removing created files
|
49
|
+
unless ARGV.include? "-d"
|
50
|
+
created_files.each do |file|
|
51
|
+
file = File.join(File.dirname(__FILE__), file)
|
52
|
+
File.delete file if File.exists? file
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
no_lib do
|
2
|
+
surface = Cairo::ImageSurface.new 588, 412
|
3
|
+
cr = Cairo::Context.new(surface)
|
4
|
+
cr.set_antialias Cairo::ANTIALIAS_SUBPIXEL
|
5
|
+
cr.set_source_rgba [0, 0, 0, 1]
|
6
|
+
|
7
|
+
pangoLayout = cr.create_pango_layout
|
8
|
+
pangoLayout.auto_dir = false
|
9
|
+
cr.move_to 173, -2
|
10
|
+
pangoLayout.set_width 415*Pango::SCALE
|
11
|
+
title = "Men in Black III"
|
12
|
+
pangoLayout.set_text title
|
13
|
+
pangoLayout.set_font_description Pango::FontDescription.new("Arial Narrow bold 30")
|
14
|
+
title += " ..."
|
15
|
+
loop do
|
16
|
+
break if pangoLayout.line_count <= 2
|
17
|
+
title = title.sub(/\S+\s+\S+$/, '') + '...'
|
18
|
+
pangoLayout.set_text title
|
19
|
+
end
|
20
|
+
cr.show_pango_layout pangoLayout
|
21
|
+
shift = pangoLayout.line_count == 1 ? 0 : 45;
|
22
|
+
|
23
|
+
normal_font = Pango::FontDescription.new("Arial Narrow 13")
|
24
|
+
|
25
|
+
cr.move_to 173, 81+shift
|
26
|
+
pangoLayout.set_width 415*Pango::SCALE
|
27
|
+
dir_casts = "Director: Barry Sonnenfeld\nCast: Will Smith, Tommy Lee Jones, Jemaine Clement, Josh Brolin, Lady Gaga, Emma Thompson, Alice Eve, Kevin Covais, Rip Torn, Nicole Scherzinger, Mike Pyle, Justin Bieber, Tim Burton"
|
28
|
+
pangoLayout.set_text dir_casts
|
29
|
+
pangoLayout.set_font_description normal_font
|
30
|
+
dir_casts += ", ..."
|
31
|
+
loop do
|
32
|
+
break if pangoLayout.line_count <= (shift.zero? ? 5 : 3)
|
33
|
+
dir_casts = dir_casts.scan(/([\s\S]*,).*,/)[0][0] + ' ...'
|
34
|
+
pangoLayout.set_text dir_casts
|
35
|
+
end
|
36
|
+
cr.show_pango_layout pangoLayout
|
37
|
+
|
38
|
+
cr.move_to 173, 201
|
39
|
+
pangoLayout.set_text "\nPrice: $3.99"
|
40
|
+
pangoLayout.set_font_description Pango::FontDescription.new("Arial Narrow bold 13")
|
41
|
+
cr.show_pango_layout pangoLayout
|
42
|
+
|
43
|
+
cr.move_to 0, 258
|
44
|
+
pangoLayout.set_width 588*Pango::SCALE
|
45
|
+
pangoLayout.justify = true
|
46
|
+
description = "An alien criminal kills the young Agent K in 1969, altering the timeline, changing the Agency and placing the Earth in danger. Veteran Agent J (Will Smith) must travel back in time to 1969 to before the murder and work with the young Agent K (Josh Brolin) to save him, the Agency, the Earth and humanity itself."
|
47
|
+
pangoLayout.set_text description
|
48
|
+
pangoLayout.set_font_description normal_font
|
49
|
+
description += " ..."
|
50
|
+
loop do
|
51
|
+
break if pangoLayout.line_count <= 7
|
52
|
+
description = description.sub(/\S+\s+\S+$/, '') + '...'
|
53
|
+
pangoLayout.set_text description
|
54
|
+
end
|
55
|
+
cr.show_pango_layout pangoLayout
|
56
|
+
|
57
|
+
file = File.join(File.dirname(__FILE__) + "/performance.1.png")
|
58
|
+
cr.target.write_to_png file
|
59
|
+
|
60
|
+
pangoLayout = nil
|
61
|
+
cr.destroy
|
62
|
+
surface.destroy
|
63
|
+
end
|
64
|
+
|
65
|
+
with_lib do
|
66
|
+
DynamicImage.new :w => 588, :h => 412, :antialias => :subpixel do
|
67
|
+
table :w => 588-173-4, :h => 258, :cols => 1, :margin => [-2, 0, 0, 173] do
|
68
|
+
cell do
|
69
|
+
text "Men in Black III", :auto_dir => false, :font => "Arial Narrow bold 30", :crop_to => [2, :lines], :crop_suffix => "..."
|
70
|
+
end
|
71
|
+
cell :h => 26
|
72
|
+
cell :h => "0%" do
|
73
|
+
text "Director: Barry Sonnenfeld\nCast: Will Smith, Tommy Lee Jones, Jemaine Clement, Josh Brolin, Lady Gaga, Emma Thompson, Alice Eve, Kevin Covais, Rip Torn, Nicole Scherzinger, Mike Pyle, Justin Bieber, Tim Burton",
|
74
|
+
:font => "Arial Narrow 13", :to_fix => :crop, :crop_suffix => " ..."
|
75
|
+
end
|
76
|
+
cell do
|
77
|
+
text " \nPrice: $3.99", :font => "Arial Narrow bold 13"
|
78
|
+
end
|
79
|
+
end
|
80
|
+
block :w => "100%", :h => 588-258 do
|
81
|
+
text "An alien criminal kills the young Agent K in 1969, altering the timeline, changing the Agency and placing the Earth in danger. Veteran Agent J (Will Smith) must travel back in time to 1969 to before the murder and work with the young Agent K (Josh Brolin) to save him, the Agency, the Earth and humanity itself.",
|
82
|
+
:justify => true, :to_fit => :crop, :crop_suffix => " ...", :font => "Arial Narrow 13"
|
83
|
+
end
|
84
|
+
save! File.dirname(__FILE__) + "/performance.2.png"
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,159 @@
|
|
1
|
+
no_lib do
|
2
|
+
channel_name = [31.0/255, 31.0/255, 31.0/255, 1]
|
3
|
+
channel_num_top = [227.0/255, 227.0/255, 227.0/255, 1]
|
4
|
+
channel_num_bottom = [156.0/255, 156.0/255, 156.0/255, 1]
|
5
|
+
epg_now = [230.0/255, 230.0/255, 230.0/255, 1]
|
6
|
+
epg_next = [129.0/255, 129.0/255, 129.0/255, 1]
|
7
|
+
|
8
|
+
surface = Cairo::ImageSurface.new 1239, 168
|
9
|
+
cr = Cairo::Context.new surface
|
10
|
+
cr.set_antialias Cairo::ANTIALIAS_SUBPIXEL
|
11
|
+
pangoLayout = cr.create_pango_layout
|
12
|
+
pangoLayout.auto_dir = false
|
13
|
+
|
14
|
+
#channel name
|
15
|
+
cr.move_to 28, 13
|
16
|
+
pangoLayout.set_width 1183*Pango::SCALE
|
17
|
+
cr.set_source_rgba channel_name
|
18
|
+
pangoLayout.set_font_description Pango::FontDescription.new("Arial Narrow bold 13")
|
19
|
+
pangoLayout.set_text "Channel 1"
|
20
|
+
cr.show_pango_layout pangoLayout
|
21
|
+
|
22
|
+
#channel number
|
23
|
+
g = Cairo::LinearPattern.new(21,87,21,87+17)
|
24
|
+
g.set_extend(Cairo::EXTEND_REFLECT)
|
25
|
+
g.add_color_stop_rgba(0.0,channel_num_top)
|
26
|
+
g.add_color_stop_rgba(1.0,channel_num_bottom)
|
27
|
+
|
28
|
+
pangoLayout.set_width 52*Pango::SCALE
|
29
|
+
pangoLayout.set_alignment Pango::ALIGN_CENTER
|
30
|
+
pangoLayout.set_font_description Pango::FontDescription.new("Arial Narrow 17")
|
31
|
+
|
32
|
+
cr.move_to 21, 87
|
33
|
+
pangoLayout.set_text "1"
|
34
|
+
cr.set_source(g)
|
35
|
+
cr.fill_preserve
|
36
|
+
cr.show_pango_layout pangoLayout
|
37
|
+
|
38
|
+
#channel logo
|
39
|
+
cr.save
|
40
|
+
cr.set_source [0, 1, 1]
|
41
|
+
cr.rectangle 84, 50, 132, 99
|
42
|
+
cr.clip
|
43
|
+
cr.paint
|
44
|
+
cr.restore
|
45
|
+
|
46
|
+
#epg now title
|
47
|
+
pangoLayout.set_alignment Pango::ALIGN_LEFT
|
48
|
+
pangoLayout.set_font_description Pango::FontDescription.new("Arial Narrow 23")
|
49
|
+
|
50
|
+
cr.move_to 258, 52
|
51
|
+
cr.set_source epg_now
|
52
|
+
pangoLayout.set_width 430*Pango::SCALE
|
53
|
+
title = "Special News Edition"
|
54
|
+
pangoLayout.set_text title
|
55
|
+
title += " ..."
|
56
|
+
loop do
|
57
|
+
break if pangoLayout.line_count <= 1
|
58
|
+
title = title.sub(/\S+\s+\S+$/, '') + '...'
|
59
|
+
pangoLayout.set_text title
|
60
|
+
end
|
61
|
+
cr.show_pango_layout pangoLayout
|
62
|
+
(font = pangoLayout.font_description).set_style Pango::STYLE_NORMAL
|
63
|
+
pangoLayout.set_font_description font
|
64
|
+
|
65
|
+
pangoLayout.set_width 100*Pango::SCALE
|
66
|
+
#epg now start time
|
67
|
+
pangoLayout.set_font_description Pango::FontDescription.new("Arial Narrow 13")
|
68
|
+
cr.move_to 700, 63
|
69
|
+
pangoLayout.set_text "23:45"
|
70
|
+
cr.set_source epg_now
|
71
|
+
cr.show_pango_layout pangoLayout
|
72
|
+
|
73
|
+
#epg now end time
|
74
|
+
pangoLayout.set_font_description Pango::FontDescription.new("Arial Narrow 13")
|
75
|
+
cr.move_to 1026, 63
|
76
|
+
pangoLayout.set_text "00:00"
|
77
|
+
cr.set_source epg_now
|
78
|
+
cr.show_pango_layout pangoLayout
|
79
|
+
|
80
|
+
#epg now progress bar background
|
81
|
+
cr.save
|
82
|
+
cr.set_source [0, 0, 0, 0.5]
|
83
|
+
cr.rectangle 752, 64, 259, 20
|
84
|
+
cr.clip
|
85
|
+
cr.paint
|
86
|
+
cr.restore
|
87
|
+
|
88
|
+
#epg next title
|
89
|
+
pangoLayout.set_font_description Pango::FontDescription.new("Arial Narrow 23")
|
90
|
+
cr.move_to 258, 112
|
91
|
+
cr.set_source epg_next
|
92
|
+
pangoLayout.set_width 430*Pango::SCALE
|
93
|
+
title = "Loop Broadcasts"
|
94
|
+
pangoLayout.set_text title
|
95
|
+
title += " ..."
|
96
|
+
loop do
|
97
|
+
break if pangoLayout.line_count <= 1
|
98
|
+
title = title.sub(/\S+\s+\S+$/, '') + '...'
|
99
|
+
pangoLayout.set_text title
|
100
|
+
end
|
101
|
+
cr.show_pango_layout pangoLayout
|
102
|
+
(font = pangoLayout.font_description).set_style Pango::STYLE_NORMAL
|
103
|
+
pangoLayout.set_font_description font
|
104
|
+
|
105
|
+
#epg next times
|
106
|
+
pangoLayout.set_font_description Pango::FontDescription.new("Arial Narrow 13")
|
107
|
+
pangoLayout.set_width 200*Pango::SCALE
|
108
|
+
cr.move_to 700, 122
|
109
|
+
pangoLayout.set_text "00:00 - 03:00"
|
110
|
+
cr.set_source epg_next
|
111
|
+
cr.show_pango_layout pangoLayout
|
112
|
+
|
113
|
+
file = File.join(File.dirname(__FILE__) + "/performance.1.png")
|
114
|
+
cr.target.write_to_png file
|
115
|
+
|
116
|
+
pangoLayout = nil
|
117
|
+
cr.destroy
|
118
|
+
surface.destroy
|
119
|
+
end
|
120
|
+
|
121
|
+
with_lib do
|
122
|
+
channel_name = [31.0/255, 31.0/255, 31.0/255, 1.0]
|
123
|
+
channel_num_top = [227.0/255, 227.0/255, 227.0/255, 1.0]
|
124
|
+
channel_num_bottom = [156.0/255, 156.0/255, 156.0/255, 1.0]
|
125
|
+
epg_now = [230.0/255, 230.0/255, 230.0/255, 1.0]
|
126
|
+
epg_next = [129.0/255, 129.0/255, 129.0/255, 1.0]
|
127
|
+
|
128
|
+
DynamicImage.new :w => 1239-56, :h => 168-26, :padding => [13, 28], :antialias => :subpixel do
|
129
|
+
text "Channel 1", :color => channel_name, :font => "Arial Narrow bold 13"
|
130
|
+
table :position => :absolute, :y => 37, :h => 99 do
|
131
|
+
cell :width => 38, :padding_right => 18, :padding_top => 37 do
|
132
|
+
text "1", :color => [:gradient_reflect, 0, 0, 0, 17, "0%", channel_num_top, "100%", channel_num_bottom], :font => "Arial Narrow 17", :align => :center
|
133
|
+
end
|
134
|
+
cell :w => 132, :bg => :aqua
|
135
|
+
cell :padding_left => 42 do
|
136
|
+
block :w => 430, :position => :absolute, :y => 2 do
|
137
|
+
text "Special News Edition", :font => "Arial Narrow 23", :to_fit => :crop, :crop_suffix => " ...", :color => epg_now
|
138
|
+
end
|
139
|
+
block :w => 430, :position => :absolute, :y => 62 do
|
140
|
+
text "Loop Broadcasts", :font => "Arial Narrow 23", :to_fit => :crop, :crop_suffix => " ...", :color => epg_next
|
141
|
+
end
|
142
|
+
end
|
143
|
+
cell :padding_left => 12 do
|
144
|
+
table :w => 361, :position => :absolute, :y => 13 do
|
145
|
+
cell :w => 52 do
|
146
|
+
text "23:45", :font => "Arial Narrow 13", :color => epg_now
|
147
|
+
end
|
148
|
+
cell :bg => [0, 0, 0, 0.5] do
|
149
|
+
end
|
150
|
+
cell :w => 50, :padding_left => 16 do
|
151
|
+
text "00:00", :font => "Arial Narrow 13", :color => epg_now
|
152
|
+
end
|
153
|
+
end
|
154
|
+
text "00:00 - 03:00", :font => "Arial Narrow 13", :color => epg_next, :position => :absolute, :y => 72
|
155
|
+
end
|
156
|
+
end
|
157
|
+
save! File.join(File.dirname(__FILE__) + "/performance.2.png")
|
158
|
+
end
|
159
|
+
end
|
@@ -0,0 +1,236 @@
|
|
1
|
+
no_lib do
|
2
|
+
channel_name = [31.0/255, 31.0/255, 31.0/255, 1.0]
|
3
|
+
channel_num_top = [227.0/255, 227.0/255, 227.0/255, 1.0]
|
4
|
+
channel_num_bottom = [156.0/255, 156.0/255, 156.0/255, 1.0]
|
5
|
+
epg_now = [230.0/255, 230.0/255, 230.0/255, 1.0]
|
6
|
+
epg_next = [129.0/255, 129.0/255, 129.0/255, 1.0]
|
7
|
+
|
8
|
+
surface = Cairo::ImageSurface.new 1239, 412
|
9
|
+
cr = Cairo::Context.new(surface)
|
10
|
+
cr.set_antialias Cairo::ANTIALIAS_SUBPIXEL
|
11
|
+
cr.set_source_rgba [0, 0, 0, 1]
|
12
|
+
|
13
|
+
pangoLayout = cr.create_pango_layout
|
14
|
+
pangoLayout.auto_dir = false
|
15
|
+
cr.move_to 173, -2
|
16
|
+
pangoLayout.set_width 415*Pango::SCALE
|
17
|
+
title = "Men in Black III"
|
18
|
+
pangoLayout.set_text title
|
19
|
+
pangoLayout.set_font_description Pango::FontDescription.new("Arial Narrow bold 30")
|
20
|
+
title += " ..."
|
21
|
+
loop do
|
22
|
+
break if pangoLayout.line_count <= 2
|
23
|
+
title = title.sub(/\S+\s+\S+$/, '') + '...'
|
24
|
+
pangoLayout.set_text title
|
25
|
+
end
|
26
|
+
cr.show_pango_layout pangoLayout
|
27
|
+
shift = pangoLayout.line_count == 1 ? 0 : 45;
|
28
|
+
|
29
|
+
normal_font = Pango::FontDescription.new("Arial Narrow 13")
|
30
|
+
|
31
|
+
cr.move_to 173, 81+shift
|
32
|
+
pangoLayout.set_width 415*Pango::SCALE
|
33
|
+
dir_casts = "Director: Barry Sonnenfeld\nCast: Will Smith, Tommy Lee Jones, Jemaine Clement, Josh Brolin, Lady Gaga, Emma Thompson, Alice Eve, Kevin Covais, Rip Torn, Nicole Scherzinger, Mike Pyle, Justin Bieber, Tim Burton"
|
34
|
+
pangoLayout.set_text dir_casts
|
35
|
+
pangoLayout.set_font_description normal_font
|
36
|
+
dir_casts += ", ..."
|
37
|
+
loop do
|
38
|
+
break if pangoLayout.line_count <= (shift.zero? ? 5 : 3)
|
39
|
+
dir_casts = dir_casts.scan(/([\s\S]*,).*,/)[0][0] + ' ...'
|
40
|
+
pangoLayout.set_text dir_casts
|
41
|
+
end
|
42
|
+
cr.show_pango_layout pangoLayout
|
43
|
+
|
44
|
+
cr.move_to 173, 201
|
45
|
+
pangoLayout.set_text "\nPrice: $3.99"
|
46
|
+
pangoLayout.set_font_description Pango::FontDescription.new("Arial Narrow bold 13")
|
47
|
+
cr.show_pango_layout pangoLayout
|
48
|
+
|
49
|
+
cr.move_to 0, 258
|
50
|
+
pangoLayout.set_width 588*Pango::SCALE
|
51
|
+
pangoLayout.justify = true
|
52
|
+
description = "An alien criminal kills the young Agent K in 1969, altering the timeline, changing the Agency and placing the Earth in danger. Veteran Agent J (Will Smith) must travel back in time to 1969 to before the murder and work with the young Agent K (Josh Brolin) to save him, the Agency, the Earth and humanity itself."
|
53
|
+
pangoLayout.set_text description
|
54
|
+
pangoLayout.set_font_description normal_font
|
55
|
+
description += " ..."
|
56
|
+
loop do
|
57
|
+
break if pangoLayout.line_count <= 7
|
58
|
+
description = description.sub(/\S+\s+\S+$/, '') + '...'
|
59
|
+
pangoLayout.set_text description
|
60
|
+
end
|
61
|
+
cr.show_pango_layout pangoLayout
|
62
|
+
|
63
|
+
|
64
|
+
pangoLayout = cr.create_pango_layout
|
65
|
+
pangoLayout.auto_dir = false
|
66
|
+
|
67
|
+
#channel name
|
68
|
+
cr.move_to 28, 13
|
69
|
+
pangoLayout.set_width 1183*Pango::SCALE
|
70
|
+
cr.set_source_rgba channel_name
|
71
|
+
pangoLayout.set_font_description Pango::FontDescription.new("Arial Narrow bold 13")
|
72
|
+
pangoLayout.set_text "Channel 1"
|
73
|
+
cr.show_pango_layout pangoLayout
|
74
|
+
|
75
|
+
#channel number
|
76
|
+
g = Cairo::LinearPattern.new(21,87,21,87+17)
|
77
|
+
g.set_extend(Cairo::EXTEND_REFLECT)
|
78
|
+
g.add_color_stop_rgba(0.0,channel_num_top)
|
79
|
+
g.add_color_stop_rgba(1.0,channel_num_bottom)
|
80
|
+
|
81
|
+
pangoLayout.set_width 52*Pango::SCALE
|
82
|
+
pangoLayout.set_alignment Pango::ALIGN_CENTER
|
83
|
+
pangoLayout.set_font_description Pango::FontDescription.new("Arial Narrow 17")
|
84
|
+
|
85
|
+
cr.move_to 21, 87
|
86
|
+
pangoLayout.set_text "1"
|
87
|
+
cr.set_source(g)
|
88
|
+
cr.fill_preserve
|
89
|
+
cr.show_pango_layout pangoLayout
|
90
|
+
|
91
|
+
#channel logo
|
92
|
+
cr.save
|
93
|
+
cr.set_source [0, 1, 1]
|
94
|
+
cr.rectangle 84, 50, 132, 99
|
95
|
+
cr.clip
|
96
|
+
cr.paint
|
97
|
+
cr.restore
|
98
|
+
|
99
|
+
#epg now title
|
100
|
+
pangoLayout.set_alignment Pango::ALIGN_LEFT
|
101
|
+
pangoLayout.set_font_description Pango::FontDescription.new("Arial Narrow 23")
|
102
|
+
|
103
|
+
cr.move_to 258, 52
|
104
|
+
cr.set_source epg_now
|
105
|
+
pangoLayout.set_width 430*Pango::SCALE
|
106
|
+
title = "Special News Edition"
|
107
|
+
pangoLayout.set_text title
|
108
|
+
title += " ..."
|
109
|
+
loop do
|
110
|
+
break if pangoLayout.line_count <= 1
|
111
|
+
title = title.sub(/\S+\s+\S+$/, '') + '...'
|
112
|
+
pangoLayout.set_text title
|
113
|
+
end
|
114
|
+
cr.show_pango_layout pangoLayout
|
115
|
+
(font = pangoLayout.font_description).set_style Pango::STYLE_NORMAL
|
116
|
+
pangoLayout.set_font_description font
|
117
|
+
|
118
|
+
pangoLayout.set_width 100*Pango::SCALE
|
119
|
+
#epg now start time
|
120
|
+
pangoLayout.set_font_description Pango::FontDescription.new("Arial Narrow 13")
|
121
|
+
cr.move_to 700, 63
|
122
|
+
pangoLayout.set_text "23:45"
|
123
|
+
cr.set_source epg_now
|
124
|
+
cr.show_pango_layout pangoLayout
|
125
|
+
|
126
|
+
#epg now end time
|
127
|
+
pangoLayout.set_font_description Pango::FontDescription.new("Arial Narrow 13")
|
128
|
+
cr.move_to 1026, 63
|
129
|
+
pangoLayout.set_text "00:00"
|
130
|
+
cr.set_source epg_now
|
131
|
+
cr.show_pango_layout pangoLayout
|
132
|
+
|
133
|
+
#epg now progress bar background
|
134
|
+
cr.save
|
135
|
+
cr.set_source [0, 0, 0, 0.5]
|
136
|
+
cr.rectangle 752, 64, 259, 20
|
137
|
+
cr.clip
|
138
|
+
cr.paint
|
139
|
+
cr.restore
|
140
|
+
|
141
|
+
#epg next title
|
142
|
+
pangoLayout.set_font_description Pango::FontDescription.new("Arial Narrow 23")
|
143
|
+
cr.move_to 258, 112
|
144
|
+
cr.set_source epg_next
|
145
|
+
pangoLayout.set_width 430*Pango::SCALE
|
146
|
+
title = "Loop Broadcasts"
|
147
|
+
pangoLayout.set_text title
|
148
|
+
title += " ..."
|
149
|
+
loop do
|
150
|
+
break if pangoLayout.line_count <= 1
|
151
|
+
title = title.sub(/\S+\s+\S+$/, '') + '...'
|
152
|
+
pangoLayout.set_text title
|
153
|
+
end
|
154
|
+
cr.show_pango_layout pangoLayout
|
155
|
+
(font = pangoLayout.font_description).set_style Pango::STYLE_NORMAL
|
156
|
+
pangoLayout.set_font_description font
|
157
|
+
|
158
|
+
#epg next times
|
159
|
+
pangoLayout.set_font_description Pango::FontDescription.new("Arial Narrow 13")
|
160
|
+
pangoLayout.set_width 200*Pango::SCALE
|
161
|
+
cr.move_to 700, 122
|
162
|
+
pangoLayout.set_text "00:00 - 03:00"
|
163
|
+
cr.set_source epg_next
|
164
|
+
cr.show_pango_layout pangoLayout
|
165
|
+
|
166
|
+
|
167
|
+
|
168
|
+
|
169
|
+
file = File.join(File.dirname(__FILE__) + "/performance.1.png")
|
170
|
+
cr.target.write_to_png file
|
171
|
+
|
172
|
+
pangoLayout = nil
|
173
|
+
cr.destroy
|
174
|
+
surface.destroy
|
175
|
+
end
|
176
|
+
|
177
|
+
with_lib do
|
178
|
+
channel_name = [31.0/255, 31.0/255, 31.0/255, 1.0]
|
179
|
+
channel_num_top = [227.0/255, 227.0/255, 227.0/255, 1.0]
|
180
|
+
channel_num_bottom = [156.0/255, 156.0/255, 156.0/255, 1.0]
|
181
|
+
epg_now = [230.0/255, 230.0/255, 230.0/255, 1.0]
|
182
|
+
epg_next = [129.0/255, 129.0/255, 129.0/255, 1.0]
|
183
|
+
|
184
|
+
DynamicImage.new :w => 1239, :h => 412, :antialias => :subpixel do
|
185
|
+
table :w => 588-173-4, :h => 258, :cols => 1, :margin => [-2, 0, 0, 173] do
|
186
|
+
cell do
|
187
|
+
text "Men in Black III", :auto_dir => false, :font => "Arial Narrow bold 30", :crop_to => [2, :lines], :crop_suffix => "..."
|
188
|
+
end
|
189
|
+
cell :h => 26
|
190
|
+
cell :h => "0%" do
|
191
|
+
text "Director: Barry Sonnenfeld\nCast: Will Smith, Tommy Lee Jones, Jemaine Clement, Josh Brolin, Lady Gaga, Emma Thompson, Alice Eve, Kevin Covais, Rip Torn, Nicole Scherzinger, Mike Pyle, Justin Bieber, Tim Burton",
|
192
|
+
:font => "Arial Narrow 13", :to_fix => :crop, :crop_suffix => " ..."
|
193
|
+
end
|
194
|
+
cell do
|
195
|
+
text " \nPrice: $3.99", :font => "Arial Narrow bold 13"
|
196
|
+
end
|
197
|
+
end
|
198
|
+
block :w => 588, :h => 588-258 do
|
199
|
+
text "An alien criminal kills the young Agent K in 1969, altering the timeline, changing the Agency and placing the Earth in danger. Veteran Agent J (Will Smith) must travel back in time to 1969 to before the murder and work with the young Agent K (Josh Brolin) to save him, the Agency, the Earth and humanity itself.",
|
200
|
+
:justify => true, :to_fit => :crop, :crop_suffix => " ...", :font => "Arial Narrow 13"
|
201
|
+
end
|
202
|
+
|
203
|
+
block :w => 1239-56, :h => 168-26, :padding => [13, 28], :position => :absolute, :x => 0, :y => 0 do
|
204
|
+
text "Channel 1", :color => channel_name, :font => "Arial Narrow bold 13"
|
205
|
+
table :position => :absolute, :y => 37, :h => 99 do
|
206
|
+
cell :width => 38, :padding_right => 18, :padding_top => 37 do
|
207
|
+
text "1", :color => [:gradient_reflect, 0, 0, 0, 17, "0%", channel_num_top, "100%", channel_num_bottom], :font => "Arial Narrow 17", :align => :center
|
208
|
+
end
|
209
|
+
cell :w => 132, :bg => :aqua
|
210
|
+
cell :padding_left => 42 do
|
211
|
+
block :w => 430, :position => :absolute, :y => 2 do
|
212
|
+
text "Special News Edition", :font => "Arial Narrow 23", :to_fit => :crop, :crop_suffix => " ...", :color => epg_now
|
213
|
+
end
|
214
|
+
block :w => 430, :position => :absolute, :y => 62 do
|
215
|
+
text "Loop Broadcasts", :font => "Arial Narrow 23", :to_fit => :crop, :crop_suffix => " ...", :color => epg_next
|
216
|
+
end
|
217
|
+
end
|
218
|
+
cell :padding_left => 12 do
|
219
|
+
table :w => 361, :position => :absolute, :y => 13 do
|
220
|
+
cell :w => 52 do
|
221
|
+
text "23:45", :font => "Arial Narrow 13", :color => epg_now
|
222
|
+
end
|
223
|
+
cell :bg => [0, 0, 0, 0.5] do
|
224
|
+
end
|
225
|
+
cell :w => 50, :padding_left => 16 do
|
226
|
+
text "00:00", :font => "Arial Narrow 13", :color => epg_now
|
227
|
+
end
|
228
|
+
end
|
229
|
+
text "00:00 - 03:00", :font => "Arial Narrow 13", :color => epg_next, :position => :absolute, :y => 72
|
230
|
+
end
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
234
|
+
save! File.dirname(__FILE__) + "/performance.2.png"
|
235
|
+
end
|
236
|
+
end
|