import { RADIAN_TO_DEGREE, retrieve2, logError, isFunction } from '../core/util.js'; 
 | 
import { parse } from '../tool/color.js'; 
 | 
import env from '../core/env.js'; 
 | 
var mathRound = Math.round; 
 | 
export function normalizeColor(color) { 
 | 
    var opacity; 
 | 
    if (!color || color === 'transparent') { 
 | 
        color = 'none'; 
 | 
    } 
 | 
    else if (typeof color === 'string' && color.indexOf('rgba') > -1) { 
 | 
        var arr = parse(color); 
 | 
        if (arr) { 
 | 
            color = 'rgb(' + arr[0] + ',' + arr[1] + ',' + arr[2] + ')'; 
 | 
            opacity = arr[3]; 
 | 
        } 
 | 
    } 
 | 
    return { 
 | 
        color: color, 
 | 
        opacity: opacity == null ? 1 : opacity 
 | 
    }; 
 | 
} 
 | 
var EPSILON = 1e-4; 
 | 
export function isAroundZero(transform) { 
 | 
    return transform < EPSILON && transform > -EPSILON; 
 | 
} 
 | 
export function round3(transform) { 
 | 
    return mathRound(transform * 1e3) / 1e3; 
 | 
} 
 | 
export function round4(transform) { 
 | 
    return mathRound(transform * 1e4) / 1e4; 
 | 
} 
 | 
export function round1(transform) { 
 | 
    return mathRound(transform * 10) / 10; 
 | 
} 
 | 
export function getMatrixStr(m) { 
 | 
    return 'matrix(' 
 | 
        + round3(m[0]) + ',' 
 | 
        + round3(m[1]) + ',' 
 | 
        + round3(m[2]) + ',' 
 | 
        + round3(m[3]) + ',' 
 | 
        + round4(m[4]) + ',' 
 | 
        + round4(m[5]) 
 | 
        + ')'; 
 | 
} 
 | 
export var TEXT_ALIGN_TO_ANCHOR = { 
 | 
    left: 'start', 
 | 
    right: 'end', 
 | 
    center: 'middle', 
 | 
    middle: 'middle' 
 | 
}; 
 | 
export function adjustTextY(y, lineHeight, textBaseline) { 
 | 
    if (textBaseline === 'top') { 
 | 
        y += lineHeight / 2; 
 | 
    } 
 | 
    else if (textBaseline === 'bottom') { 
 | 
        y -= lineHeight / 2; 
 | 
    } 
 | 
    return y; 
 | 
} 
 | 
export function hasShadow(style) { 
 | 
    return style 
 | 
        && (style.shadowBlur || style.shadowOffsetX || style.shadowOffsetY); 
 | 
} 
 | 
export function getShadowKey(displayable) { 
 | 
    var style = displayable.style; 
 | 
    var globalScale = displayable.getGlobalScale(); 
 | 
    return [ 
 | 
        style.shadowColor, 
 | 
        (style.shadowBlur || 0).toFixed(2), 
 | 
        (style.shadowOffsetX || 0).toFixed(2), 
 | 
        (style.shadowOffsetY || 0).toFixed(2), 
 | 
        globalScale[0], 
 | 
        globalScale[1] 
 | 
    ].join(','); 
 | 
} 
 | 
export function getClipPathsKey(clipPaths) { 
 | 
    var key = []; 
 | 
    if (clipPaths) { 
 | 
        for (var i = 0; i < clipPaths.length; i++) { 
 | 
            var clipPath = clipPaths[i]; 
 | 
            key.push(clipPath.id); 
 | 
        } 
 | 
    } 
 | 
    return key.join(','); 
 | 
} 
 | 
export function isImagePattern(val) { 
 | 
    return val && (!!val.image); 
 | 
} 
 | 
export function isSVGPattern(val) { 
 | 
    return val && (!!val.svgElement); 
 | 
} 
 | 
export function isPattern(val) { 
 | 
    return isImagePattern(val) || isSVGPattern(val); 
 | 
} 
 | 
export function isLinearGradient(val) { 
 | 
    return val.type === 'linear'; 
 | 
} 
 | 
export function isRadialGradient(val) { 
 | 
    return val.type === 'radial'; 
 | 
} 
 | 
export function isGradient(val) { 
 | 
    return val && (val.type === 'linear' 
 | 
        || val.type === 'radial'); 
 | 
} 
 | 
export function getIdURL(id) { 
 | 
    return "url(#" + id + ")"; 
 | 
} 
 | 
export function getPathPrecision(el) { 
 | 
    var scale = el.getGlobalScale(); 
 | 
    var size = Math.max(scale[0], scale[1]); 
 | 
    return Math.max(Math.ceil(Math.log(size) / Math.log(10)), 1); 
 | 
} 
 | 
export function getSRTTransformString(transform) { 
 | 
    var x = transform.x || 0; 
 | 
    var y = transform.y || 0; 
 | 
    var rotation = (transform.rotation || 0) * RADIAN_TO_DEGREE; 
 | 
    var scaleX = retrieve2(transform.scaleX, 1); 
 | 
    var scaleY = retrieve2(transform.scaleY, 1); 
 | 
    var skewX = transform.skewX || 0; 
 | 
    var skewY = transform.skewY || 0; 
 | 
    var res = []; 
 | 
    if (x || y) { 
 | 
        res.push("translate(" + x + "px," + y + "px)"); 
 | 
    } 
 | 
    if (rotation) { 
 | 
        res.push("rotate(" + rotation + ")"); 
 | 
    } 
 | 
    if (scaleX !== 1 || scaleY !== 1) { 
 | 
        res.push("scale(" + scaleX + "," + scaleY + ")"); 
 | 
    } 
 | 
    if (skewX || skewY) { 
 | 
        res.push("skew(" + mathRound(skewX * RADIAN_TO_DEGREE) + "deg, " + mathRound(skewY * RADIAN_TO_DEGREE) + "deg)"); 
 | 
    } 
 | 
    return res.join(' '); 
 | 
} 
 | 
export var encodeBase64 = (function () { 
 | 
    if (env.hasGlobalWindow && isFunction(window.btoa)) { 
 | 
        return function (str) { 
 | 
            return window.btoa(unescape(encodeURIComponent(str))); 
 | 
        }; 
 | 
    } 
 | 
    if (typeof Buffer !== 'undefined') { 
 | 
        return function (str) { 
 | 
            return Buffer.from(str).toString('base64'); 
 | 
        }; 
 | 
    } 
 | 
    return function (str) { 
 | 
        if (process.env.NODE_ENV !== 'production') { 
 | 
            logError('Base64 isn\'t natively supported in the current environment.'); 
 | 
        } 
 | 
        return null; 
 | 
    }; 
 | 
})(); 
 |