← Index
NYTProf Performance Profile   « line view »
For webmerge/scripts/webmerge.pl
  Run on Mon Oct 7 02:42:42 2013
Reported on Mon Oct 7 03:03:19 2013

Filename/home/ocbnet/domain/ocbnet.ch/vhost/webmerge/htdocs/webmerge/scripts/modules/OCBNET/Spritesets/CSS/Parser.pm
StatementsExecuted 444529 statements in 79.5s
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
246804155.1s55.1sOCBNET::Spritesets::CSS::Parser::::CORE:matchOCBNET::Spritesets::CSS::Parser::CORE:match (opcode)
24115.11s19.6sOCBNET::Spritesets::CSS::Parser::::processOCBNET::Spritesets::CSS::Parser::process
24114.31s87.4sOCBNET::Spritesets::CSS::Parser::::readOCBNET::Spritesets::CSS::Parser::read
24113.05s37.8sOCBNET::Spritesets::CSS::Parser::::loadOCBNET::Spritesets::CSS::Parser::load
24111.79s7.45sOCBNET::Spritesets::CSS::Parser::::rehashOCBNET::Spritesets::CSS::Parser::rehash
3510851437ms437msOCBNET::Spritesets::CSS::Parser::::CORE:substOCBNET::Spritesets::CSS::Parser::CORE:subst (opcode)
1932841428ms428msOCBNET::Spritesets::CSS::Parser::::toPxOCBNET::Spritesets::CSS::Parser::toPx
4042851256ms256msOCBNET::Spritesets::CSS::Parser::::CORE:regcompOCBNET::Spritesets::CSS::Parser::CORE:regcomp (opcode)
877631153ms153msOCBNET::Spritesets::CSS::Parser::::CORE:qrOCBNET::Spritesets::CSS::Parser::CORE:qr (opcode)
40081192.1ms92.1msOCBNET::Spritesets::CSS::Parser::::toUrlOCBNET::Spritesets::CSS::Parser::toUrl
40122148.4ms48.4msOCBNET::Spritesets::CSS::Parser::::spritesetOCBNET::Spritesets::CSS::Parser::spriteset
24114.72ms116sOCBNET::Spritesets::CSS::Parser::::writeOCBNET::Spritesets::CSS::Parser::write
24111.52ms30.4sOCBNET::Spritesets::CSS::Parser::::distributeOCBNET::Spritesets::CSS::Parser::distribute
96411.40ms1.40msOCBNET::Spritesets::CSS::Parser::::spritesetsOCBNET::Spritesets::CSS::Parser::spritesets
24111.39ms2.02sOCBNET::Spritesets::CSS::Parser::::finalizeOCBNET::Spritesets::CSS::Parser::finalize
24111.38ms1.38msOCBNET::Spritesets::CSS::Parser::::newOCBNET::Spritesets::CSS::Parser::new
24111.28ms23.2sOCBNET::Spritesets::CSS::Parser::::optimizeOCBNET::Spritesets::CSS::Parser::optimize
11182µs177µsOCBNET::Spritesets::CSS::Parser::::BEGIN@19OCBNET::Spritesets::CSS::Parser::BEGIN@19
11165µs234µsOCBNET::Spritesets::CSS::Parser::::BEGIN@25OCBNET::Spritesets::CSS::Parser::BEGIN@25
11162µs299µsOCBNET::Spritesets::CSS::Parser::::BEGIN@41OCBNET::Spritesets::CSS::Parser::BEGIN@41
11161µs651µsOCBNET::Spritesets::CSS::Parser::::BEGIN@40OCBNET::Spritesets::CSS::Parser::BEGIN@40
11160µs46.6msOCBNET::Spritesets::CSS::Parser::::BEGIN@30OCBNET::Spritesets::CSS::Parser::BEGIN@30
11158µs489µsOCBNET::Spritesets::CSS::Parser::::BEGIN@42OCBNET::Spritesets::CSS::Parser::BEGIN@42
11156µs630µsOCBNET::Spritesets::CSS::Parser::::BEGIN@38OCBNET::Spritesets::CSS::Parser::BEGIN@38
11156µs471µsOCBNET::Spritesets::CSS::Parser::::BEGIN@39OCBNET::Spritesets::CSS::Parser::BEGIN@39
11154µs84µsOCBNET::Spritesets::CSS::Parser::::BEGIN@20OCBNET::Spritesets::CSS::Parser::BEGIN@20
11127µs27µsOCBNET::Spritesets::CSS::Parser::::BEGIN@30.9OCBNET::Spritesets::CSS::Parser::BEGIN@30.9
0000s0sOCBNET::Spritesets::CSS::Parser::::debugOCBNET::Spritesets::CSS::Parser::debug
Call graph for these subroutines as a Graphviz dot language file.
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# this is a block which represents a stylesheet
6# a stylesheet can contain multiple spritesets
7# we will take care of reading and mangling the
8# styles for background images regarding spritesets
9####################################################################################################
10package OCBNET::Spritesets::CSS::Parser;
11####################################################################################################
12# my $css = OCBNET::Spritesets::CSS::Parser->new($config);
13# $css->read($data)->rehash->load;
14# $css->optimize->distribute->finalize;
15# my $written = $css->write($writer);
16# my $data = $css->process->render;
17####################################################################################################
18
192147µs2273µs
# spent 177µs (82+96) within OCBNET::Spritesets::CSS::Parser::BEGIN@19 which was called: # once (82µs+96µs) by OCBNET::Spritesets::BEGIN@33 at line 19
use strict;
# spent 177µs making 1 call to OCBNET::Spritesets::CSS::Parser::BEGIN@19 # spent 96µs making 1 call to strict::import
202202µs2115µs
# spent 84µs (54+31) within OCBNET::Spritesets::CSS::Parser::BEGIN@20 which was called: # once (54µs+31µs) by OCBNET::Spritesets::BEGIN@33 at line 20
use warnings;
# spent 84µs making 1 call to OCBNET::Spritesets::CSS::Parser::BEGIN@20 # spent 31µs making 1 call to warnings::import
21
22####################################################################################################
23
24# load function from core module
252188µs2403µs
# spent 234µs (65+169) within OCBNET::Spritesets::CSS::Parser::BEGIN@25 which was called: # once (65µs+169µs) by OCBNET::Spritesets::BEGIN@33 at line 25
use List::MoreUtils qw(uniq);
# spent 234µs making 1 call to OCBNET::Spritesets::CSS::Parser::BEGIN@25 # spent 169µs making 1 call to Exporter::import
26
27####################################################################################################
28
29# we are ourself the root css block
303321µs393.2ms
# spent 46.6ms (60µs+46.6) within OCBNET::Spritesets::CSS::Parser::BEGIN@30 which was called: # once (60µs+46.6ms) by OCBNET::Spritesets::BEGIN@33 at line 30 # spent 27µs within OCBNET::Spritesets::CSS::Parser::BEGIN@30.9 which was called: # once (27µs+0s) by OCBNET::Spritesets::BEGIN@33 at line 30
BEGIN { use base 'OCBNET::Spritesets::CSS::Block'; }
# spent 46.6ms making 1 call to OCBNET::Spritesets::CSS::Parser::BEGIN@30 # spent 46.6ms making 1 call to base::import # spent 27µs making 1 call to OCBNET::Spritesets::CSS::Parser::BEGIN@30.9
31
32####################################################################################################
33
34# load base classes for later instantiation
3514µsrequire OCBNET::Spritesets::CSS::Collection;
36
37# load dependencies and import globals and functions
382188µs21.20ms
# spent 630µs (56+574) within OCBNET::Spritesets::CSS::Parser::BEGIN@38 which was called: # once (56µs+574µs) by OCBNET::Spritesets::BEGIN@33 at line 38
use OCBNET::CSS::Parser::CSS qw($parse_blocks);
# spent 630µs making 1 call to OCBNET::Spritesets::CSS::Parser::BEGIN@38 # spent 574µs making 1 call to Exporter::import
392176µs2887µs
# spent 471µs (56+415) within OCBNET::Spritesets::CSS::Parser::BEGIN@39 which was called: # once (56µs+415µs) by OCBNET::Spritesets::BEGIN@33 at line 39
use OCBNET::CSS::Parser::CSS qw($parse_definition);
# spent 471µs making 1 call to OCBNET::Spritesets::CSS::Parser::BEGIN@39 # spent 415µs making 1 call to Exporter::import
402208µs21.24ms
# spent 651µs (61+590) within OCBNET::Spritesets::CSS::Parser::BEGIN@40 which was called: # once (61µs+590µs) by OCBNET::Spritesets::BEGIN@33 at line 40
use OCBNET::CSS::Parser::Base qw($re_comment uncomment);
# spent 651µs making 1 call to OCBNET::Spritesets::CSS::Parser::BEGIN@40 # spent 590µs making 1 call to Exporter::import
412173µs2535µs
# spent 299µs (62+236) within OCBNET::Spritesets::CSS::Parser::BEGIN@41 which was called: # once (62µs+236µs) by OCBNET::Spritesets::BEGIN@33 at line 41
use OCBNET::CSS::Parser::Base qw(fromPx fromUrl fromPosition);
# spent 299µs making 1 call to OCBNET::Spritesets::CSS::Parser::BEGIN@41 # spent 236µs making 1 call to Exporter::import
42210.5ms2920µs
# spent 489µs (58+431) within OCBNET::Spritesets::CSS::Parser::BEGIN@42 which was called: # once (58µs+431µs) by OCBNET::Spritesets::BEGIN@33 at line 42
use OCBNET::CSS::Parser::Selectors qw($re_css_selector_rules);
# spent 489µs making 1 call to OCBNET::Spritesets::CSS::Parser::BEGIN@42 # spent 431µs making 1 call to Exporter::import
43
44####################################################################################################
45
46# helper methods for css stuff
4719328646ms
# spent 428ms within OCBNET::Spritesets::CSS::Parser::toPx which was called 19328 times, avg 22µs/call: # 4928 times (177ms+0s) by OCBNET::Spritesets::CSS::Parser::process at line 511, avg 36µs/call # 4928 times (111ms+0s) by OCBNET::Spritesets::CSS::Parser::process at line 512, avg 22µs/call # 4736 times (70.9ms+0s) by OCBNET::Spritesets::CSS::Parser::process at line 515, avg 15µs/call # 4736 times (69.4ms+0s) by OCBNET::Spritesets::CSS::Parser::process at line 516, avg 15µs/call
sub toPx { sprintf '%spx', @_; }
484008175ms
# spent 92.1ms within OCBNET::Spritesets::CSS::Parser::toUrl which was called 4008 times, avg 23µs/call: # 4008 times (92.1ms+0s) by OCBNET::Spritesets::CSS::Parser::process at line 469, avg 23µs/call
sub toUrl { sprintf "url('%s')", @_; }
49
50####################################################################################################
51
52# constructor
53# ******************************************************************************
54sub new
55
# spent 1.38ms within OCBNET::Spritesets::CSS::Parser::new which was called 24 times, avg 57µs/call: # 24 times (1.38ms+0s) by RTP::Webmerge::Process::CSS::Spritesets::spritesets at line 49 of webmerge/scripts/modules/RTP/Webmerge/Process/CSS/Spritesets.pm, avg 57µs/call
{
56
57 # get passed variables
5824117µs my ($pckg, $config) = @_;
59
60 # init object
6124725µs my $self = {
62 # store id blocks
63 'ids' => {},
64 # the header part
65 'head' => '',
66 # all subparts
67 'blocks' => [],
68 # the footer part
69 'footer' => '',
70 # spritesets by name
71 'spritesets' => {},
72 # config from outside
73 # only debug implemented
74 'config' => $config || {}
75 };
76
77 # bless into package
7824864µs return bless $self, $pckg;
79
80}
81# EO constructor
82
83####################################################################################################
84
85# read some css block data
86# parse out selector blocks
87# ******************************************************************************
88sub read
89
# spent 87.4s (4.31+83.1) within OCBNET::Spritesets::CSS::Parser::read which was called 24 times, avg 3.64s/call: # 24 times (4.31s+83.1s) by RTP::Webmerge::Process::CSS::Spritesets::spritesets at line 102 of webmerge/scripts/modules/RTP/Webmerge/Process/CSS/Spritesets.pm, avg 3.64s/call
{
90
91 # get text as data ref
9224103µs my ($self, $data) = @_;
93
94 # parse all blocks and end when all is parsed
95241.26ms4815.5s $parse_blocks->($data, $self, qr/\A\z/);
# spent 15.5s making 24 calls to OCBNET::CSS::Parser::CSS::__ANON__[webmerge/scripts/modules/OCBNET/CSS/Parser/CSS.pm:175], avg 646ms/call # spent 407µs making 24 calls to OCBNET::Spritesets::CSS::Parser::CORE:qr, avg 17µs/call
96
97 # assertion in any case (should never happen?)
982487µs die "Fatal: not everything parsed" if ${$data} ne '';
99
100 # put all blocks in a flat array
101242.02ms242.20ms my @blocks = ($self, $self->blocks);
# spent 2.20ms making 24 calls to OCBNET::Spritesets::CSS::Block::blocks, avg 92µs/call
102 # this will process all and each sub block
10324264ms20120206ms for (my $i = 0; $i < scalar(@blocks); $i ++)
# spent 206ms making 20120 calls to OCBNET::Spritesets::CSS::Block::blocks, avg 10µs/call
104 { push @blocks, $blocks[$i]->blocks; }
105
106 # make blocks unique
1072471.2ms2452.9ms @blocks = uniq @blocks;
# spent 52.9ms making 24 calls to List::MoreUtils::uniq, avg 2.20ms/call
108
109 # reset block type arrays
11024769µs $self->{'others'} = [];
11124230µs $self->{'selectors'} = [];
112
113 # find selector blocks
11424208µs foreach my $block (@blocks)
115 {
116 # check if the head only consists of selector rules, comments and whitespace
1171007255.6s4028855.9s if (uncomment($block->head) =~ m/(?:\A|;)\s*(?:$re_css_selector_rules|\s+)+$/s)
# spent 55.0s making 10072 calls to OCBNET::Spritesets::CSS::Parser::CORE:match, avg 5.46ms/call # spent 732ms making 10072 calls to OCBNET::CSS::Parser::Base::uncomment, avg 73µs/call # spent 154ms making 10072 calls to OCBNET::Spritesets::CSS::Block::head, avg 15µs/call # spent 87.3ms making 10072 calls to OCBNET::Spritesets::CSS::Parser::CORE:regcomp, avg 9µs/call
11820072151ms { $block->{'selector'} = 1; push @{$self->{'selectors'}}, $block }
11972508µs else { $block->{'selector'} = 0; push @{$self->{'others'}}, $block }
120 }
121
122 # now process each block
123 # find configured spritesets
12424151µs foreach my $block (@blocks)
125 {
126
127 # get the block text
12810072124ms100721.00s my $body = $block->text;
# spent 1.00s making 10072 calls to OCBNET::Spritesets::CSS::Block::text, avg 99µs/call
129
130 # parse comments for block options
13110072846ms30712209ms while ($body =~ s/$re_comment//s)
# spent 132ms making 15356 calls to OCBNET::Spritesets::CSS::Parser::CORE:subst, avg 9µs/call # spent 76.1ms making 15356 calls to OCBNET::Spritesets::CSS::Parser::CORE:regcomp, avg 5µs/call
132 {
133
134 # create a new css collection object to store options
1355296107ms529675.8ms my $options = new OCBNET::Spritesets::CSS::Collection;
# spent 75.8ms making 5296 calls to OCBNET::Spritesets::CSS::Collection::new, avg 14µs/call
136
137 # parse options for spriteset
138529649.1ms52961.21s $parse_definition->($options, $1);
139
140 # check if this comment is meant for us
141529694.0ms529668.7ms next unless $options->defined('sprite-image');
# spent 68.7ms making 5296 calls to OCBNET::Spritesets::CSS::Collection::defined, avg 13µs/call
142
143 # check if the sprite image has an associated id
14412141µs12156µs die "sprite image has no id" unless $options->defined('css-id');
# spent 156µs making 12 calls to OCBNET::Spritesets::CSS::Collection::defined, avg 13µs/call
145
146 # get the id of this spriteset
1471249µs my $id = $options->{'css-id'};
148
149 # pass debug mode from config to options
1501298µs $options->{'debug'} = $self->{'config'}->{'debug'};
151
152 # create a new canvas object to hold all sprites
15312304µs12165ms my $canvas = new OCBNET::Spritesets::Canvas(undef, $options);
# spent 165ms making 12 calls to OCBNET::Spritesets::Canvas::new, avg 13.8ms/call
154
155 # add canvas to global hash object
15612183µs12228µs $self->spriteset($id) = $canvas;
# spent 228µs making 12 calls to OCBNET::Spritesets::CSS::Parser::spriteset, avg 19µs/call
157
158 # associate canvas with block
1591245µs $block->{'canvas'} = $canvas;
160
161 # store the id for canvas
16212818µs24338µs $canvas->{'id'} = $id;
# spent 219µs making 12 calls to OCBNET::Spritesets::CSS::Parser::CORE:subst, avg 18µs/call # spent 119µs making 12 calls to OCBNET::Spritesets::CSS::Parser::CORE:regcomp, avg 10µs/call
163
164 }
165 # EO each comment
166
167 }
168 # EO each block
169
170 # now process each selector and parse options
17124207µs foreach my $selector (@{$self->{'selectors'}})
172 {
173
174 # get body text to parse
17510036134ms10036833ms my $body = $selector->text;
# spent 833ms making 10036 calls to OCBNET::Spritesets::CSS::Block::text, avg 83µs/call
176
177 # parse all comments into options hash
17810036629ms20072176ms while ($body =~ s/$re_comment//s)
# spent 117ms making 10036 calls to OCBNET::Spritesets::CSS::Parser::CORE:subst, avg 12µs/call # spent 58.4ms making 10036 calls to OCBNET::Spritesets::CSS::Parser::CORE:regcomp, avg 6µs/call
1794952356ms148561.37s { $parse_definition->($selector->{'options'}, $1); }
# spent 1.31s making 4952 calls to OCBNET::CSS::Parser::CSS::__ANON__[webmerge/scripts/modules/OCBNET/CSS/Parser/CSS.pm:82], avg 265µs/call # spent 34.0ms making 4952 calls to OCBNET::Spritesets::CSS::Parser::CORE:regcomp, avg 7µs/call # spent 18.7ms making 4952 calls to OCBNET::Spritesets::CSS::Parser::CORE:subst, avg 4µs/call
180
181 # now parse remaining style options
18210036150ms100366.30s $parse_definition->($selector->{'styles'}, $body);
183
184 }
185 # EO each selector
186
187 # return object
188242.89ms return $self;
189
190}
191# EO sub read
192
193####################################################################################################
194
195# rehash the block references
196# ***************************************************************************************
197sub rehash
198
# spent 7.45s (1.79+5.66) within OCBNET::Spritesets::CSS::Parser::rehash which was called 24 times, avg 310ms/call: # 24 times (1.79s+5.66s) by RTP::Webmerge::Process::CSS::Spritesets::spritesets at line 102 of webmerge/scripts/modules/RTP/Webmerge/Process/CSS/Spritesets.pm, avg 310ms/call
{
199
200 # get our object
2012498µs my ($self) = @_;
202
203 # now process each selector and setup references
20424210µs foreach my $selector (@{$self->{'selectors'}})
205 {
206 # get css id for this block for inheritance
20710036207ms20072988ms my $css_id = $selector->options->get('css-id');
# spent 874ms making 10036 calls to OCBNET::Spritesets::CSS::Collection::get, avg 87µs/call # spent 113ms making 10036 calls to OCBNET::Spritesets::CSS::Block::options, avg 11µs/call
208 # setup relationships between references blocks
2091003630.3ms $self->{'ids'}->{$css_id} = $selector if defined $css_id;
210 }
211
212 # now process each selector and setup references
21324175µs foreach my $selector (@{$self->{'selectors'}})
214 {
215 # get own id and reference id
21610036195ms200721.04s my $ref_id = $selector->options->get('css-ref');
# spent 924ms making 10036 calls to OCBNET::Spritesets::CSS::Collection::get, avg 92µs/call # spent 112ms making 10036 calls to OCBNET::Spritesets::CSS::Block::options, avg 11µs/call
217 # allow multiple refs per block via comma delimited list
2181003690.5ms push @{$selector->{'ref'}}, map { $self->{'ids'}->{$_} }
219 split(/\s*,\s*/, $ref_id) if (defined $ref_id);
220 # remove undefined references (maybe print a warning)
2211003685.7ms @{$selector->{'ref'}} = grep { defined $_ } @{$selector->{'ref'}};
222 }
223
224 # now process each selector and setup references
22524161µs foreach my $selector (@{$self->{'selectors'}})
226 {
22710036303ms271363.64s if (! $selector->canvas && $selector->option('css-ref'))
# spent 3.33s making 13100 calls to OCBNET::Spritesets::CSS::Block::option, avg 254µs/call # spent 256ms making 10036 calls to OCBNET::Spritesets::CSS::Block::canvas, avg 25µs/call # spent 48.1ms making 4000 calls to OCBNET::Spritesets::CSS::Parser::spriteset, avg 12µs/call
228 { $selector->{'canvas'} = $self->spriteset($selector->option('css-ref')); }
229 }
230
231 # allow chaining
23224418µs return $self;
233
234}
235# EO sub rehash
236
237####################################################################################################
238
239# styles have been readed, so we now can start to
240# load all sprites and setup relation to its css block
241# ***************************************************************************************
242sub load
243
# spent 37.8s (3.05+34.8) within OCBNET::Spritesets::CSS::Parser::load which was called 24 times, avg 1.58s/call: # 24 times (3.05s+34.8s) by RTP::Webmerge::Process::CSS::Spritesets::spritesets at line 102 of webmerge/scripts/modules/RTP/Webmerge/Process/CSS/Spritesets.pm, avg 1.58s/call
{
244
245 # get our object
24624126µs my ($self) = @_;
247
248 # now process each selector and setup sprites
249246.51ms foreach my $selector (@{$self->{'selectors'}})
250 {
251
252 # check if this selector block has a background
25310036179ms100362.92s next unless $selector->style('background-image');
# spent 2.92s making 10036 calls to OCBNET::Spritesets::CSS::Block::style, avg 291µs/call
254
255 # get associated spriteset canvas
256492872.9ms4928176ms my $canvas = $selector->canvas || next;
# spent 176ms making 4928 calls to OCBNET::Spritesets::CSS::Block::canvas, avg 36µs/call
257
258 # create a new sprite and setup most options
25949281.29s8377631.6s my $sprite = new OCBNET::Spritesets::Sprite({
# spent 20.1s making 44352 calls to OCBNET::Spritesets::CSS::Block::style, avg 452µs/call # spent 8.92s making 4928 calls to OCBNET::Spritesets::Sprite::new, avg 1.81ms/call # spent 1.04s making 4928 calls to OCBNET::CSS::Parser::Base::fromUrl, avg 211µs/call # spent 981ms making 19712 calls to OCBNET::CSS::Parser::Base::fromPx, avg 50µs/call # spent 582ms making 9856 calls to OCBNET::CSS::Parser::Base::fromPosition, avg 59µs/call
260 # pass debug mode from config
261 # will draw funky color backgrounds
262 'debug' => $self->{'config'}->{'debug'},
263 # get the filename from the url (must be "normalized")
264 'filename' => fromUrl($selector->style('background-image')),
265 # the size the sprite is actually shown in (from css styles)
266 'size-x' => fromPx($selector->style('background-size-x')) || undef,
267 'size-y' => fromPx($selector->style('background-size-y')) || undef,
268 # set repeat options to decide where to ditribute
269 'repeat-x' => $selector->style('background-repeat-x') || 0,
270 'repeat-y' => $selector->style('background-repeat-y') || 0,
271 # set enclosed options to decide where to ditribute
272 'enclosed-x' => fromPx($selector->style('width') || 0) || 0,
273 'enclosed-y' => fromPx($selector->style('height') || 0) || 0,
274 # set position/align options to decide where to ditribute
275 'position-x' => fromPosition($selector->style('background-position-x') || 0),
276 'position-y' => fromPosition($selector->style('background-position-y') || 0)
277 });
278
279 # store sprite object on selector
280492834.2ms $selector->{'sprite'} = $sprite;
281
282 # and also store the selector on the sprite
283492815.4ms $sprite->{'selector'} = $selector;
284
285 # add sprite to canvas
2864928122ms4928108ms $canvas->add($sprite);
# spent 108ms making 4928 calls to OCBNET::Spritesets::Canvas::add, avg 22µs/call
287
288 }
289 # EO each selector
290
291 # allow chaining
29224400µs return $self;
293
294}
295# EO sub load
296
297####################################################################################################
298
299# sprites have not been distributed, define the paddings
300# and the dimension according to the given css block styles
301# ***************************************************************************************
302sub optimize
303
# spent 23.2s (1.28ms+23.2) within OCBNET::Spritesets::CSS::Parser::optimize which was called 24 times, avg 966ms/call: # 24 times (1.28ms+23.2s) by RTP::Webmerge::Process::CSS::Spritesets::spritesets at line 103 of webmerge/scripts/modules/RTP/Webmerge/Process/CSS/Spritesets.pm, avg 966ms/call
{
304
305 # get our object
3062482µs my ($self) = @_;
307
308 # call optimize for every spriteset
30924655µs3623.2s $_->optimize foreach $self->spritesets;
# spent 23.2s making 12 calls to OCBNET::Spritesets::Canvas::Optimize::optimize, avg 1.93s/call # spent 453µs making 24 calls to OCBNET::Spritesets::CSS::Parser::spritesets, avg 19µs/call
310
311 # allow chaining
31224429µs return $self;
313
314}
315# EO sub optimize
316
317####################################################################################################
318
319# sprites have been loaded, so we now can now
320# distribute all sprites to their appropriate area
321# ***************************************************************************************
322sub distribute
323
# spent 30.4s (1.52ms+30.4) within OCBNET::Spritesets::CSS::Parser::distribute which was called 24 times, avg 1.26s/call: # 24 times (1.52ms+30.4s) by RTP::Webmerge::Process::CSS::Spritesets::spritesets at line 103 of webmerge/scripts/modules/RTP/Webmerge/Process/CSS/Spritesets.pm, avg 1.26s/call
{
324
325 # get our object
3262493µs my ($self) = @_;
327
328 # call distribute for every spriteset
32924785µs3630.4s $_->distribute foreach $self->spritesets;
# spent 30.4s making 12 calls to OCBNET::Spritesets::Canvas::Distribute::distribute, avg 2.53s/call # spent 292µs making 24 calls to OCBNET::Spritesets::CSS::Parser::spritesets, avg 12µs/call
330
331 # allow chaining
33224454µs return $self;
333
334}
335# EO sub distribute
336
337####################################################################################################
338
339# sprites have been distributed, we now can start
340# to translate bottom/right positioned sprites within
341# fixed dimension boxes into top/left aligned sprites
342# ***************************************************************************************
343sub finalize
344
# spent 2.02s (1.39ms+2.01) within OCBNET::Spritesets::CSS::Parser::finalize which was called 24 times, avg 84.0ms/call: # 24 times (1.39ms+2.01s) by RTP::Webmerge::Process::CSS::Spritesets::spritesets at line 103 of webmerge/scripts/modules/RTP/Webmerge/Process/CSS/Spritesets.pm, avg 84.0ms/call
{
345
346 # get our object
3472494µs my ($self) = @_;
348
349 # call finalize for every spriteset
35024657µs362.01s $_->finalize foreach $self->spritesets;
# spent 2.01s making 12 calls to OCBNET::Spritesets::Canvas::Optimize::finalize, avg 168ms/call # spent 343µs making 24 calls to OCBNET::Spritesets::CSS::Parser::spritesets, avg 14µs/call
351
352 # allow chaining
35324535µs return $self;
354
355}
356# EO sub finalize
357
358####################################################################################################
359
360# just print out some debug messages
361# ***************************************************************************************
362sub debug
363{
364
365 # get our object
366 my ($self) = @_;
367
368 # call debug for every spriteset
369 $_->debug foreach $self->spritesets;
370
371 # allow chaining
372 return $self;
373
374}
375# EO sub debug
376
377####################################################################################################
378
379# write out all spritesets within stylesheet
380# ***************************************************************************************
381sub write
382
# spent 116s (4.72ms+116) within OCBNET::Spritesets::CSS::Parser::write which was called 24 times, avg 4.85s/call: # 24 times (4.72ms+116s) by RTP::Webmerge::Process::CSS::Spritesets::spritesets at line 104 of webmerge/scripts/modules/RTP/Webmerge/Process/CSS/Spritesets.pm, avg 4.85s/call
{
383
384 # get passed arguments
38524116µs my ($self, $writer) = @_;
386
387 # status variable
388 # info about all writes which is
389 # used to optimize files afterwards
3902440µs my %written;
391
392 # write all registered spritesets
39324409µs24309µs foreach my $canvas ($self->spritesets)
# spent 309µs making 24 calls to OCBNET::Spritesets::CSS::Parser::spritesets, avg 13µs/call
394 {
395
396 # get name of the canvas
3971291µs my $id = $canvas->{'id'};
398
399 # get the css options for canvas
400 # they are gathered from block comments
4011232µs my $options = $canvas->{'options'};
402
403 # parse sprite image option and add to options for later use
40412532µs3628.8ms $options->set('url', fromUrl($options->get('sprite-image')));
# spent 25.3ms making 12 calls to OCBNET::Spritesets::CSS::Collection::set, avg 2.10ms/call # spent 2.04ms making 12 calls to OCBNET::CSS::Parser::Base::fromUrl, avg 170µs/call # spent 1.46ms making 12 calls to OCBNET::Spritesets::CSS::Collection::get, avg 121µs/call
405
406 # assertion that we have gotten some usefull url to store the image
40712152µs121.02ms die "no sprite image defined for <$id>" unless $options->get('url');
# spent 1.02ms making 12 calls to OCBNET::Spritesets::CSS::Collection::get, avg 85µs/call
408
409 # draw image and check for success
41012569µs24103s if (my $image = $canvas->layout->draw)
# spent 92.7s making 12 calls to OCBNET::Spritesets::Canvas::Layout::layout, avg 7.73s/call # spent 10.1s making 12 calls to OCBNET::Spritesets::Canvas::draw, avg 842ms/call
411 {
412 # set the output format
41312811µs12530µs $image->Set(magick => 'png');
# spent 530µs making 12 calls to Graphics::Magick::Set, avg 44µs/call
414 # cal image to binary object
4151213.5s1213.5s my $blob = $image->ImageToBlob();
# spent 13.5s making 12 calls to Graphics::Magick::ImageToBlob, avg 1.13s/call
416 # get the filename to store image
41712376µs121.79ms my $file = $options->get('url');
# spent 1.79ms making 12 calls to OCBNET::Spritesets::CSS::Collection::get, avg 149µs/call
418 # write through given writer function
41912275µs1223.2ms $writer->($file, $blob, \%written);
420 }
421 # EO if successfull drawn
422
423 }
424 # EO each spriteset
425
426 # return status variable
42724570µs return \%written;
428
429}
430# EO sub write
431
432####################################################################################################
433
434# process the css and prepare for write
435# this mangles the original css for rendering
436#**************************************************************************************************
437sub process
438
# spent 19.6s (5.11+14.5) within OCBNET::Spritesets::CSS::Parser::process which was called 24 times, avg 815ms/call: # 24 times (5.11s+14.5s) by RTP::Webmerge::Process::CSS::Spritesets::spritesets at line 105 of webmerge/scripts/modules/RTP/Webmerge/Process/CSS/Spritesets.pm, avg 815ms/call
{
439
440 # get passed arguments
44124102µs my ($self) = @_;
442
443 # now process each selector and setup sprites
44424222µs foreach my $selector (@{$self->{'selectors'}})
445 {
446
447 # new styles
448100368.53ms my %styles;
449
450 # selector has a canvas, this means the spriteset
451 # has been declares within this block, so render it
452 # check this directly and not with the object method
453 # this way we will really only check the local block
4541003655.8ms if ($selector->{'canvas'})
455 {
456
457 # get canvas directly from selector block
458 # this means that the spriteset was defined
459 # inline and not in referenced selector block
460400810.7ms my $canvas = $selector->{'canvas'};
461
462 # get the url of the spriteset image
463400872.1ms4008666ms my $url = $canvas->{'options'}->get('url');
# spent 666ms making 4008 calls to OCBNET::Spritesets::CSS::Collection::get, avg 166µs/call
464
465 # parse css body
466400854.7ms40084.78s $selector->parse();
# spent 4.78s making 4008 calls to OCBNET::Spritesets::CSS::Block::parse, avg 1.19ms/call
467
468 # push new declarations
469400873.3ms400892.1ms $styles{'background-image'} = toUrl($url);
# spent 92.1ms making 4008 calls to OCBNET::Spritesets::CSS::Parser::toUrl, avg 23µs/call
470400817.1ms $styles{'background-repeat'} = 'no-repeat';
471
472 # remove all background styles from selector
4734008203ms80161.56s $selector->clean(qr/background(?:\-[a-z0-9])*/);
# spent 1.49s making 4008 calls to OCBNET::Spritesets::CSS::Block::clean, avg 372µs/call # spent 70.5ms making 4008 calls to OCBNET::Spritesets::CSS::Parser::CORE:qr, avg 18µs/call
474
475 };
476 # EO each selector
477
478 # check if this selector is configured for a sprite
4791003655.2ms if ($selector->{'sprite'})
480 {
481
482 # get the sprite for selector
483492812.2ms my $sprite = $selector->{'sprite'};
484
485 # spriteset canvas of block
486492870.8ms4928178ms my $canvas = $selector->canvas;
# spent 178ms making 4928 calls to OCBNET::Spritesets::CSS::Block::canvas, avg 36µs/call
487
488 # get the url of the spriteset image
489492882.7ms4928645ms my $url = $canvas->{'options'}->get('url');
# spent 645ms making 4928 calls to OCBNET::Spritesets::CSS::Collection::get, avg 131µs/call
490
491 # get the sprite position within set
492492877.2ms49282.25s my $offset = $sprite->offset;
# spent 2.25s making 4928 calls to OCBNET::Spritesets::Sprite::offset, avg 457µs/call
493
494 # get position offset vars
495492814.7ms my $offset_x = $offset->{'x'};
49649289.30ms my $offset_y = $offset->{'y'};
497
498 # assertion that the values are defined
49949286.92ms die "no sprite x" unless defined $offset_x;
50049284.61ms die "no sprite y" unless defined $offset_y;
501
502 # get pre-caluculated position in spriteset
503492816.5ms my $spriteset_x = $sprite->{'position-x'};
504492811.0ms my $spriteset_y = $sprite->{'position-y'};
505
506 # assertion that the values are defined
50749284.26ms die "no spriteset x" unless defined $spriteset_x;
50849284.20ms die "no spriteset y" unless defined $spriteset_y;
509
510 # calculate the axes for background size
5114928205ms14784320ms my $background_w = toPx($canvas->width / $sprite->scaleX);
# spent 177ms making 4928 calls to OCBNET::Spritesets::CSS::Parser::toPx, avg 36µs/call # spent 74.8ms making 4928 calls to OCBNET::Spritesets::Sprite::scaleX, avg 15µs/call # spent 68.1ms making 4928 calls to OCBNET::Spritesets::Block::width, avg 14µs/call
5124928174ms14784243ms my $background_h = toPx($canvas->height / $sprite->scaleY);
# spent 111ms making 4928 calls to OCBNET::Spritesets::CSS::Parser::toPx, avg 22µs/call # spent 70.9ms making 4928 calls to OCBNET::Spritesets::Sprite::scaleY, avg 14µs/call # spent 61.6ms making 4928 calls to OCBNET::Spritesets::Block::height, avg 12µs/call
513
514 # align relative to the top and relative to the left
5154928292ms23872428ms $spriteset_y = toPx($sprite->positionY - ($offset_y + $sprite->paddingTop) / $sprite->scaleY) if $sprite->alignTop;
# spent 183ms making 4928 calls to OCBNET::Spritesets::Sprite::alignTop, avg 37µs/call # spent 70.9ms making 4736 calls to OCBNET::Spritesets::CSS::Parser::toPx, avg 15µs/call # spent 59.8ms making 4736 calls to OCBNET::Spritesets::Sprite::scaleY, avg 13µs/call # spent 57.9ms making 4736 calls to OCBNET::Spritesets::Sprite::positionY, avg 12µs/call # spent 56.5ms making 4736 calls to OCBNET::Spritesets::Block::paddingTop, avg 12µs/call
5164928288ms23872440ms $spriteset_x = toPx($sprite->positionX - ($offset_x + $sprite->paddingLeft) / $sprite->scaleX) if $sprite->alignLeft;
# spent 198ms making 4928 calls to OCBNET::Spritesets::Sprite::alignLeft, avg 40µs/call # spent 69.4ms making 4736 calls to OCBNET::Spritesets::CSS::Parser::toPx, avg 15µs/call # spent 59.8ms making 4736 calls to OCBNET::Spritesets::Sprite::scaleX, avg 13µs/call # spent 56.5ms making 4736 calls to OCBNET::Spritesets::Block::paddingLeft, avg 12µs/call # spent 55.9ms making 4736 calls to OCBNET::Spritesets::Sprite::positionX, avg 12µs/call
517
518 # assertion that the actual background position is always a full integer
5194928199ms492874.5ms warn "spriteset_x is not an integer $spriteset_x" unless $spriteset_x =~ m/^(?:\-?[0-9]+px|top|left|right|bottom)$/i;
# spent 74.5ms making 4928 calls to OCBNET::Spritesets::CSS::Parser::CORE:match, avg 15µs/call
5204928161ms492834.1ms warn "spriteset_y is not an integer $spriteset_y" unless $spriteset_y =~ m/^(?:\-?[0-9]+px|top|left|right|bottom)$/i;
# spent 34.1ms making 4928 calls to OCBNET::Spritesets::CSS::Parser::CORE:match, avg 7µs/call
521
522 # check if sprite was distributed
523 # if it has no parent it means the
524 # sprite has not been included yet
525492884.3ms unless ($sprite->{'parent'})
526 {
527 # check for debug mode on canvas or sprite
528184581µs if ($canvas->{'debug'} || $sprite->{'debug'})
529 {
530 # make border dark red and background lightly red
531 $styles{'border-color'} = 'rgb(192, 128, 128) !important';
532 $styles{'background-color'} = 'rgba(255, 0, 0, 0.125) !important';
533 }
534 }
535
536 # sprite was distributed
537 else
538 {
539
540 # parse css body
541474464.6ms47441.03s $selector->parse;
# spent 1.03s making 4744 calls to OCBNET::Spritesets::CSS::Block::parse, avg 217µs/call
542
543 # add shorthand styles for sprite sizing and position
544474453.9ms $styles{'background-size'} = join(' ', $background_w, $background_h);
545474427.0ms $styles{'background-position'} = join(' ', $spriteset_x, $spriteset_y);
546
547 # add repeating if sprite has it configured
548474464.5ms497674.2ms if ($sprite->isRepeatX && $sprite->isFlexibleX)
# spent 64.7ms making 4744 calls to OCBNET::Spritesets::Sprite::isRepeatX, avg 14µs/call # spent 9.55ms making 232 calls to OCBNET::Spritesets::Sprite::isFlexibleX, avg 41µs/call
549 { $styles{'background-repeat'} = 'repeat-x'; }
550474459.9ms497666.0ms if ($sprite->isRepeatY && $sprite->isFlexibleY)
# spent 57.0ms making 4744 calls to OCBNET::Spritesets::Sprite::isRepeatY, avg 12µs/call # spent 9.02ms making 232 calls to OCBNET::Spritesets::Sprite::isFlexibleY, avg 39µs/call
551 { $styles{'background-repeat'} = 'repeat-y'; }
552
553 # remove all background styles from selector
5544744243ms94881.09s $selector->clean(qr/background(?:\-[a-z0-9])*/);
# spent 1.01s making 4744 calls to OCBNET::Spritesets::CSS::Block::clean, avg 213µs/call # spent 82.2ms making 4744 calls to OCBNET::Spritesets::CSS::Parser::CORE:qr, avg 17µs/call
555
556 }
557
558 }
559 # EO if has sprite
560
561 # do we have new styles
56210036122ms if (scalar %styles)
563 {
564
565 # render the selector bodies
566475274.7ms4752231ms my $body = $selector->body;
# spent 231ms making 4752 calls to OCBNET::Spritesets::CSS::Block::body, avg 49µs/call
567
568 # find the first indenting to reuse it
5694752175ms475269.5ms my $indent = $body =~ m/^([ ]*)\S/m ? $1 : ' ';
# spent 69.5ms making 4752 calls to OCBNET::Spritesets::CSS::Parser::CORE:match, avg 15µs/call
570
571 # get the traling whitespace on last line
5724752317ms4752169ms my $footer = $body =~ s/([ ]*)$// ? $1 : '';
# spent 169ms making 4752 calls to OCBNET::Spritesets::CSS::Parser::CORE:subst, avg 35µs/call
573
574 # add some debugger statements into css
575475241.8ms $selector->{'footer'} .= "\n" . $indent . ";/* added by webmerge */\n";
576
577 # add these declarations to the footer to be included within block
5784752254ms $selector->{'footer'} .= sprintf "%s%s: %s;\n", $indent, $_, $styles{$_} foreach keys %styles;
579
580 # add some debugger statements into css
581475227.7ms $selector->{'footer'} .= $indent . "/* added by webmerge */\n";
582
583 # append traling whitespace again
584475218.6ms $selector->{'footer'} .= $footer;
585
586 }
587 # EO if has styles
588
589 }
590 # EO each selector
591
592 # make chainable
59324574µs return $self;
594
595}
596# EO sub process
597
598####################################################################################################
599# getter functions for this object
600####################################################################################################
601
602# get the spriteset by the passed key/name
603# ******************************************************************************
6044012109ms
# spent 48.4ms within OCBNET::Spritesets::CSS::Parser::spriteset which was called 4012 times, avg 12µs/call: # 4000 times (48.1ms+0s) by OCBNET::Spritesets::CSS::Parser::rehash at line 227, avg 12µs/call # 12 times (228µs+0s) by OCBNET::Spritesets::CSS::Parser::read at line 156, avg 19µs/call
sub spriteset : lvalue { $_[0]->{'spritesets'}->{$_[1]}; }
605
606# get list of all spriteset objects (actualy canvas)
607# ******************************************************************************
608962.27ms
# spent 1.40ms within OCBNET::Spritesets::CSS::Parser::spritesets which was called 96 times, avg 15µs/call: # 24 times (453µs+0s) by OCBNET::Spritesets::CSS::Parser::optimize at line 309, avg 19µs/call # 24 times (343µs+0s) by OCBNET::Spritesets::CSS::Parser::finalize at line 350, avg 14µs/call # 24 times (309µs+0s) by OCBNET::Spritesets::CSS::Parser::write at line 393, avg 13µs/call # 24 times (292µs+0s) by OCBNET::Spritesets::CSS::Parser::distribute at line 329, avg 12µs/call
sub spritesets { return values %{$_[0]->{'spritesets'}}; }
609
610####################################################################################################
611####################################################################################################
612115µs1;
 
# spent 55.1s within OCBNET::Spritesets::CSS::Parser::CORE:match which was called 24680 times, avg 2.23ms/call: # 10072 times (55.0s+0s) by OCBNET::Spritesets::CSS::Parser::read at line 117, avg 5.46ms/call # 4928 times (74.5ms+0s) by OCBNET::Spritesets::CSS::Parser::process at line 519, avg 15µs/call # 4928 times (34.1ms+0s) by OCBNET::Spritesets::CSS::Parser::process at line 520, avg 7µs/call # 4752 times (69.5ms+0s) by OCBNET::Spritesets::CSS::Parser::process at line 569, avg 15µs/call
sub OCBNET::Spritesets::CSS::Parser::CORE:match; # opcode
# spent 153ms within OCBNET::Spritesets::CSS::Parser::CORE:qr which was called 8776 times, avg 17µs/call: # 4744 times (82.2ms+0s) by OCBNET::Spritesets::CSS::Parser::process at line 554, avg 17µs/call # 4008 times (70.5ms+0s) by OCBNET::Spritesets::CSS::Parser::process at line 473, avg 18µs/call # 24 times (407µs+0s) by OCBNET::Spritesets::CSS::Parser::read at line 95, avg 17µs/call
sub OCBNET::Spritesets::CSS::Parser::CORE:qr; # opcode
# spent 256ms within OCBNET::Spritesets::CSS::Parser::CORE:regcomp which was called 40428 times, avg 6µs/call: # 15356 times (76.1ms+0s) by OCBNET::Spritesets::CSS::Parser::read at line 131, avg 5µs/call # 10072 times (87.3ms+0s) by OCBNET::Spritesets::CSS::Parser::read at line 117, avg 9µs/call # 10036 times (58.4ms+0s) by OCBNET::Spritesets::CSS::Parser::read at line 178, avg 6µs/call # 4952 times (34.0ms+0s) by OCBNET::Spritesets::CSS::Parser::read at line 179, avg 7µs/call # 12 times (119µs+0s) by OCBNET::Spritesets::CSS::Parser::read at line 162, avg 10µs/call
sub OCBNET::Spritesets::CSS::Parser::CORE:regcomp; # opcode
# spent 437ms within OCBNET::Spritesets::CSS::Parser::CORE:subst which was called 35108 times, avg 12µs/call: # 15356 times (132ms+0s) by OCBNET::Spritesets::CSS::Parser::read at line 131, avg 9µs/call # 10036 times (117ms+0s) by OCBNET::Spritesets::CSS::Parser::read at line 178, avg 12µs/call # 4952 times (18.7ms+0s) by OCBNET::Spritesets::CSS::Parser::read at line 179, avg 4µs/call # 4752 times (169ms+0s) by OCBNET::Spritesets::CSS::Parser::process at line 572, avg 35µs/call # 12 times (219µs+0s) by OCBNET::Spritesets::CSS::Parser::read at line 162, avg 18µs/call
sub OCBNET::Spritesets::CSS::Parser::CORE:subst; # opcode