<?php 

    
// Requires ImageMagick > 6.3.5-7
    
    /* Settings
     * You can set the settings here manually, pass them through using $_GET, or as command line args:
     * php wallpaper.php -i /full/path/to/wallpaper.jpg -s 1280x1024 -p 100 -l aA -b 222222 -f 333333
     * 
     * If you get a 18044 error, you may be using bad characters - the ampersand, particularly, must be escaped (with \); 
     */
    // First, default settings
    
$imgOutput 'wallpaper.jpg'// Full path, Must be writable
    
$strWallpaperSize '1280x1024';
    
$intPadding 100// Minimum space around letter
    
$arrLetters = array('a''A');
    
$strBackground '222222';
    
$strForeground '333333';
    
    
// Next, querystring. These override defaults individually, so all are optional.
    
if ($_GET['image']) {
        
$imgOutput $_GET['image'];
    }
    if (
$_GET['size']) {
        
$strWallpaperSize $_GET['size'];
    }
    if (
$_GET['padding']) {
        
$intPadding $_GET['padding'];
    }
    if (
$_GET['letters']) {
        
$arrLetters $_GET['letters'];
    }
    if (
$_GET['background']) {
        
$strBackground $_GET['background'];
    }
    if (
$_GET['foreground']) {
        
$strForeground $_GET['foreground'];
    }
    
    
// Next, command line arguments. These override defaults individually, so all are optional.
    
$arguments getopt("i:s:p:l:b:f:");
    if (
$arguments['i']) {
        
$imgOutput $arguments['i'];
    }
    if (
$arguments['s']) {
        
$strWallpaperSize $arguments['s'];
    }
    if (
$arguments['p']) {
        
$intPadding $arguments['p'];
    }
    if (
$arguments['l']) {
        
$arrLetters str_split($arguments['l']);
    }
    if (
$arguments['b']) {
        
$strBackground $arguments['b'];
    }
    if (
$arguments['f']) {
        
$strForeground $arguments['f'];
    }

    
// Get list of fonts
    
exec('convert -list font'$arrFonts);
    
    
// Array contains a lot of fluff. Remove it.
    
$arrFontsClean = array();
    for (
$i 0$max count($arrFonts); $i $max$i++) {
        
$strFont trim($arrFonts[$i]);
        
$strFontParts preg_split('/[ ]+/'$strFont);
        
$strFontName $strFontParts[0];
        if (
strlen($strFontName) < 5) { // Headers or blank line
            
continue;
        }
        if ((
$strFontName == 'family:') || ($strFontName == 'Path:') || ($strFontName == 'weight:') || ($strFontName == 'glyphs:') || ($strFontName == 'style:') || ($strFontName == 'stretch:')) {
            continue;
        }
        if (
$strFontName == 'Font:') {
            
$strFontName $strFontParts[1];
        }
        if (
strpos($strFontName'------') !== false) { // Divider
            
continue;
        }
        if (
strpos($strFontName'Dingbats') !== false) { // Usually gives a blank or broken image
            
continue;
        }
        
// If here, clean the name up.
        
$strFontName str_replace("'"''$strFontName);
        
$strFontName str_replace('&''and'$strFontName);
        
// Still here ... font name looks ok.
        
$arrFontsClean[] = $strFontName;
        
    }
    
$arrFonts $arrFontsClean;

    
// Pick a random font and random letter
    
$strFontName $arrFonts[(array_rand($arrFonts))];
    
$strText $arrLetters[(array_rand($arrLetters))];
    
    
// Get dimensions and adjust with padding
    
$dimensions explode('x'$strWallpaperSize);
    
$dimensions[0] = $dimensions[0] - $intPadding;
    
$dimensions[1] = $dimensions[1] - $intPadding;

    
// Generate a large letter.
    
system('convert -size 4000x4000 xc:#' $strBackground 'M -font ' $strFontName ' -pointsize 2000 -gravity Center -fill "#' $strForeground '" -annotate +0+0 "' $strText '" ' $imgOutput); 
    
// Trim and resize
    
exec('convert ' $imgOutput ' -trim -resize ' $dimensions[0] . 'x' $dimensions[1] . ' ' $imgOutput);
    
// Place at centre of new image
    
exec('convert ' $imgOutput ' -background "#' $strBackground '" -gravity center -extent ' $strWallpaperSize ' ' $imgOutput);
    
// Add font name
    
exec('convert ' $imgOutput ' -pointsize 20 -fill "#' $strForeground '" -draw \'text 20,40 "' $strFontName '"\' ' $imgOutput);
    
// If you want the font name in the same font, comment out the previous line and uncomment this
    //exec('convert ' . $imgOutput . ' -font ' . $strFontName . ' -pointsize 20 -fill "#444444" -draw \'text 20,40 "' . $strFontName . '"\' ' . $imgOutput);
    
    // Finally, set the wallpaper
    
exec('gconftool-2 --type string --set /desktop/gnome/background/picture_filename ' $imgOutput);

?>