* (bug 5086) Force image resize dimensions on ImageMagick, as for instance
"-resize 100x35!"; some thumbs were off due to differences in rounding and
would be generated smaller than expected.
+* (bug 5062) Width sometimes one pixel short when using maximum heights
=== Caveats ===
if ($this->canRender()) {
if ( $width > $this->width * $height / $this->height )
- $width = floor( $this->width * $height / $this->height );
- # Note this is the largest width such that the thumbnail's
- # height is at most $height.
-
+ $width = wfFitBoxWidth( $this->width, $this->height, $height );
$thumb = $this->renderThumb( $width );
}
else $thumb= NULL; #not a bitmap or renderable image, don't try.
}
}
+
+/**
+ * Calculate the largest thumbnail width for a given original file size
+ * such that the thumbnail's height is at most $maxHeight.
+ * @param int $boxWidth
+ * @param int $boxHeight
+ * @param int $maxHeight
+ * @return int
+ */
+function wfFitBoxWidth( $boxWidth, $boxHeight, $maxHeight ) {
+ $idealWidth = $boxWidth * $maxHeight / $boxHeight;
+ $roundedUp = ceil( $idealWidth );
+ if( round( $roundedUp * $boxHeight / $boxWidth ) > $maxHeight )
+ return floor( $idealWidth );
+ else
+ return $roundedUp;
+}
+
?>
--- /dev/null
+<?php
+
+require_once( 'PHPUnit.php' );
+require_once( '../includes/Defines.php' );
+require_once( '../includes/Profiling.php' );
+require_once( '../includes/GlobalFunctions.php' );
+require_once( '../includes/Image.php' );
+
+class ImageTest extends PHPUnit_TestCase {
+ function ImageTest( $name ) {
+ $this->PHPUnit_TestCase( $name );
+ }
+
+ function setUp() {
+ }
+
+ function tearDown() {
+ }
+
+ function testFitBoxWidth() {
+ $vals = array(
+ array(
+ 'width' => 50,
+ 'height' => 50,
+ 'tests' => array(
+ 50 => 50,
+ 17 => 17,
+ 18 => 18 ) ),
+ array(
+ 'width' => 366,
+ 'height' => 300,
+ 'tests' => array(
+ 50 => 61,
+ 17 => 21,
+ 18 => 22 ) ),
+ array(
+ 'width' => 300,
+ 'height' => 366,
+ 'tests' => array(
+ 50 => 41,
+ 17 => 14,
+ 18 => 15 ) ),
+ array(
+ 'width' => 100,
+ 'height' => 400,
+ 'tests' => array(
+ 50 => 12,
+ 17 => 4,
+ 18 => 4 ) ) );
+ foreach( $vals as $row ) {
+ extract( $row );
+ foreach( $tests as $max => $expected ) {
+ $y = round( $expected * $height / $width );
+ $result = wfFitBoxWidth( $width, $height, $max );
+ $y2 = round( $result * $height / $width );
+ $this->assertEquals( $expected,
+ $result,
+ "($width, $height, $max) wanted: {$expected}x$y, got: {$result}x$y2" );
+ }
+ }
+ }
+
+ /* TODO: many more! */
+}
+
+?>
\ No newline at end of file
'SearchMySQL4Test',
'ArticleTest',
'SanitizerTest',
- 'CtypeTest'
+ 'CtypeTest',
+ 'ImageTest'
);
+
+if( isset( $_SERVER['argv'][1] ) ) {
+ // to override...
+ $tests = array( $_SERVER['argv'][1] );
+}
+
foreach( $tests as $test ) {
require_once( $test . '.php' );
$suite = new PHPUnit_TestSuite( $test );