Current File : /var/www/vhosts/missauthor.com/httpdocs/wp-includes/class-wp-image-editor.php
<?php
/**
 * Base WordPress Image Editor
 *
 * @package WordPress
 * @subpackage Image_Editor
 */

/**
 * Base image editor class from which implementations extend
 *
 * @since 3.5.0
 */
#[AllowDynamicProperties]
abstract class WP_Image_Editor {
	protected $file              = null;
	protected $size              = null;
	protected $mime_type         = null;
	protected $output_mime_type  = null;
	protected $default_mime_type = 'image/jpeg';
	protected $quality           = false;

	// Deprecated since 5.8.1. See get_default_quality() below.
	protected $default_quality = 82;

	/**
	 * Each instance handles a single file.
	 *
	 * @param string $file Path to the file to load.
	 */
	public function __construct( $file ) {
		$this->file = $file;
	}

	/**
	 * Checks to see if current environment supports the editor chosen.
	 * Must be overridden in a subclass.
	 *
	 * @since 3.5.0
	 *
	 * @abstract
	 *
	 * @param array $args
	 * @return bool
	 */
	public static function test( $args = array() ) {
		return false;
	}

	/**
	 * Checks to see if editor supports the mime-type specified.
	 * Must be overridden in a subclass.
	 *
	 * @since 3.5.0
	 *
	 * @abstract
	 *
	 * @param string $mime_type
	 * @return bool
	 */
	public static function supports_mime_type( $mime_type ) {
		return false;
	}

	/**
	 * Loads image from $this->file into editor.
	 *
	 * @since 3.5.0
	 * @abstract
	 *
	 * @return true|WP_Error True if loaded; WP_Error on failure.
	 */
	abstract public function load();

	/**
	 * Saves current image to file.
	 *
	 * @since 3.5.0
	 * @since 6.0.0 The `$filesize` value was added to the returned array.
	 * @abstract
	 *
	 * @param string $destfilename Optional. Destination filename. Default null.
	 * @param string $mime_type    Optional. The mime-type. Default null.
	 * @return array|WP_Error {
	 *     Array on success or WP_Error if the file failed to save.
	 *
	 *     @type string $path      Path to the image file.
	 *     @type string $file      Name of the image file.
	 *     @type int    $width     Image width.
	 *     @type int    $height    Image height.
	 *     @type string $mime-type The mime type of the image.
	 *     @type int    $filesize  File size of the image.
	 * }
	 */
	abstract public function save( $destfilename = null, $mime_type = null );

	/**
	 * Resizes current image.
	 *
	 * At minimum, either a height or width must be provided.
	 * If one of the two is set to null, the resize will
	 * maintain aspect ratio according to the provided dimension.
	 *
	 * @since 3.5.0
	 * @abstract
	 *
	 * @param int|null   $max_w Image width.
	 * @param int|null   $max_h Image height.
	 * @param bool|array $crop  {
	 *     Optional. Image cropping behavior. If false, the image will be scaled (default).
	 *     If true, image will be cropped to the specified dimensions using center positions.
	 *     If an array, the image will be cropped using the array to specify the crop location:
	 *
	 *     @type string $0 The x crop position. Accepts 'left', 'center', or 'right'.
	 *     @type string $1 The y crop position. Accepts 'top', 'center', or 'bottom'.
	 * }
	 * @return true|WP_Error
	 */
	abstract public function resize( $max_w, $max_h, $crop = false );

	/**
	 * Resize multiple images from a single source.
	 *
	 * @since 3.5.0
	 * @abstract
	 *
	 * @param array $sizes {
	 *     An array of image size arrays. Default sizes are 'small', 'medium', 'large'.
	 *
	 *     @type array ...$0 {
	 *         @type int        $width  Image width.
	 *         @type int        $height Image height.
	 *         @type bool|array $crop   Optional. Whether to crop the image. Default false.
	 *     }
	 * }
	 * @return array An array of resized images metadata by size.
	 */
	abstract public function multi_resize( $sizes );

