<?php    /* --- ۞---> text { encoding:utf-8;bom:no;linebreaks:unix;tabs:4sp; } */
                                                            
$version '0.9.5';

/*
    ampsig

    Music To Your Eyes!

    corz dynamic sig file generator thing

    This program creates a dynamic "now playing" type signature image that can
    be used in forums, emails, etc.

    ampsig uniquely (at the time of writing) goes on to overlay a *dynamic*
    progress bar over the image. You can watch your now playiing.. playing!

    For full documentation, tips, tricks, feedback, latest downloads, etc, go here..

        http://ampsig.com

    Have fun!

    ;o)

    (c) 2005->tomorrow! ~ cor + corz.org ;o)

    Please view the license for this free software, here:

        https://corz.org/free-scripts-licence.nfo

*/



/*
        global preferences..
                                    */


/*
    security

    rudimentary security measures..
    you don't want some twat posting "alternative" information to your sig
                                                                            */
$password 'PASSWORD(or client code)';


/*    ini file..
    [default: $data_file = 'data/amp.ini';]

    location, relative to amp.php, or else specify the *full* valid full path.
    the data file needs to be "world writable" (though windows servers won't care much)
    or at least, writable by the server process. in *nix: chmod 777 /path/to/amp.ini    */
$data_file 'data/amp.ini'// or call it whatever you like


/*
    schemes..
    [default: $schemes_dir = 'schemes';]
                                                                                 */
// name of the folder you keep your ampsig schemes in (relative to amp.php)..
$schemes_dir 'schemes';

// which scheme to use?..
// note: you don't need to enter the '.scheme' (extension) part of the name.
//$scheme_file = 'spidey';
//$scheme_file = 'simple';
$scheme_file 'standard';


/*
    random scheme..
    [default: $random_schemes = false;]

    ampsig can randomly pick a scheme for you. this makes things interesting.
    remember to test your schemes first.

        http://domain.com/path/to/amp.php/spidey.jpg    etc.

    to disable a particular scheme from loading, change its extension, i.e. "standard._scheme"
    or else remove it from your schemes folder!    "test.scheme" (or even "my-cool-test.scheme")
    will *not* appear in random results, which is handy if you are testing stuff, and prevents
    it becoming your 'public' sig. For this to work, you'll need to also set a $favourite_scheme.
                                                                                                */
$random_schemes false;

/*
    favourite scheme
    [default: $favourite_scheme = 'spidey';]

    this scheme will be *much* more likely to appear..
    enter an empty value (or commant out) if you don't have a favourite.    */
$favourite_scheme 'imac-girl';

// random factor.    [a number, from 1 - (no. of schemes)]
// the higher you go, the more likely it is your favourite scheme will appear.
// default: $r_factor = 3;
$r_factor 3;



// a simple text file to count the number of times your ampsig has been viewed
// [default: $counter_file = 'data/counter';]
$counter_file 'data/counter';


/*
    override

    two values can be overridden by the incoming request, if you wish.
    to specify a particular scheme and output image format, use..

        [img]http://mydomain.com/path/to/amp.php/hal.png[/img]

    which would, unsurprisingly, get you the 'hal' scheme, in 'png' format.
    this is handy if you normally set your ampsig to random, but always want
    to show a particular scheme on a particular forum. perhaps something
    related to the forum, I dunno, maybe special email ampsig scheme.
    it's a cool feature anyway.
                                                                        */
$allow_override true;


// display song rating?    (does nothing yet, just thinking about this)
$rating false;


/*
        end global prefs
                                */



