Edit report at http://bugs.php.net/bug.php?id=52070&edit=1

 ID:                 52070
 User updated by:    tgabor72 at freemail dot hu
 Reported by:        tgabor72 at freemail dot hu
 Summary:            imagedashedline() - dashed line sometimes is not
                     visible
-Status:             Open
+Status:             Closed
 Type:               Bug
 Package:            GD related
 Operating System:   WinXP - IIS -fastcgi
 PHP Version:        5.3.2
 Block user comment: N

 New Comment:

You can use the imagepatternedline() function with extra features
instead of imagedashedline() to give a visible dashedlines and other any
kind of patterned lines on your images. The routine also manages the
thickness of the line. Have fun!



// imagepatternedline() function

// Routine was developed to draw any kind of straight line with
thickness. Routine uses imageline() function to draw line.

// Parameters are (similar to imageline() function):

//   $image: (resource) imagefile

//   $xstart, $ystart: (int) x,y coordinates for first point

//   $xend, $yend: (int) x,y coordinates for last point

//   $color: (int) color identifier that created with
imagecolorallocate()

// extra parameters:

//   $thickness: (int) thickness of line in pixel

//   $pattern: (string) pattern of line, which repeats continuously
while line is being drawed.

//   If there is '1' in the pattern that means the actual dot of line is
visible,

//   '0' means dot is not visible (space between two line elements).

//   All characters regard for one pixel. Default: 1 dot wide dashed
line with 4-4 dots and spaces.

// Examples for pattern:

// "1" or "" continuous line

// "10" close dotline

// "10000" dotline

// "111111110000001100000011111111" dotline for design drawing

// "111111111100000011000000110000001111111111" double dotline

// some examples for using imagepatternedline():

// imagepatternedline($image,300,300,442,442,$color,200,""); // a square
with 200 length of edge and rotated 45 degrees

// imagepatternedline($image,100,200,289,200,$color,100, 

//  "11001100000011001111000011001111110000001100001100"

// ."00001111001100111100000011000000110000110011001100"

// ."11000011111100111111000011001111001111000011110000"

// ."1111001111110011000011000000001100110011"); // barcode 



function imagepatternedline($image, $xstart, $ystart, $xend, $yend,
$color, $thickness=1, $pattern="11000011") {

   $pattern=(!strlen($pattern)) ? "1" : $pattern;

   $x=$xend-$xstart;

   $y=$yend-$ystart;

   $length=floor(sqrt(pow(($x),2)+pow(($y),2)));

   $fullpattern=$pattern;

   while (strlen($fullpattern)<$length) $fullpattern.=$pattern;

   if (!$length) {

      if ($fullpattern[0]) imagefilledellipse($image, $xstart, $ystart,
$thickness, $thickness, $color);

      return;

   }

   $x1=$xstart;

   $y1=$ystart;

   $x2=$x1;

   $y2=$y1;

   $mx=$x/$length;

   $my=$y/$length;

   $line="";

   for($i=0;$i<$length;$i++){

      if (strlen($line)==0 or $fullpattern[$i]==$line[0]) {

         $line.=$fullpattern[$i];

      }else{

         $x2+=strlen($line)*$mx;

         $y2+=strlen($line)*$my;

         if ($line[0]) imageline($image, round($x1), round($y1),
round($x2-$mx), round($y2-$my), $color);

         $k=1;

         for($j=0;$j<$thickness-1;$j++) {

            $k1=-(($k-0.5)*$my)*(floor($j*0.5)+1)*2;

            $k2= (($k-0.5)*$mx)*(floor($j*0.5)+1)*2;

            $k=1-$k;

            if ($line[0]) {

               imageline($image, round($x1)+$k1, round($y1)+$k2,
round($x2-$mx)+$k1, round($y2-$my)+$k2, $color);

               if ($y) imageline($image, round($x1)+$k1+1,
round($y1)+$k2, round($x2-$mx)+$k1+1, round($y2-$my)+$k2, $color);

               if ($x) imageline($image, round($x1)+$k1,
round($y1)+$k2+1, round($x2-$mx)+$k1, round($y2-$my)+$k2+1, $color);

            }

         }

         $x1=$x2;

         $y1=$y2;

         $line=$fullpattern[$i];

      }

   }

   $x2+=strlen($line)*$mx;

   $y2+=strlen($line)*$my;

   if ($line[0]) imageline($image, round($x1), round($y1), round($xend),
round($yend), $color);

   $k=1;

   for($j=0;$j<$thickness-1;$j++) {

      $k1=-(($k-0.5)*$my)*(floor($j*0.5)+1)*2;

      $k2= (($k-0.5)*$mx)*(floor($j*0.5)+1)*2;

      $k=1-$k;

      if ($line[0]) {

         imageline($image, round($x1)+$k1, round($y1)+$k2,
round($xend)+$k1, round($yend)+$k2, $color);

         if ($y) imageline($image, round($x1)+$k1+1, round($y1)+$k2,
round($xend)+$k1+1, round($yend)+$k2, $color);

         if ($x) imageline($image, round($x1)+$k1, round($y1)+$k2+1,
round($xend)+$k1, round($yend)+$k2+1, $color);

      }

   }

}


Previous Comments:
------------------------------------------------------------------------
[2010-06-13 00:28:12] tgabor72 at freemail dot hu

Description:
------------
This bug first was realized by me in php 5.3.1. imagedashedline()
function is not work properly. Tipically horizontal and sharp-angled
dashed lines is not visible after running this function. Could someone
make a patch or fix this problem?

I know this problem has already been realized in earlier versions also,
but not corrected yet. 



Thanks,



Gabor

Test script:
---------------
$im=imagecreate(1200,800);

$background_color=imagecolorallocate($im,40,40,40);

$color=imagecolorallocate($im,255,255,255);

imagedashedline($im,800,400,300,400,$color); // not visible, horizontal
line

imagedashedline($im,800,400,300,800,$color); // not visible

imagedashedline($im,800,400,400,800,$color); // not visible

imagedashedline($im,800,400,500,800,$color); // visible

imagedashedline($im,800,400,600,800,$color); // visible

imagedashedline($im,800,400,700,800,$color); // visible

imagedashedline($im,800,400,800,800,$color); // visible, vertical line

header("Content-type: image/png");

imagepng($im);

imagedestroy($im);





------------------------------------------------------------------------



-- 
Edit this bug report at http://bugs.php.net/bug.php?id=52070&edit=1

Reply via email to