Make WordPress Core

Changeset 58571

Timestamp:
06/25/2024 03:30:57 PM (3 weeks ago)
Author:
jorbin
Message:

Media: unfix admin image cropping calculations.

[58456] introduced some failures to the automated test system that indicate this fix is incomplete.

See #32282.
Props hellofromtonya, audrasjb, andrewserong, kevin940726, oglekler.

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk

    • Property svn:mergeinfo changed
      /trunk (added)merged: 58570
  • trunk/src/js/_enqueues/lib/image-edit.js

    r58456 r58571  
    144144     */
    145145    init : function(postid) {
    146         var t = this, old = $('#image-editor-' + t.postid);
     146        var t = this, old = $('#image-editor-' + t.postid),
     147            x = t.intval( $('#imgedit-x-' + postid).val() ),
     148            y = t.intval( $('#imgedit-y-' + postid).val() );
    147149
    148150        if ( t.postid !== postid && old.length ) {
     
    150152        }
    151153
     154
     155
     156
    152157        t.hold.sizer = parseFloat( $('#imgedit-sizer-' + postid).val() );
    153158        t.postid = postid;
     
    182187
    183188        $( document ).on( 'image-editor-ui-ready', this.focusManager );
    184     },
    185 
    186     /**
    187      * Calculate the image size and save it to memory.
    188      *
    189      * @since 6.6.0
    190      *
    191      * @memberof imageEdit
    192      *
    193      * @param {number} postid The post ID.
    194      *
    195      * @return {void}
    196      */
    197     calculateImgSize: function( postid ) {
    198         var t = this,
    199         x = t.intval( $( '#imgedit-x-' + postid ).val() ),
    200         y = t.intval( $( '#imgedit-y-' + postid ).val() );
    201 
    202         t.hold.w = t.hold.ow = x;
    203         t.hold.h = t.hold.oh = y;
    204         t.hold.xy_ratio = x / y;
    205         t.hold.sizer = parseFloat( $( '#imgedit-sizer-' + postid ).val() );
    206         t.currentCropSelection = null;
    207189    },
    208190
     
    544526                i = history[n];
    545527                if ( i.hasOwnProperty('c') ) {
    546                     op[n] = { 'c': { 'x': i.c.x, 'y': i.c.y, 'w': i.c.w, 'h': i.c.h, 'r': i.c.r } };
     528                    op[n] = { 'c': { 'x': i.c.x, 'y': i.c.y, 'w': i.c.w, 'h': i.c.h } };
    547529                } else if ( i.hasOwnProperty('r') ) {
    548530                    op[n] = { 'r': i.r.r };
     
    879861            this.init( postid );
    880862        }
    881         this.calculateImgSize( postid );
    882863
    883864        this.initCrop(postid, img, parent);
     
    929910            selW = $('#imgedit-sel-width-' + postid),
    930911            selH = $('#imgedit-sel-height-' + postid),
     912
     913
    931914            $image = $( image ),
    932915            $img;
     
    963946                 * @return {void}
    964947                 */
    965                 parent.children().on( 'mousedown touchstart', function(e) {
    966                     var ratio = false,
    967                         sel = t.iasapi.getSelection(),
    968                         cx = t.intval( $( '#imgedit-crop-width-' + postid ).val() ),
    969                         cy = t.intval( $( '#imgedit-crop-height-' + postid ).val() );
    970 
    971                     if ( cx && cy ) {
    972                         ratio = t.getSelRatio( postid );
    973                     } else if ( e.shiftKey && sel && sel.width && sel.height ) {
    974                         ratio = sel.width + ':' + sel.height;
     948                parent.children().on( 'mousedown, touchstart', function(e){
     949                    var ratio = false, sel, defRatio;
     950
     951                    if ( e.shiftKey ) {
     952                        sel = t.iasapi.getSelection();
     953                        defRatio = t.getSelRatio(postid);
     954                        ratio = ( sel && sel.width && sel.height ) ? sel.width + ':' + sel.height : defRatio;
    975955                    }
    976956
     
    10211001             */
    10221002            onSelectChange: function(img, c) {
    1023                 var sizer = imageEdit.hold.sizer,
    1024                     oldSel = imageEdit.currentCropSelection;
    1025 
    1026                 if ( oldSel != null && oldSel.width == c.width && oldSel.height == c.height ) {
    1027                     return;
    1028                 }
    1029 
    1030                 selW.val( Math.min( imageEdit.hold.w, imageEdit.round( c.width / sizer ) ) );
    1031                 selH.val( Math.min( imageEdit.hold.h, imageEdit.round( c.height / sizer ) ) );
    1032 
    1033                 t.currentCropSelection = c;
     1003                var sizer = imageEdit.hold.sizer;
     1004                selW.val( imageEdit.round(c.width / sizer) );
     1005                selH.val( imageEdit.round(c.height / sizer) );
     1006                selX.val( imageEdit.round(c.x1 / sizer) );
     1007                selY.val( imageEdit.round(c.y1 / sizer) );
    10341008            }
    10351009        });
     
    10491023     */
    10501024    setCropSelection : function(postid, c) {
    1051         var sel,
    1052             selW = $( '#imgedit-sel-width-' + postid ),
    1053             selH = $( '#imgedit-sel-height-' + postid ),
    1054             sizer = this.hold.sizer,
    1055             hold = this.hold;
     1025        var sel;
    10561026
    10571027        c = c || 0;
     
    10681038        }
    10691039
    1070         // adjust the selection within the bounds of the image on 100% scale
    1071         var excessW = hold.w - ( Math.round( c.x1 / sizer ) + parseInt( selW.val() ) );
    1072         var excessH = hold.h - ( Math.round( c.y1 / sizer ) + parseInt( selH.val() ) );
    1073         var x = Math.round( c.x1 / sizer ) + Math.min( 0, excessW );
    1074         var y = Math.round( c.y1 / sizer ) + Math.min( 0, excessH );
    1075 
    1076         // use 100% scaling to prevent rounding errors
    1077         sel = { 'r': 1, 'x': x, 'y': y, 'w': selW.val(), 'h': selH.val() };
    1078 
     1040        sel = { 'x': c.x1, 'y': c.y1, 'w': c.width, 'h': c.height };
    10791041        this.setDisabled($('.imgedit-crop', '#imgedit-panel-' + postid), 1);
    10801042        $('#imgedit-selection-' + postid).val( JSON.stringify(sel) );
     
    12041166        this.closePopup(t);
    12051167        this.addStep({ 'r': { 'r': angle, 'fw': this.hold.h, 'fh': this.hold.w }}, postid, nonce);
    1206 
    1207         // Clear the selection fields after rotating.
    1208         $( '#imgedit-sel-width-' + postid ).val( '' );
    1209         $( '#imgedit-sel-height-' + postid ).val( '' );
    1210         this.currentCropSelection = null;
    12111168    },
    12121169
     
    12311188        this.closePopup(t);
    12321189        this.addStep({ 'f': { 'f': axis, 'fw': this.hold.w, 'fh': this.hold.h }}, postid, nonce);
    1233 
    1234         // Clear the selection fields after flipping.
    1235         $( '#imgedit-sel-width-' + postid ).val( '' );
    1236         $( '#imgedit-sel-height-' + postid ).val( '' );
    1237         this.currentCropSelection = null;
    12381190    },
    12391191
     
    12681220
    12691221        // Clear the selection fields after cropping.
    1270         $( '#imgedit-sel-width-' + postid ).val( '' );
    1271         $( '#imgedit-sel-height-' + postid ).val( '' );
    1272         $( '#imgedit-start-x-' + postid ).val( '0' );
    1273         $( '#imgedit-start-y-' + postid ).val( '0' );
    1274         this.currentCropSelection = null;
     1222        $('#imgedit-sel-width-' + postid).val('');
     1223        $('#imgedit-sel-height-' + postid).val('');
     1224        $('#imgedit-start-x-' + postid).val('0');
     1225        $('#imgedit-start-y-' + postid).val('0');
    12751226    },
    12761227
     
    13621313            sizer = this.hold.sizer, x1, y1, x2, y2, ias = this.iasapi;
    13631314
    1364         this.currentCropSelection = null;
    1365 
    13661315        if ( false === this.validateNumeric( el ) ) {
    13671316            return;
     
    13871336                x1 = 0;
    13881337                x2 = imgw;
    1389                 elX.val( Math.min( this.hold.w, Math.round( x2 / sizer ) ) );
     1338                elX.val( Math. ) );
    13901339            }
    13911340
     
    13931342                y1 = 0;
    13941343                y2 = imgh;
    1395                 elY.val( Math.min( this.hold.h, Math.round( y2 / sizer ) ) );
     1344                elY.val( Math. ) );
    13961345            }
    13971346
     
    13991348            ias.update();
    14001349            this.setCropSelection(postid, ias.getSelection());
    1401             this.currentCropSelection = ias.getSelection();
    14021350        }
    14031351    },
  • trunk/src/wp-admin/includes/image-edit.php

    r58457 r58571  
    736736                    $h    = $size['height'];
    737737
    738                     $scale = isset( $sel->r ) ? $sel->r : 1 / _image_get_preview_ratio( $w, $h ); // Discard preview scaling.
     738                    $scale = 1 / _image_get_preview_ratio( $w, $h ); // Discard preview scaling.
    739739                    $image->crop( (int) ( $sel->x * $scale ), (int) ( $sel->y * $scale ), (int) ( $sel->w * $scale ), (int) ( $sel->h * $scale ) );
    740740                } else {
    741                     $scale = isset( $sel->r ) ? $sel->r : 1 / _image_get_preview_ratio( imagesx( $image ), imagesy( $image ) ); // Discard preview scaling.
     741                    $scale = 1 / _image_get_preview_ratio( imagesx( $image ), imagesy( $image ) ); // Discard preview scaling.
    742742                    $image = _crop_image_resource( $image, $sel->x * $scale, $sel->y * $scale, $sel->w * $scale, $sel->h * $scale );
    743743                }
Note: See TracChangeset for help on using the changeset viewer.