|   | 
| /* | 
| * Licensed to the Apache Software Foundation (ASF) under one | 
| * or more contributor license agreements.  See the NOTICE file | 
| * distributed with this work for additional information | 
| * regarding copyright ownership.  The ASF licenses this file | 
| * to you under the Apache License, Version 2.0 (the | 
| * "License"); you may not use this file except in compliance | 
| * with the License.  You may obtain a copy of the License at | 
| * | 
| *   http://www.apache.org/licenses/LICENSE-2.0 | 
| * | 
| * Unless required by applicable law or agreed to in writing, | 
| * software distributed under the License is distributed on an | 
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
| * KIND, either express or implied.  See the License for the | 
| * specific language governing permissions and limitations | 
| * under the License. | 
| */ | 
|   | 
|   | 
| /** | 
|  * AUTO-GENERATED FILE. DO NOT MODIFY. | 
|  */ | 
|   | 
| /* | 
| * Licensed to the Apache Software Foundation (ASF) under one | 
| * or more contributor license agreements.  See the NOTICE file | 
| * distributed with this work for additional information | 
| * regarding copyright ownership.  The ASF licenses this file | 
| * to you under the Apache License, Version 2.0 (the | 
| * "License"); you may not use this file except in compliance | 
| * with the License.  You may obtain a copy of the License at | 
| * | 
| *   http://www.apache.org/licenses/LICENSE-2.0 | 
| * | 
| * Unless required by applicable law or agreed to in writing, | 
| * software distributed under the License is distributed on an | 
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
| * KIND, either express or implied.  See the License for the | 
| * specific language governing permissions and limitations | 
| * under the License. | 
| */ | 
| // Symbol factory | 
| import { each, isArray, retrieve2 } from 'zrender/lib/core/util.js'; | 
| import * as graphic from './graphic.js'; | 
| import BoundingRect from 'zrender/lib/core/BoundingRect.js'; | 
| import { calculateTextPosition } from 'zrender/lib/contain/text.js'; | 
| import { parsePercent } from './number.js'; | 
| /** | 
|  * Triangle shape | 
|  * @inner | 
|  */ | 
|   | 
| var Triangle = graphic.Path.extend({ | 
|   type: 'triangle', | 
|   shape: { | 
|     cx: 0, | 
|     cy: 0, | 
|     width: 0, | 
|     height: 0 | 
|   }, | 
|   buildPath: function (path, shape) { | 
|     var cx = shape.cx; | 
|     var cy = shape.cy; | 
|     var width = shape.width / 2; | 
|     var height = shape.height / 2; | 
|     path.moveTo(cx, cy - height); | 
|     path.lineTo(cx + width, cy + height); | 
|     path.lineTo(cx - width, cy + height); | 
|     path.closePath(); | 
|   } | 
| }); | 
| /** | 
|  * Diamond shape | 
|  * @inner | 
|  */ | 
|   | 
| var Diamond = graphic.Path.extend({ | 
|   type: 'diamond', | 
|   shape: { | 
|     cx: 0, | 
|     cy: 0, | 
|     width: 0, | 
|     height: 0 | 
|   }, | 
|   buildPath: function (path, shape) { | 
|     var cx = shape.cx; | 
|     var cy = shape.cy; | 
|     var width = shape.width / 2; | 
|     var height = shape.height / 2; | 
|     path.moveTo(cx, cy - height); | 
|     path.lineTo(cx + width, cy); | 
|     path.lineTo(cx, cy + height); | 
|     path.lineTo(cx - width, cy); | 
|     path.closePath(); | 
|   } | 
| }); | 
| /** | 
|  * Pin shape | 
|  * @inner | 
|  */ | 
|   | 
| var Pin = graphic.Path.extend({ | 
|   type: 'pin', | 
|   shape: { | 
|     // x, y on the cusp | 
|     x: 0, | 
|     y: 0, | 
|     width: 0, | 
|     height: 0 | 
|   }, | 
|   buildPath: function (path, shape) { | 
|     var x = shape.x; | 
|     var y = shape.y; | 
|     var w = shape.width / 5 * 3; // Height must be larger than width | 
|   | 
|     var h = Math.max(w, shape.height); | 
|     var r = w / 2; // Dist on y with tangent point and circle center | 
|   | 
|     var dy = r * r / (h - r); | 
|     var cy = y - h + r + dy; | 
|     var angle = Math.asin(dy / r); // Dist on x with tangent point and circle center | 
|   | 
|     var dx = Math.cos(angle) * r; | 
|     var tanX = Math.sin(angle); | 
|     var tanY = Math.cos(angle); | 
|     var cpLen = r * 0.6; | 
|     var cpLen2 = r * 0.7; | 
|     path.moveTo(x - dx, cy + dy); | 
|     path.arc(x, cy, r, Math.PI - angle, Math.PI * 2 + angle); | 
|     path.bezierCurveTo(x + dx - tanX * cpLen, cy + dy + tanY * cpLen, x, y - cpLen2, x, y); | 
|     path.bezierCurveTo(x, y - cpLen2, x - dx + tanX * cpLen, cy + dy + tanY * cpLen, x - dx, cy + dy); | 
|     path.closePath(); | 
|   } | 
| }); | 
| /** | 
|  * Arrow shape | 
|  * @inner | 
|  */ | 
|   | 
| var Arrow = graphic.Path.extend({ | 
|   type: 'arrow', | 
|   shape: { | 
|     x: 0, | 
|     y: 0, | 
|     width: 0, | 
|     height: 0 | 
|   }, | 
|   buildPath: function (ctx, shape) { | 
|     var height = shape.height; | 
|     var width = shape.width; | 
|     var x = shape.x; | 
|     var y = shape.y; | 
|     var dx = width / 3 * 2; | 
|     ctx.moveTo(x, y); | 
|     ctx.lineTo(x + dx, y + height); | 
|     ctx.lineTo(x, y + height / 4 * 3); | 
|     ctx.lineTo(x - dx, y + height); | 
|     ctx.lineTo(x, y); | 
|     ctx.closePath(); | 
|   } | 
| }); | 
| /** | 
|  * Map of path contructors | 
|  */ | 
| // TODO Use function to build symbol path. | 
|   | 
| var symbolCtors = { | 
|   line: graphic.Line, | 
|   rect: graphic.Rect, | 
|   roundRect: graphic.Rect, | 
|   square: graphic.Rect, | 
|   circle: graphic.Circle, | 
|   diamond: Diamond, | 
|   pin: Pin, | 
|   arrow: Arrow, | 
|   triangle: Triangle | 
| }; | 
| var symbolShapeMakers = { | 
|   line: function (x, y, w, h, shape) { | 
|     shape.x1 = x; | 
|     shape.y1 = y + h / 2; | 
|     shape.x2 = x + w; | 
|     shape.y2 = y + h / 2; | 
|   }, | 
|   rect: function (x, y, w, h, shape) { | 
|     shape.x = x; | 
|     shape.y = y; | 
|     shape.width = w; | 
|     shape.height = h; | 
|   }, | 
|   roundRect: function (x, y, w, h, shape) { | 
|     shape.x = x; | 
|     shape.y = y; | 
|     shape.width = w; | 
|     shape.height = h; | 
|     shape.r = Math.min(w, h) / 4; | 
|   }, | 
|   square: function (x, y, w, h, shape) { | 
|     var size = Math.min(w, h); | 
|     shape.x = x; | 
|     shape.y = y; | 
|     shape.width = size; | 
|     shape.height = size; | 
|   }, | 
|   circle: function (x, y, w, h, shape) { | 
|     // Put circle in the center of square | 
|     shape.cx = x + w / 2; | 
|     shape.cy = y + h / 2; | 
|     shape.r = Math.min(w, h) / 2; | 
|   }, | 
|   diamond: function (x, y, w, h, shape) { | 
|     shape.cx = x + w / 2; | 
|     shape.cy = y + h / 2; | 
|     shape.width = w; | 
|     shape.height = h; | 
|   }, | 
|   pin: function (x, y, w, h, shape) { | 
|     shape.x = x + w / 2; | 
|     shape.y = y + h / 2; | 
|     shape.width = w; | 
|     shape.height = h; | 
|   }, | 
|   arrow: function (x, y, w, h, shape) { | 
|     shape.x = x + w / 2; | 
|     shape.y = y + h / 2; | 
|     shape.width = w; | 
|     shape.height = h; | 
|   }, | 
|   triangle: function (x, y, w, h, shape) { | 
|     shape.cx = x + w / 2; | 
|     shape.cy = y + h / 2; | 
|     shape.width = w; | 
|     shape.height = h; | 
|   } | 
| }; | 
| export var symbolBuildProxies = {}; | 
| each(symbolCtors, function (Ctor, name) { | 
|   symbolBuildProxies[name] = new Ctor(); | 
| }); | 
| var SymbolClz = graphic.Path.extend({ | 
|   type: 'symbol', | 
|   shape: { | 
|     symbolType: '', | 
|     x: 0, | 
|     y: 0, | 
|     width: 0, | 
|     height: 0 | 
|   }, | 
|   calculateTextPosition: function (out, config, rect) { | 
|     var res = calculateTextPosition(out, config, rect); | 
|     var shape = this.shape; | 
|   | 
|     if (shape && shape.symbolType === 'pin' && config.position === 'inside') { | 
|       res.y = rect.y + rect.height * 0.4; | 
|     } | 
|   | 
|     return res; | 
|   }, | 
|   buildPath: function (ctx, shape, inBundle) { | 
|     var symbolType = shape.symbolType; | 
|   | 
|     if (symbolType !== 'none') { | 
|       var proxySymbol = symbolBuildProxies[symbolType]; | 
|   | 
|       if (!proxySymbol) { | 
|         // Default rect | 
|         symbolType = 'rect'; | 
|         proxySymbol = symbolBuildProxies[symbolType]; | 
|       } | 
|   | 
|       symbolShapeMakers[symbolType](shape.x, shape.y, shape.width, shape.height, proxySymbol.shape); | 
|       proxySymbol.buildPath(ctx, proxySymbol.shape, inBundle); | 
|     } | 
|   } | 
| }); // Provide setColor helper method to avoid determine if set the fill or stroke outside | 
|   | 
| function symbolPathSetColor(color, innerColor) { | 
|   if (this.type !== 'image') { | 
|     var symbolStyle = this.style; | 
|   | 
|     if (this.__isEmptyBrush) { | 
|       symbolStyle.stroke = color; | 
|       symbolStyle.fill = innerColor || '#fff'; // TODO Same width with lineStyle in LineView | 
|   | 
|       symbolStyle.lineWidth = 2; | 
|     } else if (this.shape.symbolType === 'line') { | 
|       symbolStyle.stroke = color; | 
|     } else { | 
|       symbolStyle.fill = color; | 
|     } | 
|   | 
|     this.markRedraw(); | 
|   } | 
| } | 
| /** | 
|  * Create a symbol element with given symbol configuration: shape, x, y, width, height, color | 
|  */ | 
|   | 
|   | 
| export function createSymbol(symbolType, x, y, w, h, color, // whether to keep the ratio of w/h, | 
| keepAspect) { | 
|   // TODO Support image object, DynamicImage. | 
|   var isEmpty = symbolType.indexOf('empty') === 0; | 
|   | 
|   if (isEmpty) { | 
|     symbolType = symbolType.substr(5, 1).toLowerCase() + symbolType.substr(6); | 
|   } | 
|   | 
|   var symbolPath; | 
|   | 
|   if (symbolType.indexOf('image://') === 0) { | 
|     symbolPath = graphic.makeImage(symbolType.slice(8), new BoundingRect(x, y, w, h), keepAspect ? 'center' : 'cover'); | 
|   } else if (symbolType.indexOf('path://') === 0) { | 
|     symbolPath = graphic.makePath(symbolType.slice(7), {}, new BoundingRect(x, y, w, h), keepAspect ? 'center' : 'cover'); | 
|   } else { | 
|     symbolPath = new SymbolClz({ | 
|       shape: { | 
|         symbolType: symbolType, | 
|         x: x, | 
|         y: y, | 
|         width: w, | 
|         height: h | 
|       } | 
|     }); | 
|   } | 
|   | 
|   symbolPath.__isEmptyBrush = isEmpty; // TODO Should deprecate setColor | 
|   | 
|   symbolPath.setColor = symbolPathSetColor; | 
|   | 
|   if (color) { | 
|     symbolPath.setColor(color); | 
|   } | 
|   | 
|   return symbolPath; | 
| } | 
| export function normalizeSymbolSize(symbolSize) { | 
|   if (!isArray(symbolSize)) { | 
|     symbolSize = [+symbolSize, +symbolSize]; | 
|   } | 
|   | 
|   return [symbolSize[0] || 0, symbolSize[1] || 0]; | 
| } | 
| export function normalizeSymbolOffset(symbolOffset, symbolSize) { | 
|   if (symbolOffset == null) { | 
|     return; | 
|   } | 
|   | 
|   if (!isArray(symbolOffset)) { | 
|     symbolOffset = [symbolOffset, symbolOffset]; | 
|   } | 
|   | 
|   return [parsePercent(symbolOffset[0], symbolSize[0]) || 0, parsePercent(retrieve2(symbolOffset[1], symbolOffset[0]), symbolSize[1]) || 0]; | 
| } |