diff -r 53cff4b4a802 -r bde1974c263b web/wp-admin/includes/image-edit.php
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-admin/includes/image-edit.php Wed Feb 03 15:37:20 2010 +0000
@@ -0,0 +1,667 @@
+ 400 ? 400 / $big : 1;
+
+ $backup_sizes = get_post_meta( $post_id, '_wp_attachment_backup_sizes', true );
+ $can_restore = !empty($backup_sizes) && isset($backup_sizes['full-orig'])
+ && $backup_sizes['full-orig']['file'] != basename($meta['file']);
+
+ if ( $msg ) {
+ if ( isset($msg->error) )
+ $note = "
";
+ elseif ( isset($msg->msg) )
+ $note = "";
+ }
+
+ ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ; ?>?action=imgedit-preview&_ajax_nonce=<?php echo $nonce; ?>&postid=<?php echo $post_id; ?>&rand=<?php echo rand(1, 99999); ?>)
+
+
+
+
+ )" disabled="disabled" class="button-primary imgedit-submit-btn" value="" />
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+ , 'restore')" class="button-primary" value="" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+ 400 ? (400 / $max) : 1;
+}
+
+function _rotate_image_resource($img, $angle) {
+ if ( function_exists('imagerotate') ) {
+ $rotated = imagerotate($img, $angle, 0);
+ if ( is_resource($rotated) ) {
+ imagedestroy($img);
+ $img = $rotated;
+ }
+ }
+ return $img;
+}
+
+
+function _flip_image_resource($img, $horz, $vert) {
+ $w = imagesx($img);
+ $h = imagesy($img);
+ $dst = wp_imagecreatetruecolor($w, $h);
+ if ( is_resource($dst) ) {
+ $sx = $vert ? ($w - 1) : 0;
+ $sy = $horz ? ($h - 1) : 0;
+ $sw = $vert ? -$w : $w;
+ $sh = $horz ? -$h : $h;
+
+ if ( imagecopyresampled($dst, $img, 0, 0, $sx, $sy, $w, $h, $sw, $sh) ) {
+ imagedestroy($img);
+ $img = $dst;
+ }
+ }
+ return $img;
+}
+
+function _crop_image_resource($img, $x, $y, $w, $h) {
+ $dst = wp_imagecreatetruecolor($w, $h);
+ if ( is_resource($dst) ) {
+ if ( imagecopy($dst, $img, 0, 0, $x, $y, $w, $h) ) {
+ imagedestroy($img);
+ $img = $dst;
+ }
+ }
+ return $img;
+}
+
+function image_edit_apply_changes($img, $changes) {
+
+ if ( !is_array($changes) )
+ return $img;
+
+ // expand change operations
+ foreach ( $changes as $key => $obj ) {
+ if ( isset($obj->r) ) {
+ $obj->type = 'rotate';
+ $obj->angle = $obj->r;
+ unset($obj->r);
+ } elseif ( isset($obj->f) ) {
+ $obj->type = 'flip';
+ $obj->axis = $obj->f;
+ unset($obj->f);
+ } elseif ( isset($obj->c) ) {
+ $obj->type = 'crop';
+ $obj->sel = $obj->c;
+ unset($obj->c);
+ }
+ $changes[$key] = $obj;
+ }
+
+ // combine operations
+ if ( count($changes) > 1 ) {
+ $filtered = array($changes[0]);
+ for ( $i = 0, $j = 1; $j < count($changes); $j++ ) {
+ $combined = false;
+ if ( $filtered[$i]->type == $changes[$j]->type ) {
+ switch ( $filtered[$i]->type ) {
+ case 'rotate':
+ $filtered[$i]->angle += $changes[$j]->angle;
+ $combined = true;
+ break;
+ case 'flip':
+ $filtered[$i]->axis ^= $changes[$j]->axis;
+ $combined = true;
+ break;
+ }
+ }
+ if ( !$combined )
+ $filtered[++$i] = $changes[$j];
+ }
+ $changes = $filtered;
+ unset($filtered);
+ }
+
+ // image resource before applying the changes
+ $img = apply_filters('image_edit_before_change', $img, $changes);
+
+ foreach ( $changes as $operation ) {
+ switch ( $operation->type ) {
+ case 'rotate':
+ if ( $operation->angle != 0 )
+ $img = _rotate_image_resource($img, $operation->angle);
+ break;
+ case 'flip':
+ if ( $operation->axis != 0 )
+ $img = _flip_image_resource($img, ($operation->axis & 1) != 0, ($operation->axis & 2) != 0);
+ break;
+ case 'crop':
+ $sel = $operation->sel;
+ $scale = 1 / _image_get_preview_ratio( imagesx($img), imagesy($img) ); // discard preview scaling
+ $img = _crop_image_resource($img, $sel->x * $scale, $sel->y * $scale, $sel->w * $scale, $sel->h * $scale);
+ break;
+ }
+ }
+
+ return $img;
+}
+
+function stream_preview_image($post_id) {
+ $post = get_post($post_id);
+ @ini_set('memory_limit', '256M');
+ $img = load_image_to_edit( $post_id, $post->post_mime_type, array(400, 400) );
+
+ if ( !is_resource($img) )
+ return false;
+
+ $changes = !empty($_REQUEST['history']) ? json_decode( stripslashes($_REQUEST['history']) ) : null;
+ if ( $changes )
+ $img = image_edit_apply_changes($img, $changes);
+
+ // scale the image
+ $w = imagesx($img);
+ $h = imagesy($img);
+ $ratio = _image_get_preview_ratio($w, $h);
+ $w2 = $w * $ratio;
+ $h2 = $h * $ratio;
+
+ $preview = wp_imagecreatetruecolor($w2, $h2);
+ imagecopyresampled( $preview, $img, 0, 0, 0, 0, $w2, $h2, $w, $h );
+ wp_stream_image($preview, $post->post_mime_type, $post_id);
+
+ imagedestroy($preview);
+ imagedestroy($img);
+ return true;
+}
+
+function wp_restore_image($post_id) {
+ $meta = wp_get_attachment_metadata($post_id);
+ $file = get_attached_file($post_id);
+ $backup_sizes = get_post_meta( $post_id, '_wp_attachment_backup_sizes', true );
+ $restored = false;
+ $msg = '';
+
+ if ( !is_array($backup_sizes) ) {
+ $msg->error = __('Cannot load image metadata.');
+ return $msg;
+ }
+
+ $parts = pathinfo($file);
+ $suffix = time() . rand(100, 999);
+ $default_sizes = apply_filters( 'intermediate_image_sizes', array('large', 'medium', 'thumbnail') );
+
+ if ( isset($backup_sizes['full-orig']) && is_array($backup_sizes['full-orig']) ) {
+ $data = $backup_sizes['full-orig'];
+
+ if ( $parts['basename'] != $data['file'] ) {
+ if ( defined('IMAGE_EDIT_OVERWRITE') && IMAGE_EDIT_OVERWRITE ) {
+ // delete only if it's edited image
+ if ( preg_match('/-e[0-9]{13}\./', $parts['basename']) ) {
+ $delpath = apply_filters('wp_delete_file', $file);
+ @unlink($delpath);
+ }
+ } else {
+ $backup_sizes["full-$suffix"] = array('width' => $meta['width'], 'height' => $meta['height'], 'file' => $parts['basename']);
+ }
+ }
+
+ $restored_file = path_join($parts['dirname'], $data['file']);
+ $restored = update_attached_file($post_id, $restored_file);
+
+ $meta['file'] = _wp_relative_upload_path( $restored_file );
+ $meta['width'] = $data['width'];
+ $meta['height'] = $data['height'];
+ list ( $uwidth, $uheight ) = wp_shrink_dimensions($meta['width'], $meta['height']);
+ $meta['hwstring_small'] = "height='$uheight' width='$uwidth'";
+ }
+
+ foreach ( $default_sizes as $default_size ) {
+ if ( isset($backup_sizes["$default_size-orig"]) ) {
+ $data = $backup_sizes["$default_size-orig"];
+ if ( isset($meta['sizes'][$default_size]) && $meta['sizes'][$default_size]['file'] != $data['file'] ) {
+ if ( defined('IMAGE_EDIT_OVERWRITE') && IMAGE_EDIT_OVERWRITE ) {
+ // delete only if it's edited image
+ if ( preg_match('/-e[0-9]{13}-/', $meta['sizes'][$default_size]['file']) ) {
+ $delpath = apply_filters( 'wp_delete_file', path_join($parts['dirname'], $meta['sizes'][$default_size]['file']) );
+ @unlink($delpath);
+ }
+ } else {
+ $backup_sizes["$default_size-{$suffix}"] = $meta['sizes'][$default_size];
+ }
+ }
+
+ $meta['sizes'][$default_size] = $data;
+ } else {
+ unset($meta['sizes'][$default_size]);
+ }
+ }
+
+ if ( !wp_update_attachment_metadata($post_id, $meta) || !update_post_meta( $post_id, '_wp_attachment_backup_sizes', $backup_sizes) ) {
+ $msg->error = __('Cannot save image metadata.');
+ return $msg;
+ }
+
+ if ( !$restored )
+ $msg->error = __('Image metadata is inconsistent.');
+ else
+ $msg->msg = __('Image restored successfully.');
+
+ return $msg;
+}
+
+function wp_save_image($post_id) {
+ $return = '';
+ $success = $delete = $scaled = $nocrop = false;
+ $post = get_post($post_id);
+ @ini_set('memory_limit', '256M');
+ $img = load_image_to_edit($post_id, $post->post_mime_type);
+
+ if ( !is_resource($img) ) {
+ $return->error = esc_js( __('Unable to create new image.') );
+ return $return;
+ }
+
+ $fwidth = !empty($_REQUEST['fwidth']) ? intval($_REQUEST['fwidth']) : 0;
+ $fheight = !empty($_REQUEST['fheight']) ? intval($_REQUEST['fheight']) : 0;
+ $target = !empty($_REQUEST['target']) ? preg_replace('/[^a-z0-9_-]+/i', '', $_REQUEST['target']) : '';
+ $scale = !empty($_REQUEST['do']) && 'scale' == $_REQUEST['do'];
+
+ if ( $scale && $fwidth > 0 && $fheight > 0 ) {
+ $sX = imagesx($img);
+ $sY = imagesy($img);
+
+ // check if it has roughly the same w / h ratio
+ $diff = round($sX / $sY, 2) - round($fwidth / $fheight, 2);
+ if ( -0.1 < $diff && $diff < 0.1 ) {
+ // scale the full size image
+ $dst = wp_imagecreatetruecolor($fwidth, $fheight);
+ if ( imagecopyresampled( $dst, $img, 0, 0, 0, 0, $fwidth, $fheight, $sX, $sY ) ) {
+ imagedestroy($img);
+ $img = $dst;
+ $scaled = true;
+ }
+ }
+
+ if ( !$scaled ) {
+ $return->error = esc_js( __('Error while saving the scaled image. Please reload the page and try again.') );
+ return $return;
+ }
+ } elseif ( !empty($_REQUEST['history']) ) {
+ $changes = json_decode( stripslashes($_REQUEST['history']) );
+ if ( $changes )
+ $img = image_edit_apply_changes($img, $changes);
+ } else {
+ $return->error = esc_js( __('Nothing to save, the image has not changed.') );
+ return $return;
+ }
+
+ $meta = wp_get_attachment_metadata($post_id);
+ $backup_sizes = get_post_meta( $post->ID, '_wp_attachment_backup_sizes', true );
+
+ if ( !is_array($meta) ) {
+ $return->error = esc_js( __('Image data does not exist. Please re-upload the image.') );
+ return $return;
+ }
+
+ if ( !is_array($backup_sizes) )
+ $backup_sizes = array();
+
+ // generate new filename
+ $path = get_attached_file($post_id);
+ $path_parts = pathinfo52( $path );
+ $filename = $path_parts['filename'];
+ $suffix = time() . rand(100, 999);
+
+ if ( defined('IMAGE_EDIT_OVERWRITE') && IMAGE_EDIT_OVERWRITE &&
+ isset($backup_sizes['full-orig']) && $backup_sizes['full-orig']['file'] != $path_parts['basename'] ) {
+
+ if ( 'thumbnail' == $target )
+ $new_path = "{$path_parts['dirname']}/{$filename}-temp.{$path_parts['extension']}";
+ else
+ $new_path = $path;
+ } else {
+ while( true ) {
+ $filename = preg_replace( '/-e([0-9]+)$/', '', $filename );
+ $filename .= "-e{$suffix}";
+ $new_filename = "{$filename}.{$path_parts['extension']}";
+ $new_path = "{$path_parts['dirname']}/$new_filename";
+ if ( file_exists($new_path) )
+ $suffix++;
+ else
+ break;
+ }
+ }
+
+ // save the full-size file, also needed to create sub-sizes
+ if ( !wp_save_image_file($new_path, $img, $post->post_mime_type, $post_id) ) {
+ $return->error = esc_js( __('Unable to save the image.') );
+ return $return;
+ }
+
+ if ( 'nothumb' == $target || 'all' == $target || 'full' == $target || $scaled ) {
+ $tag = false;
+ if ( isset($backup_sizes['full-orig']) ) {
+ if ( ( !defined('IMAGE_EDIT_OVERWRITE') || !IMAGE_EDIT_OVERWRITE ) && $backup_sizes['full-orig']['file'] != $path_parts['basename'] )
+ $tag = "full-$suffix";
+ } else {
+ $tag = 'full-orig';
+ }
+
+ if ( $tag )
+ $backup_sizes[$tag] = array('width' => $meta['width'], 'height' => $meta['height'], 'file' => $path_parts['basename']);
+
+ $success = update_attached_file($post_id, $new_path);
+
+ $meta['file'] = _wp_relative_upload_path($new_path);
+ $meta['width'] = imagesx($img);
+ $meta['height'] = imagesy($img);
+
+ list ( $uwidth, $uheight ) = wp_shrink_dimensions($meta['width'], $meta['height']);
+ $meta['hwstring_small'] = "height='$uheight' width='$uwidth'";
+
+ if ( $success && ('nothumb' == $target || 'all' == $target) ) {
+ $sizes = apply_filters( 'intermediate_image_sizes', array('large', 'medium', 'thumbnail') );
+ if ( 'nothumb' == $target )
+ $sizes = array_diff( $sizes, array('thumbnail') );
+ }
+
+ $return->fw = $meta['width'];
+ $return->fh = $meta['height'];
+ } elseif ( 'thumbnail' == $target ) {
+ $sizes = array( 'thumbnail' );
+ $success = $delete = $nocrop = true;
+ }
+
+ if ( isset($sizes) ) {
+ foreach ( $sizes as $size ) {
+ $tag = false;
+ if ( isset($meta['sizes'][$size]) ) {
+ if ( isset($backup_sizes["$size-orig"]) ) {
+ if ( ( !defined('IMAGE_EDIT_OVERWRITE') || !IMAGE_EDIT_OVERWRITE ) && $backup_sizes["$size-orig"]['file'] != $meta['sizes'][$size]['file'] )
+ $tag = "$size-$suffix";
+ } else {
+ $tag = "$size-orig";
+ }
+
+ if ( $tag )
+ $backup_sizes[$tag] = $meta['sizes'][$size];
+ }
+
+ $crop = $nocrop ? false : get_option("{$size}_crop");
+ $resized = image_make_intermediate_size($new_path, get_option("{$size}_size_w"), get_option("{$size}_size_h"), $crop );
+
+ if ( $resized )
+ $meta['sizes'][$size] = $resized;
+ else
+ unset($meta['sizes'][$size]);
+ }
+ }
+
+ if ( $success ) {
+ wp_update_attachment_metadata($post_id, $meta);
+ update_post_meta( $post_id, '_wp_attachment_backup_sizes', $backup_sizes);
+
+ if ( $target == 'thumbnail' || $target == 'all' || $target == 'full' ) {
+ $file_url = wp_get_attachment_url($post_id);
+ if ( $thumb = $meta['sizes']['thumbnail'] )
+ $return->thumbnail = path_join( dirname($file_url), $thumb['file'] );
+ else
+ $return->thumbnail = "$file_url?w=128&h=128";
+ }
+ } else {
+ $delete = true;
+ }
+
+ if ( $delete ) {
+ $delpath = apply_filters('wp_delete_file', $new_path);
+ @unlink($delpath);
+ }
+
+ imagedestroy($img);
+
+ $return->msg = esc_js( __('Image saved') );
+ return $return;
+}
+