Index: t3lib/class.t3lib_stdgraphic.php
===================================================================
--- t3lib/class.t3lib_stdgraphic.php	(Revision 5382)
+++ t3lib/class.t3lib_stdgraphic.php	(Arbeitskopie)
@@ -616,7 +616,8 @@
 					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, $conf['splitRendering.']);
 					} else {
-						$this->ImageTTFTextWrapper($im, $conf['fontSize'], $conf['angle'], $txtPos[0], $txtPos[1], $Fcolor, $conf['fontFile'], $theText, $conf['splitRendering.']);
+						// $this->ImageTTFTextWrapper($im, $conf['fontSize'], $conf['angle'], $txtPos[0], $txtPos[1], $Fcolor, $conf['fontFile'], $theText, $conf['splitRendering.']);
+						$this->renderTTFText($im, $conf['fontSize'], $conf['angle'], $txtPos[0], $txtPos[1], $Fcolor, $conf['fontFile'], $theText, $conf['splitRendering.'], $conf);
 					}
 				}
 			} else {		// NICETEXT::
@@ -641,7 +642,8 @@
 				if ($spacing || $wordSpacing)	{		// If any kind of spacing applys, we use this function:
 					$this->SpacedImageTTFText($maskImg, $conf['fontSize'], $conf['angle'], $txtPos[0], $txtPos[1], $Fcolor, t3lib_stdGraphic::prependAbsolutePath($conf['fontFile']), $theText, $spacing, $wordSpacing, $conf['splitRendering.'],$sF);
 				} else {
-					$this->ImageTTFTextWrapper($maskImg, $conf['fontSize'], $conf['angle'], $txtPos[0], $txtPos[1], $Fcolor, $conf['fontFile'], $theText, $conf['splitRendering.'],$sF);
+					// $this->ImageTTFTextWrapper($maskImg, $conf['fontSize'], $conf['angle'], $txtPos[0], $txtPos[1], $Fcolor, $conf['fontFile'], $theText, $conf['splitRendering.'],$sF);
+					$this->renderTTFText($maskImg, $conf['fontSize'], $conf['angle'], $txtPos[0], $txtPos[1], $Fcolor, $conf['fontFile'], $theText, $conf['splitRendering.'], $conf, $sF);
 				}
 				$this->ImageWrite($maskImg, $fileMask);
 				ImageDestroy($maskImg);
@@ -778,6 +780,9 @@
 			$x = ($charInf[2]-$charInf[0]);
 			$y = ($charInf[1]-$charInf[7]);
 		}
+			// Set original lineHeight (used by line breaks):
+		$theBBoxInfo['lineHeight'] = $y;
+
 		if ($spacing || $wordSpacing)	{		// If any kind of spacing applys, we use this function:
 			$x=0;
 			if (!$spacing && $wordSpacing)	{
@@ -797,19 +802,38 @@
 					$x+=$charW+(($char==' ')?$wordSpacing:$spacing);
 				}
 			}
+		} elseif (isset($conf['breakWidth']) && $conf['breakWidth'] && $this->getRenderedTextWidth($conf['text'], $conf) > $conf['breakWidth']) {
+			$maxWidth = 0;
+			$currentWidth = 0;
+			$breakWidth = $conf['breakWidth'];
+			$breakSpace = $this->getBreakSpace($conf, $theBBoxInfo);
+
+			$wordPairs = $this->getWordPairsForLineBreak($conf['text']);
+				// Iterate through all word pairs:
+			foreach ($wordPairs as $index => $wordPair) {
+				$wordWidth = $this->getRenderedTextWidth($wordPair, $conf);
+				if ($index == 0 || $currentWidth + $wordWidth <= $breakWidth) {
+					$currentWidth+= $wordWidth;
+				} else {
+					$maxWidth = max($maxWidth, $currentWidth);
+					$y+= $breakSpace;
+						// Restart:
+					$currentWidth = $wordWidth;
+				}
+			}
+			$x = max($maxWidth, $currentWidth) * $sF;
 		}
 
