Update documentation - increase Doxygen usage
[geeqie.git] / scripts / decode_sim
1 #! /usr/bin/perl
2 #
3 ## @file
4 ## @brief Display the contents of a .sim file
5 ##
6 ## Usage: ./scripts/decode_sim <path to sim file>
7 ##
8 ## Displays:  
9 ## Comment: <geeqie version file was created by>  
10 ## Original image dimensions:  
11 ## Exif Date Original:  
12 ## MD5 sum:  
13 ## Image of the thumbnail  
14 ##
15
16
17 use strict;
18 use warnings;
19
20 use GD;
21
22 my $file = shift or die;
23
24 open my $in_fh, '<', $file or die;
25 binmode $in_fh;
26 my $type = <$in_fh>;
27 chomp $type;
28
29 die unless $type eq 'SIMcache';
30
31 while (<$in_fh>)
32 {
33    my $raw = $_;
34    chomp;
35    if (/^#(.*)/)
36    {
37       printf "Comment: %s\n", $1;
38    }
39    elsif (/^Dimensions=\[(\d+) x (\d+)\]$/)
40    {
41       printf "Original image dimensions: %dx%d\n", $1, $2;
42    }
43    elsif (/^Date=(\[-1\])/)
44    {
45       printf "Exif Date Original: %s\n", $1;
46    }
47    elsif (/^Date=(.*)/)
48    {
49       my $unix_time = substr($1, 1, 10);
50
51       my ($S, $M, $H, $d, $m, $Y) = localtime($unix_time);
52       $m += 1;
53       $Y += 1900;
54       my $date_time = sprintf("%04d-%02d-%02d %02d:%02d:%02d", $Y, $m, $d, $H, $M, $S);
55
56       printf "Exif Date Original: %s %s\n", $1, $date_time;
57    }
58    elsif (/^Checksum=(.*)/)
59    {
60       printf "Checksum (never seen): %s\n", $1;
61    }
62    elsif (/^MD5sum=\[(.*)\]$/)
63    {
64       printf "MD5 sum: %s\n", $1;
65    }
66    elsif ($raw =~ /^SimilarityGrid\[(\d+) x (\d+)\]=(.*)$/s)
67    {
68       printf "Similarity image %dx%d\n", $1, $2;
69       if ($1 != 32 or $2 != 32)
70       {
71          print "Warning, similarity data are not size 32x32!\n";
72       }
73
74       my $simn = $1 * $2 * 3;
75       my ($width, $height) = ($1, $2);
76       my $simdata = $3;
77
78       $simdata = substr($simdata, 0, -1) if length($simdata) == $simn + 1; # In case all fits to one line
79
80       if (length($simdata) < $simn)
81       {
82          read $in_fh, $simdata, $simn - length($simdata), length($simdata) or die;
83          my $dummy;
84          read $in_fh, $dummy, 1 or die;
85       }
86
87       printf "Warning, similarity data is not %d bytes", $simn unless length($simdata) == $simn;
88
89       if (length($simdata) == $simn)
90       {
91          my $gd = GD::Image->new($width, $height, 1);
92
93          for (my $x = 0; $x < $width; $x++)
94          {
95             for (my $y = 0; $y < $height; $y++)
96             {
97                my $colors = substr($simdata, ($x + $y * $width) * 3, 3);
98                my @rgb = unpack("CCC", $colors);
99                my $index = $gd->colorAllocate(@rgb);
100                $gd->setPixel($x, $y, $index);
101             }
102          } ## end for (my $x = 0; $x < $width; $...
103
104          my $png = $gd->png;
105          open my $display_fh, '|-', qw(display -resize), sprintf("%dx%d", $width*10, $height*10), '-' or die;
106          binmode $display_fh;
107          print {$display_fh} $png;
108          close $display_fh;
109       } ## end if (length($simdata) == $simn)
110    } ## end elsif (/^SimilarityGrid\[(\d+)...
111    else
112    {
113       my $field = $_;
114       $field = $1 if /^(.*)=/;
115
116       printf "Unknown Field '$field'\n";
117    } ## end elsif (/^SimilarityGrid\[(\d+)...
118 } ## end while (<$in_fh>)
119
120 close $in_fh;