Skip to content

Commit

Permalink
Only generate previews in powers of 4 and set min
Browse files Browse the repository at this point in the history
Before we'd round up all preview request to their nearest power of two.
This resulted still in a lot of possible images. Generating a lot of
server load and taking up a lot of space.

This moves it to previews to be powers of 4: 64, 256, 1024 and 4096
Also the first two powers are always skipped (4, 16) as it doesn't make
sense to generate previews for that.

We cache preview pretty agressively and I feel this is a better
tradeoff.

Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
  • Loading branch information
rullzer committed Oct 31, 2018
1 parent 6543655 commit ce10f8b
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 15 deletions.
18 changes: 11 additions & 7 deletions lib/private/Preview/Generator.php
Original file line number Diff line number Diff line change
Expand Up @@ -298,19 +298,23 @@ private function calculateSize($width, $height, $crop, $mode, $maxWidth, $maxHei

if ($height !== $maxHeight && $width !== $maxWidth) {
/*
* Scale to the nearest power of two
* Scale to the nearest power of four
*/
$pow2height = 2 ** ceil(log($height) / log(2));
$pow2width = 2 ** ceil(log($width) / log(2));
$pow4height = 4 ** ceil(log($height) / log(4));
$pow4width = 4 ** ceil(log($width) / log(4));

$ratioH = $height / $pow2height;
$ratioW = $width / $pow2width;
// Minimum size is 64
$pow4height = max($pow4height, 64);
$pow4width = max($pow4width, 64);

$ratioH = $height / $pow4height;
$ratioW = $width / $pow4width;

if ($ratioH < $ratioW) {
$width = $pow2width;
$width = $pow4width;
$height /= $ratioW;
} else {
$height = $pow2height;
$height = $pow4height;
$width /= $ratioH;
}
}
Expand Down
22 changes: 14 additions & 8 deletions tests/lib/Preview/GeneratorTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ public function testGetCachedPreview() {
$previewFile = $this->createMock(ISimpleFile::class);

$previewFolder->method('getFile')
->with($this->equalTo('128-128.png'))
->with($this->equalTo('256-256.png'))
->willReturn($previewFile);

$this->eventDispatcher->expects($this->once())
Expand Down Expand Up @@ -212,7 +212,7 @@ public function testGetNewPreview() {
->will($this->returnCallback(function($filename) use ($maxPreview, $previewFile) {
if ($filename === '2048-2048-max.png') {
return $maxPreview;
} else if ($filename === '128-128.png') {
} else if ($filename === '256-256.png') {
return $previewFile;
}
$this->fail('Unexpected file');
Expand All @@ -223,7 +223,7 @@ public function testGetNewPreview() {
->with($this->equalTo('my data'));

$previewFolder->method('getFile')
->with($this->equalTo('128-128.png'))
->with($this->equalTo('256-256.png'))
->willThrowException(new NotFoundException());

$image = $this->createMock(IImage::class);
Expand All @@ -233,7 +233,7 @@ public function testGetNewPreview() {

$image->expects($this->once())
->method('resize')
->with(128);
->with(256);
$image->method('data')
->willReturn('my resized data');
$image->method('valid')->willReturn(true);
Expand Down Expand Up @@ -328,8 +328,8 @@ public function dataSize() {
return [
[1024, 2048, 512, 512, false, IPreview::MODE_FILL, 256, 512],
[1024, 2048, 512, 512, false, IPreview::MODE_COVER, 512, 1024],
[1024, 2048, 512, 512, true, IPreview::MODE_FILL, 512, 512],
[1024, 2048, 512, 512, true, IPreview::MODE_COVER, 512, 512],
[1024, 2048, 512, 512, true, IPreview::MODE_FILL, 1024, 1024],
[1024, 2048, 512, 512, true, IPreview::MODE_COVER, 1024, 1024],

[1024, 2048, -1, 512, false, IPreview::MODE_COVER, 256, 512],
[1024, 2048, 512, -1, false, IPreview::MODE_FILL, 512, 1024],
Expand All @@ -343,14 +343,20 @@ public function dataSize() {

[2048, 1024, 512, 512, false, IPreview::MODE_FILL, 512, 256],
[2048, 1024, 512, 512, false, IPreview::MODE_COVER, 1024, 512],
[2048, 1024, 512, 512, true, IPreview::MODE_FILL, 512, 512],
[2048, 1024, 512, 512, true, IPreview::MODE_COVER, 512, 512],
[2048, 1024, 512, 512, true, IPreview::MODE_FILL, 1024, 1024],
[2048, 1024, 512, 512, true, IPreview::MODE_COVER, 1024, 1024],

[2048, 1024, -1, 512, false, IPreview::MODE_FILL, 1024, 512],
[2048, 1024, 512, -1, false, IPreview::MODE_COVER, 512, 256],

[2048, 1024, 4096, 1024, true, IPreview::MODE_FILL, 2048, 512],
[2048, 1024, 4096, 1024, true, IPreview::MODE_COVER, 2048, 512],

//Test minimum size
[2048, 1024, 32, 32, false, IPreview::MODE_FILL, 64, 32],
[2048, 1024, 32, 32, false, IPreview::MODE_COVER, 64, 32],
[2048, 1024, 32, 32, true, IPreview::MODE_FILL, 64, 64],
[2048, 1024, 32, 32, true, IPreview::MODE_COVER, 64, 64],
];
}

Expand Down

2 comments on commit ce10f8b

@dgtlmoon

This comment was marked as off-topic.

@kesselb

This comment was marked as off-topic.

Please sign in to comment.