function CVShapeItemElement(data,mainFlag,globalData){
    this.lcEnum = {
        '1': 'butt',
        '2': 'round',
        '3': 'butt'
    };
    this.ljEnum = {
        '1': 'miter',
        '2': 'round',
        '3': 'bevel'
    };
    this.data = data;
    this.globalData = globalData;
    this.canvasContext = globalData.canvasContext;
    this.frameNum = -1;
    this.dataLength = this.data.length;
    this.mainFlag = mainFlag;
    this.stylesList = [];
    this.ownStylesList = [];
    this.stylesPool = [];
    this.currentStylePoolPos = 0;
    this.transform = {
        opacity: 1,
        mat: new Matrix()
    };
    this.mat = new Matrix();
    var i,len=this.dataLength-1;
    this.renderedPaths = new Array(this.globalData.totalFrames);
    var styleData;
    for(i=len;i>=0;i-=1){
        if(this.data[i].ty == 'gr'){
            this.data[i].item = new CVShapeItemElement(this.data[i].it,false,this.globalData);
        }else if(this.data[i].ty == 'st' || this.data[i].ty == 'fl'){
            styleData = {
                type:'fill',
                /*path: new BM_Path2D(),*/
                styleOpacity: 0,
                opacity: 0,
                value:'rgba(0,0,0,0)',
                closed: false
            };
            if(this.data[i].ty == 'fl'){
                styleData.type = 'fill';
            }else{
                styleData.type = 'stroke';
                styleData.width = 0;
                styleData.lc = this.lcEnum[this.data[i].lc] || 'round';
                styleData.lj = this.ljEnum[this.data[i].lj] || 'round';
                if(this.data[i].lj == 1) {
                    styleData.ml = this.data[i].ml;
                }
            }
            this.stylesPool.push(styleData);
        }
    }
}

CVShapeItemElement.prototype.drawPaths = function(cacheFlag){
    var stylesList,cache;
    if(cacheFlag){
        cache = [];
        stylesList = this.stylesList;
    }else{
        stylesList = this.renderedPaths[this.globalData.frameNum];
    }
    var i, len = stylesList.length;
    var ctx = this.canvasContext;
    this.globalData.renderer.save();
    for(i=0;i<len;i+=1){
        if(stylesList[i].type == 'stroke'){
            if(stylesList[i].opacity != 1){
                this.globalData.renderer.save();
                this.globalData.renderer.ctxOpacity(stylesList[i].opacity);
                ///ctx.globalAlpha *= stylesList[i].opacity;
            }
            ctx.lineCap = stylesList[i].lc;
            ctx.lineJoin = stylesList[i].lj;
            ctx.miterLimit = stylesList[i].ml;
            ctx.strokeStyle = stylesList[i].value;
            ctx.lineWidth = stylesList[i].width;
            if(stylesList[i].dasharray){
                ctx.setLineDash(stylesList[i].dasharray);
                ctx.lineDashOffset = stylesList[i].dashoffset;
            }else{
                ctx.setLineDash([]);
                ctx.lineDashOffset = 0;
            }
            this.globalData.bmCtx.stroke(stylesList[i].path);
            if(stylesList[i].opacity != 1){
                this.globalData.renderer.restore();
            }
            if(cacheFlag){
                cache.push({
                    type: stylesList[i].type,
                    opacity: stylesList[i].opacity,
                    value: stylesList[i].value,
                    width: stylesList[i].width,
                    path: stylesList[i].path
                });
                if(stylesList[i].dasharray){
                    cache[cache.length-1].dasharray = stylesList[i].dasharray;
                    cache[cache.length-1].dashoffset = stylesList[i].dashoffset;
                }
            }
        }else if(stylesList[i].type == 'fill'){
            if(stylesList[i].opacity != 1){
                this.globalData.renderer.save();
                this.globalData.renderer.ctxOpacity(stylesList[i].opacity);
                ///ctx.globalAlpha *= stylesList[i].opacity;
            }
            ctx.fillStyle = stylesList[i].value;
            this.globalData.bmCtx.fill(stylesList[i].path);
            if(stylesList[i].opacity != 1){
                this.globalData.renderer.restore();
            }
            if(cacheFlag){
                cache.push({
                    type: stylesList[i].type,
                    opacity: stylesList[i].opacity,
                    value: stylesList[i].value,
                    path: stylesList[i].path
                });
            }
        }
    }
    this.globalData.renderer.restore();
    if(cacheFlag){
        //this.renderedPaths[this.globalData.frameNum] = cache;
    }
};