	/**
	 * Crops Image.
	 *
	 * @since 3.5.0
	 * @abstract
	 *
	 * @param int  $src_x   The start x position to crop from.
	 * @param int  $src_y   The start y position to crop from.
	 * @param int  $src_w   The width to crop.
	 * @param int  $src_h   The height to crop.
	 * @param int  $dst_w   Optional. The destination width.
	 * @param int  $dst_h   Optional. The destination height.
	 * @param bool $src_abs Optional. If the source crop points are absolute.
	 * @return true|WP_Error
	 */
	abstract public function crop( $src_x, $src_y, $src_w, $src_h, $dst_w = null, $dst_h = null, $src_abs = false );

	/**
	 * Rotates current image counter-clockwise by $angle.
	 *
	 * @since 3.5.0
	 * @abstract
	 *
	 * @param float $angle
	 * @return true|WP_Error
	 */
	abstract public function rotate( $angle );

	/**
	 * Flips current image.
	 *
	 * @since 3.5.0
	 * @abstract
	 *
	 * @param bool $horz Flip along Horizontal Axis
	 * @param bool $vert Flip along Vertical Axis
	 * @return true|WP_Error
	 */
	abstract public function flip( $horz, $vert );

	/**
	 * Streams current image to browser.
	 *
	 * @since 3.5.0
	 * @abstract
	 *
	 * @param string $mime_type The mime type of the image.
	 * @return true|WP_Error True on success, WP_Error object on failure.
	 */
	abstract public function stream( $mime_type = null );

	/**
	 * Gets dimensions of image.
	 *
	 * @since 3.5.0
	 *
	 * @return int[] {
	 *     Dimensions of the image.
	 *
	 *     @type int $width  The image width.
	 *     @type int $height The image height.
	 * }
	 */
	public function get_size() {
		return $this->size;
	}

	/**
	 * Sets current image size.
	 *
	 * @since 3.5.0
	 *
	 * @param int $width
	 * @param int $height
	 * @return true
	 */
	protected function update_size( $width = null, $height = null ) {
		$this->size = array(
			'width'  => (int) $width,
			'height' => (int) $height,
		);
		return true;
	}

	/**
	 * Gets the Image Compression quality on a 1-100% scale.
	 *
	 * @since 4.0.0
	 *
	 * @return int Compression Quality. Range: [1,100]
	 */
	public function get_quality() {
		if ( ! $this->quality ) {
			$this->set_quality();
		}

		return $this->quality;
	}

	/**
	 * Sets Image Compression quality on a 1-100% scale.
	 *
	 * @since 3.5.0
	 * @since 6.8.0 The `$dims` parameter was added.
	 *
	 * @param int   $quality Compression Quality. Range: [1,100]
	 * @param array $dims    Optional. Image dimensions array with 'width' and 'height' keys.
	 * @return true|WP_Error True if set successfully; WP_Error on failure.

	 */
	public function set_quality( $quality = null, $dims = array() ) {
		// Use the output mime type if present. If not, fall back to the input/initial mime type.
		$mime_type = ! empty( $this->output_mime_type ) ? $this->output_mime_type : $this->mime_type;
		// Get the default quality setting for the mime type.
		$default_quality = $this->get_default_quality( $mime_type );

		if ( null === $quality ) {
			/**
			 * Filters the default image compression quality setting.
			 *
			 * Applies only during initial editor instantiation, or when set_quality() is run
			 * manually without the `$quality` argument.
			 *
			 * The WP_Image_Editor::set_quality() method has priority over the filter.
			 *
			 * @since 3.5.0
			 * @since 6.8.0 Added the size parameter.
			 *
			 * @param int    $quality   Quality level between 1 (low) and 100 (high).
			 * @param string $mime_type Image mime type.
			 * @param array $size {
			 *     Dimensions of the image.
			 *
			 *     @type int $width  The image width.
			 *     @type int $height The image height.
			 * }
			 */
			$quality = apply_filters( 'wp_editor_set_quality', $default_quality, $mime_type, $dims ? $dims : $this->size );

			if ( 'image/jpeg' === $mime_type ) {
				/**
				 * Filters the JPEG compression quality for backward-compatibility.
				 *
				 * Applies only during initial editor instantiation, or when set_quality() is run
				 * manually without the `$quality` argument.
				 *
				 * The WP_Image_Editor::set_quality() method has priority over the filter.
				 *
				 * The filter is evaluated under two contexts: 'image_resize', and 'edit_image',
				 * (when a JPEG image is saved to file).
				 *
				 * @since 2.5.0
				 *
				 * @param int    $quality Quality level between 0 (low) and 100 (high) of the JPEG.
				 * @param string $context Context of the filter.
				 */
				$quality = apply_filters( 'jpeg_quality', $quality, 'image_resize' );
			}

			if ( $quality < 0 || $quality > 100 ) {
				$quality = $default_quality;
			}
		}

		// Allow 0, but squash to 1 due to identical images in GD, and for backward compatibility.
		if ( 0 === $quality ) {
			$quality = 1;
		}

		if ( ( $quality >= 1 ) && ( $quality <= 100 ) ) {
			$this->quality = $quality;
			return true;
		} else {
			return new WP_Error( 'invalid_image_quality', __( 'Attempted to set image quality outside of the range [1,100].' ) );
		}
	}

