import{equals}from"../../array.js";import{asColorLike}from"../../colorlike.js";import{intersects}from"../../extent.js";import GeometryType from"../../geom/GeometryType.js";import{transformGeom2D}from"../../geom/SimpleGeometry.js";import{transform2D}from"../../geom/flat/transform.js";import VectorContext from"../VectorContext.js";import{defaultTextAlign,defaultFillStyle,defaultLineCap,defaultLineDash,defaultLineDashOffset,defaultLineJoin,defaultLineWidth,defaultMiterLimit,defaultStrokeStyle,defaultTextBaseline,defaultFont}from"../canvas.js";import{create as createTransform,compose as composeTransform}from"../../transform.js";class CanvasImmediateRenderer extends VectorContext{constructor(t,e,i,s,a,l,o){super(),this.context_=t,this.pixelRatio_=e,this.extent_=i,this.transform_=s,this.viewRotation_=a,this.squaredTolerance_=l,this.userTransform_=o,this.contextFillState_=null,this.contextStrokeState_=null,this.contextTextState_=null,this.fillState_=null,this.strokeState_=null,this.image_=null,this.imageAnchorX_=0,this.imageAnchorY_=0,this.imageHeight_=0,this.imageOpacity_=0,this.imageOriginX_=0,this.imageOriginY_=0,this.imageRotateWithView_=!1,this.imageRotation_=0,this.imageScale_=0,this.imageWidth_=0,this.text_="",this.textOffsetX_=0,this.textOffsetY_=0,this.textRotateWithView_=!1,this.textRotation_=0,this.textScale_=0,this.textFillState_=null,this.textStrokeState_=null,this.textState_=null,this.pixelCoordinates_=[],this.tmpLocalTransform_=createTransform()}drawImages_(t,e,s,i){if(this.image_){var a=transform2D(t,e,s,2,this.transform_,this.pixelCoordinates_);const _=this.context_;var l=this.tmpLocalTransform_,t=_.globalAlpha;1!=this.imageOpacity_&&(_.globalAlpha=t*this.imageOpacity_);let i=this.imageRotation_;this.imageRotateWithView_&&(i+=this.viewRotation_);for(let t=0,e=a.length;t<e;t+=2){var o,n,r=a[t]-this.imageAnchorX_,h=a[t+1]-this.imageAnchorY_;0===i&&1==this.imageScale_||(o=r+this.imageAnchorX_,n=h+this.imageAnchorY_,composeTransform(l,o,n,this.imageScale_,this.imageScale_,i,-o,-n),_.setTransform.apply(_,l)),_.drawImage(this.image_,this.imageOriginX_,this.imageOriginY_,this.imageWidth_,this.imageHeight_,r,h,this.imageWidth_,this.imageHeight_)}0===i&&1==this.imageScale_||_.setTransform(1,0,0,1,0,0),1!=this.imageOpacity_&&(_.globalAlpha=t)}}drawText_(e,i,s,a){if(this.textState_&&""!==this.text_){this.textFillState_&&this.setContextFillState_(this.textFillState_),this.textStrokeState_&&this.setContextStrokeState_(this.textStrokeState_),this.setContextTextState_(this.textState_);var l=transform2D(e,i,s,a,this.transform_,this.pixelCoordinates_);const h=this.context_;let t=this.textRotation_;for(this.textRotateWithView_&&(t+=this.viewRotation_);i<s;i+=a){var o,n=l[i]+this.textOffsetX_,r=l[i+1]+this.textOffsetY_;0===t&&1==this.textScale_||(o=composeTransform(this.tmpLocalTransform_,n,r,this.textScale_,this.textScale_,t,-n,-r),h.setTransform.apply(h,o)),this.textStrokeState_&&h.strokeText(this.text_,n,r),this.textFillState_&&h.fillText(this.text_,n,r)}0===t&&1==this.textScale_||h.setTransform(1,0,0,1,0,0)}}moveToLineTo_(t,e,i,s,a){const l=this.context_;var o=transform2D(t,e,i,s,this.transform_,this.pixelCoordinates_);l.moveTo(o[0],o[1]);let n=o.length;a&&(n-=2);for(let t=2;t<n;t+=2)l.lineTo(o[t],o[t+1]);return a&&l.closePath(),i}drawRings_(i,s,a,l){for(let t=0,e=a.length;t<e;++t)s=this.moveToLineTo_(i,s,a[t],l,!0);return s}drawCircle(t){if(intersects(this.extent_,t.getExtent())){if(this.fillState_||this.strokeState_){this.fillState_&&this.setContextFillState_(this.fillState_),this.strokeState_&&this.setContextStrokeState_(this.strokeState_);var e=transformGeom2D(t,this.transform_,this.pixelCoordinates_),i=e[2]-e[0],s=e[3]-e[1],i=Math.sqrt(i*i+s*s);const a=this.context_;a.beginPath(),a.arc(e[0],e[1],i,0,2*Math.PI),this.fillState_&&a.fill(),this.strokeState_&&a.stroke()}""!==this.text_&&this.drawText_(t.getCenter(),0,2,2)}}setStyle(t){this.setFillStrokeStyle(t.getFill(),t.getStroke()),this.setImageStyle(t.getImage()),this.setTextStyle(t.getText())}setTransform(t){this.transform_=t}drawGeometry(t){switch(t.getType()){case GeometryType.POINT:this.drawPoint(t);break;case GeometryType.LINE_STRING:this.drawLineString(t);break;case GeometryType.POLYGON:this.drawPolygon(t);break;case GeometryType.MULTI_POINT:this.drawMultiPoint(t);break;case GeometryType.MULTI_LINE_STRING:this.drawMultiLineString(t);break;case GeometryType.MULTI_POLYGON:this.drawMultiPolygon(t);break;case GeometryType.GEOMETRY_COLLECTION:this.drawGeometryCollection(t);break;case GeometryType.CIRCLE:this.drawCircle(t)}}drawFeature(t,e){const i=e.getGeometryFunction()(t);i&&intersects(this.extent_,i.getExtent())&&(this.setStyle(e),this.drawGeometry(i))}drawGeometryCollection(t){var i=t.getGeometriesArray();for(let t=0,e=i.length;t<e;++t)this.drawGeometry(i[t])}drawPoint(t){var e=(t=this.squaredTolerance_?t.simplifyTransformed(this.squaredTolerance_,this.userTransform_):t).getFlatCoordinates(),t=t.getStride();this.image_&&this.drawImages_(e,0,e.length,t),""!==this.text_&&this.drawText_(e,0,e.length,t)}drawMultiPoint(t){var e=(t=this.squaredTolerance_?t.simplifyTransformed(this.squaredTolerance_,this.userTransform_):t).getFlatCoordinates(),t=t.getStride();this.image_&&this.drawImages_(e,0,e.length,t),""!==this.text_&&this.drawText_(e,0,e.length,t)}drawLineString(t){if(this.squaredTolerance_&&(t=t.simplifyTransformed(this.squaredTolerance_,this.userTransform_)),intersects(this.extent_,t.getExtent())){if(this.strokeState_){this.setContextStrokeState_(this.strokeState_);const i=this.context_;var e=t.getFlatCoordinates();i.beginPath(),this.moveToLineTo_(e,0,e.length,t.getStride(),!1),i.stroke()}""!==this.text_&&(e=t.getFlatMidpoint(),this.drawText_(e,0,2,2))}}drawMultiLineString(t){var e=(t=this.squaredTolerance_?t.simplifyTransformed(this.squaredTolerance_,this.userTransform_):t).getExtent();if(intersects(this.extent_,e)){if(this.strokeState_){this.setContextStrokeState_(this.strokeState_);const o=this.context_;var s=t.getFlatCoordinates();let i=0;var a=t.getEnds(),l=t.getStride();o.beginPath();for(let t=0,e=a.length;t<e;++t)i=this.moveToLineTo_(s,i,a[t],l,!1);o.stroke()}""!==this.text_&&(e=t.getFlatMidpoints(),this.drawText_(e,0,e.length,2))}}drawPolygon(t){if(this.squaredTolerance_&&(t=t.simplifyTransformed(this.squaredTolerance_,this.userTransform_)),intersects(this.extent_,t.getExtent())){if(this.strokeState_||this.fillState_){this.fillState_&&this.setContextFillState_(this.fillState_),this.strokeState_&&this.setContextStrokeState_(this.strokeState_);const e=this.context_;e.beginPath(),this.drawRings_(t.getOrientedFlatCoordinates(),0,t.getEnds(),t.getStride()),this.fillState_&&e.fill(),this.strokeState_&&e.stroke()}""!==this.text_&&(t=t.getFlatInteriorPoint(),this.drawText_(t,0,2,2))}}drawMultiPolygon(t){if(this.squaredTolerance_&&(t=t.simplifyTransformed(this.squaredTolerance_,this.userTransform_)),intersects(this.extent_,t.getExtent())){if(this.strokeState_||this.fillState_){this.fillState_&&this.setContextFillState_(this.fillState_),this.strokeState_&&this.setContextStrokeState_(this.strokeState_);const e=this.context_;var s=t.getOrientedFlatCoordinates();let i=0;var a=t.getEndss(),l=t.getStride();e.beginPath();for(let t=0,e=a.length;t<e;++t){var o=a[t];i=this.drawRings_(s,i,o,l)}this.fillState_&&e.fill(),this.strokeState_&&e.stroke()}""!==this.text_&&(t=t.getFlatInteriorPoints(),this.drawText_(t,0,t.length,2))}}setContextFillState_(t){const e=this.context_,i=this.contextFillState_;i?i.fillStyle!=t.fillStyle&&(i.fillStyle=t.fillStyle,e.fillStyle=t.fillStyle):(e.fillStyle=t.fillStyle,this.contextFillState_={fillStyle:t.fillStyle})}setContextStrokeState_(t){const e=this.context_,i=this.contextStrokeState_;i?(i.lineCap!=t.lineCap&&(i.lineCap=t.lineCap,e.lineCap=t.lineCap),e.setLineDash&&(equals(i.lineDash,t.lineDash)||e.setLineDash(i.lineDash=t.lineDash),i.lineDashOffset!=t.lineDashOffset&&(i.lineDashOffset=t.lineDashOffset,e.lineDashOffset=t.lineDashOffset)),i.lineJoin!=t.lineJoin&&(i.lineJoin=t.lineJoin,e.lineJoin=t.lineJoin),i.lineWidth!=t.lineWidth&&(i.lineWidth=t.lineWidth,e.lineWidth=t.lineWidth),i.miterLimit!=t.miterLimit&&(i.miterLimit=t.miterLimit,e.miterLimit=t.miterLimit),i.strokeStyle!=t.strokeStyle&&(i.strokeStyle=t.strokeStyle,e.strokeStyle=t.strokeStyle)):(e.lineCap=t.lineCap,e.setLineDash&&(e.setLineDash(t.lineDash),e.lineDashOffset=t.lineDashOffset),e.lineJoin=t.lineJoin,e.lineWidth=t.lineWidth,e.miterLimit=t.miterLimit,e.strokeStyle=t.strokeStyle,this.contextStrokeState_={lineCap:t.lineCap,lineDash:t.lineDash,lineDashOffset:t.lineDashOffset,lineJoin:t.lineJoin,lineWidth:t.lineWidth,miterLimit:t.miterLimit,strokeStyle:t.strokeStyle})}setContextTextState_(t){const e=this.context_,i=this.contextTextState_;var s=t.textAlign||defaultTextAlign;i?(i.font!=t.font&&(i.font=t.font,e.font=t.font),i.textAlign!=s&&(i.textAlign=s,e.textAlign=s),i.textBaseline!=t.textBaseline&&(i.textBaseline=t.textBaseline,e.textBaseline=t.textBaseline)):(e.font=t.font,e.textAlign=s,e.textBaseline=t.textBaseline,this.contextTextState_={font:t.font,textAlign:s,textBaseline:t.textBaseline})}setFillStrokeStyle(t,e){var i,s,a,l,o;t?(t=t.getColor(),this.fillState_={fillStyle:asColorLike(t||defaultFillStyle)}):this.fillState_=null,e?(t=e.getColor(),i=e.getLineCap(),s=e.getLineDash(),a=e.getLineDashOffset(),l=e.getLineJoin(),o=e.getWidth(),e=e.getMiterLimit(),this.strokeState_={lineCap:void 0!==i?i:defaultLineCap,lineDash:s||defaultLineDash,lineDashOffset:a||defaultLineDashOffset,lineJoin:void 0!==l?l:defaultLineJoin,lineWidth:this.pixelRatio_*(void 0!==o?o:defaultLineWidth),miterLimit:void 0!==e?e:defaultMiterLimit,strokeStyle:asColorLike(t||defaultStrokeStyle)}):this.strokeState_=null}setImageStyle(t){var e,i,s,a;t?(e=t.getAnchor(),i=t.getImage(1),s=t.getOrigin(),a=t.getSize(),this.imageAnchorX_=e[0],this.imageAnchorY_=e[1],this.imageHeight_=a[1],this.image_=i,this.imageOpacity_=t.getOpacity(),this.imageOriginX_=s[0],this.imageOriginY_=s[1],this.imageRotateWithView_=t.getRotateWithView(),this.imageRotation_=t.getRotation(),this.imageScale_=t.getScale()*this.pixelRatio_,this.imageWidth_=a[0]):this.image_=null}setTextStyle(t){if(t){const h=t.getFill();h?(n=h.getColor(),this.textFillState_={fillStyle:asColorLike(n||defaultFillStyle)}):this.textFillState_=null;const _=t.getStroke();_?(n=_.getColor(),e=_.getLineCap(),i=_.getLineDash(),s=_.getLineDashOffset(),a=_.getLineJoin(),l=_.getWidth(),o=_.getMiterLimit(),this.textStrokeState_={lineCap:void 0!==e?e:defaultLineCap,lineDash:i||defaultLineDash,lineDashOffset:s||defaultLineDashOffset,lineJoin:void 0!==a?a:defaultLineJoin,lineWidth:void 0!==l?l:defaultLineWidth,miterLimit:void 0!==o?o:defaultMiterLimit,strokeStyle:asColorLike(n||defaultStrokeStyle)}):this.textStrokeState_=null;var e=t.getFont(),i=t.getOffsetX(),s=t.getOffsetY(),a=t.getRotateWithView(),l=t.getRotation(),o=t.getScale(),n=t.getText(),r=t.getTextAlign(),t=t.getTextBaseline();this.textState_={font:void 0!==e?e:defaultFont,textAlign:void 0!==r?r:defaultTextAlign,textBaseline:void 0!==t?t:defaultTextBaseline},this.text_=void 0!==n?n:"",this.textOffsetX_=void 0!==i?this.pixelRatio_*i:0,this.textOffsetY_=void 0!==s?this.pixelRatio_*s:0,this.textRotateWithView_=void 0!==a&&a,this.textRotation_=void 0!==l?l:0,this.textScale_=this.pixelRatio_*(void 0!==o?o:1)}else this.text_=""}}export default CanvasImmediateRenderer;