本文整理汇总了PHP中RectPatternFactory::Create方法的典型用法代码示例。如果您正苦于以下问题:PHP RectPatternFactory::Create方法的具体用法?PHP RectPatternFactory::Create怎么用?PHP RectPatternFactory::Create使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类RectPatternFactory
的用法示例。
在下文中一共展示了RectPatternFactory::Create方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的PHP代码示例。
示例1: RectPatternFactory
function __construct($aDir, $aPattern, $aMin, $aMax, $aColor = "black", $aWeight = 1, $aDepth = DEPTH_BACK)
{
$f = new RectPatternFactory();
$this->prect = $f->Create($aPattern, $aColor, $aWeight);
if (is_numeric($aMin) && is_numeric($aMax) && $aMin > $aMax) {
JpGraphError::RaiseL(16004);
}
//('Min value for plotband is larger than specified max value. Please correct.');
$this->dir = $aDir;
$this->min = $aMin;
$this->max = $aMax;
$this->depth = $aDepth;
}
示例2: Stroke
//.........这里部分代码省略.........
foreach ($this->txtcol as $p) {
// STROKE DEBUG BOX
if (_JPG_DEBUG) {
$aImg->SetLineWeight(1);
$aImg->SetColor('red');
$aImg->SetLineStyle('solid');
$aImg->Rectangle($xp, $y1, $xp + $abs_width, $y1 + $rowheight[$row]);
}
$aImg->SetLineWeight($this->weight);
$x1 = round($x1);
$y1 = round($y1);
if ($p[2] != "" && $p[2]->GetType() > -1) {
// Make a plot mark legend
$aImg->SetColor($p[1]);
if (is_string($p[3]) || $p[3] > 0) {
$aImg->SetLineStyle($p[3]);
$aImg->StyleLine($x1 - $this->mark_abs_hsize, $y1 + $f2, $x1 + $this->mark_abs_hsize, $y1 + $f2);
}
// Stroke a mark with the standard size
// (As long as it is not an image mark )
if ($p[2]->GetType() != MARK_IMG) {
$p[2]->iFormatCallback = '';
// Since size for circles is specified as the radius
// this means that we must half the size to make the total
// width behave as the other marks
if ($p[2]->GetType() == MARK_FILLEDCIRCLE || $p[2]->GetType() == MARK_CIRCLE) {
$p[2]->SetSize(min($this->mark_abs_vsize, $this->mark_abs_hsize) / 2);
$p[2]->Stroke($aImg, $x1, $y1 + $f2);
} else {
$p[2]->SetSize(min($this->mark_abs_vsize, $this->mark_abs_hsize));
$p[2]->Stroke($aImg, $x1, $y1 + $f2);
}
}
} elseif ($p[2] != "" && (is_string($p[3]) || $p[3] > 0)) {
// Draw a styled line
$aImg->SetColor($p[1]);
$aImg->SetLineStyle($p[3]);
$aImg->StyleLine($x1 - 1, $y1 + $f2, $x1 + $this->mark_abs_hsize, $y1 + $f2);
$aImg->StyleLine($x1 - 1, $y1 + $f2 + 1, $x1 + $this->mark_abs_hsize, $y1 + $f2 + 1);
} else {
// Draw a colored box
$color = $p[1];
// We make boxes slightly larger to better show
$boxsize = min($this->mark_abs_vsize, $this->mark_abs_hsize) + 2;
$ym = round($y1 + $f2 - $boxsize / 2);
// We either need to plot a gradient or a
// pattern. To differentiate we use a kludge.
// Patterns have a p[3] value of < -100
if ($p[3] < -100) {
// p[1][0] == iPattern, p[1][1] == iPatternColor, p[1][2] == iPatternDensity
if ($patternFactory == null) {
$patternFactory = new RectPatternFactory();
}
$prect = $patternFactory->Create($p[1][0], $p[1][1], 1);
$prect->SetBackground($p[1][3]);
$prect->SetDensity($p[1][2] + 1);
$prect->SetPos(new Rectangle($x1, $ym, $boxsize, $boxsize));
$prect->Stroke($aImg);
$prect = null;
} else {
if (is_array($color) && count($color) == 2) {
// The client want a gradient color
$grad->FilledRectangle($x1, $ym, $x1 + $boxsize, $ym + $boxsize, $color[0], $color[1], -$p[3]);
} else {
$aImg->SetColor($p[1]);
$aImg->FilledRectangle($x1, $ym, $x1 + $boxsize, $ym + $boxsize);
}
$aImg->SetColor($this->color);
$aImg->SetLineWeight($fillBoxFrameWeight);
$aImg->Rectangle($x1, $ym, $x1 + $boxsize, $ym + $boxsize);
}
}
$aImg->SetColor($this->font_color);
$aImg->SetFont($this->font_family, $this->font_style, $this->font_size);
$aImg->SetTextAlign("left", "top");
$aImg->StrokeText(round($x1 + $this->mark_abs_hsize + $this->xmargin), $y1, $p[0]);
// Add CSIM for Legend if defined
if ($p[4] != "") {
$xe = $x1 + $this->xmargin + $this->mark_abs_hsize + $aImg->GetTextWidth($p[0]);
$ye = $y1 + max($this->mark_abs_vsize, $aImg->GetTextHeight($p[0]));
$coords = "{$x1},{$y1},{$xe},{$y1},{$xe},{$ye},{$x1},{$ye}";
if (!empty($p[4])) {
$this->csimareas .= "<area shape=\"poly\" coords=\"{$coords}\" href=\"" . $p[4] . "\"";
if (!empty($p[5])) {
$tmp = sprintf($p[5], $p[0]);
$this->csimareas .= " title=\"{$tmp}\"";
}
$this->csimareas .= " alt=\"\" />\n";
}
}
if ($i >= $this->layout_n) {
$x1 = $xp + $this->mark_abs_hsize + $this->xlmargin;
$y1 += $rowheight[$row++];
$i = 1;
} else {
$x1 += $colwidth[($i - 1) % $numcolumns];
++$i;
}
}
}
示例3: Stroke
//.........这里部分代码省略.........
$sp1[0] = $pts[4];
$sp1[1] = $pts[5];
$sp1[2] = $pts[6];
$sp1[3] = $pts[7];
$sp1[4] = $pts[6] + $ssh;
$sp1[5] = $pts[7] - $ssv;
$sp1[6] = $pts[4] + $ssh;
$sp1[7] = $pts[5] - $ssv;
$sp2[0] = $pts[6];
$sp2[1] = $pts[7];
$sp2[2] = $pts[0];
$sp2[3] = $pts[1];
$sp2[4] = $pts[0] + $ssh;
$sp2[5] = $pts[1] - $ssv;
$sp2[6] = $pts[6] + $ssh;
$sp2[7] = $pts[7] - $ssv;
}
$base_color = $this->fill_color;
$img->PushColor($base_color . ':0.7');
$img->FilledPolygon($sp1);
$img->PopColor();
$img->PushColor($base_color . ':1.1');
$img->FilledPolygon($sp2);
$img->PopColor();
}
// Stroke the pattern
if (is_array($this->iPattern)) {
$f = new RectPatternFactory();
if (is_array($this->iPatternColor)) {
$pcolor = $this->iPatternColor[$i % $np];
} else {
$pcolor = $this->iPatternColor;
}
$prect = $f->Create($this->iPattern[$i % $np], $pcolor, 1);
$prect->SetDensity($this->iPatternDensity[$i % $np]);
if ($val < 0) {
$rx = $pts[0];
$ry = $pts[1];
} else {
$rx = $pts[2];
$ry = $pts[3];
}
$width = abs($pts[4] - $pts[0]) + 1;
$height = abs($pts[1] - $pts[3]) + 1;
$prect->SetPos(new Rectangle($rx, $ry, $width, $height));
$prect->Stroke($img);
} else {
if ($this->iPattern > -1) {
$f = new RectPatternFactory();
$prect = $f->Create($this->iPattern, $this->iPatternColor, 1);
$prect->SetDensity($this->iPatternDensity);
if ($val < 0) {
$rx = $pts[0];
$ry = $pts[1];
} else {
$rx = $pts[2];
$ry = $pts[3];
}
$width = abs($pts[4] - $pts[0]) + 1;
$height = abs($pts[1] - $pts[3]) + 1;
$prect->SetPos(new Rectangle($rx, $ry, $width, $height));
$prect->Stroke($img);
}
}
// Stroke the outline of the bar
if (is_array($this->color)) {
示例4: Stroke
function Stroke($aImg, $aScale)
{
$factory = new RectPatternFactory();
$prect = $factory->Create($this->iPattern, $this->iPatternColor);
$prect->SetDensity($this->iPatternDensity);
// If height factor is specified as a float between 0,1 then we take it as meaning
// percetage of the scale width between horizontal line.
// If it is an integer > 1 we take it to mean the absolute height in pixels
if ($this->iHeightFactor > -0.0 && $this->iHeightFactor <= 1.1) {
$vs = $aScale->GetVertSpacing() * $this->iHeightFactor;
} elseif (is_int($this->iHeightFactor) && $this->iHeightFactor > 2 && $this->iHeightFactor < 200) {
$vs = $this->iHeightFactor;
} else {
JpGraphError::RaiseL(6028, $this->iHeightFactor);
}
//("Specified height (".$this->iHeightFactor.") for gantt bar is out of range.");
// Clip date to min max dates to show
$st = $aScale->NormalizeDate($this->iStart);
$en = $aScale->NormalizeDate($this->iEnd);
$limst = max($st, $aScale->iStartDate);
$limen = min($en, $aScale->iEndDate);
$xt = round($aScale->TranslateDate($limst));
$xb = round($aScale->TranslateDate($limen));
$yt = round($aScale->TranslateVertPos($this->iVPos) - $vs - ($aScale->GetVertSpacing() / 2 - $vs / 2));
$yb = round($aScale->TranslateVertPos($this->iVPos) - ($aScale->GetVertSpacing() / 2 - $vs / 2));
$middle = round($yt + ($yb - $yt) / 2);
$this->StrokeActInfo($aImg, $aScale, $middle);
// CSIM for title
if (!empty($this->title->csimtarget)) {
$colwidth = $this->title->GetColWidth($aImg);
$colstarts = array();
$aScale->actinfo->GetColStart($aImg, $colstarts, true);
$n = min(count($colwidth), count($this->title->csimtarget));
for ($i = 0; $i < $n; ++$i) {
$title_xt = $colstarts[$i];
$title_xb = $title_xt + $colwidth[$i];
$coords = "{$title_xt},{$yt},{$title_xb},{$yt},{$title_xb},{$yb},{$title_xt},{$yb}";
if (!empty($this->title->csimtarget[$i])) {
$this->csimarea .= "<area shape=\"poly\" coords=\"{$coords}\" href=\"" . $this->title->csimtarget[$i] . "\"";
if (!empty($this->title->csimwintarget[$i])) {
$this->csimarea .= "target=\"" . $this->title->csimwintarget[$i] . "\" ";
}
if (!empty($this->title->csimalt[$i])) {
$tmp = $this->title->csimalt[$i];
$this->csimarea .= " title=\"{$tmp}\" alt=\"{$tmp}\" ";
}
$this->csimarea .= " />\n";
}
}
}
// Check if the bar is totally outside the current scale range
if ($en < $aScale->iStartDate || $st > $aScale->iEndDate) {
return;
}
// Remember the positions for the bar
$this->SetConstrainPos($xt, $yt, $xb, $yb);
$prect->ShowFrame(false);
$prect->SetBackground($this->iFillColor);
if ($this->iShadow) {
$aImg->SetColor($this->iFrameColor);
$aImg->ShadowRectangle($xt, $yt, $xb, $yb, $this->iFillColor, $this->iShadowWidth, $this->iShadowColor);
$prect->SetPos(new Rectangle($xt + 1, $yt + 1, $xb - $xt - $this->iShadowWidth - 2, $yb - $yt - $this->iShadowWidth - 2));
$prect->Stroke($aImg);
} else {
$prect->SetPos(new Rectangle($xt, $yt, $xb - $xt + 1, $yb - $yt + 1));
$prect->Stroke($aImg);
$aImg->SetColor($this->iFrameColor);
$aImg->Rectangle($xt, $yt, $xb, $yb);
}
// CSIM for bar
if (!empty($this->csimtarget)) {
$coords = "{$xt},{$yt},{$xb},{$yt},{$xb},{$yb},{$xt},{$yb}";
$this->csimarea .= "<area shape=\"poly\" coords=\"{$coords}\" href=\"" . $this->csimtarget . "\"";
if (!empty($this->csimwintarget)) {
$this->csimarea .= " target=\"" . $this->csimwintarget . "\" ";
}
if ($this->csimalt != '') {
$tmp = $this->csimalt;
$this->csimarea .= " title=\"{$tmp}\" alt=\"{$tmp}\" ";
}
$this->csimarea .= " />\n";
}
// Draw progress bar inside activity bar
if ($this->progress->iProgress > 0) {
$xtp = $aScale->TranslateDate($st);
$xbp = $aScale->TranslateDate($en);
$len = ($xbp - $xtp) * $this->progress->iProgress;
$endpos = $xtp + $len;
if ($endpos > $xt) {
// Take away the length of the progress that is not visible (before the start date)
$len -= $xt - $xtp;
// Is the the progress bar visible after the start date?
if ($xtp < $xt) {
$xtp = $xt;
}
// Make sure that the progess bar doesn't extend over the end date
if ($xtp + $len - 1 > $xb) {
$len = $xb - $xtp;
}
$prog = $factory->Create($this->progress->iPattern, $this->progress->iColor);
//.........这里部分代码省略.........
示例5: Stroke
//.........这里部分代码省略.........
$sp[6] = $pts[2] + $ssh;
$sp[7] = $pts[3] - $ssv;
$sp[8] = $pts[2];
$sp[9] = $pts[3] - 1;
$sp[10] = $pts[4] + 1;
$sp[11] = $pts[5];
$img->FilledPolygon($sp, 4);
} elseif ($accy_neg < 0) {
$nsp[6] = $pts[4] + $ssh;
$nsp[7] = $pts[5] - $ssv;
$nsp[8] = $pts[4] + 1;
$nsp[9] = $pts[5];
$img->FilledPolygon($nsp, 4);
}
$img->PopColor();
}
}
// If value is NULL or 0, then don't draw a bar at all
if ($this->plots[$j]->coords[0][$i] == 0) {
continue;
}
if ($this->plots[$j]->grad) {
$grad = new Gradient($img);
$grad->FilledRectangle($pts[2], $pts[3], $pts[6], $pts[7], $this->plots[$j]->grad_fromcolor, $this->plots[$j]->grad_tocolor, $this->plots[$j]->grad_style);
} else {
if (is_array($this->plots[$j]->fill_color)) {
$numcolors = count($this->plots[$j]->fill_color);
$img->SetColor($this->plots[$j]->fill_color[$i % $numcolors]);
} else {
$img->SetColor($this->plots[$j]->fill_color);
}
$img->FilledPolygon($pts);
$img->SetColor($this->plots[$j]->color);
}
// Stroke the pattern
if ($this->plots[$j]->iPattern > -1) {
if ($pattern === NULL) {
$pattern = new RectPatternFactory();
}
$prect = $pattern->Create($this->plots[$j]->iPattern, $this->plots[$j]->iPatternColor, 1);
$prect->SetDensity($this->plots[$j]->iPatternDensity);
$prect->SetPos(new Rectangle($pts[2], $pts[3], $pts[4] - $pts[0] + 1, $pts[1] - $pts[3] + 1));
$prect->Stroke($img);
}
// CSIM array
if ($i < count($this->plots[$j]->csimtargets)) {
// Create the client side image map
$rpts = $img->ArrRotate($pts);
$csimcoord = round($rpts[0]) . ", " . round($rpts[1]);
for ($k = 1; $k < 4; ++$k) {
$csimcoord .= ", " . round($rpts[2 * $k]) . ", " . round($rpts[2 * $k + 1]);
}
if (!empty($this->plots[$j]->csimtargets[$i])) {
$this->csimareas .= '<area shape="poly" coords="' . $csimcoord . '" ';
$this->csimareas .= " href=\"" . $this->plots[$j]->csimtargets[$i] . "\"";
if (!empty($this->plots[$j]->csimalts[$i])) {
$sval = sprintf($this->plots[$j]->csimalts[$i], $this->plots[$j]->coords[0][$i]);
$this->csimareas .= " alt=\"{$sval}\" title=\"{$sval}\" ";
}
$this->csimareas .= ">\n";
}
}
$pts[] = $pts[0];
$pts[] = $pts[1];
$img->Polygon($pts);
}
// Draw labels for each acc.bar
$x = $pts[2] + ($pts[4] - $pts[2]) / 2;
$y = $yscale->Translate($accy);
if ($this->bar_shadow) {
$x += $ssh;
}
$this->value->Stroke($img, $accy, $x, $y);
$accy = 0;
$accy_neg = 0;
for ($j = 0; $j < $this->nbrplots; ++$j) {
// We don't print 0 values in an accumulated bar plot
if ($this->plots[$j]->coords[0][$i] == 0) {
continue;
}
if ($this->plots[$j]->coords[0][$i] > 0) {
$yt = $yscale->Translate($this->plots[$j]->coords[0][$i] + $accy);
$accyt = $yscale->Translate($accy);
$y = $accyt - ($accyt - $yt) / 2;
$accy += $this->plots[$j]->coords[0][$i];
} else {
$yt = $yscale->Translate($this->plots[$j]->coords[0][$i] + $accy_neg);
$accyt = $yscale->Translate($accy_neg);
//$y=0;
$accy_neg += $this->plots[$j]->coords[0][$i];
$y = $accyt - ($accyt - $yt) / 2;
// TODO : Check this fix
}
$this->plots[$j]->value->SetAlign("center", "center");
$this->plots[$j]->value->SetMargin(0);
$this->plots[$j]->value->Stroke($img, $this->plots[$j]->coords[0][$i], $x, $y);
}
}
return true;
}
示例6: Stroke
//.........这里部分代码省略.........
} else {
$fromcolor = $this->plots[$j]->grad_fromcolor[$i % $ng][0];
$tocolor = $this->plots[$j]->grad_fromcolor[$i % $ng][1];
$style = $this->plots[$j]->grad_fromcolor[$i % $ng][2];
}
$grad->FilledRectangle($pts[2], $pts[3], $pts[6], $pts[7], $fromcolor, $tocolor, $style);
} else {
$grad->FilledRectangle($pts[2], $pts[3], $pts[6], $pts[7], $this->plots[$j]->grad_fromcolor, $this->plots[$j]->grad_tocolor, $this->plots[$j]->grad_style);
}
} else {
if (is_array($this->plots[$j]->fill_color)) {
$numcolors = count($this->plots[$j]->fill_color);
$fillcolor = $this->plots[$j]->fill_color[$i % $numcolors];
// If the bar is specified to be non filled then the fill color is false
if ($fillcolor !== false) {
$img->SetColor($this->plots[$j]->fill_color[$i % $numcolors]);
}
} else {
$fillcolor = $this->plots[$j]->fill_color;
if ($fillcolor !== false) {
$img->SetColor($this->plots[$j]->fill_color);
}
}
if ($fillcolor !== false) {
$img->FilledPolygon($pts);
}
}
$img->SetColor($this->plots[$j]->color);
// Stroke the pattern
if ($this->plots[$j]->iPattern > -1) {
if ($pattern === NULL) {
$pattern = new RectPatternFactory();
}
$prect = $pattern->Create($this->plots[$j]->iPattern, $this->plots[$j]->iPatternColor, 1);
$prect->SetDensity($this->plots[$j]->iPatternDensity);
if ($this->plots[$j]->coords[0][$i] < 0) {
$rx = $pts[0];
$ry = $pts[1];
} else {
$rx = $pts[2];
$ry = $pts[3];
}
$width = abs($pts[4] - $pts[0]) + 1;
$height = abs($pts[1] - $pts[3]) + 1;
$prect->SetPos(new Rectangle($rx, $ry, $width, $height));
$prect->Stroke($img);
}
// CSIM array
if ($i < count($this->plots[$j]->csimtargets)) {
// Create the client side image map
$rpts = $img->ArrRotate($pts);
$csimcoord = round($rpts[0]) . ", " . round($rpts[1]);
for ($k = 1; $k < 4; ++$k) {
$csimcoord .= ", " . round($rpts[2 * $k]) . ", " . round($rpts[2 * $k + 1]);
}
if (!empty($this->plots[$j]->csimtargets[$i])) {
$this->csimareas .= '<area shape="poly" coords="' . $csimcoord . '" ';
$this->csimareas .= " href=\"" . $this->plots[$j]->csimtargets[$i] . "\" ";
if (!empty($this->plots[$j]->csimwintargets[$i])) {
$this->csimareas .= " target=\"" . $this->plots[$j]->csimwintargets[$i] . "\" ";
}
$sval = '';
if (!empty($this->plots[$j]->csimalts[$i])) {
$sval = sprintf($this->plots[$j]->csimalts[$i], $this->plots[$j]->coords[0][$i]);
$this->csimareas .= " title=\"{$sval}\" ";
}
示例7: Stroke
//.........这里部分代码省略.........
$sp[8] = $pts[4] + $ssh;
$sp[9] = $pts[5] - $ssv;
$sp[10] = $pts[6] + $ssh;
$sp[11] = $pts[7] - $ssv;
} elseif ($val < 0) {
$sp[0] = $pts[4];
$sp[1] = $pts[5];
$sp[2] = $pts[6];
$sp[3] = $pts[7];
$sp[4] = $pts[0];
$sp[5] = $pts[1];
$sp[6] = $pts[0] + $ssh;
$sp[7] = $pts[1] - $ssv;
$sp[8] = $pts[6] + $ssh;
$sp[9] = $pts[7] - $ssv;
$sp[10] = $pts[4] + $ssh;
$sp[11] = $pts[5] - $ssv;
}
if (is_array($this->bar_shadow_color)) {
$numcolors = count($this->bar_shadow_color);
if ($numcolors == 0) {
JpGraphError::Raise('You have specified an empty array for shadow colors in the bar plot.');
}
$img->PushColor($this->bar_shadow_color[$i % $numcolors]);
} else {
$img->PushColor($this->bar_shadow_color);
}
$img->FilledPolygon($sp);
$img->PopColor();
}
// Stroke the pattern
if ($this->iPattern > -1) {
$f = new RectPatternFactory();
$prect = $f->Create($this->iPattern, $this->iPatternColor, 1);
$prect->SetDensity($this->iPatternDensity);
$prect->SetPos(new Rectangle($pts[2], $pts[3], $pts[4] - $pts[0] + 1, $pts[1] - $pts[3] + 1));
$prect->Stroke($img);
}
// Stroke the outline of the bar
if (is_array($this->color)) {
$img->SetColor($this->color[$i % count($this->color)]);
} else {
$img->SetColor($this->color);
}
$pts[] = $pts[0];
$pts[] = $pts[1];
if ($this->weight > 0) {
$img->SetLineWeight($this->weight);
$img->Polygon($pts);
}
// Determine how to best position the values of the individual bars
$x = $pts[2] + ($pts[4] - $pts[2]) / 2;
if ($this->valuepos == 'top') {
$y = $pts[3];
if ($img->a === 90) {
if ($val < 0) {
$this->value->SetAlign('right', 'center');
} else {
$this->value->SetAlign('left', 'center');
}
}
$this->value->Stroke($img, $val, $x, $y);
} elseif ($this->valuepos == 'max') {
$y = $pts[3];
if ($img->a === 90) {
if ($val < 0) {
示例8: Stroke
//.........这里部分代码省略.........
// Stroke a mark using image
if ($p[2]->GetType() == MARK_IMG) {
$p[2]->Stroke($aImg, $x1, $marky);
}
// Stroke a mark with the standard size
// (As long as it is not an image mark )
if ($p[2]->GetType() != MARK_IMG) {
// Clear any user callbacks since we ont want them called for
// the legend marks
$p[2]->iFormatCallback = '';
$p[2]->iFormatCallback2 = '';
// Since size for circles is specified as the radius
// this means that we must half the size to make the total
// width behave as the other marks
if ($p[2]->GetType() == MARK_FILLEDCIRCLE || $p[2]->GetType() == MARK_CIRCLE) {
$p[2]->SetSize(min($this->mark_abs_vsize, $this->mark_abs_hsize) / 2);
$p[2]->Stroke($aImg, $x1, $marky);
} else {
$p[2]->SetSize(min($this->mark_abs_vsize, $this->mark_abs_hsize));
$p[2]->Stroke($aImg, $x1, $marky);
}
}
} elseif (!empty($p[2]) && (is_string($p[3]) || $p[3] > 0)) {
// Draw a styled line
$aImg->SetColor($p[1]);
$aImg->SetLineStyle($p[3]);
$aImg->StyleLine($x1 - $this->mark_abs_hsize, $marky, $x1 + $this->mark_abs_hsize, $marky);
$aImg->StyleLine($x1 - $this->mark_abs_hsize, $marky + 1, $x1 + $this->mark_abs_hsize, $marky + 1);
} else {
// Draw a colored box
$color = $p[1];
// We make boxes slightly larger to better show
$boxsize = max($this->mark_abs_vsize, $this->mark_abs_hsize) + 2;
$ym = $marky - ceil($boxsize / 2);
// Marker y-coordinate
// We either need to plot a gradient or a
// pattern. To differentiate we use a kludge.
// Patterns have a p[3] value of < -100
if ($p[3] < -100) {
// p[1][0] == iPattern, p[1][1] == iPatternColor, p[1][2] == iPatternDensity
if ($patternFactory == null) {
$patternFactory = new RectPatternFactory();
}
$prect = $patternFactory->Create($p[1][0], $p[1][1], 1);
$prect->SetBackground($p[1][3]);
$prect->SetDensity($p[1][2] + 1);
$prect->SetPos(new Rectangle($x1, $ym, $boxsize, $boxsize));
$prect->Stroke($aImg);
$prect = null;
} else {
if (is_array($color) && count($color) == 2) {
// The client want a gradient color
$grad->FilledRectangle($x1 - $boxsize / 2, $ym, $x1 + $boxsize / 2, $ym + $boxsize, $color[0], $color[1], -$p[3]);
} else {
$aImg->SetColor($p[1]);
$aImg->FilledRectangle($x1 - $boxsize / 2, $ym, $x1 + $boxsize / 2, $ym + $boxsize);
}
// Draw a plot frame line
$aImg->SetColor($this->color);
$aImg->SetLineWeight($fillBoxFrameWeight);
$aImg->Rectangle($x1 - $boxsize / 2, $ym, $x1 + $boxsize / 2, $ym + $boxsize);
}
}
$aImg->SetColor($this->font_color);
$aImg->SetFont($this->font_family, $this->font_style, $this->font_size);
$aImg->SetTextAlign('left', 'baseline');
$debug = false;
$aImg->StrokeText($x1 + $this->mark_abs_hsize + $this->xmargin, $y1, $p[0], 0, 'left', $debug);
// Add CSIM for Legend if defined
if (!empty($p[4])) {
$xs = $x1 - $this->mark_abs_hsize;
$ys = $y1 + 1;
$xe = $x1 + $aImg->GetTextWidth($p[0]) + $this->mark_abs_hsize + $this->xmargin;
$ye = $y1 - $rowheight[$row] + 1;
$coords = "{$xs},{$ys},{$xe},{$y1},{$xe},{$ye},{$xs},{$ye}";
if (!empty($p[4])) {
$this->csimareas .= "<area shape=\"poly\" coords=\"{$coords}\" href=\"" . htmlentities($p[4]) . "\"";
if (!empty($p[6])) {
$this->csimareas .= " target=\"" . $p[6] . "\"";
}
if (!empty($p[5])) {
$tmp = sprintf($p[5], $p[0]);
$this->csimareas .= " title=\"{$tmp}\" alt=\"{$tmp}\" ";
}
$this->csimareas .= " />\n";
}
}
if ($i >= $this->layout_n) {
$x1 = $xp + $this->xlmargin;
$row++;
if (!empty($rowheight[$row])) {
$y1 += $rowheight[$row];
}
$i = 1;
} else {
$x1 += $colwidth[($i - 1) % $numcolumns];
++$i;
}
}
}
示例9: PlotBand
function PlotBand($aDir, $aPattern, $aMin, $aMax, $aColor = "black", $aWeight = 1, $aDepth = DEPTH_BACK)
{
$f = new RectPatternFactory();
$this->prect = $f->Create($aPattern, $aColor, $aWeight);
$this->dir = $aDir;
$this->min = $aMin;
$this->max = $aMax;
$this->depth = $aDepth;
}
示例10: PlotBand
function PlotBand($aDir, $aPattern, $aMin, $aMax, $aColor = "black", $aWeight = 1, $aDepth = DEPTH_BACK)
{
$f = new RectPatternFactory();
$this->prect = $f->Create($aPattern, $aColor, $aWeight);
if (is_numeric($aMin) && is_numeric($aMax) && $aMin > $aMax) {
JpGraphError::RaiseL(16004);
}
$this->dir = $aDir;
$this->min = $aMin;
$this->max = $aMax;
$this->depth = $aDepth;
}
示例11: Stroke
function Stroke(&$aImg, $aScale)
{
$factory = new RectPatternFactory();
$prect = $factory->Create($this->iPattern, $this->iPatternColor);
$prect->SetDensity($this->iPatternDensity);
if ($this->iHeightFactor > -0.0 && $this->iHeightFactor <= 1.1) {
$vs = $aScale->GetVertSpacing() * $this->iHeightFactor;
} elseif (is_int($this->iHeightFactor) && $this->iHeightFactor > 2 && $this->iHeightFactor < 200) {
$vs = $this->iHeightFactor;
} else {
JpGraphError::RaiseL(6028, $this->iHeightFactor);
}
$st = $aScale->NormalizeDate($this->iStart);
$en = $aScale->NormalizeDate($this->iEnd);
$limst = max($st, $aScale->iStartDate);
$limen = min($en, $aScale->iEndDate);
$xt = round($aScale->TranslateDate($limst));
$xb = round($aScale->TranslateDate($limen));
$yt = round($aScale->TranslateVertPos($this->iVPos) - $vs - ($aScale->GetVertSpacing() / 2 - $vs / 2));
$yb = round($aScale->TranslateVertPos($this->iVPos) - ($aScale->GetVertSpacing() / 2 - $vs / 2));
$middle = round($yt + ($yb - $yt) / 2);
$this->StrokeActInfo($aImg, $aScale, $middle);
if (!empty($this->title->csimtarget)) {
$colwidth = $this->title->GetColWidth($aImg);
$colstarts = array();
$aScale->actinfo->GetColStart($aImg, $colstarts, true);
$n = min(count($colwidth), count($this->title->csimtarget));
for ($i = 0; $i < $n; ++$i) {
$title_xt = $colstarts[$i];
$title_xb = $title_xt + $colwidth[$i];
$coords = "{$title_xt},{$yt},{$title_xb},{$yt},{$title_xb},{$yb},{$title_xt},{$yb}";
if (!empty($this->title->csimtarget[$i])) {
$this->csimarea .= "<area shape=\"poly\" coords=\"{$coords}\" href=\"" . $this->title->csimtarget[$i] . "\"";
if (!empty($this->title->csimwintarget[$i])) {
$this->csimarea .= "target=\"" . $this->title->csimwintarget[$i] . "\" ";
}
if (!empty($this->title->csimalt[$i])) {
$tmp = $this->title->csimalt[$i];
$this->csimarea .= " title=\"{$tmp}\" alt=\"{$tmp}\" ";
}
$this->csimarea .= " />\n";
}
}
}
if ($en < $aScale->iStartDate || $st > $aScale->iEndDate) {
return;
}
$this->SetConstrainPos($xt, $yt, $xb, $yb);
$prect->ShowFrame(false);
$prect->SetBackground($this->iFillColor);
if ($this->iShadow) {
$aImg->SetColor($this->iFrameColor);
$aImg->ShadowRectangle($xt, $yt, $xb, $yb, $this->iFillColor, $this->iShadowWidth, $this->iShadowColor);
$prect->SetPos(new Rectangle($xt + 1, $yt + 1, $xb - $xt - $this->iShadowWidth - 2, $yb - $yt - $this->iShadowWidth - 2));
$prect->Stroke($aImg);
} else {
$prect->SetPos(new Rectangle($xt, $yt, $xb - $xt + 1, $yb - $yt + 1));
$prect->Stroke($aImg);
$aImg->SetColor($this->iFrameColor);
$aImg->Rectangle($xt, $yt, $xb, $yb);
}
if (!empty($this->csimtarget)) {
$coords = "{$xt},{$yt},{$xb},{$yt},{$xb},{$yb},{$xt},{$yb}";
$this->csimarea .= "<area shape=\"poly\" coords=\"{$coords}\" href=\"" . $this->csimtarget . "\"";
if (!empty($this->csimwintarget)) {
$this->csimarea .= " target=\"" . $this->csimwintarget . "\" ";
}
if ($this->csimalt != '') {
$tmp = $this->csimalt;
$this->csimarea .= " title=\"{$tmp}\" alt=\"{$tmp}\" ";
}
$this->csimarea .= " />\n";
}
if ($this->progress->iProgress > 0) {
$xtp = $aScale->TranslateDate($st);
$xbp = $aScale->TranslateDate($en);
$len = ($xbp - $xtp) * $this->progress->iProgress;
$endpos = $xtp + $len;
if ($endpos > $xt) {
$len -= $xt - $xtp;
if ($xtp < $xt) {
$xtp = $xt;
}
if ($xtp + $len - 1 > $xb) {
$len = $xb - $xtp;
}
$prog = $factory->Create($this->progress->iPattern, $this->progress->iColor);
$prog->SetDensity($this->progress->iDensity);
$prog->SetBackground($this->progress->iFillColor);
$barheight = $yb - $yt + 1;
if ($this->iShadow) {
$barheight -= $this->iShadowWidth;
}
$progressheight = floor($barheight * $this->progress->iHeight);
$marg = ceil(($barheight - $progressheight) / 2);
$pos = new Rectangle($xtp, $yt + $marg, $len, $barheight - 2 * $marg);
$prog->SetPos($pos);
$prog->Stroke($aImg);
}
}
//.........这里部分代码省略.........
示例12: Stroke
//.........这里部分代码省略.........
$img->FilledPolygon($nsp, 4);
}
$img->PopColor();
}
}
if ($this->plots[$j]->coords[0][$i] == 0) {
continue;
}
if ($this->plots[$j]->grad) {
$grad = new Gradient($img);
$grad->FilledRectangle($pts[2], $pts[3], $pts[6], $pts[7], $this->plots[$j]->grad_fromcolor, $this->plots[$j]->grad_tocolor, $this->plots[$j]->grad_style);
} else {
if (is_array($this->plots[$j]->fill_color)) {
$numcolors = count($this->plots[$j]->fill_color);
$fillcolor = $this->plots[$j]->fill_color[$i % $numcolors];
if ($fillcolor !== false) {
$img->SetColor($this->plots[$j]->fill_color[$i % $numcolors]);
}
} else {
$fillcolor = $this->plots[$j]->fill_color;
if ($fillcolor !== false) {
$img->SetColor($this->plots[$j]->fill_color);
}
}
if ($fillcolor !== false) {
$img->FilledPolygon($pts);
}
$img->SetColor($this->plots[$j]->color);
}
if ($this->plots[$j]->iPattern > -1) {
if ($pattern === NULL) {
$pattern = new RectPatternFactory();
}
$prect = $pattern->Create($this->plots[$j]->iPattern, $this->plots[$j]->iPatternColor, 1);
$prect->SetDensity($this->plots[$j]->iPatternDensity);
if ($this->plots[$j]->coords[0][$i] < 0) {
$rx = $pts[0];
$ry = $pts[1];
} else {
$rx = $pts[2];
$ry = $pts[3];
}
$width = abs($pts[4] - $pts[0]) + 1;
$height = abs($pts[1] - $pts[3]) + 1;
$prect->SetPos(new Rectangle($rx, $ry, $width, $height));
$prect->Stroke($img);
}
if ($i < count($this->plots[$j]->csimtargets)) {
$rpts = $img->ArrRotate($pts);
$csimcoord = round($rpts[0]) . ", " . round($rpts[1]);
for ($k = 1; $k < 4; ++$k) {
$csimcoord .= ", " . round($rpts[2 * $k]) . ", " . round($rpts[2 * $k + 1]);
}
if (!empty($this->plots[$j]->csimtargets[$i])) {
$this->csimareas .= '<area shape="poly" coords="' . $csimcoord . '" ';
$this->csimareas .= " href=\"" . $this->plots[$j]->csimtargets[$i] . "\" ";
if (!empty($this->plots[$j]->csimwintargets[$i])) {
$this->csimareas .= " target=\"" . $this->plots[$j]->csimwintargets[$i] . "\" ";
}
$sval = '';
if (!empty($this->plots[$j]->csimalts[$i])) {
$sval = sprintf($this->plots[$j]->csimalts[$i], $this->plots[$j]->coords[0][$i]);
$this->csimareas .= " title=\"{$sval}\" ";
}
$this->csimareas .= " alt=\"{$sval}\" />\n";
}
示例13: Stroke
//.........这里部分代码省略.........
$aImg->SetColor($this->fill_color);
$aImg->FilledRectangle($xp, $yp, $xp + $abs_width, $yp + $abs_height);
$aImg->SetColor($this->color);
$aImg->Rectangle($xp, $yp, $xp + $abs_width, $yp + $abs_height);
}
$x1 = $xp + $this->mark_abs_hsize + $this->xlmargin;
$y1 = $yp + $this->ymargin;
$f2 = round($aImg->GetTextHeight('X') / 2);
$grad = new Gradient($aImg);
$patternFactory = null;
$i = 1;
$row = 0;
foreach ($this->txtcol as $p) {
if (_JPG_DEBUG) {
$aImg->SetLineWeight(1);
$aImg->SetColor('red');
$aImg->SetLineStyle('solid');
$aImg->Rectangle($xp, $y1, $xp + $abs_width, $y1 + $rowheight[$row]);
}
$aImg->SetLineWeight($this->weight);
$x1 = round($x1);
$y1 = round($y1);
if ($p[2] && $p[2]->GetType() > -1) {
$aImg->SetColor($p[1]);
if (is_string($p[3]) || $p[3] > 0) {
$aImg->SetLineStyle($p[3]);
$aImg->StyleLine($x1 - $this->mark_abs_hsize, $y1 + $f2, $x1 + $this->mark_abs_hsize, $y1 + $f2);
}
if ($p[2]->GetType() != MARK_IMG) {
$p[2]->iFormatCallback = '';
$p[2]->iFormatCallback2 = '';
if ($p[2]->GetType() == MARK_FILLEDCIRCLE || $p[2]->GetType() == MARK_CIRCLE) {
$p[2]->SetSize(min($this->mark_abs_vsize, $this->mark_abs_hsize) / 2);
$p[2]->Stroke($aImg, $x1, $y1 + $f2);
} else {
$p[2]->SetSize(min($this->mark_abs_vsize, $this->mark_abs_hsize));
$p[2]->Stroke($aImg, $x1, $y1 + $f2);
}
}
} elseif ($p[2] && (is_string($p[3]) || $p[3] > 0)) {
$aImg->SetColor($p[1]);
$aImg->SetLineStyle($p[3]);
$aImg->StyleLine($x1 - 1, $y1 + $f2, $x1 + $this->mark_abs_hsize, $y1 + $f2);
$aImg->StyleLine($x1 - 1, $y1 + $f2 + 1, $x1 + $this->mark_abs_hsize, $y1 + $f2 + 1);
} else {
$color = $p[1];
$boxsize = min($this->mark_abs_vsize, $this->mark_abs_hsize) + 2;
$ym = round($y1 + $f2 - $boxsize / 2);
if ($p[3] < -100) {
if ($patternFactory == null) {
$patternFactory = new RectPatternFactory();
}
$prect = $patternFactory->Create($p[1][0], $p[1][1], 1);
$prect->SetBackground($p[1][3]);
$prect->SetDensity($p[1][2] + 1);
$prect->SetPos(new Rectangle($x1, $ym, $boxsize, $boxsize));
$prect->Stroke($aImg);
$prect = null;
} else {
if (is_array($color) && count($color) == 2) {
$grad->FilledRectangle($x1, $ym, $x1 + $boxsize, $ym + $boxsize, $color[0], $color[1], -$p[3]);
} else {
$aImg->SetColor($p[1]);
$aImg->FilledRectangle($x1, $ym, $x1 + $boxsize, $ym + $boxsize);
}
$aImg->SetColor($this->color);
$aImg->SetLineWeight($fillBoxFrameWeight);
$aImg->Rectangle($x1, $ym, $x1 + $boxsize, $ym + $boxsize);
}
}
$aImg->SetColor($this->font_color);
$aImg->SetFont($this->font_family, $this->font_style, $this->font_size);
$aImg->SetTextAlign("left", "top");
$aImg->StrokeText(round($x1 + $this->mark_abs_hsize + $this->xmargin), $y1, $p[0]);
if ($p[4] != "") {
$xe = $x1 + $this->xmargin + $this->mark_abs_hsize + $aImg->GetTextWidth($p[0]);
$ye = $y1 + max($this->mark_abs_vsize, $aImg->GetTextHeight($p[0]));
$coords = "{$x1},{$y1},{$xe},{$y1},{$xe},{$ye},{$x1},{$ye}";
if (!empty($p[4])) {
$this->csimareas .= "<area shape=\"poly\" coords=\"{$coords}\" href=\"" . htmlentities($p[4]) . "\"";
if (!empty($p[6])) {
$this->csimareas .= " target=\"" . $p[6] . "\"";
}
if (!empty($p[5])) {
$tmp = sprintf($p[5], $p[0]);
$this->csimareas .= " title=\"{$tmp}\" alt=\"{$tmp}\" ";
}
$this->csimareas .= " />\n";
}
}
if ($i >= $this->layout_n) {
$x1 = $xp + $this->mark_abs_hsize + $this->xlmargin;
$y1 += $rowheight[$row++];
$i = 1;
} else {
$x1 += $colwidth[($i - 1) % $numcolumns];
++$i;
}
}
}
示例14: Stroke
function Stroke($aImg, $aScale)
{
$factory = new RectPatternFactory();
$prect = $factory->Create($this->iPattern, $this->iPatternColor);
$prect->SetDensity($this->iPatternDensity);
// If height factor is specified as a float between 0,1 then we take it as meaning
// percetage of the scale width between horizontal line.
// If it is an integer > 1 we take it to mean the absolute height in pixels
if ($this->iHeightFactor > -0.0 && $this->iHeightFactor <= 1.1) {
$vs = $aScale->GetVertSpacing() * $this->iHeightFactor;
} elseif (is_int($this->iHeightFactor) && $this->iHeightFactor > 2 && $this->iHeightFactor < 200) {
$vs = $this->iHeightFactor;
} else {
JpGraphError::Raise("Specified height (" . $this->iHeightFactor . ") for gantt bar is out of range.");
}
// Clip date to min max dates to show
$st = $aScale->NormalizeDate($this->iStart);
$en = $aScale->NormalizeDate($this->iEnd);
$limst = max($st, $aScale->iStartDate);
$limen = min($en, $aScale->iEndDate + SECPERDAY);
$xt = $aScale->TranslateDate($limst);
$xb = $aScale->TranslateDate($limen) - 1;
$yt = $aScale->TranslateVertPos($this->iVPos) - $vs - ($aScale->GetVertSpacing() / 2 - $vs / 2);
$yb = $aScale->TranslateVertPos($this->iVPos) - ($aScale->GetVertSpacing() / 2 - $vs / 2);
$middle = round($yt + ($yb - $yt) / 2);
$this->title->Stroke($aImg, $aImg->left_margin + $this->iLabelLeftMargin, $middle);
// Check if the bar is outside the current range
if ($en < $aScale->iStartDate + SECPERDAY || $st > $aScale->iEndDate) {
return;
}
$prect->ShowFrame(false);
$prect->SetBackground($this->iFillColor);
if ($this->iShadow) {
$aImg->SetColor($this->iFrameColor);
$aImg->ShadowRectangle($xt, $yt, $xb, $yb, $this->iFillColor, $this->iShadowWidth, $this->iShadowColor);
$prect->SetPos(new Rectangle($xt + 1, $yt + 1, $xb - $xt - $this->iShadowWidth - 2, $yb - $yt - $this->iShadowWidth - 2));
$prect->Stroke($aImg);
} else {
$prect->SetPos(new Rectangle($xt, $yt, $xb - $xt + 1, $yb - $yt + 1));
$prect->Stroke($aImg);
$aImg->SetColor($this->iFrameColor);
$aImg->Rectangle($xt, $yt, $xb, $yb);
}
if ($this->progress->iProgress > 0) {
//echo "test <p>";
$xtp = $aScale->TranslateDate($st);
$xbp = $aScale->TranslateDate($en);
$len = ($xbp - $xtp) * $this->progress->iProgress;
$endpos = $xtp + $len;
if ($endpos > $xt) {
$len -= $xt - $xtp;
//echo "diff in days : ".(($xt-$xtp)/$aScale->GetDayWidth())."<p>";
//echo "xtp=$xtp, len=$len, xt=$xt<p>";
if ($xtp < $xt) {
$xtp = $xt;
}
$prog = $factory->Create($this->progress->iPattern, $this->progress->iColor);
$prog->SetDensity($this->progress->iDensity);
$barheight = $yb - $yt + 1;
if ($this->iShadow) {
$barheight -= $this->iShadowWidth;
}
$progressheight = floor($barheight * $this->progress->iHeight);
$marg = ceil(($barheight - $progressheight) / 2);
$pos = new Rectangle($xtp, $yt + $marg, $len, $barheight - 2 * $marg);
$prog->SetPos($pos);
$prog->Stroke($aImg);
}
}
// We don't plot the end mark if the bar has been capped
if ($limst == $st) {
$this->leftMark->Stroke($aImg, $xt, $middle);
}
if ($limen == $en) {
$this->rightMark->Stroke($aImg, $xb, $middle);
$margin = $this->iCaptionMargin;
if ($this->rightMark->show) {
$margin += $this->rightMark->GetWidth();
}
$this->caption->Stroke($aImg, $xb + $margin, $middle);
}
}
示例15: Stroke
function Stroke($aImg, $aScale)
{
$factory = new RectPatternFactory();
$prect = $factory->Create($this->iPattern, $this->iPatternColor);
$prect->SetDensity($this->iPatternDensity);
// If height factor is specified as a float between 0,1 then we take it as meaning
// percetage of the scale width between horizontal line.
// If it is an integer > 1 we take it to mean the absolute height in pixels
if ($this->iHeightFactor > -0.0 && $this->iHeightFactor <= 1.1) {
$vs = $aScale->GetVertSpacing() * $this->iHeightFactor;
} elseif (is_int($this->iHeightFactor) && $this->iHeightFactor > 2 && $this->iHeightFactor < 200) {
$vs = $this->iHeightFactor;
} else {
JpGraphError::Raise("<b>JpGraph Error:</b>Specified height (" . $this->iHeightFactor . ") for gantt bar is out of range.");
}
$xt = $aScale->TranslateDate($aScale->NormalizeDate($this->iStart));
$xb = $aScale->TranslateDate($aScale->NormalizeDate($this->iEnd));
$yt = $aScale->TranslateVertPos($this->iVPos) - $vs - ($aScale->GetVertSpacing() / 2 - $vs / 2);
$yb = $aScale->TranslateVertPos($this->iVPos) - ($aScale->GetVertSpacing() / 2 - $vs / 2);
$prect->ShowFrame(false);
$prect->SetBackground($this->iFillColor);
if ($this->iShadow) {
$aImg->SetColor($this->iFrameColor);
$aImg->ShadowRectangle($xt, $yt, $xb, $yb, $this->iFillColor, $this->iShadowWidth, $this->iShadowColor);
$prect->SetPos(new Rectangle($xt + 1, $yt + 1, $xb - $xt - $this->iShadowWidth - 2, $yb - $yt - $this->iShadowWidth - 2));
$prect->Stroke($aImg);
} else {
$prect->SetPos(new Rectangle($xt, $yt, $xb - $xt + 1, $yb - $yt + 1));
$prect->Stroke($aImg);
$aImg->SetColor($this->iFrameColor);
$aImg->Rectangle($xt, $yt, $xb, $yb);
}
if ($this->progress->iProgress > 0) {
$prog = $factory->Create($this->progress->iPattern, $this->progress->iColor);
$prog->SetDensity($this->progress->iDensity);
$barheight = $yb - $yt + 1;
if ($this->iShadow) {
$barheight -= $this->iShadowWidth;
}
$progressheight = floor($barheight * $this->progress->iHeight);
$marg = ceil(($barheight - $progressheight) / 2);
$pos = new Rectangle($xt, $yt + $marg, ($xb - $xt + 1) * $this->progress->iProgress, $barheight - 2 * $marg);
$prog->SetPos($pos);
$prog->Stroke($aImg);
}
$middle = round($yt + ($yb - $yt) / 2);
$this->title->Stroke($aImg, $aImg->left_margin + $this->iLabelLeftMargin, $middle);
$this->leftMark->Stroke($aImg, $xt, $middle);
$this->rightMark->Stroke($aImg, $xb, $middle);
$margin = $this->iCaptionMargin;
if ($this->rightMark->show) {
$margin += $this->rightMark->GetWidth();
}
$this->caption->Stroke($aImg, $xb + $margin, $middle);
}