scrawl-canvas
Version:
Version 8.9.4 - 19 Nov 2022
1,004 lines (671 loc) • 103 kB
HTML
<!DOCTYPE html>
<html>
<head>
<title>Picture factory</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;">
<link rel="stylesheet" media="all" href="../../docco.css" />
</head>
<body>
<div id="container">
<div id="background"></div>
<ul id="jump_to">
<li>
<a class="large" href="javascript:void(0);">Jump To …</a>
<a class="small" href="javascript:void(0);">+</a>
<div id="jump_wrapper">
<div id="jump_page_wrapper">
<div id="jump_page">
<a class="source" href="../core/animationloop.html">
./source/core/animationloop.js
</a>
<a class="source" href="../core/document.html">
./source/core/document.js
</a>
<a class="source" href="../core/events.html">
./source/core/events.js
</a>
<a class="source" href="../core/init.html">
./source/core/init.js
</a>
<a class="source" href="../core/library.html">
./source/core/library.js
</a>
<a class="source" href="../core/random-seed.html">
./source/core/random-seed.js
</a>
<a class="source" href="../core/snippets.html">
./source/core/snippets.js
</a>
<a class="source" href="../core/userInteraction.html">
./source/core/userInteraction.js
</a>
<a class="source" href="../core/utilities.html">
./source/core/utilities.js
</a>
<a class="source" href="action.html">
./source/factory/action.js
</a>
<a class="source" href="anchor.html">
./source/factory/anchor.js
</a>
<a class="source" href="animation.html">
./source/factory/animation.js
</a>
<a class="source" href="bezier.html">
./source/factory/bezier.js
</a>
<a class="source" href="block.html">
./source/factory/block.js
</a>
<a class="source" href="canvas.html">
./source/factory/canvas.js
</a>
<a class="source" href="cell.html">
./source/factory/cell.js
</a>
<a class="source" href="cog.html">
./source/factory/cog.js
</a>
<a class="source" href="color.html">
./source/factory/color.js
</a>
<a class="source" href="conicGradient.html">
./source/factory/conicGradient.js
</a>
<a class="source" href="coordinate.html">
./source/factory/coordinate.js
</a>
<a class="source" href="crescent.html">
./source/factory/crescent.js
</a>
<a class="source" href="element.html">
./source/factory/element.js
</a>
<a class="source" href="emitter.html">
./source/factory/emitter.js
</a>
<a class="source" href="filter.html">
./source/factory/filter.js
</a>
<a class="source" href="filterEngine-bluenoiseData.html">
./source/factory/filterEngine-bluenoiseData.js
</a>
<a class="source" href="filterEngine.html">
./source/factory/filterEngine.js
</a>
<a class="source" href="fontAttributes.html">
./source/factory/fontAttributes.js
</a>
<a class="source" href="gradient.html">
./source/factory/gradient.js
</a>
<a class="source" href="grid.html">
./source/factory/grid.js
</a>
<a class="source" href="group.html">
./source/factory/group.js
</a>
<a class="source" href="imageAsset.html">
./source/factory/imageAsset.js
</a>
<a class="source" href="line.html">
./source/factory/line.js
</a>
<a class="source" href="lineSpiral.html">
./source/factory/lineSpiral.js
</a>
<a class="source" href="loom.html">
./source/factory/loom.js
</a>
<a class="source" href="mesh.html">
./source/factory/mesh.js
</a>
<a class="source" href="net.html">
./source/factory/net.js
</a>
<a class="source" href="noiseAsset.html">
./source/factory/noiseAsset.js
</a>
<a class="source" href="oval.html">
./source/factory/oval.js
</a>
<a class="source" href="palette.html">
./source/factory/palette.js
</a>
<a class="source" href="particle.html">
./source/factory/particle.js
</a>
<a class="source" href="particleForce.html">
./source/factory/particleForce.js
</a>
<a class="source" href="particleHistory.html">
./source/factory/particleHistory.js
</a>
<a class="source" href="particleSpring.html">
./source/factory/particleSpring.js
</a>
<a class="source" href="particleWorld.html">
./source/factory/particleWorld.js
</a>
<a class="source" href="pattern.html">
./source/factory/pattern.js
</a>
<a class="source" href="phrase.html">
./source/factory/phrase.js
</a>
<a class="source" href="picture.html">
./source/factory/picture.js
</a>
<a class="source" href="polygon.html">
./source/factory/polygon.js
</a>
<a class="source" href="polyline.html">
./source/factory/polyline.js
</a>
<a class="source" href="quadratic.html">
./source/factory/quadratic.js
</a>
<a class="source" href="quaternion.html">
./source/factory/quaternion.js
</a>
<a class="source" href="radialGradient.html">
./source/factory/radialGradient.js
</a>
<a class="source" href="rawAsset.html">
./source/factory/rawAsset.js
</a>
<a class="source" href="rdAsset.html">
./source/factory/rdAsset.js
</a>
<a class="source" href="rectangle.html">
./source/factory/rectangle.js
</a>
<a class="source" href="renderAnimation.html">
./source/factory/renderAnimation.js
</a>
<a class="source" href="shape.html">
./source/factory/shape.js
</a>
<a class="source" href="spiral.html">
./source/factory/spiral.js
</a>
<a class="source" href="spriteAsset.html">
./source/factory/spriteAsset.js
</a>
<a class="source" href="stack.html">
./source/factory/stack.js
</a>
<a class="source" href="star.html">
./source/factory/star.js
</a>
<a class="source" href="state.html">
./source/factory/state.js
</a>
<a class="source" href="tetragon.html">
./source/factory/tetragon.js
</a>
<a class="source" href="ticker.html">
./source/factory/ticker.js
</a>
<a class="source" href="tracer.html">
./source/factory/tracer.js
</a>
<a class="source" href="tween.html">
./source/factory/tween.js
</a>
<a class="source" href="unstackedElement.html">
./source/factory/unstackedElement.js
</a>
<a class="source" href="vector.html">
./source/factory/vector.js
</a>
<a class="source" href="videoAsset.html">
./source/factory/videoAsset.js
</a>
<a class="source" href="wheel.html">
./source/factory/wheel.js
</a>
<a class="source" href="../mixin/anchor.html">
./source/mixin/anchor.js
</a>
<a class="source" href="../mixin/asset.html">
./source/mixin/asset.js
</a>
<a class="source" href="../mixin/assetAdvancedFunctionality.html">
./source/mixin/assetAdvancedFunctionality.js
</a>
<a class="source" href="../mixin/assetConsumer.html">
./source/mixin/assetConsumer.js
</a>
<a class="source" href="../mixin/base.html">
./source/mixin/base.js
</a>
<a class="source" href="../mixin/cascade.html">
./source/mixin/cascade.js
</a>
<a class="source" href="../mixin/delta.html">
./source/mixin/delta.js
</a>
<a class="source" href="../mixin/displayShape.html">
./source/mixin/displayShape.js
</a>
<a class="source" href="../mixin/dom.html">
./source/mixin/dom.js
</a>
<a class="source" href="../mixin/entity.html">
./source/mixin/entity.js
</a>
<a class="source" href="../mixin/filter.html">
./source/mixin/filter.js
</a>
<a class="source" href="../mixin/mimic.html">
./source/mixin/mimic.js
</a>
<a class="source" href="../mixin/path.html">
./source/mixin/path.js
</a>
<a class="source" href="../mixin/pattern.html">
./source/mixin/pattern.js
</a>
<a class="source" href="../mixin/pivot.html">
./source/mixin/pivot.js
</a>
<a class="source" href="../mixin/position.html">
./source/mixin/position.js
</a>
<a class="source" href="../mixin/shapeBasic.html">
./source/mixin/shapeBasic.js
</a>
<a class="source" href="../mixin/shapeCurve.html">
./source/mixin/shapeCurve.js
</a>
<a class="source" href="../mixin/shapePathCalculation.html">
./source/mixin/shapePathCalculation.js
</a>
<a class="source" href="../mixin/styles.html">
./source/mixin/styles.js
</a>
<a class="source" href="../mixin/tween.html">
./source/mixin/tween.js
</a>
</div>
</div>
</li>
</ul>
<ul class="sections">
<li id="section-1">
<div class="annotation">
<div class="sswrap ">
<a class="ss" href="#section-1">§</a>
</div>
<h1 id="picture-factory">Picture factory</h1>
<p>Picture entitys are image, video or canvas-based rectangles rendered onto a DOM <canvas> element using the Canvas API’s <a href="https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D">CanvasRenderingContext2D interface</a> - in particular the <a href="https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/drawImage">drawImage</a> method.</p>
<ul>
<li>Positioning and dimensions functionality for the Picture is supplied by the <strong>position</strong> mixin, while rendering functionality comes from the <strong>entity</strong> mixin. </li>
<li>Pictures can use <a href="./imageAsset.html">ImageAsset</a>, <a href="./spriteAsset.html">SpriteAsset</a>, <a href="./videoAsset.html">VideoAsset</a>, or <a href="./cell.html">Cells</a> for the source of the image they display.</li>
<li>Additionally, we can restrict the display to a portion of the source by defining and updating <code>copy</code> attributes.</li>
</ul>
<p>We define the source copy area in a similar way to how we position and dimension the Picture entity on its Cell host, using two additional <a href="./coordinate.html">Coordinate</a> Arrays to hold our data.</p>
<ul>
<li>for both positioning and dimensions, we can define the coordinate in absolute, or relative, terms</li>
<li><strong>absolute</strong> positioning and dimensions - where we give the artefact a Number coordinate measured in pixels. </li>
<li><strong>relative</strong> positioning and dimensions - where we use String percentage coordinates, with <code>['0%', '0%']</code> representing the top left corner of the source, and <code>['100%', '100%']</code> its bottom right corner.</li>
</ul>
<p>Source dimensions are the <em><strong>natural width and height</strong></em> of the image or video</p>
<ul>
<li>The code will check automatically to make sure that any combination of start and dimensions values does not lead to an attempt to copy image data that does not exist (which otherwise throws an error).</li>
<li>Where <code>copyStartX + width</code> values are greater than the source width, the start value will be reduced until the copy frame fits within the bounds of the source dimensions.</li>
<li>Where <code>copyStartY + height</code> values are greater than the source height, the start value will be reduced until the copy frame fits within the bounds of the source dimensions.</li>
</ul>
<p>Loading sources is an asynchronous action. If we attempt to stamp a Picture entity whose source has not yet been fetched or loaded, the Picture will skip its stamp functionality for that Display cycle.</p>
<ul>
<li>Stamping a Picture entity directly, immediately after defining it, will (almost certainly) lead to the image not displaying on the canvas.</li>
<li>For this reason, its best to use Picture entitys inside a Display cycle animation. As soon as the source finishes loading, the Picture entity will display as expected.</li>
</ul>
<p>Also:</p>
<ul>
<li>Pictures can use CSS color Strings for their strokeStyle values, alongside <strong>Gradient</strong>, <strong>RadialGradient</strong>, <strong>Color</strong> and <strong>Pattern</strong> objects. </li>
<li>They will also accept <strong>Filter</strong> objects.</li>
<li>They can use <strong>Anchor</strong> objects for user navigation. </li>
<li>They can be rendered to the canvas by including them in a <strong>Cell</strong> object’s <strong>Group</strong>. </li>
<li>They can be <strong>animated</strong> directly, or using delta animation, or act as the target for <strong>Tween</strong> animations.</li>
<li>Pictures (but not their source assets) can be cloned, and killed.</li>
</ul>
</div>
</li>
<li id="section-2">
<div class="annotation">
<div class="sswrap ">
<a class="ss" href="#section-2">§</a>
</div>
<h4 id="demos">Demos:</h4>
<ul>
<li><a href="../../demo/canvas-008.html">Canvas-008</a> - Picture entity position; manipulate copy attributes</li>
<li><a href="../../demo/canvas-010.html">Canvas-010</a> - Use video sources and media streams for Picture entitys</li>
<li><a href="../../demo/canvas-021.html">Canvas-021</a> - Import and use spritesheets</li>
<li><a href="../../demo/canvas-023.html">Canvas-023</a> - Grid entity - using picture-based assets (image, video, sprite)</li>
<li><a href="../../demo/canvas-024.html">Canvas-024</a> - Loom entity functionality</li>
<li><a href="../../demo/canvas-025.html">Canvas-025</a> - Responsive images</li>
<li><a href="../../demo/packets-002.html">Packets-002</a> - Scrawl-canvas packets - save and load a range of different entitys</li>
</ul>
</div>
</li>
<li id="section-3">
<div class="annotation">
<div class="sswrap ">
<a class="ss" href="#section-3">§</a>
</div>
<h4 id="imports">Imports</h4>
</div>
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">import</span> { constructors, asset, artefact } <span class="hljs-keyword">from</span> <span class="hljs-string">'../core/library.js'</span>;
<span class="hljs-keyword">import</span> { mergeOver, xta, addStrings, pushUnique, removeItem, isa_obj, Ωempty } <span class="hljs-keyword">from</span> <span class="hljs-string">'../core/utilities.js'</span>;
<span class="hljs-keyword">import</span> { gettableVideoAssetAtributes, settableVideoAssetAtributes } <span class="hljs-keyword">from</span> <span class="hljs-string">'./videoAsset.js'</span>;
<span class="hljs-keyword">import</span> { gettableImageAssetAtributes, settableImageAssetAtributes } <span class="hljs-keyword">from</span> <span class="hljs-string">'./imageAsset.js'</span>;
<span class="hljs-keyword">import</span> { stateKeys } <span class="hljs-keyword">from</span> <span class="hljs-string">'./state.js'</span>;
<span class="hljs-keyword">import</span> { makeCoordinate } <span class="hljs-keyword">from</span> <span class="hljs-string">'./coordinate.js'</span>;
<span class="hljs-keyword">import</span> baseMix <span class="hljs-keyword">from</span> <span class="hljs-string">'../mixin/base.js'</span>;
<span class="hljs-keyword">import</span> entityMix <span class="hljs-keyword">from</span> <span class="hljs-string">'../mixin/entity.js'</span>;
<span class="hljs-keyword">import</span> assetConsumerMix <span class="hljs-keyword">from</span> <span class="hljs-string">'../mixin/assetConsumer.js'</span>;</pre></div></div>
</li>
<li id="section-4">
<div class="annotation">
<div class="sswrap ">
<a class="ss" href="#section-4">§</a>
</div>
<h4 id="picture-constructor">Picture constructor</h4>
</div>
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">const</span> <span class="hljs-title class_">Picture</span> = <span class="hljs-keyword">function</span> (<span class="hljs-params">items = Ωempty</span>) {
<span class="hljs-variable language_">this</span>.<span class="hljs-property">copyStart</span> = <span class="hljs-title function_">makeCoordinate</span>();
<span class="hljs-variable language_">this</span>.<span class="hljs-property">currentCopyStart</span> = <span class="hljs-title function_">makeCoordinate</span>();
<span class="hljs-variable language_">this</span>.<span class="hljs-property">copyDimensions</span> = <span class="hljs-title function_">makeCoordinate</span>();
<span class="hljs-variable language_">this</span>.<span class="hljs-property">currentCopyDimensions</span> = <span class="hljs-title function_">makeCoordinate</span>();
<span class="hljs-variable language_">this</span>.<span class="hljs-property">copyArray</span> = [];
<span class="hljs-variable language_">this</span>.<span class="hljs-property">pasteArray</span> = [];
<span class="hljs-variable language_">this</span>.<span class="hljs-title function_">entityInit</span>(items);
<span class="hljs-keyword">if</span> (!items.<span class="hljs-property">copyStart</span>) {
<span class="hljs-keyword">if</span> (!items.<span class="hljs-property">copyStartX</span>) <span class="hljs-variable language_">this</span>.<span class="hljs-property">copyStart</span>[<span class="hljs-number">0</span>] = <span class="hljs-number">0</span>;
<span class="hljs-keyword">if</span> (!items.<span class="hljs-property">copyStartY</span>) <span class="hljs-variable language_">this</span>.<span class="hljs-property">copyStart</span>[<span class="hljs-number">1</span>] = <span class="hljs-number">0</span>;
}
<span class="hljs-keyword">if</span> (!items.<span class="hljs-property">copyDimensions</span>) {
<span class="hljs-keyword">if</span> (!items.<span class="hljs-property">copyWidth</span>) <span class="hljs-variable language_">this</span>.<span class="hljs-property">copyDimensions</span>[<span class="hljs-number">0</span>] = <span class="hljs-number">1</span>;
<span class="hljs-keyword">if</span> (!items.<span class="hljs-property">copyHeight</span>) <span class="hljs-variable language_">this</span>.<span class="hljs-property">copyDimensions</span>[<span class="hljs-number">1</span>] = <span class="hljs-number">1</span>;
}
<span class="hljs-variable language_">this</span>.<span class="hljs-property">imageSubscribers</span> = [];
<span class="hljs-variable language_">this</span>.<span class="hljs-property">dirtyCopyStart</span> = <span class="hljs-literal">true</span>;
<span class="hljs-variable language_">this</span>.<span class="hljs-property">dirtyCopyDimensions</span> = <span class="hljs-literal">true</span>;
<span class="hljs-variable language_">this</span>.<span class="hljs-property">dirtyImage</span> = <span class="hljs-literal">true</span>;
<span class="hljs-keyword">return</span> <span class="hljs-variable language_">this</span>;
};</pre></div></div>
</li>
<li id="section-5">
<div class="annotation">
<div class="sswrap ">
<a class="ss" href="#section-5">§</a>
</div>
<h4 id="picture-prototype">Picture prototype</h4>
</div>
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">let</span> P = <span class="hljs-title class_">Picture</span>.<span class="hljs-property"><span class="hljs-keyword">prototype</span></span> = <span class="hljs-title class_">Object</span>.<span class="hljs-title function_">create</span>(<span class="hljs-title class_">Object</span>.<span class="hljs-property"><span class="hljs-keyword">prototype</span></span>);
P.<span class="hljs-property">type</span> = <span class="hljs-string">'Picture'</span>;
P.<span class="hljs-property">lib</span> = <span class="hljs-string">'entity'</span>;
P.<span class="hljs-property">isArtefact</span> = <span class="hljs-literal">true</span>;
P.<span class="hljs-property">isAsset</span> = <span class="hljs-literal">false</span>;</pre></div></div>
</li>
<li id="section-6">
<div class="annotation">
<div class="sswrap ">
<a class="ss" href="#section-6">§</a>
</div>
<h4 id="mixins">Mixins</h4>
<ul>
<li><a href="../mixin/base.html">base</a></li>
<li><a href="../mixin/entity.html">entity</a></li>
<li><a href="../mixin/assetConsumer.html">assetConsumer</a></li>
</ul>
</div>
<div class="content"><div class='highlight'><pre>P = <span class="hljs-title function_">baseMix</span>(P);
P = <span class="hljs-title function_">entityMix</span>(P);
P = <span class="hljs-title function_">assetConsumerMix</span>(P);</pre></div></div>
</li>
<li id="section-7">
<div class="annotation">
<div class="sswrap ">
<a class="ss" href="#section-7">§</a>
</div>
<h4 id="picture-attributes">Picture attributes</h4>
<ul>
<li>Attributes defined in the <a href="../mixin/base.html">base mixin</a>: <strong>name</strong>.</li>
<li>Attributes defined in the <a href="../mixin/position.html">position mixin</a>: <strong>group, visibility, order, calculateOrder, stampOrder, start, <em>startX</em>, <em>startY</em>, handle, <em>handleX</em>, <em>handleY</em>, offset, <em>offsetX</em>, <em>offsetY</em>, dimensions, <em>width</em>, <em>height</em>, pivoted, mimicked, lockTo, <em>lockXTo</em>, <em>lockYTo</em>, scale, roll, noUserInteraction, noPositionDependencies, noCanvasEngineUpdates, noFilters, noPathUpdates, purge, bringToFrontOnDrag</strong>.</li>
<li>Attributes defined in the <a href="../mixin/delta.html">delta mixin</a>: <strong>delta, noDeltaUpdates</strong>.</li>
<li>Attributes defined in the <a href="../mixin/pivot.html">pivot mixin</a>: <strong>pivot, pivotCorner, addPivotHandle, addPivotOffset, addPivotRotation</strong>.</li>
<li>Attributes defined in the <a href="../mixin/mimic.html">mimic mixin</a>: <strong>mimic, useMimicDimensions, useMimicScale, useMimicStart, useMimicHandle, useMimicOffset, useMimicRotation, useMimicFlip, addOwnDimensionsToMimic, addOwnScaleToMimic, addOwnStartToMimic, addOwnHandleToMimic, addOwnOffsetToMimic, addOwnRotationToMimic</strong>.</li>
<li>Attributes defined in the <a href="../mixin/path.html">path mixin</a>: <strong>path, pathPosition, addPathHandle, addPathOffset, addPathRotation, constantPathSpeed</strong>.</li>
<li>Attributes defined in the <a href="../mixin/entity.html">entity mixin</a>: <strong>method, pathObject, winding, flipReverse, flipUpend, scaleOutline, lockFillStyleToEntity, lockStrokeStyleToEntity, onEnter, onLeave, onDown, onUp, <em>fillStyle, strokeStyle, globalAlpha, globalCompositeOperation, lineWidth, lineCap, lineJoin, lineDash, lineDashOffset, miterLimit, shadowOffsetX, shadowOffsetY, shadowBlur, shadowColor, filter</em></strong>.</li>
<li>Attributes defined in the <a href="../mixin/anchor.html">anchor mixin</a>: <strong>anchor</strong>.</li>
<li>Attributes defined in the <a href="../mixin/filter.html">filter mixin</a>: <strong>filters, isStencil</strong>.</li>
<li>Attributes defined in the <a href="../mixin/assetConsumer.html">assetConsumer mixin</a>: <strong>asset, spriteTrack, imageSource, spriteSource, videoSource, source</strong>.</li>
</ul>
</div>
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">let</span> defaultAttributes = {</pre></div></div>
</li>
<li id="section-8">
<div class="annotation">
<div class="sswrap ">
<a class="ss" href="#section-8">§</a>
</div>
<p><strong>copyStart</strong> - Coordinate array</p>
<ul>
<li>We can use the pseudo-attributes <strong>copyStartX</strong> and <strong>copyStartY</strong> to make working with the Coordinate easier.</li>
</ul>
</div>
<div class="content"><div class='highlight'><pre> <span class="hljs-attr">copyStart</span>: <span class="hljs-literal">null</span>,</pre></div></div>
</li>
<li id="section-9">
<div class="annotation">
<div class="sswrap ">
<a class="ss" href="#section-9">§</a>
</div>
<p><strong>copyDimensions</strong> - Coordinate array</p>
<ul>
<li>We can use the pseudo-attributes <strong>copyWidth</strong> and <strong>copyHeight</strong> to make working with the Coordinate easier.</li>
</ul>
</div>
<div class="content"><div class='highlight'><pre> <span class="hljs-attr">copyDimensions</span>: <span class="hljs-literal">null</span>,</pre></div></div>
</li>
<li id="section-10">
<div class="annotation">
<div class="sswrap ">
<a class="ss" href="#section-10">§</a>
</div>
<p><strong>checkHitIgnoreTransparency</strong> - Boolean - when set, will check the stashedImage data to return whether a coordinate is hitting the image; otherwise checkHit will use the Picture entity’s dimensions to calculate the hit</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="hljs-attr">checkHitIgnoreTransparency</span>: <span class="hljs-literal">false</span>,</pre></div></div>
</li>
<li id="section-11">
<div class="annotation">
<div class="sswrap ">
<a class="ss" href="#section-11">§</a>
</div>
<p><em><strong>Additional attributes and pseudo-attributes</strong></em> are defined in the <a href="../mixin/assetConsumer.html">assetConsumer mixin</a></p>
</div>
<div class="content"><div class='highlight'><pre>};
P.<span class="hljs-property">defs</span> = <span class="hljs-title function_">mergeOver</span>(P.<span class="hljs-property">defs</span>, defaultAttributes);</pre></div></div>
</li>
<li id="section-12">
<div class="annotation">
<div class="sswrap ">
<a class="ss" href="#section-12">§</a>
</div>
<h4 id="packet-management">Packet management</h4>
</div>
<div class="content"><div class='highlight'><pre>P.<span class="hljs-property">packetCoordinates</span> = <span class="hljs-title function_">pushUnique</span>(P.<span class="hljs-property">packetCoordinates</span>, [<span class="hljs-string">'copyStart'</span>, <span class="hljs-string">'copyDimensions'</span>]);
P.<span class="hljs-property">packetObjects</span> = <span class="hljs-title function_">pushUnique</span>(P.<span class="hljs-property">packetObjects</span>, [<span class="hljs-string">'asset'</span>]);</pre></div></div>
</li>
<li id="section-13">
<div class="annotation">
<div class="sswrap ">
<a class="ss" href="#section-13">§</a>
</div>
<h4 id="clone-management">Clone management</h4>
<p>No additional clone functionality required</p>
</div>
</li>
<li id="section-14">
<div class="annotation">
<div class="sswrap ">
<a class="ss" href="#section-14">§</a>
</div>
<h4 id="kill-management">Kill management</h4>
</div>
<div class="content"><div class='highlight'><pre>P.<span class="hljs-property">factoryKill</span> = <span class="hljs-keyword">function</span> (<span class="hljs-params">killAsset = <span class="hljs-literal">false</span></span>) {
<span class="hljs-keyword">let</span> { asset, removeAssetOnKill } = <span class="hljs-variable language_">this</span>;
<span class="hljs-keyword">if</span> (<span class="hljs-title function_">isa_obj</span>(asset)) asset.<span class="hljs-title function_">unsubscribe</span>(<span class="hljs-variable language_">this</span>);</pre></div></div>
</li>
<li id="section-15">
<div class="annotation">
<div class="sswrap ">
<a class="ss" href="#section-15">§</a>
</div>
<p>Cascade kill invocation to the asset object, if required</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (removeAssetOnKill) {
<span class="hljs-keyword">if</span> (removeAssetOnKill.<span class="hljs-property">substring</span>) asset.<span class="hljs-title function_">kill</span>(<span class="hljs-literal">true</span>);
<span class="hljs-keyword">else</span> asset.<span class="hljs-title function_">kill</span>();
}
};</pre></div></div>
</li>
<li id="section-16">
<div class="annotation">
<div class="sswrap ">
<a class="ss" href="#section-16">§</a>
</div>
<h4 id="get-set-deltaset">Get, Set, deltaSet</h4>
</div>
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">let</span> G = P.<span class="hljs-property">getters</span>,
S = P.<span class="hljs-property">setters</span>,
D = P.<span class="hljs-property">deltaSetters</span>;</pre></div></div>
</li>
<li id="section-17">
<div class="annotation">
<div class="sswrap ">
<a class="ss" href="#section-17">§</a>
</div>
<p><strong>copyStart</strong></p>
<ul>
<li>Including <strong>copyStartX</strong>, <strong>copyStartY</strong></li>
</ul>
</div>
<div class="content"><div class='highlight'><pre>G.<span class="hljs-property">copyStart</span> = <span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) {
<span class="hljs-keyword">return</span> [].<span class="hljs-title function_">concat</span>(<span class="hljs-variable language_">this</span>.<span class="hljs-property">currentCopyStart</span>);
};
G.<span class="hljs-property">copyStartX</span> = <span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) {
<span class="hljs-keyword">return</span> <span class="hljs-variable language_">this</span>.<span class="hljs-property">currentCopyStart</span>[<span class="hljs-number">0</span>];
};
G.<span class="hljs-property">copyStartY</span> = <span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) {
<span class="hljs-keyword">return</span> <span class="hljs-variable language_">this</span>.<span class="hljs-property">currentCopyStart</span>[<span class="hljs-number">1</span>];
};
S.<span class="hljs-property">copyStartX</span> = <span class="hljs-keyword">function</span> (<span class="hljs-params">coord</span>) {
<span class="hljs-keyword">if</span> (coord != <span class="hljs-literal">null</span>) {
<span class="hljs-variable language_">this</span>.<span class="hljs-property">copyStart</span>[<span class="hljs-number">0</span>] = coord;
<span class="hljs-variable language_">this</span>.<span class="hljs-property">dirtyCopyStart</span> = <span class="hljs-literal">true</span>;
<span class="hljs-variable language_">this</span>.<span class="hljs-property">dirtyImageSubscribers</span> = <span class="hljs-literal">true</span>;
<span class="hljs-variable language_">this</span>.<span class="hljs-property">dirtyFilterIdentifier</span> = <span class="hljs-literal">true</span>;
}
};
S.<span class="hljs-property">copyStartY</span> = <span class="hljs-keyword">function</span> (<span class="hljs-params">coord</span>) {
<span class="hljs-keyword">if</span> (coord != <span class="hljs-literal">null</span>) {
<span class="hljs-variable language_">this</span>.<span class="hljs-property">copyStart</span>[<span class="hljs-number">1</span>] = coord;
<span class="hljs-variable language_">this</span>.<span class="hljs-property">dirtyCopyStart</span> = <span class="hljs-literal">true</span>;
<span class="hljs-variable language_">this</span>.<span class="hljs-property">dirtyImageSubscribers</span> = <span class="hljs-literal">true</span>;
<span class="hljs-variable language_">this</span>.<span class="hljs-property">dirtyFilterIdentifier</span> = <span class="hljs-literal">true</span>;
}
};
S.<span class="hljs-property">copyStart</span> = <span class="hljs-keyword">function</span> (<span class="hljs-params">x, y</span>) {
<span class="hljs-variable language_">this</span>.<span class="hljs-title function_">setCoordinateHelper</span>(<span class="hljs-string">'copyStart'</span>, x, y);
<span class="hljs-variable language_">this</span>.<span class="hljs-property">dirtyCopyStart</span> = <span class="hljs-literal">true</span>;
<span class="hljs-variable language_">this</span>.<span class="hljs-property">dirtyImageSubscribers</span> = <span class="hljs-literal">true</span>;
<span class="hljs-variable language_">this</span>.<span class="hljs-property">dirtyFilterIdentifier</span> = <span class="hljs-literal">true</span>;
};
D.<span class="hljs-property">copyStartX</span> = <span class="hljs-keyword">function</span> (<span class="hljs-params">coord</span>) {
<span class="hljs-keyword">let</span> c = <span class="hljs-variable language_">this</span>.<span class="hljs-property">copyStart</span>;
c[<span class="hljs-number">0</span>] = <span class="hljs-title function_">addStrings</span>(c[<span class="hljs-number">0</span>], coord);
<span class="hljs-variable language_">this</span>.<span class="hljs-property">dirtyCopyStart</span> = <span class="hljs-literal">true</span>;
<span class="hljs-variable language_">this</span>.<span class="hljs-property">dirtyImageSubscribers</span> = <span class="hljs-literal">true</span>;
<span class="hljs-variable language_">this</span>.<span class="hljs-property">dirtyFilterIdentifier</span> = <span class="hljs-literal">true</span>;
};
D.<span class="hljs-property">copyStartY</span> = <span class="hljs-keyword">function</span> (<span class="hljs-params">coord</span>) {
<span class="hljs-keyword">let</span> c = <span class="hljs-variable language_">this</span>.<span class="hljs-property">copyStart</span>;
c[<span class="hljs-number">1</span>] = <span class="hljs-title function_">addStrings</span>(c[<span class="hljs-number">1</span>], coord);
<span class="hljs-variable language_">this</span>.<span class="hljs-property">dirtyCopyStart</span> = <span class="hljs-literal">true</span>;
<span class="hljs-variable language_">this</span>.<span class="hljs-property">dirtyFilterIdentifier</span> = <span class="hljs-literal">true</span>;
};
D.<span class="hljs-property">copyStart</span> = <span class="hljs-keyword">function</span> (<span class="hljs-params">x, y</span>) {
<span class="hljs-variable language_">this</span>.<span class="hljs-title function_">setDeltaCoordinateHelper</span>(<span class="hljs-string">'copyStart'</span>, x, y);
<span class="hljs-variable language_">this</span>.<span class="hljs-property">dirtyCopyStart</span> = <span class="hljs-literal">true</span>;
<span class="hljs-variable language_">this</span>.<span class="hljs-property">dirtyImageSubscribers</span> = <span class="hljs-literal">true</span>;
<span class="hljs-variable language_">this</span>.<span class="hljs-property">dirtyFilterIdentifier</span> = <span class="hljs-literal">true</span>;
};</pre></div></div>
</li>
<li id="section-18">
<div class="annotation">
<div class="sswrap ">
<a class="ss" href="#section-18">§</a>
</div>
<p><strong>copyDimensions</strong></p>
<ul>
<li>Including <strong>copyWidth</strong>, <strong>copyHeight</strong></li>
</ul>
</div>
<div class="content"><div class='highlight'><pre>G.<span class="hljs-property">copyWidth</span> = <span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) {
<span class="hljs-keyword">return</span> <span class="hljs-variable language_">this</span>.<span class="hljs-property">currentCopyDimensions</span>[<span class="hljs-number">0</span>];
};
G.<span class="hljs-property">copyHeight</span> = <span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) {
<span class="hljs-keyword">return</span> <span class="hljs-variable language_">this</span>.<span class="hljs-property">currentCopyDimensions</span>[<span class="hljs-number">1</span>];
};
G.<span class="hljs-property">copyDimensions</span> = <span class="hljs-keyword">function</span> (<span class="hljs-params">w, h</span>) {
<span class="hljs-keyword">return</span> [].<span class="hljs-title function_">concat</span>(<span class="hljs-variable language_">this</span>.<span class="hljs-property">currentCopyDimensions</span>);
};
S.<span class="hljs-property">copyWidth</span> = <span class="hljs-keyword">function</span> (<span class="hljs-params">val</span>) {
<span class="hljs-keyword">if</span> (val != <span class="hljs-literal">null</span>) {
<span class="hljs-variable language_">this</span>.<span class="hljs-property">copyDimensions</span>[<span class="hljs-number">0</span>] = val;
<span class="hljs-variable language_">this</span>.<span class="hljs-property">dirtyCopyDimensions</span> = <span class="hljs-literal">true</span>;
<span class="hljs-variable language_">this</span>.<span class="hljs-property">dirtyImageSubscribers</span> = <span class="hljs-literal">true</span>;
<span class="hljs-variable language_">this</span>.<span class="hljs-property">dirtyFilterIdentifier</span> = <span class="hljs-literal">true</span>;
}
};
S.<span class="hljs-property">copyHeight</span> = <span class="hljs-keyword">function</span> (<span class="hljs-params">val</span>) {
<span class="hljs-keyword">if</span> (val != <span class="hljs-literal">null</span>) {
<span class="hljs-variable language_">this</span>.<span class="hljs-property">copyDimensions</span>[<span class="hljs-number">1</span>] = val;
<span class="hljs-variable language_">this</span>.<span class="hljs-property">dirtyCopyDimensions</span> = <span class="hljs-literal">true</span>;
<span class="hljs-variable language_">this</span>.<span class="hljs-property">dirtyImageSubscribers</span> = <span class="hljs-literal">true</span>;
<span class="hljs-variable language_">this</span>.<span class="hljs-property">dirtyFilterIdentifier</span> = <span class="hljs-literal">true</span>;
}
};
S.<span class="hljs-property">copyDimensions</span> = <span class="hljs-keyword">function</span> (<span class="hljs-params">w, h</span>) {
<span class="hljs-variable language_">this</span>.<span class="hljs-title function_">setCoordinateHelper</span>(<span class="hljs-string">'copyDimensions'</span>, w, h);
<span class="hljs-variable language_">this</span>.<span class="hljs-property">dirtyCopyDimensions</span> = <span class="hljs-literal">true</span>;
<span class="hljs-variable language_">this</span>.<span class="hljs-property">dirtyImageSubscribers</span> = <span class="hljs-literal">true</span>;
<span class="hljs-variable language_">this</span>.<span class="hljs-property">dirtyFilterIdentifier</span> = <span class="hljs-literal">true</span>;
};
D.<span class="hljs-property">copyWidth</span> = <span class="hljs-keyword">function</span> (<span class="hljs-params">val</span>) {
<span class="hljs-keyword">let</span> c = <span class="hljs-variable language_">this</span>.<span class="hljs-property">copyDimensions</span>;
c[<span class="hljs-number">0</span>] = <span class="hljs-title function_">addStrings</span>(c[<span class="hljs-number">0</span>], val);
<span class="hljs-variable language_">this</span>.<span class="hljs-property">dirtyCopyDimensions</span> = <span class="hljs-literal">true</span>;
<span class="hljs-variable language_">this</span>.<span class="hljs-property">dirtyImageSubscribers</span> = <span class="hljs-literal">true</span>;
<span class="hljs-variable language_">this</span>.<span class="hljs-property">dirtyFilterIdentifier</span> = <span class="hljs-literal">true</span>;
};
D.<span class="hljs-property">copyHeight</span> = <span class="hljs-keyword">function</span> (<span class="hljs-params">val</span>) {
<span class="hljs-keyword">let</span> c = <span class="hljs-variable language_">this</span>.<span class="hljs-property">copyDimensions</span>;
c[<span class="hljs-number">1</span>] = <span class="hljs-title function_">addStrings</span>(c[<span class="hljs-number">1</span>], val);
<span class="hljs-variable language_">this</span>.<span class="hljs-property">dirtyCopyDimensions</span> = <span class="hljs-literal">true</span>;
<span class="hljs-variable language_">this</span>.<span class="hljs-property">dirtyImageSubscribers</span> = <span class="hljs-literal">true</span>;
<span class="hljs-variable language_">this</span>.<span class="hljs-property">dirtyFilterIdentifier</span> = <span class="hljs-literal">true</span>;
};
D.<span class="hljs-property">copyDimensions</span> = <span class="hljs-keyword">function</span> (<span class="hljs-params">w, h</span>) {
<span class="hljs-variable language_">this</span>.<span class="hljs-title function_">setDeltaCoordinateHelper</span>(<span class="hljs-string">'copyDimensions'</span>, w, h);
<span class="hljs-variable language_">this</span>.<span class="hljs-property">dirtyCopyDimensions</span> = <span class="hljs-literal">true</span>;
<span class="hljs-variable language_">this</span>.<span class="hljs-property">dirtyImageSubscribers</span> = <span class="hljs-literal">true</span>;
<span class="hljs-variable language_">this</span>.<span class="hljs-property">dirtyFilterIdentifier</span> = <span class="hljs-literal">true</span>;
};
S.<span class="hljs-property">checkHitIgnoreTransparency</span> = <span class="hljs-keyword">function</span> (<span class="hljs-params">item</span>) {
<span class