	/**
	 * Returns the default compression quality setting for the mime type.
	 *
	 * @since 5.8.1
	 *
	 * @param string $mime_type
	 * @return int The default quality setting for the mime type.
	 */
	protected function get_default_quality( $mime_type ) {
		switch ( $mime_type ) {
			case 'image/webp':
				$quality = 86;
				break;
			case 'image/jpeg':
			default:
				$quality = $this->default_quality;
		}

		return $quality;
	}

	/**
	 * Returns preferred mime-type and extension based on provided
	 * file's extension and mime, or current file's extension and mime.
	 *
	 * Will default to $this->default_mime_type if requested is not supported.
	 *
	 * Provides corrected filename only if filename is provided.
	 *
	 * @since 3.5.0
	 *
	 * @param string $filename
	 * @param string $mime_type
	 * @return array { filename|null, extension, mime-type }
	 */
	protected function get_output_format( $filename = null, $mime_type = null ) {
		$new_ext = null;

		// By default, assume specified type takes priority.
		if ( $mime_type ) {
			$new_ext = $this->get_extension( $mime_type );
		}

		if ( $filename ) {
			$file_ext  = strtolower( pathinfo( $filename, PATHINFO_EXTENSION ) );
			$file_mime = $this->get_mime_type( $file_ext );
		} else {
			// If no file specified, grab editor's current extension and mime-type.
			$file_ext  = strtolower( pathinfo( $this->file, PATHINFO_EXTENSION ) );
			$file_mime = $this->mime_type;
		}

		/*
		 * Check to see if specified mime-type is the same as type implied by
		 * file extension. If so, prefer extension from file.
		 */
		if ( ! $mime_type || ( $file_mime === $mime_type ) ) {
			$mime_type = $file_mime;
			$new_ext   = $file_ext;
		}

		$output_format = wp_get_image_editor_output_format( $filename, $mime_type );

		if ( isset( $output_format[ $mime_type ] )
			&& $this->supports_mime_type( $output_format[ $mime_type ] )
		) {
			$mime_type = $output_format[ $mime_type ];
			$new_ext   = $this->get_extension( $mime_type );
		}

		/*
		 * Double-check that the mime-type selected is supported by the editor.
		 * If not, choose a default instead.
		 */
		if ( ! $this->supports_mime_type( $mime_type ) ) {
			/**
			 * Filters default mime type prior to getting the file extension.
			 *
			 * @see wp_get_mime_types()
			 *
			 * @since 3.5.0
			 *
			 * @param string $mime_type Mime type string.
			 */
			$mime_type = apply_filters( 'image_editor_default_mime_type', $this->default_mime_type );
			$new_ext   = $this->get_extension( $mime_type );
		}

		/*
		 * Ensure both $filename and $new_ext are not empty.
		 * $this->get_extension() returns false on error which would effectively remove the extension
		 * from $filename. That shouldn't happen, files without extensions are not supported.
		 */
		if ( $filename && $new_ext ) {
			$dir = pathinfo( $filename, PATHINFO_DIRNAME );
			$ext = pathinfo( $filename, PATHINFO_EXTENSION );

			$filename = trailingslashit( $dir ) . wp_basename( $filename, ".$ext" ) . ".{$new_ext}";
		}

		if ( $mime_type && ( $mime_type !== $this->mime_type ) ) {
			// The image will be converted when saving. Set the quality for the new mime-type if not already set.
			if ( $mime_type !== $this->output_mime_type ) {
				$this->output_mime_type = $mime_type;
			}
			$this->set_quality();
		} elseif ( ! empty( $this->output_mime_type ) ) {
			// Reset output_mime_type and quality.
			$this->output_mime_type = null;
			$this->set_quality();
		}

		return array( $filename, $new_ext, $mime_type );
	}

