diff --git a/src/item/HitResult.js b/src/item/HitResult.js index c2fadde5..83eb80e8 100644 --- a/src/item/HitResult.js +++ b/src/item/HitResult.js @@ -27,6 +27,7 @@ var HitResult = Base.extend(/** @lends HitResult# */{ // properties. // This allows the definition of getters too, e.g. for 'pixel'. if (values) { + // Make enumerable so toString() works. values.enumerable = true; this.inject(values); } diff --git a/src/item/Item.js b/src/item/Item.js index 5197f297..5ca8f70e 100644 --- a/src/item/Item.js +++ b/src/item/Item.js @@ -207,8 +207,8 @@ var Item = Base.extend(Callback, /** @lends Item# */{ var parent = this._parent, project = this._project, symbol = this._parentSymbol; - // Reset _drawCount on each change. - this._drawCount = null; + // Reset _updateCount on each change. + this._updateCount = null; if (flags & /*#=*/ ChangeFlag.GEOMETRY) { // Clear cached bounds and position whenever geometry changes delete this._bounds; @@ -1068,10 +1068,16 @@ var Item = Base.extend(Callback, /** @lends Item# */{ * @bean */ getGlobalMatrix: function() { - // TODO: if drawCount is out of sync, we still need to walk up the chain - // and concatenate the matrices. - return this._drawCount === this._project._drawCount + var matrix = this._updateCount === this._project._updateCount && this._globalMatrix || null; + // If _updateCount is out of sync or no _globalMatrix was calculated + // when rendering, iteratively calculate it now. + if (!matrix) { + matrix = this._globalMatrix = item._matrix.clone(); + if (this._parent) + matrix.concatenate(this._parent.getGlobalMatrix()); + } + return matrix; }, /** @@ -2719,7 +2725,7 @@ var Item = Base.extend(Callback, /** @lends Item# */{ */ globalToLocal: function(/* point */) { var matrix = this.getGlobalMatrix(); - return matrix && matrix._transformPoint(Point.read(arguments)); + return matrix && matrix._inverseTransform(Point.read(arguments)); }, /** @@ -2731,7 +2737,7 @@ var Item = Base.extend(Callback, /** @lends Item# */{ */ localToGlobal: function(/* point */) { var matrix = this.getGlobalMatrix(); - return matrix && matrix._inverseTransform(Point.read(arguments)); + return matrix && matrix._transformPoint(Point.read(arguments)); }, /** @@ -3321,10 +3327,10 @@ var Item = Base.extend(Callback, /** @lends Item# */{ draw: function(ctx, param) { if (!this._visible || this._opacity === 0) return; - // Each time the project gets drawn, it's _drawCount is increased. - // Keep the _drawCount of drawn items in sync, so we have an easy + // Each time the project gets drawn, it's _updateCount is increased. + // Keep the _updateCount of drawn items in sync, so we have an easy // way to know for which selected items we need to draw selection info. - this._drawCount = this._project._drawCount; + this._updateCount = this._project._updateCount; // Keep calculating the current global matrix, by keeping a history // and pushing / popping as we go along. var trackTransforms = param.trackTransforms, diff --git a/src/project/Project.js b/src/project/Project.js index c9011c99..92743152 100644 --- a/src/project/Project.js +++ b/src/project/Project.js @@ -59,8 +59,8 @@ var Project = PaperScopeItem.extend(/** @lends Project# */{ this.view = view instanceof View ? view : View.create(view); this._selectedItems = {}; this._selectedItemCount = 0; - // See Item#draw() for an explanation of _drawCount - this._drawCount = 0; + // See Item#draw() for an explanation of _updateCount + this._updateCount = 0; // Change tracking, not in use for now. Activate once required: // this._changes = []; // this._changesById = {}; @@ -421,9 +421,9 @@ var Project = PaperScopeItem.extend(/** @lends Project# */{ */ draw: function(ctx, matrix, ratio) { - // Increase the drawCount before the draw-loop. After that, items that - // are visible will have their drawCount set to the new value. - this._drawCount++; + // Increase the _updateCount before the draw-loop. After that, items + // that are visible will have their _updateCount set to the new value. + this._updateCount++; ctx.save(); matrix.applyToContext(ctx); // Use new Base() so we can use param.extend() to easily override @@ -450,7 +450,7 @@ var Project = PaperScopeItem.extend(/** @lends Project# */{ ctx.strokeWidth = 1; for (var id in this._selectedItems) { var item = this._selectedItems[id]; - if (item._drawCount === this._drawCount + if (item._updateCount === this._updateCount && (item._drawSelected || item._boundsSelected)) { // Allow definition of selected color on a per item and per // layer level, with a fallback to #009dec