AbstractDriver.php 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. <?php
  2. namespace Intervention\Image;
  3. use Intervention\Image\Exception\NotSupportedException;
  4. abstract class AbstractDriver
  5. {
  6. /**
  7. * Decoder instance to init images from
  8. *
  9. * @var \Intervention\Image\AbstractDecoder
  10. */
  11. public $decoder;
  12. /**
  13. * Image encoder instance
  14. *
  15. * @var \Intervention\Image\AbstractEncoder
  16. */
  17. public $encoder;
  18. /**
  19. * Creates new image instance
  20. *
  21. * @param int $width
  22. * @param int $height
  23. * @param string $background
  24. * @return \Intervention\Image\Image
  25. */
  26. abstract public function newImage($width, $height, $background);
  27. /**
  28. * Reads given string into color object
  29. *
  30. * @param string $value
  31. * @return AbstractColor
  32. */
  33. abstract public function parseColor($value);
  34. /**
  35. * Checks if core module installation is available
  36. *
  37. * @return boolean
  38. */
  39. abstract protected function coreAvailable();
  40. /**
  41. * Returns clone of given core
  42. *
  43. * @return mixed
  44. */
  45. public function cloneCore($core)
  46. {
  47. return clone $core;
  48. }
  49. /**
  50. * Initiates new image from given input
  51. *
  52. * @param mixed $data
  53. * @return \Intervention\Image\Image
  54. */
  55. public function init($data)
  56. {
  57. return $this->decoder->init($data);
  58. }
  59. /**
  60. * Encodes given image
  61. *
  62. * @param Image $image
  63. * @param string $format
  64. * @param int $quality
  65. * @return \Intervention\Image\Image
  66. */
  67. public function encode($image, $format, $quality)
  68. {
  69. return $this->encoder->process($image, $format, $quality);
  70. }
  71. /**
  72. * Executes named command on given image
  73. *
  74. * @param Image $image
  75. * @param string $name
  76. * @param array $arguments
  77. * @return \Intervention\Image\Commands\AbstractCommand
  78. */
  79. public function executeCommand($image, $name, $arguments)
  80. {
  81. $commandName = $this->getCommandClassName($name);
  82. $command = new $commandName($arguments);
  83. $command->execute($image);
  84. return $command;
  85. }
  86. /**
  87. * Returns classname of given command name
  88. *
  89. * @param string $name
  90. * @return string
  91. */
  92. private function getCommandClassName($name)
  93. {
  94. $name = mb_convert_case($name[0], MB_CASE_UPPER, 'utf-8') . mb_substr($name, 1, mb_strlen($name));
  95. $drivername = $this->getDriverName();
  96. $classnameLocal = sprintf('\Intervention\Image\%s\Commands\%sCommand', $drivername, ucfirst($name));
  97. $classnameGlobal = sprintf('\Intervention\Image\Commands\%sCommand', ucfirst($name));
  98. if (class_exists($classnameLocal)) {
  99. return $classnameLocal;
  100. } elseif (class_exists($classnameGlobal)) {
  101. return $classnameGlobal;
  102. }
  103. throw new NotSupportedException(
  104. "Command ({$name}) is not available for driver ({$drivername})."
  105. );
  106. }
  107. /**
  108. * Returns name of current driver instance
  109. *
  110. * @return string
  111. */
  112. public function getDriverName()
  113. {
  114. $reflect = new \ReflectionClass($this);
  115. $namespace = $reflect->getNamespaceName();
  116. return substr(strrchr($namespace, "\\"), 1);
  117. }
  118. }