	/**
	 * Builds an output filename based on current file, and adding proper suffix
	 *
	 * @since 3.5.0
	 * @since 6.8.0 Passing an empty string as $suffix will now omit the suffix from the generated filename.
	 *
	 * @param string $suffix
	 * @param string $dest_path
	 * @param string $extension
	 * @return string filename
	 */
	public function generate_filename( $suffix = null, $dest_path = null, $extension = null ) {
		// If not empty the $suffix will be appended to the destination filename, just before the extension.
		if ( $suffix ) {
			$suffix = '-' . $suffix;
		} elseif ( '' !== $suffix ) {
			$suffix = '-' . $this->get_suffix();
		}

		$dir = pathinfo( $this->file, PATHINFO_DIRNAME );
		$ext = pathinfo( $this->file, PATHINFO_EXTENSION );

		$name    = wp_basename( $this->file, ".$ext" );
		$new_ext = strtolower( $extension ? $extension : $ext );

		if ( ! is_null( $dest_path ) ) {
			if ( ! wp_is_stream( $dest_path ) ) {
				$_dest_path = realpath( $dest_path );
				if ( $_dest_path ) {
					$dir = $_dest_path;
				}
			} else {
				$dir = $dest_path;
			}
		}

		return trailingslashit( $dir ) . "{$name}{$suffix}.{$new_ext}";
	}

	/**
	 * Builds and returns proper suffix for file based on height and width.
	 *
	 * @since 3.5.0
	 *
	 * @return string|false suffix
	 */
	public function get_suffix() {
		if ( ! $this->get_size() ) {
			return false;
		}

		return "{$this->size['width']}x{$this->size['height']}";
	}

	/**
	 * Check if a JPEG image has EXIF Orientation tag and rotate it if needed.
	 *
	 * @since 5.3.0
	 *
	 * @return bool|WP_Error True if the image was rotated. False if not rotated (no EXIF data or the image doesn't need to be rotated).
	 *                       WP_Error if error while rotating.
	 */
	public function maybe_exif_rotate() {
		$orientation = null;

		if ( is_callable( 'exif_read_data' ) && 'image/jpeg' === $this->mime_type ) {
			$exif_data = @exif_read_data( $this->file );

			if ( ! empty( $exif_data['Orientation'] ) ) {
				$orientation = (int) $exif_data['Orientation'];
			}
		}

		/**
		 * Filters the `$orientation` value to correct it before rotating or to prevent rotating the image.
		 *
		 * @since 5.3.0
		 *
		 * @param int    $orientation EXIF Orientation value as retrieved from the image file.
		 * @param string $file        Path to the image file.
		 */
		$orientation = apply_filters( 'wp_image_maybe_exif_rotate', $orientation, $this->file );

		if ( ! $orientation || 1 === $orientation ) {
			return false;
		}

		switch ( $orientation ) {
			case 2:
				// Flip horizontally.
				$result = $this->flip( false, true );
				break;
			case 3:
				/*
				 * Rotate 180 degrees or flip horizontally and vertically.
				 * Flipping seems faster and uses less resources.
				 */
				$result = $this->flip( true, true );
				break;
			case 4:
				// Flip vertically.
				$result = $this->flip( true, false );
				break;
			case 5:
				// Rotate 90 degrees counter-clockwise and flip vertically.
				$result = $this->rotate( 90 );

				if ( ! is_wp_error( $result ) ) {
					$result = $this->flip( true, false );
				}

				break;
			case 6:
				// Rotate 90 degrees clockwise (270 counter-clockwise).
				$result = $this->rotate( 270 );
				break;
			case 7:
				// Rotate 90 degrees counter-clockwise and flip horizontally.
				$result = $this->rotate( 90 );

				if ( ! is_wp_error( $result ) ) {
					$result = $this->flip( false, true );
				}

				break;
			case 8:
				// Rotate 90 degrees counter-clockwise.
				$result = $this->rotate( 90 );
				break;
		}

		return $result;
	}

