codec: gif format (best effort comparison)
[sheet.git] / codec.inc.pl
index 2e157fcb88c468972fca9aefd99857e4803b4884..6b6b4e09d0e582e8370dd303b87ddc8183efeb73 100644 (file)
@@ -5,6 +5,10 @@ codec => {
                name => '<abbr title="Joint Photographic Experts Group">JPEG</abbr>',
                available => 1992,
        },
+       gif => {
+               name => '<abbr title="Graphics Interchange Format">GIF</abbr>',
+               available => 1987,
+       },
        png => {
                name => '<abbr title="Portable Network Graphics">PNG</abbr>',
                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,11 +227,14 @@ 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,
+                       gif  => 3,
                        png  => 4,
                        jp2k => 5,
                        webp => 1,
@@ -210,6 +244,7 @@ feature => {
                },
                data => {
                        jpeg => '65k²',  # 2**16
+                       gif  => '65k²',  # 2**16
                        png  => '2G²',   # 2**31
                        jp2k => '4G²',   # 2**32
                        webp => '16k²',  # 2**14
@@ -219,9 +254,11 @@ feature => {
                },
        },
        max_bitdepth => {
+               parent => 'limits',
                name => 'precision (max. bit depth)',
                score => {
                        jpeg => 2,
+                       gif  => 2,
                        png  => 4,
                        jp2k => 5,
                        webp => 2,
@@ -231,6 +268,7 @@ feature => {
                },
                data => {
                        jpeg => 8,
+                       gif  => 8,
                        png  => 16,
                        jp2k => 38,
                        webp => 8,
@@ -240,9 +278,11 @@ feature => {
                },
        },
        color_444 => {
+               parent => 'limits',
                name => 'can do (lossy) 4:4:4',
                score => {
                        jpeg => 'y',
+                       gif  => 'y',
                        png  => 'y',
                        jp2k => 'y',
                        webp => 'n',
@@ -252,9 +292,11 @@ feature => {
                },
        },
        hdr => {
+               parent => 'limits',
                name => 'wide gamut/HDR',
                score => {
                        jpeg => 'n',
+                       gif  => 'n',
                        png  => 'y',
                        jp2k => 'y',
                        webp => 'n',
@@ -264,9 +306,11 @@ feature => {
                },
        },
        max_channels => {
+               parent => 'limits',
                name => 'maximum number of channels',
                score => {
                        jpeg => 2,
+                       gif  => 1,
                        png  => 2,
                        jp2k => 5,
                        webp => 2,
@@ -276,6 +320,7 @@ feature => {
                },
                data => {
                        jpeg => 4, # cmyk
+                       gif  => 3,
                        png  => 4, # cmyk
                        jp2k => 2**15,
                        webp => 4,
@@ -287,6 +332,7 @@ feature => {
        features => {
                score => {
                        jpeg => 2,
+                       gif  => 2,
                        png  => 3,
                        jp2k => 4,
                        webp => 2,
@@ -294,11 +340,14 @@ 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,
+                       gif  => 'y',
                        png  => 4,
                        jp2k => 2,
                        webp => 'y',
@@ -313,9 +362,11 @@ feature => {
                },
        },
        progressive => {
+               parent => 'features',
                name => 'progressive decoding',
                score => {
                        jpeg => 4,
+                       gif  => 2,
                        png  => 2,
                        jp2k => 5,
                        webp => 'n',
@@ -325,9 +376,11 @@ feature => {
                },
        },
        alpha => {
+               parent => 'features',
                name => 'alpha transparency',
                score => {
                        jpeg => 'n',
+                       gif  => 3,
                        png  => 'y',
                        jp2k => 'y',
                        webp => 'y',
@@ -335,11 +388,16 @@ feature => {
                        avif => 'y',
                        jxl  => 'y',
                },
+               data => {
+                       gif => '1 bit',
+               },
        },
        depthmap => {
+               parent => 'features',
                name => 'depth map',
                score => {
                        jpeg => 'n',
+                       gif  => 'n',
                        png  => 'n',
                        jp2k => 'n',
                        webp => 'n',
@@ -349,9 +407,11 @@ feature => {
                },
        },
        overlays => {
-               name => 'overlays',
+               parent => 'features',
+               name => 'overlays (layers)',
                score => {
                        jpeg => 'n',
+                       gif  => 'y',
                        png  => 'n',
                        jp2k => 'n',
                        webp => 'n',
@@ -361,9 +421,11 @@ feature => {
                },
        },
        authoring => {
+               parent => 'features',
                name => 'authoring workflow suitability',
                score => {
                        jpeg => 2,
+                       gif  => 2,
                        png  => 3,
                        jp2k => 3,
                        webp => 2,
@@ -373,10 +435,12 @@ feature => {
                },
        },
        reencode => {
+               parent => 'features',
                name => 'generation loss resilience',
                score => {
                        jpeg => 4,
-                       png  => 'n/a',
+                       png  => 0,
+                       gif  => 0,
                        jp2k => 3,
                        webp => 2,
                        heic => 3,
@@ -384,13 +448,16 @@ feature => {
                        jxl  => 4,
                },
                data => {
+                       gif  => 'n/a',
                        png  => 'n/a',
                },
        },
        compat_jpeg => {
+               parent => 'features',
                name => 'lossless JPEG recompression',
                score => {
                        jpeg => 0,
+                       gif  => 'n',
                        png  => 'n',
                        jp2k => 'n',
                        webp => 'n',
@@ -406,14 +473,15 @@ feature => {
                name => 'royalty-free',
                score => {
                        jpeg => 5,
-                       png  => 5,
                        gif  => 5, # patents expired
+                       png  => 5,
                        jp2k => 3, # specs not freely available
                        webp => 4, # submarine risk
                        heic => 'n', # patents enforced
                        avif => 4,
                        jxl  => 4,
                },
+               children => [],
        },
 },
 }