File Coverage

blib/lib/IO/SWF/Bitmap.pm
Criterion Covered Total %
statement 7 9 77.7
branch n/a
condition n/a
subroutine 3 3 100.0
pod n/a
total 10 12 83.3


line stmt bran cond sub pod time code
1             package IO::SWF::Bitmap;
2              
3 1     1   29090 use strict;
  1         3  
  1         45  
4 1     1   5 use warnings;
  1         2  
  1         32  
5              
6 1     1   634 use IO::SWF::Bit;
  0            
  0            
7              
8             use constant {
9             FORMAT_UNKNOWN => 0,
10             FORMAT_JPEG => 1,
11             FORMAT_PNG => 2,
12             FORMAT_GIF => 4,
13             };
14              
15             sub detect_bitmap_format {
16             my $bitmap_data = shift;
17             if ($bitmap_data =~ /^\xff\xd8\xff/) {
18             return FORMAT_JPEG;
19             }
20             elsif ($bitmap_data =~ /^\x89PNG/) {
21             return FORMAT_PNG;
22             }
23             elsif ($bitmap_data =~ /^GIF/) {
24             return FORMAT_GIF;
25             }
26             return FORMAT_UNKNOWN;
27             }
28              
29             sub get_jpegsize {
30             my $jpegdata = shift;
31             my $chunk_length = 0;
32             my $jpegdata_len = length($jpegdata);
33             for (my $idx = 0 ; (($idx + 8) < $jpegdata_len) ; $idx += $chunk_length) {
34             my $marker1 = ord(substr($jpegdata, $idx, 1));
35             if ($marker1 != 0xFF) {
36             last;
37             }
38             my $marker2 = ord(substr($jpegdata, $idx + 1, 1));
39             if ($marker2 == 0xD8 || $marker2 == 0xD9) {
40             # 0xD8: // SOI (Start of Image)
41             # 0xD9: // EOI (End of Image)
42             $chunk_length = 2;
43             }
44             elsif ($marker2 == 0xDA) {
45             # 0xDA: // SOS
46             return undef; # not found
47             }
48             elsif ($marker2 == 0xC0 || # 0xC0 // SOF0
49             $marker2 == 0xC1 || # 0xC0 // SOF1
50             $marker2 == 0xC2 || # 0xC0 // SOF2
51             $marker2 == 0xC3 || # 0xC0 // SOF3
52             $marker2 == 0xC5 || # 0xC0 // SOF5
53             $marker2 == 0xC6 || # 0xC0 // SOF6
54             $marker2 == 0xC7 || # 0xC0 // SOF7
55             $marker2 == 0xC8 || # 0xC0 // SOF8
56             $marker2 == 0xC9 || # 0xC0 // SOF9
57             $marker2 == 0xCA || # 0xC0 // SOF10
58             $marker2 == 0xCB || # 0xC0 // SOF11
59             $marker2 == 0xCD || # 0xC0 // SOF13
60             $marker2 == 0xCE || # 0xC0 // SOF14
61             $marker2 == 0xCF # 0xC0 // SOF15
62             ) {
63             my $width = 0x100 * ord(substr($jpegdata, $idx + 7, 1)) + ord(substr($jpegdata, $idx + 8, 1));
64             my $height = 0x100 * ord(substr($jpegdata, $idx + 5, 1)) + ord(substr($jpegdata, $idx + 6, 1));
65             return ('width' => $width, 'height' => $height); # success
66             }
67             else {
68             $chunk_length = 0x100 * ord(substr($jpegdata, $idx + 2, 1)) + ord(substr($jpegdata, $idx + 3, 1)) + 2;
69             if ($chunk_length == 0) { # fail safe;
70             last;
71             }
72             }
73             }
74             return undef();
75             }
76              
77             sub get_pngsize {
78             my $pngdata = shift;
79             my $pngdata_len = length($pngdata);
80             if ($pngdata_len < 24) {
81             print STDERR sprintf("IO::SWF::Bitmap::get_pngsize: data_len(%d) < 16\n", $pngdata_len);
82             return undef();
83             }
84             my $width = (((ord(substr($pngdata, 16, 1))*0x100) + ord(substr($pngdata, 17, 1)))*0x100 + ord(substr($pngdata, 18, 1)))*0x100 + ord(substr($pngdata, 19, 1));
85             my $height =(((ord(substr($pngdata, 20, 1))*0x100) + ord(substr($pngdata, 21, 1)))*0x100 + ord(substr($pngdata, 22, 1)))*0x100 + ord(substr($pngdata, 23, 1));
86             return ('width' => $width, 'height' => $height); # success
87             }
88              
89             sub get_gifsize {
90             my $gifdata = shift;
91             my $gifdata_len = length($gifdata);
92             if ($gifdata_len < 10) {
93             print STDERR sprintf("IO::SWF::Bitmap::get_gifsize: data_len(%d) < 10\n", $gifdata_len);
94             return undef();
95             }
96             my $width = 0x100 * ord(substr($gifdata, 7, 1)) + ord(substr($gifdata, 6, 1));
97             my $height = 0x100 * ord(substr($gifdata, 9, 1)) + ord(substr($gifdata, 8, 1));
98             return ('width' => $width, 'height' => $height); # success
99             }
100              
101             sub get_bitmapsize {
102             my $bitmapdata = shift;
103             if ($bitmapdata =~ /^\xff\xd8\xff/i) { # JPEG
104             return get_jpegsize($bitmapdata);
105             }
106             elsif ($bitmapdata =~ /^\x89PNG/) { # PNG
107             return get_pngsize($bitmapdata);
108             }
109             elsif ($bitmapdata =~ /^GIF/) { # GIF
110             return get_gifsize($bitmapdata);
111             }
112             return undef(); # NG
113             }
114              
115             1;