| 10 |
sub new ($$) { |
sub new ($$) { |
| 11 |
my $self = bless {style_sheets => []}, shift; |
my $self = bless {style_sheets => []}, shift; |
| 12 |
$self->{document} = shift; |
$self->{document} = shift; |
| 13 |
|
|
| 14 |
|
## Device dependent font size parameters |
| 15 |
|
my @scale = (3/5, 3/4, 8/9, 1, 6/5, 3/2, 2/1, 3/1); ## From css3-fonts |
| 16 |
|
$self->{font_size}->[$_] = 16 * $scale[$_] for 0..$#scale; |
| 17 |
|
## TODO: Provide better default |
| 18 |
|
$self->{get_smaller_font_size} = sub ($$) { |
| 19 |
|
#my ($self, $original_px) = @_; |
| 20 |
|
return $_[1] / 1.1; |
| 21 |
|
}; |
| 22 |
|
## TODO: Provide better default |
| 23 |
|
$self->{get_larger_font_size} = sub ($$) { |
| 24 |
|
#my ($self, $original_px) = @_; |
| 25 |
|
return $_[1] * 1.1; |
| 26 |
|
}; |
| 27 |
|
## $self->{has_invert}: Should be same as |
| 28 |
|
## $parser->{prop_value}->{'outline-color'}->{invert}. |
| 29 |
|
|
| 30 |
return $self; |
return $self; |
| 31 |
} # new |
} # new |
| 32 |
|
|
| 130 |
## TODO: Remove {specified_value} caching, once we implement most |
## TODO: Remove {specified_value} caching, once we implement most |
| 131 |
## of CSS 2.1 properties and confirm that it makes almost non sence |
## of CSS 2.1 properties and confirm that it makes almost non sence |
| 132 |
## because of its duplication with {computed_value} caching. |
## because of its duplication with {computed_value} caching. |
| 133 |
|
|
| 134 |
|
## NOTE: |top| computation refers |bottom| and vice versa. |
| 135 |
|
## |left| does |right| and vice versa. |
| 136 |
|
|
| 137 |
my $eid = refaddr $element; |
my $eid = refaddr $element; |
| 138 |
unless (exists $self->{specified_value}->{$eid}->{$prop_name}) { |
unless (exists $self->{specified_value}->{$eid}->{$prop_name}) { |
| 139 |
my $cascaded = $self->get_cascaded_value ($element, $prop_name); |
my $cascaded = $self->get_cascaded_value ($element, $prop_name); |
| 166 |
return $self->{specified_value}->{$eid}->{$prop_name}; |
return $self->{specified_value}->{$eid}->{$prop_name}; |
| 167 |
} # get_specified_value |
} # get_specified_value |
| 168 |
|
|
| 169 |
|
sub get_specified_value_no_inherit ($$$) { |
| 170 |
|
my ($self, $element, $prop_name) = @_; |
| 171 |
|
|
| 172 |
|
my $specified = $self->get_specified_value ($element, $prop_name); |
| 173 |
|
if (defined $specified and $specified->[0] eq 'INHERIT') { |
| 174 |
|
## ISSUE: CSS 2.1 does not say to resolve computed value of the parent. |
| 175 |
|
## However, it is necessary for some cases (see |
| 176 |
|
## <http://suika.fam.cx/gate/2005/sw/inherit>). In addition, |
| 177 |
|
## the initial value is not a computed value for some properties. |
| 178 |
|
my $parent_element = $element->manakai_parent_element; |
| 179 |
|
if (defined $parent_element) { |
| 180 |
|
$specified = $self->get_computed_value ($parent_element, $prop_name); |
| 181 |
|
} else { |
| 182 |
|
my $prop_def = $Whatpm::CSS::Parser::Prop->{$prop_name}; |
| 183 |
|
$specified = $prop_def->{initial}; |
| 184 |
|
} |
| 185 |
|
## NOTE: Because of this handling, {compute} codes must be |
| 186 |
|
## idempotent. |
| 187 |
|
} |
| 188 |
|
return $specified; |
| 189 |
|
} # get_specified_value_no_inherit |
| 190 |
|
|
| 191 |
sub get_computed_value ($$$) { |
sub get_computed_value ($$$) { |
| 192 |
my ($self, $element, $prop_name) = @_; |
my ($self, $element, $prop_name) = @_; |
| 193 |
|
|
| 195 |
unless (exists $self->{computed_value}->{$eid}->{$prop_name}) { |
unless (exists $self->{computed_value}->{$eid}->{$prop_name}) { |
| 196 |
my $prop_def = $Whatpm::CSS::Parser::Prop->{$prop_name}; |
my $prop_def = $Whatpm::CSS::Parser::Prop->{$prop_name}; |
| 197 |
if (defined $prop_def) { |
if (defined $prop_def) { |
| 198 |
my $specified = $self->get_specified_value ($element, $prop_name); |
if ($prop_def->{compute_multiple}) { |
| 199 |
if (defined $specified and $specified->[0] eq 'INHERIT') { |
$prop_def->{compute_multiple}->($self, $element, $eid, $prop_name); |
| 200 |
## ISSUE: CSS 2.1 does not say to resolve computed value of the parent. |
} else { |
| 201 |
## However, it is necessary for some cases (see |
my $specified = $self->get_specified_value_no_inherit |
| 202 |
## <http://suika.fam.cx/gate/2005/sw/inherit>). In addition, |
($element, $prop_name); |
| 203 |
## the initial value is not a computed value for some properties. |
$self->{computed_value}->{$eid}->{$prop_name} |
| 204 |
my $parent_element = $element->manakai_parent_element; |
= $prop_def->{compute}->($self, $element, $prop_name, $specified); |
|
if (defined $parent_element) { |
|
|
$specified = $self->get_computed_value ($parent_element, $prop_name); |
|
|
} else { |
|
|
$specified = $prop_def->{compute}->($self, $element, $prop_name, |
|
|
$prop_def->{initial}); |
|
|
} |
|
|
## NOTE: Because of this handling, {compute} codes must be |
|
|
## idempotent. |
|
| 205 |
} |
} |
|
|
|
|
$self->{computed_value}->{$eid}->{$prop_name} |
|
|
= $prop_def->{compute}->($self, $element, $prop_name, $specified); |
|
| 206 |
} else { |
} else { |
| 207 |
$self->{computed_value}->{$eid}->{$prop_name} = undef; |
$self->{computed_value}->{$eid}->{$prop_name} = undef; |
| 208 |
} |
} |