Make WordPress Core


Ignore:
Timestamp:
07/21/2022 06:01:01 PM (2 years ago)
Author:
adamsilverstein
Message:

Media: enable generating multiple mime types for image uploads; specifically WebP versions for JPEG images by default.

This changeset adds the capability for core media uploads to generate sub sized images in more than a single mime type. The output formats for each mime type can be controlled through a filter. WebP is used as an additional output format for JPEG images by default to improve front end performance.

When generating additional mime types, only images which are smaller than the respective original are retained. By default, additional mime type images are only generated for the built-in core image sizes and any custom sizes that have opted in.

Image meta is updated with a new 'sources' array containing file details for each mime type. Each image size in the 'sizes' array also gets a new 'sources' array that contains the image file details for each mime type.

This change also increases image upload retries to accommodate additional image sizes. It also adds a $mime_type parameter to the wp_get_missing_image_subsizes function and filter.

This change adds three new filters to enable full control of secondary mime image generation and output:

  • A new filter wp_image_sizes_with_additional_mime_type_support that filters the sizes that support secondary mime type output. Developers can use this to control the output of additional mime type sub-sized images on a per size basis.
  • A new filter wp_upload_image_mime_transforms that filters the output mime types for a given input mime type. Developers can use this to control generation of additional mime types for a given input mime type or even override the original mime type.
  • A new filter wp_content_image_mimes which controls image mime type output selection and order for frontend content. Developers can use this to control the mime type output preference order for content images. Content images inserted from the media library will use the available image versions based on the order from this filter.

Thanks to the many contributors who helped develop, test and give feedback on this feature.

A haiku to summarize:

Upload a JPEG
Images of all sizes
Output as WebPs

Props flixos90, MatthiasReinholz, studiolxv, markhowellsmead, eatingrules, pbiron, mukesh27, joegrainger, mehulkaklotar, tweetythierry, akshitsethi, peterwilsoncc, eugenemanuilov, mitogh, shetheliving, clarkeemily, codekraft, mikeschroder, clorith, kasparsd, spacedmonkey, trevorpfromsandee, jb510, scofennellgmailcom, seedsca, cagsmith, karinclimber, dainemawer, baxbridge, grapplerulrich, sobatkras, chynnabenton, tonylocalword, barneydavey, kwillmorth, garymatthews919, olliejones, imarkinteractive, jeffpaul, feastdesignco, webbeetle, masteradhoc.

