/** * @private * Adds hit testing methods to the Ext.draw.sprite.Path sprite. * Included by the Ext.draw.PathUtil. */Ext.define('Ext.draw.overrides.hittest.sprite.Path', { override: 'Ext.draw.sprite.Path', requires: ['Ext.draw.Color'], /** * Tests whether the given point is inside the path. * @param x * @param y * @return {Boolean} * @member Ext.draw.sprite.Path */ isPointInPath: function(x, y) { var attr = this.attr, path, matrix, params, result; if (attr.fillStyle === Ext.util.Color.RGBA_NONE) { return this.isPointOnPath(x, y); } path = attr.path; matrix = attr.matrix; if (!matrix.isIdentity()) { params = path.params.slice(0); path.transform(attr.matrix); } result = path.isPointInPath(x, y); if (params) { path.params = params; } return result; }, /** * Tests whether the given point is on the path. * @param x * @param y * @return {Boolean} * @member Ext.draw.sprite.Path */ isPointOnPath: function(x, y) { var attr = this.attr, path = attr.path, matrix = attr.matrix, params, result; if (!matrix.isIdentity()) { params = path.params.slice(0); path.transform(attr.matrix); } result = path.isPointOnPath(x, y); if (params) { path.params = params; } return result; }, /** * @method hitTest * @inheritdoc Ext.draw.Surface#method-hitTest */ hitTest: function(point, options) { var me = this, attr = me.attr, path = attr.path, matrix = attr.matrix, x = point[0], y = point[1], parentResult = me.callParent([point, options]), result = null, params, isFilled; if (!parentResult) { // The sprite is not visible or bounding box wasn't hit. return result; } options = options || Ext.draw.sprite.Sprite.defaultHitTestOptions; if (!matrix.isIdentity()) { params = path.params.slice(0); path.transform(attr.matrix); } if (options.fill && options.stroke) { isFilled = attr.fillStyle !== Ext.util.Color.NONE && attr.fillStyle !== Ext.util.Color.RGBA_NONE; if (isFilled) { if (path.isPointInPath(x, y)) { result = { sprite: me }; } } else { if (path.isPointInPath(x, y) || path.isPointOnPath(x, y)) { result = { sprite: me }; } } } else if (options.stroke && !options.fill) { if (path.isPointOnPath(x, y)) { result = { sprite: me }; } } else if (options.fill && !options.stroke) { if (path.isPointInPath(x, y)) { result = { sprite: me }; } } if (params) { path.params = params; } return result; }, /** * Returns all points where this sprite intersects the given sprite. * The given sprite must be an instance of the {@link Ext.draw.sprite.Path} class * or its subclass. * @param path * @return {Array} * @member Ext.draw.sprite.Path */ getIntersections: function(path) { if (!(path.isSprite && path.isPath)) { return []; } // eslint-disable-next-line vars-on-top var aAttr = this.attr, bAttr = path.attr, aPath = aAttr.path, bPath = bAttr.path, aMatrix = aAttr.matrix, bMatrix = bAttr.matrix, aParams, bParams, intersections; if (!aMatrix.isIdentity()) { aParams = aPath.params.slice(0); aPath.transform(aAttr.matrix); } if (!bMatrix.isIdentity()) { bParams = bPath.params.slice(0); bPath.transform(bAttr.matrix); } intersections = aPath.getIntersections(bPath); if (aParams) { aPath.params = aParams; } if (bParams) { bPath.params = bParams; } return intersections; }});