Examples Menu
Standard API Basics - Quick Start
001 PNG Output Browser
002 Using outputed PNG
003 Parametrised PNG generator...
004 ... and how to use it
005 PNG saved to file
006 Configuring ECC level
007 Configuring pixel size
008 Configuring frame size
010 Using merged lib version
020 Content - Phone Number
021 Content - SMS App
022 Content - Email simple
023 Content - Email extended
024 Content - Skype call
025 Content - Business Card, simple
026 Content - Business Card, detailed
027 Content - Business Card, photo
Plugins API Basics - Quick Start
100 --- ToDo ---
Standard API - Vector Graphics
201 SVG basic output
202 SVG confguring output
203 SVG save to file
204 Compressed SVGZ save support
211 CANVAS basic
212 CANVAS rendered on custom tag
Plugins API - Vector Graphics
300 --- ToDo ---
Standard API - Debug & Custom Dev
701 Text output
702 Text output - ASCII ART
703 Raw Code output
704 Raw Code debug
711 Custom GD2 JPEG renderer
712 Custom GD2 debug renderer
721 Vector debug - areas
722 Vector debug - edges
723 Vector debug - paths renderer
Plugins API - Debug & Custom Dev
800 --- ToDo ---

Result
Sourcecode
example_723_vector_paths_debug.php
<?php

    
include('../lib/full/qrlib.php');
    include(
'config.php');

    
// debuging vector subshapes
    // visible object categories:
    // pixels (black), rectangles (gray), LShapes (blue), markers(green)
    // and complicated paths (outlined color)
    
    
$codeContents   = 'Let see what the code structure looks like with a little bit bigger code';
    
$eccLevel       = QR_ECLEVEL_H;
    
$pixelPerPoint  = 12;
    
$marginSize     = 2;
    
$tempDir        = EXAMPLE_TMP_SERVERPATH;
    
$fileName       = '723_path_debug.png';
    
    
// because PHP does not have macros or closures
    
function mapCoord($pos) {
        return (
$pos+2)*12;
    }
    
    
// from: http://stackoverflow.com/questions/3597417/php-hsv-to-rgb-formula-comprehension by: Artefacto
    
function HSVtoRGB(array $hsv) {
        list(
$H,$S,$V) = $hsv;
        
$H *= 6;
        
$I = floor($H);
        
$F = $H - $I;
        
$M = $V * (1 - $S);
        
$N = $V * (1 - $S * $F);
        
$K = $V * (1 - $S * (1 - $F));
        switch (
$I) {
            case 
0:
                list(
$R,$G,$B) = array($V,$K,$M);
                break;
            case 
1:
                list(
$R,$G,$B) = array($N,$V,$M);
                break;
            case 
2:
                list(
$R,$G,$B) = array($M,$V,$K);
                break;
            case 
3:
                list(
$R,$G,$B) = array($M,$N,$V);
                break;
            case 
4:
                list(
$R,$G,$B) = array($K,$M,$V);
                break;
            case 
5:
            case 
6: //for when $H=1 is given
                
list($R,$G,$B) = array($V,$M,$N);
                break;
        }
        return array(
$R, $G, $B);
    }
    
    
// QR code lib area finding
    
$enc = QRencode::factory($eccLevel, 1, 0);
    
$tab_src = $enc->encode($codeContents, false);
    
$area = new QRarea($tab_src);
    
$area->detectGroups();
    
$area->detectAreas();
  
    
// GD2 magical rendering
    
$imgW = $area->width;
    
$imgH = $area->width;
    
    
$target_image = imagecreate(
        (
$imgW + $marginSize*2) * $pixelPerPoint, 
        (
$imgH + $marginSize*2) * $pixelPerPoint
    
);
    
    
$colBg      = imagecolorallocate($target_image, 255, 255, 255); // BG, white 
    
$colTxt     = imagecolorallocate($target_image, 0, 0, 0);       // TXT, black 
    
    
$colPix     = imagecolorallocate($target_image, 40, 40, 40);    // Pixel 
    
