Beispiel #1
0
 public function Stroke($img, $xscale, $yscale)
 {
     $idx = 0;
     $numpoints = count($this->coords[0]);
     if (isset($this->coords[1])) {
         if (count($this->coords[1]) != $numpoints) {
             Util\JpGraphError::RaiseL(2003, count($this->coords[1]), $numpoints);
             //("Number of X and Y points are not equal. Number of X-points:".count($this->coords[1])." Number of Y-points:$numpoints");
         } else {
             $exist_x = true;
         }
     } else {
         $exist_x = false;
     }
     if ($this->barcenter) {
         $textadj = 0.5 - $xscale->text_scale_off;
     } else {
         $textadj = 0;
     }
     // Find the first numeric data point
     $startpoint = 0;
     while ($startpoint < $numpoints && !is_numeric($this->coords[0][$startpoint])) {
         ++$startpoint;
     }
     // Bail out if no data points
     if ($startpoint == $numpoints) {
         return;
     }
     if ($this->iFastStroke) {
         $this->FastStroke($img, $xscale, $yscale, $startpoint, $exist_x);
         return;
     }
     if ($exist_x) {
         $xs = $this->coords[1][$startpoint];
     } else {
         $xs = $textadj + $startpoint;
     }
     $img->SetStartPoint($xscale->Translate($xs), $yscale->Translate($this->coords[0][$startpoint]));
     if ($this->filled) {
         if ($this->fillFromMax) {
             //$max = $yscale->GetMaxVal();
             $cord[$idx++] = $xscale->Translate($xs);
             $cord[$idx++] = $yscale->scale_abs[1];
         } else {
             $min = $yscale->GetMinVal();
             if ($min > 0 || $this->fillFromMin) {
                 $fillmin = $yscale->scale_abs[0];
                 //Translate($min);
             } else {
                 $fillmin = $yscale->Translate(0);
             }
             $cord[$idx++] = $xscale->Translate($xs);
             $cord[$idx++] = $fillmin;
         }
     }
     $xt = $xscale->Translate($xs);
     $yt = $yscale->Translate($this->coords[0][$startpoint]);
     $cord[$idx++] = $xt;
     $cord[$idx++] = $yt;
     $yt_old = $yt;
     $xt_old = $xt;
     $y_old = $this->coords[0][$startpoint];
     $this->value->Stroke($img, $this->coords[0][$startpoint], $xt, $yt);
     $img->SetColor($this->color);
     $img->SetLineWeight($this->weight);
     $img->SetLineStyle($this->line_style);
     $pnts = $startpoint + 1;
     $firstnonumeric = false;
     while ($pnts < $numpoints) {
         if ($exist_x) {
             $x = $this->coords[1][$pnts];
         } else {
             $x = $pnts + $textadj;
         }
         $xt = $xscale->Translate($x);
         $yt = $yscale->Translate($this->coords[0][$pnts]);
         $y = $this->coords[0][$pnts];
         if ($this->step_style) {
             // To handle null values within step style we need to record the
             // first non numeric value so we know from where to start if the
             // non value is '-'.
             if (is_numeric($y)) {
                 $firstnonumeric = false;
                 if (is_numeric($y_old)) {
                     $img->StyleLine($xt_old, $yt_old, $xt, $yt_old);
                     $img->StyleLine($xt, $yt_old, $xt, $yt);
                 } elseif ($y_old == '-') {
                     $img->StyleLine($xt_first, $yt_first, $xt, $yt_first);
                     $img->StyleLine($xt, $yt_first, $xt, $yt);
                 } else {
                     $yt_old = $yt;
                     $xt_old = $xt;
                 }
                 $cord[$idx++] = $xt;
                 $cord[$idx++] = $yt_old;
                 $cord[$idx++] = $xt;
                 $cord[$idx++] = $yt;
             } elseif ($firstnonumeric == false) {
                 $firstnonumeric = true;
                 $yt_first = $yt_old;
                 $xt_first = $xt_old;
             }
         } else {
             $tmp1 = $y;
             $prev = $this->coords[0][$pnts - 1];
             if ($tmp1 === '' || $tmp1 === null || $tmp1 === 'X') {
                 $tmp1 = 'x';
             }
             if ($prev === '' || $prev === null || $prev === 'X') {
                 $prev = 'x';
             }
             if (is_numeric($y) || is_string($y) && $y != '-') {
                 if (is_numeric($y) && (is_numeric($prev) || $prev === '-')) {
                     $img->StyleLineTo($xt, $yt);
                 } else {
                     $img->SetStartPoint($xt, $yt);
                 }
             }
             if ($this->filled && $tmp1 !== '-') {
                 if ($tmp1 === 'x') {
                     $cord[$idx++] = $cord[$idx - 3];
                     $cord[$idx++] = $fillmin;
                 } elseif ($prev === 'x') {
                     $cord[$idx++] = $xt;
                     $cord[$idx++] = $fillmin;
                     $cord[$idx++] = $xt;
                     $cord[$idx++] = $yt;
                 } else {
                     $cord[$idx++] = $xt;
                     $cord[$idx++] = $yt;
                 }
             } else {
                 if (is_numeric($tmp1) && (is_numeric($prev) || $prev === '-')) {
                     $cord[$idx++] = $xt;
                     $cord[$idx++] = $yt;
                 }
             }
         }
         $yt_old = $yt;
         $xt_old = $xt;
         $y_old = $y;
         $this->StrokeDataValue($img, $this->coords[0][$pnts], $xt, $yt);
         ++$pnts;
     }
     if ($this->filled) {
         $cord[$idx++] = $xt;
         if ($this->fillFromMax) {
             $cord[$idx++] = $yscale->scale_abs[1];
         } else {
             if ($min > 0 || $this->fillFromMin) {
                 $cord[$idx++] = $yscale->Translate($min);
             } else {
                 $cord[$idx++] = $yscale->Translate(0);
             }
         }
         if ($this->fillgrad) {
             $img->SetLineWeight(1);
             $grad = new Gradient($img);
             $grad->SetNumColors($this->fillgrad_numcolors);
             $grad->FilledFlatPolygon($cord, $this->fillgrad_fromcolor, $this->fillgrad_tocolor);
             $img->SetLineWeight($this->weight);
         } else {
             $img->SetColor($this->fill_color);
             $img->FilledPolygon($cord);
         }
         if ($this->weight > 0) {
             $img->SetLineWeight($this->weight);
             $img->SetColor($this->color);
             // Remove first and last coordinate before drawing the line
             // sine we otherwise get the vertical start and end lines which
             // doesn't look appropriate
             $img->Polygon(array_slice($cord, 2, count($cord) - 4));
         }
     }
     if (!empty($this->filledAreas)) {
         $minY = $yscale->Translate($yscale->GetMinVal());
         $factor = $this->step_style ? 4 : 2;
         for ($i = 0; $i < sizeof($this->filledAreas); ++$i) {
             // go through all filled area elements ordered by insertion
             // fill polygon array
             $areaCoords[] = $cord[$this->filledAreas[$i][0] * $factor];
             $areaCoords[] = $minY;
             $areaCoords = array_merge($areaCoords, array_slice($cord, $this->filledAreas[$i][0] * $factor, ($this->filledAreas[$i][1] - $this->filledAreas[$i][0] + ($this->step_style ? 0 : 1)) * $factor));
             $areaCoords[] = $areaCoords[sizeof($areaCoords) - 2];
             // last x
             $areaCoords[] = $minY;
             // last y
             if ($this->filledAreas[$i][3]) {
                 $img->SetColor($this->filledAreas[$i][2]);
                 $img->FilledPolygon($areaCoords);
                 $img->SetColor($this->color);
             }
             // Check if we should draw the frame.
             // If not we still re-draw the line since it might have been
             // partially overwritten by the filled area and it doesn't look
             // very good.
             if ($this->filledAreas[$i][4]) {
                 $img->Polygon($areaCoords);
             } else {
                 $img->Polygon($cord);
             }
             $areaCoords = array();
         }
     }
     if (!is_object($this->mark) || $this->mark->type == -1 || $this->mark->show == false) {
         return;
     }
     for ($pnts = 0; $pnts < $numpoints; ++$pnts) {
         if ($exist_x) {
             $x = $this->coords[1][$pnts];
         } else {
             $x = $pnts + $textadj;
         }
         $xt = $xscale->Translate($x);
         $yt = $yscale->Translate($this->coords[0][$pnts]);
         if (is_numeric($this->coords[0][$pnts])) {
             if (!empty($this->csimtargets[$pnts])) {
                 if (!empty($this->csimwintargets[$pnts])) {
                     $this->mark->SetCSIMTarget($this->csimtargets[$pnts], $this->csimwintargets[$pnts]);
                 } else {
                     $this->mark->SetCSIMTarget($this->csimtargets[$pnts]);
                 }
                 $this->mark->SetCSIMAlt($this->csimalts[$pnts]);
             }
             if ($exist_x) {
                 $x = $this->coords[1][$pnts];
             } else {
                 $x = $pnts;
             }
             $this->mark->SetCSIMAltVal($this->coords[0][$pnts], $x);
             $this->mark->Stroke($img, $xt, $yt);
             $this->csimareas .= $this->mark->GetCSIMAreas();
         }
     }
 }