This is an automated email from the git hooks/post-receive script.

dom pushed a commit to branch master
in repository libchart-strip-perl.git.

commit 6b7e4d8f460d61d230e64d72f07ce75503bff9c7
Author: Dominic Hargreaves <d...@earth.li>
Date:   Tue Feb 26 21:47:20 2008 +0000

    [svn-upgrade] Integrating new upstream version, libchart-strip-perl (1.05)
---
 CHANGES   |   3 +
 MANIFEST  |   1 +
 META.yml  |   2 +-
 Strip.pm  | 398 +++++++++++++++++++++++++++++++++++++++------------------
 t/test3.t | 433 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 713 insertions(+), 124 deletions(-)

diff --git a/CHANGES b/CHANGES
index 0a5e6f5..5f6f52f 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,4 +1,7 @@
 
+1.05
+       xtic changes and speedups
+
 1.04
        added missing files to MANIFEST
 
diff --git a/MANIFEST b/MANIFEST
index 3f66eb7..6641e60 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -6,6 +6,7 @@ Makefile.PL
 Strip.pm
 t/test1.t
 t/test2.t
+t/test3.t
 eg/index.html
 eg/Makefile
 eg/ex1.pl
diff --git a/META.yml b/META.yml
index c450404..53e3946 100644
--- a/META.yml
+++ b/META.yml
@@ -1,7 +1,7 @@
 # http://module-build.sourceforge.net/META-spec.html
 #XXXXXXX This is a prototype!!!  It will change in the future!!! XXXXX#
 name:         Chart-Strip
-version:      1.04
+version:      1.05
 version_from: Strip.pm
 installdirs:  site
 requires:
diff --git a/Strip.pm b/Strip.pm
index e1db111..69f396f 100644
--- a/Strip.pm
+++ b/Strip.pm
@@ -5,9 +5,9 @@
 # Date: 2002-Nov-01 16:11 (EST)
 # Function: draw strip charts
 #
-# $Id: Strip.pm,v 1.14 2006/05/27 18:20:39 jaw Exp jaw $
+# $Id: Strip.pm,v 1.15 2006/06/25 17:48:59 jaw Exp jaw $
 
-$Chart::Strip::VERSION = "1.04";
+$Chart::Strip::VERSION = "1.05";
 
 =head1 NAME
 
@@ -185,6 +185,20 @@ use Carp;
 use POSIX;
 use strict;
 
