source($source); $this->position($position); } /** * Sets the source. * * @param BaseSource|string $source The source. * * @return static */ public function source($source) { $this->source = ClassUtils::verifyInstance($source, BaseSource::class, ImageSource::class); return $this; } /** * Sets the position of the layer. * * @param BasePosition $position The position. * * @return static */ public function position($position = null) { $this->position = ClassUtils::verifyInstance($position, BasePosition::class, AbsolutePosition::class); return $this; } /** * Collects source based action grouped by sub-actions. * * Typical source based action consists of 2 to 3 components. * * For example, if we take: * l_logo/c_scale,w_100/e_screen,fl_layer_apply,fl_no_overflow,g_south,y_20 * * We can see: * - source part (l_). * - nested transformation (optional). * - fl_layer_apply part with position, blend mode, and additional flags/qualifiers. * * Occasionally the source part(l_) has additional qualifiers/flags, they come with the source itself. * * @return array An array of grouped qualifiers * * @internal */ protected function getSubActionQualifiers() { $sourceQualifiers = $this->source ? $this->source->getStringQualifiers() : []; $sourceTransformation = $this->source ? $this->source->getTransformation() : null; $positionQualifiers = $this->position ? $this->position->getStringQualifiers() : []; $additionalQualifiers = $this->getStringQualifiers(); $additionalQualifiers [] = Flag::layerApply(); return [ 'source' => $sourceQualifiers, 'transformation' => $sourceTransformation, 'additional' => ArrayUtils::mergeNonEmpty($positionQualifiers, $additionalQualifiers), ]; } /** * Serializes to Cloudinary URL format * * @return string */ public function __toString() { $subActions = $this->getSubActionQualifiers(); return ArrayUtils::implodeUrl([ ArrayUtils::implodeActionQualifiers(...$subActions['source']), $subActions['transformation'], ArrayUtils::implodeActionQualifiers(...$subActions['additional']), ]); } /** * Serializes to json. * * @return mixed */ public function jsonSerialize() { return [ 'source' => $this->source, 'position' => $this->position, ]; } }