codec: gif format (best effort comparison)
authorMischa POSLAWSKY <perl@shiar.org>
Fri, 29 Oct 2021 13:34:18 +0000 (15:34 +0200)
committerMischa POSLAWSKY <perl@shiar.org>
Tue, 9 Nov 2021 03:14:15 +0000 (04:14 +0100)
Should definitely be included as major legacy web format, despite palette
restrictions not present in other competitors.  Colour quantisation can be
graded as quality loss similar to 4:2:0 subsampling.

codec.inc.pl
codec.plp

index ab7e841e44a259392caf235bd1e3d727dacbfba9..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,
@@ -38,6 +42,7 @@ feature => {
                name => 'compression (photo)',
                score => {
                        jpeg => 3,
+                       gif  => 1,
                        png  => 1,
                        jp2k => 4,
                        webp => 3,
@@ -52,6 +57,7 @@ feature => {
                name => 'thumbnails',
                score => {
                        jpeg => 2,
+                       gif  => 1,
                        png  => 1,
                        jp2k => 3,
                        webp => 4,
@@ -65,6 +71,7 @@ feature => {
                name => 'medium fidelity',
                score => {
                        jpeg => 3,
+                       gif  => 1,
                        png  => 1,
                        jp2k => 4,
                        webp => 3,
@@ -78,6 +85,7 @@ feature => {
                name => 'high fidelity',
                score => {
                        jpeg => 3,
+                       gif  => 1,
                        png  => 2,
                        jp2k => 4,
                        webp => 2,
@@ -91,6 +99,7 @@ feature => {
                name => 'lossless',
                score => {
                        jpeg => 1,
+                       gif  => 1,
                        png  => 2,
                        jp2k => 4,
                        webp => 3,
@@ -103,6 +112,7 @@ feature => {
                name => 'compression (other images)',
                score => {
                        jpeg => 2,
+                       gif  => 1,
                        png  => 3,
                        jp2k => 2,
                        webp => 4,
@@ -116,6 +126,7 @@ feature => {
                name => 'lossy non-photographic',
                score => {
                        jpeg => 2,
+                       gif  => 2,
                        png  => 3,
                        jp2k => 2,
                        webp => 4,
@@ -128,6 +139,7 @@ feature => {
                name => 'lossless non-photographic',
                score => {
                        jpeg => 1,
+                       gif  => 1,
                        png  => 4,
                        jp2k => 2,
                        webp => 5,
@@ -140,6 +152,7 @@ feature => {
                name => 'mixed photo/nonphoto',
                score => {
                        jpeg => 2,
+                       gif  => 1,
                        png  => 2,
                        jp2k => 2,
                        webp => 3,
@@ -151,6 +164,7 @@ feature => {
        speed => {
                score => {
                        jpeg => 5,
+                       gif  => 4,
                        png  => 4,
                        jp2k => 3,
                        webp => 4,
@@ -165,6 +179,7 @@ feature => {
                name => 'single-core encode',
                score => {
                        jpeg => 5,
+                       gif  => 3, # palette conversion
                        png  => 3,
                        jp2k => 4,
                        webp => 4,
@@ -178,6 +193,7 @@ feature => {
                name => 'single-core decode',
                score => {
                        jpeg => 5,
+                       gif  => 5,
                        png  => 5,
                        jp2k => 4,
                        webp => 5,
@@ -191,6 +207,7 @@ feature => {
                name => 'pararellizable',
                score => {
                        jpeg => 2,
+                       gif  => 2,
                        png  => 2,
                        jp2k => 4,
                        webp => 2,
@@ -202,6 +219,7 @@ feature => {
        limits => {
                score => {
                        jpeg => 3,
+                       gif  => 2,
                        png  => 4,
                        jp2k => 5,
                        webp => 2,
@@ -216,6 +234,7 @@ feature => {
                name => 'maximum image dimensions',
                score => {
                        jpeg => 3,
+                       gif  => 3,
                        png  => 4,
                        jp2k => 5,
                        webp => 1,
@@ -225,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
@@ -238,6 +258,7 @@ feature => {
                name => 'precision (max. bit depth)',
                score => {
                        jpeg => 2,
+                       gif  => 2,
                        png  => 4,
                        jp2k => 5,
                        webp => 2,
@@ -247,6 +268,7 @@ feature => {
                },
                data => {
                        jpeg => 8,
+                       gif  => 8,
                        png  => 16,
                        jp2k => 38,
                        webp => 8,
@@ -260,6 +282,7 @@ feature => {
                name => 'can do (lossy) 4:4:4',
                score => {
                        jpeg => 'y',
+                       gif  => 'y',
                        png  => 'y',
                        jp2k => 'y',
                        webp => 'n',
@@ -273,6 +296,7 @@ feature => {
                name => 'wide gamut/HDR',
                score => {
                        jpeg => 'n',
+                       gif  => 'n',
                        png  => 'y',
                        jp2k => 'y',
                        webp => 'n',
@@ -286,6 +310,7 @@ feature => {
                name => 'maximum number of channels',
                score => {
                        jpeg => 2,
+                       gif  => 1,
                        png  => 2,
                        jp2k => 5,
                        webp => 2,
@@ -295,6 +320,7 @@ feature => {
                },
                data => {
                        jpeg => 4, # cmyk
+                       gif  => 3,
                        png  => 4, # cmyk
                        jp2k => 2**15,
                        webp => 4,
@@ -306,6 +332,7 @@ feature => {
        features => {
                score => {
                        jpeg => 2,
+                       gif  => 2,
                        png  => 3,
                        jp2k => 4,
                        webp => 2,
@@ -320,6 +347,7 @@ feature => {
                name => 'supports animation',
                score => {
                        jpeg => 2,
+                       gif  => 'y',
                        png  => 4,
                        jp2k => 2,
                        webp => 'y',
@@ -338,6 +366,7 @@ feature => {
                name => 'progressive decoding',
                score => {
                        jpeg => 4,
+                       gif  => 2,
                        png  => 2,
                        jp2k => 5,
                        webp => 'n',
@@ -351,6 +380,7 @@ feature => {
                name => 'alpha transparency',
                score => {
                        jpeg => 'n',
+                       gif  => 3,
                        png  => 'y',
                        jp2k => 'y',
                        webp => 'y',
@@ -358,12 +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',
@@ -377,6 +411,7 @@ feature => {
                name => 'overlays (layers)',
                score => {
                        jpeg => 'n',
+                       gif  => 'y',
                        png  => 'n',
                        jp2k => 'n',
                        webp => 'n',
@@ -390,6 +425,7 @@ feature => {
                name => 'authoring workflow suitability',
                score => {
                        jpeg => 2,
+                       gif  => 2,
                        png  => 3,
                        jp2k => 3,
                        webp => 2,
@@ -403,7 +439,8 @@ feature => {
                name => 'generation loss resilience',
                score => {
                        jpeg => 4,
-                       png  => 'n/a',
+                       png  => 0,
+                       gif  => 0,
                        jp2k => 3,
                        webp => 2,
                        heic => 3,
@@ -411,6 +448,7 @@ feature => {
                        jxl  => 4,
                },
                data => {
+                       gif  => 'n/a',
                        png  => 'n/a',
                },
        },
@@ -419,6 +457,7 @@ feature => {
                name => 'lossless JPEG recompression',
                score => {
                        jpeg => 0,
+                       gif  => 'n',
                        png  => 'n',
                        jp2k => 'n',
                        webp => 'n',
@@ -434,8 +473,8 @@ 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
index 27a6cb73960bd54f1d7f88f8177239d4aa41598f..35b97ed30d5bb29b0b0cf3aa0b68197682238f37 100644 (file)
--- a/codec.plp
+++ b/codec.plp
@@ -22,7 +22,7 @@ my %BOOLSCORE = (y => 5, n => 1);
 
 <div class="section">
 <table class="mapped">
-       <col><colgroup span=2><colgroup span=2><colgroup span=3>
+       <col><colgroup span=3><colgroup span=2><colgroup span=3>
 <thead><tr><th rowspan=2>feature
 <:
 my @codecs = sort {