	/**
	 * Either calls editor's save function or handles file as a stream.
	 *
	 * @since 3.5.0
	 *
	 * @param string   $filename
	 * @param callable $callback
	 * @param array    $arguments
	 * @return bool
	 */
	protected function make_image( $filename, $callback, $arguments ) {
		$stream = wp_is_stream( $filename );
		if ( $stream ) {
			ob_start();
		} else {
			// The directory containing the original file may no longer exist when using a replication plugin.
			wp_mkdir_p( dirname( $filename ) );
		}

		$result = call_user_func_array( $callback, $arguments );

		if ( $result && $stream ) {
			$contents = ob_get_contents();

			$fp = fopen( $filename, 'w' );

			if ( ! $fp ) {
				ob_end_clean();
				return false;
			}

			fwrite( $fp, $contents );
			fclose( $fp );
		}

		if ( $stream ) {
			ob_end_clean();
		}

		return $result;
	}

	/**
	 * Returns first matched mime-type from extension,
	 * as mapped from wp_get_mime_types()
	 *
	 * @since 3.5.0
	 *
	 * @param string $extension
	 * @return string|false
	 */
	protected static function get_mime_type( $extension = null ) {
		if ( ! $extension ) {
			return false;
		}

		$mime_types = wp_get_mime_types();
		$extensions = array_keys( $mime_types );

		foreach ( $extensions as $_extension ) {
			if ( preg_match( "/{$extension}/i", $_extension ) ) {
				return $mime_types[ $_extension ];
			}
		}

		return false;
	}

	/**
	 * Returns first matched extension from Mime-type,
	 * as mapped from wp_get_mime_types()
	 *
	 * @since 3.5.0
	 *
	 * @param string $mime_type
	 * @return string|false
	 */
	protected static function get_extension( $mime_type = null ) {
		if ( empty( $mime_type ) ) {
			return false;
		}

		return wp_get_default_extension_for_mime_type( $mime_type );
	}
}
Lory Pattanaik – Miss Author

Content from Heart

Stay In Loop

01 

ABOUT ME

my biography

It’s LORY !!! The Lullaby.

A very rare combination of an Engineer, Human Resource Strategist, Entrepreneur, Writer & Journalist.

In previous incarnation (Yr2009), she joined Power Sector as an Instrumentation Engineer and flipped the stereotypical concept of which had almost made everyone believe that Girls in Power Plant can only be given documentation work. Right from green field project to erection and commissioning of the Plant she served 8 years with dedication and commitment.

.

Risk and Reward in the Land of Myth: Exploring the Thrills and Perils of Gambling at Casino Greece's Legendary Casinos

Embark on a thrilling journey through the world of gambling in the ancient land of Greece, where mythology meets modern-day excitement at the renowned Casino Greece. As you step into the opulent establishments adorned with statues of the gods, such as Zeus and Athena, the ambiance resonates with the echoes of past glories. The allure of the games of chance beckons, promising both risk and reward in equal measure. Whether you're drawn to the spinning roulette wheels or the strategic card tables, the thrill of the unknown awaits every player who crosses the threshold of these legendary casinos.

One of the highlights of visiting Casino Greece is the diverse range of gaming options available to suit every preference and skill level. From classic favorites like blackjack and poker to the latest in slot machine technology, there's something for everyone to enjoy. The atmosphere is electric with anticipation as players test their luck against the house, hoping for that elusive jackpot to materialize. The blend of tradition and innovation creates an unforgettable experience for each visitor, making it a must-visit destination for both casual players and high rollers alike.

