--- /dev/null
+<(common.inc.plp)><:
+
+Html({
+ title => 'Codecs',
+ version => '1.0',
+ description => [
+ ],
+ keywords => [qw'
+ '],
+ stylesheet => [qw'light circus dark red'],
+ data => [qw'codec.inc.pl'],
+});
+
+my $info = do 'codec.inc.pl';
+$info and %{$info} > 1 or Abort("cannot open operator include", 500, $@ // $!);
+
+my %BOOLSCORE = (y => 5, n => 1);
+:>
+<h1>Image codecs</h1>
+
+<div class="section">
+<table class="mapped">
+ <col><colgroup span=2><colgroup span=2><colgroup span=3>
+<thead><tr><th rowspan=2>feature
+<:
+my @codecs = sort {
+ $info->{codec}->{$a}->{available} <=> $info->{codec}->{$b}->{available}
+} keys $info->{codec}->%*;
+
+print '<th>', $_->{name} for @{$info->{codec}}{@codecs};
+print "\n<tr>";
+print '<td>', $_->{available} for @{$info->{codec}}{@codecs};
+say '</thead>';
+
+print '<tbody>';
+for my $feat (sort keys %{$info->{feature}}) {
+ my $featinfo = $info->{feature}->{$feat};
+ printf '<tr><th>%s', $featinfo->{name} // $feat;
+ printf('<td class="l%d">%s',
+ (map { $_ && $BOOLSCORE{$_} || $_ || 0 } $featinfo->{score}->{$_}),
+ $featinfo->{data}->{$_} // (map {
+ $BOOLSCORE{$_} ? ($_ eq 'y' ? '✔' : '✘') : '•' x ($_ - 1)
+ } $featinfo->{score}->{$_}),
+ ) for @codecs;
+ say '</td>';
+}
+
+:></table>
+</div>
+