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