Simple script to decode similarity data
[geeqie.git] / scripts / decode_sim
1 #! /usr/bin/perl
2 #
3
4 use strict;
5 use warnings;
6
7 my $file = shift or die;
8
9 open my $in_fh, '<', $file or die;
10 my $type = <$in_fh>;
11 chomp $type;
12
13 die unless $type eq 'SIMcache';
14
15 while (<$in_fh>)
16 {
17    my $raw = $_;
18    chomp;
19    if (/^#(.*)/)
20    {
21       printf "Comment: %s\n", $1;
22    }
23    elsif (/^Dimensions=\[(\d+) x (\d+)\]$/)
24    {
25       printf "Original image dimensions: %d×%d\n", $1, $2;
26    }
27    elsif (/^Date=(.*)/)
28    {
29       printf "Date (used for pan-view): %s\n", $1;
30    }
31    elsif (/^Checksum=(.*)/)
32    {
33       printf "Checksum (never seen): %s\n", $1;
34    }
35    elsif (/^MD5sum=\[(.*)\]$/)
36    {
37       printf "MD5 sum: %s\n", $1;
38    }
39    elsif ($raw =~ /^SimilarityGrid\[(\d+) x (\d+)\]=(.*)$/s)
40    {
41       printf "Similarity image %d×%d\n", $1, $2;
42       if ($1 != 32 or $2 != 32)
43       {
44          print "Warning, similarity data are not size 32×32!\n";
45       }
46
47       my $simn = $1 * $2 * 3;
48       my $simdata = $3;
49
50       $simdata = substr($simdata, 0, -1) if length($simdata) == $simn + 1; # In case all fits to one line
51
52       if (length($simdata) < $simn)
53       {
54          read $in_fh, $simdata, $simn - length($simdata), length($simdata) or die;
55          my $dummy;
56          read $in_fh, $dummy, 1 or die;
57       }
58
59       printf "Warning, similarity data is not %d bytes", $simn unless length($simdata) == $simn;
60    } ## end elsif (/^SimilarityGrid\[(\d+)...
61    else
62    {
63       my $field = $_;
64       $field = $1 if /^(.*)=/;
65
66       printf "Unknown Field '$field'\n";
67    } ## end elsif (/^SimilarityGrid\[(\d+)...
68 } ## end while (<$in_fh>)
69
70 close $in_fh;