public function generate() { $color = $this->hex2dec($this->color); $color[] = 0; $tmp = imagecreatetruecolor($this->size, $this->size); imagefill($tmp, 0, 0, imagecolorallocatealpha($tmp, 0, 0, 0, 127)); imageSmoothArc($tmp, $this->size / 2, $this->size / 2, $this->size * 0.7, $this->size * 0.7, $color, 0, M_PI * 2); return $tmp; }
public function generate() { $color = $this->hex2dec($this->color); $color[] = 0; $tmp = imagecreatetruecolor($this->size, $this->size); imagefill($tmp, 0, 0, imagecolorallocatealpha($tmp, $this->bgColorRGB[0], $this->bgColorRGB[1], $this->bgColorRGB[2], 127)); imageSmoothArc($tmp, $this->size / 2, $this->size / 2, $this->size * 0.7, $this->size * 0.7, $color, 0, M_PI * 2); $frame = $this->generateMarkerFrame($tmp, false); return $frame; }
public function generate() { $color = $this->hex2dec($this->color); $color[] = 0; $bgColorRGB = $this->bgColorRGB; $bgColorRGB[] = 0; $tmp = imagecreatetruecolor($this->size * 7.5, $this->size * 7.5); imagefill($tmp, 0, 0, imagecolorallocatealpha($tmp, 0, 0, 0, 127)); imageSmoothArc($tmp, $this->size * 7.5 / 2, $this->size * 7.5 / 2, $this->size * 6.8, $this->size * 6.8, $color, 0, M_PI * 2); imageSmoothArc($tmp, $this->size * 7.5 / 2, $this->size * 7.5 / 2, $this->size * 7.5 * 0.7, $this->size * 7.5 * 0.7, $bgColorRGB, 0, M_PI * 2); return $tmp; }
public function generate() { $color = $this->hex2dec($this->color); $color[] = 0; $im = imagecreatetruecolor($this->size * 3.35, $this->size * 3.35); imagefill($im, 0, 0, imagecolorallocatealpha($im, $color[0], $color[1], $color[2], 127)); $dotSize = 1.7; $movePerct = 0.5; imageSmoothArc($im, $this->size * 3.35 / 2, $this->size * 3.35 / 2 - $this->size * $dotSize * ($movePerct - 0.2), $this->size * $dotSize, $this->size * $dotSize, $color, 0, M_PI * 2); imageSmoothArc($im, $this->size * 3.35 / 2 + $this->size * $dotSize * ($movePerct - 0.2), $this->size * 3.35 / 2 + $this->size * $dotSize * ($movePerct - 0.2), $this->size * $dotSize, $this->size * $dotSize, $color, 0, M_PI * 2); imageSmoothArc($im, $this->size * 3.35 / 2 - $this->size * $dotSize * ($movePerct - 0.2), $this->size * 3.35 / 2 + $this->size * $dotSize * ($movePerct - 0.2), $this->size * $dotSize, $this->size * $dotSize, $color, 0, M_PI * 2); return $im; }
function DrawImageSmoothArc($im, $xc, $yc, $w, $h, $s, $e, $color, $style = null) { $tmp = $s; $s = (360 - $e) / 180 * M_PI; $e = (360 - $tmp) / 180 * M_PI; return imageSmoothArc($im, round($xc), round($yc), round($w), round($h), $this->CreateColorForImageSmoothArc($color), $s, $e); }
function imageSmoothArc(&$img, $cx, $cy, $w, $h, $color, $start, $stop) { // Originally written from scratch by Ulrich Mierendorff, 06/2006 // Rewritten and improved, 04/2007, 07/2007 // compared to old version: // + Support for transparency added // + Improved quality of edges & antialiasing // note: This function does not represent the fastest way to draw elliptical // arcs. It was written without reading any papers on that subject. Better // algorithms may be twice as fast or even more. // what it cannot do: It does not support outlined arcs, only filled // Parameters: // $cx - Center of ellipse, X-coord // $cy - Center of ellipse, Y-coord // $w - Width of ellipse ($w >= 2) // $h - Height of ellipse ($h >= 2 ) // $color - Color of ellipse as a four component array with RGBA // $start - Starting angle of the arc, no limited range! // $stop - Stop angle of the arc, no limited range! // $start _can_ be greater than $stop! // If any value is not in the given range, results are undefined! // This script does not use any special algorithms, everything is completely // written from scratch; see http://de.wikipedia.org/wiki/Ellipse for formulas. while ($start < 0) { $start += 2 * M_PI; } while ($stop < 0) { $stop += 2 * M_PI; } while ($start > 2 * M_PI) { $start -= 2 * M_PI; } while ($stop > 2 * M_PI) { $stop -= 2 * M_PI; } if ($start > $stop) { imageSmoothArc($img, $cx, $cy, $w, $h, $color, $start, 2 * M_PI); imageSmoothArc($img, $cx, $cy, $w, $h, $color, 0, $stop); return; } $a = 1.0 * round($w / 2); $b = 1.0 * round($h / 2); $cx = 1.0 * round($cx); $cy = 1.0 * round($cy); $aaAngle = atan($b * $b / ($a * $a) * tan(0.25 * M_PI)); $aaAngleX = $a * cos($aaAngle); $aaAngleY = $b * sin($aaAngle); $a -= 0.5; // looks better... $b -= 0.5; for ($i = 0; $i < 4; $i++) { if ($start < ($i + 1) * M_PI / 2) { if ($start > $i * M_PI / 2) { if ($stop > ($i + 1) * M_PI / 2) { imageSmoothArcDrawSegment($img, $cx, $cy, $a, $b, $aaAngleX, $aaAngleY, $color, $start, ($i + 1) * M_PI / 2, $i); } else { imageSmoothArcDrawSegment($img, $cx, $cy, $a, $b, $aaAngleX, $aaAngleY, $color, $start, $stop, $i); break; } } else { if ($stop > ($i + 1) * M_PI / 2) { imageSmoothArcDrawSegment($img, $cx, $cy, $a, $b, $aaAngleX, $aaAngleY, $color, $i * M_PI / 2, ($i + 1) * M_PI / 2, $i); } else { imageSmoothArcDrawSegment($img, $cx, $cy, $a, $b, $aaAngleX, $aaAngleY, $color, $i * M_PI / 2, $stop, $i); break; } } } } }
} /** Watched status ( DOT or Check Mark ) **/ imagealphablending($im, true); if (INDICATOR == "DOT") { // half dot if partially watched if ($pos_right) { $pos_left = $pos_right; } else { $pos_left = $img_w - $img_w * $pad_right; } $pos_left = $pos_left * 1.1; if ($progress > 0) { imageSmoothArc($im, $pos_left, $dot_center, $dot_size, $dot_size, array(255, 165, 0, 5), 30, M_PI / 2); } else { if (!isset($_GET['watched']) or $_GET['watched'] == 0) { imageSmoothArc($im, $pos_left, $dot_center, $dot_size, $dot_size, array(255, 165, 0, 5), M_PI / 2, 0); } } } if (INDICATOR == "CHECK") { // mark it if watched if (isset($_GET['watched']) and $_GET['watched'] == 1) { $overlay = imagecreatefrompng('images/check-mark-512.png'); // use the last right position if set for the new left if ($pos_right) { $pos_left = $pos_right; } else { $pos_left = $img_w - $img_w * $pad_right; } $pos_right = $pos_left + $check_box_size; $right_padding = $check_box_size * $pad_right;
$r = $q; $g = $v; $b = $p; break; case 2: $r = $p; $g = $v; $b = $t; break; case 3: $r = $p; $g = $q; $b = $v; break; case 4: $r = $t; $g = $p; $b = $v; break; case 5: $r = $v; $g = $p; $b = $q; break; default: break; } imageSmoothArc($img, 325, 460, 620, 300, array($r * 255, $g * 255, $b * 255, 0), $i * 2 * M_PI / $n, ($i + 1) * 2 * M_PI / $n); } header('Content-Type: image/png'); imagePNG($img);
/** * Show a multi-area chart * * @param $raw_datas : an array with : * - key 'datas', ex : array( 'test1' => 15, 'test2' => 25) * - key 'unit', ex : '%', 'Kg' (optionnal) * - key 'spline', curves line (boolean - optionnal) * @param $title : title of the chart * @param $desc : description of the chart (optionnal) * @param $show_label : behavior of the graph labels, * values : 'hover', 'never', 'always' (optionnal) * @param $export : keep only svg to export (optionnal) * @return nothing */ function showGArea($params) { global $LANG; $criterias = PluginMreportingCommon::initGraphParams($params); foreach ($criterias as $key => $val) { ${$key} = $val; } //$rand = $opt['rand']; $configs = PluginMreportingConfig::initConfigParams($opt['f_name'], $opt['class']); foreach ($configs as $k => $v) { ${$k} = $v; } if (self::DEBUG_GRAPH && isset($raw_datas)) { Toolbox::logdebug($raw_datas); } if (isset($raw_datas['datas'])) { $datas = $raw_datas['datas']; } else { $datas = array(); } $options = array("title" => $title, "desc" => $desc, "randname" => $randname, "export" => $export, "delay" => $delay, "short_classname" => $opt["short_classname"]); $this->initGraph($options); if (count($datas) <= 0) { if ($export != "odtall") { echo $LANG['plugin_mreporting']["error"][1]; $end['opt']["export"] = false; $end['opt']["randname"] = false; $end['opt']["f_name"] = $opt['f_name']; $end['opt']["class"] = $opt['class']; PluginMreportingCommon::endGraph($end); } return false; } $labels2 = $raw_datas['labels2']; $datas = PluginMreportingCommon::compileDatasForUnit($datas, $unit); $raw_datas['datas'] = $datas; $values = array_values($datas); $labels = array_keys($datas); $max = 1; foreach ($values as $line) { foreach ($line as $label2 => $value) { if ($value > $max) { $max = $value; } } } if ($max == 1 && $unit == '%') { $max = 100; } $nb = count($labels2); $width = $this->width; $nb_bar = count($datas); if ($nb_bar > 1) { $percent = 2 * (450 + 18 * $nb_bar) / (18 * $nb_bar * 100); } else { $percent = 0.2; } $height = $percent * 450 + 18 * $nb_bar; $delta = 450 - $height; $height_tot = 450 + $height; $width_line = ($width - 45) / $nb; $index1 = 0; $index3 = 1; $step = ceil($nb / 20); //create image $image = imagecreatetruecolor($width, $height_tot); if ($show_graph) { //colors $palette = self::getPalette($nb_bar); $alphapalette = self::getPalette($nb_bar, "50"); $darkerpalette = self::getDarkerPalette($nb_bar); //background $bg_color = $this->white; imagefilledrectangle($image, 0, 0, $width - 1, $height_tot - 1, $bg_color); //draw x-axis grey step line and value ticks $xstep = round(($height + $delta + 40) / 13); for ($i = 0; $i < 13; $i++) { $yaxis = $height_tot - 30 - $xstep * $i; //horizontal grey lines imageLine($image, 30, $yaxis, 30 + $width_line * ($nb - 1), $yaxis, $this->grey); //value ticks if ($i * $max / 12 < 10) { $val = round($i * $max / 12, 1); } else { $val = round($i * $max / 12); } $box = @imageTTFBbox($this->fontsize - 1, $this->fontangle, $this->font, $val); $textwidth = abs($box[4] - $box[0]); imagettftext($image, $this->fontsize - 1, $this->fontangle, 25 - $textwidth, $yaxis + 5, $this->darkgrey, $this->font, $val); } //draw y-axis vertical grey step line for ($i = 0; $i < $nb; $i++) { $xaxis = 30 + $width_line * $i; imageLine($image, $xaxis, $height - 40, $xaxis, $height_tot, $this->grey); } //draw y-axis imageLine($image, 30, $height - 40, 30, $height_tot - 25, $this->black); //draw y-axis imageLine($image, 30, $height_tot - 30, $width - 50, $height_tot - 30, $this->black); //create border on export if ($export) { imagerectangle($image, 0, 0, $width - 1, $height_tot - 1, $this->black); } //on png graph, no way to draw curved polygons, force area reports to be linear if ($area) { $spline = false; } //add title on export if ($export) { imagettftext($image, $this->fontsize + 1, $this->fontangle, 10, 20, $this->black, $this->font, $title); } //parse datas foreach ($datas as $label => $data) { $aCoords = array(); $index2 = 0; $old_data = 0; //parse line foreach ($data as $subdata) { //if first index, continue if ($index2 == 0) { $old_data = $subdata; $index2++; continue; } // determine coords $x1 = $index2 * $width_line - $width_line + 30; $y1 = $height_tot - 30 - $old_data * ($height_tot - $height) / $max; $x2 = $x1 + $width_line; $y2 = $height_tot - 30 - $subdata * ($height_tot - $height) / $max; //in case of area chart fill under point space if ($area > 0) { $points = array($x1, $y1, $x2, $y2, $x2, $height_tot - 30, $x1, $height_tot - 30); imagefilledpolygon($image, $points, 4, $alphapalette[$index1]); } //trace lines between points (if linear) if (!$spline) { $this->imageSmoothAlphaLineLarge($image, $x1, $y1, $x2, $y2, $palette[$index1]); } $aCoords[$x1] = $y1; $old_data = $subdata; $index2++; $index3++; } //if curved spline activated, draw cubic spline for the current line if ($spline) { $aCoords[$x2] = $y2; $this->imageCubicSmoothLine($image, $palette[$index1], $aCoords); $index2 = 0; $old_data = 0; $old_label = ""; } //draw labels and dots $index2 = 0; $old_data = 0; foreach ($data as $subdata) { //if first index, continue if ($index2 == 0) { $old_data = $subdata; $old_label = $label; $index2++; continue; } // determine coords $x1 = $index2 * $width_line - $width_line + 30; $y1 = $height_tot - 30 - $old_data * ($height_tot - $height) / $max; $x2 = $x1 + $width_line; $y2 = $height_tot - 30 - $subdata * ($height_tot - $height) / $max; //trace dots $color_rbg = self::colorHexToRGB($darkerpalette[$index1]); imageSmoothArc($image, $x1 - 1, $y1 - 1, 7, 7, $color_rbg, 0, 2 * M_PI); imageSmoothArc($image, $x1 - 1, $y1 - 1, 4, 4, array(255, 255, 255, 0), 0, 2 * M_PI); //display values label if ($show_label == "always" || $show_label == "hover") { imagettftext($image, $this->fontsize - 2, $this->fontangle, $index2 == 1 ? $x1 : $x1 - 6, $y1 - 5, $darkerpalette[$index1], $this->font, $old_data); } //show x-axis ticks if ($step != 0 && $index3 / $step == round($index3 / $step)) { imageline($image, $x1, $height_tot - 30, $x1, $height_tot - 27, $darkerpalette[$index1]); } $old_data = $subdata; $old_label = $label; $index2++; $index3++; } /*** display last value ***/ if (isset($x2)) { //trace dots $color_rbg = self::colorHexToRGB($darkerpalette[$index1]); imageSmoothArc($image, $x2 - 1, $y2 - 1, 7, 7, $color_rbg, 0, 2 * M_PI); imageSmoothArc($image, $x2 - 1, $y2 - 1, 4, 4, array(255, 255, 255, 0), 0, 2 * M_PI); //display value label if ($show_label == "always" || $show_label == "hover") { imagettftext($image, $this->fontsize - 2, $this->fontangle, $index2 == 1 ? $x2 : $x2 - 6, $y2 - 5, $darkerpalette[$index1], $this->font, $old_data); } } /*** end display last value ***/ $index1++; } //display labels2 $index = 0; foreach ($labels2 as $label) { $x = $index * $width_line + 20; if ($step != 0 && $index / $step == round($index / $step)) { imagettftext($image, $this->fontsize - 1, $this->fontangle, $x, $height_tot - 10, $this->black, $this->font, $label); } $index++; } //legend (align left) $index = 0; foreach ($labels as $label) { //legend label $box = @imageTTFBbox($this->fontsize, $this->fontangle, $this->font, $label); $textwidth = abs($box[4] - $box[0]); $textheight = abs($box[5] - $box[1]); imagettftext($image, $this->fontsize - 1, $this->fontangle, 20, 35 + $index * 14, $this->black, $this->font, $label); //legend circle $color_rbg = self::colorHexToRGB($palette[$index]); imageSmoothArc($image, 10, 30 + $index * 14, 7, 7, $color_rbg, 0, 2 * M_PI); $index++; } } //generate image $params = array("image" => $image, "export" => $export, "f_name" => $opt['f_name'], "class" => $opt['class'], "title" => $title, "randname" => $randname, "raw_datas" => $raw_datas, "withdata" => $opt['withdata']); $contents = $this->generateImage($params); if ($show_graph) { $this->showImage($contents, $export); } $opt['randname'] = $randname; $options = array("opt" => $opt, "export" => $export, "datas" => $datas, "labels2" => $labels2, "flip_data" => $flip_data, "unit" => $unit); PluginMreportingCommon::endGraph($options); }
function imageSmoothArc(&$img, $cx, $cy, $w, $h, $color, $start, $stop) { while ($start < 0) { $start += 2 * M_PI; } while ($stop < 0) { $stop += 2 * M_PI; } while ($start > 2 * M_PI) { $start -= 2 * M_PI; } while ($stop > 2 * M_PI) { $stop -= 2 * M_PI; } if ($start > $stop) { imageSmoothArc(&$img, $cx, $cy, $w, $h, $color, $start, 2 * M_PI); imageSmoothArc(&$img, $cx, $cy, $w, $h, $color, 0, $stop); return; } $a = 1.0 * round($w / 2); $b = 1.0 * round($h / 2); $cx = 1.0 * round($cx); $cy = 1.0 * round($cy); for ($i = 0; $i < 4; $i++) { if ($start < ($i + 1) * M_PI / 2) { if ($start > $i * M_PI / 2) { if ($stop > ($i + 1) * M_PI / 2) { imageSmoothArcDrawSegment($img, $cx, $cy, $a, $b, $color, $start, ($i + 1) * M_PI / 2, $i); } else { imageSmoothArcDrawSegment($img, $cx, $cy, $a, $b, $color, $start, $stop, $i); break; } } else { if ($stop > ($i + 1) * M_PI / 2) { imageSmoothArcDrawSegment($img, $cx, $cy, $a, $b, $color, $i * M_PI / 2, ($i + 1) * M_PI / 2, $i); } else { imageSmoothArcDrawSegment($img, $cx, $cy, $a, $b, $color, $i * M_PI / 2, $stop, $i); break; } } } } }