From de44c0b7855aa4d3353c3eddb3abe37971c52be4 Mon Sep 17 00:00:00 2001 From: Pig Fang Date: Thu, 21 May 2020 18:33:01 +0800 Subject: [PATCH] add fallback for creating avatar and preview --- app/Http/Controllers/TextureController.php | 12 +++++++----- .../ControllersTest/TextureControllerTest.php | 11 ++++++++++- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/app/Http/Controllers/TextureController.php b/app/Http/Controllers/TextureController.php index 364a861a..ec350d02 100644 --- a/app/Http/Controllers/TextureController.php +++ b/app/Http/Controllers/TextureController.php @@ -43,6 +43,7 @@ class TextureController extends Controller { $texture = Texture::findOrFail($tid); $hash = $texture->hash; + $usePNG = $request->has('png') || !(imagetypes() & IMG_WEBP); $disk = Storage::disk('textures'); abort_if($disk->missing($hash), 404); @@ -52,7 +53,7 @@ class TextureController extends Controller $response = Cache::remember( 'preview-t'.$tid, option('enable_preview_cache') ? $now->addYear() : $now->addMinute(), - function () use ($minecraft, $disk, $texture, $hash, $height) { + function () use ($minecraft, $disk, $texture, $hash, $height, $usePNG) { $file = $disk->get($hash); if ($texture->type === 'cape') { $image = $minecraft->renderCape($file, $height); @@ -63,7 +64,7 @@ class TextureController extends Controller $lastModified = $disk->lastModified($hash); return Image::make($image) - ->response('webp', 100) + ->response($usePNG ? 'png' : 'webp', 100) ->setLastModified(Carbon::createFromTimestamp($lastModified)); } ); @@ -120,12 +121,13 @@ class TextureController extends Controller { $size = (int) $request->query('size', 100); $mode = $request->has('3d') ? '3d' : '2d'; + $usePNG = $request->has('png') || !(imagetypes() & IMG_WEBP); $disk = Storage::disk('textures'); if (is_null($texture) || $disk->missing($texture->hash)) { return Image::make(resource_path("misc/textures/avatar$mode.png")) ->resize($size, $size) - ->response('webp', 100); + ->response($usePNG ? 'png' : 'webp', 100); } $hash = $texture->hash; @@ -133,7 +135,7 @@ class TextureController extends Controller $response = Cache::remember( 'avatar-'.$mode.'-t'.$texture->tid.'-s'.$size, option('enable_avatar_cache') ? $now->addYear() : $now->addMinute(), - function () use ($minecraft, $disk, $hash, $size, $mode) { + function () use ($minecraft, $disk, $hash, $size, $mode, $usePNG) { $file = $disk->get($hash); if ($mode === '3d') { $image = $minecraft->render3dAvatar($file, 25); @@ -145,7 +147,7 @@ class TextureController extends Controller return Image::make($image) ->resize($size, $size) - ->response('webp', 100) + ->response($usePNG ? 'png' : 'webp', 100) ->setLastModified($lastModified); } ); diff --git a/tests/HttpTest/ControllersTest/TextureControllerTest.php b/tests/HttpTest/ControllersTest/TextureControllerTest.php index d8f68d75..a5f4fcf5 100644 --- a/tests/HttpTest/ControllersTest/TextureControllerTest.php +++ b/tests/HttpTest/ControllersTest/TextureControllerTest.php @@ -57,7 +57,11 @@ class TextureControllerTest extends TestCase $this->get('/preview/'.$skin->tid)->assertNotFound(); $disk->put($skin->hash, ''); - $this->get('/preview/'.$skin->tid)->assertHeader('Content-Type', 'image/webp'); + $this->get('/preview/'.$skin->tid) + ->assertHeader('Content-Type', 'image/webp'); + Cache::clear(); + $this->get('/preview/'.$skin->tid.'?png') + ->assertHeader('Content-Type', 'image/png'); $this->assertTrue(Cache::has('preview-t'.$skin->tid)); $cape = factory(Texture::class)->states('cape')->create(); @@ -124,6 +128,11 @@ class TextureControllerTest extends TestCase $this->assertEquals(100, $image->width()); $this->assertEquals(100, $image->height()); + Cache::clear(); + $this->get('/avatar/player/'.$player->name.'?png=true') + ->assertSuccessful() + ->assertHeader('Content-Type', 'image/png'); + $image = $this->get('/avatar/player/'.$player->name.'?size=50')->getContent(); $image = Image::make($image); $this->assertEquals(50, $image->width());