Hi Ramon,

 committed to CVS.

Martin

--- Ramon Bastiaans <[EMAIL PROTECTED]> wrote:

> Hi guys,
> 
> I noticed there was a bug in pie.php which occurs whenever a very
> small 
> (load) percentage was drawn as a pie slice.
> When drawing these small pie slices, the entire background of the pie
> 
> chart got floodfilled with color.
> 
> I have fixed the bug and while I was at it I added a 3D look/feel to
> the 
> chart.
> 
> I have attached the following to this e-mail:
> - screenshot of the bugged pie chart
> - screenshot of my new pie chart
> - diff patch
> 
> Let me know if you think this patch is okay. ;)
> 
> Kind regards,
> - Ramon.
> 
> -- 
> ing. R. Bastiaans            HPC - Systems Programmer
> 
> SARA - Computing and Networking Services
> Kruislaan 415                PO Box 194613
> 1098 SJ Amsterdam            1090 GP Amsterdam
> Tel. +31 (0) 20 592 3000     Fax. +31 (0) 20 668 3167
> ---
> There are really only three types of people:
> 
>   Those who make things happen, those who watch things happen
>   and those who say, "What happened?"
> 
> > --- /home/sara/hpc/ramon/src/ganglia_cvs/monitor-core/web/pie.php
> 2005-10-10 09:42:26.000000000 +0200
> +++ ./pie.php 2006-03-09 17:42:14.189725869 +0100
> @@ -112,6 +112,10 @@
>      ** Initialize the object and draw the pie. This would be the
>      ** constructor in an ordinary OO scenario -- just that we
> haven't
>      ** got constructors in PHP, now do we? ;-)
> +    **
> +    ** RB 09.03.2006:
> +    **   - rearranged: please use indentation to seperate if/for
> blocks/statements!
> +    **   - modified to use draw_slices in stead of draw_slice
>      */
>      function init ($w, $h, $d) {
>        $this->im= ImageCreate($w, $h);
> @@ -127,34 +131,24 @@
>        $this->fy = array(0, 7,8,10,14,11);
>        /* decide the diameter of the pie */
>        if ($this->da_height > $this->da_width) {
> -      $this->diameter = $this->da_width;
> +        $this->diameter = $this->da_width;
>        } else {
> -      $this->diameter = $this->da_height;
> +        $this->diameter = $this->da_height;
>        }
>        $this->white = ImageColorAllocate($this->im, 255, 255, 255);
>        $this->black = ImageColorAllocate($this->im,0,0,0);
>        $n = count($this->data);
>        for ($i = 0; $i < $n; $i++) {
> -      $this->colors[$i] = ImageColorAllocate($this->im,
> $this->data[$i][2],
> -      $this->data[$i][3],
> -      $this->data[$i][4]);
> -      $this->sum += $this->data[$i][0];
> +        $this->colors[$i] = ImageColorAllocate($this->im,
> $this->data[$i][2],
> +           $this->data[$i][3],
> +           $this->data[$i][4]);
> +        $this->sum += $this->data[$i][0];
>        }
>        $from = 0;$to = 0;
>        for ($i = 0; $i < $n; $i++) {
> -      $this->angles[$i] = $this->roundoff(($this->data[$i][0] * 360)
> -      / doubleval($this->sum));
> -      $to = $from + $this->angles[$i];
> -      $col = $this->colors[$i];
> -
> -      $foo = $this->angles[$i];
> -      $this->draw_slice($this->center_x,
> -      $this->center_y,
> -      $from, 
> -      $to,
> -      $this->colors[$i]);
> -      $from += $this->angles[$i];
> +        $this->angles[$i] = $this->roundoff( ($this->data[$i][0] *
> 360) / doubleval($this->sum));
>        }
> +      $this->draw_slices( $this->center_x, $this->center_y,
> $this->angles, $this->colors );
>      }
>      /* }}} */
>      /* {{{ set_legend_percent */
> @@ -264,33 +258,66 @@
>        }
>      }
>      /* }}} */
> -    /* {{{ draw_slice */
> +    /* {{{ draw_slices */
>      /*
> -    ** This function draws a piece of pie centered at x,y starting
> at
> +    ** This function draws pieces of pie centered at x,y starting at
>      ** "from" degrees and ending at "to" degrees using the specified
> color.
> +    **
> +    ** RB 09.03.2006:
> +    **  - fixed: ImageFill for pie slices broke when a very small
> pie was drawn,
> +    **           and filled entire image with color (orange
> background color).
> +    **  - modified draw_slice to be draw_slices and added 3D effect
> ;)
>      */
> -    function draw_slice ($x, $y, $from, $to, $color) {
> -      # Awful Kludge!!!
> -      if ($to > 360) {
> -      $to = 360;
> -      }
> -      ImageArc($this->im, $this->center_x, $this->center_y,
> -      $this->diameter, $this->diameter, $from, $to, $color);
> -      /* First line */
> -      $axy2 = $this->get_xy_factors($from);
> -      $ax2 = floor($this->center_x + ($axy2[0] * ($this->diameter
> /2)));
> -      $ay2 = floor($this->center_y + ($axy2[1] * ($this->diameter
> /2)));
> -      ImageLine($this->im, $this->center_x, $this->center_y, $ax2,
> $ay2, $color);
> -      /* Second line */
> -      $bxy2 = $this->get_xy_factors($to);
> -      $bx2 = ceil($this->center_x + ($bxy2[0] * ($this->diameter
> /2)));
> -      $by2 = ceil($this->center_y + ($bxy2[1] * ($this->diameter
> /2)));
> -      ImageLine($this->im, $this->center_x, $this->center_y, $bx2,
> $by2, $color);
> -      /* decide where to start filling, then fill */
> -      $xy2 = $this->get_xy_factors((($to - $from) / 2) + $from);
> -      $x2 = floor($this->center_x + ($xy2[0] * ($this->diameter
> /3)));
> -      $y2 = floor($this->center_y + ($xy2[1] * ($this->diameter
> /3)));
> -      ImageFillToBorder($this->im, $x2, $y2, $color, $color);
> +    function draw_slices( $x, $y, $angles, $colors ) {
> +
> +      $pie_count = count( $angles );
> +      $PIE_THICKNESS = ($this->diameter * 0.075);
> +
> +      for( $j = ($this->center_y+$PIE_THICKNESS); $j >
> $this->center_y; $j-- ) {
> +
> +        $from = 0;
> +
> +        for( $p = 0; $p < $pie_count; $p++ ) {
> +
> +          $to = $from + $angles[$p];
> +
> +          if( $to > 360 )
> +            $to = 360;
> +
> +          $color = $colors[$p];
> +          $orig_colors = imageColorsForIndex( $this->im, $color );
> +
> +          $dark_red = ( $orig_colors['red'] > 30 ) ?
> $orig_colors['red'] - 30 : $orig_colors['red'];
> +          $dark_green = ( $orig_colors['green'] > 30 ) ?
> $orig_colors['green'] - 30 : $orig_colors['green'];
> +          $dark_blue = ( $orig_colors['blue'] > 30 ) ?
> $orig_colors['blue'] - 30 : $orig_colors['blue'];
> +
> +          $new_color = ImageColorAllocate( $this->im, $dark_red,
> $dark_green, $dark_blue );
> +        
> +          ImageFilledArc( $this->im, $this->center_x, $j,
> $this->diameter, $this->diameter, $from, $to, $new_color, IMG_ARC_PIE
> );
> +
> +          $from += $angles[$p];
> +        }
> +      }
> +   
> +      $from = 0;
> +  
> +      for( $p = 0; $p < $pie_count; $p++ ) {
> +
> +        $to = $from + $angles[$p];
> +        
> +        $color = $colors[$p];
> +
> +        if( $to > 360 )
> +          $to = 360;
> +
> +        if ($to > 360) {
> +          $to = 360;
> +        }
> +
> +        ImageFilledArc( $this->im, $this->center_x, $this->center_y,
> $this->diameter, $this->diameter, $from, $to, $color, IMG_ARC_PIE );
> +
> +        $from += $angles[$p];
> +      }
>      }
>      /* }}} */
>      /* {{{ display */
> 


------------------------------------------------------
Martin Knoblauch
email: k n o b i AT knobisoft DOT de
www:   http://www.knobisoft.de

Reply via email to