Skip to content

Commit

Permalink
Add tests for progessive jpeg encoding
Browse files Browse the repository at this point in the history
  • Loading branch information
olivervogel committed Mar 26, 2024
1 parent 907df86 commit 4b2891f
Show file tree
Hide file tree
Showing 3 changed files with 81 additions and 0 deletions.
57 changes: 57 additions & 0 deletions tests/Traits/CanDetectProgressiveJpeg.php
@@ -0,0 +1,57 @@
<?php

declare(strict_types=1);

namespace Intervention\Image\Tests\Traits;

use Intervention\Image\Traits\CanBuildFilePointer;

trait CanDetectProgressiveJpeg
{
use CanBuildFilePointer;

/**
* Checks if the given image data is progressive encoded Jpeg format
*
* @param string $imagedata
* @return bool
*/
private function isProgressiveJpeg(string $imagedata): bool
{
$f = $this->buildFilePointer($imagedata);

while (!feof($f)) {
if (unpack('C', fread($f, 1))[1] !== 0xff) {
return false;
}

$blockType = unpack('C', fread($f, 1))[1];

switch (true) {
case $blockType == 0xd8:
case $blockType >= 0xd0 && $blockType <= 0xd7:
break;

case $blockType == 0xc0:
fclose($f);
return false;

case $blockType == 0xc2:
fclose($f);
return true;

case $blockType == 0xd9:
break 2;

default:
$blockSize = unpack('n', fread($f, 2))[1];
fseek($f, $blockSize - 2, SEEK_CUR);
break;
}
}

fclose($f);

return false;
}
}
12 changes: 12 additions & 0 deletions tests/Unit/Drivers/Gd/Encoders/JpegEncoderTest.php
Expand Up @@ -8,17 +8,29 @@
use PHPUnit\Framework\Attributes\RequiresPhpExtension;
use Intervention\Image\Encoders\JpegEncoder;
use Intervention\Image\Tests\GdTestCase;
use Intervention\Image\Tests\Traits\CanDetectProgressiveJpeg;

#[RequiresPhpExtension('gd')]
#[CoversClass(\Intervention\Image\Encoders\JpegEncoder::class)]
#[CoversClass(\Intervention\Image\Drivers\Gd\Encoders\JpegEncoder::class)]
final class JpegEncoderTest extends GdTestCase
{
use CanDetectProgressiveJpeg;

public function testEncode(): void
{
$image = $this->createTestImage(3, 2);
$encoder = new JpegEncoder(75);
$result = $encoder->encode($image);
$this->assertMediaType('image/jpeg', (string) $result);
}

public function testEncodeProgressive(): void
{
$image = $this->createTestImage(3, 2);
$encoder = new JpegEncoder(progressive: true);
$result = $encoder->encode($image);
$this->assertMediaType('image/jpeg', (string) $result);
$this->assertTrue($this->isProgressiveJpeg((string) $result));
}
}
12 changes: 12 additions & 0 deletions tests/Unit/Drivers/Imagick/Encoders/JpegEncoderTest.php
Expand Up @@ -8,17 +8,29 @@
use PHPUnit\Framework\Attributes\RequiresPhpExtension;
use Intervention\Image\Encoders\JpegEncoder;
use Intervention\Image\Tests\ImagickTestCase;
use Intervention\Image\Tests\Traits\CanDetectProgressiveJpeg;

#[RequiresPhpExtension('imagick')]
#[CoversClass(\Intervention\Image\Encoders\JpegEncoder::class)]
#[CoversClass(\Intervention\Image\Drivers\Imagick\Encoders\JpegEncoder::class)]
final class JpegEncoderTest extends ImagickTestCase
{
use CanDetectProgressiveJpeg;

public function testEncode(): void
{
$image = $this->createTestImage(3, 2);
$encoder = new JpegEncoder(75);
$result = $encoder->encode($image);
$this->assertMediaType('image/jpeg', (string) $result);
}

public function testEncodeProgressive(): void
{
$image = $this->createTestImage(3, 2);
$encoder = new JpegEncoder(progressive: true);
$result = $encoder->encode($image);
$this->assertMediaType('image/jpeg', (string) $result);
$this->assertTrue($this->isProgressiveJpeg((string) $result));
}
}

0 comments on commit 4b2891f

Please sign in to comment.