diff --git a/resources/builtin/image-100x100.png b/resources/builtin/image-100x100.png new file mode 100644 index 0000000000..c56a9aa083 Binary files /dev/null and b/resources/builtin/image-100x100.png differ diff --git a/resources/builtin/image-220x220.png b/resources/builtin/image-220x220.png new file mode 100644 index 0000000000..928b5b05eb Binary files /dev/null and b/resources/builtin/image-220x220.png differ diff --git a/resources/builtin/image-280x210.png b/resources/builtin/image-280x210.png new file mode 100644 index 0000000000..48237b045e Binary files /dev/null and b/resources/builtin/image-280x210.png differ diff --git a/src/applications/files/controller/PhabricatorFileTransformController.php b/src/applications/files/controller/PhabricatorFileTransformController.php index 9b893b9528..a7fcbc3c0a 100644 --- a/src/applications/files/controller/PhabricatorFileTransformController.php +++ b/src/applications/files/controller/PhabricatorFileTransformController.php @@ -54,7 +54,18 @@ final class PhabricatorFileTransformController if (isset($xforms[$transform])) { $xform = $xforms[$transform]; if ($xform->canApplyTransform($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 index d88451a0de..75c16e2ddf 100644 --- a/src/applications/files/transform/PhabricatorFileThumbnailTransform.php +++ b/src/applications/files/transform/PhabricatorFileThumbnailTransform.php @@ -71,4 +71,20 @@ final class PhabricatorFileThumbnailTransform } } + 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 index 7a36641140..f12aefd3ed 100644 --- a/src/applications/files/transform/PhabricatorFileTransform.php +++ b/src/applications/files/transform/PhabricatorFileTransform.php @@ -7,6 +7,10 @@ abstract class PhabricatorFileTransform extends Phobject { 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); }