Exemplo n.º 1
0
 public function render(Job $job)
 {
     $format = $this->configuration->getString('format', 'png');
     $defaultColor = $format == 'png' ? 0x0 : 0xffffffff;
     $backgroundColor = $this->configuration->getColor('background', $defaultColor);
     foreach ($job->spritesheets as $spritesheet) {
         /** @var Spritesheet $spritesheet */
         $image = ImageTools::createImage($spritesheet->width, $spritesheet->height, $backgroundColor);
         foreach ($spritesheet->sprites as $sprite) {
             $repeatY = $sprite->repeatY;
             while ($repeatY--) {
                 $repeatX = $sprite->repeatX;
                 while ($repeatX--) {
                     imagecopy($image, $sprite->image, $sprite->spriteX + $sprite->paddingLeft + $repeatX * $sprite->width, $sprite->spriteY + $sprite->paddingTop + $repeatY * $sprite->height, 0, 0, $sprite->width, $sprite->height);
                 }
             }
         }
         $output = $this->mosaic->getPath($this->configuration->getString('outputFolder', Configuration::VALUE_REQUIRED));
         $encodedSpritesheetPath = Tools::encodeFilePath($output . '/' . $spritesheet->name . '.' . $format);
         FileTools::createDirectory(dirname($encodedSpritesheetPath));
         if ($format == 'png') {
             imagepng($image, $encodedSpritesheetPath, 9, E_ALL);
         } elseif ($format == 'jpg') {
             imagejpeg($image, $encodedSpritesheetPath, $this->configuration->getInt('quality', 90));
         }
         imagedestroy($image);
         $encodedSpritesheetPath = realpath($encodedSpritesheetPath);
         if (!$encodedSpritesheetPath) {
             throw new \Exception('Could not verify rendered spritesheet path.');
         }
         // Normalize output path
         $spritesheet->path = Tools::decodeFilePath($encodedSpritesheetPath);
     }
 }
Exemplo n.º 2
0
 public function onRendered(Event $e)
 {
     $json = ['images' => [], 'frames' => [], 'animations' => []];
     if ($framerate = $this->configuration->getFloat('framerate')) {
         $json['framerate'] = $framerate;
     }
     $spritesheetIndex = -1;
     $spriteIndex = -1;
     foreach ($this->job->spritesheets as $spritesheet) {
         $spritesheetIndex++;
         $animations = [];
         //            $animationPrefix = $this->_configuration->getString('animationPrefix', $this->_job->configuration->getString('name'));
         $json['images'][] = $this->configuration->getString('spritesheetFolder', Configuration::VALUE_REQUIRED) . basename($spritesheet->path);
         foreach ($spritesheet->sprites as $sprite) {
             $spriteIndex++;
             $configuration = $this->getSpriteConfiguration($sprite);
             if (preg_match('!(.+)\\{animation(@([0-9.]+))?(@([^@\\}]+))?}!', $sprite->originalName, $animationData)) {
                 if (!isset($animations[$animationData[1]])) {
                     $animations[$animationData[1]] = ['speed' => isset($animationData[3]) ? floatval($animationData[3]) : null, 'sprites' => [$spriteIndex], 'next' => isset($animationData[5]) ? $animationData[5] : null];
                     if (!$animations[$animationData[1]]['speed']) {
                         $animations[$animationData[1]]['speed'] = $configuration->getFloat('speed', 0);
                     }
                 } else {
                     $animations[$animationData[1]]['sprites'][] = $spriteIndex;
                 }
             }
             $frameConfiguration = [$sprite->spriteX, $sprite->spriteY, $sprite->spriteWidth, $sprite->spriteHeight, $spritesheetIndex];
             if ($configuration->getBool('center')) {
                 $frameConfiguration[] = round($sprite->spriteWidth / 2);
                 $frameConfiguration[] = round($sprite->spriteHeight / 2);
             }
             $json['frames'][] = $frameConfiguration;
             $json['animations'][$sprite->name] = [$spriteIndex];
         }
         foreach ($animations as $name => $animation) {
             $ani = ['frames' => $animation['sprites']];
             if ($animation['speed']) {
                 $ani['speed'] = $animation['speed'];
             }
             if ($next = $animation['next']) {
                 if ($next == 'loop') {
                     $next = $name;
                 }
                 $ani['next'] = $next;
             }
             $json['animations'][$name] = $ani;
         }
     }
     $outputFolder = $this->mosaic->getPath($this->configuration->getString('outputFolder', Configuration::VALUE_REQUIRED));
     $outputFileBasename = $this->configuration->getString('outputFile', $this->job->configuration->getString('name', Configuration::VALUE_REQUIRED));
     $outputPath = $outputFolder . $outputFileBasename . '.json';
     $jsonFiles = [$outputPath => $json];
     foreach ($jsonFiles as $path => $content) {
         $path = Tools::encodeFilePath($path);
         FileTools::createDirectory(dirname($path));
         file_put_contents($path, json_encode($content, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES));
     }
 }