// init..
$self $_SERVER['PHP_SELF'];
$root $_SERVER['DOCUMENT_ROOT'];
if (!
is_numeric($r_factor) or $r_factor == 0$r_factor 3;
if (isset(
$scheme_file)) { $scheme_file $schemes_dir.'/'.$scheme_file.'.scheme'; }


// get the time()..
$time explode(' ',microtime());
$time $time[1]; settype($time,'int'); // one second accuracy!


/*

        request was an HTTP POST, so we go into data collecting mode..

                                                                            */

if (isset($_POST['pass'])) {    // collect data..

    
if ($_POST['pass'] == $password) {

        
$data '';// grab old ini data..
        
$config read_ini($data_file);


        
/*
                "NowPlaying" compatibility layer!    */

        
if (isset($_POST['Filename1'])) {
            
// altering the _POST array directly is evil, but we're gonna do it anyway..
            
if (isset($_POST['Playing'])) {
                if (
$_POST['Playing'] == '1') { $_POST['playing'] = 'playing'; }
                if (
$_POST['Playing'] == '0') { $_POST['playing'] = 'stopped'; }
                unset (
$_POST['Playing']);    // we keep 'playing'
            
}
            
$_POST['title'] = $_POST['Artist1'].' - '.$_POST['Title1'];
            
$_POST['album'] = $_POST['Album1'];
            
$lenny explode(':',$_POST['Length1']);
            
$_POST['length'] = (60 $lenny[0]) + $lenny[1];
            
// delete all *****1 type keys..
            
foreach ($_POST as $i => $pval) {
                
// they forgot to set NowPlaying history to '1', the default is '2'.
                
if (strstr($i'1') or strstr($i'2')) unset($_POST[$i]);
            }
        }


        
/*
            check for any changes..
                                        */
        // uptime sync ..[uTu]..
        
if (isset($_POST['uptime'])) {
            
$config['uptime_diff'] = ($time $_POST['uptime']);
        }
        
// update "last played"..
        
if (isset($_POST['title'])) {
            if (
stripslashes($_POST['title']) != @$config['title']) {
                
$config['last_played'] = $config['title'];
            }
        }
        
// paused or stopped play..
        
if (isset($_POST['playing'])) {
            
$_POST['playing'] = strtolower($_POST['playing']);

            if (
$_POST['playing'] == 'paused' or $_POST['playing'] == 'stopped') {
                if ((
$config['playing'] != 'paused') and ($config['playing'] != 'stopped')) {
                    
$config['static_bar'] = $time;
                } else { 
$config['static_bar'] = $config['started'] + @$_POST['pos']; }
            }


            
// you pressed play!
            
if ($_POST['playing'] == 'playing') {
                unset(
$config['static_bar']);
                
// shift "started at" to a new time
                
$config['started'] = $time - (@$_POST['pos']);
                if (!isset(
$_POST['album']) and !isset($_POST['dir'])) {
                    
$config['album'] = $config['dir'] = 'album unknown';
                }
            }
        }

        if (!isset(
$config['status']) and !isset($_POST['status'])) {
            
$config['status'] = 'no status given';
        }

        
// merge the old and new settings and data..
        
$config array_merge($config$_POST);


        
// write out our "ini" file..
        
write_ini($data_file,$config);
    } else { die (
'YOU HAVE NOT TEH AUTHORITEE!'); }
} elseif (isset(
$_GET['version'])) { die ("ampsig v$version"); } else {


/*

        or else generate an image from the current data set..

                                                                      */

// random scheme?..
if (isset($random_schemes) and $random_schemes) {

    
// go into the dir and scan..
    
if ($dir_handle opendir($schemes_dir)) {
        
$schemes_pool = array();
        
$i 0;
        while ((
$file readdir($dir_handle)) !== false) {
            if ((
ord($file) != 46)  and (substr(strrchr($file"."), 1) == 'scheme')) {
                
$schemes_pool[$i] = $schemes_dir.'/'.$file;
                
$i++;
            }
        }
    
closedir($dir_handle);
    
$pool_count count($schemes_pool);
    }

    
// favourite scheme?
    
if (isset($favourite_scheme)) {
        if (
$favourite_scheme != '') {
            
$pool rand(0, ($pool_count 2) - ($pool_count $r_factor));
            if (
$pool > ($pool_count 1)) {
                
$scheme_file $schemes_dir.'/'.$favourite_scheme.'.scheme';
            } else {
                
$scheme_file $schemes_pool[$pool];
            }
            if (
strstr($scheme_file'test.scheme')) {
                
$scheme_file $schemes_dir.'/'.$favourite_scheme.'.scheme';
            }
        } else {
            
$scheme_file $schemes_pool[rand(0, (count($schemes_pool) - 1))];
        }
    }
}


// specified scheme in the URL?..
if ($allow_override and isset($_SERVER['PATH_INFO'])) {
    
$p_nfo explode('/'$_SERVER['PATH_INFO']);
    
$o_scheme substr($p_nfo[count($p_nfo) - 1], 0strpos($p_nfo[count($p_nfo) - 1], "."));
    if (
file_exists($schemes_dir.'/'.$o_scheme.'.scheme')) {
        
$scheme_file $schemes_dir.'/'.$o_scheme.'.scheme'; }
} else { 
$allow_override false; }


// include the scheme now..
if (isset($scheme_file) and file_exists('./'.$scheme_file)) {
    include 
'./'.$scheme_file;
} else { die (
"scheme file not found. sorree."); }


// override output format?..
if ($allow_override) {
    
$get_format substr(strrchr($p_nfo[count($p_nfo) - 1], "."), 1);
    if ((
$get_format == 'jpg') or ($get_format == 'jpeg')) { $output_format 'jpg'; }
    elseif (
$get_format == 'png') { $output_format 'png'; }
    elseif (
$get_format == 'gif') { $output_format 'gif'; }
}




    
/*
        check scheme preferences, insert defaults if need be..
                                                                    */
    
if (!isset($fields[1]['id'])) $fields[1]['id'] = 'playing';
    if (!isset(
$fields[2]['id'])) $fields[2]['id'] = 'status';
    if (!isset(
$fields[3]['id'])) $fields[3]['id'] = 'title';
    if (!isset(
$fields[4]['id'])) $fields[4]['id'] = 'album';
    if (!isset(
$status_affixes)) $status_affixes = array('['']');
    if (!isset(
$playing_string)) $playing_string 'now playing..';
    if (!isset(
$stopped_string)) $stopped_string 'last played..';
    if (!isset(
$truecolor)) $truecolor false;
    if (!isset(
$q)) $q 100;
    if (!isset(
$output_format)) $output_format 'png';
    if (!isset(
$interlace)) $interlace false;
    if (!isset(
$reduce)) $reduce false;
    if (!isset(
$greyscale)) $greyscale false;
    if (!isset(
$gamma)) $gamma '1.0';
    if (!isset(
$r_balance)) $r_balance 0;
    if (!isset(
$g_balance)) $g_balance 0;
    if (!isset(
$b_balance)) $b_balance 0;
    if (isset(
$do_col_bg)) $color_layer $do_col_bg;    // depricated!
    
if (!isset($color_layer)) $color_layer true;
    if ((!isset(
$img_width) or !isset($img_height)) and (!isset($image_file))) { $img_width 350$img_height 80; }
    if (!isset(
$merge_images)) $merge_images false;
    if (!isset(
$pre_merge)) $pre_merge true;
    if (!isset(
$transparency)) $transparency 50;
    if (!isset(
$merge_x)) $merge_x 0;
    if (!isset(
$merge_y)) $merge_y 0;
    if (!isset(
$mx_nudge)) $mx_nudge 0;
    if (!isset(
$my_nudge)) $my_nudge 0;
    if (!isset(
$border)) $border 1;
    if (!isset(
$target_color)) $target_color '#f0ff32';
    if (!isset(
$variation)) $variation 15;
    if (!isset(
$do_frame)) $do_frame true;
    if (!isset(
$font_size)) $font_size 2;
    if (!isset(
$ttf)) $ttf false;
    if (!isset(
$ttf_size)) $ttf_size '9';
    if (!isset(
$bold)) $bold false;
    if (!isset(
$align)) $align 'center';
    if (!isset(
$antialiasing)) $antialiasing true;
    if (!isset(
$trim_adjust)) $trim_adjust 0;
    if (!isset(
$auto_shrink)) $auto_shrink true;
    if (!isset(
$field[1]['em'])) $field[1]['em'] = 1;
    if (!isset(
$leading)) $leading 1;
    if (!isset(
$nudge)) $nudge 0;
    if (!isset(
$push)) $push 6;
    if (!isset(
$skew)) $skew 0;
    if (!isset(
$field[2]['fp'])) $field[2]['fp'] = -1;
    if (!isset(
$do_bargraph)) $do_bargraph true;
    if (!isset(
$thickness)) $thickness 14;
    if (!isset(
$squeeze)) $squeeze 0;
    if (!isset(
$xnudge)) $xnudge 0;
    if (!isset(
$ynudge)) $ynudge 0;
    if (!isset(
$do_btxt)) $do_btxt true;
    if (!isset(
$btxt_trans)) $btxt_trans false;
    if (!isset(
$btxt_size)) $btxt_size 1;
    if (!isset(
$btxt_valign)) $btxt_valign 'middle';
    if (!isset(
$do_browser_info)) $do_browser_info true;
    if (!isset(
$ip_string)) $ip_string 'your ip is.. ';
    if (!isset(
$percent_string)) $percent_string '';
    if (!isset(
$use_themes)) $use_themes true;
    if (!isset(
$calc_red)) $calc_red     '255-(($i/2)/255)';
    if (!isset(
$calc_green)) $calc_green '255-($i/2)';
    if (!isset(
$calc_blue)) $calc_blue     '($i/2)-255';
    if (!isset(
$lf)) $lf 1;
    if (!isset(
$termination)) $termination 1;
    if (!isset(
$bar_frame)) $bar_frame 0;
    if (!isset(
$bar_trans)) $bar_trans 0;
    if (!isset(
$rating)) $rating false;
    if ((
$ttf) and (!isset($font_face))) { $ttf false; }
    
// what were they thinking!

    // old version schemes..
    
if (isset($center)) $align 'center';


    
//digest the ini..
    
$config read_ini($data_file);

    
//foreach ($config as $key => $value) {
    //   $$key = $value;// ooh! clever!
    //} // i find it clearer and quicker to work with $status, than $config['status'], see.
    // this creates lots of "interesting" security holes. hahah

    // increment the view counter..
    
if (is_writable($counter_file)) {
        
$count implode(''file($counter_file));
        
$count++;
        
$file_handle fopen($counter_file'w+');
        
fwrite($file_handle$count);
        
fclose($file_handle);
    } else { 
$count '[no file]'; }


    
// are we paused or stopped?
    
if ($config['playing'] == 'stopped') {
        
$header $stopped_string;
    } else {
        
// how spidey's eyes light up if you are listening to a song..
        
$me_paths pathinfo($self);
        if (isset(
$image_file)) {
            if (
stristr($me_paths['dirname'], 'amp.php')) { // if you append /spidey.png, everything moves..
                
$me_paths['dirname'] = substr($me_paths['dirname'], 0strrpos($me_paths['dirname'],'/'));
            } 
// generally speaking, it's a bad idea to alter this directly, but hey!
            
$foo str_replace($me_paths['dirname'], ''$image_file);
            
$playing_img $root.$me_paths['dirname'].'/'.substr($foo0strpos($foo".")).'_play.png';
            if (
file_exists($playing_img)) { $image_file $playing_img; }
        }
        
$header $playing_string;
    }

    
// prepare the colours..
    
$target_color hex2dec($target_color);
    
$red_limit $target_color[0];
    
$green_limit $target_color[1];
    
$blue_limit $target_color[2];

    
// randomise..
    
$variation = array(0$variation);
    
$red_level rand($variation[0], $variation[1]);
    
$green_level rand($variation[0], $variation[1]);
    
$blue_level rand($variation[0], $variation[1]);

    
$red_value abs($red_limit-$red_level);
    
$green_value abs($green_limit-$green_level);
    
$blue_value abs($blue_limit-$blue_level);


    
/*
            create the base image

            I fancy doing a plug-in API for this. hmm.
                                                            */


    
if (isset($image_file)) {
        
$img2 imagecreatefrompng($image_file);
        
imagesavealpha ($img2true);
        
$img_width2 imagesx($img2);
        
$img_height2 imagesy($img2);
        if (!isset(
$img_width) or !isset($img_height)) {
            
$img_width $img_width2;
            
$img_height $img_height2;
        }
    }

    if (
$color_layer) {

        if (
$truecolor) {
            
$img imagecreatetruecolor($img_width$img_height);
        } else {
            
$img imagecreate($img_width$img_height);
        }

        if (isset(
$img2)) {
            
// smaller size has been specified, need to crop..
            
if  (($img_width != $img_width2) or ($img_height != $img_height2)) {
                
$t_img imagecreatefrompng($image_file);
                
imagecopy($img2$t_img$mx_nudge$my_nudge$merge_x$merge_y$img_width$img_height);
                
imagedestroy ($t_img);
            } else {
                
imagecopy($img2$img2$mx_nudge$my_nudge$merge_x$merge_y$img_width$img_height);
            }
        }
    } else {

        if (isset(
$img2)) {
            
$img $img2;
            
//imagedestroy($img_b); // amazingly, this destroys $img! erm. hello!
            
unset($img2); // no merging possible now.
        
}
    }


    if (!isset(
$img)) { die ("no image has been specified!"); }
    
$img_width imagesx($img);
    
$img_height imagesy($img);


    
// setup transparent background..
    
if (isset($trans_color)) { // you can still set this, though it is depricated.
        
$trans_color hex2dec($trans_color);
        
$t_bg imagecolorallocate($img$trans_color[0], $trans_color[1], $trans_color[2]);
        
imagecolortransparent($img$t_bg);
    }

    
// add our randomised color layer, inside the frame..
    
if ($color_layer) {
        if (
$do_frame == true) { $bf $border; } else { $bf 0; }
        
$bg imagecolorallocate($img$red_value$green_value ,$blue_value);
        
imagefilledrectangle($img$bf$bf$img_width-$bf-1$img_height-$bf-1$bg);
    }

    
// create frame colour..
    
if (isset($frame_color)) {
        
$frame_color hex2dec($frame_color);
        
$frame imagecolorallocate($img$frame_color[0], $frame_color[1], $frame_color[2]);
    } else {
        
$frame imagecolorallocate($img$red_level$green_level$blue_level);
    }

    
// draw the frame..
    
if ($do_frame == true) {
        for (
$i 0$i $border$i++) {
            
$points = array($i$i$img_width-1-$i$i$img_width-1-$i$img_height-1-$i$i$img_height-1-$i);
            
imagepolygon ($img$points4$frame);
        }
    }


    
// allocate the text colors (early, to avoid obliteration!)
    
if (isset($text_color)) { $text_color hex2dec($text_color); }
        else { 
$text_color = array(255 $red_value255 $green_value255 $blue_value); }

    
$text_color imagecolorallocate($img$text_color[0], $text_color[1], $text_color[2]);
    if (isset(
$btxt_color) and !$btxt_trans) {
        
$btxt_color hex2dec($btxt_color);
        
$btxt_color imagecolorallocate($img$btxt_color[0], $btxt_color[1], $btxt_color[2]);
    } else { 
$btxt_color $text_color; }
    if (
$btxt_trans) { $btxt_color imagecolorallocate($img$red_value$green_value ,$blue_value); }

    
/*
            prepare the text fields..
                                            */

    // no album name? let's create it from the folder name..
    
if ($config['album']  == '') { $config['album'] = $config['dir']; } // or..
    
if ($config['album'] == '' and ($config['length'] == or $config['length'] = $config['pos'])) $config['album'] = 'Internet Audio Stream';


    
// run through the fields one-at-a-time, select the data type and format as we go..
    
foreach ($fields as $key => $value) {

        
// if you want to add new data types, this is where to do it..
        
switch ($value['id']) {

            case 
'playing':
                
$fields[$key]['txt'] = $header;
                break;

            case 
'status':
                
$fields[$key]['txt'] = $status_affixes[0].$config['status'].$status_affixes[1];
                break;

            case 
'title':
                
$fields[$key]['txt'] = $config['title'];
                break;

            case 
'artist':
                
$fields[$key]['txt'] = $config['artist'];
                break;

            case 
'album':
                
$fields[$key]['txt'] = $config['album'];
                break;

            case 
'last':
                
$fields[$key]['txt'] = 'last played: '.$config['last_played'];
                break;

            case 
'uptime':
                
$fields[$key]['txt'] = 'uptime: '.calc_uptime($config['uptime_diff']);
                break;

            case 
'counter':
                
$fields[$key]['txt'] = 'This ampsig has been viewed '.$count.' times.';
                break;

            case 
'custom':
                if (isset(
$config['custom']) and $config['custom'] != '') {
                    
$fields[$key]['txt'] = $config['custom'];
                } else { 
$fields[$key]['txt'] = 'custom text not available!'; }
                break;

            case 
'custom2':
                if (isset(
$config['custom2']) and $config['custom2'] != '') {
                    
$fields[$key]['txt'] = $config['custom2'];
                } else { 
$fields[$key]['txt'] = 'custom text not available!'; }
                break;

            case 
'custom3':
                if (isset(
$config['custom3']) and $config['custom3'] != '') {
                    
$fields[$key]['txt'] = $config['custom3'];
                } else { 
$fields[$key]['txt'] = 'custom text not available!'; }
                break;

            
// add more data types here.

            
default: // blank lines
                
$fields[$key]['txt'] = '   ';
                
$fields[$key]['id'] = 'blank';
                break;
        }


        
// per-line user overrides..


        // add the 'extra' field user prefs..
        
if (isset($field[$key]['em'])) { $fields[$key]['em'] = $field[$key]['em'];}  else { $fields[$key]['em'] = 0; }
        if (isset(
$field[$key]['fp'])) $fields[$key]['fp'] = $field[$key]['fp'];  else { $fields[$key]['fp'] = 0; }

        
// alignment (individual lines can be overridden) ..
        
$fields[$key]['align'] = $align;
        if (isset(
$field[$key]['align'])) $fields[$key]['align'] = $field[$key]['align'];

        
// we could theoretically allow any override, the mechanism is already in place.

        /*
                calculate sizes for this line of text (and trim, if necessary) ..
                                                                                    */

        
if ($ttf) { // truetypes..

            
$alloc_width $img_width - ($nudge) - ($border) - $trim_adjust;
            
$bx imagettfbbox($ttf_size $fields[$key]['em'], $skew$font_face'|'.$fields[$key]['txt']);
            
$txt_width abs($bx[0]) + abs($bx[2]);












            
// oversized text fields..
            
if (($txt_width) >= $alloc_width) {
                if (
$auto_shrink) {
                    
//$trim_adjust = 0;
                    
while ($txt_width >= $alloc_width) {
                        
$fields[$key]['em']--;

                        
$bx imagettfbbox($ttf_size $fields[$key]['em'],
                            
$skew$font_face'|'.$fields[$key]['txt']);
                        
$txt_width abs($bx[0]) + abs($bx[2]);

                    }
                } else {
                    
$fields[$key]['txt'] = substr($fields[$key]['txt'], 0,
                        
round(strlen($fields[$key]['txt'])
                        - ( (
$txt_width $alloc_width) /  ($txt_width strlen($fields[$key]['txt'])) )
                            - 
$trim_adjust2)).'...';
                }
                
// everything has changed now, do it again! (the '|' is to vsize 'blank' lines)
                
$bx imagettfbbox($ttf_size $fields[$key]['em'], $skew$font_face'|'.$fields[$key]['txt']);
                
$txt_width abs($bx[0]) + abs($bx[2]);
            }

            
// work out the x factor..
            
if ($fields[$key]['align'] == 'center') {
                
$fields[$key]['x'] = ((($img_width - ($border)) - $txt_width) / 2) + $nudge $border;
            } elseif (
$fields[$key]['align'] == 'right') {
                
$fields[$key]['x'] = $img_width $border $txt_width $nudge;
            } else {
                
$fields[$key]['x'] = $border + ($nudge);
            }










            
$fields[$key]['y'] = abs($bx[1]) + abs($bx[7]);

        } else { 
// GD built-in font..

            // constants..
            
$halfway = ($img_width 2) + $nudge;
            
$chr_width imagefontwidth($font_size $fields[$key]['em']);
            
$trim = ($img_width - ($border) - $squeeze $trim_adjust) / $chr_width;




            
// for some reason, it's NOT possible to add an "&#133;" (ellipsis). damn!
            
if (strlen($fields[$key]['txt']) > $trim) {
                
$fields[$key]['txt'] = substr($fields[$key]['txt'], 0$trim 3).'...';
            }

            
$string_width strlen($fields[$key]['txt']) * $chr_width;


            if (
$fields[$key]['align'] == 'center') {
                
$fields[$key]['x'] = $halfway - ($string_width 2);
            } elseif (
$fields[$key]['align'] == 'right') {
                
$fields[$key]['x'] = $img_width $border $string_width $nudge;
            } else {
                
$fields[$key]['x'] = $nudge $border;
            }
        }

    } 
// end foreach()


    // we'll lay down the text after the bar-graph..



    // pre-merge (for saturation)
    
if ($merge_images and isset($img2) and $pre_merge) {
        
imagecopymerge($img$img20000$img_width$img_height$transparency);
    }



    
/*
        the gradient bar-graph
        the funkiest coolest neatest thing in the known universe, bar, erm..
                                                                                    */
    
if ($do_bargraph) {

        
// subtle 3D effect on termination, etc..
        
if ($thickness == 'fill') { $thickness $img_height-($border); $shadadd 0; } else { $shadadd 1; }
        if (
$termination 1) { $shadadd 0; }

        
// are we paused or stopped..
        
if (isset($config['static_bar'])) { $played $config['static_bar'] - $config['started'];
            } else { 
$played $time $config['started']; }
        if (
$config['length'] > 0) { $percent_done floor(($played $config['length']) * 100); } else { $percent_done 0; }

        if (
$percent_done 100$percent_done  100// *shouldn't* happen

        // for the displayed text
        
if ($do_btxt) { $percent $percent_string.$percent_done.'%';
            } else { 
$percent ''; }

        
// total length of the bar
        
$bar_len = ($percent_done 100) * ($img_width $border $squeeze);
        if (
$bar_len 0) { if ($truecolor) { $img3 imagecreatetruecolor($bar_len$thickness); }
            else { 
$img3 imagecreate($bar_len$thickness); }
        }
        if (isset(
$img3)) {
            if (
$use_themes) { @do_theme($theme); } // @ in case they forget to actually specify a theme

            // create the gradient effect..
            
for ($i 1$i <= $bar_len$i++) {
                eval(
"\$r = $calc_red;"); eval("\$g = $calc_green;"); eval("\$b = $calc_blue;");
                
$fill imagecolorallocate($img3$r$g$b);
                
imagefilledrectangle($img3$i0$i$thickness 1$fill);
            }

            
// vertical line at the end of the bar-graph (very important!)
            
if ($termination) {

                if (!isset(
$term_color)) {
                    
$term_color $frame_color;
                } else {
                    
$term_color hex2dec($term_color);
                }

                
$term_color imagecolorallocate($img$term_color[0], $term_color[1], $term_color[2]);
                
imagefilledrectangle($img3,
                    
$bar_len $termination$shadadd$bar_len$thickness 1$term_color);
            }

            
// a border around the progress bar?
            
if ($bar_frame) {
                for (
$i=0$i<$bar_frame$i++) {
                    
imagerectangle ($img3$i 1$i$bar_len $i$thickness $i -1$frame);
                }
            }
            
// lay the progress bar down onto the image..
            
imagecopymerge($img$img3$border + ($squeeze 2) + $xnudge,
            
$img_height $border $thickness $ynudge10$bar_len -1$thickness100 $bar_trans);
        }


        
// vertical alignment of the progress bar text .. (no ttfs here)
        
$bar_txt_fsize imagefontheight($btxt_size);
        switch(
$btxt_valign) {
            case 
'top':
                
$vpos = ($img_height - ($border) - $thickness) + ($bar_txt_fsize 2);
                break;
            case 
'bottom':
                
$vpos = ($img_height $border) - ($bar_txt_fsize 2);
                break;
            default: 
// middle (easiest to misspell!)
                
$vpos = ($img_height $thickness) + ($thickness 2) - ($bar_txt_fsize 2) - $border;
                break;
        }

    }


    
// merge the images
    // all text will go on after this..
    
if ($merge_images and isset($img2)) {
        
imagecopymerge($img$img20000$img_width$img_height$transparency);
        
imagedestroy($img2);
    }

    
// progress bar text..
    
if ($do_bargraph) {
        if (
$do_btxt) {
            
$b_string $percent;
            if (
$do_browser_info) { $b_string $ip_string.$_SERVER['REMOTE_ADDR'].'   '.$b_string; }
        } else { 
$b_string ''; }
        if (
$percent_done == 100 or isset($_GET['credit'])) { $b_string $config['copyright'].'   '.$b_string; }
        
// come on, credit where it's due.. (this only shows at exactly 100%)
        
$str_length imagefontwidth($btxt_size) * strlen($b_string);
        if (
$str_length $bar_len 2) {
            
$bar_limit = (floor($bar_len) / imagefontwidth($btxt_size));
            if (!
$squeeze$sq 1; else $sq abs($squeeze);
            if (!
$xnudge$nud $sq; else $nud abs($xnudge);
            
$bar_limit floor(abs($bar_limit - ( (floor($sq $nud)) / imagefontwidth($btxt_size))) - );
            if (
$bar_limit )  { $b_string substr($b_string, - $bar_limit); } else { $b_string ''; }
        }
        
imagestring ($img$btxt_size,
            
$bar_len - (imagefontwidth($btxt_size) * strlen($b_string)) + ($xnudge + ($squeeze 2.05)) - 4,
                
$vpos $ynudge$b_string$btxt_color);
    }


    
/*
            your bar-graph is complete!
                                                */


    /*
        finally, lay down the text fields..
        we do it last so it's always on top
                                                */
    
$txt_height imagefontheight($font_size);

    if (
$ttf) {
        
$tpush $push;
        if (
$antialiasing != true) { $text_color = -$text_color; }
    }
    
$ttfh=$border;
    
$push -= $txt_height;
    
//settype($bold, 'int');

    
foreach ($fields as $key => $value) {
        
$bl = (int) $bold;
        if (
$key == 1) { $ld 0; } else { $ld $leading; } // no leading on first row
        
if  ($ttf) {
            do {
                
imagettftext($img$ttf_size $fields[$key]['em'], $skew$fields[$key]['x'] + $bl,
                    
$tpush $ld $ttfh $fields[$key]['y'] + $fields[$key]['fp'] - $key,
                        
$text_color$font_face$fields[$key]['txt']);
                
$bl--;
            } while (
$bl >= 0);

            if (
$skew != 0) {
                
$ttfh += $fields[$key]['y'] + ($skew * ($fields[$key]['y'] / $skew)) + $leading// what!?!
                // if anyone desperately needs, or better still, works this out, get in touch!
            
} else { $ttfh += $fields[$key]['y'] + $ld; }

        } else { 
// gd built-in font..
            
do {
                
imagestring ($img$font_size $fields[$key]['em'], $fields[$key]['x'] + $bl,
                    
$push $fields[$key]['fp'] + (($txt_height $ld) * $key $fields[$key]['em']),
                        
$fields[$key]['txt'], $text_color);
                
$bl--;
            } while (
$bl >= 0);

        }
    }

output_image($img);
}


/*
        fin
                    */



/*
    finally, send our image to the browser..
                                                */
function output_image($img) {
global 
$gamma$greyscale$interlace$output_format$q$reduce$r_balance$g_balance$b_balance;

    
// Bael discovered some funky extra headers..
    
Header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
    
Header('Expires: Tue, 01 Apr 1970 00:00:00 GMT');
    
Header('Pragma: no-cache');



    if (
$greyscale == true) {
        
$img make_greyscale($img$r_balance$g_balance$b_balance);
    }

    if ((
$gamma) != '1.0' ) { // probably make reduce only
        
$img adjust_gamma($img$gamma);
    }

    if (
$interlaceimageinterlace($img1);

    if (
$output_format == 'png') {
        
// this tells the browser to interpret whatever comes next as an image.
        
if ($reduce) { $img reduce_img($img256); }
        
header('Content-type: image/png');
        
imagepng($img,NULL,$q); // the actual image is created HERE, and sent to browser.
    
} else if ($output_format == 'jpg'){
        
header('Content-type: image/jpeg');
        
imagejpeg($img,NULL,$q);
    } else if (
$output_format == 'gif'){
        
$img reduce_img($img256);
        
header('Content-type: image/gif');
        
imagegif ($img,"",$q);
    }
// you MUST destroy the image afterwards, to free-up the server's memory..
    
imagedestroy($img);

    die();
}


// reduce to a pallette..
function reduce_img($img$colors) {
global 
$trans_color;

    
// create a temporary truecolor image..
    
$width imagesx($img);
    
$height imagesy($img);
    
$t_img imagecreatetruecolor($width$height);
    
imagecopymerge($t_img$img0000$width$height100);

    
// convert original image to paletted image..
    
imagetruecolortopalette($imgtrue$colors);

    
// match color palette with original
    
imagecolormatch($t_img$img);

    
// get the top-left pixel color, make transparent..
    
$t_color imagecolorat($img11);

    
imagedestroy($t_img);
    
imagecolortransparent ($img$t_color);
    return 
$img;
}
/*
end function reduce_img()    */


/*
make a greyscale image (8 bit)    */
function make_greyscale($img$r_bal$g_bal$b_bal) {
global 
$width$height;

    
$width imagesx($img);
    
$height imagesy($img);
    
$t_img imagecreate($width$height);

    for (
$idx 0$idx 256$idx++) {
        
// loop the colours.
        
$r $idx $r_bal$g $idx $g_bal$b $idx $b_bal;
        if (
$r ) { $r $r; } elseif ($r 256 ) { $r $r 256; }
        if (
$g ) { $g $g; } elseif ($g 256 ) { $g $g 256; }
        if (
$b ) { $b $b; } elseif ($b 256 ) { $b $b 256; }
        
imagecolorallocate($t_img$r$g$b);
    }

    
imagecopymerge($t_img$img0000$width$height100);
    
$t_color imagecolorat($t_img00);
    
imagecolortransparent ($t_img$t_color);
//    imagecolormatch($img, $t_img);
    
imagedestroy($img);
    return (
$t_img);
}
/*
end function make_greyscale()    */



/*
    gamma adjustmentment

    really long-winded, but sadly necessary, afaik.
    altering image gamma destroys the alpha layer, so we attempt to
    get back some transparency, but it still looks like 8 bit, reduce!
*/
function adjust_gamma($img$gamma) {
global 
$width$height;

    
// fix the gamma
    
$gamma = (double) $gamma;
    
imagegammacorrect($img1.0$gamma);

    
// create temporary image..
    
$width imagesx($img);
    
$height imagesy($img);
    
$t_img imagecreatetruecolor($width$height);
    
$t_color imagecolorallocatealpha($t_img000127);// pointless!

    // merge the two images..
    
imagecopymerge($t_img$img0000$width$height100);

    
// where's the alpha channel? pfff..
    
imagecolortransparent ($t_img$t_color);
    
imagedestroy($img);
    return 
$t_img;
}
/*
end function gamma adjustment()    */



/*
crop a big image into a small image    */
function  make_cropped_image($image_file$height$width) {
global 
$truecolor;

    
$t_img imagecreatefrompng($image_file);

    if (
$truecolor) {
        
$img imagecreatetruecolor($width$height);
        
imagecopymerge($img$t_img0000$width$height);
    } else {
        
$img imagecreate($width$height);
        
imagecopy($img$t_img0000$width$height);
    }

    
imagedestroy ($t_img);
    return 
$img;
}
/*
end function make_cropped_image()    */



/*
function hex2dec()
convert an HTML #hex colour to decimal colour levels..    */
function hex2dec($rgb) {
    if (
substr($rgb01) == "#") {
        
$rgb substr($rgb1);
    }
    
$r hexdec(substr($rgb02));
    
$g hexdec(substr($rgb22));
    
$b hexdec(substr($rgb42));
return array(
$r$g$b);
}
/*
end function hex2dec()    */


/*
function read_ini()

    pull the current data from the prefs file and return a $config() array
                                                                            */
function read_ini($config_file) {
$config = array();
    if (
is_readable($config_file)) {
        
$file file($config_file);
        foreach(
$file as $conf) {
            
// if first real character isn't '#' or ';'and there is a '=' in the line..
            
if ( (substr(trim($conf),0,1) != '#')
                and (
substr(trim($conf),0,1) != ';')
                and (
substr_count($conf,'=') >= 1) ) {
                
$eq strpos($conf'=');
                
$config[trim(substr($conf,0,$eq))] = trim(substr($conf$eq 1));
            }
        }
    unset(
$file);

    if (!isset(
$_POST['pass']))    {
        if (
array_key_exists('copyright'$config) and (!strstr($config['copyright'], 'ampsig.com' )))
        { exit (
"bad vodoo!!"); }
    }
    return 
$config;
    } else die (
"ampsig's ini file is missing. sorree.");
}
/*
end function read_ini()    */



/*
function write_ini()

    accepts an array of values, and creates an "ini" file from them.
    for security reasons, write_ini won't store keys named 'password' or 'pass'.
    so you can easily capture whole $_POST arrays, get authentication, and
    pass the rest to write_ini. improved for ampsig.
                                                                        */
function write_ini($data_file,$config) {
$config['copyright'] = '(c) ampsig.com'// ;o)
$data '';
    foreach (
$config as $var => $val) {
        if (
$var != 'password' and $var != 'pass') {
            
$data .= $var.' = '.$config[$var]."\n";
        }
    }
    
$data stripslashes($data);

    if (
is_writable($data_file)) {
        
$fp fopen($data_file'w');
        
$lock flock($fpLOCK_EX);
        if (
$lock) {
            
fwrite($fp$data);
            
flock ($fpLOCK_UN);
        } else { die (
"can't lock the ini file!"); }
        
fclose($fp);
        
clearstatcache();
    } else { die (
"ini file is not writable!"); }
}
/*
end function write_ini()    */



/*
function calc_uptime()
input the difference in seconds, returns a human-readable time string.    */
function calc_uptime($diff) {
global 
$time;

    
$day=0;$hour=0;$min=0;$sec=0;
    
$da='';$ha='';$ma='';$sa='';
    
$diff $time $diff;

    
// work out days, etc..
    
while ($diff 86400) {
        
$day++;
        
$diff -= 86400;
    } if (
$day != 1$da 's';

    while (
$diff 3600) {
        
$hour++;
        
$diff -= 3600;
    } if (
$hour != 1$ha 's';

    while (
$diff 60) {
        
$min++;
        
$diff -= 60;
    } if (
$min != 1$ma 's';

    while (
$diff 1) {
        
$sec++;
        
$diff -= 1;
    } if (
$sec != 1$sa 's';

return 
"$day day$da$hour hour$ha$min minute$ma$sec second$sa";
}
/*
end function calc_uptime()    */


/*
function do_theme()

    setup the gradient colour calculations for the progress bar.
    note: some of the math is designed to be humourous!
                                                                    */
function do_theme($theme) {
global 
$calc_red$calc_green$calc_blue$lf;

    switch(
$theme) {

        case 
'gentle fire':
            
$calc_red '(255-(($i/5)/255))/$lf';
            
$calc_green '(255-($i/5))/$lf';
            
$calc_blue     '(($i/2)-255)/$lf';
            break;

        case 
'interesting feiry':
            
$calc_red '(255-($i/255))/$lf';
            
$calc_green '(255-$i)/$lf';
            
$calc_blue '(($i/255)-255)/$lf';
            break;

        case 
'basic grey grad':
            
$calc_red '(255-$i)/$lf';
            
$calc_green '(255-$i)/$lf';
            
$calc_blue '(255-$i)/$lf';
            break;

        case 
'gentle grey grad':
            
$calc_red '(255-$i)/$lf';
            
$calc_green '(255-$i)/$lf';
            
$calc_blue '(255-$i)/$lf';
            break;

        case 
'the torrenteer':
            
$calc_red '(abs(50-$i/3))/$lf';
            
$calc_green '(255-($i/sin($i)))/$lf';
            
$calc_blue '(255-($i/($i*4)))/$lf';
            break;

        case 
'swarm member x':
            
$calc_red '(abs(250*$i/3))/$lf';
            
$calc_green '(255-($i/sin($i/3)))/$lf';
            
$calc_blue '(255-($i/($i*4)))/$lf';
            break;

        case 
'ouch!':
            
$calc_red '(255-($i*255))/$lf';
            
$calc_green '(255-(255*($i*255)))/$lf';
            
$calc_blue '(255*($i*255))/$lf';
            break;

        case 
'mr. green':
            
$calc_red '(($i/4))/$lf';
            
$calc_green '(255-($i/4))/$lf';
            
$calc_blue '($i/4)/$lf';
            break;

        case 
'mrs. green':
            
$calc_red '((($i/4)/255))/$lf';
            
$calc_green '(255-(255*(($i/4)/150)))/$lf';
            
$calc_blue '(($i/4))/$lf';
            break;

        case 
'toffee mint':
            
$calc_red '(($i/4)/120)/$lf';
            
$calc_green '255-($i/5)/$lf';
            
$calc_blue '$i/1.5/$lf';
            break;

        case 
'green meanie':
            
$calc_red 'abs($i/4)/$lf';
            
$calc_green '255-($i*cos($i/(2*$img_width)))/$lf';
            
$calc_blue '($i/($i*4))/$lf';
            break;

        case 
'deep sky fader':
            
$calc_red '(abs($i/4))/$lf';
            
$calc_green '(255-($i*cos($i/(2*$img_width))))/$lf';
            
$calc_blue '(255-($i/($i*4)))/$lf';
            break;

        case 
'blue duo':
            
$calc_red '(abs($i/4))/$lf';
            
$calc_green '(255-($i*cos($i/170)))/$lf';
            
$calc_blue '(255-($i/($i*4)))/$lf';
            break;

        case 
'blue two':
            
$calc_red '(abs($i/4))/$lf';
            
$calc_green '(255-($i*cos($i/210)))/$lf';
            
$calc_blue '(255-($i/($i*4)))/$lf';
            break;

        case 
'multicoloured':
            
$calc_red '(abs(255-($i/255)))/$lf';
            
$calc_green '(abs(255-(2*$i)))/$lf';
            
$calc_blue '(abs((255*($i/255))-255))/$lf';
            break;

        case 
'its gonna break':
            
$calc_red '(255-(($i*10)/255))/$lf';
            
$calc_green '(255-(($i*10)))/$lf';
            
$calc_blue '(($i*10)-255)/$lf';
            break;

        case 
'stripees':
            
$calc_red '(255-(($i/50)/255))/$lf';
            
$calc_green '(255-($i*10))/$lf';
            
$calc_blue '((($i/50))-255)/$lf';
            break;

        case 
'white into red':
            
$calc_red '(abs(255-($i/255)))/$lf';
            
$calc_green '(abs(255-(255*($i/255))))/$lf';
            
$calc_blue '(abs((255*($i/255))-255))/$lf';
            break;

        case 
'black into white':
            
$calc_red '(255-($i*255))/$lf';
            
$calc_green '(255-($i*255))/$lf';
            
$calc_blue '(255*($i*255))/$lf';
            break;

        default: 
// standard feiry progress ba
            
$calc_red '(255-(($i/2)/255))/$lf';
            
$calc_green '(255-($i/2))/$lf';
            
$calc_blue     '(($i/2)-255)/$lf';
            break;
    }
}
/*
end function do_theme()    */


// you have reached the end of the program
?>
back to the source menu
test

Welcome to corz.org!

I'm always messing around with the back-end.. See a bug? Wait a minute and try again. Still see a bug? Mail Me!