X-Git-Url: https://scripts.mit.edu/gitweb/autoinstalls/wordpress.git/blobdiff_plain/784f914b1e4b1c62d6657e86397c2e83bcee4295..refs/tags/wordpress-4.6.1:/wp-includes/media.php
diff --git a/wp-includes/media.php b/wp-includes/media.php
index 9f35f798..bc7a90ce 100644
--- a/wp-includes/media.php
+++ b/wp-includes/media.php
@@ -95,7 +95,7 @@ function image_constrain_size_for_editor( $width, $height, $size = 'medium', $co
}
/**
- * Filter the maximum image size dimensions for the editor.
+ * Filters the maximum image size dimensions for the editor.
*
* @since 2.5.0
*
@@ -148,7 +148,7 @@ function image_hwstring( $width, $height ) {
* function won't create a new resized copy, it will just return an already
* resized one if it exists.
*
- * A plugin may use the 'image_downsize' filter to hook into and offer image
+ * A plugin may use the {@see 'image_downsize'} filter to hook into and offer image
* resizing services for images. The hook must return an array with the same
* elements that are returned in the function. The first element being the URL
* to the new image that was resized.
@@ -168,7 +168,7 @@ function image_downsize( $id, $size = 'medium' ) {
return false;
/**
- * Filter whether to preempt the output of image_downsize().
+ * Filters whether to preempt the output of image_downsize().
*
* Passing a truthy value to the filter will effectively short-circuit
* down-sizing the image, returning that value as output instead.
@@ -309,12 +309,12 @@ function set_post_thumbnail_size( $width = 0, $height = 0, $crop = false ) {
/**
* Gets an img tag for an image attachment, scaling it down if requested.
*
- * The filter 'get_image_tag_class' allows for changing the class name for the
+ * The {@see 'get_image_tag_class'} filter allows for changing the class name for the
* image without having to use regular expressions on the HTML content. The
* parameters are: what WordPress will use for the class, the Attachment ID,
* image align value, and the size the image should be.
*
- * The second filter 'get_image_tag' has the HTML content, which can then be
+ * The second filter, {@see 'get_image_tag'}, has the HTML content, which can then be
* further manipulated by a plugin to change all attribute values and even HTML
* content.
*
@@ -339,7 +339,7 @@ function get_image_tag( $id, $alt, $title, $align, $size = 'medium' ) {
$class = 'align' . esc_attr($align) .' size-' . esc_attr($size) . ' wp-image-' . $id;
/**
- * Filter the value of the attachment's image tag class attribute.
+ * Filters the value of the attachment's image tag class attribute.
*
* @since 2.6.0
*
@@ -354,7 +354,7 @@ function get_image_tag( $id, $alt, $title, $align, $size = 'medium' ) {
$html = '';
/**
- * Filter the HTML content for the image tag.
+ * Filters the HTML content for the image tag.
*
* @since 2.6.0
*
@@ -431,7 +431,7 @@ function wp_constrain_dimensions( $current_width, $current_height, $max_width =
}
/**
- * Filter dimensions to constrain down-sampled images to.
+ * Filters dimensions to constrain down-sampled images to.
*
* @since 4.1.0
*
@@ -477,7 +477,7 @@ function image_resize_dimensions( $orig_w, $orig_h, $dest_w, $dest_h, $crop = fa
return false;
/**
- * Filter whether to preempt calculating the image resize dimensions.
+ * Filters whether to preempt calculating the image resize dimensions.
*
* Passing a non-null value to the filter will effectively short-circuit
* image_resize_dimensions(), returning that value instead.
@@ -562,7 +562,7 @@ function image_resize_dimensions( $orig_w, $orig_h, $dest_w, $dest_h, $crop = fa
* Resizes an image to make a thumbnail or intermediate size.
*
* The returned array has the file size, the image width, and image height. The
- * filter 'image_make_intermediate_size' can be used to hook in and change the
+ * {@see 'image_make_intermediate_size'} filter can be used to hook in and change the
* values of the returned array. The only parameter is the resized file path.
*
* @since 2.5.0
@@ -591,6 +591,36 @@ function image_make_intermediate_size( $file, $width, $height, $crop = false ) {
return false;
}
+/**
+ * Helper function to test if aspect ratios for two images match.
+ *
+ * @since 4.6.0
+ *
+ * @param int $source_width Width of the first image in pixels.
+ * @param int $source_height Height of the first image in pixels.
+ * @param int $target_width Width of the second image in pixels.
+ * @param int $target_height Height of the second image in pixels.
+ * @return bool True if aspect ratios match within 1px. False if not.
+ */
+function wp_image_matches_ratio( $source_width, $source_height, $target_width, $target_height ) {
+ /*
+ * To test for varying crops, we constrain the dimensions of the larger image
+ * to the dimensions of the smaller image and see if they match.
+ */
+ if ( $source_width > $target_width ) {
+ $constrained_size = wp_constrain_dimensions( $source_width, $source_height, $target_width );
+ $expected_size = array( $target_width, $target_height );
+ } else {
+ $constrained_size = wp_constrain_dimensions( $target_width, $target_height, $source_width );
+ $expected_size = array( $source_width, $source_height );
+ }
+
+ // If the image dimensions are within 1px of the expected size, we consider it a match.
+ $matched = ( abs( $constrained_size[0] - $expected_size[0] ) <= 1 && abs( $constrained_size[1] - $expected_size[1] ) <= 1 );
+
+ return $matched;
+}
+
/**
* Retrieves the image's intermediate size (resized) path, width, and height.
*
@@ -623,64 +653,73 @@ function image_make_intermediate_size( $file, $width, $height, $crop = false ) {
* @type string $file Image's path relative to uploads directory
* @type int $width Width of image
* @type int $height Height of image
- * @type string $path Optional. Image's absolute filesystem path. Only returned if registered
- * size is passed to `$size` parameter.
- * @type string $url Optional. Image's URL. Only returned if registered size is passed to `$size`
- * parameter.
+ * @type string $path Image's absolute filesystem path.
+ * @type string $url Image's URL.
* }
*/
function image_get_intermediate_size( $post_id, $size = 'thumbnail' ) {
- if ( !is_array( $imagedata = wp_get_attachment_metadata( $post_id ) ) )
+ if ( ! $size || ! is_array( $imagedata = wp_get_attachment_metadata( $post_id ) ) || empty( $imagedata['sizes'] ) ) {
return false;
+ }
+
+ $data = array();
- // get the best one for a specified set of dimensions
- if ( is_array($size) && !empty($imagedata['sizes']) ) {
+ // Find the best match when '$size' is an array.
+ if ( is_array( $size ) ) {
$candidates = array();
foreach ( $imagedata['sizes'] as $_size => $data ) {
// If there's an exact match to an existing image size, short circuit.
if ( $data['width'] == $size[0] && $data['height'] == $size[1] ) {
- list( $data['width'], $data['height'] ) = image_constrain_size_for_editor( $data['width'], $data['height'], $size );
-
- /** This filter is documented in wp-includes/media.php */
- return apply_filters( 'image_get_intermediate_size', $data, $post_id, $size );
+ $candidates[ $data['width'] * $data['height'] ] = $data;
+ break;
}
- // If it's not an exact match but it's at least the dimensions requested.
+
+ // If it's not an exact match, consider larger sizes with the same aspect ratio.
if ( $data['width'] >= $size[0] && $data['height'] >= $size[1] ) {
- $candidates[ $data['width'] * $data['height'] ] = $_size;
+ // If '0' is passed to either size, we test ratios against the original file.
+ if ( 0 === $size[0] || 0 === $size[1] ) {
+ $same_ratio = wp_image_matches_ratio( $data['width'], $data['height'], $imagedata['width'], $imagedata['height'] );
+ } else {
+ $same_ratio = wp_image_matches_ratio( $data['width'], $data['height'], $size[0], $size[1] );
+ }
+
+ if ( $same_ratio ) {
+ $candidates[ $data['width'] * $data['height'] ] = $data;
+ }
}
}
if ( ! empty( $candidates ) ) {
- // find for the smallest image not smaller than the desired size
- ksort( $candidates );
- foreach ( $candidates as $_size ) {
- $data = $imagedata['sizes'][$_size];
-
- // Skip images with unexpectedly divergent aspect ratios (crops)
- // First, we calculate what size the original image would be if constrained to a box the size of the current image in the loop
- $maybe_cropped = image_resize_dimensions($imagedata['width'], $imagedata['height'], $data['width'], $data['height'], false );
- // If the size doesn't match within one pixel, then it is of a different aspect ratio, so we skip it, unless it's the thumbnail size
- if ( 'thumbnail' != $_size &&
- ( ! $maybe_cropped
- || ( $maybe_cropped[4] != $data['width'] && $maybe_cropped[4] + 1 != $data['width'] )
- || ( $maybe_cropped[5] != $data['height'] && $maybe_cropped[5] + 1 != $data['height'] )
- ) ) {
- continue;
- }
- // If we're still here, then we're going to use this size.
- list( $data['width'], $data['height'] ) = image_constrain_size_for_editor( $data['width'], $data['height'], $size );
-
- /** This filter is documented in wp-includes/media.php */
- return apply_filters( 'image_get_intermediate_size', $data, $post_id, $size );
+ // Sort the array by size if we have more than one candidate.
+ if ( 1 < count( $candidates ) ) {
+ ksort( $candidates );
}
+
+ $data = array_shift( $candidates );
+ /*
+ * When the size requested is smaller than the thumbnail dimensions, we
+ * fall back to the thumbnail size to maintain backwards compatibility with
+ * pre 4.6 versions of WordPress.
+ */
+ } elseif ( ! empty( $imagedata['sizes']['thumbnail'] ) && $imagedata['sizes']['thumbnail']['width'] >= $size[0] && $imagedata['sizes']['thumbnail']['width'] >= $size[1] ) {
+ $data = $imagedata['sizes']['thumbnail'];
+ } else {
+ return false;
}
+
+ // Constrain the width and height attributes to the requested values.
+ list( $data['width'], $data['height'] ) = image_constrain_size_for_editor( $data['width'], $data['height'], $size );
+
+ } elseif ( ! empty( $imagedata['sizes'][ $size ] ) ) {
+ $data = $imagedata['sizes'][ $size ];
}
- if ( is_array($size) || empty($size) || empty($imagedata['sizes'][$size]) )
+ // If we still don't have a match at this point, return false.
+ if ( empty( $data ) ) {
return false;
+ }
- $data = $imagedata['sizes'][$size];
// include the full filesystem path of the intermediate file
if ( empty($data['path']) && !empty($data['file']) ) {
$file_url = wp_get_attachment_url($post_id);
@@ -689,7 +728,7 @@ function image_get_intermediate_size( $post_id, $size = 'thumbnail' ) {
}
/**
- * Filter the output of image_get_intermediate_size()
+ * Filters the output of image_get_intermediate_size()
*
* @since 4.4.0
*
@@ -720,7 +759,7 @@ function get_intermediate_image_sizes() {
$image_sizes = array_merge( $image_sizes, array_keys( $_wp_additional_image_sizes ) );
/**
- * Filter the list of intermediate image sizes.
+ * Filters the list of intermediate image sizes.
*
* @since 2.5.0
*
@@ -767,7 +806,7 @@ function wp_get_attachment_image_src( $attachment_id, $size = 'thumbnail', $icon
}
}
/**
- * Filter the image src result.
+ * Filters the image src result.
*
* @since 4.3.0
*
@@ -840,7 +879,7 @@ function wp_get_attachment_image($attachment_id, $size = 'thumbnail', $icon = fa
}
/**
- * Filter the list of attachment image attributes.
+ * Filters the list of attachment image attributes.
*
* @since 2.8.0
*
@@ -1008,7 +1047,7 @@ function wp_calculate_image_srcset( $size_array, $image_src, $image_meta, $attac
* If src is an intermediate size GIF, the full size is excluded from srcset to keep a flattened GIF from becoming animated.
*/
if ( ! isset( $image_sizes['thumbnail']['mime-type'] ) || 'image/gif' !== $image_sizes['thumbnail']['mime-type'] ) {
- $image_sizes['full'] = array(
+ $image_sizes[] = array(
'width' => $image_meta['width'],
'height' => $image_meta['height'],
'file' => $image_basename,
@@ -1043,7 +1082,7 @@ function wp_calculate_image_srcset( $size_array, $image_src, $image_meta, $attac
$image_edited = preg_match( '/-e[0-9]{13}/', wp_basename( $image_src ), $image_edit_hash );
/**
- * Filter the maximum image width to be included in a 'srcset' attribute.
+ * Filters the maximum image width to be included in a 'srcset' attribute.
*
* @since 4.4.0
*
@@ -1085,28 +1124,15 @@ function wp_calculate_image_srcset( $size_array, $image_src, $image_meta, $attac
}
/*
- * Filter out images that are wider than '$max_srcset_image_width' unless
+ * Filters out images that are wider than '$max_srcset_image_width' unless
* that file is in the 'src' attribute.
*/
if ( $max_srcset_image_width && $image['width'] > $max_srcset_image_width && ! $is_src ) {
continue;
}
- /**
- * To check for varying crops, we calculate the expected size of the smaller
- * image if the larger were constrained by the width of the smaller and then
- * see if it matches what we're expecting.
- */
- if ( $image_width > $image['width'] ) {
- $constrained_size = wp_constrain_dimensions( $image_width, $image_height, $image['width'] );
- $expected_size = array( $image['width'], $image['height'] );
- } else {
- $constrained_size = wp_constrain_dimensions( $image['width'], $image['height'], $image_width );
- $expected_size = array( $image_width, $image_height );
- }
-
// If the image dimensions are within 1px of the expected size, use it.
- if ( abs( $constrained_size[0] - $expected_size[0] ) <= 1 && abs( $constrained_size[1] - $expected_size[1] ) <= 1 ) {
+ if ( wp_image_matches_ratio( $image_width, $image_height, $image['width'], $image['height'] ) ) {
// Add the URL, descriptor, and value to the sources array to be returned.
$source = array(
'url' => $image_baseurl . $image['file'],
@@ -1124,7 +1150,7 @@ function wp_calculate_image_srcset( $size_array, $image_src, $image_meta, $attac
}
/**
- * Filter an image's 'srcset' sources.
+ * Filters an image's 'srcset' sources.
*
* @since 4.4.0
*
@@ -1142,7 +1168,7 @@ function wp_calculate_image_srcset( $size_array, $image_src, $image_meta, $attac
* @param array $size_array Array of width and height values in pixels (in that order).
* @param string $image_src The 'src' of the image.
* @param array $image_meta The image meta data as returned by 'wp_get_attachment_metadata()'.
- * @param int $attachment_id Image attachment ID or 0.
+ * @param int $attachment_id Image attachment ID or 0.
*/
$sources = apply_filters( 'wp_calculate_image_srcset', $sources, $size_array, $image_src, $image_meta, $attachment_id );
@@ -1154,7 +1180,7 @@ function wp_calculate_image_srcset( $size_array, $image_src, $image_meta, $attac
$srcset = '';
foreach ( $sources as $source ) {
- $srcset .= $source['url'] . ' ' . $source['value'] . $source['descriptor'] . ', ';
+ $srcset .= str_replace( ' ', '%20', $source['url'] ) . ' ' . $source['value'] . $source['descriptor'] . ', ';
}
return rtrim( $srcset, ', ' );
@@ -1232,7 +1258,7 @@ function wp_calculate_image_sizes( $size, $image_src = null, $image_meta = null,
$sizes = sprintf( '(max-width: %1$dpx) 100vw, %1$dpx', $width );
/**
- * Filter the output of 'wp_calculate_image_sizes()'.
+ * Filters the output of 'wp_calculate_image_sizes()'.
*
* @since 4.4.0
*
@@ -1387,8 +1413,8 @@ function wp_image_add_srcset_and_sizes( $image, $image_meta, $attachment_id ) {
/**
* Adds a 'wp-post-image' class to post thumbnails. Internal use only.
*
- * Uses the 'begin_fetch_post_thumbnail_html' and 'end_fetch_post_thumbnail_html' action hooks to
- * dynamically add/remove itself so as to only filter post thumbnails.
+ * Uses the {@see 'begin_fetch_post_thumbnail_html'} and {@see 'end_fetch_post_thumbnail_html'}
+ * action hooks to dynamically add/remove itself so as to only filter post thumbnails.
*
* @ignore
* @since 2.9.0
@@ -1434,7 +1460,7 @@ add_shortcode('caption', 'img_caption_shortcode');
* Builds the Caption shortcode output.
*
* Allows a plugin to replace the content that would otherwise be returned. The
- * filter is 'img_caption_shortcode' and passes an empty string, the attr
+ * filter is {@see 'img_caption_shortcode'} and passes an empty string, the attr
* parameter and the content parameter values.
*
* The supported attributes for the shortcode are 'id', 'align', 'width', and
@@ -1467,7 +1493,7 @@ function img_caption_shortcode( $attr, $content = null ) {
}
/**
- * Filter the default caption shortcode output.
+ * Filters the default caption shortcode output.
*
* If the filtered output isn't empty, it will be used instead of generating
* the default caption template.
@@ -1506,7 +1532,7 @@ function img_caption_shortcode( $attr, $content = null ) {
$width = $html5 ? $atts['width'] : ( 10 + $atts['width'] );
/**
- * Filter the width of an image's caption.
+ * Filters the width of an image's caption.
*
* By default, the caption is 10 pixels greater than the width of the image,
* to prevent post content from running up against a floated image.
@@ -1589,7 +1615,7 @@ function gallery_shortcode( $attr ) {
}
/**
- * Filter the default gallery shortcode output.
+ * Filters the default gallery shortcode output.
*
* If the filtered output isn't empty, it will be used instead of generating
* the default gallery template.
@@ -1673,7 +1699,7 @@ function gallery_shortcode( $attr ) {
$gallery_style = '';
/**
- * Filter whether to print default gallery styles.
+ * Filters whether to print default gallery styles.
*
* @since 3.1.0
*
@@ -1707,7 +1733,7 @@ function gallery_shortcode( $attr ) {
$gallery_div = "