See #55443.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tests/phpunit/tests/image/functions.php

    r53542 r53751  
    640640        }
    641641
     642        // Use legacy JPEG output.
     643        add_filter( 'wp_upload_image_mime_transforms', '__return_empty_array' );
     644
    642645        $orig_file = DIR_TESTDATA . '/images/wordpress-gsoc-flyer.pdf';
    643646        $test_file = get_temp_dir() . 'wordpress-gsoc-flyer.pdf';
     
    678681                    'mime-type' => 'image/jpeg',
    679682                    'filesize'  => wp_filesize( $temp_dir . 'wordpress-gsoc-flyer-pdf-232x300.jpg' ),
     683                    'sources'   => array(
     684                        'image/jpeg' => array(
     685                            'file'     => 'wordpress-gsoc-flyer-pdf-232x300.jpg',
     686                            'filesize' => wp_filesize( $temp_dir . 'wordpress-gsoc-flyer-pdf-232x300.jpg' ),
     687                        ),
     688                    ),
    680689                ),
    681690                'large'     => array(
     
    685694                    'mime-type' => 'image/jpeg',
    686695                    'filesize'  => wp_filesize( $temp_dir . 'wordpress-gsoc-flyer-pdf-791x1024.jpg' ),
     696                    'sources'   => array(
     697                        'image/jpeg' => array(
     698                            'file'     => 'wordpress-gsoc-flyer-pdf-791x1024.jpg',
     699                            'filesize' => wp_filesize( $temp_dir . 'wordpress-gsoc-flyer-pdf-791x1024.jpg' ),
     700                        ),
     701                    ),
    687702                ),
    688703                'thumbnail' => array(
     
    692707                    'mime-type' => 'image/jpeg',
    693708                    'filesize'  => wp_filesize( $temp_dir . 'wordpress-gsoc-flyer-pdf-116x150.jpg' ),
     709                    'sources'   => array(
     710                        'image/jpeg' => array(
     711                            'file'     => 'wordpress-gsoc-flyer-pdf-116x150.jpg',
     712                            'filesize' => wp_filesize( $temp_dir . 'wordpress-gsoc-flyer-pdf-116x150.jpg' ),
     713                        ),
     714                    ),
    694715                ),
    695716            ),
     
    703724            unlink( $temp_dir . $size['file'] );
    704725        }
     726        remove_filter( 'wp_upload_image_mime_transforms', '__return_empty_array' );
    705727    }
    706728
     
    716738
    717739        update_option( 'medium_crop', 1 );
     740
     741        // Use legacy JPEG output.
     742        add_filter( 'wp_upload_image_mime_transforms', '__return_empty_array' );
    718743
    719744        $orig_file = DIR_TESTDATA . '/images/wordpress-gsoc-flyer.pdf';
     
    755780                    'mime-type' => 'image/jpeg',
    756781                    'filesize'  => wp_filesize( $temp_dir . 'wordpress-gsoc-flyer-pdf-300x300.jpg' ),
     782                    'sources'   => array(
     783                        'image/jpeg' => array(
     784                            'file'     => 'wordpress-gsoc-flyer-pdf-300x300.jpg',
     785                            'filesize' => wp_filesize( $temp_dir . 'wordpress-gsoc-flyer-pdf-300x300.jpg' ),
     786                        ),
     787                    ),
    757788                ),
    758789                'large'     => array(
     
    762793                    'mime-type' => 'image/jpeg',
    763794                    'filesize'  => wp_filesize( $temp_dir . 'wordpress-gsoc-flyer-pdf-791x1024.jpg' ),
     795                    'sources'   => array(
     796                        'image/jpeg' => array(
     797                            'file'     => 'wordpress-gsoc-flyer-pdf-791x1024.jpg',
     798                            'filesize' => wp_filesize( $temp_dir . 'wordpress-gsoc-flyer-pdf-791x1024.jpg' ),
     799                        ),
     800                    ),
     801
    764802                ),
    765803                'thumbnail' => array(
     
    769807                    'mime-type' => 'image/jpeg',
    770808                    'filesize'  => wp_filesize( $temp_dir . 'wordpress-gsoc-flyer-pdf-116x150.jpg' ),
     809                    'sources'   => array(
     810                        'image/jpeg' => array(
     811                            'file'     => 'wordpress-gsoc-flyer-pdf-116x150.jpg',
     812                            'filesize' => wp_filesize( $temp_dir . 'wordpress-gsoc-flyer-pdf-116x150.jpg' ),
     813                        ),
     814                    ),
    771815                ),
    772816            ),
     
    780824            unlink( $temp_dir . $size['file'] );
    781825        }
     826        remove_filter( 'wp_upload_image_mime_transforms', '__return_empty_array' );
     827
    782828    }
    783829
     
    789835            $this->markTestSkipped( 'Rendering PDFs is not supported on this system.' );
    790836        }
     837
     838        // Use legacy JPEG output.
     839        add_filter( 'wp_upload_image_mime_transforms', '__return_empty_array' );
    791840
    792841        $orig_file = DIR_TESTDATA . '/images/wordpress-gsoc-flyer.pdf';
     
    822871            'mime-type' => 'image/jpeg',
    823872            'filesize'  => wp_filesize( $temp_dir . 'wordpress-gsoc-flyer-pdf-77x100.jpg' ),
     873            'sources'   => array(
     874                'image/jpeg' => array(
     875                    'file'     => 'wordpress-gsoc-flyer-pdf-77x100.jpg',
     876                    'filesize' => wp_filesize( $temp_dir . 'wordpress-gsoc-flyer-pdf-77x100.jpg' ),
     877                ),
     878            ),
    824879        );
    825880
     
    837892            unlink( $temp_dir . $size['file'] );
    838893        }
     894        remove_filter( 'wp_upload_image_mime_transforms', '__return_empty_array' );
    839895    }
    840896
     
    10271083        );
    10281084    }
     1085
     1086    /**
     1087     * @ticket 55443
     1088     */
     1089    public function test_wp_upload_image_mime_transforms_generates_webp_and_jpeg_for_both_by_default() {
     1090        $result = wp_upload_image_mime_transforms( 42 );
     1091        $this->assertArrayHasKey( 'image/jpeg', $result );
     1092        $this->assertArrayHasKey( 'image/webp', $result );
     1093        $this->assertSameSets( array( 'image/jpeg', 'image/webp' ), $result['image/jpeg'] );
     1094        $this->assertSameSets( array( 'image/jpeg', 'image/webp' ), $result['image/webp'] );
     1095    }
     1096
     1097    /**
     1098     * @ticket 55443
     1099     */
     1100    public function test_wp_upload_image_mime_transforms_filter_always_use_webp_instead_of_jpeg() {
     1101        add_filter(
     1102            'wp_upload_image_mime_transforms',
     1103            function( $transforms ) {
     1104                // Ensure JPG only results in WebP files.
     1105                $transforms['image/jpeg'] = array( 'image/webp' );
     1106                // Unset WebP since it does not need any transformation in that case.
     1107                unset( $transforms['image/webp'] );
     1108                return $transforms;
     1109            }
     1110        );
     1111
     1112        $result = wp_upload_image_mime_transforms( 42 );
     1113        $this->assertArrayHasKey( 'image/jpeg', $result );
     1114        $this->assertArrayNotHasKey( 'image/webp', $result );
     1115        $this->assertSameSets( array( 'image/webp' ), $result['image/jpeg'] );
     1116    }
     1117
     1118    /**
     1119     * @ticket 55443
     1120     */
     1121    public function test_wp_upload_image_mime_transforms_filter_receives_parameters() {
     1122        $attachment_id = null;
     1123        add_filter(
     1124            'wp_upload_image_mime_transforms',
     1125            function( $transforms, $param1 ) use ( &$attachment_id ) {
     1126                $attachment_id = $param1;
     1127                return $transforms;
     1128            },
     1129            10,
     1130            2
     1131        );
     1132
     1133        wp_upload_image_mime_transforms( 23 );
     1134        $this->assertSame( 23, $attachment_id );
     1135    }
     1136
     1137    /**
     1138     * @ticket 55443
     1139     */
     1140    public function test_wp_upload_image_mime_transforms_filter_with_empty_array() {
     1141        add_filter( 'wp_upload_image_mime_transforms', '__return_empty_array' );
     1142        $result = wp_upload_image_mime_transforms( 42 );
     1143        $this->assertSame( array(), $result );
     1144    }
     1145
     1146    /**
     1147     * @ticket 55443
     1148     */
     1149    public function test_wp_upload_image_mime_transforms_filter_with_invalid_usage() {
     1150        $default = wp_upload_image_mime_transforms( 42 );
     1151
     1152        add_filter( 'wp_upload_image_mime_transforms', '__return_false' );
     1153        $result = wp_upload_image_mime_transforms( 42 );
     1154        $this->assertSame( $default, $result );
     1155    }
     1156
     1157    /**
     1158     * @ticket 55443
     1159     */
     1160    public function test__wp_get_primary_and_additional_mime_types_default() {
     1161        $jpeg_file = DIR_TESTDATA . '/images/test-image-large.jpg';
     1162
     1163        list( $primary_mime_type, $additional_mime_types ) = _wp_get_primary_and_additional_mime_types( $jpeg_file, 42 );
     1164        $this->assertSame( 'image/jpeg', $primary_mime_type );
     1165
     1166        // WebP may not be supported by the server, in which case it will be stripped from the results.
     1167        if ( wp_image_editor_supports( array( 'mime_type' => 'image/webp' ) ) ) {
     1168            $this->assertSame( array( 'image/webp' ), $additional_mime_types );
     1169        } else {
     1170            $this->assertSame( array(), $additional_mime_types );
     1171        }
     1172    }
     1173
     1174    /**
     1175     * @ticket 55443
     1176     */
     1177    public function test__wp_get_primary_and_additional_mime_types_prefer_original_mime() {
     1178        $jpeg_file = DIR_TESTDATA . '/images/test-image-large.jpg';
     1179
     1180        // Set 'image/jpeg' only as secondary output MIME type.
     1181        // Still, because it is the original, it should be chosen as primary over 'image/webp'.
     1182        add_filter(
     1183            'wp_upload_image_mime_transforms',
     1184            function( $transforms ) {
     1185                $transforms['image/jpeg'] = array( 'image/webp', 'image/jpeg' );
     1186                return $transforms;
     1187            }
     1188        );
     1189
     1190        list( $primary_mime_type, $additional_mime_types ) = _wp_get_primary_and_additional_mime_types( $jpeg_file, 42 );
     1191        $this->assertSame( 'image/jpeg', $primary_mime_type );
     1192
     1193        // WebP may not be supported by the server, in which case it will be stripped from the results.
     1194        if ( wp_image_editor_supports( array( 'mime_type' => 'image/webp' ) ) ) {
     1195            $this->assertSame( array( 'image/webp' ), $additional_mime_types );
     1196        } else {
     1197            $this->assertSame( array(), $additional_mime_types );
     1198        }
     1199    }
     1200
     1201    /**
     1202     * @ticket 55443
     1203     */
     1204    public function test__wp_get_primary_and_additional_mime_types_use_original_mime_when_no_transformation_rules() {
     1205        $jpeg_file = DIR_TESTDATA . '/images/test-image-large.jpg';
     1206
     1207        // Strip all transformation rules.
     1208        add_filter( 'wp_upload_image_mime_transforms', '__return_empty_array' );
     1209
     1210        list( $primary_mime_type, $additional_mime_types ) = _wp_get_primary_and_additional_mime_types( $jpeg_file, 42 );
     1211        $this->assertSame( 'image/jpeg', $primary_mime_type );
     1212        $this->assertSame( array(), $additional_mime_types );
     1213    }
     1214
     1215    /**
     1216     * @ticket 55443
     1217     */
     1218    public function test__wp_get_primary_and_additional_mime_types_different_output_mime() {
     1219        $jpeg_file = DIR_TESTDATA . '/images/test-image-large.jpg';
     1220
     1221        // Set 'image/webp' as the only output MIME type.
     1222        // In that case, JPEG is not generated at all, so WebP becomes the primary MIME type.
     1223        add_filter(
     1224            'wp_upload_image_mime_transforms',
     1225            function( $transforms ) {
     1226                $transforms['image/jpeg'] = array( 'image/webp' );
     1227                return $transforms;
     1228            }
     1229        );
     1230
     1231        list( $primary_mime_type, $additional_mime_types ) = _wp_get_primary_and_additional_mime_types( $jpeg_file, 42 );
     1232
     1233        // WebP may not be supported by the server, in which case it will fall back to the original MIME type.
     1234        if ( wp_image_editor_supports( array( 'mime_type' => 'image/webp' ) ) ) {
     1235            $this->assertSame( 'image/webp', $primary_mime_type );
     1236        } else {
     1237            $this->assertSame( 'image/jpeg', $primary_mime_type );
     1238        }
     1239
     1240        $this->assertSame( array(), $additional_mime_types );
     1241    }
     1242
     1243    /**
     1244     * @ticket 55443
     1245     */
     1246    public function test__wp_get_primary_and_additional_mime_types_different_output_mimes() {
     1247        $jpeg_file = DIR_TESTDATA . '/images/test-image-large.jpg';
     1248
     1249        // Set 'image/webp' and 'image/avif' as output MIME types.
     1250        // In that case, JPEG is not generated at all, with WebP being the primary MIME type and AVIF the secondary.
     1251        add_filter(
     1252            'wp_upload_image_mime_transforms',
     1253            function( $transforms ) {
     1254                $transforms['image/jpeg'] = array( 'image/webp', 'image/avif' );
     1255                return $transforms;
     1256            }
     1257        );
     1258
     1259        list( $primary_mime_type, $additional_mime_types ) = _wp_get_primary_and_additional_mime_types( $jpeg_file, 42 );
     1260
     1261        // WebP may not be supported by the server, in which case it will fall back to the original MIME type.
     1262        if ( wp_image_editor_supports( array( 'mime_type' => 'image/webp' ) ) ) {
     1263            $this->assertSame( 'image/webp', $primary_mime_type );
     1264        } else {
     1265            $this->assertSame( 'image/jpeg', $primary_mime_type );
     1266        }
     1267
     1268        // AVIF may not be supported by the server, in which case it will be stripped from the results.
     1269        if ( wp_image_editor_supports( array( 'mime_type' => 'image/avif' ) ) ) {
     1270            $this->assertSame( array( 'image/avif' ), $additional_mime_types );
     1271        } else {
     1272            $this->assertSame( array(), $additional_mime_types );
     1273        }
     1274    }
     1275
     1276    /**
     1277     * @ticket 55443
     1278     * @dataProvider data__wp_filter_image_sizes_additional_mime_type_support
     1279     */
     1280    public function test__wp_filter_image_sizes_additional_mime_type_support( $input_size_data, $filter_callback, $expected_size_names ) {
     1281        remove_all_filters( 'wp_image_sizes_with_additional_mime_type_support' );
     1282        if ( $filter_callback ) {
     1283            add_filter( 'wp_image_sizes_with_additional_mime_type_support', $filter_callback );
     1284        }
     1285
     1286        $expected_size_data = array_intersect_key( $input_size_data, array_flip( $expected_size_names ) );
     1287
     1288        $output_size_data = _wp_filter_image_sizes_additional_mime_type_support( $input_size_data, 42 );
     1289        $this->assertEqualSetsWithIndex( $expected_size_data, $output_size_data );
     1290    }
     1291
     1292    public function data__wp_filter_image_sizes_additional_mime_type_support() {
     1293        $thumbnail_data    = array(
     1294            'width'  => 150,
     1295            'height' => 150,
     1296            'crop'   => true,
     1297        );
     1298        $medium_data       = array(
     1299            'width'  => 300,
     1300            'height' => 300,
     1301            'crop'   => false,
     1302        );
     1303        $medium_large_data = array(
     1304            'width'  => 768,
     1305            'height' => 0,
     1306            'crop'   => false,
     1307        );
     1308        $large_data        = array(
     1309            'width'  => 1024,
     1310            'height' => 1024,
     1311            'crop'   => false,
     1312        );
     1313        $custom_data       = array(
     1314            'width'  => 512,
     1315            'height' => 512,
     1316            'crop'   => true,
     1317        );
     1318
     1319        return array(
     1320            array(
     1321                array(
     1322                    'thumbnail'    => $thumbnail_data,
     1323                    'medium'       => $medium_data,
     1324                    'medium_large' => $medium_large_data,
     1325                    'large'        => $large_data,
     1326                ),
     1327                null,
     1328                array( 'thumbnail', 'medium', 'medium_large', 'large' ),
     1329            ),
     1330            array(
     1331                array(
     1332                    'thumbnail' => $thumbnail_data,
     1333                    'medium'    => $medium_data,
     1334                    'custom'    => $custom_data,
     1335                ),
     1336                null,
     1337                array( 'thumbnail', 'medium' ),
     1338            ),
     1339            array(
     1340                array(
     1341                    'thumbnail'    => $thumbnail_data,
     1342                    'medium'       => $medium_data,
     1343                    'medium_large' => $medium_large_data,
     1344                    'large'        => $large_data,
     1345                ),
     1346                function( $enabled_sizes ) {
     1347                    unset( $enabled_sizes['medium_large'], $enabled_sizes['large'] );
     1348                    return $enabled_sizes;
     1349                },
     1350                array( 'thumbnail', 'medium' ),
     1351            ),
     1352            array(
     1353                array(
     1354                    'thumbnail'    => $thumbnail_data,
     1355                    'medium'       => $medium_data,
     1356                    'medium_large' => $medium_large_data,
     1357                    'large'        => $large_data,
     1358                ),
     1359                function( $enabled_sizes ) {
     1360                    $enabled_sizes['medium_large'] = false;
     1361                    $enabled_sizes['large']        = false;
     1362                    return $enabled_sizes;
     1363                },
     1364                array( 'thumbnail', 'medium' ),
     1365            ),
     1366            array(
     1367                array(
     1368                    'thumbnail' => $thumbnail_data,
     1369                    'medium'    => $medium_data,
     1370                    'custom'    => $custom_data,
     1371                ),
     1372                function( $enabled_sizes ) {
     1373                    unset( $enabled_sizes['medium'] );
     1374                    $enabled_sizes['custom'] = true;
     1375                    return $enabled_sizes;
     1376                },
     1377                array( 'thumbnail', 'custom' ),
     1378            ),
     1379        );
     1380    }
     1381
     1382    /**
     1383     * Test the `_wp_maybe_scale_and_rotate_image()` function.
     1384     *
     1385     * @dataProvider data_test__wp_maybe_scale_and_rotate_image
     1386     *
     1387     * @ticket 55443
     1388     */
     1389    public function test__wp_maybe_scale_and_rotate_image( $file, $imagesize, $mime_type, $expected ) {
     1390        if ( ! wp_image_editor_supports( array( 'mime_type' => $mime_type ) ) ) {
     1391            $this->markTestSkipped( sprintf( 'This test requires %s support.', $mime_type ) );
     1392        }
     1393
     1394        $attributes    = array( 'post_mime_type' => $mime_type );
     1395        $attachment_id = $this->factory->attachment->create_object( $file, 0, $attributes );
     1396        $exif_meta     = wp_read_image_metadata( $file );
     1397
     1398        list( $editor, $resized, $rotated ) = _wp_maybe_scale_and_rotate_image( $file, $attachment_id, $imagesize, $exif_meta, $mime_type );
     1399
     1400        $this->assertSame( $expected['rotated'], $rotated );
     1401        $this->assertSame( $expected['resized'], $resized );
     1402        $this->assertSame( $expected['size'], $editor->get_size() );
     1403    }
     1404
     1405    /**
     1406     * Data provider for the `test__wp_maybe_scale_and_rotate_image()` test.
     1407     *
     1408     * @return array
     1409     */
     1410    public function data_test__wp_maybe_scale_and_rotate_image() {
     1411        return array(
     1412
     1413            // Image that will be scaled.
     1414            array(
     1415                DIR_TESTDATA . '/images/test-image-large.jpg',
     1416                array( 3000, 2250 ),
     1417                'image/jpeg',
     1418                array(
     1419                    'rotated' => false,
     1420                    'resized' => true,
     1421                    'size'    => array(
     1422                        'width'  => 2560,
     1423                        'height' => 1920,
     1424                    ),
     1425                ),
     1426            ),
     1427
     1428            // Image that will not be scaled.
     1429            array(
     1430                DIR_TESTDATA . '/images/canola.jpg',
     1431                array( 640, 480 ),
     1432                'image/jpeg',
     1433                array(
     1434                    'rotated' => false,
     1435                    'resized' => false,
     1436                    'size'    => array(
     1437                        'width'  => 640,
     1438                        'height' => 480,
     1439                    ),
     1440                ),
     1441            ),
     1442
     1443            // Image that will be flipped.
     1444            array(
     1445                DIR_TESTDATA . '/images/test-image-upside-down.jpg',
     1446                array( 600, 450 ),
     1447                'image/jpeg',
     1448                array(
     1449                    'rotated' => true,
     1450                    'resized' => false,
     1451                    'size'    => array(
     1452                        'width'  => 600,
     1453                        'height' => 450,
     1454                    ),
     1455                ),
     1456            ),
     1457
     1458            // Image that will be rotated.
     1459            array(
     1460                DIR_TESTDATA . '/images/test-image-rotated-90ccw.jpg',
     1461                array( 1200, 1800 ),
     1462                'image/jpeg',
     1463                array(
     1464                    'rotated' => true,
     1465                    'resized' => false,
     1466                    'size'    => array(
     1467                        'width'  => 1800,
     1468                        'height' => 1200,
     1469                    ),
     1470                ),
     1471            ),
     1472
     1473            // Image that will not be rotated - WebP Exif is not supported in PHP.
     1474            array(
     1475                DIR_TESTDATA . '/images/test-image-rotated-90cw.webp',
     1476                array( 1024, 768 ),
     1477                'image/webp',
     1478                array(
     1479                    'rotated' => false,
     1480                    'resized' => false,
     1481                    'size'    => array(
     1482                        'width'  => 1024,
     1483                        'height' => 768,
     1484                    ),
     1485                ),
     1486            ),
     1487
     1488        );
     1489    }
     1490
     1491    /**
     1492     * Test the `_wp_get_image_suffix()` function.
     1493     * @dataProvider data_test__wp_get_image_suffix
     1494     *
     1495     * @ticket 55443
     1496     */
     1497    public function test__wp_get_image_suffix( $resized, $rotated, $expected ) {
     1498        $this->assertSame( $expected, _wp_get_image_suffix( $resized, $rotated ) );
     1499    }
     1500
     1501    /**
     1502     * Data provider for the `test__wp_get_image_suffix()` test.
     1503     */
     1504    public function data_test__wp_get_image_suffix() {
     1505        return array(
     1506            array( false, false, '' ),
     1507            array( true, false, 'scaled' ),
     1508            array( false, true, 'rotated' ),
     1509            array( true, true, 'scaled' ),
     1510        );
     1511    }
    10291512}
Note: See TracChangeset for help on using the changeset viewer.