X-Git-Url: http://git.shiar.net/sheet.git/blobdiff_plain/a80f46810bbfd38d8f40d2e2328cbcfd50e45c86..a142c8ca12f907b4775231207eeb5819ae76f30a:/codec.inc.pl
diff --git a/codec.inc.pl b/codec.inc.pl
index 2e157fc..2b1f590 100644
--- a/codec.inc.pl
+++ b/codec.inc.pl
@@ -5,6 +5,10 @@ codec => {
name => 'JPEG',
available => 1992,
},
+ gif => {
+ name => 'GIF',
+ available => 1987,
+ },
png => {
name => 'PNG',
available => 1996,
@@ -31,10 +35,14 @@ codec => {
},
},
feature => {
+ default => {
+ children => [qw( quality_photo quality_art speed limits features royalties )],
+ },
quality_photo => {
name => 'compression (photo)',
score => {
jpeg => 3,
+ gif => 1,
png => 1,
jp2k => 4,
webp => 3,
@@ -42,23 +50,28 @@ feature => {
avif => 5,
jxl => 5,
},
+ children => [qw( quality_photo_1 quality_photo_2 quality_photo_3 quality_photo_ll )],
},
quality_photo_1 => {
- name => 'low fidelity',
+ parent => 'quality_photo',
+ name => 'thumbnails',
score => {
jpeg => 2,
+ gif => 1,
png => 1,
jp2k => 3,
- webp => 3,
+ webp => 4,
heic => 5,
avif => 5,
- jxl => 4,
+ jxl => 3,
},
},
quality_photo_2 => {
+ parent => 'quality_photo',
name => 'medium fidelity',
score => {
jpeg => 3,
+ gif => 1,
png => 1,
jp2k => 4,
webp => 3,
@@ -68,9 +81,11 @@ feature => {
},
},
quality_photo_3 => {
+ parent => 'quality_photo',
name => 'high fidelity',
score => {
jpeg => 3,
+ gif => 1,
png => 2,
jp2k => 4,
webp => 2,
@@ -80,9 +95,11 @@ feature => {
},
},
quality_photo_ll => {
+ parent => 'quality_photo',
name => 'lossless',
score => {
jpeg => 1,
+ gif => 1,
png => 2,
jp2k => 4,
webp => 3,
@@ -95,6 +112,7 @@ feature => {
name => 'compression (other images)',
score => {
jpeg => 2,
+ gif => 1,
png => 3,
jp2k => 2,
webp => 4,
@@ -102,11 +120,13 @@ feature => {
avif => 4.5,
jxl => 5,
},
+ children => [qw( quality_art_2 quality_art_ll quality_art_mixed )],
},
quality_art_2 => {
name => 'lossy non-photographic',
score => {
jpeg => 2,
+ gif => 2,
png => 3,
jp2k => 2,
webp => 4,
@@ -119,6 +139,7 @@ feature => {
name => 'lossless non-photographic',
score => {
jpeg => 1,
+ gif => 1,
png => 4,
jp2k => 2,
webp => 5,
@@ -131,6 +152,7 @@ feature => {
name => 'mixed photo/nonphoto',
score => {
jpeg => 2,
+ gif => 1,
png => 2,
jp2k => 2,
webp => 3,
@@ -142,6 +164,7 @@ feature => {
speed => {
score => {
jpeg => 5,
+ gif => 4,
png => 4,
jp2k => 3,
webp => 4,
@@ -149,11 +172,14 @@ feature => {
avif => 3,
jxl => 5,
},
+ children => [qw( speed_encode speed_decode speed_parallel )],
},
speed_encode => {
+ parent => 'speed',
name => 'single-core encode',
score => {
jpeg => 5,
+ gif => 3, # palette conversion
png => 3,
jp2k => 4,
webp => 4,
@@ -163,9 +189,11 @@ feature => {
},
},
speed_decode => {
+ parent => 'speed',
name => 'single-core decode',
score => {
jpeg => 5,
+ gif => 5,
png => 5,
jp2k => 4,
webp => 5,
@@ -175,9 +203,11 @@ feature => {
},
},
speed_parallel => {
+ parent => 'speed',
name => 'pararellizable',
score => {
jpeg => 2,
+ gif => 2,
png => 2,
jp2k => 4,
webp => 2,
@@ -189,6 +219,7 @@ feature => {
limits => {
score => {
jpeg => 3,
+ gif => 2,
png => 4,
jp2k => 5,
webp => 2,
@@ -196,65 +227,56 @@ feature => {
avif => 4.5,
jxl => 5,
},
+ children => [qw( max_dimensions max_bitdepth color_444 hdr max_channels )],
},
max_dimensions => {
+ parent => 'limits',
name => 'maximum image dimensions',
score => {
- jpeg => 3,
- png => 4,
- jp2k => 5,
- webp => 1,
- heic => 2,
- avif => 3,
- jxl => 4,
- },
- data => {
- jpeg => '65k²', # 2**16
- png => '2G²', # 2**31
- jp2k => '4G²', # 2**32
- webp => '16k²', # 2**14
- heic => '8kÃ4k+', # 8193x4320
- avif => '65k²+', # 2**16, 8193x4320 with profile
- jxl => '1G²', # 2**30
+ jpeg => [3, '65k²'], # 2**16
+ gif => [3, '65k²'], # 2**16
+ png => [4, '2G²'], # 2**31
+ jp2k => [5, '4G²'], # 2**32
+ webp => [1, '16k²'], # 2**14
+ heic => [2,'8kÃ4k+', 'tilable, only 512Ã512 on Apple'], # 8193x4320
+ avif => [3, '65k²+', 'tilable, 7680Ã4320 with Advanced profile'], # 2**16
+ jxl => [4, '1G²'], # 2**30
},
},
max_bitdepth => {
+ parent => 'limits',
name => 'precision (max. bit depth)',
score => {
- jpeg => 2,
- png => 4,
- jp2k => 5,
- webp => 2,
- heic => 3,
- avif => 3,
- jxl => 5,
- },
- data => {
- jpeg => 8,
- png => 16,
- jp2k => 38,
- webp => 8,
- heic => 10,
- avif => 10,
- jxl => 32,
+ jpeg => [2, 8],
+ gif => [1, 8, '256 colour palette per frame'],
+ png => [4, 16],
+ jp2k => [5, 38],
+ webp => [2, 8],
+ heic => [3, 10], #TODO 16?
+ avif => [3, 12, '8, 10, 12 bit'],
+ jxl => [5, 32, '24-bit integer or 32-bit float'],
},
},
color_444 => {
- name => 'can do (lossy) 4:4:4',
+ parent => 'limits',
+ name => 'chroma subsampling',
score => {
- jpeg => 'y',
- png => 'y',
+ jpeg => ['y', undef, '4:2:0, 4:2:2, 4:4:4'],
+ gif => [4, 'â'],
+ png => [4, 'â'],
jp2k => 'y',
- webp => 'n',
- heic => 'n',
- avif => 'y',
- jxl => 'y',
+ webp => [1, '4:2:0'],
+ heic => [1, '4:2:0'],
+ avif => ['y', undef, '4:2:0, 4:2:2, 4:4:4'],
+ jxl => ['y', undef, 'for JPEG compatibility'],
},
},
hdr => {
+ parent => 'limits',
name => 'wide gamut/HDR',
score => {
jpeg => 'n',
+ gif => 'n',
png => 'y',
jp2k => 'y',
webp => 'n',
@@ -264,29 +286,23 @@ feature => {
},
},
max_channels => {
+ parent => 'limits',
name => 'maximum number of channels',
score => {
- jpeg => 2,
- png => 2,
- jp2k => 5,
- webp => 2,
- heic => 3,
- avif => 3,
- jxl => 4,
- },
- data => {
- jpeg => 4, # cmyk
- png => 4, # cmyk
- jp2k => 2**15,
- webp => 4,
- heic => 5,
- avif => 5,
- jxl => 4099,
+ jpeg => [3, 4, 'RGB or CMYK'],
+ gif => [3, 3, 'RGB palette'],
+ png => [3, 4, 'RGBA'],
+ jp2k => [5, 2**15],
+ webp => [3, 4, 'RGBA'],
+ heic => [3, 3, 'RGB, separate alpha and depth'],
+ avif => [3, 3, 'RGB, separate alpha and depth'],
+ jxl => [4, 4099, 'native XYB'],
},
},
features => {
score => {
jpeg => 2,
+ gif => 2,
png => 3,
jp2k => 4,
webp => 2,
@@ -294,28 +310,28 @@ feature => {
avif => 4,
jxl => 5,
},
+ children => [qw( animation progressive alpha depthmap overlays authoring reencode compat_jpeg )],
},
animation => {
+ parent => 'features',
name => 'supports animation',
score => {
- jpeg => 2,
- png => 4,
- jp2k => 2,
+ jpeg => [2, 'MJPEG'],
+ gif => 'y',
+ png => [4, 'APNG', 'later backwards-compatible extension'],
+ jp2k => [2, 'MJP2'],
webp => 'y',
heic => 'y',
avif => 'y',
jxl => 'y',
},
- data => {
- jpeg => 'MJPEG',
- png => 'APNG',
- jp2k => 'MJP2',
- },
},
progressive => {
+ parent => 'features',
name => 'progressive decoding',
score => {
jpeg => 4,
+ gif => 2,
png => 2,
jp2k => 5,
webp => 'n',
@@ -325,9 +341,11 @@ feature => {
},
},
alpha => {
+ parent => 'features',
name => 'alpha transparency',
score => {
jpeg => 'n',
+ gif => [3, '1 bit'],
png => 'y',
jp2k => 'y',
webp => 'y',
@@ -337,9 +355,11 @@ feature => {
},
},
depthmap => {
+ parent => 'features',
name => 'depth map',
score => {
jpeg => 'n',
+ gif => 'n',
png => 'n',
jp2k => 'n',
webp => 'n',
@@ -349,9 +369,11 @@ feature => {
},
},
overlays => {
- name => 'overlays',
+ parent => 'features',
+ name => 'overlays (layers)',
score => {
jpeg => 'n',
+ gif => 'y',
png => 'n',
jp2k => 'n',
webp => 'n',
@@ -361,9 +383,11 @@ feature => {
},
},
authoring => {
+ parent => 'features',
name => 'authoring workflow suitability',
score => {
jpeg => 2,
+ gif => 2,
png => 3,
jp2k => 3,
webp => 2,
@@ -373,24 +397,25 @@ feature => {
},
},
reencode => {
+ parent => 'features',
name => 'generation loss resilience',
score => {
jpeg => 4,
- png => 'n/a',
+ png => 0,
+ gif => 0,
jp2k => 3,
webp => 2,
heic => 3,
avif => 3,
jxl => 4,
},
- data => {
- png => 'n/a',
- },
},
compat_jpeg => {
+ parent => 'features',
name => 'lossless JPEG recompression',
score => {
jpeg => 0,
+ gif => 'n',
png => 'n',
jp2k => 'n',
webp => 'n',
@@ -398,22 +423,20 @@ feature => {
avif => 'n',
jxl => 'y',
},
- data => {
- jpeg => 'n/a',
- },
},
royalties => {
name => 'royalty-free',
score => {
jpeg => 5,
+ gif => [5, undef, 'patented before 2003'],
png => 5,
- gif => 5, # patents expired
- jp2k => 3, # specs not freely available
- webp => 4, # submarine risk
- heic => 'n', # patents enforced
- avif => 4,
- jxl => 4,
+ jp2k => [3, undef, 'ISO specification not freely available'],
+ webp => [4, undef, 'free format, low remaining risk of patent trolls'],
+ heic => ['n', undef, 'heavily patented'],
+ avif => [4, undef, 'free format, risk of patent trolls'],
+ jxl => [4, undef, 'free format, risk of patent trolls'],
},
+ children => [],
},
},
}