File: /home/dailygoldindex/public_html/wp-content/themes/jnews/class/Image/Image.php
<?php
/**
 * @author : Jegtheme
 */
namespace JNews\Image;
/**
 * Class JNews Image
 */
Class Image
{
    /**
     * @var Image
     */
    private static $instance;
    private $image_size = array();
    private $prefix = "jnews-";
    /**
     * @return Image
     */
    public static function getInstance()
    {
        if (null === static::$instance)
        {
            static::$instance = new static();
        }
        return static::$instance;
    }
    private function __construct()
    {
        $this->setup_image_size();
        add_action( 'wp_loaded', array($this, 'image_hook'));
        add_action('after_setup_theme', array($this, 'generate_image'), 99);
    }
    public function generate_image()
    {
        $generate_image = get_theme_mod('jnews_image_generator', 'normal');
        if($generate_image === 'dynamic')
        {
            add_filter('image_downsize', array($this, 'image_down_size'), 99, 3);
        } else {
            add_action( 'init', array($this, 'add_image_size'));
        }
    }
    public function image_hook()
    {
        $mechanism = get_theme_mod('jnews_image_load', 'lazyload');
        if($mechanism === 'lazyload')
        {
            $image = ImageLazyLoad::getInstance();
        } else if ($mechanism === 'background') {
            $image = ImageBackgroundLoad::getInstance();
        } else {
            $image = ImageNormalLoad::getInstance();
        }
        add_filter( 'jnews_image_lazy_owl' , array($image, 'owl_lazy_image'), null, 2);
        add_filter( 'jnews_single_image_lazy_owl' , array($image, 'owl_lazy_single_image'), null, 2);
        add_filter( 'jnews_image_thumbnail' , array($image, 'image_thumbnail'), null, 2);
        add_filter( 'jnews_image_thumbnail_unwrap' , array($image, 'image_thumbnail_unwrap'), null, 2);
        add_filter( 'jnews_single_image_unwrap' , array($image, 'single_image_unwrap'), null, 2);
        add_filter( 'jnews_single_image_owl' , array($image, 'owl_single_image'), null, 2);
        add_filter( 'jnews_single_image', array($image, 'single_image'), null, 3 );
        add_filter( 'image_size_names_choose', array($this, 'custom_size') );
    }
    public function custom_size($sizes)
    {
        $this->setup_image_size();
        foreach($this->image_size as $key => $size) {
            $sizes[$key] = esc_html__('Custom Size', 'jnews');
        }
        return $sizes;
    }
    public function get_image_size($size)
    {
        return $this->image_size[$size];
    }
    public function setup_image_size()
    {
        $this->image_size = array
        (
            // dimension : 0.5
            $this->prefix . '360x180'           => array('width' => 360,  'height' => 180, 'crop' => true , 'dimension' => 500),
            $this->prefix . '750x375'           => array('width' => 750,  'height' => 375, 'crop' => true , 'dimension' => 500),
            $this->prefix . '1140x570'          => array('width' => 1140, 'height' => 570, 'crop' => true , 'dimension' => 500),
            // dimension : 0.715
            $this->prefix . '120x86'            => array('width' => 120,  'height' => 86,  'crop' => true , 'dimension' => 715),
            $this->prefix . '350x250'           => array('width' => 350,  'height' => 250, 'crop' => true , 'dimension' => 715),
            $this->prefix . '750x536'           => array('width' => 750,  'height' => 536, 'crop' => true , 'dimension' => 715),
            $this->prefix . '1140x815'          => array('width' => 1140, 'height' => 815, 'crop' => true , 'dimension' => 715),
            // dimension
            $this->prefix . '360x504'           => array('width' => 360, 'height' => 504, 'crop' => true , 'dimension' => 1400),
            // dimension 1
            $this->prefix . '75x75'             => array('width' => 75, 'height' => 75, 'crop' => true , 'dimension' => 1000),
            $this->prefix . '350x350'           => array('width' => 350,  'height' => 350, 'crop' => true , 'dimension' => 1000),
            // featured post
            $this->prefix . 'featured-750'      => array('width' => 750,  'height' => 0,  'crop' => true , 'dimension' => 1000),
            $this->prefix . 'featured-1140'     => array('width' => 1140, 'height' => 0,  'crop' => true , 'dimension' => 1000),
        );
    }
    public function add_image_size()
    {
        foreach($this->image_size as $id => $image)
        {
            add_image_size( $id, $image['width'], $image['height'], $image['crop'] );
        }
    }
    public static function generate_image_retina($image, $imageretina, $alt, $echo, $image_dm, $imageretina_dm)
    {
        $srcset = '';
        $src = "src=\"" . esc_url($image) . "\" ";
	    $datasrclight = "data-light-src=\"" . esc_url($image) . "\" ";
	    $datasrcsetlight = "data-light-srcset=\"" . esc_url($image) . " 1x, " . esc_url($imageretina) . " 2x\" ";
        $datasrcdark = "data-dark-src=\"" . esc_url($image_dm) . "\" ";
        $datasrcsetdark = "data-dark-srcset=\"" . esc_url($image_dm) . " 1x, " . esc_url($imageretina_dm) . " 2x\"";
        $dm_options = get_theme_mod('jnews_dark_mode_options', 'jeg_toggle_dark');
        if(!empty($imageretina))
        {
            $srcset = "srcset=\"" . esc_url($image) . " 1x, " . esc_url($imageretina) . " 2x\"";
        }
        if ( ( isset( $_COOKIE['darkmode'] ) && $_COOKIE['darkmode'] === 'true' && ($dm_options === 'jeg_toggle_dark' || $dm_options === 'jeg_timed_dark')) || ( $dm_options === 'jeg_full_dark'))
        {
            $src = "src=\"" . esc_url($image_dm) . "\" ";
            $srcset = "srcset=\"" . esc_url($image_dm) . " 1x, " . esc_url($imageretina_dm) . " 2x\"";
        }
        $header_logo = "<img class='jeg_logo_img' " . $src . $srcset . " alt=\"" . esc_attr($alt) . "\"" . $datasrclight . $datasrcsetlight . $datasrcdark . $datasrcsetdark . ">";
        if($echo) {
            echo jnews_sanitize_output($header_logo);
        } else {
            return $header_logo;
        }
    }
    /**
     * The image downside filter
     * @param  boolean $ignore
     * @param  integer $id
     * @param  string  $size
     * @return mixed
     */
    public function image_down_size($ignore = false, $id = null, $size = 'medium')
    {
        global $_wp_additional_image_sizes;
        $image   = wp_get_attachment_url($id);
        $meta    = wp_get_attachment_metadata($id);
        $width   = 0;
        $height  = 0;
        $crop    = false;
        $dynamic = false;
        // return immediately if the size is "thumbnail".
        if ($size == 'thumbnail') {
            return false;
        }
        // return immediately if intermediate image size found.
        if (image_get_intermediate_size($id, $size) || is_array($size)) {
            return false;
        }
        // check if the image size is defined by 'add_image_size()' but not created yet.
        if (isset($_wp_additional_image_sizes[$size])) {
            $width  = $_wp_additional_image_sizes[$size]['width'];
            $height = $_wp_additional_image_sizes[$size]['height'];
            $crop   = $_wp_additional_image_sizes[$size]['crop'];
        }
        // here we assume that the size is dynamic e.g. '200x200'.
        elseif ($sizeArr = $this->parse_size($size)) {
            $width   = isset($sizeArr['width']) ? $sizeArr['width'] : 0;
            $height  = isset($sizeArr['height']) ? $sizeArr['height'] : 999999;
            $crop    = isset($sizeArr['height']) ? true : false;
            $dynamic = true;
        }
        // let's continue if original image found, also if width & height are specified.
        if ($image && $width && $height)
        {
            if (! $img = $this->make_image($id, $width, $height, $crop)) {
                return false;
            }
            if ($dynamic) {
                $img['jnews_dynamic_images'] = true;
            }
            unset($img['path']);
            $meta['sizes'][$size] = $img;
            // update attachment metadata.
            wp_update_attachment_metadata($id, $meta);
            // replace original image url with newly created one.
            $image = str_replace(wp_basename($image), wp_basename($img['file']), $image);
            // we might need to further constrain it if content_width is narrower
            list($width, $height) = image_constrain_size_for_editor($width, $height, $size);
            // finally return the result.
            return array($image, $width, $height, false);
        }
        return false;
    }
    /**
     * Parse image size.
     * @param  string $string
     * @return array
     */
    public function parse_size($string)
    {
        $size  = array();
        if(!is_array($string) && substr( $string, 0, strlen($this->prefix) ) === $this->prefix)
        {
            $string = substr( $string, strlen($this->prefix) );
            $array = explode('x', $string);
            foreach ($array as $key => $value) {
                $value = absint(trim($value));
                if (! $value) {
                    continue;
                }
                if ($key === 0) {
                    $size['width'] = $value;
                }
                if ($key === 1) {
                    $size['height'] = $value;
                }
            }
        } else {
            return $string;
        }
        return $size;
    }
    /**
     * Create a new image by cropping the original image based on given size.
     *
     * @since  1.0.0
     * @access public
     * @param  integer $id
     * @param  integer $width
     * @param  integer $height
     * @param  boolean $crop
     * @return array
     */
    public function make_image($id, $width, $height = 999999, $crop = false)
    {
        $image  = get_attached_file($id);
        $editor = wp_get_image_editor($image);
        if (! is_wp_error($editor)) {
            $editor->resize($width, $height, $crop);
            $editor->set_quality(100);
            $filename = $editor->generate_filename();
            return $editor->save($filename);
        }
    }
}