| Filename | /home/ocbnet/domain/ocbnet.ch/vhost/webmerge/htdocs/webmerge/scripts/modules/OCBNET/Spritesets/CSS/Parser.pm |
| Statements | Executed 444529 statements in 79.5s |
| Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
|---|---|---|---|---|---|
| 24680 | 4 | 1 | 55.1s | 55.1s | OCBNET::Spritesets::CSS::Parser::CORE:match (opcode) |
| 24 | 1 | 1 | 5.11s | 19.6s | OCBNET::Spritesets::CSS::Parser::process |
| 24 | 1 | 1 | 4.31s | 87.4s | OCBNET::Spritesets::CSS::Parser::read |
| 24 | 1 | 1 | 3.05s | 37.8s | OCBNET::Spritesets::CSS::Parser::load |
| 24 | 1 | 1 | 1.79s | 7.45s | OCBNET::Spritesets::CSS::Parser::rehash |
| 35108 | 5 | 1 | 437ms | 437ms | OCBNET::Spritesets::CSS::Parser::CORE:subst (opcode) |
| 19328 | 4 | 1 | 428ms | 428ms | OCBNET::Spritesets::CSS::Parser::toPx |
| 40428 | 5 | 1 | 256ms | 256ms | OCBNET::Spritesets::CSS::Parser::CORE:regcomp (opcode) |
| 8776 | 3 | 1 | 153ms | 153ms | OCBNET::Spritesets::CSS::Parser::CORE:qr (opcode) |
| 4008 | 1 | 1 | 92.1ms | 92.1ms | OCBNET::Spritesets::CSS::Parser::toUrl |
| 4012 | 2 | 1 | 48.4ms | 48.4ms | OCBNET::Spritesets::CSS::Parser::spriteset |
| 24 | 1 | 1 | 4.72ms | 116s | OCBNET::Spritesets::CSS::Parser::write |
| 24 | 1 | 1 | 1.52ms | 30.4s | OCBNET::Spritesets::CSS::Parser::distribute |
| 96 | 4 | 1 | 1.40ms | 1.40ms | OCBNET::Spritesets::CSS::Parser::spritesets |
| 24 | 1 | 1 | 1.39ms | 2.02s | OCBNET::Spritesets::CSS::Parser::finalize |
| 24 | 1 | 1 | 1.38ms | 1.38ms | OCBNET::Spritesets::CSS::Parser::new |
| 24 | 1 | 1 | 1.28ms | 23.2s | OCBNET::Spritesets::CSS::Parser::optimize |
| 1 | 1 | 1 | 82µs | 177µs | OCBNET::Spritesets::CSS::Parser::BEGIN@19 |
| 1 | 1 | 1 | 65µs | 234µs | OCBNET::Spritesets::CSS::Parser::BEGIN@25 |
| 1 | 1 | 1 | 62µs | 299µs | OCBNET::Spritesets::CSS::Parser::BEGIN@41 |
| 1 | 1 | 1 | 61µs | 651µs | OCBNET::Spritesets::CSS::Parser::BEGIN@40 |
| 1 | 1 | 1 | 60µs | 46.6ms | OCBNET::Spritesets::CSS::Parser::BEGIN@30 |
| 1 | 1 | 1 | 58µs | 489µs | OCBNET::Spritesets::CSS::Parser::BEGIN@42 |
| 1 | 1 | 1 | 56µs | 630µs | OCBNET::Spritesets::CSS::Parser::BEGIN@38 |
| 1 | 1 | 1 | 56µs | 471µs | OCBNET::Spritesets::CSS::Parser::BEGIN@39 |
| 1 | 1 | 1 | 54µs | 84µs | OCBNET::Spritesets::CSS::Parser::BEGIN@20 |
| 1 | 1 | 1 | 27µs | 27µs | OCBNET::Spritesets::CSS::Parser::BEGIN@30.9 |
| 0 | 0 | 0 | 0s | 0s | OCBNET::Spritesets::CSS::Parser::debug |
| 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 | #################################################################################################### | ||||
| 10 | package 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 | |||||
| 19 | 2 | 147µs | 2 | 273µ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 # spent 177µs making 1 call to OCBNET::Spritesets::CSS::Parser::BEGIN@19
# spent 96µs making 1 call to strict::import |
| 20 | 2 | 202µs | 2 | 115µ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 # 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 | ||||
| 25 | 2 | 188µs | 2 | 403µ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 # 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 | ||||
| 30 | 3 | 321µs | 3 | 93.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 # 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 | ||||
| 35 | 1 | 4µs | require OCBNET::Spritesets::CSS::Collection; | ||
| 36 | |||||
| 37 | # load dependencies and import globals and functions | ||||
| 38 | 2 | 188µs | 2 | 1.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 # spent 630µs making 1 call to OCBNET::Spritesets::CSS::Parser::BEGIN@38
# spent 574µs making 1 call to Exporter::import |
| 39 | 2 | 176µs | 2 | 887µ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 # spent 471µs making 1 call to OCBNET::Spritesets::CSS::Parser::BEGIN@39
# spent 415µs making 1 call to Exporter::import |
| 40 | 2 | 208µs | 2 | 1.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 # spent 651µs making 1 call to OCBNET::Spritesets::CSS::Parser::BEGIN@40
# spent 590µs making 1 call to Exporter::import |
| 41 | 2 | 173µs | 2 | 535µ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 # spent 299µs making 1 call to OCBNET::Spritesets::CSS::Parser::BEGIN@41
# spent 236µs making 1 call to Exporter::import |
| 42 | 2 | 10.5ms | 2 | 920µ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 # 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 | ||||
| 47 | 19328 | 646ms | # 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 | ||
| 48 | 4008 | 175ms | # 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 | ||
| 49 | |||||
| 50 | #################################################################################################### | ||||
| 51 | |||||
| 52 | # constructor | ||||
| 53 | # ****************************************************************************** | ||||
| 54 | sub 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 | ||||
| 58 | 24 | 117µs | my ($pckg, $config) = @_; | ||
| 59 | |||||
| 60 | # init object | ||||
| 61 | 24 | 725µ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 | ||||
| 78 | 24 | 864µ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 | # ****************************************************************************** | ||||
| 88 | sub 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 | ||||
| 92 | 24 | 103µs | my ($self, $data) = @_; | ||
| 93 | |||||
| 94 | # parse all blocks and end when all is parsed | ||||
| 95 | 24 | 1.26ms | 48 | 15.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?) | ||||
| 98 | 24 | 87µs | die "Fatal: not everything parsed" if ${$data} ne ''; | ||
| 99 | |||||
| 100 | # put all blocks in a flat array | ||||
| 101 | 24 | 2.02ms | 24 | 2.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 | ||||
| 103 | 24 | 264ms | 20120 | 206ms | 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 | ||||
| 107 | 24 | 71.2ms | 24 | 52.9ms | @blocks = uniq @blocks; # spent 52.9ms making 24 calls to List::MoreUtils::uniq, avg 2.20ms/call |
| 108 | |||||
| 109 | # reset block type arrays | ||||
| 110 | 24 | 769µs | $self->{'others'} = []; | ||
| 111 | 24 | 230µs | $self->{'selectors'} = []; | ||
| 112 | |||||
| 113 | # find selector blocks | ||||
| 114 | 24 | 208µs | foreach my $block (@blocks) | ||
| 115 | { | ||||
| 116 | # check if the head only consists of selector rules, comments and whitespace | ||||
| 117 | 10072 | 55.6s | 40288 | 55.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 |
| 118 | 20072 | 151ms | { $block->{'selector'} = 1; push @{$self->{'selectors'}}, $block } | ||
| 119 | 72 | 508µs | else { $block->{'selector'} = 0; push @{$self->{'others'}}, $block } | ||
| 120 | } | ||||
| 121 | |||||
| 122 | # now process each block | ||||
| 123 | # find configured spritesets | ||||
| 124 | 24 | 151µs | foreach my $block (@blocks) | ||
| 125 | { | ||||
| 126 | |||||
| 127 | # get the block text | ||||
| 128 | 10072 | 124ms | 10072 | 1.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 | ||||
| 131 | 10072 | 846ms | 30712 | 209ms | 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 | ||||
| 135 | 5296 | 107ms | 5296 | 75.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 | ||||
| 138 | 5296 | 49.1ms | 5296 | 1.21s | $parse_definition->($options, $1); # spent 1.21s making 5296 calls to OCBNET::CSS::Parser::CSS::__ANON__[webmerge/scripts/modules/OCBNET/CSS/Parser/CSS.pm:82], avg 228µs/call |
| 139 | |||||
| 140 | # check if this comment is meant for us | ||||
| 141 | 5296 | 94.0ms | 5296 | 68.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 | ||||
| 144 | 12 | 141µs | 12 | 156µ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 | ||||
| 147 | 12 | 49µs | my $id = $options->{'css-id'}; | ||
| 148 | |||||
| 149 | # pass debug mode from config to options | ||||
| 150 | 12 | 98µs | $options->{'debug'} = $self->{'config'}->{'debug'}; | ||
| 151 | |||||
| 152 | # create a new canvas object to hold all sprites | ||||
| 153 | 12 | 304µs | 12 | 165ms | 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 | ||||
| 156 | 12 | 183µs | 12 | 228µ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 | ||||
| 159 | 12 | 45µs | $block->{'canvas'} = $canvas; | ||
| 160 | |||||
| 161 | # store the id for canvas | ||||
| 162 | 12 | 818µs | 24 | 338µ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 | ||||
| 171 | 24 | 207µs | foreach my $selector (@{$self->{'selectors'}}) | ||
| 172 | { | ||||
| 173 | |||||
| 174 | # get body text to parse | ||||
| 175 | 10036 | 134ms | 10036 | 833ms | 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 | ||||
| 178 | 10036 | 629ms | 20072 | 176ms | 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 |
| 179 | 4952 | 356ms | 14856 | 1.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 | ||||
| 182 | 10036 | 150ms | 10036 | 6.30s | $parse_definition->($selector->{'styles'}, $body); # spent 6.30s making 10036 calls to OCBNET::CSS::Parser::CSS::__ANON__[webmerge/scripts/modules/OCBNET/CSS/Parser/CSS.pm:82], avg 628µs/call |
| 183 | |||||
| 184 | } | ||||
| 185 | # EO each selector | ||||
| 186 | |||||
| 187 | # return object | ||||
| 188 | 24 | 2.89ms | return $self; | ||
| 189 | |||||
| 190 | } | ||||
| 191 | # EO sub read | ||||
| 192 | |||||
| 193 | #################################################################################################### | ||||
| 194 | |||||
| 195 | # rehash the block references | ||||
| 196 | # *************************************************************************************** | ||||
| 197 | sub 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 | ||||
| 201 | 24 | 98µs | my ($self) = @_; | ||
| 202 | |||||
| 203 | # now process each selector and setup references | ||||
| 204 | 24 | 210µs | foreach my $selector (@{$self->{'selectors'}}) | ||
| 205 | { | ||||
| 206 | # get css id for this block for inheritance | ||||
| 207 | 10036 | 207ms | 20072 | 988ms | 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 | ||||
| 209 | 10036 | 30.3ms | $self->{'ids'}->{$css_id} = $selector if defined $css_id; | ||
| 210 | } | ||||
| 211 | |||||
| 212 | # now process each selector and setup references | ||||
| 213 | 24 | 175µs | foreach my $selector (@{$self->{'selectors'}}) | ||
| 214 | { | ||||
| 215 | # get own id and reference id | ||||
| 216 | 10036 | 195ms | 20072 | 1.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 | ||||
| 218 | 10036 | 90.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) | ||||
| 221 | 10036 | 85.7ms | @{$selector->{'ref'}} = grep { defined $_ } @{$selector->{'ref'}}; | ||
| 222 | } | ||||
| 223 | |||||
| 224 | # now process each selector and setup references | ||||
| 225 | 24 | 161µs | foreach my $selector (@{$self->{'selectors'}}) | ||
| 226 | { | ||||
| 227 | 10036 | 303ms | 27136 | 3.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 | ||||
| 232 | 24 | 418µ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 | # *************************************************************************************** | ||||
| 242 | sub 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 | ||||
| 246 | 24 | 126µs | my ($self) = @_; | ||
| 247 | |||||
| 248 | # now process each selector and setup sprites | ||||
| 249 | 24 | 6.51ms | foreach my $selector (@{$self->{'selectors'}}) | ||
| 250 | { | ||||
| 251 | |||||
| 252 | # check if this selector block has a background | ||||
| 253 | 10036 | 179ms | 10036 | 2.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 | ||||
| 256 | 4928 | 72.9ms | 4928 | 176ms | 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 | ||||
| 259 | 4928 | 1.29s | 83776 | 31.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 | ||||
| 280 | 4928 | 34.2ms | $selector->{'sprite'} = $sprite; | ||
| 281 | |||||
| 282 | # and also store the selector on the sprite | ||||
| 283 | 4928 | 15.4ms | $sprite->{'selector'} = $selector; | ||
| 284 | |||||
| 285 | # add sprite to canvas | ||||
| 286 | 4928 | 122ms | 4928 | 108ms | $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 | ||||
| 292 | 24 | 400µ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 | # *************************************************************************************** | ||||
| 302 | sub 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 | ||||
| 306 | 24 | 82µs | my ($self) = @_; | ||
| 307 | |||||
| 308 | # call optimize for every spriteset | ||||
| 309 | 24 | 655µs | 36 | 23.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 | ||||
| 312 | 24 | 429µ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 | # *************************************************************************************** | ||||
| 322 | sub 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 | ||||
| 326 | 24 | 93µs | my ($self) = @_; | ||
| 327 | |||||
| 328 | # call distribute for every spriteset | ||||
| 329 | 24 | 785µs | 36 | 30.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 | ||||
| 332 | 24 | 454µ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 | # *************************************************************************************** | ||||
| 343 | sub 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 | ||||
| 347 | 24 | 94µs | my ($self) = @_; | ||
| 348 | |||||
| 349 | # call finalize for every spriteset | ||||
| 350 | 24 | 657µs | 36 | 2.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 | ||||
| 353 | 24 | 535µs | return $self; | ||
| 354 | |||||
| 355 | } | ||||
| 356 | # EO sub finalize | ||||
| 357 | |||||
| 358 | #################################################################################################### | ||||
| 359 | |||||
| 360 | # just print out some debug messages | ||||
| 361 | # *************************************************************************************** | ||||
| 362 | sub 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 | # *************************************************************************************** | ||||
| 381 | sub 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 | ||||
| 385 | 24 | 116µs | my ($self, $writer) = @_; | ||
| 386 | |||||
| 387 | # status variable | ||||
| 388 | # info about all writes which is | ||||
| 389 | # used to optimize files afterwards | ||||
| 390 | 24 | 40µs | my %written; | ||
| 391 | |||||
| 392 | # write all registered spritesets | ||||
| 393 | 24 | 409µs | 24 | 309µ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 | ||||
| 397 | 12 | 91µs | my $id = $canvas->{'id'}; | ||
| 398 | |||||
| 399 | # get the css options for canvas | ||||
| 400 | # they are gathered from block comments | ||||
| 401 | 12 | 32µs | my $options = $canvas->{'options'}; | ||
| 402 | |||||
| 403 | # parse sprite image option and add to options for later use | ||||
| 404 | 12 | 532µs | 36 | 28.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 | ||||
| 407 | 12 | 152µs | 12 | 1.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 | ||||
| 410 | 12 | 569µs | 24 | 103s | 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 | ||||
| 413 | 12 | 811µs | 12 | 530µ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 | ||||
| 415 | 12 | 13.5s | 12 | 13.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 | ||||
| 417 | 12 | 376µs | 12 | 1.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 | ||||
| 419 | 12 | 275µs | 12 | 23.2ms | $writer->($file, $blob, \%written); # spent 23.2ms making 12 calls to RTP::Webmerge::Process::CSS::Spritesets::__ANON__[webmerge/scripts/modules/RTP/Webmerge/Process/CSS/Spritesets.pm:98], avg 1.94ms/call |
| 420 | } | ||||
| 421 | # EO if successfull drawn | ||||
| 422 | |||||
| 423 | } | ||||
| 424 | # EO each spriteset | ||||
| 425 | |||||
| 426 | # return status variable | ||||
| 427 | 24 | 570µ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 | #************************************************************************************************** | ||||
| 437 | sub 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 | ||||
| 441 | 24 | 102µs | my ($self) = @_; | ||
| 442 | |||||
| 443 | # now process each selector and setup sprites | ||||
| 444 | 24 | 222µs | foreach my $selector (@{$self->{'selectors'}}) | ||
| 445 | { | ||||
| 446 | |||||
| 447 | # new styles | ||||
| 448 | 10036 | 8.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 | ||||
| 454 | 10036 | 55.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 | ||||
| 460 | 4008 | 10.7ms | my $canvas = $selector->{'canvas'}; | ||
| 461 | |||||
| 462 | # get the url of the spriteset image | ||||
| 463 | 4008 | 72.1ms | 4008 | 666ms | 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 | ||||
| 466 | 4008 | 54.7ms | 4008 | 4.78s | $selector->parse(); # spent 4.78s making 4008 calls to OCBNET::Spritesets::CSS::Block::parse, avg 1.19ms/call |
| 467 | |||||
| 468 | # push new declarations | ||||
| 469 | 4008 | 73.3ms | 4008 | 92.1ms | $styles{'background-image'} = toUrl($url); # spent 92.1ms making 4008 calls to OCBNET::Spritesets::CSS::Parser::toUrl, avg 23µs/call |
| 470 | 4008 | 17.1ms | $styles{'background-repeat'} = 'no-repeat'; | ||
| 471 | |||||
| 472 | # remove all background styles from selector | ||||
| 473 | 4008 | 203ms | 8016 | 1.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 | ||||
| 479 | 10036 | 55.2ms | if ($selector->{'sprite'}) | ||
| 480 | { | ||||
| 481 | |||||
| 482 | # get the sprite for selector | ||||
| 483 | 4928 | 12.2ms | my $sprite = $selector->{'sprite'}; | ||
| 484 | |||||
| 485 | # spriteset canvas of block | ||||
| 486 | 4928 | 70.8ms | 4928 | 178ms | 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 | ||||
| 489 | 4928 | 82.7ms | 4928 | 645ms | 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 | ||||
| 492 | 4928 | 77.2ms | 4928 | 2.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 | ||||
| 495 | 4928 | 14.7ms | my $offset_x = $offset->{'x'}; | ||
| 496 | 4928 | 9.30ms | my $offset_y = $offset->{'y'}; | ||
| 497 | |||||
| 498 | # assertion that the values are defined | ||||
| 499 | 4928 | 6.92ms | die "no sprite x" unless defined $offset_x; | ||
| 500 | 4928 | 4.61ms | die "no sprite y" unless defined $offset_y; | ||
| 501 | |||||
| 502 | # get pre-caluculated position in spriteset | ||||
| 503 | 4928 | 16.5ms | my $spriteset_x = $sprite->{'position-x'}; | ||
| 504 | 4928 | 11.0ms | my $spriteset_y = $sprite->{'position-y'}; | ||
| 505 | |||||
| 506 | # assertion that the values are defined | ||||
| 507 | 4928 | 4.26ms | die "no spriteset x" unless defined $spriteset_x; | ||
| 508 | 4928 | 4.20ms | die "no spriteset y" unless defined $spriteset_y; | ||
| 509 | |||||
| 510 | # calculate the axes for background size | ||||
| 511 | 4928 | 205ms | 14784 | 320ms | 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 |
| 512 | 4928 | 174ms | 14784 | 243ms | 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 | ||||
| 515 | 4928 | 292ms | 23872 | 428ms | $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 |
| 516 | 4928 | 288ms | 23872 | 440ms | $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 | ||||
| 519 | 4928 | 199ms | 4928 | 74.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 |
| 520 | 4928 | 161ms | 4928 | 34.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 | ||||
| 525 | 4928 | 84.3ms | unless ($sprite->{'parent'}) | ||
| 526 | { | ||||
| 527 | # check for debug mode on canvas or sprite | ||||
| 528 | 184 | 581µ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 | ||||
| 541 | 4744 | 64.6ms | 4744 | 1.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 | ||||
| 544 | 4744 | 53.9ms | $styles{'background-size'} = join(' ', $background_w, $background_h); | ||
| 545 | 4744 | 27.0ms | $styles{'background-position'} = join(' ', $spriteset_x, $spriteset_y); | ||
| 546 | |||||
| 547 | # add repeating if sprite has it configured | ||||
| 548 | 4744 | 64.5ms | 4976 | 74.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'; } | ||||
| 550 | 4744 | 59.9ms | 4976 | 66.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 | ||||
| 554 | 4744 | 243ms | 9488 | 1.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 | ||||
| 562 | 10036 | 122ms | if (scalar %styles) | ||
| 563 | { | ||||
| 564 | |||||
| 565 | # render the selector bodies | ||||
| 566 | 4752 | 74.7ms | 4752 | 231ms | 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 | ||||
| 569 | 4752 | 175ms | 4752 | 69.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 | ||||
| 572 | 4752 | 317ms | 4752 | 169ms | 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 | ||||
| 575 | 4752 | 41.8ms | $selector->{'footer'} .= "\n" . $indent . ";/* added by webmerge */\n"; | ||
| 576 | |||||
| 577 | # add these declarations to the footer to be included within block | ||||
| 578 | 4752 | 254ms | $selector->{'footer'} .= sprintf "%s%s: %s;\n", $indent, $_, $styles{$_} foreach keys %styles; | ||
| 579 | |||||
| 580 | # add some debugger statements into css | ||||
| 581 | 4752 | 27.7ms | $selector->{'footer'} .= $indent . "/* added by webmerge */\n"; | ||
| 582 | |||||
| 583 | # append traling whitespace again | ||||
| 584 | 4752 | 18.6ms | $selector->{'footer'} .= $footer; | ||
| 585 | |||||
| 586 | } | ||||
| 587 | # EO if has styles | ||||
| 588 | |||||
| 589 | } | ||||
| 590 | # EO each selector | ||||
| 591 | |||||
| 592 | # make chainable | ||||
| 593 | 24 | 574µ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 | # ****************************************************************************** | ||||
| 604 | 4012 | 109ms | sub spriteset : lvalue { $_[0]->{'spritesets'}->{$_[1]}; } | ||
| 605 | |||||
| 606 | # get list of all spriteset objects (actualy canvas) | ||||
| 607 | # ****************************************************************************** | ||||
| 608 | 96 | 2.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 | ||
| 609 | |||||
| 610 | #################################################################################################### | ||||
| 611 | #################################################################################################### | ||||
| 612 | 1 | 15µs | 1; | ||
# 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 | |||||
# 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 | |||||
# 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 | |||||
# 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 |