Filename | /home/ocbnet/domain/ocbnet.ch/vhost/webmerge/htdocs/webmerge/scripts/modules/OCBNET/Spritesets/Canvas/Optimize.pm |
Statements | Executed 234912 statements in 3.73s |
Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
---|---|---|---|---|---|
12 | 1 | 1 | 6.01s | 23.2s | optimize | OCBNET::Spritesets::Canvas::Optimize::
12 | 1 | 1 | 1.25s | 2.01s | finalize | OCBNET::Spritesets::Canvas::Optimize::
1 | 1 | 1 | 4.04ms | 5.15ms | BEGIN@28 | OCBNET::Spritesets::Canvas::Optimize::
1 | 1 | 1 | 86µs | 200µs | BEGIN@10 | OCBNET::Spritesets::Canvas::Optimize::
1 | 1 | 1 | 63µs | 63µs | BEGIN@19.2 | OCBNET::Spritesets::Canvas::Optimize::
1 | 1 | 1 | 61µs | 94µs | BEGIN@11 | OCBNET::Spritesets::Canvas::Optimize::
1 | 1 | 1 | 29µs | 29µs | BEGIN@22 | OCBNET::Spritesets::Canvas::Optimize::
1 | 1 | 1 | 24µs | 24µs | BEGIN@19 | OCBNET::Spritesets::Canvas::Optimize::
1 | 1 | 1 | 22µs | 22µs | BEGIN@16 | OCBNET::Spritesets::Canvas::Optimize::
Line | State ments |
Time on line |
Calls | Time in subs |
Code |
---|---|---|---|---|---|
1 | ################################################################################################### | ||||
2 | # Copyright 2013 by Marcel Greter | ||||
3 | # This file is part of Webmerge (GPL3) | ||||
4 | #################################################################################################### | ||||
5 | # static helper functions for canvas | ||||
6 | #################################################################################################### | ||||
7 | package OCBNET::Spritesets::Canvas::Optimize; | ||||
8 | #################################################################################################### | ||||
9 | |||||
10 | 2 | 229µs | 2 | 314µs | # spent 200µs (86+114) within OCBNET::Spritesets::Canvas::Optimize::BEGIN@10 which was called:
# once (86µs+114µs) by OCBNET::Spritesets::Canvas::BEGIN@19 at line 10 # spent 200µs making 1 call to OCBNET::Spritesets::Canvas::Optimize::BEGIN@10
# spent 114µs making 1 call to strict::import |
11 | 2 | 204µs | 2 | 127µs | # spent 94µs (61+33) within OCBNET::Spritesets::Canvas::Optimize::BEGIN@11 which was called:
# once (61µs+33µs) by OCBNET::Spritesets::Canvas::BEGIN@19 at line 11 # spent 94µs making 1 call to OCBNET::Spritesets::Canvas::Optimize::BEGIN@11
# spent 33µs making 1 call to warnings::import |
12 | |||||
13 | ################################################################################################### | ||||
14 | |||||
15 | # define our version string | ||||
16 | 1 | 146µs | 1 | 22µs | # spent 22µs within OCBNET::Spritesets::Canvas::Optimize::BEGIN@16 which was called:
# once (22µs+0s) by OCBNET::Spritesets::Canvas::BEGIN@19 at line 16 # spent 22µs making 1 call to OCBNET::Spritesets::Canvas::Optimize::BEGIN@16 |
17 | |||||
18 | # load exporter and inherit from it | ||||
19 | 3 | 400µs | 2 | 87µs | # spent 24µs within OCBNET::Spritesets::Canvas::Optimize::BEGIN@19 which was called:
# once (24µs+0s) by OCBNET::Spritesets::Canvas::BEGIN@19 at line 19
# spent 63µs within OCBNET::Spritesets::Canvas::Optimize::BEGIN@19.2 which was called:
# once (63µs+0s) by OCBNET::Spritesets::Canvas::BEGIN@19 at line 19 # spent 63µs making 1 call to OCBNET::Spritesets::Canvas::Optimize::BEGIN@19.2
# spent 24µs making 1 call to OCBNET::Spritesets::Canvas::Optimize::BEGIN@19 |
20 | |||||
21 | # define our functions to be exported | ||||
22 | 1 | 155µs | 1 | 29µs | # spent 29µs within OCBNET::Spritesets::Canvas::Optimize::BEGIN@22 which was called:
# once (29µs+0s) by OCBNET::Spritesets::Canvas::BEGIN@19 at line 22 # spent 29µs making 1 call to OCBNET::Spritesets::Canvas::Optimize::BEGIN@22 |
23 | |||||
24 | #################################################################################################### | ||||
25 | |||||
26 | # load some helper functions for parsing | ||||
27 | # ****************************************************************************** | ||||
28 | 2 | 3.80ms | 2 | 5.55ms | # spent 5.15ms (4.04+1.11) within OCBNET::Spritesets::Canvas::Optimize::BEGIN@28 which was called:
# once (4.04ms+1.11ms) by OCBNET::Spritesets::Canvas::BEGIN@19 at line 28 # spent 5.15ms making 1 call to OCBNET::Spritesets::Canvas::Optimize::BEGIN@28
# spent 394µs making 1 call to Exporter::import |
29 | |||||
30 | #################################################################################################### | ||||
31 | |||||
32 | # get the boxes some padding according to the sprite | ||||
33 | # configuration (by looking at the background position) | ||||
34 | # ****************************************************************************** | ||||
35 | sub optimize | ||||
36 | # spent 23.2s (6.01+17.2) within OCBNET::Spritesets::Canvas::Optimize::optimize which was called 12 times, avg 1.93s/call:
# 12 times (6.01s+17.2s) by OCBNET::Spritesets::CSS::Parser::optimize at line 309 of webmerge/scripts/modules/OCBNET/Spritesets/CSS/Parser.pm, avg 1.93s/call | ||||
37 | # get our object | ||||
38 | 12 | 55µs | my ($self) = shift; | ||
39 | |||||
40 | # process each area in canvas | ||||
41 | # foreach my $area ($self->areas) | ||||
42 | { | ||||
43 | |||||
44 | # process each sprite from area | ||||
45 | 24 | 136µs | foreach my $sprite (@{$self->{'sprites'}}) | ||
46 | { | ||||
47 | |||||
48 | # get associated selector from current sprite | ||||
49 | 4928 | 28.1ms | my $selector = $sprite->{'selector'} || next; | ||
50 | |||||
51 | # create dimensions object and fill it with | ||||
52 | # min, max and actual value set in css styles | ||||
53 | 9856 | 31.9ms | my %dim; foreach my $dim ('width', 'height') | ||
54 | { | ||||
55 | 9856 | 238ms | 19712 | 4.74s | my $val = fromPx($selector->style($dim) || 0); # spent 4.00s making 9856 calls to OCBNET::Spritesets::CSS::Block::style, avg 406µs/call
# spent 738ms making 9856 calls to OCBNET::CSS::Parser::Base::fromPx, avg 75µs/call |
56 | 9856 | 223ms | 19712 | 2.61s | my $min = fromPx($selector->style('min-' . $dim)); # spent 2.47s making 9856 calls to OCBNET::Spritesets::CSS::Block::style, avg 251µs/call
# spent 140ms making 9856 calls to OCBNET::CSS::Parser::Base::fromPx, avg 14µs/call |
57 | 9856 | 211ms | 19712 | 2.40s | my $max = fromPx($selector->style('max-' . $dim)); # spent 2.30s making 9856 calls to OCBNET::Spritesets::CSS::Block::style, avg 234µs/call
# spent 96.4ms making 9856 calls to OCBNET::CSS::Parser::Base::fromPx, avg 10µs/call |
58 | 9856 | 8.83ms | $val = $max if defined $max && $val < $max; # extend | ||
59 | 9856 | 7.12ms | $val = $max if defined $max && $val > $max; # range | ||
60 | 9856 | 10.7ms | $val = $min if defined $min && $val < $min; # range | ||
61 | 9856 | 194ms | $dim{$dim} = { 'min' => $min, 'max' => $max, 'val' => $val }; | ||
62 | } | ||||
63 | |||||
64 | # get the block padding from the css | ||||
65 | # left/right paddings behave different regarding | ||||
66 | # background-position, as left acts as an offset but | ||||
67 | # right does not, since right aligns on the outer edge | ||||
68 | # and we can only position backgrounds relative to top/left | ||||
69 | 4928 | 114ms | 9856 | 1.40s | my $padding_top = fromPx($selector->style('padding-top') || 0) || 0; # spent 1.13s making 4928 calls to OCBNET::Spritesets::CSS::Block::style, avg 230µs/call
# spent 269ms making 4928 calls to OCBNET::CSS::Parser::Base::fromPx, avg 55µs/call |
70 | 4928 | 114ms | 9856 | 1.34s | my $padding_left = fromPx($selector->style('padding-left') || 0) || 0; # spent 1.12s making 4928 calls to OCBNET::Spritesets::CSS::Block::style, avg 227µs/call
# spent 222ms making 4928 calls to OCBNET::CSS::Parser::Base::fromPx, avg 45µs/call |
71 | 4928 | 113ms | 9856 | 1.48s | my $padding_right = fromPx($selector->style('padding-right') || 0) || 0; # spent 1.26s making 4928 calls to OCBNET::Spritesets::CSS::Block::style, avg 256µs/call
# spent 220ms making 4928 calls to OCBNET::CSS::Parser::Base::fromPx, avg 45µs/call |
72 | 4928 | 112ms | 9856 | 1.47s | my $padding_bottom = fromPx($selector->style('padding-bottom') || 0) || 0; # spent 1.22s making 4928 calls to OCBNET::Spritesets::CSS::Block::style, avg 247µs/call
# spent 252ms making 4928 calls to OCBNET::CSS::Parser::Base::fromPx, avg 51µs/call |
73 | |||||
74 | # adjust all three values for padding | ||||
75 | 4928 | 25.3ms | foreach my $key ('min', 'max', 'val') | ||
76 | { | ||||
77 | # add the padding to get the actual outer dimensions | ||||
78 | 14784 | 68.1ms | $dim{'width'}->{$key} += $padding_left + $padding_right; | ||
79 | 14784 | 70.9ms | $dim{'height'}->{$key} += $padding_top + $padding_bottom; | ||
80 | } | ||||
81 | |||||
82 | # sprite is left aligned | ||||
83 | 4928 | 96.7ms | 6080 | 220ms | if ($sprite->alignLeft) # spent 203ms making 4928 calls to OCBNET::Spritesets::Sprite::alignLeft, avg 41µs/call
# spent 6.48ms making 432 calls to OCBNET::Spritesets::Sprite::isFixedX, avg 15µs/call
# spent 3.60ms making 240 calls to OCBNET::Spritesets::Sprite::scaleX, avg 15µs/call
# spent 3.57ms making 240 calls to OCBNET::Spritesets::Block::width, avg 15µs/call
# spent 3.10ms making 240 calls to OCBNET::Spritesets::Block::paddingLeft, avg 13µs/call |
84 | { | ||||
85 | # add some padding to offset the actual sprite | ||||
86 | 4496 | 113ms | 8992 | 110ms | $sprite->paddingLeft = $sprite->positionX; # spent 55.4ms making 4496 calls to OCBNET::Spritesets::Sprite::positionX, avg 12µs/call
# spent 55.0ms making 4496 calls to OCBNET::Spritesets::Block::paddingLeft, avg 12µs/call |
87 | # add more padding to the right to make sure we will fill out the whole available width (if width is not set, result will be negative) | ||||
88 | 4496 | 245ms | 17984 | 221ms | $sprite->paddingRight = $dim{'width'}->{'val'} - $sprite->positionX - $sprite->width / $sprite->scaleX if $dim{'width'}->{'val'}; # spent 67.1ms making 4496 calls to OCBNET::Spritesets::Sprite::scaleX, avg 15µs/call
# spent 55.4ms making 4496 calls to OCBNET::Spritesets::Block::width, avg 12µs/call
# spent 50.7ms making 4496 calls to OCBNET::Spritesets::Block::paddingRight, avg 11µs/call
# spent 48.1ms making 4496 calls to OCBNET::Spritesets::Sprite::positionX, avg 11µs/call |
89 | } | ||||
90 | # is right but has fixed dimension | ||||
91 | # we can translate this to left align | ||||
92 | elsif ($sprite->isFixedX) | ||||
93 | { | ||||
94 | # problem is we cannot change position as we are not yet distributed! | ||||
95 | $sprite->paddingLeft = $dim{'width'}->{'val'} - $sprite->width / $sprite->scaleX; | ||||
96 | } | ||||
97 | |||||
98 | # create padding if it's offset from top | ||||
99 | 4928 | 87.0ms | 6080 | 233ms | if ($sprite->alignTop) # spent 218ms making 4928 calls to OCBNET::Spritesets::Sprite::alignTop, avg 44µs/call
# spent 5.89ms making 432 calls to OCBNET::Spritesets::Sprite::isFixedY, avg 14µs/call
# spent 3.61ms making 240 calls to OCBNET::Spritesets::Sprite::scaleY, avg 15µs/call
# spent 3.13ms making 240 calls to OCBNET::Spritesets::Block::height, avg 13µs/call
# spent 2.89ms making 240 calls to OCBNET::Spritesets::Block::paddingTop, avg 12µs/call |
100 | { | ||||
101 | # add some padding to offset the actual sprite | ||||
102 | 4496 | 109ms | 8992 | 103ms | $sprite->paddingTop = $sprite->positionY; # spent 51.6ms making 4496 calls to OCBNET::Spritesets::Block::paddingTop, avg 11µs/call
# spent 51.2ms making 4496 calls to OCBNET::Spritesets::Sprite::positionY, avg 11µs/call |
103 | # add more padding to the bottom to make sure we will fill out the whole available height (if height is not set, result will be negative) | ||||
104 | 4496 | 236ms | 17984 | 214ms | $sprite->paddingBottom = $dim{'height'}->{'val'} - $sprite->positionY - $sprite->height / $sprite->scaleY if $dim{'height'}->{'val'}; # spent 66.3ms making 4496 calls to OCBNET::Spritesets::Sprite::scaleY, avg 15µs/call
# spent 50.8ms making 4496 calls to OCBNET::Spritesets::Block::height, avg 11µs/call
# spent 50.7ms making 4496 calls to OCBNET::Spritesets::Block::paddingBottom, avg 11µs/call
# spent 46.2ms making 4496 calls to OCBNET::Spritesets::Sprite::positionY, avg 10µs/call |
105 | } | ||||
106 | # is right but has fixed dimension | ||||
107 | elsif ($sprite->isFixedY) | ||||
108 | { | ||||
109 | # problem is we cannot change position as we are not yet distributed! | ||||
110 | $sprite->paddingTop = $dim{'height'}->{'val'} - $sprite->height / $sprite->scaleY; | ||||
111 | } | ||||
112 | |||||
113 | # adjust the padding to account for scaling | ||||
114 | 4928 | 107ms | 9856 | 112ms | $sprite->paddingTop *= $sprite->scaleY; # spent 60.4ms making 4928 calls to OCBNET::Spritesets::Sprite::scaleY, avg 12µs/call
# spent 51.2ms making 4928 calls to OCBNET::Spritesets::Block::paddingTop, avg 10µs/call |
115 | 4928 | 105ms | 9856 | 111ms | $sprite->paddingLeft *= $sprite->scaleX; # spent 60.5ms making 4928 calls to OCBNET::Spritesets::Sprite::scaleX, avg 12µs/call
# spent 50.4ms making 4928 calls to OCBNET::Spritesets::Block::paddingLeft, avg 10µs/call |
116 | 4928 | 99.9ms | 9856 | 109ms | $sprite->paddingRight *= $sprite->scaleX; # spent 58.7ms making 4928 calls to OCBNET::Spritesets::Sprite::scaleX, avg 12µs/call
# spent 50.0ms making 4928 calls to OCBNET::Spritesets::Block::paddingRight, avg 10µs/call |
117 | 4928 | 102ms | 9856 | 109ms | $sprite->paddingBottom *= $sprite->scaleY; # spent 58.8ms making 4928 calls to OCBNET::Spritesets::Sprite::scaleY, avg 12µs/call
# spent 50.6ms making 4928 calls to OCBNET::Spritesets::Block::paddingBottom, avg 10µs/call |
118 | |||||
119 | # make sure we dont have any negative paddings | ||||
120 | # fixes wrong calculation if no dimension is given | ||||
121 | 4928 | 70.4ms | 4928 | 48.8ms | $sprite->paddingTop = 0 if $sprite->paddingTop < 0; # spent 48.8ms making 4928 calls to OCBNET::Spritesets::Block::paddingTop, avg 10µs/call |
122 | 4928 | 52.6ms | 4928 | 50.2ms | $sprite->paddingLeft = 0 if $sprite->paddingLeft < 0; # spent 50.2ms making 4928 calls to OCBNET::Spritesets::Block::paddingLeft, avg 10µs/call |
123 | 4928 | 49.5ms | 4948 | 49.2ms | $sprite->paddingRight = 0 if $sprite->paddingRight < 0; # spent 49.2ms making 4948 calls to OCBNET::Spritesets::Block::paddingRight, avg 10µs/call |
124 | 4928 | 151ms | 4948 | 50.0ms | $sprite->paddingBottom = 0 if $sprite->paddingBottom < 0; # spent 50.0ms making 4948 calls to OCBNET::Spritesets::Block::paddingBottom, avg 10µs/call |
125 | |||||
126 | } | ||||
127 | # EO each sprite | ||||
128 | |||||
129 | } | ||||
130 | # Eo each area | ||||
131 | |||||
132 | # make chainable | ||||
133 | 12 | 225µs | return $self; | ||
134 | |||||
135 | } | ||||
136 | # EO sub optimize | ||||
137 | |||||
138 | ################################################################################################### | ||||
139 | |||||
140 | # sprites have been distributed, so we now can | ||||
141 | # start to translate bottom/right positioned sprites | ||||
142 | # in fixed dimension boxes to top/left aligned sprites | ||||
143 | # ****************************************************************************** | ||||
144 | sub finalize | ||||
145 | # spent 2.01s (1.25+768ms) within OCBNET::Spritesets::Canvas::Optimize::finalize which was called 12 times, avg 168ms/call:
# 12 times (1.25s+768ms) by OCBNET::Spritesets::CSS::Parser::finalize at line 350 of webmerge/scripts/modules/OCBNET/Spritesets/CSS/Parser.pm, avg 168ms/call | ||||
146 | |||||
147 | # get our object | ||||
148 | 12 | 54µs | my ($self) = shift; | ||
149 | |||||
150 | # process all sprites on this canvas | ||||
151 | 12 | 119µs | foreach my $sprite (@{$self->{'sprites'}}) | ||
152 | { | ||||
153 | |||||
154 | # get associated selector from current sprite | ||||
155 | # my $selector = $sprite->{'selector'} || next; | ||||
156 | |||||
157 | # is right aligned and has fixed dimension | ||||
158 | # this can be translated to a left alignment | ||||
159 | 4928 | 63.4ms | 6080 | 163ms | if ($sprite->alignRight && $sprite->isFixedX) # spent 150ms making 4928 calls to OCBNET::Spritesets::Sprite::alignRight, avg 30µs/call
# spent 5.08ms making 432 calls to OCBNET::Spritesets::Sprite::isFixedX, avg 12µs/call
# spent 2.86ms making 240 calls to OCBNET::Spritesets::Sprite::scaleX, avg 12µs/call
# spent 2.43ms making 240 calls to OCBNET::Spritesets::Block::paddingLeft, avg 10µs/call
# spent 2.38ms making 240 calls to OCBNET::Spritesets::Sprite::positionX, avg 10µs/call |
160 | { $sprite->positionX = $sprite->paddingLeft / $sprite->scaleX; } | ||||
161 | |||||
162 | # is bottom aligned and has fixed dimension | ||||
163 | # this can be translated to a top alignment | ||||
164 | 4928 | 62.9ms | 6080 | 166ms | if ($sprite->alignBottom && $sprite->isFixedY) # spent 154ms making 4928 calls to OCBNET::Spritesets::Sprite::alignBottom, avg 31µs/call
# spent 4.84ms making 432 calls to OCBNET::Spritesets::Sprite::isFixedY, avg 11µs/call
# spent 2.89ms making 240 calls to OCBNET::Spritesets::Sprite::scaleY, avg 12µs/call
# spent 2.42ms making 240 calls to OCBNET::Spritesets::Sprite::positionY, avg 10µs/call
# spent 2.38ms making 240 calls to OCBNET::Spritesets::Block::paddingTop, avg 10µs/call |
165 | { $sprite->positionY = $sprite->paddingTop / $sprite->scaleY; } | ||||
166 | |||||
167 | # add some safety margin | ||||
168 | 4928 | 99.0ms | 9856 | 112ms | $sprite->paddingTop += $sprite->scaleY; # spent 61.3ms making 4928 calls to OCBNET::Spritesets::Sprite::scaleY, avg 12µs/call
# spent 50.6ms making 4928 calls to OCBNET::Spritesets::Block::paddingTop, avg 10µs/call |
169 | 4928 | 99.1ms | 9856 | 110ms | $sprite->paddingLeft += $sprite->scaleX; # spent 60.2ms making 4928 calls to OCBNET::Spritesets::Sprite::scaleX, avg 12µs/call
# spent 50.1ms making 4928 calls to OCBNET::Spritesets::Block::paddingLeft, avg 10µs/call |
170 | # add some more safety margin | ||||
171 | 4928 | 97.2ms | 9856 | 107ms | $sprite->paddingRight += $sprite->scaleX; # spent 58.3ms making 4928 calls to OCBNET::Spritesets::Sprite::scaleX, avg 12µs/call
# spent 49.2ms making 4928 calls to OCBNET::Spritesets::Block::paddingRight, avg 10µs/call |
172 | 4928 | 116ms | 9856 | 110ms | $sprite->paddingBottom += $sprite->scaleY; # spent 58.7ms making 4928 calls to OCBNET::Spritesets::Sprite::scaleY, avg 12µs/call
# spent 51.1ms making 4928 calls to OCBNET::Spritesets::Block::paddingBottom, avg 10µs/call |
173 | |||||
174 | } | ||||
175 | # EO each sprite | ||||
176 | |||||
177 | # make chainable | ||||
178 | 12 | 257µs | return $self; | ||
179 | |||||
180 | } | ||||
181 | # EO sub optimize | ||||
182 | |||||
183 | #################################################################################################### | ||||
184 | #################################################################################################### | ||||
185 | 1 | 13µs | 1; |