-		if ($sF>1) {
-			$x = ceil($x/$sF);
-			$y = ceil($y/$sF);
+		if ($sF > 1) {
+			$x = ceil($x / $sF);
+			$y = ceil($y / $sF);
 			if (is_array($theBBoxInfo))	{
-				reset($theBBoxInfo);
-				while(list($key,$val)=each($theBBoxInfo))	{
-					$theBBoxInfo[$key]=ceil($theBBoxInfo[$key]/$sF);
+				foreach ($theBBoxInfo as &$value) {
+					$value = ceil($value / $sF);
 				}
 			}
 		}
-		return array($x,$y,$theBBoxInfo);
+		return array($x, $y, $theBBoxInfo);
 	}
 
 	/**
@@ -1237,16 +1261,125 @@
 		return $sF;
 	}
 
+	/**
+	 * Renders a regular text and takes care of a possible line break automatically.
+	 *
+	 * @param	pointer		(See argument for PHP function imageTTFtext())
+	 * @param	integer		(See argument for PHP function imageTTFtext())
+	 * @param	integer		(See argument for PHP function imageTTFtext())
+	 * @param	integer		(See argument for PHP function imageTTFtext())
+	 * @param	integer		(See argument for PHP function imageTTFtext())
+	 * @param	integer		(See argument for PHP function imageTTFtext())
+	 * @param	string		(See argument for PHP function imageTTFtext())
+	 * @param	string		(See argument for PHP function imageTTFtext()). UTF-8 string, possibly with entities in.
+	 * @param	array		Split-rendering configuration
+	 * @param	integer		Scale factor
+	 * @param	array		$conf: The configuration
+	 * @return	void
+	 */
+	protected function renderTTFText(&$im, $fontSize, $angle, $x, $y, $color, $fontFile, $string, $splitRendering, $conf, $sF = 1) {
+		if (isset($conf['breakWidth']) && $conf['breakWidth'] && $this->getRenderedTextWidth($string, $conf) > $conf['breakWidth']) {
+			$phrase = '';
+			$currentWidth = 0;
 
+			$breakWidth = $conf['breakWidth'];
+			$breakSpace = $this->getBreakSpace($conf);
 
+			$wordPairs = $this->getWordPairsForLineBreak($string);
+				// Iterate through all word pairs:
+			foreach ($wordPairs as $index => $wordPair) {
+				$wordWidth = $this->getRenderedTextWidth($wordPair, $conf);
+				if ($index == 0 || $currentWidth + $wordWidth <= $breakWidth) {
+					$currentWidth+= $wordWidth;
+					$phrase.= $wordPair;
+				} else {
+						// Render the current phrase that is below breakWidth:
+					$this->ImageTTFTextWrapper($im, $fontSize, $angle, $x, $y, $color, $fontFile, $phrase, $splitRendering, $sF);
+						// Calculate the news height offset:
+					$y+= $breakSpace;
+						// Restart the phrase:
+					$currentWidth = $wordWidth;
+					$phrase = $wordPair;
+				}
+			}
+				// Render the remaining phrase:
+			if ($currentWidth) {
+				$this->ImageTTFTextWrapper($im, $fontSize, $angle, $x, $y, $color, $fontFile, $phrase, $splitRendering, $sF);
+			}
+		} else {
+			$this->ImageTTFTextWrapper($im, $fontSize, $angle, $x, $y, $color, $fontFile, $string, $splitRendering, $sF);
+		}
+	}
 
+	/**
+	 * Gets the word pairs used for automatic line breaks.
+	 *
+	 * @param	string		$string
+	 * @return	array
+	 */
+	protected function getWordPairsForLineBreak($string) {
+		$wordPairs = array();
 
+		$wordsArray = preg_split('#([ -.,!:]+)#', $string, -1,  PREG_SPLIT_DELIM_CAPTURE);
+		$wordsCount = count($wordsArray);
+		for ($index=0; $index < $wordsCount; $index+= 2) {
+			$wordPairs[] = $wordsArray[$index] . $wordsArray[$index + 1];
+		}
 
+		return $wordPairs;
+	}
 
+	/**
+	 * Gets the rendered text width.
+	 *
+	 * @param	string		$text
+	 * @param	array		$conf
+	 * @param	integer		
+	 */
+	protected function getRenderedTextWidth($text, $conf) {
+		$bounds = $this->ImageTTFBBoxWrapper($conf['fontSize'], $conf['angle'], $conf['fontFile'], $this->recodeString($text), $conf['splitRendering.']);
+		if ($conf['angle']< 0) {
+			$pixelWidth = abs($bounds[4]-$bounds[0]);
+		} elseif ($conf['angle'] > 0) {
+			$pixelWidth = abs($bounds[2]-$bounds[6]);
+		} else {
+			$pixelWidth = abs($bounds[4]-$bounds[6]);
+		}
+		return $pixelWidth;
+	}
 
+	/**
+	 * Gets the break space for each new line.
+	 *
+	 * @param	array		$conf: TypoScript configuration for the currently rendered object
+	 * @param	array		$boundingBox: The bounding box the the currently rendered object
+	 * @return	integer		The break space
+	 */
+	protected function getBreakSpace($conf, array $boundingBox = NULL) {
+		if (!isset($boundingBox)) {
+			$boundingBox = $this->calcBBox($conf);
+			$boundingBox = $boundingBox[2];
+		}
 
+		if (isset($conf['breakSpace']) && $conf['breakSpace']) {
+			$breakSpace = $boundingBox['lineHeight'] * $conf['breakSpace'];
+		} else {
+			$breakSpace = $boundingBox['lineHeight'];
+		}
 
+		return $breakSpace;
+	}
 
+
+
+
+
+
+
+
+
+
+
 	/*********************************************
 	 *
 	 * Other GIFBUILDER objects related to TEXT
Index: typo3/sysext/cms/tslib/class.tslib_gifbuilder.php
===================================================================
--- typo3/sysext/cms/tslib/class.tslib_gifbuilder.php	(Revision 5382)
+++ typo3/sysext/cms/tslib/class.tslib_gifbuilder.php	(Arbeitskopie)
@@ -507,9 +507,11 @@
 		}
 		$this->combinedTextStrings[] = strip_tags($conf['text']);
 
-			// Max length = 100
-		$tlen = intval($conf['textMaxLength']) ? intval($conf['textMaxLength']) : 100;
-		$conf['text'] = substr($conf['text'],0,$tlen);
+			// Max length = 100 if automatic line braks are not defined:
+		if (!isset($conf['breakWidth']) || !$conf['breakWidth']) {
+			$tlen = (intval($conf['textMaxLength']) ? intval($conf['textMaxLength']) : 100);
+			$conf['text'] = substr($conf['text'], 0, $tlen);
+		}
 		if ((string)$conf['text']!='')	{
 
 				// Char range map thingie:
@@ -575,7 +577,7 @@
 			if ((string)$val == (string)intval($val)) {
 				$value[$key] = intval($val);
 			} else {
-				$value[$key] = intval($this->calculateValue($val));
+				$value[$key] = $this->calculateValue($val);
 			}
 		}
 
@@ -681,9 +683,13 @@
 						$theVal = $this->objBB[$objParts[0]][0];
 					} elseif ($objParts[1] == 'h') {
 						$theVal = $this->objBB[$objParts[0]][1];
+					} elseif ($objParts[1] == 'lineHeight') {
+						$theVal = $this->objBB[$objParts[0]][2]['lineHeight'];
 					}
 					$theVal = intval($theVal);
 				}
+			} elseif (floatval($theVal)) {
+				$theVal = floatval($theVal);
 			} else {
 				$theVal = 0;
 			}
@@ -701,7 +707,7 @@
 			}
 		}
 
-		return $calculatedValue;
+		return round($calculatedValue);
 	}
 
 	/**
