Skip to content
Browse files

Check again for non-zero element dimensions after the bg image is loa…

…ded, to prevent divide-by-zero error if in some rare case the element has non-zero dimensions during the initial update but zero dimensions after the image finishes loading.
  • Loading branch information...
1 parent 14b6080 commit 22196bcade73fba75a5aa97908dc8cee08b8e9bf Jason Johnston committed Aug 18, 2011
Showing with 43 additions and 37 deletions.
  1. +43 −37 sources/BackgroundRenderer.js
View
80 sources/BackgroundRenderer.js
@@ -120,47 +120,53 @@ PIE.BackgroundRenderer = PIE.RendererBase.newRenderer( {
* @param {number} index
*/
positionBgImage: function( shape, index ) {
+ var me = this;
PIE.Util.withImageSize( shape.fill.src, function( size ) {
- var fill = shape.fill,
- el = this.targetElement,
- bounds = this.boundsInfo.getBounds(),
+ var el = me.targetElement,
+ bounds = me.boundsInfo.getBounds(),
elW = bounds.w,
- elH = bounds.h,
- si = this.styleInfos,
- border = si.borderInfo.getProps(),
- bw = border && border.widths,
- bwT = bw ? bw['t'].pixels( el ) : 0,
- bwR = bw ? bw['r'].pixels( el ) : 0,
- bwB = bw ? bw['b'].pixels( el ) : 0,
- bwL = bw ? bw['l'].pixels( el ) : 0,
- bg = si.backgroundInfo.getProps().bgImages[ index ],
- bgPos = bg.bgPosition ? bg.bgPosition.coords( el, elW - size.w - bwL - bwR, elH - size.h - bwT - bwB ) : { x:0, y:0 },
- repeat = bg.imgRepeat,
- pxX, pxY,
- clipT = 0, clipL = 0,
- clipR = elW + 1, clipB = elH + 1, //make sure the default clip region is not inside the box (by a subpixel)
- clipAdjust = PIE.ieVersion === 8 ? 0 : 1; //prior to IE8 requires 1 extra pixel in the image clip region
-
- // Positioning - find the pixel offset from the top/left and convert to a ratio
- // The position is shifted by half a pixel, to adjust for the half-pixel coordorigin shift which is
- // needed to fix antialiasing but makes the bg image fuzzy.
- pxX = Math.round( bgPos.x ) + bwL + 0.5;
- pxY = Math.round( bgPos.y ) + bwT + 0.5;
- fill.position = ( pxX / elW ) + ',' + ( pxY / elH );
-
- // Repeating - clip the image shape
- if( repeat && repeat !== 'repeat' ) {
- if( repeat === 'repeat-x' || repeat === 'no-repeat' ) {
- clipT = pxY + 1;
- clipB = pxY + size.h + clipAdjust;
- }
- if( repeat === 'repeat-y' || repeat === 'no-repeat' ) {
- clipL = pxX + 1;
- clipR = pxX + size.w + clipAdjust;
+ elH = bounds.h;
+
+ // It's possible that the element dimensions are zero now but weren't when the original
+ // update executed, make sure that's not the case to avoid divide-by-zero error
+ if( elW && elH ) {
+ var fill = shape.fill,
+ si = me.styleInfos,
+ border = si.borderInfo.getProps(),
+ bw = border && border.widths,
+ bwT = bw ? bw['t'].pixels( el ) : 0,
+ bwR = bw ? bw['r'].pixels( el ) : 0,
+ bwB = bw ? bw['b'].pixels( el ) : 0,
+ bwL = bw ? bw['l'].pixels( el ) : 0,
+ bg = si.backgroundInfo.getProps().bgImages[ index ],
+ bgPos = bg.bgPosition ? bg.bgPosition.coords( el, elW - size.w - bwL - bwR, elH - size.h - bwT - bwB ) : { x:0, y:0 },
+ repeat = bg.imgRepeat,
+ pxX, pxY,
+ clipT = 0, clipL = 0,
+ clipR = elW + 1, clipB = elH + 1, //make sure the default clip region is not inside the box (by a subpixel)
+ clipAdjust = PIE.ieVersion === 8 ? 0 : 1; //prior to IE8 requires 1 extra pixel in the image clip region
+
+ // Positioning - find the pixel offset from the top/left and convert to a ratio
+ // The position is shifted by half a pixel, to adjust for the half-pixel coordorigin shift which is
+ // needed to fix antialiasing but makes the bg image fuzzy.
+ pxX = Math.round( bgPos.x ) + bwL + 0.5;
+ pxY = Math.round( bgPos.y ) + bwT + 0.5;
+ fill.position = ( pxX / elW ) + ',' + ( pxY / elH );
+
+ // Repeating - clip the image shape
+ if( repeat && repeat !== 'repeat' ) {
+ if( repeat === 'repeat-x' || repeat === 'no-repeat' ) {
+ clipT = pxY + 1;
+ clipB = pxY + size.h + clipAdjust;
+ }
+ if( repeat === 'repeat-y' || repeat === 'no-repeat' ) {
+ clipL = pxX + 1;
+ clipR = pxX + size.w + clipAdjust;
+ }
+ shape.style.clip = 'rect(' + clipT + 'px,' + clipR + 'px,' + clipB + 'px,' + clipL + 'px)';
}
- shape.style.clip = 'rect(' + clipT + 'px,' + clipR + 'px,' + clipB + 'px,' + clipL + 'px)';
}
- }, this );
+ } );
},

0 comments on commit 22196bc

Please sign in to comment.
Something went wrong with that request. Please try again.