function ISolidElement(data,parentContainer,globalData, placeholder){
    this.parent.constructor.call(this,data,parentContainer,globalData, placeholder);
}
createElement(BaseElement, ISolidElement);

ISolidElement.prototype.createElements = function(){
    this.parent.createElements.call(this);

    var rect = document.createElementNS(svgNS,'rect');
    rect.setAttribute('width',this.data.sw);
    rect.setAttribute('height',this.data.sh);
    /*rect.setAttribute('width',1);
    rect.setAttribute('height',1);*/
    rect.setAttribute('fill',this.data.sc);
    if(this.layerElement === this.parentContainer){
        this.appendNodeToParent(rect);
    }else{
        this.layerElement.appendChild(rect);
    }
    this.rectElement = rect;
};

ISolidElement.prototype.hide = function(){
    if(!this.hidden){
        this.rectElement.setAttribute('visibility','hidden');
        this.hidden = true;
    }
};

ISolidElement.prototype.renderFrame = function(num,parentMatrix){
    var renderParent = this.parent.renderFrame.call(this,num,parentMatrix);
    if(renderParent===false){
        this.hide();
        return;
    }
    if(this.hidden){
        this.hidden = false;
        this.rectElement.setAttribute('visibility', 'visible');
    }
    if(!this.data.hasMask){
        if(!this.renderedFrames[this.globalData.frameNum]){
            var tr = 'matrix('+this.finalTransform.mat.props.join(',')+')';
            if(this.lastData && this.lastData.tr === tr && this.lastData.o === this.finalTransform.opacity){
                this.renderedFrames[this.globalData.frameNum] = this.lastData;
            }else{
                this.renderedFrames[this.globalData.frameNum] = new RenderedFrame(tr,this.finalTransform.opacity);
            }
        }
        var renderedFrameData = this.renderedFrames[this.globalData.frameNum];
        if(this.lastData.tr != renderedFrameData.tr){
            this.rectElement.setAttribute('transform',renderedFrameData.tr);
        }
        if(this.lastData.o !== renderedFrameData.o){
            this.rectElement.setAttribute('opacity',renderedFrameData.o);
        }
        this.lastData = renderedFrameData;
    }
};

ICompElement.prototype.destroy = function(){
    this.parent.destroy.call();
    this.rectElement = null;
};