Project

General

Profile

Bug #17107 » bug_5186.patch

Administrator Admin, 2010-10-06 10:10

View differences:

/typo3/sysext/css_styled_content/pi1/class.tx_cssstyledcontent_pi1.php (working copy)
}
/**
* returns an array containing width relations for $colCount columns.
*
* tries to use "colRelations" setting given by TS.
* uses "1:1" column relations by default.
*
* @param array $conf TS configuration for img
* @param int $colCount number of columns
* @return array
*/
protected function getImgColumnRelations($conf, $colCount) {
$equalRelations= array_fill(0, $colCount, 1);
$colRelationsTS = trim($this->cObj->stdWrap($conf['colRelations'],$conf['colRelations.']));
if (!$colRelationsTS) {
return $equalRelations;
}
// try to use column width relations given by TS
$rel_parts = explode(':', $colRelationsTS);
if (count($rel_parts) < $colCount) {
// not enough column relations given -> ignore it
return $equalRelations;
}
$out = array();
for ($a = 0; $a < $colCount; $a++) {
$out[$a]= intval($rel_parts[$a]);
if ($out[$a] < 1) {
return $equalRelations;
}
}
if (max($out) / min($out) > 10) {
return $equalRelations;
}
return $out;
}
/**
* returns an array containing the image widths for an image row with $colCount columns.
*
* @param array $conf TS configuration of img
* @param int $colCount number of columns
* @param int $netW max usuable width for images (without spacers and borders)
* @return array
*/
protected function getImgColumnWidths($conf, $colCount, $netW) {
$columnWidths = array();
$colRelations = $this->getImgColumnRelations($conf, $colCount);
$accumWidth = 0;
$accumDesiredWidth = 0;
$relUnitCount= array_sum($colRelations);
for ($a = 0; $a < $colCount; $a++) {
$availableWidth= $netW - $accumWidth; // this much width is available for the remaining images in this row (int)
$desiredWidth= $netW / $relUnitCount * $colRelations[$a]; // theoretical width of resized image. (float)
$accumDesiredWidth+= $desiredWidth; // add this width. $accumDesiredWidth becomes the desired horizontal position
// calculate width by comparing actual and desired horizontal position.
// this evenly distributes rounding errors across all images in this row.
$suggestedWidth= round($accumDesiredWidth - $accumWidth);
$finalImgWidth= (int) min($availableWidth, $suggestedWidth); // finalImgWidth may not exceed $availableWidth
$accumWidth+= $finalImgWidth;
$columnWidths[$a] = $finalImgWidth;
}
return $columnWidths;
}
/**
* Rendering the IMGTEXT content element, called from TypoScript (tt_content.textpic.20)
*
* @param string Content input. Not used, ignore.
......
}
}
// All columns have the same width:
$defaultColumnWidth = ceil(($maxW-$colspacing*($colCount-1)-$colCount*$border*($borderThickness+$borderSpace)*2)/$colCount);
// max usuable width for images (without spacers and borders)
$netW = $maxW - $colspacing * ($colCount - 1) - $colCount * $border * ($borderThickness + $borderSpace) * 2;
// Specify the maximum width for each column
$columnWidths = array();
$colRelations = trim($this->cObj->stdWrap($conf['colRelations'],$conf['colRelations.']));
if (!$colRelations) {
// Default 1:1-proportion, all columns same width
for ($a=0;$a<$colCount;$a++) {
$columnWidths[$a] = $defaultColumnWidth;
}
} else {
// We need another proportion
$rel_parts = explode(':',$colRelations);
$rel_total = 0;
for ($a=0;$a<$colCount;$a++) {
$rel_parts[$a] = intval($rel_parts[$a]);
$rel_total+= $rel_parts[$a];
}
if ($rel_total) {
for ($a=0;$a<$colCount;$a++) {
$columnWidths[$a] = round(($defaultColumnWidth*$colCount)/$rel_total*$rel_parts[$a]);
}
if (min($columnWidths)<=0 || max($rel_parts)/min($rel_parts)>10) {
// The difference in size between the largest and smalles must be within a factor of ten.
for ($a=0;$a<$colCount;$a++) {
$columnWidths[$a] = $defaultColumnWidth;
}
}
}
}
$columnWidths = $this->getImgColumnWidths($conf, $colCount, $netW);
$image_compression = intval($this->cObj->stdWrap($conf['image_compression'],$conf['image_compression.']));
$image_effects = intval($this->cObj->stdWrap($conf['image_effects'],$conf['image_effects.']));
$image_frames = intval($this->cObj->stdWrap($conf['image_frames.']['key'],$conf['image_frames.']['key.']));
......
$gifCreator = t3lib_div::makeInstance('tslib_gifbuilder');
$gifCreator->init();
$relations_cols = Array();
$imgWidths = array(); // contains the individual width of all images after scaling to $equalHeight
for ($a=0; $a<$imgCount; $a++) {
$imgKey = $a+$imgStart;
$imgInfo = $gifCreator->getImageDimensions($imgPath.$imgs[$imgKey]);
$rel = $imgInfo[1] / $equalHeight; // relationship between the original height and the wished height
if ($rel) { // if relations is zero, then the addition of this value is omitted as the image is not expected to display because of some error.
$relations_cols[floor($a/$colCount)] += $imgInfo[0]/$rel; // counts the total width of the row with the new height taken into consideration.
$imgWidths[$a] = $imgInfo[0] / $rel;
$relations_cols[floor($a/$colCount)] += $imgWidths[$a]; // counts the total width of the row with the new height taken into consideration.
}
}
}
......
$imageRowsFinalWidths = Array(); // contains the width of every image row
$imgsTag = array(); // array index of $imgsTag will be the same as in $imgs, but $imgsTag only contains the images that are actually shown
$origImages = array();
$rowIdx = 0;
for ($a=0; $a<$imgCount; $a++) {
$imgKey = $a+$imgStart;
$totalImagePath = $imgPath.$imgs[$imgKey];
......
$imgConf = $conf[$imgObjNum.'.'];
if ($equalHeight) {
$scale = 1;
$totalMaxW = $defaultColumnWidth*$colCount;
$rowTotalMaxW = $relations_cols[floor($a/$colCount)];
if ($rowTotalMaxW > $totalMaxW) {
$scale = $rowTotalMaxW / $totalMaxW;
if ($a % $colCount == 0) {
// a new row startsS
$accumWidth = 0; // reset accumulated net width
$accumDesiredWidth = 0; // reset accumulated desired width
$rowTotalMaxW = $relations_cols[$rowIdx];
if ($rowTotalMaxW > $netW) {
$scale = $rowTotalMaxW / $netW;
} else {
$scale = 1;
}
$desiredHeight = $equalHeight / $scale;
$rowIdx++;
}
$availableWidth= $netW - $accumWidth; // this much width is available for the remaining images in this row (int)
$desiredWidth= $imgWidths[$a] / $scale; // theoretical width of resized image. (float)
$accumDesiredWidth+= $desiredWidth; // add this width. $accumDesiredWidth becomes the desired horizontal position
// calculate width by comparing actual and desired horizontal position.
// this evenly distributes rounding errors across all images in this row.
$suggestedWidth= round($accumDesiredWidth - $accumWidth);
$finalImgWidth= (int) min($availableWidth, $suggestedWidth); // finalImgWidth may not exceed $availableWidth
$accumWidth+= $finalImgWidth;
$imgConf['file.']['width'] = $finalImgWidth;
$imgConf['file.']['height'] = round($desiredHeight);
// transfer info to the imageObject. Please note, that
$imgConf['file.']['height'] = round($equalHeight/$scale);
// other stuff will be calculated accordingly:
unset($imgConf['file.']['width']);
unset($imgConf['file.']['maxW']);
unset($imgConf['file.']['maxH']);
unset($imgConf['file.']['minW']);
(10-10/12)