From fa19618d267fad2a8a866facdd03594471c6948b Mon Sep 17 00:00:00 2001 From: Debarghya Das Date: Sat, 19 Jan 2013 18:43:35 -0800 Subject: [PATCH] Made Meme Generator Summary: Fixed T2353 Test Plan: Checked whether same text generated the same URL Reviewers: epriestley Reviewed By: epriestley CC: aran, Korvin Maniphest Tasks: T2353 Differential Revision: https://secure.phabricator.com/D4551 --- resources/font/tuffy.ttf | Bin 0 -> 105220 bytes src/__phutil_library_map__.php | 2 + .../files/PhabricatorImageTransformer.php | 103 ++++++++++++++++++ .../PhabricatorApplicationMacro.php | 1 + .../PhabricatorMacroMemeController.php | 45 ++++++++ 5 files changed, 151 insertions(+) create mode 100644 resources/font/tuffy.ttf create mode 100644 src/applications/macro/controller/PhabricatorMacroMemeController.php diff --git a/resources/font/tuffy.ttf b/resources/font/tuffy.ttf new file mode 100644 index 0000000000000000000000000000000000000000..9df064674f5f92644a832e5c081aeef2fefe3117 GIT binary patch literal 105220 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 z

Qk=7tCNX#=}y>>9g%gPkA+H?EI$%QR9Cx=n}dL(44$Rc=?D1OgGkM##kL&Pqc? zViLjWBRGJan2n<420PP^KT_D4a2judxvLN`iA>QoA!Hb3Hm3G>@ zQq(a$)6S}R*;KUz-w;G21-`g(56lQ+^oX9}jv7E0kBq<%+QKndxPmAR!Zd!S5PpU3 z=F-w&pfs54Eg3yOTH?)RH`(RUQ3A{QQG&H*bd+6YH%WVGAg81RQSESW`}xt)^Cdn5 z42-Hr=&=!2O%C$UNTg_l9OUg)okx3*1E%Mph1(iMums?ey~H%$dOnci;~;|Jf?9d* zfznyIRisczBn*!nIyBinOa}%=1_mf?D6Jo$gSf0KX`ss0aL2^Kg@uLTepAQra(I9L z=xG1`Fdc3vHPQL~{Uam&`y&;mlExug(cd>Z+Sgwpo*iyC_YcdsBlB3yt^iIWI0Y3+ zhRUChq7>jo-aK=YRz5L8!=6HpVpeq4+3(~8*dndfXd({H0Lket(rd*;e@Rr&V3??q4HQR;z$6d`OFULVQZU=dZE8$$DM9`w zUNGDnZt>N$g$KGxsD*nswvxQ=!EjrRuXX4iEuc5qnaSSq-i3(8=XU$(jRo9HlAMS+ za)Q%C@5X&ei#BQa$+*}C$e{o@%MhZ7F-0+JDMJ=K5FfLATB9jhkW43;g~A~?p4!fw z9_}eAubnv3G2LS_XQU6Z)pKXq%8BLKUi5g>@}|&EEywJRYQKW)@l{5 zSouj!ld636ZFN1`&EskWf%jbk8a=DkMAlI*m**Cl z;c%B&S=7NRb)iZ_Hpgh-=roLuh^`bcim)eGwbqWjpf(z%+W>kE;K4@lY4kaP~s zKs)MHdnJ!L1ClhXar~qUu8K(px{dOhiU(OKn4c8cUXr<9efnW8bw@6f+5$#e|5tlo zAK27&-hI!xSJy%)iV#Amj;aVDWYtj=S(aqsIF1oQaU92S9mjE8>e@y&HW9Wf%Z}qx z*L5kQlv2tVrHnDgD5H!qMj2}vV=QHiF_xxj#lwG0G@qX|OKu@7#MVn~-#A zvc2ygef4qfbI-l^Jm);mx##QoI7CRmAK(#cu{7=-9@*PyCc+l#-m;}@T(c`0@7l7( zXlZ2TM2!~UBZB*8rMyD7S6y?pvJno{E@9LGnUHAV)G>Ptywl0V`Uy^5=|oLsvvlf| z)Vw*Zx6)v2ymB+BbI`JB^SX@3b~s*{^_{4xs3%f-B(ry)lsTTE3JHT0qv9xubyNE4 z3lke9*LRNA?Q1!5VpaC^u9r@#`O?-tSX(GSRbt*p*?we}e$m-zaL@!6 zglSPEWSfnaiKy}oZ;@M+y6f#Ljt^~Kzi!Kre`L+>Ekj+w%9v-HynXH1h8>1zwqLh_j9W4rq?=-zmUYFZmQLdeAYTh(awf@9bEArJ1 z{d|wK1$}T8_{>bxY-Le3C=JanK)VPX5VZXW1<0A+=Rv4Og$2Ma0tzVx^u3zs_PK8L}mfD&v z>yy>%m5UwZC1UVu*WAi!T-#b(yLnwQxk0(u26mwyy^Z!1-g?yCs|qM7K;4bZqhu~D z4J@QgV0*7vNRc3l$1XdS%ezRRPfx^9~Z&rCfH=QAs(j zoP`25@$DhSq@JSvI|j?gFvZ06+#cm+<$y%OB#t>NqzAg|zTDDRMwfpR`fY@2}T_R-e@�Z?C4*i}c^n$(uHY9EEfLDQARGqae!0#>tF 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 literal 0 HcmV?d00001 diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index ae6eef9c8c..cdaba398dc 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -925,6 +925,7 @@ phutil_register_library_map(array( 'PhabricatorMacroEditController' => 'applications/macro/controller/PhabricatorMacroEditController.php', 'PhabricatorMacroEditor' => 'applications/macro/editor/PhabricatorMacroEditor.php', 'PhabricatorMacroListController' => 'applications/macro/controller/PhabricatorMacroListController.php', + 'PhabricatorMacroMemeController' => 'applications/macro/controller/PhabricatorMacroMemeController.php', 'PhabricatorMacroReplyHandler' => 'applications/macro/mail/PhabricatorMacroReplyHandler.php', 'PhabricatorMacroTransaction' => 'applications/macro/storage/PhabricatorMacroTransaction.php', 'PhabricatorMacroTransactionComment' => 'applications/macro/storage/PhabricatorMacroTransactionComment.php', @@ -2308,6 +2309,7 @@ phutil_register_library_map(array( 'PhabricatorMacroEditController' => 'PhabricatorMacroController', 'PhabricatorMacroEditor' => 'PhabricatorApplicationTransactionEditor', 'PhabricatorMacroListController' => 'PhabricatorMacroController', + 'PhabricatorMacroMemeController' => 'PhabricatorMacroController', 'PhabricatorMacroReplyHandler' => 'PhabricatorMailReplyHandler', 'PhabricatorMacroTransaction' => 'PhabricatorApplicationTransaction', 'PhabricatorMacroTransactionComment' => 'PhabricatorApplicationTransactionComment', diff --git a/src/applications/files/PhabricatorImageTransformer.php b/src/applications/files/PhabricatorImageTransformer.php index 2bf565d43f..4f0f86edee 100644 --- a/src/applications/files/PhabricatorImageTransformer.php +++ b/src/applications/files/PhabricatorImageTransformer.php @@ -2,6 +2,18 @@ final class PhabricatorImageTransformer { + public function executeMemeTransform( + PhabricatorFile $file, + $upper_text, + $lower_text) { + $image = $this->applyMemeTo($file, $upper_text, $lower_text); + return PhabricatorFile::newFromFileData( + $image, + array( + 'name' => 'meme-'.$file->getName(), + )); + } + public function executeThumbTransform( PhabricatorFile $file, $x, @@ -134,6 +146,97 @@ final class PhabricatorImageTransformer { return $this->saveImageDataInAnyFormat($dst, $file->getMimeType()); } + private function applyMemeTo( + PhabricatorFile $file, + $upper_text, + $lower_text) { + $data = $file->loadFileData(); + $img = imagecreatefromstring($data); + $phabricator_root = dirname(phutil_get_library_root('phabricator')); + $font_path = $phabricator_root.'/resources/font/tuffy.ttf'; + $white = imagecolorallocate($img, 255, 255, 255); + $black = imagecolorallocate($img, 0, 0, 0); + $border_width = 3; + $font_max = 200; + $font_min = 5; + for ($i = $font_max; $i > $font_min; $i--) { + $fit = $this->doesTextBoundingBoxFitInImage( + $img, + $upper_text, + $i, + $font_path); + if ($fit['doesfit']) { + $x = ($fit['imgwidth'] - $fit['txtwidth']) / 2; + $y = $fit['txtheight'] + 10; + $this->makeImageWithTextBorder($img, + $i, + $x, + $y, + $white, + $black, + $border_width, + $font_path, + $upper_text); + break; + } + } + for ($i = $font_max; $i > $font_min; $i--) { + $fit = $this->doesTextBoundingBoxFitInImage($img, + $lower_text, $i, $font_path); + if ($fit['doesfit']) { + $x = ($fit['imgwidth'] - $fit['txtwidth']) / 2; + $y = $fit['imgheight'] - 10; + $this->makeImageWithTextBorder( + $img, + $i, + $x, + $y, + $white, + $black, + $border_width, + $font_path, + $lower_text); + break; + } + } + return $this->saveImageDataInAnyFormat($img, $file->getMimeType()); + } + + private function makeImageWithTextBorder($img, $font_size, $x, $y, + $color, $stroke_color, $bw, $font, $text) { + $angle = 0; + $bw = abs($bw); + for ($c1 = $x - $bw; $c1 <= $x + $bw; $c1++) { + for ($c2 = $y - $bw; $c2 <= $y + $bw; $c2++) { + if (!(($c1 == $x - $bw || $x + $bw) && + $c2 == $y - $bw || $c2 == $y + $bw)) { + $bg = imagettftext($img, $font_size, + $angle, $c1, $c2, $stroke_color, $font, $text); + } + } + } + imagettftext($img, $font_size, $angle, + $x , $y, $color , $font, $text); + } + + private function doesTextBoundingBoxFitInImage($img, + $text, $font_size, $font_path) { + // Default Angle = 0 + $angle = 0; + + $bbox = imagettfbbox($font_size, $angle, $font_path, $text); + $text_height = abs($bbox[3] - $bbox[5]); + $text_width = abs($bbox[0] - $bbox[2]); + return array( + "doesfit" => ($text_height * 1.05 <= imagesy($img) + && $text_width * 1.05 <= imagesx($img)), + "txtwidth" => $text_width, + "txtheight" => $text_height, + "imgwidth" => imagesx($img), + "imgheight" => imagesy($img), + ); + } + private function saveImageDataInAnyFormat($data, $preferred_mime = '') { switch ($preferred_mime) { case 'image/gif': // GIF doesn't support true color. diff --git a/src/applications/macro/application/PhabricatorApplicationMacro.php b/src/applications/macro/application/PhabricatorApplicationMacro.php index a2f68437e1..1edca56440 100644 --- a/src/applications/macro/application/PhabricatorApplicationMacro.php +++ b/src/applications/macro/application/PhabricatorApplicationMacro.php @@ -31,6 +31,7 @@ final class PhabricatorApplicationMacro extends PhabricatorApplication { 'comment/(?P[1-9]\d*)/' => 'PhabricatorMacroCommentController', 'edit/(?P[1-9]\d*)/' => 'PhabricatorMacroEditController', 'disable/(?P[1-9]\d*)/' => 'PhabricatorMacroDisableController', + 'meme/' => 'PhabricatorMacroMemeController', ), ); } diff --git a/src/applications/macro/controller/PhabricatorMacroMemeController.php b/src/applications/macro/controller/PhabricatorMacroMemeController.php new file mode 100644 index 0000000000..bfaa50c666 --- /dev/null +++ b/src/applications/macro/controller/PhabricatorMacroMemeController.php @@ -0,0 +1,45 @@ +getRequest(); + $macro_name = $request->getStr('macro'); + $upper_text = $request->getStr('uppertext'); + $lower_text = $request->getStr('lowertext'); + $user = $request->getUser(); + $macro = id(new PhabricatorFileImageMacro()) + ->loadOneWhere('name=%s', $macro_name); + if (!$macro) { + return new Aphront404Response(); + } + $file = id(new PhabricatorFile())->loadOneWhere( + 'phid = %s', + $macro->getFilePHID()); + + $upper_text = strtoupper($upper_text); + $lower_text = strtoupper($lower_text); + $mixed_text = $upper_text.":".$lower_text; + $hash = "meme".hash("sha256", $mixed_text); + $xform = id(new PhabricatorTransformedFile()) + ->loadOneWhere('originalphid=%s and transform=%s', + $file->getPHID(), $hash); + + if ($xform) { + $memefile = id(new PhabricatorFile())->loadOneWhere( + 'phid = %s', $xform->getTransformedPHID()); + return id(new AphrontRedirectResponse())->setURI($memefile->getBestURI()); + } + $unguarded = AphrontWriteGuard::beginScopedUnguardedWrites(); + $transformers = (new PhabricatorImageTransformer()); + $newfile = $transformers + ->executeMemeTransform($file, $upper_text, $lower_text); + $xfile = new PhabricatorTransformedFile(); + $xfile->setOriginalPHID($file->getPHID()); + $xfile->setTransformedPHID($newfile->getPHID()); + $xfile->setTransform($hash); + $xfile->save(); + return id(new AphrontRedirectResponse())->setURI($newfile->getBestURI()); + } +}