File Coverage

blib/lib/App/Image/Generator.pm
Criterion Covered Total %
statement 55 70 78.5
branch 5 16 31.2
condition 7 12 58.3
subroutine 14 14 100.0
pod 2 2 100.0
total 83 114 72.8


line stmt bran cond sub pod time code
1             package App::Image::Generator;
2              
3 4     4   197553 use strict;
  4         9  
  4         147  
4 4     4   18 use warnings;
  4         8  
  4         207  
5              
6 4     4   4719 use English;
  4         15795  
  4         25  
7 4     4   4331 use Error::Pure qw(err);
  4         39001  
  4         109  
8 4     4   344 use File::Basename qw(fileparse);
  4         9  
  4         410  
9 4     4   2414 use Getopt::Std;
  4         11623  
  4         320  
10 4     4   2166 use Image::Checkerboard 0.05;
  4         466100  
  4         184  
11 4     4   2419 use Image::Random;
  4         10178  
  4         228  
12 4     4   2494 use Image::Select;
  4         136649  
  4         241  
13 4     4   46 use List::Util 1.33 qw(none);
  4         115  
  4         366  
14 4     4   31 use Readonly;
  4         8  
  4         4184  
15              
16             # Constants.
17             Readonly::Scalar our $EMPTY_STR => q{};
18             Readonly::Array our @PATTERNS => qw(checkerboard);
19              
20             our $VERSION = 0.08;
21              
22             # Constructor.
23             sub new {
24 6     6 1 850133 my $class = shift;
25              
26             # Create object.
27 6         18 my $self = bless {}, $class;
28              
29             # Object.
30 6         29 return $self;
31             }
32              
33             # Run script.
34             sub run {
35 5     5 1 10 my $self = shift;
36              
37             # Process arguments.
38 5         58 $self->{'_opts'} = {
39             'h' => 0,
40             'i' => $EMPTY_STR,
41             'p' => undef,
42             's' => '1920x1080',
43             'v' => 0,
44             };
45 5 100 100     24 if (! getopts('hi:p:s:v', $self->{'_opts'})
      100        
46             || $self->{'_opts'}->{'h'}
47             || @ARGV < 1) {
48              
49 3         430 print STDERR "Usage: $0 [-h] [-i input_dir] [-p pattern] [-s size] [-v]".
50             "\n\t[--version] output_file\n\n";
51 3         79 print STDERR "\t-h\t\tPrint help.\n";
52 3         37 print STDERR "\t-i input_dir\tInput directory with ".
53             "images (default value is nothing).\n";
54 3         32 print STDERR "\t-p pattern\tPattern (checkerboard).\n";
55 3         31 print STDERR "\t-s size\t\tSize (default value is ".
56             "1920x1080).\n";
57 3         32 print STDERR "\t-v\t\tVerbose mode.\n";
58 3         31 print STDERR "\t--version\tPrint version.\n";
59              
60 3         20 return 1;
61             }
62 2         153 $self->{'_output_file'} = $ARGV[0];
63              
64             # Check size.
65 2 100       13 if ($self->{'_opts'}->{'s'} !~ m/^(\d+)x(\d+)$/ms) {
66 1         7 err 'Bad size value.', 'Value', $self->{'_opts'}->{'s'};
67             }
68 1         4 $self->{'_width'} = $1;
69 1         4 $self->{'_height'} = $2;
70              
71 1 50 33     14 if (defined $self->{'_opts'}->{'p'}
72 1     1   15 && none { $self->{'_opts'}->{'p'} eq $_ } @PATTERNS) {
73              
74 1         17 err 'Bad pattern.';
75             }
76              
77             # Run.
78 0           eval {
79 0           my (undef, undef, $suffix) = fileparse($self->{'_output_file'},
80             qr{\..*$});
81 0           $suffix =~ s/^\.//g;
82 0           my $type = lc($suffix);
83 0 0         if ($type eq 'jpg') {
84 0           $type = 'jpeg';
85             }
86              
87             # Images from directory.
88 0           my $ig;
89 0 0 0       if ($self->{'_opts'}->{'i'} ne $EMPTY_STR) {
    0          
90             $ig = Image::Select->new(
91             'debug' => ($self->{'_opts'}->{'v'} ? 1 : 0),
92             'height' => $self->{'_height'},
93             'path_to_images' => $self->{'_opts'}->{'i'},
94             'type' => $type,
95 0 0         'width' => $self->{'_width'},
96             );
97              
98             # Patterns.
99             } elsif (defined $self->{'_opts'}->{'p'}
100             && $self->{'_opts'}->{'p'} eq 'checkerboard') {
101              
102             $ig = Image::Checkerboard->new(
103             'height' => $self->{'_height'},
104             'type' => $type,
105 0           'width' => $self->{'_width'},
106             );
107              
108             # Random image.
109             } else {
110             $ig = Image::Random->new(
111             'height' => $self->{'_height'},
112             'type' => $type,
113 0           'width'=> $self->{'_width'},
114             );
115             }
116 0           $ig->create($self->{'_output_file'});
117             };
118 0 0         if ($EVAL_ERROR) {
119 0           err 'Cannot create image.';
120             }
121              
122 0           return 0;
123             }
124              
125             1;
126              
127             __END__