|
import * as util from '../../../util'; |
|
|
|
var CRp = {}; |
|
|
|
CRp.safeDrawImage = function( context, img, ix, iy, iw, ih, x, y, w, h ){ |
|
|
|
if( iw <= 0 || ih <= 0 || w <= 0 || h <= 0 ){ |
|
return; |
|
} |
|
|
|
try { |
|
context.drawImage( img, ix, iy, iw, ih, x, y, w, h ); |
|
} catch (e) { |
|
util.warn(e); |
|
} |
|
}; |
|
|
|
CRp.drawInscribedImage = function( context, img, node, index, nodeOpacity ){ |
|
var r = this; |
|
var pos = node.position(); |
|
var nodeX = pos.x; |
|
var nodeY = pos.y; |
|
var styleObj = node.cy().style(); |
|
var getIndexedStyle = styleObj.getIndexedStyle.bind( styleObj ); |
|
var fit = getIndexedStyle( node, 'background-fit', 'value', index ); |
|
var repeat = getIndexedStyle( node, 'background-repeat', 'value', index ); |
|
var nodeW = node.width(); |
|
var nodeH = node.height(); |
|
var paddingX2 = node.padding() * 2; |
|
var nodeTW = nodeW + ( getIndexedStyle( node, 'background-width-relative-to', 'value', index ) === 'inner' ? 0 : paddingX2 ); |
|
var nodeTH = nodeH + ( getIndexedStyle( node, 'background-height-relative-to', 'value', index ) === 'inner' ? 0 : paddingX2 ); |
|
var rs = node._private.rscratch; |
|
var clip = getIndexedStyle( node, 'background-clip', 'value', index ); |
|
var shouldClip = clip === 'node'; |
|
var imgOpacity = getIndexedStyle( node, 'background-image-opacity', 'value', index ) * nodeOpacity; |
|
var smooth = getIndexedStyle( node, 'background-image-smoothing', 'value', index ); |
|
var cornerRadius = node.pstyle('corner-radius').value; |
|
if (cornerRadius !== 'auto') cornerRadius = node.pstyle('corner-radius').pfValue; |
|
|
|
var imgW = img.width || img.cachedW; |
|
var imgH = img.height || img.cachedH; |
|
|
|
|
|
if( null == imgW || null == imgH ){ |
|
document.body.appendChild( img ); |
|
|
|
imgW = img.cachedW = img.width || img.offsetWidth; |
|
imgH = img.cachedH = img.height || img.offsetHeight; |
|
|
|
document.body.removeChild( img ); |
|
} |
|
|
|
var w = imgW; |
|
var h = imgH; |
|
|
|
if( getIndexedStyle( node, 'background-width', 'value', index ) !== 'auto' ){ |
|
if( getIndexedStyle( node, 'background-width', 'units', index ) === '%' ){ |
|
w = getIndexedStyle( node, 'background-width', 'pfValue', index ) * nodeTW; |
|
} else { |
|
w = getIndexedStyle( node, 'background-width', 'pfValue', index ); |
|
} |
|
} |
|
|
|
if( getIndexedStyle( node, 'background-height', 'value', index ) !== 'auto' ){ |
|
if( getIndexedStyle( node, 'background-height', 'units', index ) === '%' ){ |
|
h = getIndexedStyle( node, 'background-height', 'pfValue', index ) * nodeTH; |
|
} else { |
|
h = getIndexedStyle( node, 'background-height', 'pfValue', index ); |
|
} |
|
} |
|
|
|
if( w === 0 || h === 0 ){ |
|
return; |
|
} |
|
|
|
if( fit === 'contain' ){ |
|
var scale = Math.min( nodeTW / w, nodeTH / h ); |
|
|
|
w *= scale; |
|
h *= scale; |
|
|
|
} else if( fit === 'cover' ){ |
|
var scale = Math.max( nodeTW / w, nodeTH / h ); |
|
|
|
w *= scale; |
|
h *= scale; |
|
} |
|
|
|
var x = (nodeX - nodeTW / 2); |
|
var posXUnits = getIndexedStyle( node, 'background-position-x', 'units', index ); |
|
var posXPfVal = getIndexedStyle( node, 'background-position-x', 'pfValue', index ); |
|
if( posXUnits === '%' ){ |
|
x += (nodeTW - w) * posXPfVal; |
|
} else { |
|
x += posXPfVal; |
|
} |
|
|
|
var offXUnits = getIndexedStyle( node, 'background-offset-x', 'units', index ); |
|
var offXPfVal = getIndexedStyle( node, 'background-offset-x', 'pfValue', index ); |
|
if( offXUnits === '%' ){ |
|
x += (nodeTW - w) * offXPfVal; |
|
} else { |
|
x += offXPfVal; |
|
} |
|
|
|
var y = (nodeY - nodeTH / 2); |
|
var posYUnits = getIndexedStyle( node, 'background-position-y', 'units', index ); |
|
var posYPfVal = getIndexedStyle( node, 'background-position-y', 'pfValue', index ); |
|
if( posYUnits === '%' ){ |
|
y += (nodeTH - h) * posYPfVal; |
|
} else { |
|
y += posYPfVal; |
|
} |
|
|
|
var offYUnits = getIndexedStyle( node, 'background-offset-y', 'units', index ); |
|
var offYPfVal = getIndexedStyle( node, 'background-offset-y', 'pfValue', index ); |
|
if( offYUnits === '%' ){ |
|
y += (nodeTH - h) * offYPfVal; |
|
} else { |
|
y += offYPfVal; |
|
} |
|
|
|
if( rs.pathCache ){ |
|
x -= nodeX; |
|
y -= nodeY; |
|
|
|
nodeX = 0; |
|
nodeY = 0; |
|
} |
|
|
|
var gAlpha = context.globalAlpha; |
|
|
|
context.globalAlpha = imgOpacity; |
|
|
|
var smoothingEnabled = r.getImgSmoothing( context ); |
|
var isSmoothingSwitched = false; |
|
|
|
if( smooth === 'no' && smoothingEnabled ){ |
|
r.setImgSmoothing( context, false ); |
|
isSmoothingSwitched = true; |
|
} else if( smooth === 'yes' && !smoothingEnabled ){ |
|
r.setImgSmoothing( context, true ); |
|
isSmoothingSwitched = true; |
|
} |
|
|
|
if( repeat === 'no-repeat' ){ |
|
|
|
if( shouldClip ){ |
|
context.save(); |
|
|
|
if( rs.pathCache ){ |
|
context.clip( rs.pathCache ); |
|
} else { |
|
r.nodeShapes[ r.getNodeShape( node ) ].draw( |
|
context, |
|
nodeX, nodeY, |
|
nodeTW, nodeTH, |
|
cornerRadius, rs ); |
|
|
|
context.clip(); |
|
} |
|
} |
|
|
|
r.safeDrawImage( context, img, 0, 0, imgW, imgH, x, y, w, h ); |
|
|
|
if( shouldClip ){ |
|
context.restore(); |
|
} |
|
} else { |
|
var pattern = context.createPattern( img, repeat ); |
|
context.fillStyle = pattern; |
|
|
|
r.nodeShapes[ r.getNodeShape( node ) ].draw( |
|
context, |
|
nodeX, nodeY, |
|
nodeTW, nodeTH, cornerRadius, rs); |
|
|
|
context.translate( x, y ); |
|
context.fill(); |
|
context.translate( -x, -y ); |
|
} |
|
|
|
context.globalAlpha = gAlpha; |
|
|
|
if( isSmoothingSwitched ){ r.setImgSmoothing( context, smoothingEnabled ); } |
|
}; |
|
|
|
export default CRp; |
|
|