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