Skip to content

Commit

Permalink
Another go at building the pagetool sprite with a script
Browse files Browse the repository at this point in the history
This time PHP and libGD is used so it should work on Windows as well.
The image quality is much better this time and the active highlight
color is read directly from the template's style.ini
  • Loading branch information
splitbrain committed Mar 11, 2012
1 parent 83112a8 commit d43eb44
Show file tree
Hide file tree
Showing 4 changed files with 121 additions and 56 deletions.
121 changes: 121 additions & 0 deletions lib/tpl/dokuwiki/images/pagetools-build.php
@@ -0,0 +1,121 @@
<?php
/**
* This script generates a sprite from the unprocessed pagetool icons by combining them
* and overlaying a color layer for the active state.
*
* This script requires a current libGD to be available.
*
* The color for the active state is read from the style.ini's __link__ replacement
*
* The final sprite is optimized with optipng if available.
*
* @author Andreas Gohr <andi@splitbrain.org>
* @todo Maybe add some more error checking
*/
$GAMMA = 0.8;
$OPTIPNG = '/usr/bin/optipng';

// load input images
$input = glob('pagetools/*.png');
sort($input);
$cnt = count($input);
if(!$cnt){
die("No input images found. This script needs to be called from within the image directory!\n");
}

// create destination image
$DST = imagecreatetruecolor(30,$cnt*45*2);
imagesavealpha($DST, true);
$C_trans = imagecolorallocatealpha($DST, 0, 0, 0, 127);
imagefill($DST, 0, 0, $C_trans);

// load highlight color from style.ini
$ini = parse_ini_file('../style.ini',true);
$COLOR = hex2rgb($ini['replacements']['__link__']);
$C_active = imagecolorallocate($DST, $COLOR['r'],$COLOR['g'],$COLOR['b']);

// add all the icons to the sprite image
for($i=0; $i<$cnt; $i++){
$base = $i*90;

$IN = imagecreatefrompng($input[$i]);
imagesavealpha($IN, true);
imagecolorscale($IN,$GAMMA);
imagecopy($DST,$IN, 0,$base, 0,0, 30,30);
imagedestroy($IN);

$IN = imagecreatefrompng($input[$i]);
imagesavealpha($IN, true);
imagecolorscale($IN,$GAMMA);
imagecopy($DST,$IN, 0,$base+45, 0,0, 30,30);
imagedestroy($IN);

imagelayereffect($DST, IMG_EFFECT_OVERLAY);
imagefilledrectangle($DST, 0,$base+45, 30,$base+45+30, $C_active);
imagelayereffect($DST, IMG_EFFECT_NORMAL);
}

// output sprite
imagepng($DST,'pagetools-sprite.png');
imagedestroy($DST);

// optimize if possible
if(is_executable($OPTIPNG)){
system("$OPTIPNG -o5 'pagetools-sprite.png'");
}

/**
* Convert a hex color code to an rgb array
*/
function hex2rgb($hex) {
// strip hash
$hex = str_replace('#', '', $hex);

// normalize short codes
if(strlen($hex) == 3){
$hex = substr($hex,0,1).
substr($hex,0,1).
substr($hex,1,1).
substr($hex,1,1).
substr($hex,2,1).
substr($hex,2,1);
}

// calc rgb
return array(
'r' => hexdec(substr($hex, 0, 2)),
'g' => hexdec(substr($hex, 2, 2)),
'b' => hexdec(substr($hex, 4, 2))
);
}

/**
* Scale (darken/lighten) a given image
*
* @param ressource $img The truetype GD image to work on
* @param float $scale Scale the colors by this value ( <1 darkens, >1 lightens)
*/
function imagecolorscale(&$img, $scale){
$w = imagesx($img);
$h = imagesy($img);

imagealphablending($img, false);
for($x = 0; $x < $w; $x++){
for($y = 0; $y < $h; $y++){
$rgba = imagecolorat($img, $x, $y);
$a = ($rgba >> 24) & 0xFF;
$r = ($rgba >> 16) & 0xFF;
$g = ($rgba >> 8) & 0xFF;
$b = $rgba & 0xFF;

$r = max(min(round($r*$scale),255),0);
$g = max(min(round($g*$scale),255),0);
$b = max(min(round($b*$scale),255),0);

$color = imagecolorallocatealpha($img, $r, $g, $b, $a);
imagesetpixel($img, $x, $y, $color);
}
}
imagealphablending($img, true);
}

56 changes: 0 additions & 56 deletions lib/tpl/dokuwiki/images/pagetools-build.sh

This file was deleted.

Binary file modified lib/tpl/dokuwiki/images/pagetools-sprite.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed lib/tpl/dokuwiki/images/pagetools.xcf
Binary file not shown.

1 comment on commit d43eb44

@selfthinker
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's much better, thanks! :)

Please sign in to comment.