CVShapeItemElement.prototype.prepareFrame = function(num){
    this.frameNum = num;
    var i,len=this.dataLength-1;
    for(i=len;i>=0;i-=1){
        if(this.data[i].ty == 'gr'){
            this.data[i].item.prepareFrame(num);
        }
    }
};

CVShapeItemElement.prototype.renderShape = function(parentTransform,parentStylesList){
    if(this.renderedPaths[this.globalData.frameNum]){
        this.drawPaths(false);
        return;
    }
    this.transform.opacity = 1;
    var i, len;
    this.ownStylesList.length = 0;
    this.currentStylePoolPos = 0;
    if(!parentStylesList){
        this.stylesList.length = 0;
    }else{
        this.stylesList = parentStylesList;
    }
    if(parentTransform){
        this.transform.mat.props[0] = parentTransform.mat.props[0];
        this.transform.mat.props[1] = parentTransform.mat.props[1];
        this.transform.mat.props[2] = parentTransform.mat.props[2];
        this.transform.mat.props[3] = parentTransform.mat.props[3];
        this.transform.mat.props[4] = parentTransform.mat.props[4];
        this.transform.mat.props[5] = parentTransform.mat.props[5];
        this.transform.opacity *= parentTransform.opacity;
    }else{
        this.transform.mat.props[0] = this.transform.mat.props[3] = 1;
        this.transform.mat.props[1] = this.transform.mat.props[2] = this.transform.mat.props[4] = this.transform.mat.props[5] = 0;
    }
    len = this.dataLength - 1;
    for(i=len;i>=0;i-=1){
        if(this.data[i].ty == 'gr'){
            this.data[i].item.renderShape(this.transform,this.stylesList);
        }else if(this.data[i].ty == 'tr'){
            this.renderTransform(this.data[i]);
        }else if(this.data[i].ty == 'sh'){
            this.renderPath(this.data[i]);
        }else if(this.data[i].ty == 'el'){
            this.renderEllipse(this.data[i]);
        }else if(this.data[i].ty == 'rc'){
            if(this.data[i].trimmed){
                this.renderPath(this.data[i]);
            }else{
                this.renderRect(this.data[i]);
            }
        }else if(this.data[i].ty == 'fl'){
            this.renderFill(this.data[i]);
        }else if(this.data[i].ty == 'st'){
            this.renderStroke(this.data[i]);
        }else{
            //console.log(this.data[i].ty);
        }
    }
    if(this.mainFlag){
        this.drawPaths(true);
    }else{
        len = this.ownStylesList.length;
        for(i=0;i<len;i+=1){
            this.ownStylesList[i].closed = true;
        }
    }
};

CVShapeItemElement.prototype.renderTransform = function(animData){
    var tr = animData.renderedData[this.frameNum];
    var matrixValue = tr.m;
    this.transform.mat.transform(matrixValue[0],matrixValue[1],matrixValue[2],matrixValue[3],matrixValue[4],matrixValue[5]).translate(-tr.a[0],-tr.a[1]);
    this.transform.opacity *= tr.o;
};

