This commit was manufactured by cvs2svn to create tag
[Packages/TYPO3.CMS.git] / t3lib / class.t3lib_stdgraphic.php
index 916d0e2..536d740 100644 (file)
@@ -1,22 +1,22 @@
 <?php
 /***************************************************************
 *  Copyright notice
-*  
-*  (c) 1999-2003 Kasper Skårhøj (kasper@typo3.com)
+*
+*  (c) 1999-2004 Kasper Skaarhoj (kasper@typo3.com)
 *  All rights reserved
 *
-*  This script is part of the TYPO3 project. The TYPO3 project is 
+*  This script is part of the TYPO3 project. The TYPO3 project is
 *  free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
-* 
+*
 *  The GNU General Public License can be found at
 *  http://www.gnu.org/copyleft/gpl.html.
-*  A copy is found in the textfile GPL.txt and important notices to the license 
+*  A copy is found in the textfile GPL.txt and important notices to the license
 *  from the author is found in LICENSE.txt distributed with these scripts.
 *
-* 
+*
 *  This script is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *
 *  This copyright notice MUST APPEAR in all copies of the script!
 ***************************************************************/
-/** 
+/**
  * Standard graphical functions
  *
- * Revised for TYPO3 3.6 July/2003 by Kasper Skårhøj
+ * $Id$
+ * Revised for TYPO3 3.6 July/2003 by Kasper Skaarhoj
+ *
+ * @author     Kasper Skaarhoj <kasper@typo3.com>
  */
 /**
  * [CLASS/FUNCTION INDEX of SCRIPT]
  *
  *
  *
- *  138: class t3lib_stdGraphic        
- *  213:     function init()   
+ *  143: class t3lib_stdGraphic
+ *  218:     function init()
  *
  *              SECTION: Layering images / "IMAGE" GIFBUILDER object
- *  312:     function maskImageOntoImage(&$im,$conf,$workArea) 
- *  372:     function copyImageOntoImage(&$im,$conf,$workArea) 
- *  394:     function copyGifOntoGif(&$im,$cpImg,$conf,$workArea)      
- *  473:     function imagecopyresized(&$im, $cpImg, $Xstart, $Ystart, $cpImgCutX, $cpImgCutY, $w, $h, $w, $h) 
+ *  317:     function maskImageOntoImage(&$im,$conf,$workArea)
+ *  377:     function copyImageOntoImage(&$im,$conf,$workArea)
+ *  399:     function copyGifOntoGif(&$im,$cpImg,$conf,$workArea)
+ *  478:     function imagecopyresized(&$im, $cpImg, $Xstart, $Ystart, $cpImgCutX, $cpImgCutY, $w, $h, $w, $h)
  *
  *              SECTION: Text / "TEXT" GIFBUILDER object
- *  522:     function makeText(&$im,$conf,$workArea)   
- *  638:     function txtPosition($conf,$workArea,$BB) 
- *  692:     function calcBBox($conf)  
- *  761:     function addToMap($cords,$conf)   
- *  776:     function calcTextCordsForMap($cords,$offset, $conf)       
- *  809:     function SpacedImageTTFText(&$im, $fontSize, $angle, $x, $y, $Fcolor, $fontFile, $text, $spacing, $wordSpacing)   
- *  842:     function fontResize($conf) 
+ *  527:     function makeText(&$im,$conf,$workArea)
+ *  643:     function txtPosition($conf,$workArea,$BB)
+ *  697:     function calcBBox($conf)
+ *  766:     function addToMap($cords,$conf)
+ *  787:     function calcTextCordsForMap($cords,$offset, $conf)
+ *  820:     function SpacedImageTTFText(&$im, $fontSize, $angle, $x, $y, $Fcolor, $fontFile, $text, $spacing, $wordSpacing)
+ *  853:     function fontResize($conf)
  *
  *              SECTION: Other GIFBUILDER objects related to TEXT
- *  904:     function makeOutline(&$im,$conf,$workArea,$txtConf)       
- *  933:     function circleOffset($distance, $iterations)     
- *  957:     function makeEmboss(&$im,$conf,$workArea,$txtConf)        
- *  979:     function makeShadow(&$im,$conf,$workArea,$txtConf)        
+ *  915:     function makeOutline(&$im,$conf,$workArea,$txtConf)
+ *  944:     function circleOffset($distance, $iterations)
+ *  968:     function makeEmboss(&$im,$conf,$workArea,$txtConf)
+ *  990:     function makeShadow(&$im,$conf,$workArea,$txtConf)
  *
  *              SECTION: Other GIFBUILDER objects
- * 1109:     function makeBox(&$im,$conf,$workArea)    
- * 1128:     function makeEffect(&$im, $conf)  
- * 1143:     function IMparams($setup) 
- * 1226:     function adjust(&$im, $conf)      
- * 1258:     function crop(&$im,$conf) 
- * 1288:     function scale(&$im,$conf)        
- * 1320:     function setWorkArea($workArea)   
+ * 1120:     function makeBox(&$im,$conf,$workArea)
+ * 1139:     function makeEffect(&$im, $conf)
+ * 1154:     function IMparams($setup)
+ * 1237:     function adjust(&$im, $conf)
+ * 1269:     function crop(&$im,$conf)
+ * 1299:     function scale(&$im,$conf)
+ * 1331:     function setWorkArea($workArea)
  *
  *              SECTION: Adjustment functions
- * 1361:     function autolevels(&$im) 
- * 1392:     function outputLevels(&$im,$low,$high,$swap='')   
- * 1424:     function inputLevels(&$im,$low,$high,$swap='')    
- * 1455:     function reduceColors(&$im,$limit, $cols) 
+ * 1372:     function autolevels(&$im)
+ * 1403:     function outputLevels(&$im,$low,$high,$swap='')
+ * 1435:     function inputLevels(&$im,$low,$high,$swap='')
+ * 1466:     function reduceColors(&$im,$limit, $cols)
  *
  *              SECTION: GIFBUILDER Helper functions
- * 1493:     function prependAbsolutePath($fontFile)   
- * 1507:     function v5_sharpen($factor)      
- * 1526:     function v5_blur($factor) 
- * 1543:     function randomName()     
- * 1555:     function applyOffset($cords,$OFFSET)      
- * 1568:     function convertColor($string)    
- * 1618:     function recodeString($string)    
- * 1639:     function singleChars($theText)    
- * 1662:     function objPosition($conf,$workArea,$BB) 
+ * 1504:     function prependAbsolutePath($fontFile)
+ * 1518:     function v5_sharpen($factor)
+ * 1537:     function v5_blur($factor)
+ * 1554:     function randomName()
+ * 1566:     function applyOffset($cords,$OFFSET)
+ * 1579:     function convertColor($string)
+ * 1629:     function recodeString($string)
+ * 1650:     function singleChars($theText)
+ * 1673:     function objPosition($conf,$workArea,$BB)
  *
  *              SECTION: Scaling, Dimensions of images
- * 1741:     function imageMagickConvert($imagefile,$newExt='',$w='',$h='',$params='',$frame='',$options='',$mustCreate=0)     
- * 1824:     function getImageDimensions($imagefile)   
- * 1846:     function getImageScale($info,$w,$h,$options) 
- * 1934:     function file_exists_typo3temp_file($output,$orig='')     
+ * 1752:     function imageMagickConvert($imagefile,$newExt='',$w='',$h='',$params='',$frame='',$options='',$mustCreate=0)
+ * 1835:     function getImageDimensions($imageFile)
+ * 1863:     function cacheImageDimensions($identifyResult)
+ * 1895:     function getCachedImageDimensions($imageFile)
+ * 1930:     function getImageScale($info,$w,$h,$options)
+ * 2018:     function file_exists_typo3temp_file($output,$orig='')
  *
  *              SECTION: ImageMagick API functions
- * 1991:     function imageMagickIdentify($imagefile)  
- * 2024:     function imageMagickExec($input,$output,$params)  
- * 2042:     function combineExec($input,$overlay,$mask,$output)       
- * 2057:     function wrapFileName($inputName) 
+ * 2079:     function imageMagickIdentify($imagefile)
+ * 2112:     function imageMagickExec($input,$output,$params)
+ * 2130:     function combineExec($input,$overlay,$mask,$output)
+ * 2145:     function wrapFileName($inputName)
  *
  *              SECTION: Various IO functions
- * 2098:     function checkFile($file) 
- * 2113:     function applyImageMagickToPHPGif(&$im, $command) 
- * 2139:     function gif_or_jpg($type,$w,$h)  
- * 2156:     function output($file)    
- * 2200:     function destroy()        
- * 2210:     function imgTag ($imgInfo) 
- * 2222:     function ImageGif($destImg, $theImage)    
- * 2239:     function imageCreateFromGif($sourceImg)   
+ * 2186:     function checkFile($file)
+ * 2201:     function applyImageMagickToPHPGif(&$im, $command)
+ * 2227:     function gif_or_jpg($type,$w,$h)
+ * 2244:     function output($file)
+ * 2288:     function destroy()
+ * 2298:     function imgTag ($imgInfo)
+ * 2310:     function ImageGif($destImg, $theImage)
+ * 2327:     function imageCreateFromGif($sourceImg)
  *
- * TOTAL FUNCTIONS: 52
+ * TOTAL FUNCTIONS: 54
  * (This index is automatically created/updated by the extension "extdeveval")
  *
  */
 /**
  * Class contains a bunch of cool functions for manipulating graphics with GDlib/Freetype and ImageMagick
  * VERY OFTEN used with gifbuilder that extends this class and provides a TypoScript API to using these functions
- * 
- * @author     Kasper Skårhøj <kasper@typo3.com>
+ *
+ * @author     Kasper Skaarhoj <kasper@typo3.com>
  * @package TYPO3
  * @subpackage t3lib
  * @see tslib_gifBuilder
@@ -141,6 +146,7 @@ class t3lib_stdGraphic      {
        var $combineScript = 'combine';                         // The ImageMagick filename used for combining two images. This name changed during the versions.
        var $noFramePrepended=0;                                        // If set, there is no frame pointer prepended to the filenames.
        var $GD2=0;                                                                     // Set, if the GDlib used is version 2.
+       var $imagecopyresized_fix=0;                            // If set, imagecopyresized will not be called directly. For GD2 (some PHP installs?)
        var $gifExtension = 'gif';                                      // This should be changed to 'png' if you want this class to read/make PNG-files instead!
        var $TTFLocaleConv = '';                                        // Used to recode input to TTF-functions for other charsets.
        var $enable_typo3temp_db_tracking = 0;          // If set, then all files in typo3temp will be logged in a database table. In addition to being a log of the files with original filenames, it also serves to secure that the same image is not rendered simultaneously by two different processes.
@@ -148,7 +154,7 @@ class t3lib_stdGraphic      {
        var $imageFileExt = 'gif,jpg,jpeg,png,tif,bmp,tga,pcx,ai,pdf';  // Commalist of file extensions perceived as images by TYPO3. List should be set to 'gif,png,jpeg,jpg' if IM is not available. Lowercase and no spaces between!
        var $webImageExt = 'gif,jpg,jpeg,png';          // Commalist of web image extensions (can be shown by a webbrowser)
        var $maskNegate = '';                                           // Will be ' -negate' if ImageMagick ver 5.2+. See init();
-       var $NO_IM_EFFECTS = '';                                        
+       var $NO_IM_EFFECTS = '';
        var $cmds = Array (
                'jpg' => '-colorspace RGB -sharpen 50 -quality 60',
                'jpeg' => '-colorspace RGB -sharpen 50 -quality 60',
@@ -166,11 +172,11 @@ class t3lib_stdGraphic    {
        var $dontCompress=0;                                                            // Prevents imageMagickConvert() from compressing the gif-files with t3lib_div::gif_compress()
        var $dontUnlinkTempFiles=0;                                                     // For debugging ONLY!
        var $alternativeOutputKey='';                                           // For debugging only. Filenames will not be based on mtime and only filename (not path) will be used. This key is also included in the hash of the filename...
-       
+
                // Internal:
        var $IM_commands = Array();                                                     // All ImageMagick commands executed is stored in this array for tracking. Used by the Install Tools Image section
        var $workArea = Array();
-       
+
                // Constants:
        var $tempPath = 'typo3temp/';                                           // The temp-directory where to store the files. Relative to PATH_site.
        var $scalecmd = '-geometry';                                            // ImageMagick scaling command; "-geometry" eller "-sample". Used in makeText() and imageMagickConvert()
@@ -207,17 +213,18 @@ class t3lib_stdGraphic    {
        /**
         * Init function. Must always call this when using the class.
         * This function will read the configuration information from $GLOBALS['TYPO3_CONF_VARS']['GFX'] can set some values in internal variables.
-        * 
-        * @return      void            
+        *
+        * @return      void
         */
        function init() {
                $gfxConf = $GLOBALS['TYPO3_CONF_VARS']['GFX'];
 
                if ($gfxConf['im_combine_filename'])    $this->combineScript=$gfxConf['im_combine_filename'];
                if ($gfxConf['im_noFramePrepended'])    $this->noFramePrepended=1;
-               
+
                if ($gfxConf['gdlib_2'])        {
-                       $this->GD2=1;
+                       $this->GD2 = 1;
+                       $this->imagecopyresized_fix = $gfxConf['gdlib_2']==='no_imagecopyresized_fix' ? 0 : 1;
                }
                if ($gfxConf['gdlib_png'])      {
                        $this->gifExtension='png';
@@ -228,22 +235,22 @@ class t3lib_stdGraphic    {
                if ($gfxConf['enable_typo3temp_db_tracking']) {
                        $this->enable_typo3temp_db_tracking = $gfxConf['enable_typo3temp_db_tracking'];
                }
-               
+
                $this->imageMagickPath = $gfxConf['im_path'];
                $this->imageFileExt = $gfxConf['imagefile_ext'];
-               
+
                        // This should be set if ImageMagick ver. 5+ is used.
                if ($gfxConf['im_negate_mask']) {
-                               // Boolean. Indicates if the mask images should be inverted first. 
-                               // This depends of the ImageMagick version. Below ver. 5.1 this should be false. 
-                               // Above ImageMagick version 5.2+ it should be true. 
+                               // Boolean. Indicates if the mask images should be inverted first.
+                               // This depends of the ImageMagick version. Below ver. 5.1 this should be false.
+                               // Above ImageMagick version 5.2+ it should be true.
                                // Just set the flag if the masks works opposite the intension!
                        $this->maskNegate = ' -negate';
                }
-               if ($gfxConf['im_no_effects'])  {       
-                               // Boolean. This is necessary if using ImageMagick 5+. 
-                               // Approved version for using effects is version 4.2.9. 
-                               // Effects in Imagemagick 5+ tends to render very slowly!! 
+               if ($gfxConf['im_no_effects'])  {
+                               // Boolean. This is necessary if using ImageMagick 5+.
+                               // Approved version for using effects is version 4.2.9.
+                               // Effects in Imagemagick 5+ tends to render very slowly!!
                                // - therefore must be disabled in order not to perform sharpen, blurring and such.
                        $this->NO_IM_EFFECTS = 1;
 
@@ -260,7 +267,7 @@ class t3lib_stdGraphic      {
                                $this->cmds['jpeg'] = '-colorspace RGB -quality 60'.$this->v5_sharpen(10);
                        }
                }
-               
+
                if (!$gfxConf['im'])    {
                        $this->NO_IMAGE_MAGICK = 1;
                }
@@ -268,7 +275,7 @@ class t3lib_stdGraphic      {
                if ($gfxConf['im_noScaleUp']) {
                        $this->mayScaleUp=0;
                }
-               
+
                if (TYPO3_MODE=='FE')   {
                        $this->csConvObj = &$GLOBALS['TSFE']->csConvObj;
                } else {        // BE assumed:
@@ -302,11 +309,11 @@ class t3lib_stdGraphic    {
         * Implements the "IMAGE" GIFBUILDER object, when the "mask" property is true.
         * It reads the two images defined by $conf['file'] and $conf['mask'] and copies the $conf['file'] onto the input image pointer image using the $conf['mask'] as a grayscale mask
         * The operation involves ImageMagick for combining.
-        * 
+        *
         * @param       pointer         GDlib image pointer
         * @param       array           TypoScript array with configuration for the GIFBUILDER object.
         * @param       array           The current working area coordinates.
-        * @return      void            
+        * @return      void
         * @see tslib_gifBuilder::make()
         */
        function maskImageOntoImage(&$im,$conf,$workArea)       {
@@ -362,11 +369,11 @@ class t3lib_stdGraphic    {
 
        /**
         * Implements the "IMAGE" GIFBUILDER object, when the "mask" property is false (using only $conf['file'])
-        * 
+        *
         * @param       pointer         GDlib image pointer
         * @param       array           TypoScript array with configuration for the GIFBUILDER object.
         * @param       array           The current working area coordinates.
-        * @return      void            
+        * @return      void
         * @see tslib_gifBuilder::make(), maskImageOntoImage()
         */
        function copyImageOntoImage(&$im,$conf,$workArea)       {
@@ -383,7 +390,7 @@ class t3lib_stdGraphic      {
 
        /**
         * Copies two GDlib image pointers onto each other, using TypoScript configuration from $conf and the input $workArea definition.
-        * 
+        *
         * @param       pointer         GDlib image pointer, destination (bottom image)
         * @param       pointer         GDlib image pointer, source (top image)
         * @param       array           TypoScript array with the properties for the IMAGE GIFBUILDER object. Only used for the "tile" property value.
@@ -439,39 +446,39 @@ class t3lib_stdGraphic    {
        }
 
        /**
-        * Alternative function for using the similat PHP function imagecopyresized(). Used for GD2 only.
-        * 
+        * Alternative function for using the similar PHP function imagecopyresized(). Used for GD2 only.
+        *
         * OK, the reason for this stupid fix is the following story:
-        * GD1.x was capable of copying two images together and combining their palettes! GD2 is apparently not. 
-        * With GD2 only the palette of the dest-image is used which mostly results in totally black images when trying to 
+        * GD1.x was capable of copying two images together and combining their palettes! GD2 is apparently not.
+        * With GD2 only the palette of the dest-image is used which mostly results in totally black images when trying to
         * copy a color-ful image onto the destination.
-        * The GD2-fix is to 
+        * The GD2-fix is to
         *              1) Create a blank TRUE-COLOR image
         *              2) Copy the destination image onto that one
-        *              3) Then do the actual operation; Copying the source (top image) onto that 
+        *              3) Then do the actual operation; Copying the source (top image) onto that
         *              4) ... and return the result pointer.
         *              5) Reduce colors (if we do not, the result may become strange!)
         * It works, but the resulting images is now a true-color PNG which may be very large.
         * So, why not use 'imagetruecolortopalette ($im, TRUE, 256)' - well because it does NOT WORK! So simple is that.
-        * 
+        *
         * For parameters, see PHP function "imagecopyresized()"
-        * 
-        * @param       pointer         
-        * @param       pointer         
-        * @param       integer         
-        * @param       integer         
-        * @param       integer         
-        * @param       integer         
-        * @param       integer         
-        * @param       integer         
-        * @param       integer         
-        * @param       integer         
-        * @return      void            
+        *
+        * @param       pointer         see PHP function "imagecopyresized()"
+        * @param       pointer         see PHP function "imagecopyresized()"
+        * @param       integer         see PHP function "imagecopyresized()"
+        * @param       integer         see PHP function "imagecopyresized()"
+        * @param       integer         see PHP function "imagecopyresized()"
+        * @param       integer         see PHP function "imagecopyresized()"
+        * @param       integer         see PHP function "imagecopyresized()"
+        * @param       integer         see PHP function "imagecopyresized()"
+        * @param       integer         see PHP function "imagecopyresized()"
+        * @param       integer         see PHP function "imagecopyresized()"
+        * @return      void
         * @access private
         * @see t3lib_iconWorks::imagecopyresized()
         */
        function imagecopyresized(&$im, $cpImg, $Xstart, $Ystart, $cpImgCutX, $cpImgCutY, $w, $h, $w, $h)       {
-               if ($this->GD2) {
+               if ($this->imagecopyresized_fix)        {
                        $im_base = imagecreatetruecolor(imagesx($im), imagesy($im));    // Make true color image
                        imagecopyresized($im_base, $im, 0,0,0,0, imagesx($im),imagesy($im),imagesx($im),imagesy($im));  // Copy the source image onto that
                        imagecopyresized($im_base, $cpImg, $Xstart, $Ystart, $cpImgCutX, $cpImgCutY, $w, $h, $w, $h);   // Then copy the $cpImg onto that (the actual operation!)
@@ -512,11 +519,11 @@ class t3lib_stdGraphic    {
 
        /**
         * Implements the "TEXT" GIFBUILDER object
-        * 
+        *
         * @param       pointer         GDlib image pointer
         * @param       array           TypoScript array with configuration for the GIFBUILDER object.
         * @param       array           The current working area coordinates.
-        * @return      void            
+        * @return      void
         * @see tslib_gifBuilder::make()
         */
        function makeText(&$im,$conf,$workArea) {
@@ -541,7 +548,7 @@ class t3lib_stdGraphic      {
                                $Fcolor = ImageColorAllocate($im, $cols[0],$cols[1],$cols[2]);
                                        // antiAliasing is setup:
                                $Fcolor = ($conf['antiAlias']) ? $Fcolor : -$Fcolor;
-                               
+
                                for ($a=0; $a<$conf['iterations']; $a++)        {
                                        if ($spacing || $wordSpacing)   {               // If any kind of spacing applys, we use this function:
                                                $this->SpacedImageTTFText($im, $conf['fontSize'], $conf['angle'], $txtPos[0], $txtPos[1], $Fcolor, t3lib_stdGraphic::prependAbsolutePath($conf['fontFile']), $theText, $spacing, $wordSpacing);
@@ -554,7 +561,7 @@ class t3lib_stdGraphic      {
                                $w = imagesx($im);
                                $h = imagesy($im);
                                $tmpStr = $this->randomName();
-                               
+
                                $fileMenu = $tmpStr.'_menuNT.'.$this->gifExtension;
                                $fileColor = $tmpStr.'_colorNT.'.$this->gifExtension;
                                $fileMask = $tmpStr.'_maskNT.'.$this->gifExtension;
@@ -562,7 +569,7 @@ class t3lib_stdGraphic      {
                                $sF = t3lib_div::intInRange($conf['niceText.']['scaleFactor'],2,5);
                                $newW = ceil($sF*imagesx($im));
                                $newH = ceil($sF*imagesy($im));
-       
+
                                        // Make mask
                                $maskImg = imagecreate($newW, $newH);
                                ImageColorAllocate($maskImg, 255,255,255);
@@ -597,29 +604,29 @@ class t3lib_stdGraphic    {
                                        }
                                }
                                $this->imageMagickExec($fileMask,$fileMask,$command);
-       
+
                                        // Make the color-file
                                $colorImg = imagecreate($w,$h);
                                ImageColorAllocate($colorImg, $cols[0],$cols[1],$cols[2]);
                                $this->ImageGif($colorImg, $fileColor);
                                ImageDestroy($colorImg);
-       
+
                                        // The mask is applied
                                $this->ImageGif($im, $fileMenu);        // The main pictures is saved temporarily
-       
+
                                $this->combineExec($fileMenu,$fileColor,$fileMask,$fileMenu);
-                               
+
                                $backIm = $this->imageCreateFromGif($fileMenu); // The main image is loaded again...
                                if ($backIm)    {       // ... and if nothing went wrong we load it onto the old one.
                                        ImageColorTransparent($backIm,-1);
                                        $im = $backIm;
                                }
-       
+
                                        // Deleting temporary files;
                                if (!$this->dontUnlinkTempFiles)        {
-                                       unlink($fileMenu);      
+                                       unlink($fileMenu);
                                        unlink($fileColor);
-                                       unlink($fileMask);      
+                                       unlink($fileMask);
                                }
                        }
                }
@@ -627,7 +634,7 @@ class t3lib_stdGraphic      {
 
        /**
         * Calculates text position for printing the text onto the image based on configuration like alignment and workarea.
-        * 
+        *
         * @param       array           TypoScript array for the TEXT GIFBUILDER object
         * @param       array           Workarea definition
         * @param       array           Bounding box information, was set in tslib_gifBuilder::start()
@@ -666,11 +673,11 @@ class t3lib_stdGraphic    {
                }
                switch($conf['align'])  {
                        case 'right':
-                       break;                  
+                       break;
                        case 'center':
                                $result[0] = round(($result[0])/2);
                                $result[1] = round(($result[1])/2);
-                       break;                  
+                       break;
                        default:
                                $result[0]=0;
                                $result[1]=0;
@@ -683,7 +690,7 @@ class t3lib_stdGraphic      {
 
        /**
         * Calculates bounding box information for the TEXT GIFBUILDER object.
-        * 
+        *
         * @param       array           TypoScript array for the TEXT GIFBUILDER object
         * @return      array           Array with three keys [0]/[1] being x/y and [2] being the bounding box array
         * @access private
@@ -699,11 +706,11 @@ class t3lib_stdGraphic    {
                $spacing = intval($conf['spacing']);
                $wordSpacing = intval($conf['wordSpacing']);
                $wordSpacing = $wordSpacing?$wordSpacing:$spacing*2;
-               
+
                $spacing*=$sF;
                $wordSpacing*=$sF;
                $theText = $this->recodeString($conf['text']);
-               
+
                $charInf = ImageTTFBBox(t3lib_div::freetypeDpiComp($sF*$conf['fontSize']), $conf['angle'], t3lib_stdGraphic::prependAbsolutePath($conf['fontFile']), $theText);
                $theBBoxInfo = $charInf;
                if ($conf['angle'])     {
@@ -735,7 +742,7 @@ class t3lib_stdGraphic      {
                                }
                        }
                }
-               
+
                if ($sF>1) {
                        $x = ceil($x/$sF);
                        $y = ceil($y/$sF);
@@ -751,25 +758,33 @@ class t3lib_stdGraphic    {
 
        /**
         * Adds an <area> tag to the internal variable $this->map which is used to accumulate the content for an ImageMap
-        * 
+        *
         * @param       array           Coordinates for a polygon image map as created by ->calcTextCordsForMap()
         * @param       array           Configuration for "imgMap." property of a TEXT GIFBUILDER object.
-        * @return      void            
+        * @return      void
         * @access private
         * @see makeText(), calcTextCordsForMap()
         */
        function addToMap($cords,$conf) {
                $JS = $conf['noBlur'] ? '' : ' onfocus="blurLink(this);"';
-               $this->map.='<area shape="poly" coords="'.implode($cords,',').'" href="'.htmlspecialchars($conf['url']).'" target="'.$conf['target'].'"'.$JS.' />';
+
+               $this->map.='<area'.
+                               ' shape="poly"'.
+                               ' coords="'.implode($cords,',').'"'.
+                               ' href="'.htmlspecialchars($conf['url']).'"'.
+                               ($conf['target'] ? ' target="'.htmlspecialchars($conf['target']).'"' : '').
+                               $JS.
+                               (strlen($conf['titleText']) ? ' title="'.htmlspecialchars($conf['titleText']).'"' : '').
+                               ' alt="'.htmlspecialchars($conf['altText']).'" />';
        }
 
        /**
         * Calculating the coordinates for a TEXT string on an image map. Used in an <area> tag
-        * 
+        *
         * @param       array           Coordinates (from BBOX array)
         * @param       array           Offset array
         * @param       array           Configuration for "imgMap." property of a TEXT GIFBUILDER object.
-        * @return      array           
+        * @return      array
         * @access private
         * @see makeText(), calcTextCordsForMap()
         */
@@ -792,7 +807,7 @@ class t3lib_stdGraphic      {
         * Printing text onto an image like the PHP function imageTTFText does but in addition it offers options for spacing of letters and words.
         * Spacing is done by printing one char at a time and this means that the spacing is rather uneven and probably not very nice.
         * See
-        * 
+        *
         * @param       pointer         (See argument for PHP function imageTTFtext())
         * @param       integer         (See argument for PHP function imageTTFtext())
         * @param       integer         (See argument for PHP function imageTTFtext())
@@ -803,7 +818,7 @@ class t3lib_stdGraphic      {
         * @param       string          (See argument for PHP function imageTTFtext()). UTF-8 string, possibly with entities in.
         * @param       integer         The spacing of letters in pixels
         * @param       integer         The spacing of words in pixels
-        * @return      void            
+        * @return      void
         * @access private
         */
        function SpacedImageTTFText(&$im, $fontSize, $angle, $x, $y, $Fcolor, $fontFile, $text, $spacing, $wordSpacing) {
@@ -832,7 +847,7 @@ class t3lib_stdGraphic      {
 
        /**
         * Function that finds the right fontsize that will render the textstring within a certain width
-        * 
+        *
         * @param       array           The TypoScript properties of the TEXT GIFBUILDER object
         * @return      integer         The new fontSize
         * @access private
@@ -893,12 +908,12 @@ class t3lib_stdGraphic    {
 
        /**
         * Implements the "OUTLINE" GIFBUILDER object / property for the TEXT object
-        * 
+        *
         * @param       pointer         GDlib image pointer
         * @param       array           TypoScript array with configuration for the GIFBUILDER object.
         * @param       array           The current working area coordinates.
         * @param       array           TypoScript array with configuration for the associated TEXT GIFBUILDER object.
-        * @return      void            
+        * @return      void
         * @see tslib_gifBuilder::make(), makeText()
         */
        function makeOutline(&$im,$conf,$workArea,$txtConf)     {
@@ -922,12 +937,12 @@ class t3lib_stdGraphic    {
 
        /**
         * Creates some offset values in an array used to simulate a circularly applied outline around TEXT
-        * 
+        *
         * access private
-        * 
+        *
         * @param       integer         Distance
         * @param       integer         Iterations.
-        * @return      array           
+        * @return      array
         * @see makeOutline()
         */
        function circleOffset($distance, $iterations)   {
@@ -946,12 +961,12 @@ class t3lib_stdGraphic    {
 
        /**
         * Implements the "EMBOSS" GIFBUILDER object / property for the TEXT object
-        * 
+        *
         * @param       pointer         GDlib image pointer
         * @param       array           TypoScript array with configuration for the GIFBUILDER object.
         * @param       array           The current working area coordinates.
         * @param       array           TypoScript array with configuration for the associated TEXT GIFBUILDER object.
-        * @return      void            
+        * @return      void
         * @see tslib_gifBuilder::make(), makeShadow()
         */
        function makeEmboss(&$im,$conf,$workArea,$txtConf)      {
@@ -968,12 +983,12 @@ class t3lib_stdGraphic    {
        /**
         * Implements the "SHADOW" GIFBUILDER object / property for the TEXT object
         * The operation involves ImageMagick for combining.
-        * 
+        *
         * @param       pointer         GDlib image pointer
         * @param       array           TypoScript array with configuration for the GIFBUILDER object.
         * @param       array           The current working area coordinates.
         * @param       array           TypoScript array with configuration for the associated TEXT GIFBUILDER object.
-        * @return      void            
+        * @return      void
         * @see tslib_gifBuilder::make(), makeText(), makeEmboss()
         */
        function makeShadow(&$im,$conf,$workArea,$txtConf)      {
@@ -998,7 +1013,7 @@ class t3lib_stdGraphic     {
                        ImageColorAllocate($blurColImg, $bcols[0],$bcols[1],$bcols[2]);
                        $this->ImageGif($blurColImg, $fileColor);
                        ImageDestroy($blurColImg);
-       
+
                                // The mask is made: BlurTextImage
                        $blurTextImg = imagecreate($w+$blurBorder*2,$h+$blurBorder*2);
                        ImageColorAllocate($blurTextImg, 0,0,0);                // black background
@@ -1041,7 +1056,7 @@ class t3lib_stdGraphic    {
                                }
                                $intensity = ceil(255-($intensity/100*255));
                                $this->inputLevels($blurTextImg,0,$intensity,$this->maskNegate);
-                               
+
                                $opacity = t3lib_div::intInRange(intval($conf['opacity']),0,100);
                                if ($opacity && $opacity<100)   {
                                        $high = ceil(255*$opacity/100);
@@ -1050,7 +1065,7 @@ class t3lib_stdGraphic    {
 
                                $this->ImageGif($blurTextImg, $fileMask);       // Dump the mask again
                                ImageDestroy($blurTextImg);     // Destroy the mask
-       
+
                                        // The pictures are combined
                                $this->ImageGif($im, $fileMenu);        // The main pictures is saved temporarily
 
@@ -1064,9 +1079,9 @@ class t3lib_stdGraphic    {
                        }
                                // Deleting temporary files;
                        if (!$this->dontUnlinkTempFiles)        {
-                               unlink($fileMenu);      
+                               unlink($fileMenu);
                                unlink($fileColor);
-                               unlink($fileMask);      
+                               unlink($fileMask);
                        }
                }
        }
@@ -1099,11 +1114,11 @@ class t3lib_stdGraphic  {
 
        /**
         * Implements the "BOX" GIFBUILDER object
-        * 
+        *
         * @param       pointer         GDlib image pointer
         * @param       array           TypoScript array with configuration for the GIFBUILDER object.
         * @param       array           The current working area coordinates.
-        * @return      void            
+        * @return      void
         * @see tslib_gifBuilder::make()
         */
        function makeBox(&$im,$conf,$workArea)  {
@@ -1119,10 +1134,10 @@ class t3lib_stdGraphic  {
        /**
         * Implements the "EFFECT" GIFBUILDER object
         * The operation involves ImageMagick for applying effects
-        * 
+        *
         * @param       pointer         GDlib image pointer
         * @param       array           TypoScript array with configuration for the GIFBUILDER object.
-        * @return      void            
+        * @return      void
         * @see tslib_gifBuilder::make(), applyImageMagickToPHPGif()
         */
        function makeEffect(&$im, $conf)        {
@@ -1134,7 +1149,7 @@ class t3lib_stdGraphic    {
 
        /**
         * Creating ImageMagick paramters from TypoScript property
-        * 
+        *
         * @param       string          A string with effect keywords=value pairs separated by "|"
         * @return      string          ImageMagick prepared parameters.
         * @access private
@@ -1151,7 +1166,7 @@ class t3lib_stdGraphic    {
                        switch($effect) {
                                case 'gamma':
                                        $commands.=' -gamma '.doubleval($value);
-                               break;          
+                               break;
                                case 'blur':
                                        if (!$this->NO_IM_EFFECTS)      {
                                                if ($this->V5_EFFECTS)  {
@@ -1160,7 +1175,7 @@ class t3lib_stdGraphic    {
                                                        $commands.=' -blur '.t3lib_div::intInRange($value,1,99);
                                                }
                                        }
-                               break;          
+                               break;
                                case 'sharpen':
                                        if (!$this->NO_IM_EFFECTS)      {
                                                if ($this->V5_EFFECTS)  {
@@ -1169,47 +1184,47 @@ class t3lib_stdGraphic  {
                                                        $commands.=' -sharpen '.t3lib_div::intInRange($value,1,99);
                                                }
                                        }
-                               break;          
+                               break;
                                case 'rotate':
                                        $commands.=' -rotate '.t3lib_div::intInRange($value,0,360);
-                               break;          
+                               break;
                                case 'solarize':
                                        $commands.=' -solarize '.t3lib_div::intInRange($value,0,99);
-                               break;          
+                               break;
                                case 'swirl':
                                        $commands.=' -swirl '.t3lib_div::intInRange($value,0,1000);
-                               break;          
+                               break;
                                case 'wave':
                                        $params = t3lib_div::intExplode(',',$value);
                                        $commands.=' -wave '.t3lib_div::intInRange($params[0],0,99).'x'.t3lib_div::intInRange($params[1],0,99);
-                               break;          
+                               break;
                                case 'charcoal':
                                        $commands.=' -charcoal '.t3lib_div::intInRange($value,0,100);
-                               break;          
+                               break;
                                case 'gray':
                                        $commands.=' -colorspace GRAY';
-                               break;          
+                               break;
                                case 'edge':
                                        $commands.=' -edge '.t3lib_div::intInRange($value,0,99);
-                               break;          
+                               break;
                                case 'emboss':
                                        $commands.=' -emboss';
-                               break;          
+                               break;
                                case 'flip':
                                        $commands.=' -flip';
-                               break;          
+                               break;
                                case 'flop':
                                        $commands.=' -flop';
-                               break;          
+                               break;
                                case 'colors':
                                        $commands.=' -colors '.t3lib_div::intInRange($value,2,255);
-                               break;          
+                               break;
                                case 'shear':
                                        $commands.=' -shear '.t3lib_div::intInRange($value,-90,90);
-                               break;          
+                               break;
                                case 'invert':
                                        $commands.=' -negate';
-                               break;          
+                               break;
                        }
                }
                return $commands;
@@ -1217,10 +1232,10 @@ class t3lib_stdGraphic  {
 
        /**
         * Implements the "ADJUST" GIFBUILDER object
-        * 
+        *
         * @param       pointer         GDlib image pointer
         * @param       array           TypoScript array with configuration for the GIFBUILDER object.
-        * @return      void            
+        * @return      void
         * @see tslib_gifBuilder::make(), autoLevels(), outputLevels(), inputLevels()
         */
        function adjust(&$im, $conf)    {
@@ -1249,10 +1264,10 @@ class t3lib_stdGraphic  {
 
        /**
         * Implements the "CROP" GIFBUILDER object
-        * 
+        *
         * @param       pointer         GDlib image pointer
         * @param       array           TypoScript array with configuration for the GIFBUILDER object.
-        * @return      void            
+        * @return      void
         * @see tslib_gifBuilder::make()
         */
        function crop(&$im,$conf)       {
@@ -1269,7 +1284,7 @@ class t3lib_stdGraphic    {
                $workArea = Array(0,0,$cords[2],$cords[3]);
                if ($cords[0]<0) {$workArea[0]=abs($cords[0]);} else {$newConf['offset']=-$cords[0];}
                if ($cords[1]<0) {$workArea[1]=abs($cords[1]);} else {$newConf['offset'].=','.-$cords[1];}
-               
+
                $this->copyGifOntoGif($newIm,$im,$newConf,$workArea);
                $im = $newIm;
                $this->w = imagesx($im);
@@ -1279,10 +1294,10 @@ class t3lib_stdGraphic  {
 
        /**
         * Implements the "SCALE" GIFBUILDER object
-        * 
+        *
         * @param       pointer         GDlib image pointer
         * @param       array           TypoScript array with configuration for the GIFBUILDER object.
-        * @return      void            
+        * @return      void
         * @see tslib_gifBuilder::make()
         */
        function scale(&$im,$conf)      {
@@ -1298,7 +1313,7 @@ class t3lib_stdGraphic    {
                                $this->w = imagesx($im);
                                $this->h = imagesy($im);
                                $this->setWorkArea(''); // clears workArea to total image
-                       }       
+                       }
                        if (!$this->dontUnlinkTempFiles)        {
                                unlink($theFile);
                                if ($theNewFile[3] && $theNewFile[3]!=$theFile) {
@@ -1311,9 +1326,9 @@ class t3lib_stdGraphic    {
        /**
         * Implements the "WORKAREA" GIFBUILDER object when setting it
         * Setting internal working area boundaries (->workArea)
-        * 
+        *
         * @param       string          Working area dimensions, comma separated
-        * @return      void            
+        * @return      void
         * @access private
         * @see tslib_gifBuilder::make()
         */
@@ -1354,9 +1369,9 @@ class t3lib_stdGraphic    {
 
        /**
         * Apply auto-levels to input image pointer
-        * 
+        *
         * @param       integer         GDlib Image Pointer
-        * @return      void            
+        * @return      void
         */
        function autolevels(&$im)       {
                $totalCols = ImageColorsTotal($im);
@@ -1382,24 +1397,24 @@ class t3lib_stdGraphic  {
 
        /**
         * Apply output levels to input image pointer (decreasing contrast)
-        * 
+        *
         * @param       integer         GDlib Image Pointer
         * @param       integer         The "low" value (close to 0)
         * @param       integer         The "high" value (close to 255)
         * @param       boolean         If swap, then low and high are swapped. (Useful for negated masks...)
-        * @return      void            
+        * @return      void
         */
        function outputLevels(&$im,$low,$high,$swap='') {
                if ($low<$high){
                        $low = t3lib_div::intInRange($low,0,255);
                        $high = t3lib_div::intInRange($high,0,255);
-                       
+
                        if ($swap)      {
                                $temp = $low;
                                $low = 255-$high;
                                $high = 255-$temp;
                        }
-                       
+
                        $delta = $high-$low;
                        $totalCols = ImageColorsTotal($im);
                        for ($c=0; $c<$totalCols; $c++) {
@@ -1414,12 +1429,12 @@ class t3lib_stdGraphic  {
 
        /**
         * Apply input levels to input image pointer (increasing contrast)
-        * 
+        *
         * @param       integer         GDlib Image Pointer
         * @param       integer         The "low" value (close to 0)
         * @param       integer         The "high" value (close to 255)
         * @param       boolean         If swap, then low and high are swapped. (Useful for negated masks...)
-        * @return      void            
+        * @return      void
         */
        function inputLevels(&$im,$low,$high,$swap='')  {
                if ($low<$high){
@@ -1431,7 +1446,7 @@ class t3lib_stdGraphic    {
                                $low = 255-$high;
                                $high = 255-$temp;
                        }
-                       
+
                        $delta = $high-$low;
                        $totalCols = ImageColorsTotal($im);
                        for ($c=0; $c<$totalCols; $c++) {
@@ -1446,11 +1461,11 @@ class t3lib_stdGraphic  {
 
        /**
         * Reduce colors in image
-        * 
+        *
         * @param       integer         GDlib Image Pointer
         * @param       integer         The max number of colors in the image before a reduction will happen; basically this means that IF the GD image current has the same amount or more colors than $limit define, THEN a reduction is performed.
         * @param       integer         Number of colors to reduce the image to.
-        * @return      void            
+        * @return      void
         */
        function reduceColors(&$im,$limit, $cols)       {
                if (ImageColorsTotal($im)>=$limit)      {
@@ -1478,7 +1493,7 @@ class t3lib_stdGraphic    {
 
        /*********************************
         *
-        * GIFBUILDER Helper functions 
+        * GIFBUILDER Helper functions
         *
         *********************************/
 
@@ -1486,7 +1501,7 @@ class t3lib_stdGraphic    {
         * Checks if the $fontFile is already at an absolute path and if not, prepends the correct path.
         * Use PATH_site unless we are in the backend.
         * Call it by t3lib_stdGraphic::prependAbsolutePath()
-        * 
+        *
         * @param       string          The font file
         * @return      string          The font file with absolute path.
         */
@@ -1499,7 +1514,7 @@ class t3lib_stdGraphic    {
        /**
         * Returns the IM command for sharpening with ImageMagick 5 (when $this->V5_EFFECTS is set).
         * Uses $this->im5fx_sharpenSteps for translation of the factor to an actual command.
-        * 
+        *
         * @param       integer         The sharpening factor, 0-100 (effectively in 10 steps)
         * @return      string          The sharpening command, eg. " -sharpen 3x4"
         * @see makeText(), IMparams(), v5_blur()
@@ -1518,7 +1533,7 @@ class t3lib_stdGraphic    {
        /**
         * Returns the IM command for blurring with ImageMagick 5 (when $this->V5_EFFECTS is set).
         * Uses $this->im5fx_blurSteps for translation of the factor to an actual command.
-        * 
+        *
         * @param       integer         The blurring factor, 0-100 (effectively in 10 steps)
         * @return      string          The blurring command, eg. " -blur 3x4"
         * @see makeText(), IMparams(), v5_sharpen()
@@ -1537,8 +1552,8 @@ class t3lib_stdGraphic    {
        /**
         * Returns a random filename prefixed with "temp_" and then 32 char md5 hash (without extension) from $this->tempPath.
         * Used by functions in this class to create truely temporary files for the on-the-fly processing. These files will most likely be deleted right away.
-        * 
-        * @return      string          
+        *
+        * @return      string
         */
        function randomName()   {
                return $this->tempPath.'temp_'.md5(uniqid(''));
@@ -1547,7 +1562,7 @@ class t3lib_stdGraphic    {
        /**
         * Applies offset value to coordinated in $cords.
         * Basically the value of key 0/1 of $OFFSET is added to keys 0/1 of $cords
-        * 
+        *
         * @param       array           Integer coordinates in key 0/1
         * @param       array           Offset values in key 0/1
         * @return      array           Modified $cords array
@@ -1561,7 +1576,7 @@ class t3lib_stdGraphic    {
        /**
         * Converts a "HTML-color" TypoScript datatype to RGB-values.
         * Default is 0,0,0
-        * 
+        *
         * @param       string          "HTML-color" data type string, eg. 'red', '#ffeedd' or '255,0,255'. You can also add a modifying operator afterwards. There are two options: "255,0,255 : 20" - will add 20 to values, result is "255,20,255". Or "255,0,255 : *1.23" which will multiply all RGB values with 1.23
         * @return      array           RGB values in key 0/1/2 of the array
         */
@@ -1611,7 +1626,7 @@ class t3lib_stdGraphic    {
        /**
         * Recode string
         * Used with text strings for fonts when languages has other character sets.
-        * 
+        *
         * @param       string          The text to recode
         * @return      string          The recoded string. Should be UTF-8 output. MAY contain entities (eg. &#123; or &#quot; which should render as real chars).
         */
@@ -1625,14 +1640,14 @@ class t3lib_stdGraphic  {
                if ($this->TTFLocaleConv)       {
                        $string = recode_string($this->TTFLocaleConv,$string);
                }
-               
+
                return $string;
        }
 
        /**
         * Split a string into an array of individual characters
         * The function will look at  $this->nativeCharset and if that is set, the input string is expected to be UTF-8 encoded, possibly with entities in it. Otherwise the string is supposed to be a single-byte charset which is just splitted by a for-loop.
-        * 
+        *
         * @param       string          The text string to spli
         * @return      array           Numerical array with a char as each value.
         */
@@ -1651,7 +1666,7 @@ class t3lib_stdGraphic    {
 
        /**
         * Create an array with object position/boundaries based on input TypoScript configuration (such as the "align" property is used), the work area definition and $BB array
-        * 
+        *
         * @param       array           TypoScript configuration for a GIFBUILDER object
         * @param       array           Workarea definition
         * @param       array           BB (Bounding box) array. Not just used for TEXT objects but also for others
@@ -1661,16 +1676,16 @@ class t3lib_stdGraphic  {
         */
        function objPosition($conf,$workArea,$BB) {
                        // offset, align, valign, workarea
-               $result=Array();        
+               $result=Array();
                $result[2] = $BB[0];
                $result[3] = $BB[1];
                $w=$workArea[2];
                $h=$workArea[3];
-               
+
                $align = explode(',',$conf['align']);
                $align[0] = strtolower(substr(trim($align[0]),0,1));
                $align[1] = strtolower(substr(trim($align[1]),0,1));
-               
+
                switch($align[0])       {
                        case 'r':
                                $result[0]=$w-$result[2];
@@ -1726,7 +1741,7 @@ class t3lib_stdGraphic    {
 
        /**
         * Converts $imagefile to another file in temp-dir of type $newExt (extension).
-        * 
+        *
         * @param       string          The image filepath
         * @param       string          New extension, eg. "gif", "png", "jpg", "tif". If $newExt is NOT set, the new imagefile will be of the original format. If newExt = 'WEB' then one of the web-formats is applied.
         * @param       string          Width. $w / $h is optional. If only one is given the image is scaled proportionally. If an 'm' exists in the $w or $h and if both are present the $w and $h is regarded as the Maximum w/h and the proportions will be kept
@@ -1743,7 +1758,7 @@ class t3lib_stdGraphic    {
                                // Returning file info right away
                        return $this->getImageDimensions($imagefile);
                }
-               
+
                if($info=$this->getImageDimensions($imagefile)) {
                        $newExt=strtolower(trim($newExt));
                        if (!$newExt)   {       // If no extension is given the original extension is used
@@ -1765,11 +1780,11 @@ class t3lib_stdGraphic  {
                                $data = $this->getImageScale($info,$w,$h,$options);
                                $w=$data['origW'];
                                $h=$data['origH'];
-                               
+
                                        // if no convertion should be performed
                                $wh_noscale = (!$w && !$h) || ($data[0]==$info[0] && $data[1]==$info[1]);               // this flag is true if the width / height does NOT dictate the image to be scaled!! (that is if no w/h is given or if the destination w/h matches the original image-dimensions....
-                                       
-                               if ($wh_noscale && !$params && !$frame && $newExt==$info[2] && !$mustCreate) {  
+
+                               if ($wh_noscale && !$params && !$frame && $newExt==$info[2] && !$mustCreate) {
                                        $info[3] = $imagefile;
                                        return $info;
                                }
@@ -1777,13 +1792,13 @@ class t3lib_stdGraphic  {
                                $info[1]=$data[1];
 
                                $frame = $this->noFramePrepended ? '' : '['.intval($frame).']';
-                               
+
                                if (!$params)   {
                                        $params = $this->cmds[$newExt];
                                }
-                               
+
                                $command = $this->scalecmd.' '.$info[0].'x'.$info[1].'! '.$params.' ';
-                               
+
                                if ($this->alternativeOutputKey)        {
                                        $theOutputName = t3lib_div::shortMD5($command.basename($imagefile).$this->alternativeOutputKey.$frame);
                                } else {
@@ -1816,30 +1831,102 @@ class t3lib_stdGraphic {
 
        /**
         * Gets the input image dimensions.
-        * 
+        *
         * @param       string          The image filepath
         * @return      array           Returns an array where [0]/[1] is w/h, [2] is extension and [3] is the filename.
         * @see imageMagickConvert(), tslib_cObj::getImgResource()
         */
-       function getImageDimensions($imagefile) {
-               ereg('([^\.]*)$',$imagefile,$reg);
-               if (@file_exists($imagefile) && t3lib_div::inList($this->imageFileExt,strtolower($reg[0])))     {
-                       if ($temp = @getImageSize($imagefile))  {
-                               return Array($temp[0], $temp[1], strtolower($reg[0]), $imagefile);
+       function getImageDimensions($imageFile) {
+               ereg('([^\.]*)$',$imageFile,$reg);
+               if (@file_exists($imageFile) && t3lib_div::inList($this->imageFileExt,strtolower($reg[0])))     {
+                       if ($returnArr = $this->getCachedImageDimensions($imageFile))   {
+                               return $returnArr;
                        } else {
-                               return $this->imageMagickIdentify($imagefile);
+                               if ($temp = @getImageSize($imageFile))  {
+                                       $returnArr = Array($temp[0], $temp[1], strtolower($reg[0]), $imageFile);
+                               } else {
+                                       $returnArr = $this->imageMagickIdentify($imageFile);
+                               }
+                               if($returnArr) {
+                                       $this->cacheImageDimensions($returnArr);
+                                       return $returnArr;
+                               }
                        }
                }
+               return false;
+       }
+
+       /**
+        * Cache the result of the getImageDimensions function into the database. Does not check if the
+        * file exists!
+        *
+        * @param       array           $identifyResult: Result of the getImageDimensions function
+        * @return      boolean         True if operation was successful
+        * @author      Michael Stucki <mundaun@gmx.ch> / Robert Lemke <rl@robertlemke.de>
+        */
+       function cacheImageDimensions($identifyResult)  {
+               global $TYPO3_DB;
+                       // Create a md5 hash of the filename
+               if (function_exists('md5_file')) {
+                       $md5Hash = md5_file($identifyResult[3]);
+               } else {
+                       $md5Hash = md5 (t3lib_div::getURL($identifyResult[3]));
+               }
+               if ($md5Hash) {
+                       $fieldArr = array (
+                               'md5hash' => $md5Hash,
+                               'md5filename' => md5($identifyResult[3]),
+                               'tstamp' => time(),
+                               'filename' => $identifyResult[3],
+                               'imagewidth' => $identifyResult[0],
+                               'imageheight' => $identifyResult[1],
+                       );
+                       $TYPO3_DB->exec_INSERTquery('cache_imagesizes', $fieldArr);
+                       if (!$err = $TYPO3_DB->sql_error())     {
+                               return true;
+                       }
+               }
+               return false;
+       }
+
+       /**
+        * Fetch the cached imageDimensions from the MySQL database. Does not check if the image file exists!
+        *
+        * @param       string          The image filepath
+        * @return      array           Returns an array where [0]/[1] is w/h, [2] is extension and [3] is the filename.
+        * @author      Michael Stucki <mundaun@gmx.ch> / Robert Lemke <rl@robertlemke.de>
+        */
+       function getCachedImageDimensions($imageFile)   {
+               global $TYPO3_DB;
+                       // Create a md5 hash of the filename
+               if(function_exists('md5_file')) {
+                       $md5Hash = md5_file($imageFile);
+               } else {
+                       $md5Hash = md5(t3lib_div::getURL ($imageFile));
+               }
+               ereg('([^\.]*)$',$imageFile,$reg);
+               $res = $TYPO3_DB->exec_SELECTquery ('md5hash, imagewidth, imageheight', 'cache_imagesizes', 'md5filename="'.md5($imageFile).'"');
+               if ($res) {
+                       if ($row = $TYPO3_DB->sql_fetch_assoc($res)) {
+                               if ($row['md5hash']!=$md5Hash) {
+                                               // file has changed, delete the row
+                                       $TYPO3_DB->exec_DELETEquery ('cache_imagesizes', 'md5hash="'.$TYPO3_DB->quoteStr($row['md5hash'], 'cache_imagesizes').'"');
+                               } else {
+                                       return (array($row['imagewidth'], $row['imageheight'], strtolower($reg[0]), $imageFile));
+                               }
+                       }
+               }
+               return false;
        }
 
        /**
         * Get numbers for scaling the image based on input
-        * 
+        *
         * @param       array           Current image information: Width, Height etc.
         * @param       integer         "required" width
         * @param       integer         "required" height
         * @param       array           Options: Keys are like "maxW", "maxH", "minW", "minH"
-        * @return      array           
+        * @return      array
         * @access private
         * @see imageMagickConvert()
         */
@@ -1877,7 +1964,7 @@ class t3lib_stdGraphic    {
                $out['origW']=$w;
                $out['origH']=$h;
                $out['max'] = $max;
-               
+
                if (!$this->mayScaleUp) {
                        if ($w>$info[0]){$w=$info[0];}
                        if ($h>$info[1]){$h=$info[1];}
@@ -1919,13 +2006,13 @@ class t3lib_stdGraphic  {
                        }
                        $out[1]=$options['minH'];
                }
-               
+
                return $out;
        }
 
        /**
-        * Used to check if a certain process of scaling an image is already being carried out (can be logged in the MySQL database)
-        * 
+        * Used to check if a certain process of scaling an image is already being carried out (can be logged in the SQL database)
+        *
         * @param       string          Output imagefile
         * @param       string          Original basis file
         * @return      boolean         Returns true if the file is already being made; thus "true" means "Don't render the image again"
@@ -1937,18 +2024,22 @@ class t3lib_stdGraphic  {
                                return 1;
                        } else {        // If not, we look up in the cache_typo3temp_log table to see if there is a image being rendered right now.
                                $md5Hash=md5($output);
-                               $query='SELECT md5hash FROM cache_typo3temp_log WHERE md5hash="'.$md5Hash.'" AND tstamp>'.(time()-30);
-                               $res=mysql(TYPO3_db,$query);
-                               echo mysql_error();
-                               if ($row=mysql_fetch_assoc($res))       {       // If there was a record, the image is being generated by another proces (we assume)
+                               $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('md5hash', 'cache_typo3temp_log', 'md5hash="'.$GLOBALS['TYPO3_DB']->quoteStr($md5Hash, 'cache_typo3temp_log').'" AND tstamp>'.(time()-30));
+                               if ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {       // If there was a record, the image is being generated by another proces (we assume)
                                        if (is_object($GLOBALS['TSFE']))        $GLOBALS['TSFE']->set_no_cache();       // ...so we set no_cache, because we dont want this page (which will NOT display an image...!) to be cached! (Only a page with the correct image on...)
                                        if (is_object($GLOBALS['TT']))  $GLOBALS['TT']->setTSlogMessage('typo3temp_log: Assume this file is being rendered now: '.$output);
                                        return 2;       // Return 'success - 2'
-                               } else {                // If the current time is more than 30 seconds since this record was written, we clear the record, write a new and render the image. 
-                                       $query='DELETE FROM cache_typo3temp_log WHERE md5hash="'.$md5Hash.'"';
-                                       $res=mysql(TYPO3_db,$query);
-                                       $query='INSERT INTO cache_typo3temp_log (md5hash,tstamp,filename,orig_filename) VALUES ("'.$md5Hash.'",'.time().',"'.addslashes($output).'","'.addslashes($orig).'")';
-                                       $res=mysql(TYPO3_db,$query);
+                               } else {                // If the current time is more than 30 seconds since this record was written, we clear the record, write a new and render the image.
+
+                                       $insertFields = array(
+                                               'md5hash' => $md5Hash,
+                                               'tstamp' => time(),
+                                               'filename' => $output,
+                                               'orig_filename' => $orig
+                                       );
+                                       $GLOBALS['TYPO3_DB']->exec_DELETEquery('cache_typo3temp_log', 'md5hash="'.$GLOBALS['TYPO3_DB']->quoteStr($md5Hash, 'cache_typo3temp_log').'"');
+                                       $GLOBALS['TYPO3_DB']->exec_INSERTquery('cache_typo3temp_log', $insertFields);
+
                                        if (is_object($GLOBALS['TT']))  $GLOBALS['TT']->setTSlogMessage('typo3temp_log: The row did not exist, so a new is written and file is being processed: '.$output);
                                        return 0;
                                }
@@ -1984,9 +2075,9 @@ class t3lib_stdGraphic    {
        /**
         * Returns an array where [0]/[1] is w/h, [2] is extension and [3] is the filename.
         * Using ImageMagick
-        * 
+        *
         * @param       string          The absolute image filepath
-        * @return      array           
+        * @return      array
         */
        function imageMagickIdentify($imagefile)        {
                if (!$this->NO_IMAGE_MAGICK)    {
@@ -2015,7 +2106,7 @@ class t3lib_stdGraphic    {
        /**
         * Executes a ImageMagick "convert" on two filenames, $input and $output using $params before them.
         * Can be used for many things, mostly scaling and effects.
-        * 
+        *
         * @param       string          The absolute image filepath, input file (read from)
         * @param       string          The absolute image filepath, output filename (written to)
         * @param       string          ImageMagick parameters
@@ -2025,33 +2116,33 @@ class t3lib_stdGraphic  {
                if (!$this->NO_IMAGE_MAGICK)    {
                        $cmd = $this->imageMagickPath.'convert '.$params.' '.$this->wrapFileName($input).' '.$this->wrapFileName($output);
                        $this->IM_commands[] = Array ($output,$cmd);
-                       return exec($cmd);      
+                       return exec($cmd);
                }
        }
 
        /**
         * Executes a ImageMagick "combine" (or composite in newer times) on four filenames - $input, $overlay and $mask as input files and $output as the output filename (written to)
         * Can be used for many things, mostly scaling and effects.
-        * 
+        *
         * @param       string          The absolute image filepath, bottom file
         * @param       string          The absolute image filepath, overlay file (top)
         * @param       string          The absolute image filepath, the mask file (grayscale)
         * @param       string          The absolute image filepath, output filename (written to)
-        * @return      void            
+        * @return      void
         */
        function combineExec($input,$overlay,$mask,$output)     {
                if (!$this->NO_IMAGE_MAGICK)    {
                        $cmd = $this->imageMagickPath.$this->combineScript.' -compose over '.$this->wrapFileName($input).' '.$this->wrapFileName($overlay).' '.$this->wrapFileName($mask).' '.$this->wrapFileName($output);
                        $this->IM_commands[] = Array ($output,$cmd);
-                       exec($cmd);     
+                       exec($cmd);
                }
        }
 
        /**
         * Wrapping the input filename in double-quotes
-        * 
+        *
         * @param       string          Input filename
-        * @return      string          The outpute wrapped in ""
+        * @return      string          The output wrapped in "" (if there are spaces in the filepath)
         * @access private
         */
        function wrapFileName($inputName)       {
@@ -2091,7 +2182,7 @@ class t3lib_stdGraphic    {
 
        /**
         * Returns true if the input file existed
-        * 
+        *
         * @param       string          Input file to check
         * @return      string          Returns the filename if the file existed, otherwise empty.
         */
@@ -2105,10 +2196,10 @@ class t3lib_stdGraphic  {
 
        /**
         * Applies an ImageMagick parameter to a GDlib image pointer resource by writing the resource to file, performing an IM operation upon it and reading back the result into the ImagePointer.
-        * 
+        *
         * @param       pointer         The image pointer (reference)
         * @param       string          The ImageMagick parameters. Like effects, scaling etc.
-        * @return      void            
+        * @return      void
         */
        function applyImageMagickToPHPGif(&$im, $command)       {
                $tmpStr = $this->randomName();
@@ -2121,7 +2212,7 @@ class t3lib_stdGraphic    {
                        $im = $tmpImg;
                        $this->w = imagesx($im);
                        $this->h = imagesy($im);
-               }       
+               }
                if (!$this->dontUnlinkTempFiles)        {
                        unlink($theFile);
                }
@@ -2130,7 +2221,7 @@ class t3lib_stdGraphic    {
        /**
         * Returns an image extension for an output image based on the number of pixels of the output and the file extension of the original file.
         * For example: If the number of pixels exceeds $this->pixelLimitGif (normally 10000) then it will be a "jpg" string in return.
-        * 
+        *
         * @param       string          The file extension, lowercase.
         * @param       integer         The width of the output image.
         * @param       integer         The height of the output image.
@@ -2148,7 +2239,7 @@ class t3lib_stdGraphic    {
         * Writing the internal image pointer, $this->im, to file based on the extension of the input filename
         * Used in GIFBUILDER
         * Uses $this->setup['reduceColors'] for gif/png images and $this->setup['quality'] for jpg images to reduce size/quality if needed.
-        * 
+        *
         * @param       string          The filename to write to.
         * @return      string          Returns input filename
         * @see tslib_gifBuilder::gifBuild()
@@ -2193,8 +2284,8 @@ class t3lib_stdGraphic    {
 
        /**
         * Destroy internal image pointer, $this->im
-        * 
-        * @return      void            
+        *
+        * @return      void
         * @see tslib_gifBuilder::gifBuild()
         */
        function destroy()      {
@@ -2203,7 +2294,7 @@ class t3lib_stdGraphic    {
 
        /**
         * Returns Image Tag for input image information array.
-        * 
+        *
         * @param       array           Image information array, key 0/1 is width/height and key 3 is the src value
         * @return      string          Image tag for the input image information array.
         */
@@ -2213,10 +2304,10 @@ class t3lib_stdGraphic  {
 
        /**
         * Writes the input GDlib image pointer to file
-        * 
+        *
         * @param       pointer         The GDlib image resource pointer
         * @param       string          The filename to write to
-        * @return      ?               The output of either imageGif or imagePng based on whether the $this->gifExtension was set to "gif" or "png"
+        * @return      mixed           The output of either imageGif or imagePng based on whether the $this->gifExtension was set to "gif" or "png"
         * @see maskImageOntoImage(), scale(), output()
         */
        function ImageGif($destImg, $theImage)  {
@@ -2232,7 +2323,7 @@ class t3lib_stdGraphic    {
        /**
         * Creates a new GDlib image resource based on the input image filename.
         * If it fails creating a image from the input file a blank gray image with the dimensions of the input image will be created instead.
-        * 
+        *
         * @param       string          Image filename
         * @return      pointer         Image Resource pointer
         */