<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[38949] trunk: Media: Add support for rendering PDF thumbnails.</title>
</head>
<body>
<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta" style="font-size: 105%">
<dt style="float: left; width: 6em; font-weight: bold">Revision</dt> <dd><a style="font-weight: bold" href="https://core.trac.wordpress.org/changeset/38949">38949</a><script type="application/ld+json">{"@context":"http://schema.org","@type":"EmailMessage","description":"Review this Commit","action":{"@type":"ViewAction","url":"https://core.trac.wordpress.org/changeset/38949","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>mikeschroder</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2016-10-26 07:27:51 +0000 (Wed, 26 Oct 2016)</dd>
</dl>
<pre style='padding-left: 1em; margin: 2em 0; border-left: 2px solid #ccc; line-height: 1.25; font-size: 105%; font-family: sans-serif'>Media: Add support for rendering PDF thumbnails.
When support for PDFs is available, on upload,
render 'Thumbnail', 'Medium', 'Large', and 'Full' sizes of
the first page, and save them in attachment meta.
Use these renders within Add Media, Media Gallery and List views,
Attachment Details, Post/Attachment Edit screens, and Attachment pages.
Support available by default via Imagick -> ImageMagick -> Ghostscript,
but can be provided by any `WP_Image_Editor` that supports PDFs.
Props adamsilverstein, azaozz, celloexpressions, desrosj, dglingren, ericlewis, ipstenu, joemcgill, joyously, markoheijnen, melchoyce, mikeschroder, tomauger.
Fixes <a href="https://core.trac.wordpress.org/ticket/31050">#31050</a>.</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunksrcwpadminincludesimagephp">trunk/src/wp-admin/includes/image.php</a></li>
<li><a href="#trunksrcwpadminincludesmediaphp">trunk/src/wp-admin/includes/media.php</a></li>
<li><a href="#trunksrcwpincludesclasswpimageeditorimagickphp">trunk/src/wp-includes/class-wp-image-editor-imagick.php</a></li>
<li><a href="#trunksrcwpincludesmediatemplatephp">trunk/src/wp-includes/media-template.php</a></li>
<li><a href="#trunksrcwpincludesmediaphp">trunk/src/wp-includes/media.php</a></li>
<li><a href="#trunktestsphpunittestsimagefunctionsphp">trunk/tests/phpunit/tests/image/functions.php</a></li>
</ul>
<h3>Added Paths</h3>
<ul>
<li><a href="#trunktestsphpunitdataimageswordpressgsocflyerpdf">trunk/tests/phpunit/data/images/wordpress-gsoc-flyer.pdf</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunksrcwpadminincludesimagephp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-admin/includes/image.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-admin/includes/image.php 2016-10-26 06:51:11 UTC (rev 38948)
+++ trunk/src/wp-admin/includes/image.php 2016-10-26 07:27:51 UTC (rev 38949)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -76,7 +76,9 @@
</span><span class="cx" style="display: block; padding: 0 10px">
</span><span class="cx" style="display: block; padding: 0 10px"> $metadata = array();
</span><span class="cx" style="display: block; padding: 0 10px"> $support = false;
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- if ( preg_match('!^image/!', get_post_mime_type( $attachment )) && file_is_displayable_image($file) ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $mime_type = get_post_mime_type( $attachment );
+
+ if ( preg_match( '!^image/!', $mime_type ) && file_is_displayable_image( $file ) ) {
</ins><span class="cx" style="display: block; padding: 0 10px"> $imagesize = getimagesize( $file );
</span><span class="cx" style="display: block; padding: 0 10px"> $metadata['width'] = $imagesize[0];
</span><span class="cx" style="display: block; padding: 0 10px"> $metadata['height'] = $imagesize[1];
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -201,7 +203,45 @@
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ // Try to create image thumbnails for PDFs
+ else if ( 'application/pdf' === $mime_type ) {
+ $editor = wp_get_image_editor( $file );
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $fallback_sizes = array(
+ 'thumbnail',
+ 'medium',
+ 'large',
+ );
+
+ $sizes = array();
+
+ foreach ( $fallback_sizes as $s ) {
+ $sizes[$s]['width'] = get_option( "{$s}_size_w" );
+ $sizes[$s]['height'] = get_option( "{$s}_size_h" );
+
+ // Force thumbnails to be soft crops.
+ if ( ! 'thumbnail' === $s ) {
+ $sizes[$s]['crop'] = get_option( "{$s}_crop" );
+ }
+ }
+
+ if ( ! is_wp_error( $editor ) ) { // No support for this type of file
+ $uploaded = $editor->save( $file, 'image/jpeg' );
+ unset( $editor );
+
+ // Resize based on the full size image, rather than the source.
+ if ( ! is_wp_error( $uploaded ) ) {
+ $editor = wp_get_image_editor( $uploaded['path'] );
+ unset( $uploaded['path'] );
+
+ if ( ! is_wp_error( $editor ) ) {
+ $metadata['sizes'] = $editor->multi_resize( $sizes );
+ $metadata['sizes']['full'] = $uploaded;
+ }
+ }
+ }
+ }
+
</ins><span class="cx" style="display: block; padding: 0 10px"> // Remove the blob of binary data from the array.
</span><span class="cx" style="display: block; padding: 0 10px"> if ( $metadata ) {
</span><span class="cx" style="display: block; padding: 0 10px"> unset( $metadata['image']['data'] );
</span></span></pre></div>
<a id="trunksrcwpadminincludesmediaphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-admin/includes/media.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-admin/includes/media.php 2016-10-26 06:51:11 UTC (rev 38948)
+++ trunk/src/wp-admin/includes/media.php 2016-10-26 07:27:51 UTC (rev 38949)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -2766,8 +2766,18 @@
</span><span class="cx" style="display: block; padding: 0 10px">
</span><span class="cx" style="display: block; padding: 0 10px"> echo wp_video_shortcode( $attr );
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- else :
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ elseif ( isset( $thumb_url[0] ) ):
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ ?>
+ <div class="wp_attachment_image wp-clearfix" id="media-head-<?php echo $attachment_id; ?>">
+ <p id="thumbnail-head-<?php echo $attachment_id; ?>">
+ <img class="thumbnail" src="<?php echo set_url_scheme( $thumb_url[0] ); ?>" style="max-width:100%" alt="" />
+ </p>
+ </div>
+ <?php
+
+ else:
+
</ins><span class="cx" style="display: block; padding: 0 10px"> /**
</span><span class="cx" style="display: block; padding: 0 10px"> * Fires when an attachment type can't be rendered in the edit form.
</span><span class="cx" style="display: block; padding: 0 10px"> *
</span></span></pre></div>
<a id="trunksrcwpincludesclasswpimageeditorimagickphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/class-wp-image-editor-imagick.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/class-wp-image-editor-imagick.php 2016-10-26 06:51:11 UTC (rev 38948)
+++ trunk/src/wp-includes/class-wp-image-editor-imagick.php 2016-10-26 07:27:51 UTC (rev 38949)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -73,6 +73,7 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 'rotateimage',
</span><span class="cx" style="display: block; padding: 0 10px"> 'flipimage',
</span><span class="cx" style="display: block; padding: 0 10px"> 'flopimage',
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ 'readimage',
</ins><span class="cx" style="display: block; padding: 0 10px"> );
</span><span class="cx" style="display: block; padding: 0 10px">
</span><span class="cx" style="display: block; padding: 0 10px"> // Now, test for deep requirements within Imagick.
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -144,8 +145,19 @@
</span><span class="cx" style="display: block; padding: 0 10px"> wp_raise_memory_limit( 'image' );
</span><span class="cx" style="display: block; padding: 0 10px">
</span><span class="cx" style="display: block; padding: 0 10px"> try {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- $this->image = new Imagick( $this->file );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $this->image = new Imagick();
+ $file_parts = pathinfo( $this->file );
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ // By default, PDFs are rendered in a very low resolution.
+ // We want the thumbnail to be readable, so increase the rendering dpi.
+ if ( 'pdf' == strtolower( $file_parts['extension'] ) ) {
+ $this->image->setResolution( 128, 128 );
+ }
+
+ // Reading image after Imagick instantiation because `setResolution`
+ // only applies correctly before the image is read.
+ $this->image->readImage( $this->file );
+
</ins><span class="cx" style="display: block; padding: 0 10px"> if ( ! $this->image->valid() )
</span><span class="cx" style="display: block; padding: 0 10px"> return new WP_Error( 'invalid_image', __('File is not an image.'), $this->file);
</span><span class="cx" style="display: block; padding: 0 10px">
</span></span></pre></div>
<a id="trunksrcwpincludesmediatemplatephp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/media-template.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/media-template.php 2016-10-26 06:51:11 UTC (rev 38948)
+++ trunk/src/wp-includes/media-template.php 2016-10-26 07:27:51 UTC (rev 38949)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -290,9 +290,9 @@
</span><span class="cx" style="display: block; padding: 0 10px"> <div class="thumbnail thumbnail-{{ data.type }}">
</span><span class="cx" style="display: block; padding: 0 10px"> <# if ( data.uploading ) { #>
</span><span class="cx" style="display: block; padding: 0 10px"> <div class="media-progress-bar"><div></div></div>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <# } else if ( 'image' === data.type && data.sizes && data.sizes.large ) { #>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <# } else if ( data.sizes && data.sizes.large ) { #>
</ins><span class="cx" style="display: block; padding: 0 10px"> <img class="details-image" src="{{ data.sizes.large.url }}" draggable="false" alt="" />
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- <# } else if ( 'image' === data.type && data.sizes && data.sizes.full ) { #>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <# } else if ( data.sizes && data.sizes.full ) { #>
</ins><span class="cx" style="display: block; padding: 0 10px"> <img class="details-image" src="{{ data.sizes.full.url }}" draggable="false" alt="" />
</span><span class="cx" style="display: block; padding: 0 10px"> <# } else if ( -1 === jQuery.inArray( data.type, [ 'audio', 'video' ] ) ) { #>
</span><span class="cx" style="display: block; padding: 0 10px"> <img class="details-image icon" src="{{ data.icon }}" draggable="false" alt="" />
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -454,6 +454,8 @@
</span><span class="cx" style="display: block; padding: 0 10px"> <div class="centered">
</span><span class="cx" style="display: block; padding: 0 10px"> <# if ( data.image && data.image.src && data.image.src !== data.icon ) { #>
</span><span class="cx" style="display: block; padding: 0 10px"> <img src="{{ data.image.src }}" class="thumbnail" draggable="false" alt="" />
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ <# } else if ( data.sizes && data.sizes.medium ) { #>
+ <img src="{{ data.sizes.medium.url }}" class="thumbnail" draggable="false" alt="" />
</ins><span class="cx" style="display: block; padding: 0 10px"> <# } else { #>
</span><span class="cx" style="display: block; padding: 0 10px"> <img src="{{ data.icon }}" class="icon" draggable="false" alt="" />
</span><span class="cx" style="display: block; padding: 0 10px"> <# } #>
</span></span></pre></div>
<a id="trunksrcwpincludesmediaphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/media.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/media.php 2016-10-26 06:51:11 UTC (rev 38948)
+++ trunk/src/wp-includes/media.php 2016-10-26 07:27:51 UTC (rev 38949)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -183,10 +183,8 @@
</span><span class="cx" style="display: block; padding: 0 10px"> * the image is an intermediate size. False on failure.
</span><span class="cx" style="display: block; padding: 0 10px"> */
</span><span class="cx" style="display: block; padding: 0 10px"> function image_downsize( $id, $size = 'medium' ) {
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $is_image = wp_attachment_is_image( $id );
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- if ( !wp_attachment_is_image($id) )
- return false;
-
</del><span class="cx" style="display: block; padding: 0 10px"> /**
</span><span class="cx" style="display: block; padding: 0 10px"> * Filters whether to preempt the output of image_downsize().
</span><span class="cx" style="display: block; padding: 0 10px"> *
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -210,6 +208,19 @@
</span><span class="cx" style="display: block; padding: 0 10px"> $is_intermediate = false;
</span><span class="cx" style="display: block; padding: 0 10px"> $img_url_basename = wp_basename($img_url);
</span><span class="cx" style="display: block; padding: 0 10px">
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ // If the file isn't an image, attempt to replace its URL with a rendered image from its meta.
+ // Otherwise, a non-image type could be returned.
+ if ( ! $is_image ) {
+ if ( ! empty( $meta['sizes'] ) ) {
+ $img_url = str_replace( $img_url_basename, $meta['sizes']['full']['file'], $img_url );
+ $img_url_basename = $meta['sizes']['full']['file'];
+ $width = $meta['sizes']['full']['width'];
+ $height = $meta['sizes']['full']['height'];
+ } else {
+ return false;
+ }
+ }
+
</ins><span class="cx" style="display: block; padding: 0 10px"> // try for a new style intermediate size
</span><span class="cx" style="display: block; padding: 0 10px"> if ( $intermediate = image_get_intermediate_size($id, $size) ) {
</span><span class="cx" style="display: block; padding: 0 10px"> $img_url = str_replace($img_url_basename, $intermediate['file'], $img_url);
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -685,6 +696,11 @@
</span><span class="cx" style="display: block; padding: 0 10px"> if ( is_array( $size ) ) {
</span><span class="cx" style="display: block; padding: 0 10px"> $candidates = array();
</span><span class="cx" style="display: block; padding: 0 10px">
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ if ( ! isset( $imagedata['file'] ) && isset( $imagedata['sizes']['full'] ) ) {
+ $imagedata['height'] = $imagedata['sizes']['full']['height'];
+ $imagedata['width'] = $imagedata['sizes']['full']['width'];
+ }
+
</ins><span class="cx" style="display: block; padding: 0 10px"> foreach ( $imagedata['sizes'] as $_size => $data ) {
</span><span class="cx" style="display: block; padding: 0 10px"> // If there's an exact match to an existing image size, short circuit.
</span><span class="cx" style="display: block; padding: 0 10px"> if ( $data['width'] == $size[0] && $data['height'] == $size[1] ) {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -738,7 +754,7 @@
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px">
</span><span class="cx" style="display: block; padding: 0 10px"> // include the full filesystem path of the intermediate file
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- if ( empty($data['path']) && !empty($data['file']) ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ if ( empty( $data['path'] ) && ! empty( $data['file'] ) && ! empty( $imagedata['file'] ) ) {
</ins><span class="cx" style="display: block; padding: 0 10px"> $file_url = wp_get_attachment_url($post_id);
</span><span class="cx" style="display: block; padding: 0 10px"> $data['path'] = path_join( dirname($imagedata['file']), $data['file'] );
</span><span class="cx" style="display: block; padding: 0 10px"> $data['url'] = path_join( dirname($file_url), $data['file'] );
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -3123,7 +3139,7 @@
</span><span class="cx" style="display: block; padding: 0 10px"> if ( current_user_can( 'delete_post', $attachment->ID ) )
</span><span class="cx" style="display: block; padding: 0 10px"> $response['nonces']['delete'] = wp_create_nonce( 'delete-post_' . $attachment->ID );
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- if ( $meta && 'image' === $type ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ if ( $meta && ! empty( $meta['sizes'] ) ) {
</ins><span class="cx" style="display: block; padding: 0 10px"> $sizes = array();
</span><span class="cx" style="display: block; padding: 0 10px">
</span><span class="cx" style="display: block; padding: 0 10px"> /** This filter is documented in wp-admin/includes/media.php */
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -3171,16 +3187,29 @@
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- $sizes['full'] = array( 'url' => $attachment_url );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ if ( 'image' === $type ) {
+ $sizes['full'] = array( 'url' => $attachment_url );
</ins><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- if ( isset( $meta['height'], $meta['width'] ) ) {
- $sizes['full']['height'] = $meta['height'];
- $sizes['full']['width'] = $meta['width'];
- $sizes['full']['orientation'] = $meta['height'] > $meta['width'] ? 'portrait' : 'landscape';
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ if ( isset( $meta['height'], $meta['width'] ) ) {
+ $sizes['full']['height'] = $meta['height'];
+ $sizes['full']['width'] = $meta['width'];
+ $sizes['full']['orientation'] = $meta['height'] > $meta['width'] ? 'portrait' : 'landscape';
+ }
+
+ $response = array_merge( $response, $sizes['full'] );
+ } elseif ( $meta['sizes']['full']['file'] ) {
+ $sizes['full'] = array(
+ 'url' => $base_url . $meta['sizes']['full']['file'],
+ 'height' => $meta['sizes']['full']['height'],
+ 'width' => $meta['sizes']['full']['width'],
+ 'orientation' => $meta['sizes']['full']['height'] > $meta['sizes']['full']['width'] ? 'portrait' : 'landscape'
+ );
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px">
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- $response = array_merge( $response, array( 'sizes' => $sizes ), $sizes['full'] );
- } elseif ( $meta && 'video' === $type ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $response = array_merge( $response, array( 'sizes' => $sizes ) );
+ }
+
+ if ( $meta && 'video' === $type ) {
</ins><span class="cx" style="display: block; padding: 0 10px"> if ( isset( $meta['width'] ) )
</span><span class="cx" style="display: block; padding: 0 10px"> $response['width'] = (int) $meta['width'];
</span><span class="cx" style="display: block; padding: 0 10px"> if ( isset( $meta['height'] ) )
</span></span></pre></div>
<a id="trunktestsphpunitdataimageswordpressgsocflyerpdf"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: trunk/tests/phpunit/data/images/wordpress-gsoc-flyer.pdf</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/tests/phpunit/data/images/wordpress-gsoc-flyer.pdf (rev 0)
+++ trunk/tests/phpunit/data/images/wordpress-gsoc-flyer.pdf 2016-10-26 07:27:51 UTC (rev 38949)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -0,0 +1,255 @@
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+%PDF-1.3
+%\xC4\xE5\xF2\xE5\xEB\xA7\xF3\xA0\xD0\xC4\xC6
+4 0 obj
+<< /Length 5 0 R /Filter /FlateDecode >>
+stream
+x\x8D\x97Io$E\x85\xEF\xFD+\xF2\x84\xBA%&'\xF7\xE5\xC8.!!\x96\xB1\xC4q\x80a`<,!\xFE=ߋ\xAC\xB6\xABmf$ʎ\x8Ax\xF9"\xE2Ed\xF97\xF7\xA5\xFB\xCD\xFE\xB5\x98\\x9F\xC9\xFD\xFE\xC2}\xEDޚ)\xB8\xE8~vO?\xB9\x89\xEEՍ{\xFFʥ\xE2\x82)\xFD\xE7\x9E\xEC~\xE6Mjŷ2\xA3\xCB%\xF8F=\]\xBB\xA7G/\x98\xAB\x97\xEEw\xFC\xFA\xE4js\xC7\xDFO.Gw\xFC\x91\xC7p\xC7?0&w|qrq\xBA\xA3[\x8F\xE7\x83;\xFErr)\xBB\xE3\xA7C\xEA\xE6\x921\xBE{\xE1y\x8D\xEF\xBE\xE3A\xF8\xCF+\xEEL.u\x81\xE1\xF90~\xC3%\xF3\xDB\xDF'7\xE0r\x89\xF9\xCE\xC9}\xEB\xAE>u]\xFDo\xD69t\xDFrd\x94\xFD(\xB1=\xCCZ'q\xC4\xC6pK\xFE\xEDE\xBBt\xA9\xCF`\xF8\xE6tC\xC2\xF5y\xB5\xF2\xBČ\xB84\x98e\x95P\x9E?\xCE㮼\xAB\xAE=\xFEZ(w\xEFt\xD0\xEBǧ\xCB\xF0y\xB6\xEA\xD2h~\x8C\xF80[\xF5\xF8\xAE\xD8bF\xCBD \x9E_\xF0(t\xE9\xFF
+\x94H\xFA\xE6d\xB7\xFEӁ\x9D>\xE1\xB7
+5l\xA2\xA0 R\x83\x8A\xB5\xAA\xB4xF\x8F\xC9\xF6O\xDEQ \xF5\x9F\x83\xF4\xE0t\xD5s\x89p \xA6\xB4\xF8\xF2\xE2\xD80\x82\xF2`&B\xE1\x8F\xD5F\xEAݏ٧K\xB1
\xF8:\xBB\xBB\xBA>\Į w\xF9)1XS:\xE5\xB0\xC9\xF2;\xBAz\xD7\xE7\xFCВ*A!w.\x9F\xC9\xC5\xC2䑹&\xEF \xED\xE0\xF1\xEFȖ\xF2\xC8\xE5\xD5]\xB1\xE8\xD1\xD6\xA6r\x97fn\xFC\\xDA\xED\xE0\x9F\xE6M,ų9\xA2\x8Bm\xFA4sz(
+H\x82\xBF.\xA2<t\xBC:G\x82P\xDB\xD1\xFE\x9Ew0\xA4\xCA\xF6\xCBӁ\xD1R\xC7%\x89i\xBD\xDBː\xF9\xF4# (\x86e̼\xA6\xDDj\x82!\xA9\x88\xA1\xA8qR\xE4\xC1\x98H\xBD\xDD1\x9C'אѻg\xA3\xC96\x8E1Pf\xE2\xE2\xE3\x8BW\xFB\x83A2j\x8D%|\x8F\x9A \xAF~z\xCC&J=\xFA\x9Akvc\xF8+;Wj˻Mu\xE1\xF3\x93\xA3\xEB_\xC1a|H66\x98\xF1\xCE\xF6~\xEE\xF8\x92\xE7\xF1\x84W\x9Ee\x84\xFBml\xE2cɛ\xA7 w~HAˍ\xFF3?\xBB\xF5$
+\xB5o5t\xFE\x997\x895Z"jH\xBEֳ\x86ʎ=\xD0\xF6\x88V"`$\xDB\xF4\x8B\x83چ\xA2\xB6\x82j\xB4\x89\xD0Ў\xC54%ϔnY\x9C\xE6M\x83D\xBD\xB0\xCBS\x8Dr\x83\xD53 \xEE\xAF\xC3m/\xFE(V\x82b[H90e\x97H܅l\xA9\xCAJ\x80\xF9X\x9290erbYj\xAB\xD1w,\xBF\xD8)\xE6?Y\xE66|Ma!\xD5зu\x8BK\xD1CЌ\xA3\xE4}\xF3x\x96\xEAc\xE7\x920\x96-\xB7\xED^\xBC\xC5֪%\xCD\xF6\xB1\xCCB\xF5\xF9V3\xBBk'[ \x8B\x96\xB3Yj\x81D\xA3I\x947\xE4SK\x95\xD4г{\xBE\xBC\xAA\xE2\xEA\xF4a\xB0\xF9j\x8E\xBEz2ɒ\x86\x8F\xA9\xE3\xC3\xDE\xE2\xB8| .\xCFF+\xAEN@SK\xEE
+~L\xE6ԉ\xA4\x9E\xB0&^\x8AL\x
80vF\xCD,|\xF8\x80Š&,yE\xF1\xAA\xA6C^\xCD\xF7\xC8\xDD\xD3HӐ\xEE\xE7\xFCܕ\xFDdK\xB9\x96\xB96Jˇk\x94\xCE\xC5\xB1U\xAEۙ\xC1z\x83m\xFA\xAE\xBC\xEB\xA8\x89\xAB *\x9E\xBBF\xDC\xE1lX!\x94\xCDҋx\x95,;|y
+jJY|N\xF0Ro\xA6\x81:\x8C!K\xF7S\xD8\xE4\x83-e\x8B\xA3p\x95
+%Kv\xDE`j\xA9|\x99\xD3\xCFF+˧\xAF^\xBC\xA6\x82\xA0UX\xB4Ra\x8F\x9D\x95\xCDjh\xD5I\xF41v߫\xF2\xAE\xE0\x937ݨ4\xC1:ˊ\xCE\xF0R\x87hZԐ\x8F\xAC2}\xC8\xD2\\xA5Y\xBA)\x89|\xC4K\xECe\x93\xE5
+\x83\x86\x9A \xC7FMCR\x9C\xBEv\xF1\x94S\xC4\xC4K\xAC̦^Ü\xD9,hq\xE5r\xEBSO\xCEC4xM\x92P\xCBt\x82\xD4C$u\xF5k\xBE\xA8\xBBY\x92\xF1\xE4j\xF5Tq\xB3A\xA2\x8C\xC5s➄d\x93\xA2\xBA\xF4\xE2g\xB7\xF3J\xCE(\xE4lCB\x9F\xAD
+x\x99>2\xE5\x97,.X~Bgh\xCE6i\xA6"\xEA\xA6\xD9ANMjxhAE\x95\xAF|\xA9H^\xA3Xa\x99C\xEAf~Qӊ[\xA63\xA3\x80\xAD\xB8\xB8U\xFDl+\\xCAR\xA9w\xE5\x87L\x98eIs\xE5G\xBB\x8B\xF5\x8F\x82\xF2\xDBt6 _\xA6+ʾltgZ>,\xA2xM
+Cc\xCA\xD2 S\xCCZ\xA6pۙ\xA3iX\xE0J/HheD\xDD`֢\x8F\x9A˺r\xD7h2\xB3\xA9H\xD5\xEA6)m0\xE7\xBCs\x95\xA1z(p\xEF\xC6]=,\xE8J\x93I)\xA3\xB6\x88l\xDAv\xF1p\x9F\xAF\xF3h4\xE7ݷh\xA2\xA7\xC6o\xD3\xFBP\xBDd\xE9\xD3\xD4@/\xB3\xA48\xFE*\x92\x89\xCEλoC\xA3,\xC7a\xE7\xE4$50\xC8\xD3\xD4G\\xCEk\xB0%\xA3m;\xFD\xD1#e\xB1%\x99Uv(\xF8\xACˀ2\xA8{\x8D|n\xD9d"E\xDF&\xA5\x8AN.\xAE\xD9
+\xE4\x93P\xBCuq\x8E\xB96\xA0lS\xB5aH\xFBTmئA7Ae錬\xB9mYڲ\xC0U>\xC2E\xDB!\xCD\xD4,=$zfZ\xE2v\xC8S3&\xF4&t䙛f\xF3>\xB0^r\x89qfR\x96\xC6,4\xEDfe>\xAC\xB2y\xF2\xD5*\xFD\x86\xDD\xF3\xB5b\x93>`a\x96>*h\xAC\xA6\xED)dہ[L\xEE\xA0w
+{sf1\xDD\xE8^\x89|\xBA\xA7%\xD5#\xE2q\x864d\xA9ą\xDA\xCB,9\xDD4fI\xF8P \xE2\xD2\xF2\xE2<ʺ\xB2\xB19\x89E\xBEY.\xF2#\x8E\x8D\x8B\xA6\xB6\x9C奜\xB1e\xE5*\xF5\x9F\xE9`\xB4\xECD\xD6˙\x9CŁlh% \xFCE\xAC\x9C\xF9\xD2д\x98-S\x87Z\xB8\xA0\xB9 }*g,\Z\xD4X9\xF3頜\xA5B\xEDVf\xD5_\xD7B*A5\x8E\xC3w\xC5Vc|:\xF2\x9C\x93\xFC\x94s\x86\x9Ev\xAEl\xC6\xE6\xD0[H%\xD2\xC1\x87\xF9\xA9\xD3_\xFE9AWk
+endstream
+endobj
+5 0 obj
+1820
+endobj
+2 0 obj
+<< /Type /Page /Parent 3 0 R /Resources 6 0 R /Contents 4 0 R /MediaBox [0 0 612 792]
+/ArtBox [67.3203 83.5752 549.062 711] >>
+endobj
+6 0 obj
+<< /ProcSet [ /PDF /Text ] /ExtGState << /Gs1 12 0 R >> /Font << /F4.0 10 0 R
+/F3.0 9 0 R /F5.0 11 0 R /F1.0 7 0 R /F2.0 8 0 R >> >>
+endobj
+12 0 obj
+<< /Type /ExtGState /OPM 1 >>
+endobj
+3 0 obj
+<< /Type /Pages /MediaBox [0 0 612 792] /Count 1 /Kids [ 2 0 R ] >>
+endobj
+13 0 obj
+<< /Type /Catalog /Pages 3 0 R >>
+endobj
+14 0 obj
+<< /Length 15 0 R /Subtype /Type1C /Filter /FlateDecode >>
+stream
+x=\x8E]HSq\xC6\xFFgs\xE7lN\xE7\xC7\xF1\xECb[ӰaT\xDA\xA5EdbN\x99R\xC8.\xEC*I\x97}\xCC\xE8\xC2\xC9if.\xE9?\xBA0\x8A\xA8\xCD\xD3DT̈\xBE\x8CZd\xB2X)\xA9\xE9E\xF5}-:\xF3\xA2\xF7\xB9z\x9E\x87\xF7\xE1ǐ(aF(ݷ+\xAF\xC4n-<UU^Q\xEC8Q\x95\xB1f\xF5\xEAHa\x91\xCDQb,rxh\xFE\xC3\xDC_\x8D\x85\xC5YHY\x82ߢ\xFA\x96\xE9\xF5\xB9\xB5\xCEJ\x87\xED\xE8\xE1#N\xA2C\xB2\xC8N\x92G\x8A\x88\x9D\x93R\xA2S\xD6I\xB1\x91V\xF2\x83IgZ\x99I\x95Uur\xA9\xD8/\xCF\xF63M\xFD\xF2\xF2~u\x93Qv\xCF\xD9\xDC,4\xE23s\xE0\xAA\xA6X\\x8A\x83D\xCCB3\xB7\xB0\xDC(7s\x90\x83W5\xFF\xF3Eg0d\xB9\xA4\xB9$\x89 \xF6\xC0\x9B\xF5ӏ\x828\x9AB\xE1\xCE\xE3\xFC(4\xBD}\xFC9\xF5|\xB7H;jĂad\x91ߘ\xB9\x8Ab\xCC\xE1ӆ\x9D%Y\xA8\xDD\xA9\xA1\xC0\xD5
+\xB5>\xC8\xF51\x83\xC0\x80z<f\x82.\x96 \xBE\xA9\xF3\x81F\xB4۬\xA8M\x83T*\xA7\xB2\xA2\xE7F\x8B b\xF3~\xA3\x93\x90\xCB\xC0l\xDA\xDB+\x80\xEE֗\xE7\x93\xE6\xB1{\xD1Дl\xC0\xE1\xB6j\xB9\xECd\xFB`$50FI.\x83%\x8FpI'§\xFE\xD6k
+"\xF5q\xE2ϙ\xFDHj
pu\xDA\xCA_qx\xA2<\xF7\xB9j\xC7%\x96\xE0\xB5ćǍ\xB8\xD9NOǕ6:\xD6M\x98A\xE5]\xBF.\x87\x94\x9C\xEBj\xBC\xD3\xDCAC\xED\xEFG\xC6̿n\xE7d,\xC6A\xF4\xE5\xA3(\xACۚ\x9F[A؉\xBA\x83\xBD+\xCC\xD9k\xF3\xB7U&7\xB0|\x9Fx\xF9V\x87i\xDC\xC1]\xDDrQ73\x90\xB7\xD4pE\xC0tТRi\xA5C\x9A\xE24\x98\xA2H\x8BL\xA3#\xC4\xCFL\x83\xF43\x8F\xBCu%\xEAQo\x9D\x9E\xF0\x9EB\xEFx\_\xD3\xE1\xE7_Dȏ\xB1\xF7/?ly@G\xDA\xFBބ\xCC-\xDE1\x99\xBF.q\xFC\xF1\\xE3\xD9-Ŷ\x9CJ\x85\x8F\xEFZ$\xFA\xAEvu_\xAC\x96\xDD5\x89a \xC2\xDF\x86y)\xE2 \xF6\xDDt\xEFM\xEAa\xF9Z\xB1\xFE\xB4Ӕ)\xC9n\xBA9\xBEu\x9BQ\x85 U\xF7\xF9+\x85!e\xC5\xE5\x95\xDD^\xB0{YN\xAB\xA3\xD1\xEA\x96\Y\x8C\xCE\xFDX\x91.\xC5\xC4\xC2\xDD$\xF9\x8F\xE0\xE7 \xF9\xFB\xF8n\xD0
+endstream
+endobj
+15 0 obj
+748
+endobj
+16 0 obj
+<< /Type /FontDescriptor /Ascent 874 /CapHeight 777 /Descent -210 /Flags 32
+/FontBBox [-146 -241 1119 905] /FontName /VXJGUP+MuseoSans-100 /ItalicAngle
+0 /StemV 43 /AvgWidth 277 /MaxWidth 1265 /StemH 40 /XHeight 583 /FontFile3
+14 0 R >>
+endobj
+17 0 obj
+[ 277 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 530 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 553
+305 0 0 0 0 0 0 918 0 620 0 0 338 0 0 581 ]
+endobj
+10 0 obj
+<< /Type /Font /Subtype /Type1 /BaseFont /VXJGUP+MuseoSans-100 /FontDescriptor
+16 0 R /Widths 17 0 R /FirstChar 32 /LastChar 117 /Encoding /MacRomanEncoding
+>>
+endobj
+18 0 obj
+<< /Length 19 0 R /Subtype /Type1C /Filter /FlateDecode >>
+stream
+x=QmlSU>w\xED\xBDw\xC3\xEE\xEBn
+]s7G\x87\xB8\xB9\xB2\xAD[C&H @\x84L\xD1\xFC\xD8V\xD3E\x86\xD3-&˚\xF91\xA7'#\xACLH$\xB2dː\xA0A\xD7F\xC4\xF0K\x98E*d\xDE%e
+\x90\xCE.\x86\xE7voI<\x9D\xD1\xF3$'y\xCF{\x9E\xE7=\xCFs$f/`\x92$\xE9-۷=\xB7\xAB\xA5f\xCF[\xDD\xEF\xBD\xDE]\xDBTW\x97ox\xAC2;/\xA6b\xEA\\xFAyi\x95\xECa\xBBWzXh\xF5%\x8F\xEDbI\xBE\xAF\xEE=\xFCơP\x98\x89\xB5\x92\xADb^V\xC5ֱ\xF5\xAC\x8E\xD53?kd\x99C賧\xD8\xD6Ŧ\x98%y\xA4\xF7\xA4?
+\\xDD\xDFٚh-OXwұ\x84\xE5M؎\xB9\xAC\xA1lKnH\xC1Q\xBA\xA6S3\x8E\xCBH)TAWt\xE4\x8B\T\xCDy]VTE3\x97\xFF?_\xAE4\xBE(\xCDdl3\xAE\xCCb\x95\xA2\xD1p(;&M"e\x9B馂hvLnR\xB4\x9F"\xB7\xAC\xAF\x93\xD2T\xC66\x85\xACN\xAF\xE0
+\xE05l\xBF;7\x82\xD32l\xA05T_\x89RԠz4@\xBB\xD9̍\xF8/2oLQ3\x85\xC8Gu2\xB49nZ\xE7M\xE9N\xDA*\xCB\xD8\xEE\xB8Я \x8CJ\xB8\xF0&\xBA\xA9:\x85˩_I\xDFg\xBAu\xA5*\xFE\xF6\xD1Vzrm-\xF9˵ǹ\x89^G\xF2|A\xB6\x9E0\xE9z1b\xD2\x8E\xE03\xE7S\xB4{\x91[O\xF7\xE03\xE7\x92%\xF1\x8C՞t\xC6\xE3\xB8'tQO\xD5x\xD7Mn+\xCE>\xFEQ_\x9F\xBBm\xA0PT\xD5\xAFR\xF9f?i\xB4\x9E쐱5(\xC6cp\xFC\xBE\x83 a\xC4\xFF'm\xA6\x97\x85\x91Fj74l\xFA/\xEB\x93|.K:u\xC0/rih@ h\xA31\xB4]\xC0O\xF5\xD4fd\\xF0\xA1\x85\xF0
+R\xA1\x90\xF2\x8B\xDDA^\x81"\x91\x9A\xDF\xD0^:Ӄ\x93\xE2\xF1y\x8B\xFFK\xB8L\xE3$\xFC
+\xF4Tn\xB8}s\xA4\x97\xD3 %M\xA4\xE3\xBC\xEA\xEC\xB7\x81\xFD\xC1@\xB9\xD4 S\xA4\x91\xA7\x9E\xFE\x97:\x81E\xFCք\xBB"\xEC\x8F\xC9\xFDg\xDF\xE5\xEEa\xF5\xFA牙\xA4;\xF5\xE2\xF4\xB61\xE3\xE3\xAE\xF0\xC8\xD62
+\xD1y#Pԫg\xDF\xF8\xB4|\xB2\xF7t\xE7~\xF7\xA6\x9Eo6\xB4\x8Aȼ\xF5ռtm\x83\xB6/o\xE8|ևjT\xCC&!x\x9Bnw`\x9D\xFB\xFB+\xDF\xFC\x9A\xFCq/7.ߔ\xF9\x8Eiz\x90\xD6<\xDAH\xC2\xEDq\xAAu\xEF\xDC\xABr\xCB\xE1Mq\xC8z\xB2\xC1ޒ\xF1%\xD5\xD9em\xC9u\xE72r\xA7䁎\xC1W\xB9\xFBC\x85p\xE1\x9D/Zm\x9D\x92\xAB\xEC\xBC\x94\xA1*ЬV9vy\xF4\xAA\xF0\xA0\xF0\xD1gc\xAD\xB4\\xEBrkO6(n\x92+\xAFqp\xA8sYcpr\xE0\xA2A\x86\xD0\xD0"1\xEBh-1E-,2V\xD8N<\xAC\xB69\x8AfW\xA4\xF8m$\xEAp\xA4ň\x96f\xD2/9\xFB\xCB,\xE6\xF0
+endstream
+endobj
+19 0 obj
+900
+endobj
+20 0 obj
+<< /Type /FontDescriptor /Ascent 892 /CapHeight 793 /Descent -210 /Flags 32
+/FontBBox [-152 -241 1119 923] /FontName /PECUIP+MuseoSans-500 /ItalicAngle
+0 /StemV 99 /AvgWidth 254 /MaxWidth 1271 /StemH 84 /XHeight 595 /FontFile3
+18 0 R >>
+endobj
+21 0 obj
+[ 254 404 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 722 740 573 0 760 0 0 0 0
+0 0 0 821 607 0 641 546 0 0 0 948 ]
+endobj
+9 0 obj
+<< /Type /Font /Subtype /Type1 /BaseFont /PECUIP+MuseoSans-500 /FontDescriptor
+20 0 R /Widths 21 0 R /FirstChar 46 /LastChar 87 /Encoding /MacRomanEncoding
+>>
+endobj
+22 0 obj
+<< /Length 23 0 R /Subtype /Type1C /Filter /FlateDecode >>
+stream
+x=Q}l\xBFkww\xA3\x96z\xBB\xDB\xEEnf\xAD\xC54l\xF3ckl\x97
+C\xEEd@\x9C qd\xD9Ȗ\xB0\xD0m'\xB7\xEFJ\xD7nH6\xB98!* \xD3eFb\xA2\xA2$#\xD9f0!,\x89Q\xE7\xEF\xDC\xEB^5\xE1\xBD\xDE{\xBF\xBC\xDF{\xEF\xF7X&\xCBİ,\xBB&TU\xBA#T\xB9nk롆&\xFF\xCB\xEB\xD7g\x8Anݕ\xA5\xAE\xAE\xA1\x88;kq\xC5ǹ\x99\xB2\xC7\xDDL՚+n\xF3{\xE775\xECk;\xCC\xF6\xF3SƔ3\x95̛L\x93mP2[\x98>\xD6\xCE\xC6\xD8eS\xC04lZޥ&\xF5_\x93\xEC`R\xF7$̓\xBD\xE7\x9F\xCAt\x8F~\xFAZ\xA2 \xA2R<\xE5\xD1U \x99$=,\xA4=}X@\x80\xA2ܣ\xFA\x99\xED\xC6x\x9A\xE1C
+|l
+\xE1\xC7s\xCAa\xCD\xF2P\xEE?\x84\xFF\xA4(\xF4;\xF9\xAE\xF3\xD8H5jn
+\xD7&\xDFھ\xBDi\xFF6\xC56ަk4\x8F\xAE\xB4\x9B\xB1ׁ}\xFC]\xDC\xE1\xE2_\xF6\x9EU\x9D}\xBC\xDA{0\xBEG\xBEKw8\x80[\xFF\x9C;5si\xF0Q\xBF\xF3`\xB8\xBE[)N[\xB8\xEEz\xB5Qu\xBEǫ'\xCEuM\xC9\xC4\xE8\xA5\xE5\xF3ĦK\xB9\xAE\xFA\xFFC\xEA\xB9\xEE)\xB9X\xB7pSݍ\x89:\xE5\x90O\xE3Ǣ\xC7\xDB۽N\xE4\xD3Zxх\xA7.\xC3k\xD7\xC2N\xC5#b\x928C~!\xF2\x96/\xDFTec)\xF5\xF8\xBBN\xF1ȡZfd<o>M(z\x93\xF0U\xEB\xC4\x996\x90\xF7"\x9F\x88
++\x84\x8Eވ*{5\x9Eϧ\xDCg\x9F\xA4"Y\x9C\xC1$\x89\xD2\xFB\x93K\xD3S\xB3\xDF\xF2\xFA\xD6\xEBj\xDBP'<\xF7\xFF\xFA\xBB\xA6\xF7S\xCA\xC4\x99\xE9\x94\xFB=\x81
+\xE4\xFEt[\x95ˑͩ\xD5\xC1\xAAڏ\xAFw\xC8b
+\x8B\xBC:\xF0\xD9)'\xF2\x96\xE99Y|@\xAFx\xC9B\xEBl\x9E\x97\xC4\xD4Ř6\x99t\x9D\xD7\xBC\xA3\xD8n\xF4\x80\x87\xCD\xDCց\x90Y\xC3\xFB@\xCAC\xA1\xE1\xD2\xDF(@!I`\xA9\x88
+H"\x96
+e\x84\x8B\xB33ss\xB3u%\x81\xEA\xDD\xD5\xD3\xB2-\xCFx9PB\xC6\xE5\xF6%C\xA3KQˋ?L\xF68tZ^\xD0n\xC4/\xB9\xC6=\xAA\x82\x80\xA0F\xFA"\x81\xCD\xDB\xCAZ
+\xC4j\xDF\xC91\xE7G\xC2t\xF3\xE9\xDD2\xF9\xE9d\xDBԉ\xB5hG\xB91_\xB2\x9FE\xC9\xCFx\x8D\x8A\xE1\xE7\xC7oK\xEA\x8F~<#\x8B_\xC0zo %\x8E]u\x8EMD\xCF\xC8\xE2%m"V\xC4\xF9\xF8\xBER\x94}\xA6\x88X\xCF.2\xCB\xE2\xBD\x8AXx\xAF\xF3p\xF8XKq\xE9-U\xB6u\x8E\xE8##\xA8\xE1\xE9\xED\x93B\xF6*\xD9b\x8E=-\xD4[W\xC1gA\xF018FG\xADV\xD8?\x8DYW\xAF\xC4s\xF4k\xD2\x91a\xFE\xFAب\xBE
+endstream
+endobj
+23 0 obj
+872
+endobj
+24 0 obj
+<< /Type /FontDescriptor /Ascent 918 /CapHeight 816 /Descent -237 /Flags 32
+/FontBBox [-84 -268 1272 949] /FontName /BTCXBP+Museo-900 /ItalicAngle 0 /StemV
+173 /AvgWidth 1028 /MaxWidth 1356 /StemH 150 /XHeight 612 /FontFile3 22 0 R
+>>
+endobj
+25 0 obj
+[ 625 0 0 0 0 0 0 1028 0 0 0 0 0 0 0 0 0 0 0 0 649 564 0 0 0 0 0 0 0 0 0 632
+0 0 451 491 ]
+endobj
+11 0 obj
+<< /Type /Font /Subtype /Type1 /BaseFont /BTCXBP+Museo-900 /FontDescriptor
+24 0 R /Widths 25 0 R /FirstChar 80 /LastChar 115 /Encoding /MacRomanEncoding
+>>
+endobj
+26 0 obj
+<< /Length 27 0 R /Subtype /Type1C /Filter /FlateDecode >>
+stream
+xuV}T\xE5\x9Fa\x98\xF9p\xB4g\xB5]\x9A\xD5\xD0XP\xF3JE\xF2Q\xF9P K\xBD\xE6W\xB7\xFC
+\xFC\xAAM!\xA6Eī\x98Z \x98ײ\x82̌\xA3Kr\x80\x95\xDDp[v/\xA2\x88\xA5i\x99u(=\xF7|\xD6{\xEE;k\xB7۹\xE7\xDC\xDD?\xF6\xCC\xFB\xEC\xFB>\xCF\xEF\xF7\xFC~\xEF34@\xD14-\xC5'%\xA6f\xA4\x8ELݰ~\xF9\xDA\xCC%k֏\x8E;V\x84\xA9\xFA@\xA5?\xE3\x8A\xFB\xED\xF7y6\x8C\x9A> \x8C\xDA\xFE\xC8\xE7a\xC1\x8A\x8E\xF2h\x8A\xA7\xFAS\xF585\x9C2SOR\xE3\xA8j"O͠\xA8\x99\xD4,*\x91J\xA2fS\xC9T
+\x95J\xA5Q\xE9\xD4\j\x95IeQ\xCFR\xF3\xA9\xE7\xA9lj)\x80\x9ACBn\xEA{\xAA\x8F\x9EA\xEF\xA11`I\xC0\xE1\x80\x99g\x99\xFA@9pi\xA0\x9D5\xB2\xAC\x87\xCCM\xE0\xD6p\xE5<ǧ\xF2\x87x\xEC7\xB5߮~炘\xA0
+A\x8DK\x95:\xF5N]Z\xA7\xAFcJ\xF5ꮾ\xB9\xBE]\x94\xA0]\xC2)\xB0\x97\x858\x8A\xF5h\xBE2\xDE7\\xAF\x96\xF10\xF7\xB2\xAC\xFB\x9F\xFCD\x80\x81\x96\xF0\xA53\x9E\x82HǶ|]\xB3\xF7\xC568\xD7*v4\xC3| \x83~\xC3`حk'\xFFv\xDB9\x8A\xBF\xF8e/\xB6\x99\xD1\xCC\xE3\xE0\xFC\xCBg\xFE\xE1\xAC\xED:\xFAq\xA1b]\xEF\xDBY\xB1M\xC9\xD9\xF7W4q&R\xF8\xC8ϫ\xB9\x88;&\xE5\xE6\xC4\xC5\xBC\xBB\xA5\xEB\xCDvd0?\xC1\xA119\xCB\x9Ez\xE1\xB2,\xE0\xF9(H\xA4\xABaS%ٹHd\xA7q\xC2<\xD8\xE3\xA4\xEFB
+s\xF6HP\xE3\xC4NpɃך\xE1\x97v%_w@\xFDN\xECT\x8F\xE9\xDB9\xDCߗ\xC9N'?2\xD9v\xEE2\xBC\xC6B5'\xFE\x80C\xD5(I98\xAF\xFCe\xF9\x96|\xF7#a\xA3\xFC\xE3\x83v\xC5 \xC0,K\x8B\xFAS\xDD\xD0\xC64\x80*\xE10\xE3X\xD3Z\x91\x97\xDAX\xE5\xA9\xD1\xF88N\xC6`x\xE2 \x82aL\x82!\xDD\xCF(r\xCDW\xAC\xF2\xF
4M\x8C\xC3\x85c\xF0/\xB2 \xCB,-\xAB\xF2\xE0\x98\xDC-\xBA\x866u\x97K\xB45\xC0= \x97\xF9d\x81\xF9\xCAmE\xB6r\xE2V\xA5x\xEBV\xC3\xFC\xB8\x81i\xA9\x8A!\xBChS&\xC7\xC70CH\x86\xE90xL\xFA6\xA8{&\xC9t\x8EUb\xBAq."\x99bp1\xC9\xD4D(ܮ\xEȨ/\xF7%3\x97\xF5\xAD\xDCI\xF5M\xB6\xE4\xB3b\xA7b\xB0rJE\xF2\xA1\x97d\x98\x84\xD8\xA9\xF7{\xA8\xFA\xC8\xC3Hqz\xC9r\xF9\xA4\xEFM\xB6\x95\xCB$|%p\x98\xE2\xC7nY\xB9q\x81b(\xE2\x94Mu[\xAAeLQDZ38\xE1,Ir\xDC \x8DN\xFA\xD7Vh\xF72\xBF\xEA[\xE18\xC4s\xA0\xBB\xD9C\xAAӏ\xEDF\x9D wr\xAD>Z\x82F\x88\xE5pd\x8D\x99\x961\xDA$X,.\xF5\x96\x8Bn\xF1\xC2\xC7^\xA6t\x8D\x83\xE10\xE4ʵ{2l\xC1\xBBa\xB2\xC1i?\xFF\xFD-g\xBA"bg\x95\xD9nP?>\xFA \xD7\xC0\xDDZ\x9Ci\x98\x9A\x923\x99\xF8NE\xD4\xFEJ\xB7z\xF07\xFAd\xDF-F]\xAAޑ\x94\xFD\xE9\xE5\x8Bd0\xF8
+ث\xA438\xE6;\xCDn_Y\xB8L\xC3Q\xBC\xE3d\xF56\x9A\xD5\xD3\xECl\xCD$\xB2rێe\xC5F\x82\xB0\xF0\xE4v\x820\x8CDfp\x90L\xB4BN0\xA8ly\xED\xFEf\xA2\x88\xD5{n\xECm\x84p\x87\xEE\x94\xDEs\x8B\xB6S\xF0\x98\xF1]v\xE8\xBE\xD0T\xE1\xEF_\xD1\xE6\C\xD6\xB8ȃ.\xE9\xEC\x8F\xEC\xECE>\xF1\xAB\x9C?{\xB5\xAD\xFE\xE5(\x{1375927}1\xF8\xEAN\x9Cb\xF2얀\x81\xF1%]\xF2\xF1
+\̼\x88\x91\xD3V\x9C=#\x96\xE6uy\xEA'\xCC\xCD\xD7u\xBB\xA1\xDD#n\xEDֻ8\xD1V\xCBW\xD6\xF2(\xB5\x91
+Cn߅h;(4\xA2\xB4$\x8Ax\x89S\xAC\xEFV`W"\xEF\xF2-\x90 \xBC\xAB\xB9\xE7\xC7q8 \xC5O\x8F\xD4s\xBD\xBD\xB2Plq\xA8f'}\xC6Ü\x81\xDD\x8E~(D\xC2 w\x97"\xAF\xAAg\x95\xB9 #\x90\x89\xE9!\x82\xFD\xB6n6\xA6)\xF2\xA7D\xD1im\xE43\xF6Cǐk\xF3\xD4l\x87V\xA2\xCD\xED\x84\x94\x92\xC3z\x90#9\xD5\xFB:^\xDF`\x98\xEF\xEA\xCBL\xC4">Ϻ\xD9_\xE2\x92\xDB(Ȣ
+\x87\x8C\xC7h\x93Gb\xFB\xC5@\x9D\x8B\x81\xE1q\xE9F'w\xC1@Y(\xB18`a#<\xD9D*\x85\xB6ևŎ\x96$\x88\xB6\xDDC\xAA%\xEAOK\xEDi\x97\xAC\xEA \xF8\xCAr<\x92\xF0O4a\x9Aq\x92\xDC^/\xF5j\xAF\xEF1^l\xC9~|\xB7I\xC0\xCDG\xF2Ԕ&\x88r\xD0\xF7\xDC\xCC=\xBD[M\xA9 \xA5*;\xDE9\xF9ξ"Ev\xF0\x8Aź1\x83\xF20V^\x9F\x92\xF15/\x9C\xC0\xE5P\x99\xB6N
+\xB0\xCB-^!\xF6\xE4\xA4W3\xD9\\x9B}\xAB\xDD \xD8 1&\xF1\x8Ej\x99\x9Dſ\xF9\xF6[V\xF1\x8A\xF2r>\x8AƉ\xC3q$\x8E\xBC1\x8C\x97\xBE:\xD1\xF8\xA1\xD6â\xCD
+9<>\x939=\xF5SE\x86\x890K\x8AH\xBED:\xDA\xE4\xFD\xF9\x86gF\xA0yfv\x9CI8M\x8A~\xAE\x85\
x90M=Ի\x99n\xBD\xDE⪬\x95{ޗ{*;\xCEk\xBCS>3΄
+D-<\\xECŁ\xC8%MY\xB8\xF1EM\xE4\xF4\x92c\x94|0^#\xC70\x97\xD5I\xDEk \x9C\xF5A\xA6\xE4V\x95DNXH\]z\xB2\xF2a\x9D\x96ȟ\xA5\xF4
+qX\xCA^\xE10>e\xAD<̀\xB5\xEC$\x8E\xA0\xC9b'\xABad6\xEEt\xF6=\x9AOw\xBA\x99N\x910\xA0\xE3\x8D/\x94[\xFD<ou\xF5>\x97\xAC\xBAH~5\x80\xE4_\xE0\xB4\xF8U\xFD\x91>$$jH\xB6s\x95\xD6\xCA\xD2#r\xE7\xA7\xB7\xDBx{\xFF\xF4\xA9&l$\xCB\xFC1kUY\x85\xDC\xF1\xDE\xD7\xEEN\xE3\xADÉ\x93\xFC\xCB\xC0E^\x9E\x8E\x9F\x97\xB8\x8Eu\xE1\xE9'\x8D\xCFL\x9E\x9B\xB8\xDED\xB7T.&\xF1\xBF\x93\xF60[\xBD[\xEC\xFC/iG\xE4\xAB\xFF\x87\xB4\x909\xB19\x9B\xB4\xBE\xD5\xFEqL\xDBC\xBB\xD4z\xD40Se\x8E\x82\xE4 \x82|C\x80\x83QI\xAE\xE6@ҫ\xC1@\x8C\x94\x89\xA2\xB9\xEB׀\xEA\xFA\xD3\xC8aPt4\x99uT\xF4uҬ\xAD2\x86\xFA\xBA\xB6_\x90\xDCP\xC8}P\xF4\xAE\xDF\xD7_\x8E\x84\xFE\xA0\xFF\xB3\xAF}1\xC2/\xA4N\xC5z\xB8\xC2`K\xE6]\xB8Gk\xFF\xC7ڲ\xD8\x9E\xD9\xDBK\xF4=_ӷ{G~\x85Ʋ\xE8\xD0@\xBFĝ\xD8\xFDɾrGE}\xA3\xD7x\xA0\xBC\x88\xCC\xE2\xDF\xF0\xA2Cy\xA3\xE4\xF5\xB8\xCCyS\xD7k\x88\x8F\xFB\xDF \xC4
+%\x88#\xB4\xDD9\xE6\x94CRZ\xE2A\xE8\xF5\x9E\xEF\x96!\xABVch\xB4U|u\xF5t\x8E"D,\
x98\xDD0lll\xF68'B\xD510\xCCaݳ\xA33\xE4z\xC6Wv:T\xB1\x89\xEEu3\xBD0G\xC28\xDAhw\xFFCil/z}\xF9\xB4\x83,C \xE8\x9AP#\x92pDR\x86\x8B>ӆ%\xAA\xEE\xA2κ\xC5ڋ\xDA\xDE\xC1usȕĸ.\xD9\xDE\xD7.ڍJѦ
+\x86i."\|\x8Bk\x91Nx\xF9(\x8B\xA7K\x86\xA25حt\xC0\xCD\xD6|\xDD᾽b
+\xA4\xEB;8\xB1\x95\x98\xF4>\xBB\xF7h\xD9q\xFF,,[\xF3\xB7\\xE0}\x96\xC4j`\x8A\xAAh\xD3B\xF0\x85\xB0\xB9\x85k\xFCS\xAF\xF0Â*YlŁj\x9B\xC4\xE1@_[\xB0\xBEp\xF5\x9Fb5(\xA8!\xDAL|\x9E\}C\xF3\xE92uS\x86I\x92R\xBD\xFA\xDC7\xE7N\xB5| \xC3\xDB\xEA=\xED\xFDc\x84\x8Fa\xB7\xE5\xAE\xF5\xEF.\xF8\xFB\xB6\xA32\x99Cy\x97\x81\xBE\x9D\xAB\xFCU+_Y[\xA9\x901Y\xAE*\xE50\xB7\x9C\xE3\xFB\xC9\xC1\xCC\xFE~qh\x903\xD8\xE2
+u\xBF\xDA_\xFDv\x90zF\xFA\\xA4\xA8\xEEs6
+endstream
+endobj
+27 0 obj
+2382
+endobj
+28 0 obj
+<< /Type /FontDescriptor /Ascent 883 /CapHeight 785 /Descent -210 /Flags 32
+/FontBBox [-149 -241 1119 914] /FontName /BHGMRM+MuseoSans-300 /ItalicAngle
+0 /StemV 68 /AvgWidth 589 /MaxWidth 1268 /StemH 62 /XHeight 589 /FontFile3
+26 0 R >>
+endobj
+29 0 obj
+[ 269 0 0 0 0 0 674 0 0 0 0 0 244 492 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 616 0 728 0 0 0 758 0 0 0 0 0 854 0 0 598 0 0 538 0 0 0 927 0 0 0 0 0 0
+0 0 0 520 589 549 589 553 320 582 593 232 0 502 247 916 593 622 589 0 356
+443 335 588 0 801 0 499 ]
+endobj
+7 0 obj
+<< /Type /Font /Subtype /Type1 /BaseFont /BHGMRM+MuseoSans-300 /FontDescriptor
+28 0 R /Widths 29 0 R /FirstChar 32 /LastChar 121 /Encoding /MacRomanEncoding
+>>
+endobj
+30 0 obj
+<< /Length 31 0 R /Subtype /Type1C /Filter /FlateDecode >>
+stream
+x]RLu\xFF^\x8F\xBB\xA5t\xD0\xE3:R\xEA]G\xC8H0\xB8\x85d\x8C\xCClF
+\x8C)hq\xAE\x9A8Y\xCD\xCD\x91
+&\x98t\xEC\xE4G\xA8@\xEB\xC0F\xC5\xFE [t\xACs\xC1M\x98\x8E-K\xD8Ɩ\xF0\xD9H
+\xC4\xCDD\xFB\xB9\xF90\xB1ń?|\xBD\xF7\xF2>\xEF\xF3>\xEF=\x8E%\x98\xC7q\xA9\xEE\xC2\xE7\xF7\xEEv?Yz\xB8\xF6\xED\xEA\xDCm[\xB6ēN#-AO\xF6Ї΄\x8F\xFFvN\xB6c\xBD\x93\xBD\x9Av\xF26\xB6jKf\xA9\xCC\xC6d\xE6`\x99\xECV\xCA\xCA\xD8f\x89\xB5d/\xB2v\x80\x9De\xEE5\xEE;\xD3&S\xB5)ī\xFC{\xE9ac9\xCCu\x85\x8D\xAC0\xDFe7\x8E?v\xAF\xD1A\x97\xDA \xBF\x80\x88H.\xFAQA<X\xE9\x96V\xB2\xECF\xB7\x84\x9D\xE4\xD6\xF2\xAB\x91՚\x89&\xEEs\x94\xF1\xF7\xA1(\xC5\xD4$D\xC4%4 \xD6H3\xCCF+\x92\xB8\xA4\xF3\xB8Ҭ\xC0s\xF0\xC2[\x82|\xF2\xC9KޫT \x8FsBN5LpA\xB7\xBC<L\xA9\xE4\xAA&S\x8Ef\xED\xD7\xC1K\xF5b\xFF\x8B\xDD\xD8
+\x9Er\x8D%2\x8BTD\xCF\xDC~\xFA\xA7KB(\xE4?\xA5;\xDAE\xFDDm\xADcE\xA5\\xC9:G5\xC3b\x853f\xBC\x8E\xF4\xAD0ˑ\xD1ߔ\xE2ޚiU\xBEo\x88\xE2\xC4\xE0\xE0\x84Ff\x
AF\xD4\xE8\xF35\xAAT!\xF1u49K\xFDhq }\xE3\xA5\xA8\xF2\x9D͔\xE2\xCD\xD5
+a\x91\xBE\xFBzrꛪ=\xAA\xA1g\xE9a?\xF58\xAC\x931\xCD\xC8\xFC\xED1٣\x90q\xFC\xF5\xA0\xA2O|\x80\x9A(\xDEE*I\x86\x85\xB2i\xE3S.\xDA@\xF2qp\xFDpyh$\xA4\xB6\x8B\xD9
+/\xE7\x9F\xB1\xF7͐\xAE\xA1\x87\x95\xAD\xE5WnΜ\xBB83\xFBkA\xDE~\xCF;\xA5\x9A\x9Bc\x8An\x82aN\xBD\xDE\xD6\xFB\xD8%\xDF\xE9\xB5\xDFç\xB4\xF3H\xD0"\x9E\xA7\xA1| \xD8ΘTl\xF0u[5\xAA4fzB\xA4\xAA\x95Y\xE1\xFDV\xDF'
+GE\xC3.e
+E\x82 \x9C=9\xB3\xBA\xBD\x93Ł
+u\x8A\x8A+\xD5\xE8QL\x80\xCD#Ѷ Y`\x92#\xE3\x81;R"\x99D\xF9Q\xEB?v\xE5\x8D\xC1\xFAq\xC9\xD1b\xA3\xCF߯\xE1\x9A4^?\xB4O\xA5db\xE7\xC4~\xCB\x9A\x95\x8E\xE8Q\xC3\xC6݃\xCC\x87L\xA8\xB0D+\xFE\x83=\xD2x\xDD\xFF Ю:\xB8\xA3\xF8,\xDC\xF6\xB6y\xD8Ѕ4yq\x9E\xF6)1\xBFJ\xFC\xB2-\xA8Ƕ\xA6_(~\xC7\xC3?\x91\xAFʷ\x90\x97\x87\xF8\xD7$y\xB7\xEBj\x9B(\xCF躿\xCF!/7\xC4\xFBk#a=\xA5)\xB1raz\xE2ڭ\x8B%9\x9Bܯ\xAA\xF2\xE6\xEEjV\xD7P\x9D\xE1D*I`qZyl\xDE#,\xCFtw\xA1\xCA7n\x87\xA6G.em\xB13\xA5Jzs\xFB\xB1/\x95=w(\xCE7\xA6\xB7N;\xCEH\xDF:]\xAEҺ5>ks\x9F\xD1\xDDw\x9FH\x95=ҺD\xD5\xCC\xF7fK\xFB-\x89\xE0͐\x93~\xFF\xAC\xC3b\x81\xD9\xFFi\xA7%\xC14c@ ˌ\xFD\xF5\xDE\xE4\x9C
+endstream
+endobj
+31 0 obj
+952
+endobj
+32 0 obj
+<< /Type /FontDescriptor /Ascent 902 /CapHeight 802 /Descent -237 /Flags 32
+/FontBBox [-84 -268 1189 933] /FontName /PECUIP+Museo-700 /ItalicAngle 0 /StemV
+127 /AvgWidth 265 /MaxWidth 1273 /StemH 111 /XHeight 601 /FontFile3 30 0 R
+>>
+endobj
+33 0 obj
+[ 265 0 0 0 0 0 0 0 0 0 0 0 265 0 0 0 612 533 581 0 0 0 0 0 0 575 0 0 0 0
+0 0 0 674 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 299 0 0 291 0 0 0 621 0 412 ]
+endobj
+8 0 obj
+<< /Type /Font /Subtype /Type1 /BaseFont /PECUIP+Museo-700 /FontDescriptor
+32 0 R /Widths 33 0 R /FirstChar 32 /LastChar 114 /Encoding /MacRomanEncoding
+>>
+endobj
+1 0 obj
+<< /Title (GSoC-1) /Creator (Adobe Illustrator CS4) /Producer (Mac OS X 10.5.8 Quartz PDFContext)
+/CreationDate (D:20100329152719Z00'00') /ModDate (D:20100329152719Z00'00')
+>>
+endobj
+xref
+0 34
+0000000000 65535 f
+0000011866 00000 n
+0000001936 00000 n
+0000002272 00000 n
+0000000022 00000 n
+0000001916 00000 n
+0000002078 00000 n
+0000009997 00000 n
+0000011695 00000 n
+0000005295 00000 n
+0000003727 00000 n
+0000006812 00000 n
+0000002226 00000 n
+0000002355 00000 n
+0000002405 00000 n
+0000003246 00000 n
+0000003266 00000 n
+0000003519 00000 n
+0000003903 00000 n
+0000004896 00000 n
+0000004916 00000 n
+0000005169 00000 n
+0000005469 00000 n
+0000006434 00000 n
+0000006454 00000 n
+0000006705 00000 n
+0000006984 00000 n
+0000009459 00000 n
+0000009480 00000 n
+0000009733 00000 n
+0000010172 00000 n
+0000011217 00000 n
+0000011237 00000 n
+0000011487 00000 n
+trailer
+<< /Size 34 /Root 13 0 R /Info 1 0 R /ID [ <47551a676c20f7bb7fcd562e4830856f>
+<47551a676c20f7bb7fcd562e4830856f> ] >>
+startxref
+12057
+%%EOF
</ins></span></pre></div>
<a id="trunktestsphpunittestsimagefunctionsphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/tests/phpunit/tests/image/functions.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/tests/phpunit/tests/image/functions.php 2016-10-26 06:51:11 UTC (rev 38948)
+++ trunk/tests/phpunit/tests/image/functions.php 2016-10-26 07:27:51 UTC (rev 38949)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -351,4 +351,57 @@
</span><span class="cx" style="display: block; padding: 0 10px"> remove_filter( 'wp_image_editors', array( $this, 'mock_image_editor' ) );
</span><span class="cx" style="display: block; padding: 0 10px"> WP_Image_Editor_Mock::$save_return = array();
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+ /**
+ * @ticket 31050
+ */
+ public function test_wp_generate_attachment_metadata_pdf() {
+ if ( ! wp_image_editor_supports( array( 'mime_type' => 'application/pdf' ) ) ) {
+ $this->markTestSkipped( 'Rendering PDFs is not supported on this system.' );
+ }
+
+ $orig_file = DIR_TESTDATA . '/images/wordpress-gsoc-flyer.pdf';
+ $test_file = '/tmp/wordpress-gsoc-flyer.pdf';
+ copy( $orig_file, $test_file );
+
+ $attachment_id = $this->factory->attachment->create_object( $test_file, 0, array(
+ 'post_mime_type' => 'application/pdf',
+ ) );
+
+ $this->assertNotEmpty( $attachment_id );
+
+ $expected = array(
+ 'sizes' => array(
+ 'thumbnail' => array(
+ 'file' => "wordpress-gsoc-flyer-116x150.jpg",
+ 'width' => 116,
+ 'height' => 150,
+ 'mime-type' => "image/jpeg",
+ ),
+ 'medium' => array(
+ 'file' => "wordpress-gsoc-flyer-232x300.jpg",
+ 'width' => 232,
+ 'height' => 300,
+ 'mime-type' => "image/jpeg",
+ ),
+ 'large' => array(
+ 'file' => "wordpress-gsoc-flyer-791x1024.jpg",
+ 'width' => 791,
+ 'height' => 1024,
+ 'mime-type' => "image/jpeg",
+ ),
+ 'full' => array(
+ 'file' => "wordpress-gsoc-flyer.jpg",
+ 'width' => 1088,
+ 'height' => 1408,
+ 'mime-type' => "image/jpeg",
+ ),
+ ),
+ );
+
+ $metadata = wp_generate_attachment_metadata( $attachment_id, $test_file );
+ $this->assertSame( $expected, $metadata );
+
+ unlink( $test_file );
+ }
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span></span></pre>
</div>
</div>
</body>
</html>