From 24a268a12b5ade6e513694e6e7d826f5f0759ee2 Mon Sep 17 00:00:00 2001 From: Jonathon Menz Date: Tue, 9 Jun 2015 16:16:11 -0700 Subject: [PATCH 1/2] FIX Image test cleanup Ensured files referenced by name in tests are actually used, and fixed added support for Flushable interface in image regeneration. Also ensured getters methods are used for width and height. --- model/Image.php | 16 ++++++------ tests/model/DataDifferencerTest.php | 4 +-- tests/model/GDImageTest.php | 15 +----------- tests/model/ImageTest.php | 23 +++++++++++++++--- tests/model/ImageTest.yml | 10 +++++++- tests/model/ImagickImageTest.php | 16 +----------- .../model/testimages/test.image.with.dots.png | Bin 4423 -> 5914 bytes tests/model/testimages/test_image.png | Bin 4423 -> 5914 bytes .../testimages/test_image_high-quality.jpg | Bin 0 -> 151889 bytes .../testimages/test_image_low-quality.jpg | Bin 0 -> 12349 bytes 10 files changed, 40 insertions(+), 44 deletions(-) create mode 100644 tests/model/testimages/test_image_high-quality.jpg create mode 100644 tests/model/testimages/test_image_low-quality.jpg diff --git a/model/Image.php b/model/Image.php index 55c2f632d..31561ade2 100644 --- a/model/Image.php +++ b/model/Image.php @@ -224,13 +224,12 @@ class Image extends File implements Flushable { * @return Image */ public function SetRatioSize($width, $height) { - // Prevent divide by zero on missing/blank file - if(empty($this->width) || empty($this->height)) return null; + if(!$this->getWidth() || !$this->getHeight()) return null; // Check if image is already sized to the correct dimension - $widthRatio = $width / $this->width; - $heightRatio = $height / $this->height; + $widthRatio = $width / $this->getWidth(); + $heightRatio = $height / $this->getHeight(); if( $widthRatio < $heightRatio ) { // Target is higher aspect ratio than image, so check width if($this->isWidth($width) && !Config::inst()->get('Image', 'force_resample')) return $this; @@ -510,7 +509,8 @@ class Image extends File implements Flushable { /** * Generate a resized copy of this image with the given width & height. - * Use in templates with $ResizedImage. + * This can be used in templates with $ResizedImage but should be avoided, + * as it's the only image manipulation function which can skew an image. * * @param integer $width Width to resize to * @param integer $height Height to resize to @@ -648,9 +648,9 @@ class Image extends File implements Flushable { public function regenerateFormattedImages() { if(!$this->Filename) return 0; - // Without this, not a single file would be written - // caused by a check in getFormattedImage() - $_GET['flush'] = 1; + // Without this, not a single file would be written + // caused by a check in getFormattedImage() + $this->flush(); $numGenerated = 0; $generatedImages = $this->getGeneratedImages(); diff --git a/tests/model/DataDifferencerTest.php b/tests/model/DataDifferencerTest.php index b0c9d7490..45ebd87c0 100644 --- a/tests/model/DataDifferencerTest.php +++ b/tests/model/DataDifferencerTest.php @@ -55,8 +55,8 @@ class DataDifferencerTest extends SapphireTest { $differ = new DataDifferencer($obj1v1, $obj1v2); $obj1Diff = $differ->diffedData(); - $this->assertContains($image1->Filename, $obj1Diff->getField('Image')); - $this->assertContains($image2->Filename, $obj1Diff->getField('Image')); + $this->assertContains($image1->Name, $obj1Diff->getField('Image')); + $this->assertContains($image2->Name, $obj1Diff->getField('Image')); $this->assertContains('obj2obj1', str_replace(' ','',$obj1Diff->getField('HasOneRelationID'))); } diff --git a/tests/model/GDImageTest.php b/tests/model/GDImageTest.php index 92e00546c..f950ff977 100644 --- a/tests/model/GDImageTest.php +++ b/tests/model/GDImageTest.php @@ -10,22 +10,9 @@ class GDImageTest extends ImageTest { return; } - parent::setUp(); - Image::set_backend("GDBackend"); - // Create a test files for each of the fixture references - $fileIDs = $this->allFixtureIDs('Image'); - foreach($fileIDs as $fileID) { - $file = DataObject::get_by_id('Image', $fileID); - - $image = imagecreatetruecolor(300,300); - - imagepng($image, BASE_PATH."/{$file->Filename}"); - imagedestroy($image); - - $file->write(); - } + parent::setUp(); } public function tearDown() { diff --git a/tests/model/ImageTest.php b/tests/model/ImageTest.php index a8b5b2124..fe1e467e1 100644 --- a/tests/model/ImageTest.php +++ b/tests/model/ImageTest.php @@ -30,19 +30,30 @@ class ImageTest extends SapphireTest { if(!file_exists(BASE_PATH."/$folder->Filename")) mkdir(BASE_PATH."/$folder->Filename"); } + + // Copy test images for each of the fixture references + $imageIDs = $this->allFixtureIDs('Image'); + foreach($imageIDs as $imageID) { + $image = DataObject::get_by_id('Image', $imageID); + $filePath = BASE_PATH."/$image->Filename"; + $sourcePath = str_replace('assets/ImageTest/', 'framework/tests/model/testimages/', $filePath); + if(!file_exists($filePath)) { + if (!copy($sourcePath, $filePath)) user_error('Failed to copy test images', E_USER_ERROR); + } + } } public function tearDown() { if($this->origBackend) Image::set_backend($this->origBackend); - /* Remove the test files that we've created */ + // Remove the test files that we've created $fileIDs = $this->allFixtureIDs('Image'); foreach($fileIDs as $fileID) { $file = DataObject::get_by_id('Image', $fileID); if($file && file_exists(BASE_PATH."/$file->Filename")) unlink(BASE_PATH."/$file->Filename"); } - /* Remove the test folders that we've crated */ + // Remove the test folders that we've created $folderIDs = $this->allFixtureIDs('Folder'); foreach($folderIDs as $folderID) { $folder = DataObject::get_by_id('Folder', $folderID); @@ -298,6 +309,10 @@ class ImageTest extends SapphireTest { $this->assertTrue(file_exists($p), 'Resized image exists after regeneration call'); } + /** + * Tests that cached images are regenerated properly after a cached file is renamed with new arguments + * ToDo: This doesn't seem like something that is worth testing - what is the point of this? + */ public function testRegenerateImagesWithRenaming() { $image = $this->objFromFixture('Image', 'imageWithMetacharacters'); $image_generated = $image->SetWidth(200); @@ -311,8 +326,8 @@ class ImageTest extends SapphireTest { $newPath = str_replace($oldArgumentString, $newArgumentString, $p); $newRelative = str_replace($oldArgumentString, $newArgumentString, $image_generated->getFileName()); rename($p, $newPath); - $this->assertFalse(file_exists($p), 'Resized image does not exist after movement call under old name'); - $this->assertTrue(file_exists($newPath), 'Resized image exists after movement call under new name'); + $this->assertFalse(file_exists($p), 'Resized image does not exist at old path after renaming'); + $this->assertTrue(file_exists($newPath), 'Resized image exists at new path after renaming'); $this->assertEquals(1, $image->regenerateFormattedImages(), 'Cached images were regenerated in the right number'); diff --git a/tests/model/ImageTest.yml b/tests/model/ImageTest.yml index ac1dfcaf4..b677f2db8 100644 --- a/tests/model/ImageTest.yml +++ b/tests/model/ImageTest.yml @@ -1,6 +1,6 @@ Folder: folder1: - Filename: assets/ImageTest + Filename: assets/ImageTest/ Image: imageWithTitle: Title: This is a image Title @@ -16,3 +16,11 @@ Image: Title: This is a/an image Title Filename: assets/ImageTest/test_image.png Parent: =>Folder.folder1 + lowQualityJPEG: + Title: This is a low quality JPEG + Filename: assets/ImageTest/test_image_low-quality.jpg + Parent: =>Folder.folder1 + highQualityJPEG: + Title: This is a high quality JPEG + Filename: assets/ImageTest/test_image_high-quality.jpg + Parent: =>Folder.folder1 \ No newline at end of file diff --git a/tests/model/ImagickImageTest.php b/tests/model/ImagickImageTest.php index f63827d0b..7e44de3bd 100644 --- a/tests/model/ImagickImageTest.php +++ b/tests/model/ImagickImageTest.php @@ -8,22 +8,8 @@ class ImagickImageTest extends ImageTest { return; } - parent::setUp(); - Image::set_backend("ImagickBackend"); - // Create a test files for each of the fixture references - $fileIDs = $this->allFixtureIDs('Image'); - foreach($fileIDs as $fileID) { - $file = DataObject::get_by_id('Image', $fileID); - - $image = new Imagick(); - - $image->newImage(300,300, new ImagickPixel("white")); - $image->setImageFormat("png"); - $image->writeImage(BASE_PATH."/{$file->Filename}"); - - $file->write(); - } + parent::setUp(); } } diff --git a/tests/model/testimages/test.image.with.dots.png b/tests/model/testimages/test.image.with.dots.png index a95602a86d3d842e97ed84b7ec68ea089b1d7926..21df585207467d911e87c47e66faea81be08c764 100644 GIT binary patch literal 5914 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 YK&msu8ekqi{Ohz@U)va3rU{SuA5qfRumAu6 literal 4423 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 N002ovPDHLkV1lL@mev3O diff --git a/tests/model/testimages/test_image.png b/tests/model/testimages/test_image.png index a95602a86d3d842e97ed84b7ec68ea089b1d7926..abe33e5f55a44956c9aff41a9a86c5c98f57c0ac 100644 GIT binary patch literal 5914 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 N002ovPDHLkV1lL@mev3O diff --git a/tests/model/testimages/test_image_high-quality.jpg b/tests/model/testimages/test_image_high-quality.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f903157843c9e70c77a794fe12cf50a74ff898f4 GIT binary patch literal 151889 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

C9k@T-wl%N}d0ER4S^6AF}yNe%TZ)?_e>EvxH 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≪xVBmBTytVQ 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 literal 0 HcmV?d00001 diff --git a/tests/model/testimages/test_image_low-quality.jpg b/tests/model/testimages/test_image_low-quality.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ccc8346abac51837bfc7ee539e10920a93cb9cf3 GIT binary patch literal 12349 zcmb7n1ys}T+xIp)LImt0 zDIuMl)q_z;!(d$_M6fGD(wSq3XTaXp< zr--ks46DL#t&j&g_aRE2C?rG_Dkgvsf{8%HC801;F>y(8{@?D12ntCE!i5BcB&9@! zrG(&+zX$7$Hk7@Cl!3D9-@0yAGOT|)6%Y^r4G@NUq8tTbl9G~wLU2JiT;N7Rz$eJV z*EUeV!-wr324$oV0_E)G>wFWj-;B0)o_@YEtT&ea<$}AHfwQBNug|~a|1n~yKV^RV z_YX=(=YL1IyZEr2#LLhI%+5VfV|6S2Pg7%1i<-Gh* zZhuC{9wCTyL%Jh9e0^>b5Bt-izx|ccu|>HeZ!&I#@-#6_Uq+X| zi|&Rh_;)G&3DD7z(z^+avxlvlvM0jtw;By)8P*#rsJ*kjl%kN3q_~)*u#h-hNK66- zlaNpnQ;`%?78g;Kge!}||Ka#gSP_^AOjKD^Tvb^_6$VogQBYD+QihAe6vc#_C?ii#w||QDzLTe~r;n4T7exDax>25< z?hs+97=&BL7UAsi`-tavRo(b^`Nu&|_;@)h~M8>@&6Gkcw>w`Lh7&D{QJTvxcUA)b94S( ztWs{a9*#FT5wJ%(*!sEovdaF)K5|d+_uX)FzQO)E`-?{Kzq8-W5r4((Zv}=(?|)Uv z{$E|`|7H72@;BRmG5o3Kzg^CMG~e9#-_w6v&CTN9W`*>)saMoZEBbW=u=}rU2}6Yd z5{eo+xWC&U0KmftGzZ`?aHuhY000mG#0c^QQ2j@*|3Y#6i6YleI}{`3`k8~_`Et%s z!@&OQ7(n)C69d@y-bes{VF57!dOA8TMlM+n4p~J(K|w_|8EI)5wf~O+WaQ!!<`kCU zFeoejq;%kQD#|198B>U;Ti5000MgGye4CuP-1D2p10@ z_~-tA+XetZIJkJ^fZxX;0(@LN99*0m7!UvkvEaZI^eJpvPrM`Hij=r%#SMMa1{vV#F25D*6kg!d=(H#zVI4Wqz0QP8*bPHSL=Q$`l|O>dkk z;{I9&klyfvz&K!l9Nen(yhAY?_vl|V$v9xKn2M4nFxWD&`@fkoVK0~DSAGWc&^ zjj{;b3`KzYzuXZN8l2P!dM0)V{vPL;I#BBU80Rqg9Vw3tDLc3(b&}#3#9=DkIgaAD zb2sL`H;-G5)h&mPwl`*3OcSwB@H~sY)30&qdZKk^I(%;N7XG-aY-6UyJ_@FXI_qX# zUT`4P@|pt`57K`_94fV#yarVVvlP3INe#7Hi4xJ~W=lL4-Fkg$3fVuXqR^;_2R(xW8v8@w7hsqE8D_*jc6*>x=JQvj z%^6c&#Nl4`I2hQ?V^eRh)8;e_DO2rqe>{`OK z?!xyNFC>Y(Iy0PK*$>&jl`s2wCwJdNEBp?zL4BfWlT|)` z5k%odSB4XHO_5xpp3|)s(11}x%qL*A72;>gMdzfkYRmdmWn4Rii9*<(n_ zW0hV!j9~#hsLcIT#X3TT@0@0D*J{Fq_oB*I9+i&3=iXNgaf*Ns6GiMb0zh`veELN3 z(Ja|ZYCgwhl6X&Z~+g zDWMsed-m^CxYPi$>}BFV8BG$ck&4bwMG35juiB`bnq90TS5R?1%X}>- zA6!dbEdeLeBzBZ7M>^Hs(rys!RI#504!5oNzC1|ZlxGD?b-*Xg=Z{EcXIzx8dkMH- zRI34Q!9IJ#Mfc6=E|rnv1En@#j`0-vD@qvf;-1~Ka8jt)5DNR_g6R8;t~Ltbkj!ur zzRBT_a9oi!?}u3Ts|#6Bpc)VTeV$SM#9sg}cWD)?%Z;eyF&#>hNY_ySj0=@anhRSz1Q}DZ=$`$yCwkecN3+F~+6XG+^}!@HjxEFuC0BHh8|ucG!n} zvs%}_H1ySmo%fAM3`sk7^znWM7Yutofvo?r#hs{qY>y z8C)GTynOr)?(=o13TotO)qYt3m6p+#g7p~^3(2JHHg&2kUm-qbOf!t^aNR?Np*Po% z^)~SAi;ow4r+?%EPt5xaptqO?ys8V4QgNzkZz+OQwIo#fwsD-G{!!k$pLH!Ebh=l8 zO4nM$Z7=Ox75pI>ho=cv_iKkwGq@P!(G2!O&TO~dziEEdd8gZlSk6L~|=E4^@-e1;9QHRF31z=xiLE-VM`SR=$)X8n*rjOkdg5AH};|2bvLm)*xQhcM7e zmz2TwA^xKJHrOI3P!>GNpPK#2&2_J@SObwq_C09MqjQ?f>+ay>wa*uhMHcddJ5-=F ztX?zdB$n=-HnOC40pEa~INIwn-qx$%ZW_nU%!xH353KW^Ykcu?1--+7wuo410Jp@D zIv}71*Nq)X$Lc@o-`q1+Y1C2|?rdFu^Jq`g%spCJ%^P1V8xFZ9e9El!Lf%nz;NUL+0{t@eClj4CXq zo!$J5&Z%1&EJ%gK0gjWZ`8`G@PFikX7&eg0+V~O@ocgR}`(0T)BE244^pA_dUmjDxa;c?p2Dt>+3P>d)Z^5(c(ARVKW&$ZmrB zGz86ler@avu9cD6Kh#w|&KoG91dm^K*hDx8PpRGl7ADl#t;-U0Y}S2>#|iDx2Z8(f zhGvGl=%0R&8{^A;28&2i%uq@l@<|ySx_z6^<41!lqF+P3sbdx~&Mjv-01=7dZNH9= zmJo>LPW`w^y$&B#qe9pzLR!y`XXCiuj+ZRVbOXpja$zHv}Ej6tb|#x&J|Ho0%jIkVM|=>ZH|JqHMye#+yq z_ZiGa;&@?s?;`w3!pgL>w7Az;I?gYE)vM0!1&$RN9(XVXLxB^DFZw+jaFoe1I4~9t zp^Wc6WoSV3wa``~ne|fbr$FWrZ`k5@vp@DXdN;B%8WnLpy&n;_`u4T|YKN0@T=OKU zD0{|d)biI#_X^uMYC8p>1`tQ~ zS=-5@12ZCXLL=z5Uu5gwii%qXu1H#V?=uab=QnDTlgncvI|kVsMN3_5zW_CMVby-w zw^+YrgE^&cUz_|mvseyw%ztTYhh$kLfGqR4bL6uIpjaRx3@Lz&^P~8e3bNI@}`5o05%-Pg-VT4cH<5 z?l_8f;oBFC+cG{L16nnc@E_sI9>AdPirJvXW$9887+FBln40K>c+8VCcBXIZAtt55 zq%yO*s1G>$iA5zvrN+@7KE*1pH3iAHd|)2t_TNXk4j^dn=Z+m5<5+Jhywj>?9m1)s zI%3Vq#og^u>z&zhCoN*CHl^CZjM-hC1x14=i|OH-pX??0bW1XqBxeJSit62f74%p9hswgUVAXPS&}*7`!R&^a`>L zB#*O=c72Kj0DAeenA|Z-Ls6?44-~1t)oIVEyig_bAVpUkXzOv8%%D8To5!SM0NNut z$#UO`@`<6gVW`v<4P(;eZ?cb5;QTa9SKhgh)5?DFkB{ks*0xsZdTj7490C}%+VO#? z4}}?+=BiHFo|5VjwXZwc*t6C6_~myn*>?+chH(V%fg;BJqS}&aT`P|bvr%<{FNQ8v-j(6+O8FsQqq+w`a% zWw(RfF`M6?bm1Ly-m!{=FPI*15+S9v zm#}|*+mHvqu28N8m(fUB#Sr`Nm_Fwoeu9%(Q)Au?9V%yNNDVa*evg3W4EsK*@s#fQ$0@_f7Bc%ZWGR?WNBhAVrF$aA=%xPDPXn_Wgft_&=5r8 z)9b3u{EVwCaaUzTI)uF!ZTm9oj)nT;A_-%G_SaYR-KNM}6iNb(7N#1R@mZ{l4d*q& z(6~Wu)rpC5mjSd($vd!d?Jl1Ca*J1TIxA*(D5`YzOJ1V1RHlQBhZPSFvf#Tti@AYizzJM{3+CZw!RMg8bv=J$c-g!pU zPGvAv5fa46#r?1qI-Eb!wXau2%w&i+VjmKgS4#6}t@WP;??Osovb|lU=OMN`reR?}H6q!7#1eF1{M5!LZ>dKQ0Z$9) z3zmHnW(#A-Ikm*c-8Rnf(61_3cw|Lf-ir19ia%SjWt-1}VtuKQ^OPZn9k41GTr@H~ zR(Om|4m|GO$(OPbc%1@riI$wQBN z40%Kx2+TX{o~)zU$PZd4%bR$JQZ-UwqD+Wtl_K;n0EK_mrQaEEXLZ_<=cd8CB^nC6 zGu|&v?RAI50SJ=l0$}8In2O>;MH{P)pTxAcNp<$3`-4v{J@li!$8pL+8I3#eg7=9% z*G@^?)Eo{l`Z|Nc5F@h==11QP!Zo9#OiDufu1r;OX;CRo&u{DXx#%;Kk2iHjY8%@m zwAqXb*NIl{cM9da6nqT#D}9(h?Q6!V@D9i`<{BBtGe31ME|%2jZe}shC!t3AVpf+r z=F>Ob^)%`HL_jNvAsam9{eZ2>MsOAZG%8zFQQkhGiX>`D$WFK9**EIe8FT#=FLDa^ zNr>vY$xcvPN?-!im!;|IDQYerqf{KFb}e$VcY@kcGP?-{S+L_1UE=+Q&G zoTo@CXrEFu@&<|@%d7@x6sm$ZW%u{)qMzRBNZTw8KFToe|9}?Sz>TynlCW!Vzy;@V zL^JvUKHUp|zu{|SSsX+k!R}7*J$w(NWoQbbjM5#S_J*FJJ}+-n@m$+@n)emf)3=CD zph*{;;sl!SKZ#4pOSGTwxe(NNlHdatKu1!JZk+!dcB~Jq_$b*J>$sW^mAaI4k6)3P zi3jD+1t^X*`{xe&2B40rRrdbKvQyq<71QWmQssIzxPA_w?E`L+A}%y7O8)r#*j?)f zm&&`DRyAU(&s3nKUlFtTTWb_~9M)8Xub?Hfcn$ zAvhc09PMvZ?)o+u-56`MmjmC_*G8|+QsWKXt@2kJXVw+Pm_~L+ajL00%o~ZA(@Wzl2_=;EZ8ukMz6Y#Q=*LKDU|8^b@p@Qo#wwUUz7uJfSh4EO!2 z#Iw#0##&*2gG$ls9;(tXpy9}YI??vwA3q7H*NBsP7~2<~6EQYi{|r2_Y8|gd+;_rn zpON|S>08YKM$$v8h4<@yfB7hS(aBS$yieo2<^Bu8339sm&^}KmA1l2D-MZBKm~n=C z4Tpy#E$%eZ;VD<0`_3-MFV`X`>UH^x`EEsewedYO@zB$ADMRi=Eegtic}GNZ@6PD) z^NLX7?W_`V!lVnrPEo@z(0*D=PP9XD@CMmks$9*zc*sas^|K`zX3-Wpal(uQzIUHk zb|h1j4Qn8lT_{2Fjr^pallcZ1UsZTE9i`2PgNvhIB~6V~eOP%{n&aBt@IIa#1WH^|Z z1!P`J@_3M_31%OY6=E?OPY)!_TgnJTvaXw0fecB@$!3wODJufYv<)>)=9$IzNL|D^ z84SNE?QQ5Uz+>I8R}FF74BzuU7_eZ?)HhCTRirDlbMPF&3shVPv z@~!%mW|Hvg69ok=jNU=`CB~1P(6G8Q&!683 zPqCmqx>_stgB#KF@geIcm!l@0@YSCYwU3wR(pITLHapxGDH+RT6Ui(NHO`NHy-j^m zcJZnM9M|r3n)xN#GydpGR_JJC@HJ%{EgL4uKl&ovDq-7yaJdaOb9(HDmr|bkP0DOShxY03m7g z)@l7nM>eNIU5f~xq z7jp~gZ>}50B$JR9FKy2DwKseFyZHcAaKH zMc`3VxVD9e;#w93(#@=uk4w5%r;(A#aU_$S9hf#u&S7vj^ohCGfUWCMtFObz!)7r> z`P-)((A#WBvs*OExE}YAlG?k}SlD?+zqD9jra6U#=F~ha5xh`Ldk$@t0MUko_;DFG z;IlZ9BltT^v-W<7URvQEgP(_-|9Et;lH|W$K0&UX&z{3Zl^i%{^WLeBC@)5`y7m!# zME3{QKQTi;ef=AAecmsCcKw2Ep(!w%i1I1VZ@sP2JJ^!Qd)O_xQ?b_6YE#AW8;B*1D!7Lkbw*LYogry zG?#vmWc1@S#cf~iLvOLG6hqQc-6}^$n2e_GWu@5EbWbwX zWlLx;KkB*a+b>nAsZ7 z3aQ;RRzUSyUvL8qsa}$Fp4}q+6tZ?FMm=$7FTzgN)nU)>!!JOU_MLMU%xSM(u!C3J z_z6)m-Lyc*`5wZYx z@Zs!ZG>$}`X3M9sdu@APc-~w{)r`*Nq4I)*W&#SvPpABAE9IrNqiE@}Sy6R7FSQbA zILP#b6eZuBtgISLnwZFz+?awPGDmGH6%FP;e$FAT8hkL9V;cRwiB9FheUK0#BE1r$ou93O|GJBBvy1Tu}ZqU~j<5EDlPbTT~ez5&r7TMPPEltW91V z>S{i^SaVHQrMjx4`eA*1|9w%NHvX4!7#(J;A&BOY{jU1iEzmZqg-`|^KB@{|ZMEKh z@Cz_J7$|=}_K7A6r?%RYxg}%sb>UKI-|`6JQu;VJL&!Sq?%jkWE`Gfpj_g-lz^E5h z^9j^KooxA^Wos`Ar-*spNWz#H_wl!^R*9Y#RRhTvuB=&u13oM58&O4L z1?`!dv51$=$qK8!OW)v)>NtK)Nw?H?2YlX0H}#o}uahnH!}=Gni;a$of`sN>&jgX^Y?IVvg$Z!eOJ4f%FZ1suPwF{!P_k6` zUb#H~e(G?xxh7*GNhq9)Zx*Tg@lqg2>|Pzb?#s+hHW$W>HeSRCY}edBb!9?C3!NFx zV;p%5ntPSkv7O$R6?{eI_Tg;Ar6;BaLseuwp~L;Y(SPa_xf@#cQKG6OV_<`4>djlC z*kWa5SYEAjaNDs$hp8O(4*`=N!^ZhKS0+^efrRbM?GhFVRd%_MbsD^}Moc_^L(Ayi zvh8;Yp8e2{^qc3ZX?cTmS{=JIk(^4uiUr534CXzV=f*{7tiFXj)G5fokMO&rbKf3X zLUgDuq0`PzTsbvl2F7$)B9Bro6ht8~0m*kgd3cmUUxV_MeksU-e%k#onMQFLq)gP7z8^nc9(9{OSYjK2q zIU54zZ!2iy5g2H`(vs&@otBt(efX3j^EI(3AvD#0or$_+JtM+Gm;%CL0i!)bx)W;? z4Ge;Mj3q2GBVjUA+gxeV^3Zq7k8i^!`C@gexHvucrCA_&KC0(O$^v=Wc=2zaZk9t- zN-vZfjPe-lKdd`>=@-@8`5?#8NfaxODzhu;$wfBnE4dr<%!%FtL3TQii7@edkZ z%%S{V$_GCzFG-t`ZV+;c#!&;j&ugtNnXHV53ni<%(!Y_z zmc}1+s^-6PrcSWHcpQ~_q-8^W4ouI=w}U)A$sT{(#BlMtV_G5fks5r>3~#sFLI&op zGQ+#`R1|0>{dmZE5^BnLjchCzyg!!WqXh^XYF*`xWtKA&(*UZpPI<{@8E`O;VN_mP z`~+yEUMvRKUc{aJRk~{I7UvpR=e`7;K-BzqRT=JRUeKCK0}lN2;vV4qdm4&1^2jXa zL4#zd*P%&a%uBi$+ao?MXGc!94-LM5WOZ{^otoN2F6_xTtnFEiM%f4!TkRO~LsUPd zxCWv}s|WMiShwgxax7((Ek-fw!@^y`MW`>{a^26Xe(FyTjCNz0VklWy*-1CYT?v0~ ze6b9x(YzmtM$pr%;got^LYG?F@|N+ZX-7uFDE_FmF?Ca%Woy1w>l9L-_xXjL8qv~9M=aJ;SebvKfdg+5z=SK;^#M(7( zE2lv&eG|haZh{waFE>oCjpp7}-73(U9e3+hAG7?K&?X~NA6F|QQKNd)5k!GX&DMIk zRvqaOCK#22k$YJsbH+Jijyb>gof5`6SHj5%BJlNL=8_$7B8=C>O|FoOvLD>aXDoSo z`Kd*i93*g|R*<4Alk0u|8yK9&h7pdmd zY+=w((y3H#fNpkwV@Qlnw=NxDffBF_e_G{zb`WOhBWJ}Fpf+>(x)q^;lfU^h<&Z>{ z?vX*(x?}a0$3#?NDIxFZM*_=6sBR+q)I?cn*1le~g~ObEK_v$)$YRV<3QioRNLxY1 z`Ko*Pv$k`2X39Q<6srRWC+sLQwd`9T5N~>$#S42!5Z<+Wf;;&D+AGziJ|Pz9C3~9c*r^q076BU6$Htddf>^k6Lf(Gk<=iT!AW4H>j8+@M&yQ1; z**0EDo+r&8zXM6XQf|PpDLFf~6?@!QWMNyEofkD zoQmm^L1{-Ly{w?&B+BXo%^#D1Y3&nLexNhiBDUzaCQo=>2d>KIy>Oj z@DPnL_1iR@R{gz0U6YZUzspG<6_zto2pHul7B7MMl?22M*HvH7p=SNG8NN)@$D@+x zwQIOXE20_0!xrRRNs0XbXP<1oP$ZkJ*BNmtJPMSsd|H`BP2s{dgEAs9%jUKild`5EtZUeyC9z z`P_3rYc@Di;xKM`G&UQgGOp`xOvF@I`8I)ofO#V(!mH9DboS1;RR2+Z=+sndF)Vcf z_l{*6_ezoz4!Kkg57|VDYl)}JdWL~wr=_v=TE)`~Kyiftj`1I^TzaRhy$=huZ(0 z&irka{Kk#eLbeXoiQpypaq! z0O{PTSzY3&?h*(&?Z(<&S(5boUGBruu`LfQvF(ry7EPnbD%7KvyxWlu=Vc9%X>DF{ zV6LQQP?-Qj!z$RVXvn;AH&dJ5{+N#T*<RNf0V!zs_oJhE2VOHCTC>`cZAFURxPu#q@xBxyEp>OqX-TiW4?OX39hlkz2JDRd`FSut$ zrFi>L`l_4SN-Z}f5Q}xA0gQJPI#tk$GC%e+$Q7Gjc)CDU>0T-}UsAh{QuhHff(AEI zxVt}F!7oY}oZC*dr5R$sv8tbB#ZzurQD2oWIp}N`p?8*fNXb+7s4uGrVQ5QKD~q{K z>xZ>wMD?5<=@8-q)2)-PbjQw4@i4CTTJ^mO(;1ZhhUMi~0&cQo8H zxczp*1jb9^g_if!60-KHYFdR>*F3|S`OEIQTVbDeB-ln|(&Gd%Xn^VcvPcFn_OxK@ zTag5tW3|uBR)2I$*<(JgWyob;Gpwa6iF!ysWB=0h^BGA}D~*!2{$=Qb?{(|b>`9X$ zQfzc>(8U$sVF|HhGDbCa?W<*D9A3O#hsXD1M)TzAACE>2v2D*8|8U7=dG~Gj4LtsB z=5@BXrfpK8-Dq}roAtK$0>^FgD<6#!O_F1}1ycrmMkU8!LRjAN)226<)t0N*{7oWE7}cfJ zN)Bz3vgX(}yvhA=%w3kNQtW_Hc;=9i?-sdrS{uvgc78P&_Y!cV{=I`BT`U5t9{Nm`Yk7=b{x2Lul%ky7L F{|EOE3lsnV literal 0 HcmV?d00001 From 838926085cac00ec65ee5aecb67e6102ea8b6f20 Mon Sep 17 00:00:00 2001 From: Jonathon Menz Date: Fri, 12 Jun 2015 16:42:51 -0700 Subject: [PATCH 2/2] API New and renamed image functions Renamed image functions with more expressive names. Added CropWidth & CropHeight functions. Added no-upsampling capabilities. Cleaned up Image docs. Closes #4211 --- .../01_Tutorials/02_Extending_A_Basic_Site.md | 8 +- .../14_Files/01_File_Management.md | 40 +++ .../02_Developer_Guides/14_Files/01_Image.md | 135 -------- .../02_Developer_Guides/14_Files/02_Images.md | 163 ++++++++++ docs/en/02_Developer_Guides/14_Files/index.md | 45 +-- docs/en/04_Changelogs/3.2.0.md | 12 + docs/en/_images/image-methods.jpg | Bin 0 -> 33416 bytes filesystem/File.php | 2 +- forms/HtmlEditorField.php | 2 +- forms/UploadField.php | 4 +- model/Image.php | 293 ++++++++++++++++-- .../Includes/HtmlEditorField_viewfile.ss | 2 +- tests/filesystem/GDTest.php | 14 +- tests/model/GDImageTest.php | 6 +- tests/model/ImageTest.php | 144 +++++---- 15 files changed, 603 insertions(+), 267 deletions(-) create mode 100644 docs/en/02_Developer_Guides/14_Files/01_File_Management.md delete mode 100644 docs/en/02_Developer_Guides/14_Files/01_Image.md create mode 100644 docs/en/02_Developer_Guides/14_Files/02_Images.md create mode 100644 docs/en/_images/image-methods.jpg diff --git a/docs/en/01_Tutorials/02_Extending_A_Basic_Site.md b/docs/en/01_Tutorials/02_Extending_A_Basic_Site.md index 499dea2be..36b484a3c 100644 --- a/docs/en/01_Tutorials/02_Extending_A_Basic_Site.md +++ b/docs/en/01_Tutorials/02_Extending_A_Basic_Site.md @@ -512,7 +512,7 @@ The staff section templates aren't too difficult to create, thanks to the utilit <% loop $Children %>

$Title

- $Photo.SetWidth(150) + $Photo.ScaleWidth(150)

$Content.FirstParagraph

Read more >>
@@ -521,7 +521,7 @@ The staff section templates aren't too difficult to create, thanks to the utilit -This template is very similar to the *ArticleHolder* template. The *SetWidth* method of the `[api:Image]` class +This template is very similar to the *ArticleHolder* template. The *ScaleWidth* method of the `[api:Image]` class will resize the image before sending it to the browser. The resized image is cached, so the server doesn't have to resize the image every time the page is viewed. @@ -537,13 +537,13 @@ The *StaffPage* template is also very straight forward.

$Title

- $Photo.SetWidth(433) + $Photo.ScaleWidth(433) $Content
$Form -Here we use the *SetWidth* method to get a different sized image from the same source image. You should now have +Here we use the *ScaleWidth* method to get a different sized image from the same source image. You should now have a complete staff section. ![](../_images/tutorial2_einstein.jpg) diff --git a/docs/en/02_Developer_Guides/14_Files/01_File_Management.md b/docs/en/02_Developer_Guides/14_Files/01_File_Management.md new file mode 100644 index 000000000..f1d957a29 --- /dev/null +++ b/docs/en/02_Developer_Guides/14_Files/01_File_Management.md @@ -0,0 +1,40 @@ +summary: Learn how to work with File and Image records + +# File Management + +## Files, Images and Folders as database records + +All files, images and folders in the 'assets' directory are stored in the database. Each record has the following database fields: + +| Field name | Description | +| ---------- | ----------- | +| `ClassName` | The class name of the file (e.g. File, Image or Folder). | +| `Name` | The 'basename' of the file, or the folder name. For example 'my-image.jpg', or 'images' for a folder. | +| `Title` | The optional, human-readable title of the file for display only (doesn't apply to folders). | +| `Filename` | The path to the file/folder, relative to the webroot. For example 'assets/images/my-image.jpg', or 'assets/images/' for a folder. | +| `Content` | Typically unused, but handy for a textual representation of files. For example for fulltext indexing of PDF documents. | +| `ShowInSearch` | Whether the file should be shown in search results, defaults to '1'. See ["Tutorial 4 - Site Search"](/tutorials/site_search) for enabling search. | +| `ParentID` | The ID of the parent Folder that this File/Folder is in. A ParentID of '0' indicates that the File/Folder is in the 'assets' directory. | +| `OwnerID` | The ID of the Member that 'owns' the File/Folder (not related to filesystem permissions). | + +## Management through the "Files" section of the CMS + +If you have the CMS module installed, you can manage files, folders and images in the "Files" section of the CMS. Inside this section, you will see a list of files and folders like below: + +![](../../_images/assets.png) + +You can click on any file to edit it, or click on any folder to open it. To delete a file or a folder, simply click the red 'X' symbol next to it. If you click to open a folder, you can go back up one level by clicking the 'up' arrow above the folder name (highlighted below): + +![](../../_images/assets_up.png) + +Once you click to edit a file, you will see a form similar to the one below, in which you can edit the file's title, filename, owner, or even change which folder the file is located in: + +![](../../_images/assets_editform.png) + +You may also notice the 'Sync files' button (highlighted below). This button allows CMS users to 'synchronise' the database (remember, all files/folders are stored as database records) with the filesystem. This is particularly useful if someone has uploaded or removed files/folders via FTP, for example. + +![](../../_images/assets_sync.png) + +## Upload + +Files can be managed through a `FileField` or an `UploadField`. The `[api:FileField]` class provides a simple HTML input with a type of "file", whereas an `[api:UploadField]` provides a much more feature-rich field (including AJAX-based uploads, previews, relationship management and file data management). See [`Reference - UploadField`](/developer_guides/forms/field_types/uploadfield) for more information about how to use the `UploadField` class. \ No newline at end of file diff --git a/docs/en/02_Developer_Guides/14_Files/01_Image.md b/docs/en/02_Developer_Guides/14_Files/01_Image.md deleted file mode 100644 index bd3b4537a..000000000 --- a/docs/en/02_Developer_Guides/14_Files/01_Image.md +++ /dev/null @@ -1,135 +0,0 @@ -# Image - -## Introduction - -Represents an image object through the `[api:Image]` class, inheriting all base functionality from the `[api:File]` class with extra functionality including resizing. - -## Usage - -### Managing images through form fields - -Images can be uploaded like any other file, through `[api:FileField]`. -More advanced usage is possible through `[api:UploadField]`, -which provides thumbnails, a detail view of the image properties, -and management of relationships to other DataObject instances. -Allows upload of images through limiting file extensions with `setAllowedExtensions()`. - -### Inserting images into the WYSIWYG editor - -See [Topics: Rich Text Editing](/topics/rich-text-editing). - -### Resizing Images in PHP - -The following are methods defined on the GD class which you can call on Image Objects. Note to get the following to work -you need to have GD2 support in your PHP installation and because these generate files you must have write access to -your tmp folder. - - :::php - // manipulation functions - $image->resize(width,height); // Basic resize, just skews the image - $image->resizeRatio(width,height) // Resizes an image with max width and height - $image->paddedResize(width,height) // Adds padding after resizing to width or height. - $image->croppedImage(width,height) // Crops the image from the centre, to given values. - $image->resizeByHeight(height) // Maximum height the image resizes to, keeps proportion - $image->resizeByWidth(width) // Maximum width the image resizes to, keeps proportion - $image->greyscale(r,g,b) // alters image channels === - - // values - $image->getHeight() // Returns the height of the image. - $image->getWidth() // Returns the width of the image - $image->getOrienation() // Returns a class constant: ORIENTATION_SQUARE or ORIENTATION_PORTRAIT or ORIENTATION_LANDSCAPE - - -You can also create your own functions by extending the image class, for example - - :::php - class MyImage extends Image { - public function generateRotateClockwise(GD $gd) { - return $gd->rotate(90); - } - - public function generateRotateCounterClockwise(GD $gd) { - return $gd->rotate(270); - } - - public function clearResampledImages() { - $files = glob(Director::baseFolder().'/'.$this->Parent()->Filename."_resampled/*-$this->Name"); - foreach($files as $file) {unlink($file);} - } - - public function Landscape() { - return $this->getWidth() > $this->getHeight(); - } - - public function Portrait() { - return $this->getWidth() < $this->getHeight(); - } - - public function generatePaddedImageByWidth(GD $gd,$width=600,$color="fff"){ - return $gd->paddedResize($width, round($gd->getHeight()/($gd->getWidth()/$width),0),$color); - } - - public function Exif(){ - //http://www.v-nessa.net/2010/08/02/using-php-to-extract-image-exif-data - $image = $this->AbsoluteURL; - $d=new ArrayList(); - $exif = exif_read_data($image, 0, true); - foreach ($exif as $key => $section) { - $a=new ArrayList(); - foreach ($section as $name => $val) - $a->push(new ArrayData(array("Title"=>$name,"Content"=>$val))); - $d->push(new ArrayData(array("Title"=>strtolower($key),"Content"=>$a))); - } - return $d; - } - } - -### Resizing in Templates - -You can call certain resize functions directly from the template, to use the inbuilt GD functions as the template parser -supports these, for example SetWidth() or SetHeight(). - -For output of an image tag with the image automatically resized to 80px width, you can use: - - :::php - $Image.SetWidth(80) // returns a image 80px wide, ratio kept the same - $Image.SetHeight(80) // returns a image 80px tall, ratio kept the same - $Image.SetSize(80,80) // returns a 80x80px padded image - $Image.SetRatioSize(80,80) // Returns an image scaled proportional, with its greatest diameter scaled to 80px - $Image.CroppedImage(80,80) // Returns an 80x80 image cropped from the center. - $Image.PaddedImage(80, 80, FFFFFF) // Returns an 80x80 image. Unused space is padded white. No crop. No stretching - $Image.Width // returns width of image - $Image.Height // returns height of image - $Image.Orientation // returns Orientation - $Image.Filename // returns filename - $Image.URL // returns filename - - -### Form Upload - -For usage on a website form, see `[api:FileField]`. -If you want to upload images within the CMS, see `[api:UploadField]`. - -### Image Quality - -To adjust the quality of the generated images when they are resized add the following to your mysite/config/config.yml file: - - :::yml - GDBackend: - default_quality: 90 - -The default value is 75. - -### Clearing Thumbnail Cache - -Images are (like all other Files) synchronized with the SilverStripe database. -This syncing happens whenever you load the "Files & Images" interface, -and whenever you upload or modify an Image through SilverStripe. - -If you encounter problems with images not appearing, or have mysteriously disappeared, you can try manually flushing the -image cache. - - http://localhost/dev/tasks/FlushGeneratedImagesTask - -## API Documentation -`[api:Image]` diff --git a/docs/en/02_Developer_Guides/14_Files/02_Images.md b/docs/en/02_Developer_Guides/14_Files/02_Images.md new file mode 100644 index 000000000..46babf387 --- /dev/null +++ b/docs/en/02_Developer_Guides/14_Files/02_Images.md @@ -0,0 +1,163 @@ +summary: Learn how to crop and resize images in templates and PHP code + +# Image + +Represents an image object through the `[api:Image]` class, inheriting all base functionality from the `[api:File]` class with extra functionality including resizing. + +## Usage + +### Managing images through form fields + +Images can be uploaded like any other file, through `[api:FileField]`. +More advanced usage is possible through `[api:UploadField]`, +which provides thumbnails, a detail view of the image properties, +and management of relationships to other DataObject instances. +Allows upload of images through limiting file extensions with `setAllowedExtensions()`. + +### Inserting images into the WYSIWYG editor + +See [Topics: Rich Text Editing](/topics/rich-text-editing). + +### Manipulating images in Templates + +You can manipulate images directly from templates to create images that are +resized and cropped to suit your needs. This doesn't affect the original +image or clutter the CMS with any additional files, and any images you create +in this way are cached for later use. In most cases the pixel aspect ratios of +images are preserved (meaning images are not stretched). + +![](../../_images/image-methods.jpg) + +Here are some examples, assuming the `$Image` object has dimensions of 200x100px: + + :::ss + // Scaling functions + $Image.ScaleWidth(150) // Returns a 150x75px image + $Image.ScaleMaxWidth(100) // Returns a 100x50px image (like ScaleWidth but prevents up-sampling) + $Image.ScaleHeight(150) // Returns a 300x150px image (up-sampled. Try to avoid doing this) + $Image.ScaleMaxHeight(150) // Returns a 200x100px image (like ScaleHeight but prevents up-sampling) + $Image.Fit(300,300) // Returns an image that fits within a 300x300px boundary, resulting in a 300x150px image (up-sampled) + $Image.FitMax(300,300) // Returns a 200x100px image (like Fit but prevents up-sampling) + + // Cropping functions + $Image.Fill(150,150) // Returns a 150x150px image resized and cropped to fill specified dimensions (up-sampled) + $Image.FillMax(150,150) // Returns a 100x100px image (like Fill but prevents up-sampling) + $Image.CropWidth(150) // Returns a 150x100px image (trims excess pixels off the x axis from the center) + $Image.CropHeight(50) // Returns a 200x50px image (trims excess pixels off the y axis from the center) + + // Padding functions (add space around an image) + $Image.Pad(100,100) // Returns a 100x100px padded image, with white bars added at the top and bottom + $Image.Pad(100, 100, CCCCCC) // Same as above but with a grey background + + // Metadata + $Image.Width // Returns width of image + $Image.Height // Returns height of image + $Image.Orientation // Returns Orientation + $Image.Title // Returns the friendly file name + $Image.Name // Returns the actual file name + $Image.FileName // Returns the actual file name including directory path from web root + $Image.Link // Returns relative URL path to image + $Image.AbsoluteLink // Returns absolute URL path to image + +Image methods are chainable. Example: + + :::ss + + +### Manipulating images in PHP + +The image manipulation functions can be used in your code with the same names, example: `$image->Fill(150,150)`. + +Some of the MetaData functions need to be prefixed with 'get', example `getHeight()`, `getOrientation()` etc. + +Please refer to the `[api:Image]` API documentation for specific functions. + +### Creating custom image functions + +You can also create your own functions by extending the image class, for example + + :::php + class MyImage extends DataExtension { + + public function Landscape() { + return $this->owner->getWidth() > $this->owner->getHeight(); + } + + public function Portrait() { + return $this->owner->getWidth() < $this->owner->getHeight(); + } + + public function PerfectSquare() { + return $this->owner->getFormattedImage('PerfectSquare'); + } + + public function generatePerfectSquare(Image_Backend $backend) { + return $backend->croppedResize(100,100); + } + + public function Exif(){ + //http://www.v-nessa.net/2010/08/02/using-php-to-extract-image-exif-data + $image = $this->owner->AbsoluteLink(); + $d=new ArrayList(); + $exif = exif_read_data($image, 0, true); + foreach ($exif as $key => $section) { + $a=new ArrayList(); + foreach ($section as $name => $val) + $a->push(new ArrayData(array("Title"=>$name,"Content"=>$val))); + $d->push(new ArrayData(array("Title"=>strtolower($key),"Content"=>$a))); + } + return $d; + } + } + + :::yml + Image: + extensions: + - MyImage + +### Form Upload + +For usage on a website form, see `[api:FileField]`. +If you want to upload images within the CMS, see `[api:UploadField]`. + +### Image Quality + +To adjust the quality of the generated images when they are resized add the +following to your mysite/config/config.yml file: + + :::yml + GDBackend: + default_quality: 90 + # or + ImagickBackend: + default_quality: 90 + +The default value is 75. + +By default SilverStripe image functions will not resample an image if no +cropping or resizing is taking place. You can tell SilverStripe to always to +always produce resampled output by adding this to your +mysite/config/config.yml file: + + :::yml + Image: + force_resample: true + +If you are intending to resample images with SilverStripe it is good practice +to upload high quality (minimal compression) images as these will produce +better results when resampled. Very high resolution images may cause GD to +crash so a good size for website images is around 2000px on the longest edge. + +### Clearing Thumbnail Cache + +Images are (like all other Files) synchronized with the SilverStripe database. +This syncing happens whenever you load the "Files & Images" interface, +and whenever you upload or modify an Image through SilverStripe. + +If you encounter problems with images not appearing, or have mysteriously +disappeared, you can try manually flushing the image cache. + + http://localhost/dev/tasks/FlushGeneratedImagesTask + +## API Documentation +`[api:Image]` diff --git a/docs/en/02_Developer_Guides/14_Files/index.md b/docs/en/02_Developer_Guides/14_Files/index.md index daff8a2cb..4c2c14c9b 100644 --- a/docs/en/02_Developer_Guides/14_Files/index.md +++ b/docs/en/02_Developer_Guides/14_Files/index.md @@ -1,40 +1,11 @@ -summary: Learn how to deal with File and Image records +title: Files +summary: Upload, manage and manipulate files and images. +introduction: Upload, manage and manipulate files and images. -# Files, Images and Folders +[CHILDREN] -## Files, Images and Folders as database records +## API Documentation -All files, images and folders in the 'assets' directory are stored in the database. Each record has the following database fields: - -| Field name | Description | -| ---------- | ----------- | -| `ClassName` | The class name of the file (e.g. File, Image or Folder). | -| `Name` | The 'basename' of the file, or the folder name. For example 'my-image.jpg', or 'images' for a folder. | -| `Title` | The optional, human-readable title of the file for display only (doesn't apply to folders). | -| `Filename` | The path to the file/folder, relative to the webroot. For example 'assets/images/my-image.jpg', or 'assets/images/' for a folder. | -| `Content` | Typically unused, but handy for a textual representation of files. For example for fulltext indexing of PDF documents. | -| `ShowInSearch` | Whether the file should be shown in search results, defaults to '1'. See ["Tutorial 4 - Site Search"](/tutorials/site_search) for enabling search. | -| `ParentID` | The ID of the parent Folder that this File/Folder is in. A ParentID of '0' indicates that the File/Folder is in the 'assets' directory. | -| `OwnerID` | The ID of the Member that 'owns' the File/Folder (not related to filesystem permissions). | - -## Management through the "Files" section of the CMS - -If you have the CMS module installed, you can manage files, folders and images in the "Files" section of the CMS. Inside this section, you will see a list of files and folders like below: - -![](../../_images/assets.png) - -You can click on any file to edit it, or click on any folder to open it. To delete a file or a folder, simply click the red 'X' symbol next to it. If you click to open a folder, you can go back up one level by clicking the 'up' arrow above the folder name (highlighted below): - -![](../../_images/assets_up.png) - -Once you click to edit a file, you will see a form similar to the one below, in which you can edit the file's title, filename, owner, or even change which folder the file is located in: - -![](../../_images/assets_editform.png) - -You may also notice the 'Sync files' button (highlighted below). This button allows CMS users to 'synchronise' the database (remember, all files/folders are stored as database records) with the filesystem. This is particularly useful if someone has uploaded or removed files/folders via FTP, for example. - -![](../../_images/assets_sync.png) - -## Upload - -Files can be managed through a `FileField` or an `UploadField`. The `[api:FileField]` class provides a simple HTML input with a type of "file", whereas an `[api:UploadField]` provides a much more feature-rich field (including AJAX-based uploads, previews, relationship management and file data management). See [`Reference - UploadField`](/developer_guides/forms/field_types/uploadfield) for more information about how to use the `UploadField` class. \ No newline at end of file +* [api:File] +* [api:Image] +* [api:Folder] \ No newline at end of file diff --git a/docs/en/04_Changelogs/3.2.0.md b/docs/en/04_Changelogs/3.2.0.md index bb21b2306..1ff719cfd 100644 --- a/docs/en/04_Changelogs/3.2.0.md +++ b/docs/en/04_Changelogs/3.2.0.md @@ -20,6 +20,9 @@ * Implementation of new "Archive" concept for page removal, which supercedes "delete". Where deletion removed pages only from draft, archiving removes from both draft and live simultaneously. * Support for multiple HtmlEditorConfigs on the same page. + * Most of the `Image` manipulation methods have been renamed + * New `Image` methods `CropWidth` and `CropHeight` added + * 'Max' versions of `Image` methods introduced to prevent up-sampling #### Deprecated classes/methods removed @@ -393,6 +396,15 @@ In order to remove the new "archive" action and restore the old "delete" action - CMSBatchAction_Delete +### Update Image method names in PHP code and templates + + * `SetRatioSize` -> `Fit` + * `CroppedImage` -> `Fill` + * `PaddedImage` -> `Pad` + * `SetSize` -> `Pad` + * `SetWidth` -> `ScaleWidth` + * `SetHeight` -> `ScaleHeight` + ### Other * Helper function `DB::placeholders` can be used to generate a comma separated list of placeholders diff --git a/docs/en/_images/image-methods.jpg b/docs/en/_images/image-methods.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c1a2e8b007f0d7d333b8c02f77751c743e989858 GIT binary patch literal 33416 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 - 'SetWidth', + 'ScaleWidth', Config::inst()->get('Image', 'asset_preview_width') ); $thumbnail = $formattedImage ? $formattedImage->URL : ''; diff --git a/forms/HtmlEditorField.php b/forms/HtmlEditorField.php index ded9c1459..9817431e8 100644 --- a/forms/HtmlEditorField.php +++ b/forms/HtmlEditorField.php @@ -673,7 +673,7 @@ class HtmlEditorField_Toolbar extends RequestHandler { */ protected function getFieldsForImage($url, $file) { if($file->File instanceof Image) { - $formattedImage = $file->File->generateFormattedImage('SetWidth', + $formattedImage = $file->File->generateFormattedImage('ScaleWidth', Config::inst()->get('Image', 'asset_preview_width')); $thumbnailURL = Convert::raw2att($formattedImage ? $formattedImage->URL : $url); } else { diff --git a/forms/UploadField.php b/forms/UploadField.php index d09a6379f..e623a9ead 100644 --- a/forms/UploadField.php +++ b/forms/UploadField.php @@ -873,8 +873,8 @@ class UploadField extends FileField { return $file->getThumbnail($width, $height)->getURL(); } elseif ($file->hasMethod('getThumbnailURL')) { return $file->getThumbnailURL($width, $height); - } elseif ($file->hasMethod('SetRatioSize')) { - return $file->SetRatioSize($width, $height)->getURL(); + } elseif ($file->hasMethod('Fit')) { + return $file->Fit($width, $height)->getURL(); } else { return $file->Icon(); } diff --git a/model/Image.php b/model/Image.php index 31561ade2..d488c689a 100644 --- a/model/Image.php +++ b/model/Image.php @@ -216,30 +216,271 @@ class Image extends File implements Flushable { } /** - * Resize the image by preserving aspect ratio, keeping the image inside the - * $width and $height + * Scale image proportionally to fit within the specified bounds * * @param integer $width The width to size within * @param integer $height The height to size within * @return Image */ - public function SetRatioSize($width, $height) { + public function Fit($width, $height) { // Prevent divide by zero on missing/blank file if(!$this->getWidth() || !$this->getHeight()) return null; // Check if image is already sized to the correct dimension $widthRatio = $width / $this->getWidth(); $heightRatio = $height / $this->getHeight(); + if( $widthRatio < $heightRatio ) { // Target is higher aspect ratio than image, so check width if($this->isWidth($width) && !Config::inst()->get('Image', 'force_resample')) return $this; } else { - // Target is wider aspect ratio than image, so check height + // Target is wider or same aspect ratio as image, so check height if($this->isHeight($height) && !Config::inst()->get('Image', 'force_resample')) return $this; } // Item must be regenerated - return $this->getFormattedImage('SetRatioSize', $width, $height); + return $this->getFormattedImage('Fit', $width, $height); + } + + /** + * Scale image proportionally to fit within the specified bounds + * + * @param Image_Backend $backend + * @param integer $width The width to size within + * @param integer $height The height to size within + * @return Image_Backend + */ + public function generateFit(Image_Backend $backend, $width, $height) { + return $backend->resizeRatio($width, $height); + } + + /** + * Proportionally scale down this image if it is wider or taller than the specified dimensions. + * Similar to Fit but without up-sampling. Use in templates with $FitMax. + * + * @uses Image::Fit() + * @param integer $width The maximum width of the output image + * @param integer $height The maximum height of the output image + * @return Image + */ + public function FitMax($width, $height) { + // Temporary $force_resample support for 3.x, to be removed in 4.0 + if (Config::inst()->get('Image', 'force_resample') && $this->getWidth() <= $width && $this->getHeight() <= $height) return $this->Fit($this->getWidth(),$this->getHeight()); + + return $this->getWidth() > $width || $this->getHeight() > $height + ? $this->Fit($width,$height) + : $this; + } + + /** + * Resize and crop image to fill specified dimensions. + * Use in templates with $Fill + * + * @param integer $width Width to crop to + * @param integer $height Height to crop to + * @return Image + */ + public function Fill($width, $height) { + return $this->isSize($width, $height) && !Config::inst()->get('Image', 'force_resample') + ? $this + : $this->getFormattedImage('Fill', $width, $height); + } + + /** + * Resize and crop image to fill specified dimensions. + * Use in templates with $Fill + * + * @param Image_Backend $backend + * @param integer $width Width to crop to + * @param integer $height Height to crop to + * @return Image_Backend + */ + public function generateFill(Image_Backend $backend, $width, $height) { + return $backend->croppedResize($width, $height); + } + + /** + * Crop this image to the aspect ratio defined by the specified width and height, + * then scale down the image to those dimensions if it exceeds them. + * Similar to Fill but without up-sampling. Use in templates with $FillMax. + * + * @uses Image::Fill() + * @param integer $width The relative (used to determine aspect ratio) and maximum width of the output image + * @param integer $height The relative (used to determine aspect ratio) and maximum height of the output image + * @return Image + */ + public function FillMax($width, $height) { + // Prevent divide by zero on missing/blank file + if(!$this->getWidth() || !$this->getHeight()) return null; + + // Temporary $force_resample support for 3.x, to be removed in 4.0 + if (Config::inst()->get('Image', 'force_resample') && $this->isSize($width, $height)) return $this->Fill($width, $height); + + // Is the image already the correct size? + if ($this->isSize($width, $height)) return $this; + + // If not, make sure the image isn't upsampled + $imageRatio = $this->getWidth() / $this->getHeight(); + $cropRatio = $width / $height; + // If cropping on the x axis compare heights + if ($cropRatio < $imageRatio && $this->getHeight() < $height) return $this->Fill($this->getHeight()*$cropRatio, $this->getHeight()); + // Otherwise we're cropping on the y axis (or not cropping at all) so compare widths + if ($this->getWidth() < $width) return $this->Fill($this->getWidth(), $this->getWidth()/$cropRatio); + + return $this->Fill($width, $height); + } + + /** + * Fit image to specified dimensions and fill leftover space with a solid colour (default white). Use in templates with $Pad. + * + * @param integer $width The width to size to + * @param integer $height The height to size to + * @return Image + */ + public function Pad($width, $height, $backgroundColor='FFFFFF') { + return $this->isSize($width, $height) && !Config::inst()->get('Image', 'force_resample') + ? $this + : $this->getFormattedImage('Pad', $width, $height, $backgroundColor); + } + + /** + * Fit image to specified dimensions and fill leftover space with a solid colour (default white). Use in templates with $Pad. + * + * @param Image_Backend $backend + * @param integer $width The width to size to + * @param integer $height The height to size to + * @return Image_Backend + */ + public function generatePad(Image_Backend $backend, $width, $height, $backgroundColor='FFFFFF') { + return $backend->paddedResize($width, $height, $backgroundColor); + } + + /** + * Scale image proportionally by width. Use in templates with $ScaleWidth. + * + * @param integer $width The width to set + * @return Image + */ + public function ScaleWidth($width) { + return $this->isWidth($width) && !Config::inst()->get('Image', 'force_resample') + ? $this + : $this->getFormattedImage('ScaleWidth', $width); + } + + /** + * Scale image proportionally by width. Use in templates with $ScaleWidth. + * + * @param Image_Backend $backend + * @param int $width The width to set + * @return Image_Backend + */ + public function generateScaleWidth(Image_Backend $backend, $width) { + return $backend->resizeByWidth($width); + } + + /** + * Proportionally scale down this image if it is wider than the specified width. + * Similar to ScaleWidth but without up-sampling. Use in templates with $ScaleMaxWidth. + * + * @uses Image::ScaleWidth() + * @param integer $width The maximum width of the output image + * @return Image + */ + public function ScaleMaxWidth($width) { + // Temporary $force_resample support for 3.x, to be removed in 4.0 + if (Config::inst()->get('Image', 'force_resample') && $this->getWidth() <= $width) return $this->ScaleWidth($this->getWidth()); + + return $this->getWidth() > $width + ? $this->ScaleWidth($width) + : $this; + } + + /** + * Scale image proportionally by height. Use in templates with $ScaleHeight. + * + * @param integer $height The height to set + * @return Image + */ + public function ScaleHeight($height) { + return $this->isHeight($height) && !Config::inst()->get('Image', 'force_resample') + ? $this + : $this->getFormattedImage('ScaleHeight', $height); + } + + /** + * Scale image proportionally by height. Use in templates with $ScaleHeight. + * + * @param Image_Backend $backend + * @param integer $height The height to set + * @return Image_Backend + */ + public function generateScaleHeight(Image_Backend $backend, $height){ + return $backend->resizeByHeight($height); + } + + /** + * Proportionally scale down this image if it is taller than the specified height. + * Similar to ScaleHeight but without up-sampling. Use in templates with $ScaleMaxHeight. + * + * @uses Image::ScaleHeight() + * @param integer $height The maximum height of the output image + * @return Image + */ + public function ScaleMaxHeight($height) { + // Temporary $force_resample support for 3.x, to be removed in 4.0 + if (Config::inst()->get('Image', 'force_resample') && $this->getHeight() <= $height) return $this->ScaleHeight($this->getHeight()); + + return $this->getHeight() > $height + ? $this->ScaleHeight($height) + : $this; + } + + /** + * Crop image on X axis if it exceeds specified width. Retain height. + * Use in templates with $CropWidth. Example: $Image.ScaleHeight(100).$CropWidth(100) + * + * @uses Image::Fill() + * @param integer $width The maximum width of the output image + * @return Image + */ + public function CropWidth($width) { + // Temporary $force_resample support for 3.x, to be removed in 4.0 + if (Config::inst()->get('Image', 'force_resample') && $this->getWidth() <= $width) return $this->Fill($this->getWidth(), $this->getHeight()); + + return $this->getWidth() > $width + ? $this->Fill($width, $this->getHeight()) + : $this; + } + + /** + * Crop image on Y axis if it exceeds specified height. Retain width. + * Use in templates with $CropHeight. Example: $Image.ScaleWidth(100).CropHeight(100) + * + * @uses Image::Fill() + * @param integer $height The maximum height of the output image + * @return Image + */ + public function CropHeight($height) { + // Temporary $force_resample support for 3.x, to be removed in 4.0 + if (Config::inst()->get('Image', 'force_resample') && $this->getHeight() <= $height) return $this->Fill($this->getWidth(), $this->getHeight()); + + return $this->getHeight() > $height + ? $this->Fill($this->getWidth(), $height) + : $this; + } + + /** + * Resize the image by preserving aspect ratio, keeping the image inside the + * $width and $height + * + * @param integer $width The width to size within + * @param integer $height The height to size within + * @return Image + * @deprecated 4.0 Use Fit instead + */ + public function SetRatioSize($width, $height) { + Deprecation::notice('4.0', 'Use Fit instead'); + return $this->Fit($width, $height); } /** @@ -250,8 +491,10 @@ class Image extends File implements Flushable { * @param integer $width The width to size within * @param integer $height The height to size within * @return Image_Backend + * @deprecated 4.0 Use generateFit instead */ public function generateSetRatioSize(Image_Backend $backend, $width, $height) { + Deprecation::notice('4.0', 'Use generateFit instead'); return $backend->resizeRatio($width, $height); } @@ -260,11 +503,11 @@ class Image extends File implements Flushable { * * @param integer $width The width to set * @return Image + * @deprecated 4.0 Use ScaleWidth instead */ public function SetWidth($width) { - return $this->isWidth($width) && !Config::inst()->get('Image', 'force_resample') - ? $this - : $this->getFormattedImage('SetWidth', $width); + Deprecation::notice('4.0', 'Use ScaleWidth instead'); + return $this->ScaleWidth($width); } /** @@ -273,8 +516,10 @@ class Image extends File implements Flushable { * @param Image_Backend $backend * @param int $width The width to set * @return Image_Backend + * @deprecated 4.0 Use generateScaleWidth instead */ public function generateSetWidth(Image_Backend $backend, $width) { + Deprecation::notice('4.0', 'Use generateScaleWidth instead'); return $backend->resizeByWidth($width); } @@ -283,11 +528,11 @@ class Image extends File implements Flushable { * * @param integer $height The height to set * @return Image + * @deprecated 4.0 Use ScaleHeight instead */ public function SetHeight($height) { - return $this->isHeight($height) && !Config::inst()->get('Image', 'force_resample') - ? $this - : $this->getFormattedImage('SetHeight', $height); + Deprecation::notice('4.0', 'Use ScaleHeight instead'); + return $this->ScaleHeight($height); } /** @@ -296,8 +541,10 @@ class Image extends File implements Flushable { * @param Image_Backend $backend * @param integer $height The height to set * @return Image_Backend + * @deprecated 4.0 Use generateScaleHeight instead */ public function generateSetHeight(Image_Backend $backend, $height){ + Deprecation::notice('4.0', 'Use generateScaleHeight instead'); return $backend->resizeByHeight($height); } @@ -308,11 +555,11 @@ class Image extends File implements Flushable { * @param integer $width The width to size to * @param integer $height The height to size to * @return Image + * @deprecated 4.0 Use Pad instead */ public function SetSize($width, $height) { - return $this->isSize($width, $height) && !Config::inst()->get('Image', 'force_resample') - ? $this - : $this->getFormattedImage('SetSize', $width, $height); + Deprecation::notice('4.0', 'Use Pad instead'); + return $this->Pad($width, $height); } /** @@ -322,8 +569,10 @@ class Image extends File implements Flushable { * @param integer $width The width to size to * @param integer $height The height to size to * @return Image_Backend + * @deprecated 4.0 Use generatePad instead */ public function generateSetSize(Image_Backend $backend, $width, $height) { + Deprecation::notice('4.0', 'Use generatePad instead'); return $backend->paddedResize($width, $height); } @@ -370,11 +619,11 @@ class Image extends File implements Flushable { * @param integer $width The width to size to * @param integer $height The height to size to * @return Image + * @deprecated 4.0 Use Pad instead */ public function PaddedImage($width, $height, $backgroundColor='FFFFFF') { - return $this->isSize($width, $height) && !Config::inst()->get('Image', 'force_resample') - ? $this - : $this->getFormattedImage('PaddedImage', $width, $height, $backgroundColor); + Deprecation::notice('4.0', 'Use Pad instead'); + return $this->Pad($width, $height, $backgroundColor); } /** @@ -384,8 +633,10 @@ class Image extends File implements Flushable { * @param integer $width The width to size to * @param integer $height The height to size to * @return Image_Backend + * @deprecated 4.0 Use generatePad instead */ public function generatePaddedImage(Image_Backend $backend, $width, $height, $backgroundColor='FFFFFF') { + Deprecation::notice('4.0', 'Use generatePad instead'); return $backend->paddedResize($width, $height, $backgroundColor); } @@ -547,11 +798,11 @@ class Image extends File implements Flushable { * @param integer $width Width to crop to * @param integer $height Height to crop to * @return Image + * @deprecated 4.0 Use Fill instead */ public function CroppedImage($width, $height) { - return $this->isSize($width, $height) && !Config::inst()->get('Image', 'force_resample') - ? $this - : $this->getFormattedImage('CroppedImage', $width, $height); + Deprecation::notice('4.0', 'Use Fill instead'); + return $this->Fill($width, $height); } /** @@ -562,8 +813,10 @@ class Image extends File implements Flushable { * @param integer $width Width to crop to * @param integer $height Height to crop to * @return Image_Backend + * @deprecated 4.0 Use generateFill instead */ public function generateCroppedImage(Image_Backend $backend, $width, $height) { + Deprecation::notice('4.0', 'Use generateFill instead'); return $backend->croppedResize($width, $height); } diff --git a/templates/Includes/HtmlEditorField_viewfile.ss b/templates/Includes/HtmlEditorField_viewfile.ss index a1cf734cb..b2c3251dd 100644 --- a/templates/Includes/HtmlEditorField_viewfile.ss +++ b/templates/Includes/HtmlEditorField_viewfile.ss @@ -3,7 +3,7 @@
<% if $Width %> - $Preview.SetRatioSize(30, 40) + $Preview.Fit(30, 40) <% else %> <% end_if %> diff --git a/tests/filesystem/GDTest.php b/tests/filesystem/GDTest.php index dfc3b79af..1cca549c8 100644 --- a/tests/filesystem/GDTest.php +++ b/tests/filesystem/GDTest.php @@ -161,7 +161,7 @@ class GDTest extends SapphireTest { $fullPath = realpath(dirname(__FILE__) . '/gdtest/test_jpg.jpg'); try { - $gdFailure = new GDBackend_Failure($fullPath, array('SetWidth', 123)); + $gdFailure = new GDBackend_Failure($fullPath, array('ScaleWidth', 123)); $this->fail('GDBackend_Failure should throw an exception when setting image resource'); } catch (GDBackend_Failure_Exception $e) { $cache = SS_Cache::factory('GDBackend_Manipulations'); @@ -169,8 +169,8 @@ class GDTest extends SapphireTest { $data = unserialize($cache->load($key)); - $this->assertArrayHasKey('SetWidth|123', $data); - $this->assertTrue($data['SetWidth|123']); + $this->assertArrayHasKey('ScaleWidth|123', $data); + $this->assertTrue($data['ScaleWidth|123']); } } @@ -183,12 +183,12 @@ class GDTest extends SapphireTest { $fullPath = realpath(dirname(__FILE__) . '/gdtest/test_jpg.jpg'); try { - $gdFailure = new GDBackend_Failure($fullPath, array('SetWidth-failed', 123)); + $gdFailure = new GDBackend_Failure($fullPath, array('ScaleWidth-failed', 123)); $this->fail('GDBackend_Failure should throw an exception when setting image resource'); } catch (GDBackend_Failure_Exception $e) { - $gd = new GDBackend($fullPath, array('SetWidth', 123)); - $this->assertTrue($gd->failedResample($fullPath, 'SetWidth-failed|123')); - $this->assertFalse($gd->failedResample($fullPath, 'SetWidth-not-failed|123')); + $gd = new GDBackend($fullPath, array('ScaleWidth', 123)); + $this->assertTrue($gd->failedResample($fullPath, 'ScaleWidth-failed|123')); + $this->assertFalse($gd->failedResample($fullPath, 'ScaleWidth-not-failed|123')); } } diff --git a/tests/model/GDImageTest.php b/tests/model/GDImageTest.php index f950ff977..f095e3ceb 100644 --- a/tests/model/GDImageTest.php +++ b/tests/model/GDImageTest.php @@ -34,13 +34,13 @@ class GDImageTest extends ImageTest { try { // Simluate a failed manipulation - $gdFailure = new GDBackend_Failure($fullPath, array('SetWidth', 123)); + $gdFailure = new GDBackend_Failure($fullPath, array('ScaleWidth', 123)); $this->fail('GDBackend_Failure should throw an exception when setting image resource'); } catch (GDBackend_Failure_Exception $e) { // Check that the cache has stored the manipulation failure $data = unserialize($cache->load($key)); - $this->assertArrayHasKey('SetWidth|123', $data); - $this->assertTrue($data['SetWidth|123']); + $this->assertArrayHasKey('ScaleWidth|123', $data); + $this->assertTrue($data['ScaleWidth|123']); // Delete the image object $image->delete(); diff --git a/tests/model/ImageTest.php b/tests/model/ImageTest.php index fe1e467e1..e9d87d8dc 100644 --- a/tests/model/ImageTest.php +++ b/tests/model/ImageTest.php @@ -100,7 +100,7 @@ class ImageTest extends SapphireTest { public function testMultipleGenerateManipulationCalls() { $image = $this->objFromFixture('Image', 'imageWithoutTitle'); - $imageFirst = $image->SetWidth(200); + $imageFirst = $image->ScaleWidth(200); $this->assertNotNull($imageFirst); $expected = 200; $actual = $imageFirst->getWidth(); @@ -124,27 +124,27 @@ class ImageTest extends SapphireTest { $this->assertTrue($image->isSize(300, 300)); // Set width to 300 pixels - $imageSetWidth = $image->SetWidth(300); - $this->assertEquals($imageSetWidth->getWidth(), 300); - $this->assertEquals($image->Filename, $imageSetWidth->Filename); + $imageScaleWidth = $image->ScaleWidth(300); + $this->assertEquals($imageScaleWidth->getWidth(), 300); + $this->assertEquals($image->Filename, $imageScaleWidth->Filename); // Set height to 300 pixels - $imageSetHeight = $image->SetHeight(300); - $this->assertEquals($imageSetHeight->getHeight(), 300); - $this->assertEquals($image->Filename, $imageSetHeight->Filename); + $imageScaleHeight = $image->ScaleHeight(300); + $this->assertEquals($imageScaleHeight->getHeight(), 300); + $this->assertEquals($image->Filename, $imageScaleHeight->Filename); // Crop image to 300 x 300 - $imageCropped = $image->CroppedImage(300, 300); + $imageCropped = $image->Fill(300, 300); $this->assertTrue($imageCropped->isSize(300, 300)); $this->assertEquals($image->Filename, $imageCropped->Filename); // Resize (padded) to 300 x 300 - $imageSized = $image->SetSize(300, 300); + $imageSized = $image->Pad(300, 300); $this->assertTrue($imageSized->isSize(300, 300)); $this->assertEquals($image->Filename, $imageSized->Filename); // Padded image 300 x 300 (same as above) - $imagePadded = $image->PaddedImage(300, 300); + $imagePadded = $image->Pad(300, 300); $this->assertTrue($imagePadded->isSize(300, 300)); $this->assertEquals($image->Filename, $imagePadded->Filename); @@ -153,16 +153,16 @@ class ImageTest extends SapphireTest { $this->assertTrue($imageStretched->isSize(300, 300)); $this->assertEquals($image->Filename, $imageStretched->Filename); - // SetRatioSize (various options) - $imageSetRatioSize = $image->SetRatioSize(300, 600); - $this->assertTrue($imageSetRatioSize->isSize(300, 300)); - $this->assertEquals($image->Filename, $imageSetRatioSize->Filename); - $imageSetRatioSize = $image->SetRatioSize(600, 300); - $this->assertTrue($imageSetRatioSize->isSize(300, 300)); - $this->assertEquals($image->Filename, $imageSetRatioSize->Filename); - $imageSetRatioSize = $image->SetRatioSize(300, 300); - $this->assertTrue($imageSetRatioSize->isSize(300, 300)); - $this->assertEquals($image->Filename, $imageSetRatioSize->Filename); + // Fit (various options) + $imageFit = $image->Fit(300, 600); + $this->assertTrue($imageFit->isSize(300, 300)); + $this->assertEquals($image->Filename, $imageFit->Filename); + $imageFit = $image->Fit(600, 300); + $this->assertTrue($imageFit->isSize(300, 300)); + $this->assertEquals($image->Filename, $imageFit->Filename); + $imageFit = $image->Fit(300, 300); + $this->assertTrue($imageFit->isSize(300, 300)); + $this->assertEquals($image->Filename, $imageFit->Filename); } /** @@ -178,27 +178,27 @@ class ImageTest extends SapphireTest { Config::inst()->update('Image', 'force_resample', true); // Set width to 300 pixels - $imageSetWidth = $image->SetWidth(300); - $this->assertEquals($imageSetWidth->getWidth(), 300); - $this->assertNotEquals($image->Filename, $imageSetWidth->Filename); + $imageScaleWidth = $image->ScaleWidth(300); + $this->assertEquals($imageScaleWidth->getWidth(), 300); + $this->assertNotEquals($image->Filename, $imageScaleWidth->Filename); // Set height to 300 pixels - $imageSetHeight = $image->SetHeight(300); - $this->assertEquals($imageSetHeight->getHeight(), 300); - $this->assertNotEquals($image->Filename, $imageSetHeight->Filename); + $imageScaleHeight = $image->ScaleHeight(300); + $this->assertEquals($imageScaleHeight->getHeight(), 300); + $this->assertNotEquals($image->Filename, $imageScaleHeight->Filename); // Crop image to 300 x 300 - $imageCropped = $image->CroppedImage(300, 300); + $imageCropped = $image->Fill(300, 300); $this->assertTrue($imageCropped->isSize(300, 300)); $this->assertNotEquals($image->Filename, $imageCropped->Filename); // Resize (padded) to 300 x 300 - $imageSized = $image->SetSize(300, 300); + $imageSized = $image->Pad(300, 300); $this->assertTrue($imageSized->isSize(300, 300)); $this->assertNotEquals($image->Filename, $imageSized->Filename); // Padded image 300 x 300 (same as above) - $imagePadded = $image->PaddedImage(300, 300); + $imagePadded = $image->Pad(300, 300); $this->assertTrue($imagePadded->isSize(300, 300)); $this->assertNotEquals($image->Filename, $imagePadded->Filename); @@ -207,16 +207,16 @@ class ImageTest extends SapphireTest { $this->assertTrue($imageStretched->isSize(300, 300)); $this->assertNotEquals($image->Filename, $imageStretched->Filename); - // SetRatioSize (various options) - $imageSetRatioSize = $image->SetRatioSize(300, 600); - $this->assertTrue($imageSetRatioSize->isSize(300, 300)); - $this->assertNotEquals($image->Filename, $imageSetRatioSize->Filename); - $imageSetRatioSize = $image->SetRatioSize(600, 300); - $this->assertTrue($imageSetRatioSize->isSize(300, 300)); - $this->assertNotEquals($image->Filename, $imageSetRatioSize->Filename); - $imageSetRatioSize = $image->SetRatioSize(300, 300); - $this->assertTrue($imageSetRatioSize->isSize(300, 300)); - $this->assertNotEquals($image->Filename, $imageSetRatioSize->Filename); + // Fit (various options) + $imageFit = $image->Fit(300, 600); + $this->assertTrue($imageFit->isSize(300, 300)); + $this->assertNotEquals($image->Filename, $imageFit->Filename); + $imageFit = $image->Fit(600, 300); + $this->assertTrue($imageFit->isSize(300, 300)); + $this->assertNotEquals($image->Filename, $imageFit->Filename); + $imageFit = $image->Fit(300, 300); + $this->assertTrue($imageFit->isSize(300, 300)); + $this->assertNotEquals($image->Filename, $imageFit->Filename); Config::inst()->update('Image', 'force_resample', $origForceResample); } @@ -225,20 +225,52 @@ class ImageTest extends SapphireTest { $this->assertTrue($image->isSize(300, 300)); // Test normal resize - $resized = $image->SetSize(150, 100); + $resized = $image->Pad(150, 100); $this->assertTrue($resized->isSize(150, 100)); // Test cropped resize - $cropped = $image->CroppedImage(100, 200); + $cropped = $image->Fill(100, 200); $this->assertTrue($cropped->isSize(100, 200)); // Test padded resize - $padded = $image->PaddedImage(200, 100); + $padded = $image->Pad(200, 100); $this->assertTrue($padded->isSize(200, 100)); - // Test SetRatioSize - $ratio = $image->SetRatioSize(80, 160); + // Test Fit + $ratio = $image->Fit(80, 160); $this->assertTrue($ratio->isSize(80, 80)); + + // Test FitMax + $fitMaxDn = $image->FitMax(200, 100); + $this->assertTrue($fitMaxDn->isSize(100, 100)); + $fitMaxUp = $image->FitMax(500, 400); + $this->assertTrue($fitMaxUp->isSize(300, 300)); + + //Test ScaleMax + $scaleMaxWDn = $image->ScaleMaxWidth(200); + $this->assertTrue($scaleMaxWDn->isSize(200, 200)); + $scaleMaxWUp = $image->ScaleMaxWidth(400); + $this->assertTrue($scaleMaxWUp->isSize(300, 300)); + $scaleMaxHDn = $image->ScaleMaxHeight(200); + $this->assertTrue($scaleMaxHDn->isSize(200, 200)); + $scaleMaxHUp = $image->ScaleMaxHeight(400); + $this->assertTrue($scaleMaxHUp->isSize(300, 300)); + + // Test FillMax + $cropMaxDn = $image->FillMax(200, 100); + $this->assertTrue($cropMaxDn->isSize(200, 100)); + $cropMaxUp = $image->FillMax(400, 200); + $this->assertTrue($cropMaxUp->isSize(300, 150)); + + // Test Clip + $clipWDn = $image->CropWidth(200); + $this->assertTrue($clipWDn->isSize(200, 300)); + $clipWUp = $image->CropWidth(400); + $this->assertTrue($clipWUp->isSize(300, 300)); + $clipHDn = $image->CropHeight(200); + $this->assertTrue($clipHDn->isSize(300, 200)); + $clipHUp = $image->CropHeight(400); + $this->assertTrue($clipHUp->isSize(300, 300)); } /** @@ -247,15 +279,15 @@ class ImageTest extends SapphireTest { public function testGenerateImageWithInvalidParameters() { $image = $this->objFromFixture('Image', 'imageWithoutTitle'); $image->setHeight('String'); - $image->PaddedImage(600,600,'XXXXXX'); + $image->Pad(600,600,'XXXXXX'); } public function testCacheFilename() { $image = $this->objFromFixture('Image', 'imageWithoutTitle'); - $imageFirst = $image->SetSize(200,200); + $imageFirst = $image->Pad(200,200,'CCCCCC'); $imageFilename = $imageFirst->getFullPath(); // Encoding of the arguments is duplicated from cacheFilename - $neededPart = 'SetSize' . base64_encode(json_encode(array(200,200))); + $neededPart = 'Pad' . base64_encode(json_encode(array(200,200,'CCCCCC'))); $this->assertContains($neededPart, $imageFilename, 'Filename for cached image is correctly generated'); } @@ -263,7 +295,7 @@ class ImageTest extends SapphireTest { $image = $this->objFromFixture('Image', 'imageWithoutTitle'); $folder = new SS_FileFinder(); - $imageFirst = $image->SetSize(200,200); + $imageFirst = $image->Pad(200,200); $this->assertNotNull($imageFirst); $expected = 200; $actual = $imageFirst->getWidth(); @@ -276,7 +308,7 @@ class ImageTest extends SapphireTest { $actual = $imageSecond->getHeight(); $this->assertEquals($expected, $actual); - $imageThird = $imageSecond->PaddedImage(600,600,'0F0F0F'); + $imageThird = $imageSecond->Pad(600,600,'0F0F0F'); // Encoding of the arguments is duplicated from cacheFilename $argumentString = base64_encode(json_encode(array(600,600,'0F0F0F'))); $this->assertNotNull($imageThird); @@ -300,7 +332,7 @@ class ImageTest extends SapphireTest { public function testRegenerateImages() { $image = $this->objFromFixture('Image', 'imageWithMetacharacters'); - $image_generated = $image->SetWidth(200); + $image_generated = $image->ScaleWidth(200); $p = $image_generated->getFullPath(); $this->assertTrue(file_exists($p), 'Resized image exists after creation call'); $this->assertEquals(1, $image->regenerateFormattedImages(), 'Cached images were regenerated correct'); @@ -315,7 +347,7 @@ class ImageTest extends SapphireTest { */ public function testRegenerateImagesWithRenaming() { $image = $this->objFromFixture('Image', 'imageWithMetacharacters'); - $image_generated = $image->SetWidth(200); + $image_generated = $image->ScaleWidth(200); $p = $image_generated->getFullPath(); $this->assertTrue(file_exists($p), 'Resized image exists after creation call'); @@ -337,7 +369,7 @@ class ImageTest extends SapphireTest { public function testGeneratedImageDeletion() { $image = $this->objFromFixture('Image', 'imageWithMetacharacters'); - $image_generated = $image->SetWidth(200); + $image_generated = $image->ScaleWidth(200); $p = $image_generated->getFullPath(); $this->assertTrue(file_exists($p), 'Resized image exists after creation call'); $numDeleted = $image->deleteFormattedImages(); @@ -351,11 +383,11 @@ class ImageTest extends SapphireTest { public function testMultipleGenerateManipulationCallsImageDeletion() { $image = $this->objFromFixture('Image', 'imageWithMetacharacters'); - $firstImage = $image->SetWidth(200); + $firstImage = $image->ScaleWidth(200); $firstImagePath = $firstImage->getFullPath(); $this->assertTrue(file_exists($firstImagePath)); - $secondImage = $firstImage->SetHeight(100); + $secondImage = $firstImage->ScaleHeight(100); $secondImagePath = $secondImage->getFullPath(); $this->assertTrue(file_exists($secondImagePath)); @@ -369,11 +401,11 @@ class ImageTest extends SapphireTest { */ public function testPathPropertiesCachedImage() { $image = $this->objFromFixture('Image', 'imageWithMetacharacters'); - $firstImage = $image->SetWidth(200); + $firstImage = $image->ScaleWidth(200); $firstImagePath = $firstImage->getRelativePath(); $this->assertEquals($firstImagePath, $firstImage->Filename); - $secondImage = $firstImage->SetHeight(100); + $secondImage = $firstImage->ScaleHeight(100); $secondImagePath = $secondImage->getRelativePath(); $this->assertEquals($secondImagePath, $secondImage->Filename); }