925c2fe54f5b0e6b286b263e095b67ca9a49ea4f
[sheet.git] / codec.inc.pl
1 use utf8;
2 +{
3 codec => {
4         jpeg => {
5                 name => '<abbr title="Joint Photographic Experts Group">JPEG</abbr>',
6                 available => 1992,
7         },
8         png => {
9                 name => '<abbr title="Portable Network Graphics">PNG</abbr>',
10                 available => 1996,
11         },
12         jp2k => {
13                 name => 'JPEG 2000',
14                 available => 2000,
15         },
16         webp => {
17                 name => 'WebP',
18                 available => 2010,
19         },
20         heic => {
21                 name => '<abbr title="High Efficiency Image Container (HEVC in HEIF)">HEIC</abbr>',
22                 available => 2015,
23         },
24         avif => {
25                 name => '<abbr title="AV1 Image File Format">AVIF</abbr>',
26                 available => 2019,
27         },
28         jxl => {
29                 name => 'JPEG XL',
30                 available => 2021,
31         },
32 },
33 feature => {
34         default => {
35                 children => [qw( quality_photo quality_art speed limits features royalties )],
36         },
37         quality_photo => {
38                 name => 'compression (photo)',
39                 score => {
40                         jpeg => 3,
41                         png  => 1,
42                         jp2k => 4,
43                         webp => 3,
44                         heic => 5,
45                         avif => 5,
46                         jxl  => 5,
47                 },
48                 children => [qw( quality_photo_1 quality_photo_2 quality_photo_3 quality_photo_ll )],
49         },
50         quality_photo_1 => {
51                 parent => 'quality_photo',
52                 name => 'low fidelity',
53                 score => {
54                         jpeg => 2,
55                         png  => 1,
56                         jp2k => 3,
57                         webp => 3,
58                         heic => 5,
59                         avif => 5,
60                         jxl  => 4,
61                 },
62         },
63         quality_photo_2 => {
64                 parent => 'quality_photo',
65                 name => 'medium fidelity',
66                 score => {
67                         jpeg => 3,
68                         png  => 1,
69                         jp2k => 4,
70                         webp => 3,
71                         heic => 4,
72                         avif => 5,
73                         jxl  => 5,
74                 },
75         },
76         quality_photo_3 => {
77                 parent => 'quality_photo',
78                 name => 'high fidelity',
79                 score => {
80                         jpeg => 3,
81                         png  => 2,
82                         jp2k => 4,
83                         webp => 2,
84                         heic => 3,
85                         avif => 4,
86                         jxl  => 5,
87                 },
88         },
89         quality_photo_ll => {
90                 parent => 'quality_photo',
91                 name => 'lossless',
92                 score => {
93                         jpeg => 1,
94                         png  => 2,
95                         jp2k => 4,
96                         webp => 3,
97                         heic => 3,
98                         avif => 3,
99                         jxl  => 5,
100                 },
101         },
102         quality_art => {
103                 name => 'compression (other images)',
104                 score => {
105                         jpeg => 2,
106                         png  => 3,
107                         jp2k => 2,
108                         webp => 4,
109                         heic => 3,
110                         avif => 4.5,
111                         jxl  => 5,
112                 },
113                 children => [qw( quality_art_2 quality_art_ll quality_art_mixed )],
114         },
115         quality_art_2 => {
116                 name => 'lossy non-photographic',
117                 score => {
118                         jpeg => 2,
119                         png  => 3,
120                         jp2k => 2,
121                         webp => 4,
122                         heic => 3,
123                         avif => 5,
124                         jxl  => 5,
125                 },
126         },
127         quality_art_ll => {
128                 name => 'lossless non-photographic',
129                 score => {
130                         jpeg => 1,
131                         png  => 4,
132                         jp2k => 2,
133                         webp => 5,
134                         heic => 2,
135                         avif => 3,
136                         jxl  => 5,
137                 },
138         },
139         quality_art_mixed => {
140                 name => 'mixed photo/nonphoto',
141                 score => {
142                         jpeg => 2,
143                         png  => 2,
144                         jp2k => 2,
145                         webp => 3,
146                         heic => 3,
147                         avif => 5,
148                         jxl  => 5,
149                 },
150         },
151         speed => {
152                 score => {
153                         jpeg => 5,
154                         png  => 4,
155                         jp2k => 3,
156                         webp => 4,
157                         heic => 3,
158                         avif => 3,
159                         jxl  => 5,
160                 },
161                 children => [qw( speed_encode speed_decode speed_parallel )],
162         },
163         speed_encode => {
164                 parent => 'speed',
165                 name => 'single-core encode',
166                 score => {
167                         jpeg => 5,
168                         png  => 3,
169                         jp2k => 4,
170                         webp => 4,
171                         heic => 3,
172                         avif => 2,
173                         jxl  => 5,
174                 },
175         },
176         speed_decode => {
177                 parent => 'speed',
178                 name => 'single-core decode',
179                 score => {
180                         jpeg => 5,
181                         png  => 5,
182                         jp2k => 4,
183                         webp => 5,
184                         heic => 3,
185                         avif => 3,
186                         jxl  => 5,
187                 },
188         },
189         speed_parallel => {
190                 parent => 'speed',
191                 name => 'pararellizable',
192                 score => {
193                         jpeg => 2,
194                         png  => 2,
195                         jp2k => 4,
196                         webp => 2,
197                         heic => 4,
198                         avif => 4,
199                         jxl  => 5,
200                 },
201         },
202         limits => {
203                 score => {
204                         jpeg => 3,
205                         png  => 4,
206                         jp2k => 5,
207                         webp => 2,
208                         heic => 4,
209                         avif => 4.5,
210                         jxl  => 5,
211                 },
212                 children => [qw( max_dimensions max_bitdepth color_444 hdr max_channels  )],
213         },
214         max_dimensions => {
215                 parent => 'limits',
216                 name => 'maximum image dimensions',
217                 score => {
218                         jpeg => 3,
219                         png  => 4,
220                         jp2k => 5,
221                         webp => 1,
222                         heic => 2,
223                         avif => 3,
224                         jxl  => 4,
225                 },
226                 data => {
227                         jpeg => '65k²',  # 2**16
228                         png  => '2G²',   # 2**31
229                         jp2k => '4G²',   # 2**32
230                         webp => '16k²',  # 2**14
231                         heic => '8k×4k+', # 8193x4320
232                         avif => '65k²+',  # 2**16, 8193x4320 with profile
233                         jxl  => '1G²',   # 2**30
234                 },
235         },
236         max_bitdepth => {
237                 parent => 'limits',
238                 name => 'precision (max. bit depth)',
239                 score => {
240                         jpeg => 2,
241                         png  => 4,
242                         jp2k => 5,
243                         webp => 2,
244                         heic => 3,
245                         avif => 3,
246                         jxl  => 5,
247                 },
248                 data => {
249                         jpeg => 8,
250                         png  => 16,
251                         jp2k => 38,
252                         webp => 8,
253                         heic => 10,
254                         avif => 10,
255                         jxl  => 32,
256                 },
257         },
258         color_444 => {
259                 parent => 'limits',
260                 name => 'can do (lossy) 4:4:4',
261                 score => {
262                         jpeg => 'y',
263                         png  => 'y',
264                         jp2k => 'y',
265                         webp => 'n',
266                         heic => 'n',
267                         avif => 'y',
268                         jxl  => 'y',
269                 },
270         },
271         hdr => {
272                 parent => 'limits',
273                 name => 'wide gamut/HDR',
274                 score => {
275                         jpeg => 'n',
276                         png  => 'y',
277                         jp2k => 'y',
278                         webp => 'n',
279                         heic => 'y',
280                         avif => 'y',
281                         jxl  => 'y',
282                 },
283         },
284         max_channels => {
285                 parent => 'limits',
286                 name => 'maximum number of channels',
287                 score => {
288                         jpeg => 2,
289                         png  => 2,
290                         jp2k => 5,
291                         webp => 2,
292                         heic => 3,
293                         avif => 3,
294                         jxl  => 4,
295                 },
296                 data => {
297                         jpeg => 4, # cmyk
298                         png  => 4, # cmyk
299                         jp2k => 2**15,
300                         webp => 4,
301                         heic => 5,
302                         avif => 5,
303                         jxl  => 4099,
304                 },
305         },
306         features => {
307                 score => {
308                         jpeg => 2,
309                         png  => 3,
310                         jp2k => 4,
311                         webp => 2,
312                         heic => 4,
313                         avif => 4,
314                         jxl  => 5,
315                 },
316                 children => [qw( animation progressive alpha depthmap overlays authoring reencode compat_jpeg )],
317         },
318         animation => {
319                 parent => 'features',
320                 name => 'supports animation',
321                 score => {
322                         jpeg => 2,
323                         png  => 4,
324                         jp2k => 2,
325                         webp => 'y',
326                         heic => 'y',
327                         avif => 'y',
328                         jxl  => 'y',
329                 },
330                 data => {
331                         jpeg => 'MJPEG',
332                         png  => 'APNG',
333                         jp2k => 'MJP2',
334                 },
335         },
336         progressive => {
337                 parent => 'features',
338                 name => 'progressive decoding',
339                 score => {
340                         jpeg => 4,
341                         png  => 2,
342                         jp2k => 5,
343                         webp => 'n',
344                         heic => 'n',
345                         avif => 'n',
346                         jxl  => 5,
347                 },
348         },
349         alpha => {
350                 parent => 'features',
351                 name => 'alpha transparency',
352                 score => {
353                         jpeg => 'n',
354                         png  => 'y',
355                         jp2k => 'y',
356                         webp => 'y',
357                         heic => 'y',
358                         avif => 'y',
359                         jxl  => 'y',
360                 },
361         },
362         depthmap => {
363                 parent => 'features',
364                 name => 'depth map',
365                 score => {
366                         jpeg => 'n',
367                         png  => 'n',
368                         jp2k => 'n',
369                         webp => 'n',
370                         heic => 'y',
371                         avif => 'y',
372                         jxl  => 'y',
373                 },
374         },
375         overlays => {
376                 parent => 'features',
377                 name => 'overlays',
378                 score => {
379                         jpeg => 'n',
380                         png  => 'n',
381                         jp2k => 'n',
382                         webp => 'n',
383                         heic => 'y',
384                         avif => 'y',
385                         jxl  => 'y',
386                 },
387         },
388         authoring => {
389                 parent => 'features',
390                 name => 'authoring workflow suitability',
391                 score => {
392                         jpeg => 2,
393                         png  => 3,
394                         jp2k => 3,
395                         webp => 2,
396                         heic => 2,
397                         avif => 2,
398                         jxl  => 5,
399                 },
400         },
401         reencode => {
402                 parent => 'features',
403                 name => 'generation loss resilience',
404                 score => {
405                         jpeg => 4,
406                         png  => 'n/a',
407                         jp2k => 3,
408                         webp => 2,
409                         heic => 3,
410                         avif => 3,
411                         jxl  => 4,
412                 },
413                 data => {
414                         png  => 'n/a',
415                 },
416         },
417         compat_jpeg => {
418                 parent => 'features',
419                 name => 'lossless JPEG recompression',
420                 score => {
421                         jpeg => 0,
422                         png  => 'n',
423                         jp2k => 'n',
424                         webp => 'n',
425                         heic => 'n',
426                         avif => 'n',
427                         jxl  => 'y',
428                 },
429                 data => {
430                         jpeg => 'n/a',
431                 },
432         },
433         royalties => {
434                 name => 'royalty-free',
435                 score => {
436                         jpeg => 5,
437                         png  => 5,
438                         gif  => 5, # patents expired
439                         jp2k => 3, # specs not freely available
440                         webp => 4, # submarine risk
441                         heic => 'n', # patents enforced
442                         avif => 4,
443                         jxl  => 4,
444                 },
445                 children => [],
446         },
447 },
448 }