Add a basic random image generator
Summary: Adds an abstract base class for random image generation. Implements a concrete subclass for generating Mondrian-like images.
Test Plan:
{F40759}
{F40760}
{F40761}
{F40762}
{F40763}
Reviewers: DeedyDas, AnhNhan
Reviewed By: AnhNhan
CC: chad, aran
Differential Revision: https://secure.phabricator.com/D5705
This commit is contained in:
@@ -1037,8 +1037,10 @@ phutil_register_library_map(array(
|
|||||||
'PhabricatorLDAPUnknownUserException' => 'applications/auth/ldap/PhabricatorLDAPUnknownUserException.php',
|
'PhabricatorLDAPUnknownUserException' => 'applications/auth/ldap/PhabricatorLDAPUnknownUserException.php',
|
||||||
'PhabricatorLDAPUnlinkController' => 'applications/auth/controller/PhabricatorLDAPUnlinkController.php',
|
'PhabricatorLDAPUnlinkController' => 'applications/auth/controller/PhabricatorLDAPUnlinkController.php',
|
||||||
'PhabricatorLintEngine' => 'infrastructure/lint/PhabricatorLintEngine.php',
|
'PhabricatorLintEngine' => 'infrastructure/lint/PhabricatorLintEngine.php',
|
||||||
|
'PhabricatorLipsumArtist' => 'applications/lipsum/image/PhabricatorLipsumArtist.php',
|
||||||
'PhabricatorLipsumGenerateWorkflow' => 'applications/lipsum/management/PhabricatorLipsumGenerateWorkflow.php',
|
'PhabricatorLipsumGenerateWorkflow' => 'applications/lipsum/management/PhabricatorLipsumGenerateWorkflow.php',
|
||||||
'PhabricatorLipsumManagementWorkflow' => 'applications/lipsum/management/PhabricatorLipsumManagementWorkflow.php',
|
'PhabricatorLipsumManagementWorkflow' => 'applications/lipsum/management/PhabricatorLipsumManagementWorkflow.php',
|
||||||
|
'PhabricatorLipsumMondrianArtist' => 'applications/lipsum/image/PhabricatorLipsumMondrianArtist.php',
|
||||||
'PhabricatorLiskDAO' => 'infrastructure/storage/lisk/PhabricatorLiskDAO.php',
|
'PhabricatorLiskDAO' => 'infrastructure/storage/lisk/PhabricatorLiskDAO.php',
|
||||||
'PhabricatorLocalDiskFileStorageEngine' => 'applications/files/engine/PhabricatorLocalDiskFileStorageEngine.php',
|
'PhabricatorLocalDiskFileStorageEngine' => 'applications/files/engine/PhabricatorLocalDiskFileStorageEngine.php',
|
||||||
'PhabricatorLocalTimeTestCase' => 'view/__tests__/PhabricatorLocalTimeTestCase.php',
|
'PhabricatorLocalTimeTestCase' => 'view/__tests__/PhabricatorLocalTimeTestCase.php',
|
||||||
@@ -2739,6 +2741,7 @@ phutil_register_library_map(array(
|
|||||||
'PhabricatorLintEngine' => 'PhutilLintEngine',
|
'PhabricatorLintEngine' => 'PhutilLintEngine',
|
||||||
'PhabricatorLipsumGenerateWorkflow' => 'PhabricatorLipsumManagementWorkflow',
|
'PhabricatorLipsumGenerateWorkflow' => 'PhabricatorLipsumManagementWorkflow',
|
||||||
'PhabricatorLipsumManagementWorkflow' => 'PhutilArgumentWorkflow',
|
'PhabricatorLipsumManagementWorkflow' => 'PhutilArgumentWorkflow',
|
||||||
|
'PhabricatorLipsumMondrianArtist' => 'PhabricatorLipsumArtist',
|
||||||
'PhabricatorLiskDAO' => 'LiskDAO',
|
'PhabricatorLiskDAO' => 'LiskDAO',
|
||||||
'PhabricatorLocalDiskFileStorageEngine' => 'PhabricatorFileStorageEngine',
|
'PhabricatorLocalDiskFileStorageEngine' => 'PhabricatorFileStorageEngine',
|
||||||
'PhabricatorLocalTimeTestCase' => 'PhabricatorTestCase',
|
'PhabricatorLocalTimeTestCase' => 'PhabricatorTestCase',
|
||||||
|
|||||||
@@ -104,7 +104,7 @@ final class PhabricatorImageTransformer {
|
|||||||
$x,
|
$x,
|
||||||
$scaled_y);
|
$scaled_y);
|
||||||
|
|
||||||
return $this->saveImageDataInAnyFormat($img, $file->getMimeType());
|
return self::saveImageDataInAnyFormat($img, $file->getMimeType());
|
||||||
}
|
}
|
||||||
|
|
||||||
private function crasslyCropTo(PhabricatorFile $file, $top, $left, $w, $h) {
|
private function crasslyCropTo(PhabricatorFile $file, $top, $left, $w, $h) {
|
||||||
@@ -126,7 +126,7 @@ final class PhabricatorImageTransformer {
|
|||||||
$w, $h,
|
$w, $h,
|
||||||
$orig_w, $orig_h);
|
$orig_w, $orig_h);
|
||||||
|
|
||||||
return $this->saveImageDataInAnyFormat($dst, $file->getMimeType());
|
return self::saveImageDataInAnyFormat($dst, $file->getMimeType());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -141,7 +141,7 @@ final class PhabricatorImageTransformer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
$dst = $this->applyScaleTo($file, $dx, $dy);
|
$dst = $this->applyScaleTo($file, $dx, $dy);
|
||||||
return $this->saveImageDataInAnyFormat($dst, $file->getMimeType());
|
return self::saveImageDataInAnyFormat($dst, $file->getMimeType());
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getBlankDestinationFile($dx, $dy) {
|
private function getBlankDestinationFile($dx, $dy) {
|
||||||
@@ -254,7 +254,7 @@ final class PhabricatorImageTransformer {
|
|||||||
$sdx, $sdy,
|
$sdx, $sdy,
|
||||||
$x, $y);
|
$x, $y);
|
||||||
|
|
||||||
return $this->saveImageDataInAnyFormat($dst, $file->getMimeType());
|
return self::saveImageDataInAnyFormat($dst, $file->getMimeType());
|
||||||
}
|
}
|
||||||
|
|
||||||
private function applyMemeTo(
|
private function applyMemeTo(
|
||||||
@@ -314,7 +314,7 @@ final class PhabricatorImageTransformer {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return $this->saveImageDataInAnyFormat($img, $file->getMimeType());
|
return self::saveImageDataInAnyFormat($img, $file->getMimeType());
|
||||||
}
|
}
|
||||||
|
|
||||||
private function makeImageWithTextBorder($img, $font_size, $x, $y,
|
private function makeImageWithTextBorder($img, $font_size, $x, $y,
|
||||||
@@ -352,7 +352,7 @@ final class PhabricatorImageTransformer {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
private function saveImageDataInAnyFormat($data, $preferred_mime = '') {
|
public static function saveImageDataInAnyFormat($data, $preferred_mime = '') {
|
||||||
switch ($preferred_mime) {
|
switch ($preferred_mime) {
|
||||||
case 'image/gif': // Gif doesn't support true color
|
case 'image/gif': // Gif doesn't support true color
|
||||||
case 'image/png':
|
case 'image/png':
|
||||||
|
|||||||
68
src/applications/lipsum/image/PhabricatorLipsumArtist.php
Normal file
68
src/applications/lipsum/image/PhabricatorLipsumArtist.php
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
abstract class PhabricatorLipsumArtist {
|
||||||
|
|
||||||
|
protected function getHSBColor($h, $s, $b) {
|
||||||
|
if ($s == 0) {
|
||||||
|
$cr = $b;
|
||||||
|
$cg = $b;
|
||||||
|
$cb = $b;
|
||||||
|
} else {
|
||||||
|
$h /= 60;
|
||||||
|
$i = (int)$h;
|
||||||
|
$f = $h - $i;
|
||||||
|
$p = $b * (1 - $s);
|
||||||
|
$q = $b * (1 - $s * $f);
|
||||||
|
$t = $b * (1 - $s * (1 - $f));
|
||||||
|
switch ($i) {
|
||||||
|
case 0:
|
||||||
|
$cr = $b;
|
||||||
|
$cg = $t;
|
||||||
|
$cb = $p;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
$cr = $q;
|
||||||
|
$cg = $b;
|
||||||
|
$cb = $p;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
$cr = $p;
|
||||||
|
$cg = $b;
|
||||||
|
$cb = $t;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
$cr = $p;
|
||||||
|
$cg = $q;
|
||||||
|
$cb = $b;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
$cr = $t;
|
||||||
|
$cg = $p;
|
||||||
|
$cb = $b;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$cr = $b;
|
||||||
|
$cg = $p;
|
||||||
|
$cb = $q;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$cr = (int)round($cr * 255);
|
||||||
|
$cg = (int)round($cg * 255);
|
||||||
|
$cb = (int)round($cb * 255);
|
||||||
|
|
||||||
|
return ($cr << 16) + ($cg << 8) + $cb;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function generate($x, $y) {
|
||||||
|
$image = imagecreatetruecolor($x, $y);
|
||||||
|
$this->draw($image, $x, $y);
|
||||||
|
return PhabricatorImageTransformer::saveImageDataInAnyFormat(
|
||||||
|
$image,
|
||||||
|
'image/jpeg');
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract protected function draw($image, $x, $y);
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
final class PhabricatorLipsumMondrianArtist extends PhabricatorLipsumArtist {
|
||||||
|
|
||||||
|
protected function draw($image, $x, $y) {
|
||||||
|
$c_white = 0xFFFFFF;
|
||||||
|
$c_black = 0x000000;
|
||||||
|
imagefill($image, 0, 0, $c_white);
|
||||||
|
|
||||||
|
$lines_h = mt_rand(2, 5);
|
||||||
|
$lines_v = mt_rand(2, 5);
|
||||||
|
|
||||||
|
for ($ii = 0; $ii < $lines_h; $ii++) {
|
||||||
|
$yp = mt_rand(0, $y);
|
||||||
|
|
||||||
|
$thickness = mt_rand(2, 3);
|
||||||
|
for ($jj = 0; $jj < $thickness; $jj++) {
|
||||||
|
imageline($image, 0, $yp + $jj, $x, $yp + $jj, $c_black);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for ($ii = 0; $ii < $lines_v; $ii++) {
|
||||||
|
$xp = mt_rand(0, $x);
|
||||||
|
|
||||||
|
$thickness = mt_rand(2, 3);
|
||||||
|
for ($jj = 0; $jj < $thickness; $jj++) {
|
||||||
|
imageline($image, $xp + $jj, 0, $xp + $jj, $y, $c_black);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$fills = mt_rand(3, 8);
|
||||||
|
for ($ii = 0; $ii < $fills; $ii++) {
|
||||||
|
$xp = mt_rand(0, $x);
|
||||||
|
$yp = mt_rand(0, $y);
|
||||||
|
if (imagecolorat($image, $xp, $yp) != $c_white) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$c_fill = $this->getHSBColor(
|
||||||
|
mt_rand(0, 359),
|
||||||
|
mt_rand(80, 100) / 100,
|
||||||
|
mt_rand(90, 100) / 100);
|
||||||
|
|
||||||
|
imagefill($image, $xp, $yp, $c_fill);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user