Exemplo n.º 3
0
 public function deleteAllStorages()
 {
     $storages = glob($this->directory . '*');
     if ($storages) {
         foreach ($storages as $storage) {
             if (is_dir($storage)) {
                 FileTools::deleteDirectory($storage);
             }
         }
     }
 }
Exemplo n.º 4
0
 public function load(Job $job)
 {
     $excludeFilters = $job->configuration->get('excludes', null);
     $includeFilters = $job->configuration->get('includes', null);
     /** @var Sprite[] $loadSprites */
     $loadSprites = [];
     foreach ($this->folders as $folder) {
         $files = FileTools::listDirectory($folder, false, true);
         foreach ($files as $file) {
             $originalSpriteName = pathinfo(str_replace('/', '-', $file), PATHINFO_FILENAME);
             $filteredSpriteName = preg_replace('/\\{[^\\}]+\\}/', '', $originalSpriteName);
             // Strip {tags}
             $included = true;
             if ($excludeFilters !== null) {
                 $included = !Tools::matches($excludeFilters, $originalSpriteName) && !Tools::matches($excludeFilters, $filteredSpriteName);
             } elseif ($includeFilters !== null) {
                 $included = false;
             }
             if (!$included && $includeFilters !== null) {
                 $included = Tools::matches($includeFilters, $originalSpriteName) || Tools::matches($includeFilters, $filteredSpriteName);
             }
             if (!$included) {
                 continue;
             }
             $sprite = new Sprite();
             $sprite->originalName = $sprite->name = $originalSpriteName;
             $sprite->name = $filteredSpriteName;
             $sprite->path = $folder . $file;
             $loadSprites[$sprite->name] = $sprite;
         }
     }
     foreach ($loadSprites as $sprite) {
         $sprite->configuration->extend($job->configuration->configuration);
         $this->extendSpriteSettings($job, $sprite);
         if (!$sprite->configuration->getBool('enabled', true)) {
             continue;
         }
         $image = ImageTools::checkFile($sprite->path);
         if ($image->success) {
             $sprite->image = $image->image;
             $sprite->calculateDimensions();
             $job->sprites[$sprite->name] = $sprite;
         }
     }
 }
Exemplo n.º 5
0
 public function cleanUp()
 {
     if (!$this->filesExpire) {
         return;
     }
     $t = time();
     $directories = FileTools::listDirectory($this->directory, true, false);
     array_unshift($directories, '');
     foreach ($directories as $directory) {
         $files = glob($this->directory . $directory . $this->idPrefix . '*' . $this->idSuffix . $this->extension, GLOB_NOSORT);
         if ($files) {
             foreach ($files as $file) {
                 if (filemtime($file) < $t) {
                     unlink($file);
                     if ($this->storeMetadata) {
                         unlink($file . '.dat');
                     }
                 }
             }
         }
     }
 }