$colRect    = imagecolorallocate($target_image, 190, 190, 190); // Rect 
    
$colTracker = imagecolorallocate($target_image, 0, 220, 0);     // Tracker 
    
$colTrackBg = imagecolorallocate($target_image, 0, 255, 0);     // Tracker-Bg
    
$colLshape  = imagecolorallocate($target_image, 30, 30, 255);   // L-Shape 
    
$colBgL     = imagecolorallocate($target_image, 240, 240, 255); // L-Shape Cut-out 
    
    
$pNum = 0;
    
    
// shape rendering ------------------------
    
    
foreach ($area->paths as $path) {
        switch (
$path[0]) {
        
            case 
QR_AREA_PATH:

                    
// nice random colors
                    
$rgb = HSVtoRGB(array(
                        
mt_rand(0, 360) / 360.0,
                        ((
mt_rand(0, 25))+75) / 100.0,
                        
0.9
                    
));
                    
                    
$colShape = imagecolorallocate(
                        
$target_image, 
                        
floor($rgb[0]*255), 
                        
floor($rgb[1]*255), 
                        
floor($rgb[2]*255)
                    );
                    
$subShape = 0;
                    
                    
// fill pattern
                    
$fill_image = imagecreatetruecolor(5, 5);
                    
$colFillBg = imagecolorallocate($fill_image, 255, 255, 255);
                    
$colFill = imagecolorallocate(
                        
$fill_image, 
                        
floor($rgb[0]*255), 
                        
floor($rgb[1]*255), 
                        
floor($rgb[2]*255)
                    );
                    
imagefilledrectangle ($fill_image, 0, 0, 5, 5, $colFillBg);
                    
imagesetthickness($fill_image, 1);
                    
imageline($fill_image, 0 , 4 , 4 , 0 , $colFill);

                    
// we iterate over all subshapes of shape
                    
foreach($path[1] as $pathDetails) {
                        
                        
$points = array();
                        
$px = array_shift($pathDetails);
                        
$py = array_shift($pathDetails);
                        
$rle_steps = array_shift($pathDetails);

                        
$points[] = mapCoord($px);
                        
$points[] = mapCoord($py);
                        
                        while(
count($rle_steps) > 0) {
                        
                            
$delta = 1;
                            
                            
$operator = array_shift($rle_steps);
                            if ((
$operator != 'R') && ($operator != 'L') 
                                && (
$operator != 'T') && ($operator != 'B')) {
                                
$delta = (int)$operator;
                                
$operator = array_shift($rle_steps);
                            }
                            
                            if (
$operator == 'R') $px += $delta;
                            if (
$operator == 'L') $px -= $delta;
                            if (
$operator == 'T') $py -= $delta;
                            if (
$operator == 'B') $py += $delta;
                        
                            
$points[] = mapCoord($px);
                            
$points[] = mapCoord($py);
                        }
                        
                        if (
$subShape == 0) { 
                        
                            
// first polygon is outline
                            
                            // fill
                            
imagesettile($target_image, $fill_image);
                            
imagesetthickness($target_image, 2);
                            
imagefilledpolygon(
                                
$target_image, 
                                
$points, 
                                
count($points)/2, 
                                
IMG_COLOR_TILED
                            
);
                            
                            
// look mom, Decimal System!
                            
$labelCharCount = 1+floor(log10(max(1, $pNum)));
                            
                            
// label BG + TXT
                            
imagefilledrectangle(
                                
$target_image, mapCoord($px)+2, 
                                
mapCoord($py)+2, 
                                
mapCoord($px)+2+imagefontwidth(1)*$labelCharCount, 
                                
mapCoord($py)+2+imagefontheight(1), 
                                
$colBg
                            
);
                            
imagestring(
                                
$target_image, 
                                
1, 
                                
mapCoord($px)+2, 
                                
mapCoord($py)+2, 
                                
$pNum, 
                                
$colTxt
                            
);
                            
                            
// outline line
                            
imagepolygon($target_image, $points, count($points)/2 , $colShape);
                            
                        } else { 
                        
                            
// other polygons describes "holes" in shape
                            
imagesetthickness($target_image, 2);
                            
imagefilledpolygon($target_image, $points, count($points)/2 , $colBg);
                            
imagepolygon($target_image, $points, count($points)/2 , $colShape);
                            
imagestring($target_image, 1, mapCoord($px)+2, mapCoord($py)+2, $pNum, $colShape);
                            
                        }
                                           
                        
                        
$subShape++;
                    }
                    
                    
imagedestroy($fill_image);
                    
$pNum++;
                    
                break;
                
            case 
QR_AREA_POINT:
                        
                    
$symb = array_shift($path);
                    
                    while(
count($path) > 0) {
                        
$px = array_shift($path);
                        
$py = array_shift($path);
                        
                        
imagefilledrectangle(
                            
$target_image, 
                            
mapCoord($px), 
                            
mapCoord($py), 
                            
mapCoord($px+1)-1, 
                            
mapCoord($py+1)-1, 
                            
$colPix
                        
);
                    }
                    
                break;
                
            case 
QR_AREA_RECT:
                    
                    
$symb = array_shift($path);
                    
                    while(
count($path) > 0) {
                        
$px = array_shift($path);
                        
$py = array_shift($path);
                        
$ex = array_shift($path);
                        
$ey = array_shift($path);
                        
                        
imagefilledrectangle(
                            
$target_image, 
                            
mapCoord($px), 
                            
mapCoord($py), 
                            
mapCoord($ex)-1, 
                            
mapCoord($ey)-1, 
                            
$colRect
                        
);
                    }
                    
                break;                      
                
            case 
QR_AREA_LSHAPE:

                    
$symb = array_shift($path);
                    
                    while(
count($path) > 0) {
                        
$px = array_shift($path);
                        
$py = array_shift($path);
                        
$mode = (int)array_shift($path);
                        
                        
imagefilledrectangle(
                            
$target_image, 
                            
mapCoord($px), 
                            
mapCoord($py), 
                            
mapCoord($px+2)-1, 
                            
mapCoord($py+2)-1, 
                            
$colLshape
                        
);
                    
                        
$offsetX = $px + ($mode % 2);
                        
$offsetY = $py + floor($mode / 2);
                        
imagefilledrectangle(
                            
$target_image, 
                            
mapCoord($offsetX), 
                            
mapCoord($offsetY), 
                            
mapCoord($offsetX+1)-1, 
                            
mapCoord($offsetY+1)-1, 
                            
$colBgL
                        
);
                    }
                    
                break;
                
            case 
QR_AREA_TRACKER:
                    
                    
$symb = array_shift($path);
                    
                    
$px = array_shift($path);
                    
$py = array_shift($path);
                        
                    
imagefilledrectangle(
                        
$target_image, 
                        
mapCoord($px), 
                        
mapCoord($py), 
                        
mapCoord($px+7)-1, 
                        
mapCoord($py+7)-1, 
                        
$colTracker
                    
);
                    
imagefilledrectangle(
                        
$target_image, 
                        
mapCoord($px+1), 
                        
mapCoord($py+1), 
                        
mapCoord($px+6)-1, 
                        
mapCoord($py+6)-1, 
                        
$colTrackBg
                    
);
                    
imagefilledrectangle(
                        
$target_image, 
                        
mapCoord($px+2), 
                        
mapCoord($py+2), 
                        
mapCoord($px+5)-1, 
                        
mapCoord($py+5)-1, 
                        
$colTracker
                    
);
                    
                break;  
        }
    }
            
    
imagepng($target_image, $tempDir.$fileName);
    
imagedestroy($target_image);
    
    
// displaying
    
    
echo '<img src="'.EXAMPLE_TMP_URLRELPATH.$fileName.'" />';