about summary refs log tree commit diff stats
path: root/wiki/lib/tpl/dokuwiki/images/pagetools-build.php
diff options
context:
space:
mode:
Diffstat (limited to 'wiki/lib/tpl/dokuwiki/images/pagetools-build.php')
-rw-r--r--wiki/lib/tpl/dokuwiki/images/pagetools-build.php123
1 files changed, 123 insertions, 0 deletions
diff --git a/wiki/lib/tpl/dokuwiki/images/pagetools-build.php b/wiki/lib/tpl/dokuwiki/images/pagetools-build.php
new file mode 100644
index 0000000..eaceeb2
--- /dev/null
+++ b/wiki/lib/tpl/dokuwiki/images/pagetools-build.php
@@ -0,0 +1,123 @@
+<?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';
+
+if('cli' != php_sapi_name()) die('please run from commandline');
+
+// 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 resource $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);
+}
+