CVShapeItemElement.prototype.renderPath = function(data){
    if(data.trimmed){
        var ctx = this.canvasContext;
        ctx.lineCap = 'round';
        ctx.lineJoin = 'round';
    }
    var path = data.renderedData[this.frameNum].path;
    var pathNodes = path.pathNodes;
    if(!pathNodes.v){
        return;
    }
    var path2d;
    if(data.lastData && data.lastData.nodes == pathNodes){
        path2d = data.lastData.path;
    }else{
        path2d = new BM_Path2D();
        var i,len = pathNodes.v.length;
        var stops = pathNodes.s ? pathNodes.s : [];
        for(i=1;i<len;i+=1){
            if(stops[i-1]){
                path2d.moveTo(bm_rnd(stops[i-1][0]),bm_rnd(stops[i-1][1]));
                //path2d.moveTo(stops[i-1][0],stops[i-1][1]);
            }else if(i==1){
                path2d.moveTo(bm_rnd(pathNodes.v[0][0]),bm_rnd(pathNodes.v[0][1]));
                //path2d.moveTo(pathNodes.v[0][0],pathNodes.v[0][1]);
            }
            path2d.bezierCurveTo(bm_rnd(pathNodes.o[i-1][0]),bm_rnd(pathNodes.o[i-1][1]),bm_rnd(pathNodes.i[i][0]),bm_rnd(pathNodes.i[i][1]),bm_rnd(pathNodes.v[i][0]),bm_rnd(pathNodes.v[i][1]));
            //path2d.bezierCurveTo(pathNodes.o[i-1][0],pathNodes.o[i-1][1],pathNodes.i[i][0],pathNodes.i[i][1],pathNodes.v[i][0],pathNodes.v[i][1]);
        }
        if(len == 1){
            if(stops[0]){
                path2d.moveTo(bm_rnd(stops[0][0]),bm_rnd(stops[0][1]));
                //path2d.moveTo(stops[0][0],stops[0][1]);
            }else{
                path2d.moveTo(bm_rnd(pathNodes.v[0][0]),bm_rnd(pathNodes.v[0][1]));
                //path2d.moveTo(pathNodes.v[0][0],pathNodes.v[0][1]);
            }
        }
        if(data.closed && !(data.trimmed && !pathNodes.c)){
            path2d.bezierCurveTo(bm_rnd(pathNodes.o[i-1][0]),bm_rnd(pathNodes.o[i-1][1]),bm_rnd(pathNodes.i[0][0]),bm_rnd(pathNodes.i[0][1]),bm_rnd(pathNodes.v[0][0]),bm_rnd(pathNodes.v[0][1]));
            //path2d.bezierCurveTo(pathNodes.o[i-1][0],pathNodes.o[i-1][1],pathNodes.i[0][0],pathNodes.i[0][1],pathNodes.v[0][0],pathNodes.v[0][1]);
        }
        data.lastData = {
            nodes: pathNodes,
            path: path2d
        };
    }
    this.addPathToStyles(path2d);
};

CVShapeItemElement.prototype.renderEllipse = function(animData){
    var path2d = new BM_Path2D();
    var ell = animData.renderedData[this.frameNum];
    path2d.moveTo(ell.p[0]+ell.size[0]/2,ell.p[1]);
    path2d.ellipse(ell.p[0], ell.p[1], ell.size[0]/2, ell.size[1]/2, 0, 0, Math.PI*2, false);
    this.addPathToStyles(path2d);
};

CVShapeItemElement.prototype.renderRect = function(animData){
    var path2d = new BM_Path2D();
    var rect = animData.renderedData[this.frameNum];
    var roundness = rect.roundness;
    if(roundness === 0){
        path2d.rect(rect.position[0] - rect.size[0]/2,rect.position[1] - rect.size[1]/2,rect.size[0],rect.size[1]);
    }else{
        var x = rect.position[0] - rect.size[0]/2;
        var y = rect.position[1] - rect.size[1]/2;
        var w = rect.size[0];
        var h = rect.size[1];
        if(roundness instanceof Array){
            roundness = roundness[0];
        }
        if(roundness > w/2){
            roundness = w/2;
        }
        if(roundness > h/2){
            roundness = h/2;
        }
        path2d.moveTo(x + roundness, y);
        path2d.lineTo(x + w - roundness, y);
        path2d.quadraticCurveTo(x+w, y, x+w, y+roundness);
        path2d.lineTo(x+w, y+h-roundness);
        path2d.quadraticCurveTo(x+w, y+h, x+w-roundness, y+h);
        path2d.lineTo(x+roundness, y+h);
        path2d.quadraticCurveTo(x, y+h, x, y+h-roundness);
        path2d.lineTo(x, y+roundness);
        path2d.quadraticCurveTo(x, y, x+roundness, y);
    }
    this.addPathToStyles(path2d);
};

