diff --git a/resources/builtin/image-100x100.png b/resources/builtin/image-100x100.png new file mode 100644 index 0000000000000000000000000000000000000000..c56a9aa0835ccbe7ab631b372d07a2b406d33872 GIT binary patch literal 993 zc%17D@N?(olHy`uVBq!ia0vp^DImzW1*#POj@;_H{wbPqwyZUxwrsH8~R|PQhM9MnTbEQ?}2|>G{JsVeYQqHk^}Z z-Yjo_qkn#n@#Y7ffB%>|@~Sb<=YLqvaxwh5`1QCTiI^7G2nZ5M6cmFXm`IB&Oe8T7 zRaxfr#OKp(?d<;j__sE0y}iACzum1TPf{#o{{4BnI#GhJh1F+kRBm;3bXKR$*{Ph7E6?^0Qj~m~ycv~j@*hNWj3O_$ztLk~pWfoReRa2+4d=Zma zyLPST2ZfLMqSx-HE?vBI>C!OwPX`#(|JLU3-?d9h<&5P9k-0%DORB58(-Z_EVq!wV zcYB^$!8$EmS%>4~>ZrATBo;7FIL3pCAaN65m}Ze^<{nAfySF6y>5xxFTX^TR8@5` z%$%K}^qsxgaqsGd3k}mbbzUcX+n;h#Dy*#RR1K2t30fJlF(M{DKHTtK6z^4~6-%m$ zcFwus^|bDSrM2~BiP&g%=kB#t{;DxYe{Q^))Ac*xP<+Os;Jb_13SFDT1+Hy9zv}GS zv#qVHDSzF-ZekFs$@Bb>#I^svzUAwyGiJ`5+1tw-bNALQr{etl^?&^jv{Y}k@V=e3 zWB>m7=b!K1=`3U~w8w;>kMDv0)IFD8me|OZUv!Le_%g%yMSWG(q*zuhA+?V?uE*xf zCJ5x*tZr`%)Dd%j`tM)dipbjMVi8Gms`lP9fA7(7wbpF^hu`{UOHVjX^-Aqf;SJgm zetKER`Rvpw?d|Q0_cTxU$=`f*i?4GwpVY4dPYTi_@2B+I^_@NOrcL$t`$F60QfFsw z*x-8W=FPzUFM1y7+_-GwYkf9VTW9|H{~s^Ex_kF-gwWhn)L=G*2iEPj~graQA>+|;i&*`t@ fOcMAjmcWn`HTC|gto!SMd6vP`)z4*}Q$iB}an!@D literal 0 Hc$@{( zJaZG%Q-e|yQz{EjrrIztu$=L9aSW-r_2#y`wLDfYpfl6KiFsef+ut`G@ zLAi8lI8K353SKUpi(C+t0Fqu5O+X5+2}q%60#c+}IH9{K_`?RTrJt_Pub(q_ZftzK z{r|gCQc_jb)%Abhes?-JQ#^I8((%ieFL!o!?pZWv)~sDSc4TB`7UsD|eqOR?&(58i zV%@uU@BaGrYiVie*1hN7zRlg^A0HoYQ}jOevq1$r2U~1Q8KGR$X}`E0B6_`g^B^0a{bFrh0W5%{!82 zW^wq{t5?5%Roy9co36H0BR)W?{i8(Sx9{J#Z`(HSUZ?s-N$cS0A9w886SJeZpg-?!PdTC-c39ZNoQ`bN*(o8Ftu4=y>AyKr*T>bUH1X=&-# zFJ5$9J%4m=h0yGc#!fynqh8FI^3(s+v17+d{C}QJo;7bs7DyJ~eaZ%(ZLR{$3Uv#cQQDWy7n?SNzqkKZCO8?r_(ce%e$gY|)8|wV{0)pJgVzEX>P$XZe5ef&VOAk7>LwBlI z+ft4BOCxgr{G9&%`0?XAbpp6rovN!}zP+uc9yVobc3xiH_jkwFty{Mz&wufWH>*8d zB5yCz*|v47CI5f*_!>pJWj3;N_fCx?=a2i(pUV-~U(YJRaCXnM^SLj0t$~FfgQu&X J%Q~loCII=wTSou@ literal 0 Hc$@iEBhjaDG}zd16s2gJVj5 zQmTSyZen_BP-AFu^F4jn&i(o8&-=k(=Z{}2KeMYdy?gt&y}$Gvlg*q74ju|B0zx3n!P&wB z!cI(zj6mE7lxn~#4OY@PfdQ;UK?S0OgA<|zhcrnRC|a^&G4f#Xv|_G#UOQv{y*_Wx z$IpNM+&Q^_d0)SNojZ5#{(s-9^`56|Ey)t%oa(i7;lhQ-xiV8yp8WW+W97<|J4J&+ zeV0uB{P}Z@-TsXm1H;3^qob?$f8V)dN5}VT>_n+UQvgDO8?~+6#Tid@^r(I&) z-d%TZU+rwZf72cdUiutTzI5^8$A7%K6c>5@eqZzR*RNmOW!fgptM`bsj0T!jUA^(< zty{P5-J4hYT`jYN^X1F>4!?utLO~s~mo_&yADUVrw0K#O$z2t-853Gue7h8zZr;4v z`FrUUcbl7c@9y2aXv%~MEk~xG-n=Dh!d=a!fx(%HiHTWRucBgaS}UkbFEia4vo1ns z+UchvK{lOda~xWK{``6L=+Pa`UDJG26hGQ$zB!WIa^>#byLaxy>=N=%GA>&-?NMP_ znOS*ib+z@nU+eBFNB*db3VXY6dZ)UBK)k!Q}aa~B7wWn`%fsnW(Y&7C-nHx2-7^Wjq~x+Nz+?8~$BzxCZ<@Vy z=gyt`_Sr2D^lcanApplyTransform($file)) { - $xformed_file = $xforms[$transform]->applyTransform($file); + try { + $xformed_file = $xforms[$transform]->applyTransform($file); + } catch (Exception $ex) { + // TODO: Provide a diagnostic mode to surface these to the viewer. + + // In normal transform mode, we ignore failures and generate a + // default transform instead. + } + } + + if (!$xformed_file) { + $xformed_file = $xform->getDefaultTransform($file); } } diff --git a/src/applications/files/transform/PhabricatorFileThumbnailTransform.php b/src/applications/files/transform/PhabricatorFileThumbnailTransform.php --- a/src/applications/files/transform/PhabricatorFileThumbnailTransform.php +++ b/src/applications/files/transform/PhabricatorFileThumbnailTransform.php @@ -71,4 +71,20 @@ } } + public function getDefaultTransform(PhabricatorFile $file) { + $x = (int)$this->dstX; + $y = (int)$this->dstY; + $name = 'image-'.$x.'x'.nonempty($y, $x).'.png'; + + $params = array( + 'name' => $name, + 'canCDN' => true, + ); + + $root = dirname(phutil_get_library_root('phabricator')); + $data = Filesystem::readFile($root.'/resources/builtin/'.$name); + + return PhabricatorFile::newFromFileData($data, $params); + } + } diff --git a/src/applications/files/transform/PhabricatorFileTransform.php b/src/applications/files/transform/PhabricatorFileTransform.php --- a/src/applications/files/transform/PhabricatorFileTransform.php +++ b/src/applications/files/transform/PhabricatorFileTransform.php @@ -7,6 +7,10 @@ abstract public function canApplyTransform(PhabricatorFile $file); abstract public function applyTransform(PhabricatorFile $file); + public function getDefaultTransform(PhabricatorFile $file) { + return null; + } + public function generateTransforms() { return array($this); }