Exemplo n.º 6
0
    public function onRendered(Event $e)
    {
        $scssContent = '';
        $scssVariablesContent = '';
        foreach ($this->job->spritesheets as $spritesheet) {
            $spritesheetName = $spritesheet->name;
            $spritePrefix = $this->configuration->getString('classPrefix', $this->job->configuration->getString('name') . '-');
            $scssPrefix = $this->configuration->getString('scssPrefix', $spritePrefix);
            $image = $this->configuration->getString('spritesheetFolder') . basename($spritesheet->path);
            if ($this->configuration->getBool('refreshCache')) {
                $image .= '?_' . sha1_file($spritesheet->path);
            }
            $retinaFactor = $this->configuration->getInt('retinaFactor', 1);
            $retinaThreshold = $retinaFactor - 0.75;
            $retinaThresholdPx = round($retinaThreshold * 96);
            $retinaEnabled = $retinaFactor > 1;
            $indent = str_repeat(' ', 4);
            $scssContent .= <<<SCSS
@mixin spritesheet-{$spritesheetName}() {
    display: inline-block;
    overflow: hidden;
    background-repeat: no-repeat;
    background-image: url({$image});

SCSS;
            $mixinsContent = '';
            if ($retinaEnabled) {
                $scssContent .= $indent . 'background-size: ' . self::cssFormatPx($spritesheet->width / $retinaFactor) . ' auto;' . chr(10);
            } else {
                $scssContent .= $indent . 'background-size: auto;' . chr(10);
            }
            $scssContent .= '}' . chr(10) . chr(10);
            if ($retinaEnabled) {
                $scssContent .= <<<SCSS
@media (min-device-pixel-ratio: {$retinaThreshold}), (min-resolution: {$retinaThresholdPx}dpi) {

SCSS;
            }
            foreach ($spritesheet->sprites as $sprite) {
                $configuration = $this->getSpriteConfiguration($sprite);
                $spriteName = $spritePrefix . $sprite->name;
                $scssName = $scssPrefix . $sprite->name;
                $realSpriteWidth = $sprite->spriteWidth;
                $realSpriteHeight = $sprite->spriteHeight;
                $realSpriteX = $sprite->spriteX;
                $realSpriteY = $sprite->spriteY;
                if ($retinaEnabled) {
                    $realSpriteWidth = $realSpriteWidth / $retinaFactor;
                    $realSpriteHeight = $realSpriteHeight / $retinaFactor;
                    $realSpriteX = $realSpriteX / $retinaFactor;
                    $realSpriteY = $realSpriteY / $retinaFactor;
                }
                $spriteContent = $indent . $indent . '@include spritesheet-' . $spritesheetName . '();' . chr(10);
                if ($configuration->getBool('center')) {
                    $spriteContent .= $indent . $indent . 'margin-left: ' . self::cssFormatPx(-$realSpriteWidth / $retinaFactor) . ';' . chr(10);
                    $spriteContent .= $indent . $indent . 'margin-top: ' . self::cssFormatPx(-$realSpriteHeight / $retinaFactor) . ';' . chr(10);
                }
                $spriteContent .= $indent . $indent . 'width: ' . self::cssFormatPx($realSpriteWidth) . ';' . chr(10);
                $spriteContent .= $indent . $indent . 'height: ' . self::cssFormatPx($realSpriteHeight) . ';' . chr(10);
                $spriteContent .= $indent . $indent . 'background-position: ' . self::cssFormatPx(-$realSpriteX) . ' ' . self::cssFormatPx(-$realSpriteY) . ';' . chr(10);
                foreach ($configuration->getNode('styles') as $styleName => $styleValue) {
                    $spriteContent .= $indent . $indent . $styleName . ': ' . $styleValue . ';' . chr(10);
                }
                if ($configuration->getBool('createClass', true)) {
                    // Write class
                    $scssContent .= $indent . '.' . $spriteName . ' {' . chr(10) . $spriteContent . $indent . '}' . chr(10) . chr(10);
                }
                if ($configuration->getBool('createMixin', true)) {
                    // Write mixin
                    $mixinsContent .= chr(10) . $indent . '@mixin ' . $scssName . ' {' . chr(10) . $spriteContent . $indent . '}' . chr(10);
                }
                if ($configuration->getBool('createVariables', true)) {
                    $scssVariablesContent .= '$' . $scssName . '-width: ' . self::cssFormatPx($sprite->spriteWidth) . ';' . chr(10);
                    $scssVariablesContent .= '$' . $scssName . '-height: ' . self::cssFormatPx($sprite->spriteHeight) . ';' . chr(10);
                    $scssVariablesContent .= '$' . $scssName . '-x: ' . self::cssFormatPx(-$sprite->spriteX) . ';' . chr(10);
                    $scssVariablesContent .= '$' . $scssName . '-y: ' . self::cssFormatPx(-$sprite->spriteY) . ';' . chr(10);
                    $scssVariablesContent .= "\${$scssName}-image: '{$image}';" . chr(10);
                    $scssVariablesContent .= "\${$scssName}-retina-factor: {$retinaFactor};" . chr(10);
                    $scssVariablesContent .= chr(10);
                }
            }
            if ($retinaEnabled) {
                $scssContent .= ' }' . chr(10);
            }
            if ($mixinsContent) {
                $scssContent .= chr(10) . $mixinsContent;
            }
        }
        $outputFolder = $this->mosaic->getPath($this->configuration->getString('outputFolder'));
        $outputFileBasename = $this->configuration->getString('outputFile', '_' . $this->job->configuration->getString('name'));
        $outputPath = $outputFolder . $outputFileBasename . '.scss';
        $outputPathVariables = $outputFolder . $outputFileBasename . '_variables.scss';
        $scssFiles = [$outputPath => $scssContent, $outputPathVariables => $scssVariablesContent];
        foreach ($scssFiles as $path => $content) {
            $path = Tools::encodeFilePath($path);
            FileTools::createDirectory(dirname($path));
            file_put_contents($path, $content);
        }
    }
Exemplo n.º 7
0
    public function parseTask()
    {
        /** @var $m MailModule */
        $m = $this->task->module;
        $mode = $this->request()->get->get('mode');
        $status = null;
        if ($m->moduleConfig->mode != MailModule::MODE_DIRECTORY) {
            $this->setResult('Directory logging is disabled.');
            return;
        }
        $directory = $m->moduleConfig->directory;
        $content = '';
        if ($mode == 'clear') {
            FileTools::deleteContents($directory);
            $status = 'All mails have been cleared.';
        } elseif ($mode == 'showhtml') {
            $id = $this->task->request->get->asString('mail')->asInput(128)->value;
            if (preg_match('!^[a-zA-Z0-9_+ -]+$!', $id) && is_file($directory . $id . '.htm')) {
                $this->setResult(file_get_contents($directory . $id . '.htm'), ContentType::TYPE_HTML_UTF8);
                return;
            } else {
                $content = 'Mail does not exist';
            }
        } elseif ($mode == 'show') {
            $id = $this->task->request->get->asString('mail')->asInput(128)->value;
            if (preg_match('!^[a-zA-Z0-9_+ -]+$!', $id)) {
                if ($id != 'latest' && !is_file($directory . $id . '.txt')) {
                    $content = 'Mail does not exist.';
                } else {
                    if ($id == 'latest') {
                        $files = scandir($directory);
                        $id = null;
                        foreach ($files as $file) {
                            if ($file == '.' || $file == '..' || !preg_match('!^(.*)\\.txt$!', $file, $fileData)) {
                                continue;
                            }
                            $id = $fileData[1];
                        }
                    }
                    if (!$id) {
                        $content = 'Mail does not exist';
                    } else {
                        $content = StringTools::escapeHtml(file_get_contents($directory . $id . '.txt'));
                        $content = preg_replace('![a-zA-Z0-9]+://[^\\s\\(\\)]+!', '<a href="\\0" target="_blank">\\0</a>', $content);
                        $content = '<pre>' . $content . '</pre>';
                        if (is_file($directory . $id . '.htm')) {
                            $content .= '<iframe src="?mode=showhtml&amp;mail=' . rawurlencode($id) . '" width="900" height="600"></iframe>';
                        }
                    }
                }
            } else {
                $content = 'Please enter a valid id.';
            }
        } else {
            $files = FileTools::listDirectory($directory, false);
            $mailList = array();
            foreach ($files as $file) {
                if (preg_match('!^(.+)\\.([a-zA-Z0-9]+)$!', $file, $fileData)) {
                    if (in_array($fileData[2], array('txt', 'htm'))) {
                        $mailList[$fileData[1]] = true;
                    }
                }
            }
            krsort($mailList);
            $ui = new Ui();
            $content = '<ul>';
            foreach ($mailList as $mailId => $foo) {
                $content .= '<li>' . $ui->link('?mode=show&mail=' . rawurlencode($mailId), $mailId) . '</li>';
            }
            $content .= '</ul>';
        }
        $content = <<<CNT
<!DOCTYPE html>
<body>
<div>
<a href="?">Show mails</a>
<a href="?mode=show&amp;mail=latest">Show latest mail</a>
<a href="?mode=clear">Clear mails</a>
</div>
<div><strong>
{$status}
</strong></div>
<hr>
{$content}
</table>
</pre>
</body>
CNT;
        $this->task->response->postContent($content, ContentType::TYPE_HTML_UTF8);
    }
Exemplo n.º 8
0
 public function save()
 {
     if ($this->_data) {
         unlink($this->saveDirectory . $this->_data);
     }
     if ($this->saveFilename) {
         $this->_data = $this->saveFilename;
     } else {
         if ($this->keepExtension) {
             $extension = explode('.', $this->uploadedFile->name);
             $extension = '.' . strtolower(array_pop($extension));
         } else {
             $extension = '.dat';
         }
         $this->_data = FileTools::createUniqueFilename($this->saveDirectory, $extension, 32, true) . $extension;
     }
     move_uploaded_file($this->uploadedFile->file, $this->saveDirectory . $this->_data);
 }
Exemplo n.º 9
0
 public function save()
 {
     if ($this->_image) {
         $this->onProcessImage($this->_image);
         if ($this->_data) {
             $this->saveFilename = $this->_data;
             if (!$this->valueContainsExtension) {
                 $this->saveFilename .= '.' . $this->saveFormat;
             }
         } else {
             if (!$this->saveFilename) {
                 $this->_data = FileTools::createUniqueFilename($this->saveDirectory, '.' . $this->saveFormat, 32, true);
                 if ($this->valueContainsExtension) {
                     $this->saveFilename = $this->_data = $this->_data . '.' . $this->saveFormat;
                 } else {
                     $this->saveFilename = $this->_data . '.' . $this->saveFormat;
                 }
             }
         }
         if ($this->resizeToWidth) {
             $image = ImageTools::resizeImage($this->_image, $this->resizeToWidth, $this->resizeToHeight, false, $this->resizeImageToolsScaleMode, $this->resizeImageToolsBackground);
         } else {
             $image = $this->_image;
         }
         if ($this->saveFormat == 'jpg') {
             imagejpeg($image, $this->saveDirectory . $this->saveFilename, $this->saveQuality);
         } else {
             if ($this->saveFormat == 'png') {
                 imagepng($image, $this->saveDirectory . $this->saveFilename);
             }
         }
         $this->onImageProcessed($this->_image);
         if ($image != $this->_image) {
             imagedestroy($this->_image);
         }
         imagedestroy($image);
     }
 }