CVShapeItemElement.prototype.addPathToStyles = function(path2d){
    var i, len = this.stylesList.length;
    var canFill = true, strokeWidth = 0;
    for(i=len-1;i>=0;i-=1){
        if(!this.stylesList[i].closed){
            if(this.stylesList[i].type == 'stroke'){
                if(this.stylesList[i].width > strokeWidth){
                    this.stylesList[i].path.addPath(path2d, this.transform.mat.props);
                }
                if(this.stylesList[i].styleOpacity == 1 && this.stylesList[i].opacity == 1){
                    strokeWidth = this.stylesList[i].width;
                }
            }else if(canFill && this.stylesList[i].type == 'fill'){
                this.stylesList[i].path.addPath(path2d, this.transform.mat.props);
                if(this.stylesList[i].styleOpacity == 1 && this.stylesList[i].opacity == 1){
                    canFill = false;
                }
            }
        }
    }
};

CVShapeItemElement.prototype.renderFill = function(animData){
    var fill = animData.renderedData[this.frameNum];
    if(animData.fillEnabled!==false){
        this.stylesPool[this.currentStylePoolPos].path = new BM_Path2D();
        this.stylesPool[this.currentStylePoolPos].closed = false;
        this.stylesPool[this.currentStylePoolPos].styleOpacity = fill.opacity < 1 ? fill.opacity : 1;
        this.stylesPool[this.currentStylePoolPos].opacity = this.transform.opacity;
        this.stylesPool[this.currentStylePoolPos].value = fill.opacity < 1 ? fillColorToString(fill.color, fill.opacity) : fillColorToString(fill.color);
        this.stylesList.push(this.stylesPool[this.currentStylePoolPos]);
        this.ownStylesList.push(this.stylesList[this.stylesList.length -1]);
        this.currentStylePoolPos += 1;
        return;
    }
    this.stylesList.push(this.stylesPool[this.currentStylePoolPos]);
    this.ownStylesList.push(this.stylesList[this.stylesList.length -1]);
    this.currentStylePoolPos += 1;
};

CVShapeItemElement.prototype.renderStroke = function(animData){
    var stroke = animData.renderedData[this.frameNum];
    if(this.data.strokeEnabled!==false){
        this.stylesPool[this.currentStylePoolPos].path = new BM_Path2D();
        this.stylesPool[this.currentStylePoolPos].closed = false;
        this.stylesPool[this.currentStylePoolPos].styleOpacity = stroke.opacity < 1 ? stroke.opacity : 1;
        this.stylesPool[this.currentStylePoolPos].width = stroke.width;
        this.stylesPool[this.currentStylePoolPos].opacity = this.transform.opacity;
        this.stylesPool[this.currentStylePoolPos].value = stroke.opacity < 1 ? fillColorToString(stroke.color, stroke.opacity) : fillColorToString(stroke.color);

        if(stroke.dashes){
            var d = stroke.dashes;
            var j, jLen = d.length;
            var dasharray = [];
            var dashoffset = '';
            for(j=0;j<jLen;j+=1){
                if(d[j].n != 'o'){
                    dasharray.push(d[j].v);
                }else{
                    dashoffset = d[j].v;
                }
            }
            this.stylesPool[this.currentStylePoolPos].dasharray = dasharray;
            this.stylesPool[this.currentStylePoolPos].dashoffset = dashoffset;
        }
        this.stylesList.push(this.stylesPool[this.currentStylePoolPos]);
        this.ownStylesList.push(this.stylesList[this.stylesList.length -1]);
        this.currentStylePoolPos += 1;
        return;
    }
    this.stylesList.push(this.stylesPool[this.currentStylePoolPos]);
    this.ownStylesList.push(this.stylesList[this.stylesList.length -1]);
    this.currentStylePoolPos += 1;
};

CVShapeItemElement.prototype.destroy = function(){
    this.data = null;
    this.globalData = null;
    this.canvasContext = null;
};