@@ -409,10 +409,6 @@ function plotPolar(gd, data, layout) {
409409 if ( layout ) gd . layout = layout ;
410410 Plotly . micropolar . manager . fillLayout ( gd ) ;
411411
412- if ( gd . _fullLayout . autosize === 'initial' && gd . _context . autosizable ) {
413- plotAutoSize ( gd , { } ) ;
414- gd . _fullLayout . autosize = layout . autosize = true ;
415- }
416412 // resize canvas
417413 paperDiv . style ( {
418414 width : gd . _fullLayout . width + 'px' ,
@@ -2148,8 +2144,6 @@ Plotly.relayout = function relayout(gd, astr, val) {
21482144 return ( fullLayout [ axName ] || { } ) . autorange ;
21492145 }
21502146
2151- var hw = [ 'height' , 'width' ] ;
2152-
21532147 // alter gd.layout
21542148 for ( var ai in aobj ) {
21552149 var p = Lib . nestedProperty ( layout , ai ) ,
@@ -2172,14 +2166,8 @@ Plotly.relayout = function relayout(gd, astr, val) {
21722166 // op and has no flag.
21732167 undoit [ ai ] = ( pleaf === 'reverse' ) ? vi : p . get ( ) ;
21742168
2175- // check autosize or autorange vs size and range
2176- if ( hw . indexOf ( ai ) !== - 1 ) {
2177- doextra ( 'autosize' , false ) ;
2178- }
2179- else if ( ai === 'autosize' ) {
2180- doextra ( hw , undefined ) ;
2181- }
2182- else if ( pleafPlus . match ( / ^ [ x y z ] a x i s [ 0 - 9 ] * \. r a n g e ( \[ [ 0 | 1 ] \] ) ? $ / ) ) {
2169+ // check autorange vs range
2170+ if ( pleafPlus . match ( / ^ [ x y z ] a x i s [ 0 - 9 ] * \. r a n g e ( \[ [ 0 | 1 ] \] ) ? $ / ) ) {
21832171 doextra ( ptrunk + '.autorange' , false ) ;
21842172 }
21852173 else if ( pleafPlus . match ( / ^ [ x y z ] a x i s [ 0 - 9 ] * \. a u t o r a n g e $ / ) ) {
@@ -2358,11 +2346,20 @@ Plotly.relayout = function relayout(gd, astr, val) {
23582346 Queue . add ( gd , relayout , [ gd , undoit ] , relayout , [ gd , redoit ] ) ;
23592347 }
23602348
2361- // calculate autosizing - if size hasn't changed,
2362- // will remove h&w so we don't need to redraw
2363- if ( aobj . autosize ) aobj = plotAutoSize ( gd , aobj ) ;
2349+ var oldWidth = gd . _fullLayout . width ,
2350+ oldHeight = gd . _fullLayout . height ;
23642351
2365- if ( aobj . height || aobj . width || aobj . autosize ) docalc = true ;
2352+ // coerce the updated layout
2353+ Plots . supplyDefaults ( gd ) ;
2354+
2355+ // calculate autosizing
2356+ if ( gd . layout . autosize ) Plots . plotAutoSize ( gd , gd . layout , gd . _fullLayout ) ;
2357+
2358+ // avoid unnecessary redraws
2359+ var changed = aobj . height || aobj . width ||
2360+ ( gd . _fullLayout . width !== oldWidth ) ||
2361+ ( gd . _fullLayout . height !== oldHeight ) ;
2362+ if ( changed ) docalc = true ;
23662363
23672364 // redraw
23682365 // first check if there's still anything to do
@@ -2383,7 +2380,6 @@ Plotly.relayout = function relayout(gd, astr, val) {
23832380 }
23842381 else if ( ak . length ) {
23852382 // if we didn't need to redraw entirely, just do the needed parts
2386- Plots . supplyDefaults ( gd ) ;
23872383 fullLayout = gd . _fullLayout ;
23882384
23892385 if ( dolegend ) {
@@ -2492,86 +2488,6 @@ Plotly.purge = function purge(gd) {
24922488 return gd ;
24932489} ;
24942490
2495- /**
2496- * Reduce all reserved margin objects to a single required margin reservation.
2497- *
2498- * @param {Object } margins
2499- * @returns {{left: number, right: number, bottom: number, top: number} }
2500- */
2501- function calculateReservedMargins ( margins ) {
2502- var resultingMargin = { left : 0 , right : 0 , bottom : 0 , top : 0 } ,
2503- marginName ;
2504-
2505- if ( margins ) {
2506- for ( marginName in margins ) {
2507- if ( margins . hasOwnProperty ( marginName ) ) {
2508- resultingMargin . left += margins [ marginName ] . left || 0 ;
2509- resultingMargin . right += margins [ marginName ] . right || 0 ;
2510- resultingMargin . bottom += margins [ marginName ] . bottom || 0 ;
2511- resultingMargin . top += margins [ marginName ] . top || 0 ;
2512- }
2513- }
2514- }
2515- return resultingMargin ;
2516- }
2517-
2518- function plotAutoSize ( gd , aobj ) {
2519- var fullLayout = gd . _fullLayout ,
2520- context = gd . _context ,
2521- computedStyle ;
2522-
2523- var newHeight , newWidth ;
2524-
2525- gd . emit ( 'plotly_autosize' ) ;
2526-
2527- // embedded in an iframe - just take the full iframe size
2528- // if we get to this point, with no aspect ratio restrictions
2529- if ( gd . _context . fillFrame ) {
2530- newWidth = window . innerWidth ;
2531- newHeight = window . innerHeight ;
2532-
2533- // somehow we get a few extra px height sometimes...
2534- // just hide it
2535- document . body . style . overflow = 'hidden' ;
2536- }
2537- else if ( isNumeric ( context . frameMargins ) && context . frameMargins > 0 ) {
2538- var reservedMargins = calculateReservedMargins ( gd . _boundingBoxMargins ) ,
2539- reservedWidth = reservedMargins . left + reservedMargins . right ,
2540- reservedHeight = reservedMargins . bottom + reservedMargins . top ,
2541- gdBB = fullLayout . _container . node ( ) . getBoundingClientRect ( ) ,
2542- factor = 1 - 2 * context . frameMargins ;
2543-
2544- newWidth = Math . round ( factor * ( gdBB . width - reservedWidth ) ) ;
2545- newHeight = Math . round ( factor * ( gdBB . height - reservedHeight ) ) ;
2546- }
2547- else {
2548- // plotly.js - let the developers do what they want, either
2549- // provide height and width for the container div,
2550- // specify size in layout, or take the defaults,
2551- // but don't enforce any ratio restrictions
2552- computedStyle = window . getComputedStyle ( gd ) ;
2553- newHeight = parseFloat ( computedStyle . height ) || fullLayout . height ;
2554- newWidth = parseFloat ( computedStyle . width ) || fullLayout . width ;
2555- }
2556-
2557- if ( Math . abs ( fullLayout . width - newWidth ) > 1 ||
2558- Math . abs ( fullLayout . height - newHeight ) > 1 ) {
2559- fullLayout . height = gd . layout . height = newHeight ;
2560- fullLayout . width = gd . layout . width = newWidth ;
2561- }
2562- // if there's no size change, update layout but
2563- // delete the autosize attr so we don't redraw
2564- // but can't call layoutStyles for initial autosize
2565- else if ( fullLayout . autosize !== 'initial' ) {
2566- delete ( aobj . autosize ) ;
2567- fullLayout . autosize = gd . layout . autosize = true ;
2568- }
2569-
2570- Plots . sanitizeMargins ( fullLayout ) ;
2571-
2572- return aobj ;
2573- }
2574-
25752491// -------------------------------------------------------
25762492// makePlotFramework: Create the plot container and axes
25772493// -------------------------------------------------------
@@ -2591,13 +2507,6 @@ function makePlotFramework(gd) {
25912507 . classed ( 'svg-container' , true )
25922508 . style ( 'position' , 'relative' ) ;
25932509
2594- // Initial autosize
2595- if ( fullLayout . autosize === 'initial' ) {
2596- plotAutoSize ( gd , { } ) ;
2597- fullLayout . autosize = true ;
2598- gd . layout . autosize = true ;
2599- }
2600-
26012510 // Make the graph containers
26022511 // start fresh each time we get here, so we know the order comes out
26032512 // right, rather than enter/exit which can muck up the order
0 commit comments