File Coverage

blib/lib/Data/Petitcom/Resource/COL.pm
Criterion Covered Total %
statement 50 50 100.0
branch n/a
condition 1 2 50.0
subroutine 13 13 100.0
pod 0 2 0.0
total 64 67 95.5


line stmt bran cond sub pod time code
1             package Data::Petitcom::Resource::COL;
2              
3 1     1   5 use strict;
  1         2  
  1         33  
4 1     1   5 use warnings;
  1         2  
  1         26  
5              
6 1     1   4 use parent qw{ Data::Petitcom::Resource };
  1         2  
  1         7  
7              
8 1     1   952 use bytes ();
  1         8  
  1         19  
9 1     1   444 use Data::Petitcom::PTC;
  1         2  
  1         30  
10 1     1   544 use Data::Petitcom::BMP qw{ Load Dump RGB555toRGB888 RGB888toRGB555 };
  1         2  
  1         74  
11              
12 1     1   5 use constant RESOUECE => 'COL';
  1         1  
  1         39  
13 1     1   4 use constant PTC_OFFSET_DATA => 0x0C;
  1         1  
  1         48  
14 1     1   5 use constant PTC_COLORMAP_LENGTH => 512; # RGB555(16bit) x 256colors
  1         2  
  1         38  
15 1     1   4 use constant COLORMAP_COLS => 16;
  1         1  
  1         31  
16 1     1   4 use constant PTC_NAME => 'DPTC_COL';
  1         1  
  1         330  
17              
18             sub save {
19 1     1 0 7 my $self = shift;
20 1         3 my %opts = @_;
21 1         3 my $name = delete $opts{name};
22 1   50     17 my $ptc = Data::Petitcom::PTC->new(
23             resource => RESOUECE,
24             name => $name || PTC_NAME,
25             version => 'PETC0100',
26             );
27 1         6 my $bmp = Load( $self->data );
28 1         7 my $rgb555 = RGB888toRGB555( $bmp->{colormap} );
29 1         14 $ptc->data( pack 'v*', @$rgb555 );
30 1         17 return $ptc;
31             }
32              
33             sub load {
34 1     1 0 2 my $self = shift;
35 1         3 my $ptc = shift;
36 1         8 my $raw_colormap
37             = bytes::substr( $ptc->data, PTC_OFFSET_DATA, PTC_COLORMAP_LENGTH );
38 1         39 my @rgb555 = unpack 'v*', $raw_colormap; # LE-short
39 1         24 my $rgb888 = RGB555toRGB888(@rgb555);
40 256         458 my $raw_bmp = Dump(
41             width => COLORMAP_COLS,
42             height => COLORMAP_COLS,
43             colormap => $rgb888,
44             pixels => [ map {
45 1         5 ( (COLORMAP_COLS - 1) - int( $_ / COLORMAP_COLS ) ) * COLORMAP_COLS + $_ % COLORMAP_COLS
46             } ( 0 .. 255 ) ],
47             );
48 1         16 $self->data($raw_bmp);
49 1         14 return $self;
50             }
51              
52             1;