For those seeking the convenience and comfort of playing from anywhere, online casinos Greece offer a digital gateway to the thrilling world of gambling. With a simple click, players can access a virtual realm that replicates the excitement of a land-based casino, complete with realistic graphics and immersive sound effects. The allure of online casinos Greece lies in their accessibility and flexibility, allowing individuals to enjoy their favorite games at any time or place. Whether it's a quick round of slots during a coffee break or a strategic game of poker from the comfort of home, the virtual realm of online gambling opens up a world of possibilities for enthusiasts.

At Casino Greece, the pursuit of fortune is intertwined with a sense of adventure and mystery. The iconic architecture of the casinos serves as a backdrop to the exhilarating gameplay, where every spin of the wheel and flip of the card holds the promise of a life-changing win. The legacy of gambling in Greece is woven into the very fabric of these establishments, creating an atmosphere that resonates with echoes of the past. As players immerse themselves in the thrill of the games, they become part of a rich tapestry of tradition and excitement that defines the spirit of these legendary casinos.

Experience the fusion of ancient myth and modern-day entertainment at Casino Greece, where the thrill of gambling transcends time and captivates players from around the world. With a commitment to excellence and a dedication to providing an unforgettable gaming experience, these legendary casinos stand as beacons of excitement and opportunity in the heart of Greece. Whether you're a seasoned gambler or a curious newcomer, the spirit of adventure awaits at Casino Greece, where risk and reward converge in a whirlwind of excitement and anticipation.

Latest Works

My bestsellers

02 

NON FICTION

by lory pattanaik

NON FICTION

by lory pattanaik

hr guide

by lory pattanaik

Events

MODERATION | PANEL DISCUSSION | INTERVIEWS


03 

testimonials

brand
Working with Lory Patnaik when she took my interview for bhaskar is great remembrance as she was precise to the point & smooth writer it was pleasant & unforgettable writing.
Jk Arora
Chairman SOM Group
brand
It was an wonderful experience working with Ms Lory Pattanaik. The Publication of my Autobiography could be possible just because of her expertise, dedication and sincere efforts in interviewing me , writing and editing the contents.
OP Singhania
Chattered Account, Raipur
brand
Lory Pattanaik has many different skills and talents; she is incredibly generous with her knowledge and support and always enthusiastic, energetic and passionate! I feel very fortunate to work with her as one of the core team member of a socio-cultural community platform. Apart from having excellent knowledge in Content Writing and extensive experience as an upcoming entrepreneur being Co-Founder of WEBODOCTOR, Lory is a great human being and one of the most reliable and hardworking individual. I have always found her to be realistic in her approach in terms of achieving objectives for an organization, a genuine team player with excellent leadership qualities, any team would be lucky to have a valuable asset like Lory in team.
Sanjib Kumar Mohanty
Sr. Advocate, Supreme Court of India Chairperson, Odisha Positive
brand
Lory it's always been wonderful to see you grow as an Entrepreneur and an Author. Your utmost dedication and time bounded approach is what makes your work look unique.
Ajay Shrivastava
Chief General Manager, SAGE GROUP
brand
I am Aniruddha Sangamnerkar and Chairman of Athanaad Sanskruti LLP. I have a very good and extensive experience of content writing of Lory Pattanaik (or Webodoctor). The contents are expressive enough, effective to commensurate with the purpose, audience and our brand.I wish Lory a happy Content Writing.
Aniruddh Sangamnekar
Chairman, Athanaad Sanskruti LLP
brand
Dearest lory......
You are simply superb.....👏👍
The way you keep everyone captivating is highly commendable😊
Big fan of yours🙏
and.....
Thanks so very much for making yesterday's event so interesting 
Ar. Ritesh Harwani
Bhopal, MP
brand
It was a great experience to share the Dias with you. Your oratorial skills are exemplary. You effortlessly delved into the nuances of philosophy of architecture. Wishing you all the best.
Ar. Manoj Choubey
Bhopal, MP
k

Total Pages

Active Readers

k Hrs

Working Hours

+

Coffee mugs

Let's Chat Now

contact me

Contact no:-  7000926009, 9438569962

Corporate Address:-  E-3/114, 10 No. Market, E-3, Arera Colony, 

Bhopal, Madhya Pradesh 462016

Webodoctor©.  All rights reserved.