validateParam() * @param int $flags A bitfield, may contain self::TRANSFORM_LATER * @return MediaTransformOutput */ public function doTransform($image, $dstPath, $dstUrl, $params, $flags = 0) { $params['isFilePageThumb'] = false; if (!isset($params['width']) || $params['width'] == 0) { $params['width'] = 800; } if (!isset($params['height']) || $params['height'] == 0) { $params['height'] = 600; } if ($params['width'] <= 300 || $params['height'] <= 300) { $params['isFilePageThumb'] = true; } return new GlModelTransformOutput($image, $params); } /** * Check the incoming media parameters * * @param string $name * @param string $value * @return bool */ public function validateParam( $name, $value ) { if (in_array($name, ['width', 'height'])) { return $value > 0; } else if (in_array($name, ['view', 'hsset'])) { return true; } else { return false; } } /** * Merge a parameter array into a string appropriate for inclusion in filenames. * * @param array $params array of parameters that have been through normaliseParams. * @return string concatenated, formatted string of parameter values */ public function makeParamString( $params ) { $res = parent::makeParamString( $params ); if ( $res && isset( $params['hsset'] ) ) { $res = "hs{$params['hsset']}-$res"; } if ( $res && isset( $params['view'] ) ) { $res = "v{$params['view']}-$res"; } return $res; } /** * Parse a param string made with makeParamString back into an array. * * @param string $str the parameter string without file name * @return array|false Array of parameters or false on failure */ public function parseParamString( $str ) { preg_match( '/v([^-]*?)-/', $str, $view ); preg_match( '/hs([^-]*?)-/', $str, $hsset ); $otherParams = preg_replace('/(?:(?:hs[^-]*?-)|(?:v[^-]*?-))*(.*)$/', '/$1/', $str); $parsedParams = parent::parseParamString( $otherParams ); $parsedParams['view'] = $view; $parsedParams['hsset'] = $hsset; return $res; } /** * ? * * @param array $params input parameters * @return array same array as input? */ protected function getScriptParams( $params ) { $res = parent::getScriptParams( $params ); if ( isset( $params['view'] ) ) { $res['view'] = $params['view']; } if ( isset( $params['hsset'] ) ) { $res['hsset'] = $params['hsset']; } return $res; } /** * Get an associative array mapping magic word IDs to parameter names. * * @return string[] */ public function getParamMap() { return [ 'img_width' => 'width', 'glmv_view' => 'view', 'glmv_hsset' => 'hsset' ]; } /** * Get image size information and metadata array. * * @param MediaHandlerState $state An object for * saving process-local state. This is normally a * File object which will be passed back to other * MediaHandler methods like pageCount(), if they * are called in the same request. The handler * can use this object to save its state. * @param string $path The filename * * @return array|null Null to fall back to * getImageSize(), or an array with width, height, * bits, and metadata keys. All keys are optional. */ public function getSizeAndMetadata ($state, $path) { $gltf = fopen($path, 'r'); fseek($gltf,12); $glMetaLength = unpack("Iint", fread($gltf, 4)); fseek($gltf,20); $glMeta = json_decode(fread($gltf,$glMetaLength['int']),true); fclose($gltf); $newMeta = array( 'glmv-meshes' => count($glMeta['meshes']), 'glmv-textures' => count($glMeta['textures']) ); foreach($glMeta['asset'] as $key => $value) { switch ($key) { case 'author': $newMeta['Author'] = $value; break; case 'copyright': $newMeta['Copyright'] = $value; break; case 'generator': $newMeta['glmv-generator'] = $value; break; case 'version': $newMeta['glmv-version'] = $value; break; } } $newMeta['glmv-metadata'] = self::GLMV_VERSION; $metaHandler = new BitmapMetadataHandler; $metaHandler->addMetadata($newMeta,'native'); return array( 'width' => 800, 'height' => 600, 'metadata' => $newMeta ); } /** * Check if the metadata is valid for this handler. * * If it returns MediaHandler::METADATA_BAD (or false), Image will reload the metadata from the file and update the database. * MediaHandler::METADATA_GOOD for if the metadata is a-ok, * MediaHandler::METADATA_COMPATIBLE if metadata is old but backwards compatible (which may or may not trigger a metadata reload). * * TODO: This version is for testing/dev only. Better checking will be required in the future * @param File $image * @return bool|int */ public function isFileMetadataValid ($image) { $meta = $image->getMetadataItems(['glmv-metadata']); if (!isset($meta['glmv-metadata']) || $meta['glmv-metadata'] != self::GLMV_VERSION) { return self::METADATA_BAD; } return self::METADATA_GOOD; } /** * Get an array structure that the UI will format this into a table where the visible * fields are always visible, and the collapsed fields are optionally visible. * * The function should return false if there is no metadata to display. * * @param File $image * @param bool|IContextSource $context Context to use (optional) * @return bool|array */ public function formatMetadata( $image, $context = false ) { $glmvMetadata = $image->getMetadataArray(); if (!count( $glmvMetadata ) ) { return false; } else { return $this->formatMetadataHelper( $glmvMetadata, $context ); } } /** * Small helper function to display information on the browser console * * Usage: * echo ''; * * @param $data information to display * @param bool $add_script_tags true to put information is inside complete script tag */ public static function console_log($data, $add_script_tags = false) { $command = 'console.log('. json_encode($data, JSON_HEX_TAG).');'; if ($add_script_tags) { $command = ''; } echo $command; } }