+my $LT_HM = 1; # time
+my $LT_HR = 2; # time/day
+my $LT_DW = 3; # day/date
+my $LT_DM = 4; # date/yr
+my $LT_YR = 5; # year
+
+my $MT_NO = 0; # none
+my $MT_HR = 1; # hrs
+my $MT_MN = 2; # midnight
+my $MT_SU = 3; # sunday
+my $MT_M1 = 4; # 1st
+my $MT_Y1 = 5; # new years
+
+
 sub new {
     my $class = shift;
     my %param = @_;
@@ -239,11 +253,11 @@ sub new {
     $im->setStyle(gdTransparent, $me->{color}{gray}, gdTransparent, 
gdTransparent);
 
     $im->interlaced('true');
-    $me->{img}->transparent($me->{color}{white})
+    $im->transparent($me->{color}{white})
        if $me->{transparent};
 
-    $me->{img}->rectangle(0, 0, $me->{width}-1, $me->{height}-1,
-            $me->color({ color => ($me->{border_color} || 'black') }))
+    $im->rectangle(0, 0, $me->{width}-1, $me->{height}-1,
+                  $me->color({ color => ($me->{border_color} || 'black') }))
        if $me->{draw_border};
 
     $me;
@@ -552,7 +566,7 @@ sub pretty {
        }
        elsif( $ay < 1/$b**2 ){
            $y *= $b ** 3; $st *= $b ** 3;
-           $sc = 'p';
+           $sc = 'n';
        }
        elsif( $ay < 1/$b ){
            $y *= $b**2; $st *= $b**2;
@@ -563,7 +577,11 @@ sub pretty {
            $sc = 'm';
        }
     }else{
-       if( $ay >= $b**3 ){
+       if( $ay >= $b**4 ){
+           $y /= $b**4;  $st /= $b**4;
+           $sc = 'T';
+       }
+       elsif( $ay >= $b**3 ){
            $y /= $b**3;  $st /= $b**3;
            $sc = 'G';
        }
@@ -628,24 +646,25 @@ sub ytics {
        $me->adjust();
     }
 
-    $me->{grid}{y} = [ @tics ];
+    $me->{grid}{y} = \@tics;
 }
 
 sub drawgrid {
     my $me = shift;
+    my $im = $me->{img};
     
     foreach my $tic (@{$me->{grid}{y}}){
        # ytics + horiz lines
        my $yy = $tic->[0];
-       $me->{img}->line($me->xpt(-1), $yy, $me->xpt(-4), $yy,
+       $im->line($me->xpt(-1), $yy, $me->xpt(-4), $yy,
                         $me->{color}{black});
-       $me->{img}->line($me->xpt(0), $yy, $me->{width} - $me->{margin_right}, 
$yy,
+       $im->line($me->xpt(0), $yy, $me->{width} - $me->{margin_right}, $yy,
                         gdStyled) if $me->{draw_grid};
 
        if( $me->{draw_tic_labels} ){
            my $label = $tic->[1];
            my $w = $tic->[2];
-           $me->{img}->string(gdTinyFont, $me->xpt(-$w), $yy-4,
+           $im->string(gdTinyFont, $me->xpt(-$w), $yy-4,
                               $label,
                               $me->{color}{black});
        }
@@ -655,17 +674,18 @@ sub drawgrid {
        # xtics + vert lines
        my( $t, $ll, $label ) = @$tic;
 
-       if( $ll ){
+       # supress solid line if adjacent to axis
+       if( $ll && ($t != $me->{xd_min}) ){
            # solid line, red label
-           $me->{img}->line($me->xdatapt($t), $me->{margin_top},
+           $im->line($me->xdatapt($t), $me->{margin_top},
                             $me->xdatapt($t), $me->ypt(-4),
                             $me->{color}{black} );
        }else{
            # tic and grid
-           $me->{img}->line($me->xdatapt($t), $me->ypt(-1),
+           $im->line($me->xdatapt($t), $me->ypt(-1),
                             $me->xdatapt($t), $me->ypt(-4),
                             $me->{color}{black} );
-           $me->{img}->line($me->xdatapt($t), $me->{margin_top},
+           $im->line($me->xdatapt($t), $me->{margin_top},
                             $me->xdatapt($t), $me->ypt(0),
                             gdStyled ) if $me->{draw_grid};
        }
@@ -677,88 +697,206 @@ sub drawgrid {
                $a = $me->xdatapt($t) - $me->{width} + length($label) * 6 + 2;
            }
            
-           $me->{img}->string(gdSmallFont, $me->xdatapt($t)-$a, $me->ypt(-6),
+           $im->string(gdSmallFont, $me->xdatapt($t)-$a, $me->ypt(-6),
                               $label, $ll ? $me->{color}{red} : 
$me->{color}{black} );
        }
     }
 }
 
-# this is much too ickky, please re-write
+sub xtic_range_data {
+    my $me    = shift; # not used
+    my $range = shift;
+
+    my $range_hrs  = $range / 3600;
+    my $range_days = $range_hrs / 24;
+
+    # return: step, labeltype, marktype, lti, tmod
+    
+    if( $range < 720 ){
+       (60, $LT_HM, $MT_HR, 1, 1);             # tics: 1 min
+    }
+    elsif( $range < 1800 ){
+       (300, $LT_HM, $MT_HR, 1, 5);            # tics: 5 min
+    }
+    elsif( $range_hrs < 2 ){
+       (600, $LT_HM, $MT_HR, 1, 10);           # tics: 10 min
+    }
+    elsif( $range_hrs < 6 ){
+       (1800, $LT_HR, $MT_MN, 1, 30);          # tics: 30 min
+    }
+    elsif( $range_hrs < 13 ){
+       (3600, $LT_HR, $MT_MN, 2, 1);           # tics: 1 hr
+    }
+    elsif( $range_hrs < 25 ){
+       (3600, $LT_HR, $MT_MN, 2, 2);           # tics: 2 hrs
+    }
+    elsif( $range_hrs < 50 ){
+       (3600, $LT_HR, $MT_MN, 2, 4);           # tics: 4 hrs
+    }
+    elsif( $range_hrs < 75 ){
+       (3600, $LT_HR, $MT_MN, 2, 6);           # tics: 6 hrs
+    }
+
+    # NB: days shorter or longer than 24 hours are corrected for below
+    elsif( $range_days < 15 ){
+       (3600*24, $LT_DW, $MT_SU, 3, 1);        # tics 1 day
+    }
+    elsif( $range_days < 22 ){
+       (3600*24, $LT_DM, $MT_M1, 3, 2);        # tics: 2 days
+    }
+    elsif( $range_days < 80 ){
+       (3600*24, $LT_DM, $MT_M1, 3, 7);        # tics: 7 days
+    }
+    elsif( $range_days < 168 ){
+       (3600*24, $LT_DM, $MT_Y1, 3, 14);       # tics: 14 days
+    }
+    # NB: months shorter than 31 days are corrected for below
+    elsif( $range_days < 370 ){
+       (3600*24*31, $LT_DM, $MT_Y1, 4, 1);     # tics: 1 month
+    }
+    elsif( $range_days < 500 ){
+       (3600*24*31, $LT_DM, $MT_Y1, 4, 2);     # tics: 2 month
+    }
+    elsif( $range_days < 1000 ){
+       (3600*24*31, $LT_DM, $MT_Y1, 4, 3);     # tics: 3 month
+    }
+    elsif( $range_days < 2000 ){
+       (3600*24*31, $LT_DM, $MT_NO, 4, 6);     # tics: 6 month
+    }
+    
+    else{
+       # NB: years less than 366 days are corrected for below
+       (3600*24*366, $LT_YR, $MT_NO, 4, 12);   # tics: 1 yr
+    }
+}
+
+sub xtic_align_initial {
+    my $me   = shift;
+    my $step = shift;
+    
+    my $t = ($step < 3600) ? (int($me->{xd_min} / $step) * $step)
+       : (int($me->{xd_min} / 3600) * 3600);
+
+    if( $step >= 3600*24*365 ){
+       while(1){
+           # search for 1jan
+           my @lt = localtime $t;
+           last if $lt[4] == 0 && $lt[3] == 1 && $lt[2] == 0;
+           # jump fwd: 1M, 1D, or 1H
+           my $dt = ($lt[4] != 11) ? 24*30 : ($lt[3] < 30) ? 24 : 1;
+           $t += $dt * 3600;
+       }
+    }
+    elsif( $step >= 3600*24*31 ){
+       while(1){
+           # find 1st of mon
+           my @lt = localtime $t;
+           last if $lt[3] == 1 && $lt[2] == 0;
+           my $dt = ($lt[3] < 28) ? 24 : 1;
+           $t += $dt * 3600;
+       }
+    }
+    elsif( $step >= 3600*24 ){
+       while(1){
+           # search for midnight
+           my @lt = localtime $t;
+           last unless $lt[2];
+           $t += 3600;
+       }
+    }
+
+    $t;
+}
+
 sub xtics {
     my $me = shift;
-    my( $r, $step, $rd, $n2, $n3, $n4, $lt, $low, $t, @tics );
+    my @tics;
 
     # this is good for (roughly) 10 mins - 10 yrs
     return if $me->{xd_max} == $me->{xd_min};
-    $r = ($me->{xd_max} - $me->{xd_min} ) / 3600;      # => hours
-    $rd   = $r / 24;                                   # days
-    $step = 3600;
-    $n2   = 24; $n3 = $n4 = 1;
-    $low  = int($me->{xd_min} / 3600) * 3600;
+
+    my $range      = $me->{xd_max} - $me->{xd_min};
+    my $range_hrs  = $range / 3600;
+    my $range_days = $range_hrs / 24;
     
-    if( $r < 2 ){              # less than 2 hrs
-       $low = int($me->{xd_min} / 600) * 600;
-       $n2 = 1;
-       $lt = 1;
-       $step = 10 * 60;
-    }elsif( $r < 48 ){         # less than 2 days
-       $n2  = ($r < 13) ? 1 : ($r < 24) ? 2 : 4;
-       $lt  = 1;
-    }
-    elsif( $r < 360 ){         # less than ~ 2 weeks
-       $lt  = 2;
-    }elsif( $rd < 1500 ){      # less than ~ 4yrs
-       $n3  = ($rd < 80)  ? 7 : ($rd < 168) ? 14 : 32;
-       $n4  = ($rd < 370) ? 1 : ($rd < 500) ? 2 : 4;
-       $lt  = 3;
-    }else{
-       $n3 = 32; $n4 = 12;
-       $lt  = 4;
-    }
+    my ($step, $labtyp, $marktyp, $lti, $tmod) = $me->xtic_range_data( $range 
);
+    my $t = $me->xtic_align_initial( $step );
 
-    # print STDERR "xtics min=$me->{xd_min} max=$me->{xd_max}  r=$r, st=$step, 
low=$low, $n2/$n3/$n4\n";
-    for( $t=$low; $t<$me->{xd_max}; $t+=$step ){
-       my $ll;
+    # print "days: $range_days, lt: $labtyp, lti: $lti, tmod: $tmod, st: 
$step\n";
+    # print STDERR "t: $t ", scalar(localtime $t), "\n";
+    
+    for( ; $t<$me->{xd_max}; $t+=$step ){
+       my $redmark = 0;
        next if $t < $me->{xd_min};
-       my @lt = localtime $t;
-       next if $lt[2] % $n2;
-       next if ($lt[3] - 1) % $n3 || (($n3!=1) && $lt[3] > 22 );
-       next if $lt[4] % $n4;
-       if( $lt == 1 && !$lt[2] && !$lt[1] ||      # midnight
-           $lt == 2 && !$lt[6] ||                 # sunday
-           $lt == 3 && $lt[3] == 1 && $rd < 60 || # 1st of month
-           $lt == 3 && $lt[3] == 1 && $lt[4] == 0 # Jan 1
-           ){
-           $ll = 1;
+       my @lt  = localtime $t;
+       my @rlt = @lt;
+       # months go from 0. days from 1. absurd!
+       $lt[3]--;
+       # mathematically, 28 is divisible by 7. but that just looks silly.
+       $lt[3] = 22 if $lt[3] > 22 && $lti==3 && $tmod >= 7;
+
+       if( $step >= 3600*24 && $lt[2] ){
+           # handle daylight saving time changes - resync to midnight
+           my $dt = ($lt[2] > 12 ? $lt[2] - 24 : $lt[2]) * 3600;
+           $dt += $lt[1] * 60;
+           $t -= $dt;
+           redo;
+       }
+       if( $step >= 3600*24*31 && $lt[3] ){
+           # some months are not 31 days!
+           # also corrects years that do not leap
+           my $dt = $lt[3] * 3600*24;
+           $t -= $dt;
+           redo;
        }
        
+       next if $lt[$lti] % $tmod;
+       next if $lt[3] && $lti > 3;
+       next if $lt[2] && $lti > 2;
+       next if $lt[1] && $lti > 1;
+       next if $lt[0] && $lti > 0;
+
+
+       $redmark = 1 if $marktyp == $MT_HR && !$lt[1];                  # on 
the hour
+       $redmark = 1 if $marktyp == $MT_MN && !$lt[2] && !$lt[1];       # 
midnight
+       $redmark = 1 if $marktyp == $MT_SU && !$lt[6];                  # sunday
+       $redmark = 1 if $marktyp == $MT_M1 && !$lt[3];                  # 1st 
of month
+       $redmark = 1 if $marktyp == $MT_Y1 && !$lt[3] && !$lt[4];       # 1 jan
+       
        my $label;
-       if( $lt == 1){
-           $label = sprintf "%d:%0.2d", $lt[2], $lt[1];        # time
+       # NB: strftime obeys LC_TIME for localized day/month names
+       # (if locales are supported in the OS and perl)
+       if( $labtyp == $LT_HM ){
+           $label = sprintf "%d:%0.2d", $rlt[2], $rlt[1];      # time
        }
-       if( $lt == 2 ){
-           if( $ll ){
-               # NB: strftime obeys LC_TIME for localized day/month names
-               # (if locales are supported in the OS and perl)
-               $label = strftime("%d/%b", @lt);        # date DD/Mon
+       if( $labtyp == $LT_HR ){
+           if( $redmark ){
+               $label = strftime("%d/%b", @rlt);               # date DD/Mon
            }else{
-               $label = strftime("%a", @lt);           # day of week
+               $label = sprintf "%d:%0.2d", $rlt[2], $rlt[1];  # time
            }
        }
-       if( $lt == 3){
-           if( $lt[3] == 1 && $lt[4] == 0 ){
-               $label = $lt[5] + 1900;                 # year
+       if( $labtyp == $LT_DW ){
+           if( $redmark ){
+               $label = strftime("%d/%b", @rlt);       # date DD/Mon
            }else{
-               $label = strftime("%d/%b", @lt);        # date DD/Mon
+               $label = strftime("%a", @rlt);          # day of week
            }
        }
-       if( $lt == 4){
-           $label = $lt[5] + 1900; # year
+       if( $labtyp == $LT_DM ){
+           if( !$lt[3] && !$lt[4] ){
+               $label = $rlt[5] + 1900;                # year
+           }else{
+               $label = strftime("%d/%b", @rlt);       # date DD/Mon
+           }
+       }
+       if( $labtyp == $LT_YR ){
+           $label = $rlt[5] + 1900;                    # year
        }
-       push @tics, [$t, $ll, $label];
+       push @tics, [$t, $redmark, $label];
     }
-    $me->{grid}{x} = [@tics];
-        
+    $me->{grid}{x} = \@tics;
+    
 }
 
 # it shall be inventoried, and every particle and utensil
@@ -864,32 +1002,37 @@ sub draw_filled {
     my $im = $me->{img};
     my $limit = $me->{limit_factor} * ($me->{xd_max} - $me->{xd_min}) / @$data;
     my $skipundef = $opts->{skip_undefined} || $me->{skip_undefined};
-    my($px, $py);
+    my($px, $py, $pxdpt, $pydpt);
+    my $ypt0 = $me->ypt(0);
     
     foreach my $s ( @$data ){
        my $x = $s->{time};
        my $y = $s->{value};
-
+       
        next if $x < $me->{xd_min} || $x > $me->{xd_max};
 
-       if( defined($y) || !$skipundef ){
+       my $xdpt  = $me->xdatapt($x);
+       my $ydpt  = $me->ydatapt($y);
 
-           if( defined($px) && ($me->xdatapt($x) - $me->xdatapt($px) > 1) ){
-               $px = $x - $limit if $limit && $x - $px > $limit;
-               
+       if( defined($y) || !$skipundef ){
+           
+           if( defined($px) && ($xdpt - $pxdpt > 1) && (!$limit || $x - $px <= 
$limit) ){
                my $poly = GD::Polygon->new;
-               $poly->addPt($me->xdatapt($px), $me->ypt(0));
-               $poly->addPt($me->xdatapt($px), $me->ydatapt($py));
-               $poly->addPt($me->xdatapt($x),  $me->ydatapt($y));
-               $poly->addPt($me->xdatapt($x),  $me->ypt(0));
+               $poly->addPt($pxdpt, $ypt0);
+               $poly->addPt($pxdpt, $pydpt);
+               $poly->addPt($xdpt,  $ydpt);
+               $poly->addPt($xdpt,  $ypt0);
                $im->filledPolygon($poly, $me->color($s, $opts));
            }else{
-               $im->line( $me->xdatapt($x), $me->ypt(0),
-                          $me->xdatapt($x), $me->ydatapt($y),
+               $im->line( $xdpt, $ypt0,
+                          $xdpt, $ydpt,
                           $me->color($s, $opts) );
            }
+           $px = $x; $pxdpt = $xdpt;
+           $py = $y; $pydpt = $ydpt;
+       }else{
+           $px = undef;
        }
-       $px = $x; $py = $y;
     }
 }
 
@@ -902,7 +1045,7 @@ sub draw_line {
     my $limit = $me->{limit_factor} * ($me->{xd_max} - $me->{xd_min}) / @$data;
     my $thick = $opts->{thickness} || $me->{thickness};
     my $skipundef = $opts->{skip_undefined} || $me->{skip_undefined};
-    my($px, $py);
+    my($px, $py, $pxdpt, $pydpt);
 
     $me->set_thickness( $thick ) if $thick;
     
@@ -911,19 +1054,24 @@ sub draw_line {
        my $y = $s->{value};
 
        next if $x < $me->{xd_min} || $x > $me->{xd_max};
+       
+       my $xdpt  = $me->xdatapt($x);
+       my $ydpt  = $me->ydatapt($y);
 
        if( defined($y) || !$skipundef ){
-           if( defined($py) ){
-               $px = $x - $limit if $limit && $x - $px > $limit;
-               $im->line( $me->xdatapt($px), $me->ydatapt($py),
-                          $me->xdatapt($x),  $me->ydatapt($y),
+           if( defined($px) && (!$limit || $x - $px <= $limit) ){
+               $im->line( $pxdpt, $pydpt,
+                          $xdpt,  $ydpt,
                           $me->color($s, $opts) );
            }else{
-               $im->setPixel($me->xdatapt($x),  $me->ydatapt($y),
+               $im->setPixel($xdpt,  $ydpt,
                              $me->color($s, $opts) );
            }
+           $px = $x; $pxdpt = $xdpt;
+           $py = $y; $pydpt = $ydpt;
+       }else{
+           $px = undef;
        }
-       $px = $x; $py = $y;
     }
     $me->set_thickness( 1 ) if $thick;
 }
@@ -932,40 +1080,42 @@ sub draw_range {
     my $me   = shift;
     my $data = shift;
     my $opts = shift;
-
+    
     my $im = $me->{img};
     my $limit = $me->{limit_factor} * ($me->{xd_max} - $me->{xd_min}) / @$data;
     my $skipundef = $opts->{skip_undefined} || $me->{skip_undefined};
-    my($px, $pn, $pm);
+    my($px, $pn, $pm, $pxdpt);
     
     foreach my $s ( @$data ){
-         my $x = $s->{time};
-         my $a = defined $s->{min} ? $s->{min} : $s->{value};
-         my $b = defined $s->{max} ? $s->{max} : $s->{value};
-
-         next if $x < $me->{xd_min} || $x > $me->{xd_max};
-
-         $a = $b if !defined($a) && $skipundef;
-         $b = $a if !defined($b) && $skipundef;
-         
-         if( defined($a) || !$skipundef ){
-
-             if( defined($px) && ($me->xdatapt($x) - $me->xdatapt($px) > 1) ){
-                 my $poly = GD::Polygon->new;
-                 $px = $x - $limit if $limit && $x - $px > $limit;
-                 
-                 $poly->addPt($me->xdatapt($px), $me->ydatapt($pn));
-                 $poly->addPt($me->xdatapt($px), $me->ydatapt($pm));
-                 $poly->addPt($me->xdatapt($x),  $me->ydatapt($b));
-                 $poly->addPt($me->xdatapt($x),  $me->ydatapt($a));
-                 $im->filledPolygon($poly, $me->color($s, $opts));
-             }else{
-                 $im->line( $me->xdatapt($x),  $me->ydatapt($b),
-                            $me->xdatapt($x),  $me->ydatapt($a),
-                            $me->color($s, $opts) );
-             }
-         }
-         $px = $x; $pn = $a; $pm = $b;
+       my $x = $s->{time};
+       my $a = defined $s->{min} ? $s->{min} : $s->{value};
+       my $b = defined $s->{max} ? $s->{max} : $s->{value};
+       my $xdpt  = $me->xdatapt($x);
+       
+       next if $x < $me->{xd_min} || $x > $me->{xd_max};
+       
+       $a = $b if !defined($a) && $skipundef;
+       $b = $a if !defined($b) && $skipundef;
+       
+       if( defined($a) || !$skipundef ){
+           
+           if( defined($px) && ($xdpt - $pxdpt > 1) && (!$limit || $x - $px <= 
$limit) ){
+               my $poly = GD::Polygon->new;
+               $poly->addPt($pxdpt, $me->ydatapt($pn));
+               $poly->addPt($pxdpt, $me->ydatapt($pm));
+               $poly->addPt($xdpt,  $me->ydatapt($b));
+               $poly->addPt($xdpt,  $me->ydatapt($a));
+               $im->filledPolygon($poly, $me->color($s, $opts));
+           }else{
+               $im->line( $xdpt,  $me->ydatapt($b),
+                          $xdpt,  $me->ydatapt($a),
+                          $me->color($s, $opts) );
+           }
+           $px = $x; $pn = $a; $pm = $b;
+           $pxdpt = $xdpt;
+       }else{
+           $px = undef;
+       }
     }
 }
 
@@ -985,9 +1135,11 @@ sub draw_points {
 
        next if $x < $me->{xd_min} || $x > $me->{xd_max};
        next if !defined($y) && $skipundef;
+       my $xdpt = $me->xdatapt($x);
+       my $ydpt = $me->ydatapt($y);
        
        while( $d > 0 ){
-           $im->arc( $me->xdatapt($x),  $me->ydatapt($y),
+           $im->arc( $xdpt, $ydpt,
                      $d, $d, 0, 360,
                      $c );
            $d -= 2;
@@ -1049,7 +1201,7 @@ sub draw_boxes {
 =head1 EXAMPLE IMAGES
 
     http://argus.tcp4me.com/shots.html
-    http://search.cpan.org/src/JAW/Chart-Strip-1.04/eg/
+    http://search.cpan.org/src/JAW/Chart-Strip-1.05/eg/
 
 =head1 BUGS
 
diff --git a/t/test3.t b/t/test3.t
new file mode 100644
index 0000000..562e3ff
--- /dev/null
+++ b/t/test3.t
@@ -0,0 +1,433 @@
+
+# test new xtic code
+use Chart::Strip;
+use strict;
+
+my $MK = 0;
+my $H = 3600;
+my $D = $H * 24;
+my @t;
+
+eval {
+    # tests assume US/eastern, en_us. skip if we can't make compat.
+    require POSIX;
+    POSIX->import();
+    $ENV{TZ} = 'EST5EDT';
+    setlocale( LC_ALL(), "C" );
+    tzset();
+    if( localtime(1151726400) ne 'Sat Jul  1 00:00:00 2006' ){
+       die "tests not configured for this timezone/locale\n";
+    }
+};
+if($@){
+    print "1..0 # Skipped: cannot make timezone/locale compatible\n";
+    exit;
+}
+
+if( localtime(1175400000) ne 'Sun Apr  1 00:00:00 2007' ){
+    # the US govmit changed the daylight saving time rules.
+    # most OSes don't know that
+    # expect the fallout from this to be much worse than y2k.
+
+    print "1..0 # Skipped: OS has out of date daylight saving time rules\n";
+    exit;
+}
+
+# return xtic data for specified time range
+sub gen {
+    my $t0  = shift;
+    my $dur = shift;
+    
+    my $c = Chart::Strip->new();
+    $c->add_data( [ {time => $t0,        value => 1},
+                   {time => $t0 + $dur, value => 1}],
+                 { style => 'line' });
+    $c->plot();
+    $c->{grid}{x};
+}
+
+sub test {
+    my $t  = shift;
+    my $mk = shift;
+
+    if( !ref $t ){
+       print "$t\n" if $mk;
+       return 'ok';
+    }
+    
+    my $t0  = $t->{start};
+    my $dur = $t->{dur};
+    my $exp = $t->{exp};
+    
+    $dur = $1 * $D if $dur =~ /(\d+)D/;
+    $dur = $1 * $H if $dur =~ /(\d+)H/;
+    
+    my $res = gen( $t0, $dur );
+
+    my $err;
+    $err = 1 if @$res != @$exp;
+
+    if( $mk ){
+       my $pv;
+       for my $r (@$res){
+           my $dt = $pv ? $r->[0] - $pv : '';
+           print "$t->{dur}\t$t0\t$r->[0]\t$r->[1]\t$r->[2]\t$dt\n";
+           $pv = $r->[0];
+       }
+       print "\n";
+    }
+    
+    for my $e (@$exp){
+       my $terr;
+       my $r = shift @$res;
+       $terr = 1 unless $e->[0] == $r->[0];
+       $terr = 1 unless $e->[1] == $r->[1];
+       $terr = 1 unless $e->[2] eq $r->[2];
+       $err ||= $terr;
+
+       print STDERR "error: @$e != @$r\n"
+         if $terr;
+    }
+
+
+    $err ? 'not ok' : 'ok';
+}
+
+
+my $pd = '';
+while(<DATA>){
+    chop;
+    my @l = split;
+    my $dur = $l[0];
+    my $t0  = $l[1];
+    my $exp = [@l[2,3,4,5]];
+
+    if( /^\#/ ){
+       # preserve comments
+       push @t, $_;
+       next;
+    }
+    next unless $dur;
+    
+    if($dur eq $pd){
+       push @{$t[-1]{exp}}, $exp;
+    }else{
+       push @t, { dur => $dur, start => $t0, exp => [$exp] };
+    }
+    $pd = $dur;
+}
+
+print "1..", scalar @t, "\n" unless $MK;
+my $n = 1;
+foreach my $t (@t){
+    my $r = test($t, $MK);
+    print "$r ", $n++, "\n" unless $MK;
+}
+
+# duration start expected result: tic-time, redmark, label, delta(not-used)
+__END__
+2100D  1151726400      1167627600      0       2007    
+2100D  1151726400      1199163600      0       2008    31536000
+2100D  1151726400      1230786000      0       2009    31622400
+2100D  1151726400      1262322000      0       2010    31536000
+2100D  1151726400      1293858000      0       2011    31536000
+2100D  1151726400      1325394000      0       2012    31536000
+
+1500D  1151726400      1151726400      0       01/Jul  
+1500D  1151726400      1167627600      0       2007    15901200
+1500D  1151726400      1183262400      0       01/Jul  15634800
+1500D  1151726400      1199163600      0       2008    15901200
+1500D  1151726400      1214884800      0       01/Jul  15721200
+1500D  1151726400      1230786000      0       2009    15901200
+1500D  1151726400      1246420800      0       01/Jul  15634800
+1500D  1151726400      1262322000      0       2010    15901200
+1500D  1151726400      1277956800      0       01/Jul  15634800
+
+750D   1151726400      1151726400      0       01/Jul  
+750D   1151726400      1159675200      0       01/Oct  7948800
+750D   1151726400      1167627600      1       2007    7952400
+750D   1151726400      1175400000      0       01/Apr  7776000
+750D   1151726400      1183262400      0       01/Jul  7858800
+750D   1151726400      1191211200      0       01/Oct  7948800
+750D   1151726400      1199163600      1       2008    7952400
+750D   1151726400      1207022400      0       01/Apr  7862400
+750D   1151726400      1214884800      0       01/Jul  7858800
+
+400D   1151726400      1151726400      0       01/Jul  
+400D   1151726400      1157083200      0       01/Sep  5356800
+400D   1151726400      1162357200      0       01/Nov  5274000
+400D   1151726400      1167627600      1       2007    5270400
+400D   1151726400      1172725200      0       01/Mar  5097600
+400D   1151726400      1177992000      0       01/May  5266800
+400D   1151726400      1183262400      0       01/Jul  5270400
+
+200D   1151726400      1151726400      0       01/Jul  
+200D   1151726400      1154404800      0       01/Aug  2678400
+200D   1151726400      1157083200      0       01/Sep  2678400
+200D   1151726400      1159675200      0       01/Oct  2592000
+200D   1151726400      1162357200      0       01/Nov  2682000
+200D   1151726400      1164949200      0       01/Dec  2592000
+200D   1151726400      1167627600      1       2007    2678400
+
+100D   1151726400      1151726400      0       01/Jul  
+100D   1151726400      1152936000      0       15/Jul  1209600
+100D   1151726400      1154404800      0       01/Aug  1468800
+100D   1151726400      1155614400      0       15/Aug  1209600
+100D   1151726400      1157083200      0       01/Sep  1468800
+100D   1151726400      1158292800      0       15/Sep  1209600
+100D   1151726400      1159675200      0       01/Oct  1382400
+
+50D    1151726400      1151726400      1       01/Jul  
+50D    1151726400      1152331200      0       08/Jul  604800
+50D    1151726400      1152936000      0       15/Jul  604800
+50D    1151726400      1153540800      0       22/Jul  604800
+50D    1151726400      1154404800      1       01/Aug  864000
+50D    1151726400      1155009600      0       08/Aug  604800
+50D    1151726400      1155614400      0       15/Aug  604800
+
+20D    1151726400      1151726400      1       01/Jul  
+20D    1151726400      1151899200      0       03/Jul  172800
+20D    1151726400      1152072000      0       05/Jul  172800
+20D    1151726400      1152244800      0       07/Jul  172800
+20D    1151726400      1152417600      0       09/Jul  172800
+20D    1151726400      1152590400      0       11/Jul  172800
+20D    1151726400      1152763200      0       13/Jul  172800
+20D    1151726400      1152936000      0       15/Jul  172800
+20D    1151726400      1153108800      0       17/Jul  172800
+20D    1151726400      1153281600      0       19/Jul  172800
+
+12D    1151726400      1151726400      0       Sat     
+12D    1151726400      1151812800      1       02/Jul  86400
+12D    1151726400      1151899200      0       Mon     86400
+12D    1151726400      1151985600      0       Tue     86400
+12D    1151726400      1152072000      0       Wed     86400
+12D    1151726400      1152158400      0       Thu     86400
+12D    1151726400      1152244800      0       Fri     86400
+12D    1151726400      1152331200      0       Sat     86400
+12D    1151726400      1152417600      1       09/Jul  86400
+12D    1151726400      1152504000      0       Mon     86400
+12D    1151726400      1152590400      0       Tue     86400
+12D    1151726400      1152676800      0       Wed     86400
+
+6D     1151726400      1151726400      0       Sat     
+6D     1151726400      1151812800      1       02/Jul  86400
+6D     1151726400      1151899200      0       Mon     86400
+6D     1151726400      1151985600      0       Tue     86400
+6D     1151726400      1152072000      0       Wed     86400
+6D     1151726400      1152158400      0       Thu     86400
+
+3D     1151726400      1151726400      1       01/Jul  
+3D     1151726400      1151748000      0       6:00    21600
+3D     1151726400      1151769600      0       12:00   21600
+3D     1151726400      1151791200      0       18:00   21600
+3D     1151726400      1151812800      1       02/Jul  21600
+3D     1151726400      1151834400      0       6:00    21600
+3D     1151726400      1151856000      0       12:00   21600
+3D     1151726400      1151877600      0       18:00   21600
+3D     1151726400      1151899200      1       03/Jul  21600
+3D     1151726400      1151920800      0       6:00    21600
+3D     1151726400      1151942400      0       12:00   21600
+3D     1151726400      1151964000      0       18:00   21600
+
+2D     1151726400      1151726400      1       01/Jul  
+2D     1151726400      1151740800      0       4:00    14400
+2D     1151726400      1151755200      0       8:00    14400
+2D     1151726400      1151769600      0       12:00   14400
+2D     1151726400      1151784000      0       16:00   14400
+2D     1151726400      1151798400      0       20:00   14400
+2D     1151726400      1151812800      1       02/Jul  14400
+2D     1151726400      1151827200      0       4:00    14400
+2D     1151726400      1151841600      0       8:00    14400
+2D     1151726400      1151856000      0       12:00   14400
+2D     1151726400      1151870400      0       16:00   14400
+2D     1151726400      1151884800      0       20:00   14400
+
+18H    1151726400      1151726400      1       01/Jul  
+18H    1151726400      1151733600      0       2:00    7200
+18H    1151726400      1151740800      0       4:00    7200
+18H    1151726400      1151748000      0       6:00    7200
+18H    1151726400      1151755200      0       8:00    7200
+18H    1151726400      1151762400      0       10:00   7200
+18H    1151726400      1151769600      0       12:00   7200
+18H    1151726400      1151776800      0       14:00   7200
+18H    1151726400      1151784000      0       16:00   7200
+
+9H     1151726400      1151726400      1       01/Jul  
+9H     1151726400      1151730000      0       1:00    3600
+9H     1151726400      1151733600      0       2:00    3600
+9H     1151726400      1151737200      0       3:00    3600
+9H     1151726400      1151740800      0       4:00    3600
+9H     1151726400      1151744400      0       5:00    3600
+9H     1151726400      1151748000      0       6:00    3600
+9H     1151726400      1151751600      0       7:00    3600
+9H     1151726400      1151755200      0       8:00    3600
+
+# check near leap year (near 1Mar2004)
+6H     1078106400      1078106400      0       21:00   
+6H     1078106400      1078110000      0       22:00   3600
+6H     1078106400      1078113600      0       23:00   3600
+6H     1078106400      1078117200      1       01/Mar  3600
+6H     1078106400      1078120800      0       1:00    3600
+6H     1078106400      1078124400      0       2:00    3600
+
+22H    1078074000      1078074000      0       12:00   
+22H    1078074000      1078081200      0       14:00   7200
+22H    1078074000      1078088400      0       16:00   7200
+22H    1078074000      1078095600      0       18:00   7200
+22H    1078074000      1078102800      0       20:00   7200
+22H    1078074000      1078110000      0       22:00   7200
+22H    1078074000      1078117200      1       01/Mar  7200
+22H    1078074000      1078124400      0       2:00    7200
+22H    1078074000      1078131600      0       4:00    7200
+22H    1078074000      1078138800      0       6:00    7200
+22H    1078074000      1078146000      0       8:00    7200
+
+14D    1077512400      1077512400      0       Mon     
+14D    1077512400      1077598800      0       Tue     86400
+14D    1077512400      1077685200      0       Wed     86400
+14D    1077512400      1077771600      0       Thu     86400
+14D    1077512400      1077858000      0       Fri     86400
+14D    1077512400      1077944400      0       Sat     86400
+14D    1077512400      1078030800      1       29/Feb  86400
+14D    1077512400      1078117200      0       Mon     86400
+14D    1077512400      1078203600      0       Tue     86400
+14D    1077512400      1078290000      0       Wed     86400
+14D    1077512400      1078376400      0       Thu     86400
+14D    1077512400      1078462800      0       Fri     86400
+14D    1077512400      1078549200      0       Sat     86400
+14D    1077512400      1078635600      1       07/Mar  86400
+
+20D    1077512400      1077512400      0       23/Feb  
+20D    1077512400      1077685200      0       25/Feb  172800
+20D    1077512400      1077858000      0       27/Feb  172800
+20D    1077512400      1078030800      0       29/Feb  172800
+20D    1077512400      1078117200      1       01/Mar  86400
+20D    1077512400      1078290000      0       03/Mar  172800
+20D    1077512400      1078462800      0       05/Mar  172800
+20D    1077512400      1078635600      0       07/Mar  172800
+20D    1077512400      1078808400      0       09/Mar  172800
+20D    1077512400      1078981200      0       11/Mar  172800
+20D    1077512400      1079154000      0       13/Mar  172800
+
+# and near non-leap year (near 1Mar2005)
+6H     1109642400      1109642400      0       21:00   
+6H     1109642400      1109646000      0       22:00   3600
+6H     1109642400      1109649600      0       23:00   3600
+6H     1109642400      1109653200      1       01/Mar  3600
+6H     1109642400      1109656800      0       1:00    3600
+6H     1109642400      1109660400      0       2:00    3600
+
+22H    1109610000      1109610000      0       12:00   
+22H    1109610000      1109617200      0       14:00   7200
+22H    1109610000      1109624400      0       16:00   7200
+22H    1109610000      1109631600      0       18:00   7200
+22H    1109610000      1109638800      0       20:00   7200
+22H    1109610000      1109646000      0       22:00   7200
+22H    1109610000      1109653200      1       01/Mar  7200
+22H    1109610000      1109660400      0       2:00    7200
+22H    1109610000      1109667600      0       4:00    7200
+22H    1109610000      1109674800      0       6:00    7200
+22H    1109610000      1109682000      0       8:00    7200
+
+14D    1109048400      1109048400      0       Tue     
+14D    1109048400      1109134800      0       Wed     86400
+14D    1109048400      1109221200      0       Thu     86400
+14D    1109048400      1109307600      0       Fri     86400
+14D    1109048400      1109394000      0       Sat     86400
+14D    1109048400      1109480400      1       27/Feb  86400
+14D    1109048400      1109566800      0       Mon     86400
+14D    1109048400      1109653200      0       Tue     86400
+14D    1109048400      1109739600      0       Wed     86400
+14D    1109048400      1109826000      0       Thu     86400
+14D    1109048400      1109912400      0       Fri     86400
+14D    1109048400      1109998800      0       Sat     86400
+14D    1109048400      1110085200      1       06/Mar  86400
+14D    1109048400      1110171600      0       Mon     86400
+
+20D    1109048400      1109134800      0       23/Feb  
+20D    1109048400      1109307600      0       25/Feb  172800
+20D    1109048400      1109480400      0       27/Feb  172800
+20D    1109048400      1109653200      1       01/Mar  172800
+20D    1109048400      1109826000      0       03/Mar  172800
+20D    1109048400      1109998800      0       05/Mar  172800
+20D    1109048400      1110171600      0       07/Mar  172800
+20D    1109048400      1110344400      0       09/Mar  172800
+20D    1109048400      1110517200      0       11/Mar  172800
+20D    1109048400      1110690000      0       13/Mar  172800
+
+# check near time change (2Apr)
+4H     1143954000      1143954000      1       02/Apr  
+4H     1143954000      1143955800      0       0:30    1800
+4H     1143954000      1143957600      0       1:00    1800
+4H     1143954000      1143959400      0       1:30    1800
+4H     1143954000      1143961200      0       3:00    1800
+4H     1143954000      1143963000      0       3:30    1800
+4H     1143954000      1143964800      0       4:00    1800
+4H     1143954000      1143966600      0       4:30    1800
+
+8H     1143954000      1143954000      1       02/Apr  
+8H     1143954000      1143957600      0       1:00    3600
+8H     1143954000      1143961200      0       3:00    3600
+8H     1143954000      1143964800      0       4:00    3600
+8H     1143954000      1143968400      0       5:00    3600
+8H     1143954000      1143972000      0       6:00    3600
+8H     1143954000      1143975600      0       7:00    3600
+8H     1143954000      1143979200      0       8:00    3600
+
+2D     1143954000      1143954000      1       02/Apr  
+2D     1143954000      1143964800      0       4:00    10800
+2D     1143954000      1143979200      0       8:00    14400
+2D     1143954000      1143993600      0       12:00   14400
+2D     1143954000      1144008000      0       16:00   14400
+2D     1143954000      1144022400      0       20:00   14400
+2D     1143954000      1144036800      1       03/Apr  14400
+2D     1143954000      1144051200      0       4:00    14400
+2D     1143954000      1144065600      0       8:00    14400
+2D     1143954000      1144080000      0       12:00   14400
+2D     1143954000      1144094400      0       16:00   14400
+2D     1143954000      1144108800      0       20:00   14400
+2D     1143954000      1144123200      1       04/Apr  14400
+
+4D     1143954000      1143954000      1       02/Apr  
+4D     1143954000      1144036800      0       Mon     82800
+4D     1143954000      1144123200      0       Tue     86400
+4D     1143954000      1144209600      0       Wed     86400
+4D     1143954000      1144296000      0       Thu     86400
+
+# check near time change (29Oct)
+4H     1162094400      1162094400      1       29/Oct  
+4H     1162094400      1162096200      0       0:30    1800
+4H     1162094400      1162098000      0       1:00    1800
+4H     1162094400      1162099800      0       1:30    1800
+4H     1162094400      1162101600      0       1:00    1800
+4H     1162094400      1162103400      0       1:30    1800
+4H     1162094400      1162105200      0       2:00    1800
+4H     1162094400      1162107000      0       2:30    1800
+
+8H     1162094400      1162094400      1       29/Oct  
+8H     1162094400      1162098000      0       1:00    3600
+8H     1162094400      1162101600      0       1:00    3600
+8H     1162094400      1162105200      0       2:00    3600
+8H     1162094400      1162108800      0       3:00    3600
+8H     1162094400      1162112400      0       4:00    3600
+8H     1162094400      1162116000      0       5:00    3600
+8H     1162094400      1162119600      0       6:00    3600
+
+2D     1162094400      1162094400      1       29/Oct  
+2D     1162094400      1162112400      0       4:00    18000
+2D     1162094400      1162126800      0       8:00    14400
+2D     1162094400      1162141200      0       12:00   14400
+2D     1162094400      1162155600      0       16:00   14400
+2D     1162094400      1162170000      0       20:00   14400
+2D     1162094400      1162184400      1       30/Oct  14400
+2D     1162094400      1162198800      0       4:00    14400
+2D     1162094400      1162213200      0       8:00    14400
+2D     1162094400      1162227600      0       12:00   14400
+2D     1162094400      1162242000      0       16:00   14400
+2D     1162094400      1162256400      0       20:00   14400
+
+4D     1162094400      1162094400      1       29/Oct  
+4D     1162094400      1162184400      0       Mon     90000
+4D     1162094400      1162270800      0       Tue     86400
+4D     1162094400      1162357200      0       Wed     86400
+

-- 
Alioth's /usr/local/bin/git-commit-notice on 
/srv/git.debian.org/git/pkg-perl/packages/libchart-strip-perl.git.git

_______________________________________________
Pkg-perl-cvs-commits mailing list
Pkg-perl-cvs-commits@lists.alioth.debian.org
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-perl-cvs-commits

Reply via email to