@swf2es/player-hosts 0.0.0-stage → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/LICENSE.third-party +759 -0
- package/README.md +43 -2
- package/dist/indexeddb.d.ts +27 -0
- package/dist/indexeddb.d.ts.map +1 -0
- package/dist/indexeddb.js +170 -0
- package/dist/indexeddb.js.map +1 -0
- package/dist/node-worker.d.ts +2 -0
- package/dist/node-worker.d.ts.map +1 -0
- package/dist/node-worker.js +12 -0
- package/dist/node-worker.js.map +1 -0
- package/dist/node.d.ts +8 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +43 -0
- package/dist/node.js.map +1 -0
- package/dist/precompiled.d.ts +31 -0
- package/dist/precompiled.d.ts.map +1 -0
- package/dist/precompiled.js +125 -0
- package/dist/precompiled.js.map +1 -0
- package/dist/stage3d.d.ts +13 -0
- package/dist/stage3d.d.ts.map +1 -0
- package/dist/stage3d.js +61 -0
- package/dist/stage3d.js.map +1 -0
- package/dist/thread/codegen/codegen.js +308 -0
- package/dist/thread/codegen/index.js +405 -0
- package/dist/thread/format/abc-names.js +126 -0
- package/dist/thread/format/actions.js +222 -0
- package/dist/thread/format/air-descriptor.js +63 -0
- package/dist/thread/format/api-versions.js +22 -0
- package/dist/thread/format/bitmap.js +199 -0
- package/dist/thread/format/button.js +60 -0
- package/dist/thread/format/compression.js +200 -0
- package/dist/thread/format/display.js +305 -0
- package/dist/thread/format/filters.js +136 -0
- package/dist/thread/format/font.js +168 -0
- package/dist/thread/format/index.js +26 -0
- package/dist/thread/format/pbj.js +484 -0
- package/dist/thread/format/shape.js +411 -0
- package/dist/thread/format/sound.js +91 -0
- package/dist/thread/format/swf.js +163 -0
- package/dist/thread/format/tags.js +58 -0
- package/dist/thread/format/text.js +135 -0
- package/dist/thread/format/zip.js +91 -0
- package/dist/thread/native/audio/binary.js +3 -0
- package/dist/thread/native/audio/index.js +72 -0
- package/dist/thread/native/base64.js +9 -0
- package/dist/thread/native/compress/binary.js +3 -0
- package/dist/thread/native/compress/index.js +145 -0
- package/dist/thread/native/instance.js +49 -0
- package/dist/thread/native/mp3/binary.js +3 -0
- package/dist/thread/native/mp3/index.js +48 -0
- package/dist/thread/native/render/binary.js +3 -0
- package/dist/thread/native/render/bitmap-kernel.js +591 -0
- package/dist/thread/native/render/draw-kernel.js +204 -0
- package/dist/thread/native/render/dxt-encoder.js +94 -0
- package/dist/thread/native/render/index.js +10 -0
- package/dist/thread/native/render/lines.js +122 -0
- package/dist/thread/native/render/module.js +26 -0
- package/dist/thread/native/render/pixel-ops.js +235 -0
- package/dist/thread/native/render/tessellator.js +250 -0
- package/dist/thread/player/avm1/amf.js +507 -0
- package/dist/thread/player/avm1/avm1.js +1304 -0
- package/dist/thread/player/avm1/bindings.js +214 -0
- package/dist/thread/player/avm1/classes.js +75 -0
- package/dist/thread/player/avm1/clips.js +229 -0
- package/dist/thread/player/avm1/compile.js +140 -0
- package/dist/thread/player/avm1/external.js +79 -0
- package/dist/thread/player/avm1/focus.js +278 -0
- package/dist/thread/player/avm1/globals/BitmapData.js +542 -0
- package/dist/thread/player/avm1/globals/Button.js +31 -0
- package/dist/thread/player/avm1/globals/Color.js +115 -0
- package/dist/thread/player/avm1/globals/ExternalInterface.js +310 -0
- package/dist/thread/player/avm1/globals/FileReference.js +217 -0
- package/dist/thread/player/avm1/globals/Key.js +60 -0
- package/dist/thread/player/avm1/globals/LoadVars.js +208 -0
- package/dist/thread/player/avm1/globals/LocalConnection.js +92 -0
- package/dist/thread/player/avm1/globals/MovieClip.js +1070 -0
- package/dist/thread/player/avm1/globals/MovieClipLoader.js +90 -0
- package/dist/thread/player/avm1/globals/NetConnection.js +261 -0
- package/dist/thread/player/avm1/globals/PrintJob.js +37 -0
- package/dist/thread/player/avm1/globals/Selection.js +62 -0
- package/dist/thread/player/avm1/globals/SharedObject.js +245 -0
- package/dist/thread/player/avm1/globals/Sound.js +238 -0
- package/dist/thread/player/avm1/globals/Stage.js +12 -0
- package/dist/thread/player/avm1/globals/StyleSheet.js +205 -0
- package/dist/thread/player/avm1/globals/TextField.js +396 -0
- package/dist/thread/player/avm1/globals/TextFormat.js +194 -0
- package/dist/thread/player/avm1/globals/TextSnapshot.js +88 -0
- package/dist/thread/player/avm1/globals/XML.js +396 -0
- package/dist/thread/player/avm1/globals/XMLNode.js +413 -0
- package/dist/thread/player/avm1/globals/XMLSocket.js +205 -0
- package/dist/thread/player/avm1/globals/drawing.js +202 -0
- package/dist/thread/player/avm1/globals/filters.js +635 -0
- package/dist/thread/player/avm1/globals/geom.js +600 -0
- package/dist/thread/player/avm1/input.js +483 -0
- package/dist/thread/player/avm1/keyboard.js +113 -0
- package/dist/thread/player/avm1/loads.js +352 -0
- package/dist/thread/player/avm1/net.js +219 -0
- package/dist/thread/player/avm1/paths.js +104 -0
- package/dist/thread/player/avm1/pointer.js +512 -0
- package/dist/thread/player/avm1/queue.js +303 -0
- package/dist/thread/player/avm1/sound.js +106 -0
- package/dist/thread/player/avm1/swf.js +141 -0
- package/dist/thread/player/avm1/timers.js +113 -0
- package/dist/thread/player/bitmap/bitmap.js +627 -0
- package/dist/thread/player/bitmap/draw.js +68 -0
- package/dist/thread/player/bitmap/dxt.js +11 -0
- package/dist/thread/player/bitmap/filters.js +656 -0
- package/dist/thread/player/bitmap/images.js +240 -0
- package/dist/thread/player/bitmap/kernel.js +65 -0
- package/dist/thread/player/bitmap/ops.js +1239 -0
- package/dist/thread/player/bitmap/pixel-bender.js +911 -0
- package/dist/thread/player/bitmap/png.js +139 -0
- package/dist/thread/player/bitmap/turbulence.js +89 -0
- package/dist/thread/player/clock.js +182 -0
- package/dist/thread/player/display/bitmapobject.js +25 -0
- package/dist/thread/player/display/bounds.js +520 -0
- package/dist/thread/player/display/buttonobject.js +305 -0
- package/dist/thread/player/display/color.js +40 -0
- package/dist/thread/player/display/container.js +150 -0
- package/dist/thread/player/display/display.js +14 -0
- package/dist/thread/player/display/displayobject.js +664 -0
- package/dist/thread/player/display/drawing.js +613 -0
- package/dist/thread/player/display/filters.js +285 -0
- package/dist/thread/player/display/geometry.js +189 -0
- package/dist/thread/player/display/gradients.js +117 -0
- package/dist/thread/player/display/graphicsdata.js +592 -0
- package/dist/thread/player/display/instantiate.js +71 -0
- package/dist/thread/player/display/matrix3d.js +373 -0
- package/dist/thread/player/display/morph.js +226 -0
- package/dist/thread/player/display/movieclip.js +680 -0
- package/dist/thread/player/display/perspective.js +193 -0
- package/dist/thread/player/display/scale9.js +236 -0
- package/dist/thread/player/display/shapeobject.js +131 -0
- package/dist/thread/player/display/shapes.js +407 -0
- package/dist/thread/player/display/textobjects.js +222 -0
- package/dist/thread/player/display/timeline.js +471 -0
- package/dist/thread/player/display/value-lists.js +40 -0
- package/dist/thread/player/display/videoobject.js +6 -0
- package/dist/thread/player/display/walk.js +127 -0
- package/dist/thread/player/files.js +334 -0
- package/dist/thread/player/hosts.js +207 -0
- package/dist/thread/player/input/avm1.js +82 -0
- package/dist/thread/player/input/context-menu.js +63 -0
- package/dist/thread/player/input/keyboard.js +458 -0
- package/dist/thread/player/input/pointer.js +863 -0
- package/dist/thread/player/input/text-editor.js +319 -0
- package/dist/thread/player/input/touch.js +209 -0
- package/dist/thread/player/localconnection.js +90 -0
- package/dist/thread/player/media/audio.js +376 -0
- package/dist/thread/player/media/dynamic-sound.js +90 -0
- package/dist/thread/player/media/extract.js +135 -0
- package/dist/thread/player/media/mp3.js +152 -0
- package/dist/thread/player/media/sounds.js +507 -0
- package/dist/thread/player/media/streaming-audio.js +133 -0
- package/dist/thread/player/player.js +616 -0
- package/dist/thread/player/playerglobal/air/net/WebSocket.js +250 -0
- package/dist/thread/player/playerglobal/air-library.js +8 -0
- package/dist/thread/player/playerglobal/flash/accessibility/Accessibility.js +21 -0
- package/dist/thread/player/playerglobal/flash/crypto/generateRandomBytes.js +32 -0
- package/dist/thread/player/playerglobal/flash/data/EncryptedLocalStore.js +61 -0
- package/dist/thread/player/playerglobal/flash/desktop/Clipboard.js +173 -0
- package/dist/thread/player/playerglobal/flash/desktop/NativeApplication.js +179 -0
- package/dist/thread/player/playerglobal/flash/display/AVM1Movie.js +19 -0
- package/dist/thread/player/playerglobal/flash/display/Bitmap.js +58 -0
- package/dist/thread/player/playerglobal/flash/display/BitmapData.js +633 -0
- package/dist/thread/player/playerglobal/flash/display/DisplayObject.js +614 -0
- package/dist/thread/player/playerglobal/flash/display/DisplayObjectContainer.js +224 -0
- package/dist/thread/player/playerglobal/flash/display/Graphics.js +345 -0
- package/dist/thread/player/playerglobal/flash/display/InteractiveObject.js +87 -0
- package/dist/thread/player/playerglobal/flash/display/Loader.js +79 -0
- package/dist/thread/player/playerglobal/flash/display/LoaderInfo.js +128 -0
- package/dist/thread/player/playerglobal/flash/display/MovieClip.js +194 -0
- package/dist/thread/player/playerglobal/flash/display/NativeWindow.js +245 -0
- package/dist/thread/player/playerglobal/flash/display/Shader.js +26 -0
- package/dist/thread/player/playerglobal/flash/display/ShaderData.js +85 -0
- package/dist/thread/player/playerglobal/flash/display/ShaderInput.js +64 -0
- package/dist/thread/player/playerglobal/flash/display/ShaderJob.js +181 -0
- package/dist/thread/player/playerglobal/flash/display/ShaderParameter.js +23 -0
- package/dist/thread/player/playerglobal/flash/display/Shape.js +13 -0
- package/dist/thread/player/playerglobal/flash/display/SimpleButton.js +103 -0
- package/dist/thread/player/playerglobal/flash/display/Sprite.js +84 -0
- package/dist/thread/player/playerglobal/flash/display/Stage.js +231 -0
- package/dist/thread/player/playerglobal/flash/display/Stage3D.js +54 -0
- package/dist/thread/player/playerglobal/flash/display/shaders.js +228 -0
- package/dist/thread/player/playerglobal/flash/events/Event.js +58 -0
- package/dist/thread/player/playerglobal/flash/events/EventDispatcher.js +103 -0
- package/dist/thread/player/playerglobal/flash/events/GestureEvent.js +34 -0
- package/dist/thread/player/playerglobal/flash/events/HTTPStatusEvent.js +8 -0
- package/dist/thread/player/playerglobal/flash/events/KeyboardEvent.js +51 -0
- package/dist/thread/player/playerglobal/flash/events/MouseEvent.js +59 -0
- package/dist/thread/player/playerglobal/flash/events/PressAndTapGestureEvent.js +30 -0
- package/dist/thread/player/playerglobal/flash/events/TimerEvent.js +16 -0
- package/dist/thread/player/playerglobal/flash/events/TouchEvent.js +45 -0
- package/dist/thread/player/playerglobal/flash/external/ExternalInterface.js +73 -0
- package/dist/thread/player/playerglobal/flash/filesystem/File.js +340 -0
- package/dist/thread/player/playerglobal/flash/filesystem/FileStream.js +453 -0
- package/dist/thread/player/playerglobal/flash/filesystem/paths.js +156 -0
- package/dist/thread/player/playerglobal/flash/filesystem/writes.js +143 -0
- package/dist/thread/player/playerglobal/flash/filters/BevelFilter.js +4 -0
- package/dist/thread/player/playerglobal/flash/filters/BitmapFilter.js +205 -0
- package/dist/thread/player/playerglobal/flash/filters/BlurFilter.js +4 -0
- package/dist/thread/player/playerglobal/flash/filters/ColorMatrixFilter.js +11 -0
- package/dist/thread/player/playerglobal/flash/filters/ConvolutionFilter.js +26 -0
- package/dist/thread/player/playerglobal/flash/filters/DisplacementMapFilter.js +51 -0
- package/dist/thread/player/playerglobal/flash/filters/DropShadowFilter.js +4 -0
- package/dist/thread/player/playerglobal/flash/filters/GlowFilter.js +4 -0
- package/dist/thread/player/playerglobal/flash/filters/GradientBevelFilter.js +4 -0
- package/dist/thread/player/playerglobal/flash/filters/GradientGlowFilter.js +4 -0
- package/dist/thread/player/playerglobal/flash/filters/ShaderFilter.js +53 -0
- package/dist/thread/player/playerglobal/flash/geom/Matrix3D.js +361 -0
- package/dist/thread/player/playerglobal/flash/geom/PerspectiveProjection.js +122 -0
- package/dist/thread/player/playerglobal/flash/geom/Transform.js +245 -0
- package/dist/thread/player/playerglobal/flash/geom/Utils3D.js +85 -0
- package/dist/thread/player/playerglobal/flash/globalization/Collator.js +149 -0
- package/dist/thread/player/playerglobal/flash/globalization/CurrencyFormatter.js +272 -0
- package/dist/thread/player/playerglobal/flash/globalization/CurrencyParseResult.js +21 -0
- package/dist/thread/player/playerglobal/flash/globalization/DateTimeFormatter.js +463 -0
- package/dist/thread/player/playerglobal/flash/globalization/LocaleID.js +144 -0
- package/dist/thread/player/playerglobal/flash/globalization/NumberFormatter.js +444 -0
- package/dist/thread/player/playerglobal/flash/globalization/NumberParseResult.js +22 -0
- package/dist/thread/player/playerglobal/flash/globalization/StringTools.js +59 -0
- package/dist/thread/player/playerglobal/flash/globalization/locale.js +190 -0
- package/dist/thread/player/playerglobal/flash/media/Camera.js +89 -0
- package/dist/thread/player/playerglobal/flash/media/Microphone.js +126 -0
- package/dist/thread/player/playerglobal/flash/media/Sound.js +543 -0
- package/dist/thread/player/playerglobal/flash/media/SoundMixer.js +74 -0
- package/dist/thread/player/playerglobal/flash/media/SoundTransform.js +40 -0
- package/dist/thread/player/playerglobal/flash/media/Video.js +43 -0
- package/dist/thread/player/playerglobal/flash/net/FileFilter.js +27 -0
- package/dist/thread/player/playerglobal/flash/net/FileReference.js +197 -0
- package/dist/thread/player/playerglobal/flash/net/LocalConnection.js +167 -0
- package/dist/thread/player/playerglobal/flash/net/NetConnection.js +155 -0
- package/dist/thread/player/playerglobal/flash/net/SharedObject.js +299 -0
- package/dist/thread/player/playerglobal/flash/net/Socket.js +282 -0
- package/dist/thread/player/playerglobal/flash/net/URLRequest.js +93 -0
- package/dist/thread/player/playerglobal/flash/net/URLStream.js +146 -0
- package/dist/thread/player/playerglobal/flash/net/XMLSocket.js +14 -0
- package/dist/thread/player/playerglobal/flash/net/local-modern.js +142 -0
- package/dist/thread/player/playerglobal/flash/net/local-values.js +217 -0
- package/dist/thread/player/playerglobal/flash/net/navigateToURL.js +29 -0
- package/dist/thread/player/playerglobal/flash/profiler/Telemetry.js +25 -0
- package/dist/thread/player/playerglobal/flash/sensors/Accelerometer.js +12 -0
- package/dist/thread/player/playerglobal/flash/system/ApplicationDomain.js +69 -0
- package/dist/thread/player/playerglobal/flash/system/Capabilities.js +163 -0
- package/dist/thread/player/playerglobal/flash/system/FSCommandHost.js +17 -0
- package/dist/thread/player/playerglobal/flash/system/Security.js +46 -0
- package/dist/thread/player/playerglobal/flash/system/SecurityDomain.js +21 -0
- package/dist/thread/player/playerglobal/flash/system/System.js +73 -0
- package/dist/thread/player/playerglobal/flash/system/Worker.js +112 -0
- package/dist/thread/player/playerglobal/flash/text/Font.js +95 -0
- package/dist/thread/player/playerglobal/flash/text/StaticText.js +16 -0
- package/dist/thread/player/playerglobal/flash/text/StyleSheet.js +65 -0
- package/dist/thread/player/playerglobal/flash/text/TextField.js +707 -0
- package/dist/thread/player/playerglobal/flash/text/TextRenderer.js +77 -0
- package/dist/thread/player/playerglobal/flash/text/engine/FontDescription.js +141 -0
- package/dist/thread/player/playerglobal/flash/text/engine/TabStop.js +46 -0
- package/dist/thread/player/playerglobal/flash/trace/Trace.js +17 -0
- package/dist/thread/player/playerglobal/flash/ui/ContextMenu.js +17 -0
- package/dist/thread/player/playerglobal/flash/ui/GameInput.js +19 -0
- package/dist/thread/player/playerglobal/flash/ui/Keyboard.js +27 -0
- package/dist/thread/player/playerglobal/flash/ui/Mouse.js +127 -0
- package/dist/thread/player/playerglobal/flash/ui/Multitouch.js +46 -0
- package/dist/thread/player/playerglobal/flash/utils/ByteArray.js +155 -0
- package/dist/thread/player/playerglobal/flash/utils/Timer.js +25 -0
- package/dist/thread/player/playerglobal/flash/xml/XMLDocument.js +74 -0
- package/dist/thread/player/playerglobal/index.js +224 -0
- package/dist/thread/player/playerglobal/libraries.js +10 -0
- package/dist/thread/player/playerglobal/playerglobal-library.js +22 -0
- package/dist/thread/player/playerglobal/toplevel.js +122 -0
- package/dist/thread/player/scripting/clipboard.js +146 -0
- package/dist/thread/player/scripting/code.js +900 -0
- package/dist/thread/player/scripting/evaluate.js +144 -0
- package/dist/thread/player/scripting/events.js +172 -0
- package/dist/thread/player/scripting/handover.js +182 -0
- package/dist/thread/player/scripting/lazy.js +38 -0
- package/dist/thread/player/scripting/lifecycle.js +272 -0
- package/dist/thread/player/scripting/loads.js +860 -0
- package/dist/thread/player/scripting/sha256.js +95 -0
- package/dist/thread/player/scripting/symbols.js +348 -0
- package/dist/thread/player/scripting/timers.js +434 -0
- package/dist/thread/player/scripting/workers.js +923 -0
- package/dist/thread/player/scripting.js +1018 -0
- package/dist/thread/player/stage.js +4 -0
- package/dist/thread/player/text/csm.js +113 -0
- package/dist/thread/player/text/css.js +167 -0
- package/dist/thread/player/text/fonts.js +97 -0
- package/dist/thread/player/text/layout.js +393 -0
- package/dist/thread/player/text/static.js +109 -0
- package/dist/thread/player/text/text.js +431 -0
- package/dist/thread/player/workers/thread.js +159 -0
- package/dist/thread/player/workers/wire.js +198 -0
- package/dist/thread/player-hosts/web-worker.js +19 -0
- package/dist/thread/runtime/avm1/activation.js +89 -0
- package/dist/thread/runtime/avm1/case.js +249 -0
- package/dist/thread/runtime/avm1/clips.js +334 -0
- package/dist/thread/runtime/avm1/control.js +280 -0
- package/dist/thread/runtime/avm1/errors.js +50 -0
- package/dist/thread/runtime/avm1/functions.js +249 -0
- package/dist/thread/runtime/avm1/globals/array.js +549 -0
- package/dist/thread/runtime/avm1/globals/broadcaster.js +131 -0
- package/dist/thread/runtime/avm1/globals/date.js +436 -0
- package/dist/thread/runtime/avm1/globals/global.js +344 -0
- package/dist/thread/runtime/avm1/globals/math.js +139 -0
- package/dist/thread/runtime/avm1/globals/number.js +93 -0
- package/dist/thread/runtime/avm1/globals/string.js +201 -0
- package/dist/thread/runtime/avm1/globals/timers.js +129 -0
- package/dist/thread/runtime/avm1/host.js +5 -0
- package/dist/thread/runtime/avm1/index.js +14 -0
- package/dist/thread/runtime/avm1/inheritance.js +132 -0
- package/dist/thread/runtime/avm1/numbers.js +298 -0
- package/dist/thread/runtime/avm1/objects.js +896 -0
- package/dist/thread/runtime/avm1/operators.js +170 -0
- package/dist/thread/runtime/avm1/realm.js +529 -0
- package/dist/thread/runtime/avm1/runtime.js +882 -0
- package/dist/thread/runtime/avm1/scope.js +385 -0
- package/dist/thread/runtime/avm1/urls.js +180 -0
- package/dist/thread/runtime/avm1/values.js +97 -0
- package/dist/thread/runtime/avm2/amf-classes.js +66 -0
- package/dist/thread/runtime/avm2/amf.js +801 -0
- package/dist/thread/runtime/avm2/array-conversion.js +100 -0
- package/dist/thread/runtime/avm2/builtin-library.js +21 -0
- package/dist/thread/runtime/avm2/cache-fill.js +86 -0
- package/dist/thread/runtime/avm2/classes.js +211 -0
- package/dist/thread/runtime/avm2/definitions.js +69 -0
- package/dist/thread/runtime/avm2/descriptors.js +5 -0
- package/dist/thread/runtime/avm2/dictionary-keys.js +295 -0
- package/dist/thread/runtime/avm2/domain-memory.js +75 -0
- package/dist/thread/runtime/avm2/domain.js +280 -0
- package/dist/thread/runtime/avm2/dynamic-properties.js +182 -0
- package/dist/thread/runtime/avm2/enumeration.js +393 -0
- package/dist/thread/runtime/avm2/errors.js +45 -0
- package/dist/thread/runtime/avm2/float-library.js +66 -0
- package/dist/thread/runtime/avm2/float.js +26 -0
- package/dist/thread/runtime/avm2/hooks.js +19 -0
- package/dist/thread/runtime/avm2/index.js +38 -0
- package/dist/thread/runtime/avm2/messages.js +177 -0
- package/dist/thread/runtime/avm2/method-factories.js +95 -0
- package/dist/thread/runtime/avm2/modules.js +105 -0
- package/dist/thread/runtime/avm2/names.js +248 -0
- package/dist/thread/runtime/avm2/natives/aliases.js +47 -0
- package/dist/thread/runtime/avm2/natives/array.js +390 -0
- package/dist/thread/runtime/avm2/natives/bytearray.js +1227 -0
- package/dist/thread/runtime/avm2/natives/case.js +88 -0
- package/dist/thread/runtime/avm2/natives/concurrent.js +199 -0
- package/dist/thread/runtime/avm2/natives/date.js +581 -0
- package/dist/thread/runtime/avm2/natives/define.js +130 -0
- package/dist/thread/runtime/avm2/natives/describe.js +351 -0
- package/dist/thread/runtime/avm2/natives/dictionary.js +12 -0
- package/dist/thread/runtime/avm2/natives/float-vector.js +81 -0
- package/dist/thread/runtime/avm2/natives/float.js +96 -0
- package/dist/thread/runtime/avm2/natives/index.js +64 -0
- package/dist/thread/runtime/avm2/natives/json.js +514 -0
- package/dist/thread/runtime/avm2/natives/number.js +162 -0
- package/dist/thread/runtime/avm2/natives/object.js +237 -0
- package/dist/thread/runtime/avm2/natives/proxy.js +75 -0
- package/dist/thread/runtime/avm2/natives/regexp.js +485 -0
- package/dist/thread/runtime/avm2/natives/shell-workers.js +404 -0
- package/dist/thread/runtime/avm2/natives/shell.js +557 -0
- package/dist/thread/runtime/avm2/natives/sort.js +377 -0
- package/dist/thread/runtime/avm2/natives/string.js +132 -0
- package/dist/thread/runtime/avm2/natives/sync.js +821 -0
- package/dist/thread/runtime/avm2/natives/toplevel.js +139 -0
- package/dist/thread/runtime/avm2/natives/vector-elements.js +46 -0
- package/dist/thread/runtime/avm2/natives/vector.js +406 -0
- package/dist/thread/runtime/avm2/natives/xml/access.js +633 -0
- package/dist/thread/runtime/avm2/natives/xml/build.js +291 -0
- package/dist/thread/runtime/avm2/natives/xml/chars.js +112 -0
- package/dist/thread/runtime/avm2/natives/xml/escape.js +38 -0
- package/dist/thread/runtime/avm2/natives/xml/names.js +204 -0
- package/dist/thread/runtime/avm2/natives/xml/node.js +272 -0
- package/dist/thread/runtime/avm2/natives/xml/operators.js +69 -0
- package/dist/thread/runtime/avm2/natives/xml/parser.js +356 -0
- package/dist/thread/runtime/avm2/natives/xml/strings.js +191 -0
- package/dist/thread/runtime/avm2/natives/xml/values.js +122 -0
- package/dist/thread/runtime/avm2/natives/xml/xml.js +645 -0
- package/dist/thread/runtime/avm2/number-strings.js +110 -0
- package/dist/thread/runtime/avm2/numbers.js +558 -0
- package/dist/thread/runtime/avm2/options.js +16 -0
- package/dist/thread/runtime/avm2/player-messages.js +550 -0
- package/dist/thread/runtime/avm2/property-cache.js +135 -0
- package/dist/thread/runtime/avm2/runtime.js +2644 -0
- package/dist/thread/runtime/avm2/traits.js +509 -0
- package/dist/thread/runtime/index.js +7 -0
- package/dist/web-worker.d.ts +2 -0
- package/dist/web-worker.d.ts.map +1 -0
- package/dist/web-worker.js +20 -0
- package/dist/web-worker.js.map +1 -0
- package/dist/websocket.d.ts +4 -0
- package/dist/websocket.d.ts.map +1 -0
- package/dist/websocket.js +27 -0
- package/dist/websocket.js.map +1 -0
- package/dist/workers.d.ts +35 -0
- package/dist/workers.d.ts.map +1 -0
- package/dist/workers.js +171 -0
- package/dist/workers.js.map +1 -0
- package/package.json +62 -3
- package/src/indexeddb.ts +227 -0
- package/src/node-worker.ts +13 -0
- package/src/node.ts +49 -0
- package/src/precompiled.ts +166 -0
- package/src/stage3d.ts +76 -0
- package/src/web-worker.ts +24 -0
- package/src/websocket.ts +32 -0
- package/src/workers.ts +255 -0
|
@@ -0,0 +1,911 @@
|
|
|
1
|
+
// Pixel Bender kernels run on the CPU, a pixel at a time, as Flash runs a
|
|
2
|
+
// ShaderJob: float registers in float32, int registers in int32, every
|
|
3
|
+
// register zero at each pixel's start but for the parameters and
|
|
4
|
+
// _OutCoord, the pixel's centre. What each operation does is what adl
|
|
5
|
+
// does, odd as some of it is: equal and notEqual only of scalars, a
|
|
6
|
+
// comparison's result in i0 whatever its destination, a bool
|
|
7
|
+
// turned to float as the bits of the int 1, a loaded int cut to 16 bits.
|
|
8
|
+
// A BitmapData samples as its premultiplied bytes, linearly in 8-bit
|
|
9
|
+
// steps; the edges clamp. The operations are compiled once a kernel into
|
|
10
|
+
// a flat program of fixed-size instructions.
|
|
11
|
+
import { PbjOp, } from "../../format/index.js";
|
|
12
|
+
import { nearest } from "./bitmap.js";
|
|
13
|
+
/** The name Pixel Bender gives the parameter it sets to the pixel's coordinate. */
|
|
14
|
+
export const OUT_COORD = "_OutCoord";
|
|
15
|
+
const STRIDE = 20;
|
|
16
|
+
// Instruction words: the kind, the lanes, an auxiliary value, then the
|
|
17
|
+
// destination's offsets, the source's, and a second and third source's.
|
|
18
|
+
const KIND = 0;
|
|
19
|
+
const LANES = 1;
|
|
20
|
+
const AUX = 2;
|
|
21
|
+
const DST = 4;
|
|
22
|
+
const SRC = 8;
|
|
23
|
+
const SRC2 = 12;
|
|
24
|
+
const SRC3 = 16;
|
|
25
|
+
/** Instruction kinds past PBJ's opcodes: an operation on int registers is its opcode plus INT. */
|
|
26
|
+
const INT = 0x100;
|
|
27
|
+
const MATRIX = 0x200;
|
|
28
|
+
const NOTHING = 0x400;
|
|
29
|
+
const JUMP = 0x401;
|
|
30
|
+
const JUMP_UNLESS = 0x402;
|
|
31
|
+
const LOAD_F = 0x403;
|
|
32
|
+
const LOAD_I = 0x404;
|
|
33
|
+
const SELECT_F = 0x405;
|
|
34
|
+
const SELECT_I = 0x406;
|
|
35
|
+
const SAMPLE_NEAREST = 0x407;
|
|
36
|
+
const SAMPLE_LINEAR = 0x408;
|
|
37
|
+
/** A byte's float as adl samples one: times the float nearest 1/255, not divided. */
|
|
38
|
+
const BYTE = Math.fround(1 / 255);
|
|
39
|
+
const bitsF = new Float32Array(1);
|
|
40
|
+
const bitsI = new Int32Array(bitsF.buffer);
|
|
41
|
+
/** The nearest int, a half to the even one, as SSE converts; INT_MIN past int's range or for NaN. */
|
|
42
|
+
function toInt(v) {
|
|
43
|
+
const r = nearest(v);
|
|
44
|
+
return r >= -2147483648 && r <= 2147483647 ? r : -2147483648;
|
|
45
|
+
}
|
|
46
|
+
/** Registers numbered as the kernel numbers them, packed into slots of four lanes. */
|
|
47
|
+
class Slots {
|
|
48
|
+
map = new Map();
|
|
49
|
+
slot(index) {
|
|
50
|
+
let slot = this.map.get(index);
|
|
51
|
+
if (slot === undefined) {
|
|
52
|
+
slot = this.map.size;
|
|
53
|
+
this.map.set(index, slot);
|
|
54
|
+
}
|
|
55
|
+
return slot * 4;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
export class PixelBender {
|
|
59
|
+
kernel;
|
|
60
|
+
code;
|
|
61
|
+
/** Each instruction's float to load, by its number. */
|
|
62
|
+
constants;
|
|
63
|
+
f;
|
|
64
|
+
i;
|
|
65
|
+
/** The registers as each pixel starts, the parameters set. */
|
|
66
|
+
f0;
|
|
67
|
+
i0;
|
|
68
|
+
images = [];
|
|
69
|
+
/** A matrix product's, or a vector's, values while it is written. */
|
|
70
|
+
scratch = new Float32Array(16);
|
|
71
|
+
coord = [];
|
|
72
|
+
out = [];
|
|
73
|
+
floats;
|
|
74
|
+
ints;
|
|
75
|
+
/** The output parameter: the last declared, as Flash takes it. */
|
|
76
|
+
output;
|
|
77
|
+
/** The textures the operations sample, by number. */
|
|
78
|
+
sampled = new Set();
|
|
79
|
+
constructor(kernel) {
|
|
80
|
+
this.kernel = kernel;
|
|
81
|
+
this.floats = new Slots();
|
|
82
|
+
this.ints = new Slots();
|
|
83
|
+
const outputs = kernel.parameters.filter((p) => p.output);
|
|
84
|
+
this.output = outputs[outputs.length - 1];
|
|
85
|
+
this.constants = new Float32Array(kernel.operations.length);
|
|
86
|
+
this.code = this.compile(kernel.operations);
|
|
87
|
+
for (const p of kernel.parameters) {
|
|
88
|
+
this.columns(p.register);
|
|
89
|
+
}
|
|
90
|
+
const coord = kernel.parameters.find((p) => !p.output && p.name === OUT_COORD);
|
|
91
|
+
if (coord && !coord.register.int && !coord.register.matrix) {
|
|
92
|
+
this.coord = this.offsets(coord.register);
|
|
93
|
+
}
|
|
94
|
+
// An int output gives 0, as in adl: lanes of a register nothing writes.
|
|
95
|
+
const out = this.output.register;
|
|
96
|
+
this.out = out.int ? out.channels.map((c) => this.floats.slot(-1) + c) : this.offsets(out);
|
|
97
|
+
this.f = new Float32Array(Math.max(4, this.floats.map.size * 4));
|
|
98
|
+
this.i = new Int32Array(Math.max(4, this.ints.map.size * 4));
|
|
99
|
+
this.f0 = new Float32Array(this.f.length);
|
|
100
|
+
this.i0 = new Int32Array(this.i.length);
|
|
101
|
+
}
|
|
102
|
+
/** The output's channels a pixel. */
|
|
103
|
+
get channels() {
|
|
104
|
+
return this.out.length;
|
|
105
|
+
}
|
|
106
|
+
slots(r) {
|
|
107
|
+
return r.int ? this.ints : this.floats;
|
|
108
|
+
}
|
|
109
|
+
/** A register's offsets, a lane each: a destination's written channels, a source's swizzle. */
|
|
110
|
+
offsets(r) {
|
|
111
|
+
const base = this.slots(r).slot(r.index);
|
|
112
|
+
return r.channels.map((c) => base + c);
|
|
113
|
+
}
|
|
114
|
+
/** A matrix's columns' first offsets: a 2x2 matrix is one register, its columns in two lanes each. */
|
|
115
|
+
columns(r) {
|
|
116
|
+
if (!r.matrix) {
|
|
117
|
+
return [];
|
|
118
|
+
}
|
|
119
|
+
const s = this.slots(r);
|
|
120
|
+
if (r.matrix === 2) {
|
|
121
|
+
const base = s.slot(r.index);
|
|
122
|
+
return [base, base + 2];
|
|
123
|
+
}
|
|
124
|
+
return Array.from({ length: r.matrix }, (_, c) => s.slot(r.index + c));
|
|
125
|
+
}
|
|
126
|
+
compile(operations) {
|
|
127
|
+
const code = new Int32Array(operations.length * STRIDE);
|
|
128
|
+
const open = [];
|
|
129
|
+
for (const [n, op] of operations.entries()) {
|
|
130
|
+
const at = n * STRIDE;
|
|
131
|
+
const put = (offset, values) => {
|
|
132
|
+
for (const [k, v] of values.entries()) {
|
|
133
|
+
code[at + offset + k] = v;
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
switch (op.op) {
|
|
137
|
+
case PbjOp.load: {
|
|
138
|
+
const o = op;
|
|
139
|
+
code[at + KIND] = o.dst.int ? LOAD_I : LOAD_F;
|
|
140
|
+
code[at + LANES] = o.dst.size;
|
|
141
|
+
put(DST, this.offsets(o.dst));
|
|
142
|
+
// An int in the third source's words, a float in constants.
|
|
143
|
+
code[at + SRC3] = o.dst.int ? o.value : 0;
|
|
144
|
+
this.constants[n] = o.dst.int ? 0 : o.value;
|
|
145
|
+
break;
|
|
146
|
+
}
|
|
147
|
+
case PbjOp.sampleNearest:
|
|
148
|
+
case PbjOp.sampleLinear: {
|
|
149
|
+
const o = op;
|
|
150
|
+
code[at + KIND] = o.op === PbjOp.sampleLinear ? SAMPLE_LINEAR : SAMPLE_NEAREST;
|
|
151
|
+
code[at + LANES] = o.dst.size;
|
|
152
|
+
code[at + AUX] = o.texture;
|
|
153
|
+
put(DST, this.offsets(o.dst));
|
|
154
|
+
put(SRC, this.offsets(o.src));
|
|
155
|
+
code[at + SRC3] = o.src.int ? 1 : 0;
|
|
156
|
+
this.sampled.add(o.texture);
|
|
157
|
+
break;
|
|
158
|
+
}
|
|
159
|
+
case PbjOp.if: {
|
|
160
|
+
const o = op;
|
|
161
|
+
code[at + KIND] = JUMP_UNLESS;
|
|
162
|
+
put(SRC, this.offsets(o.src));
|
|
163
|
+
open.push({ at, otherwise: -1 });
|
|
164
|
+
break;
|
|
165
|
+
}
|
|
166
|
+
case PbjOp.else: {
|
|
167
|
+
const branch = open[open.length - 1];
|
|
168
|
+
code[at + KIND] = JUMP;
|
|
169
|
+
// A false condition goes past the else.
|
|
170
|
+
code[branch.at + AUX] = n + 1;
|
|
171
|
+
branch.otherwise = at;
|
|
172
|
+
break;
|
|
173
|
+
}
|
|
174
|
+
case PbjOp.endIf: {
|
|
175
|
+
const branch = open.pop();
|
|
176
|
+
code[at + KIND] = NOTHING;
|
|
177
|
+
if (branch.otherwise < 0) {
|
|
178
|
+
code[branch.at + AUX] = n + 1;
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
code[branch.otherwise + AUX] = n + 1;
|
|
182
|
+
}
|
|
183
|
+
break;
|
|
184
|
+
}
|
|
185
|
+
case PbjOp.select: {
|
|
186
|
+
const o = op;
|
|
187
|
+
code[at + KIND] = o.dst.int ? SELECT_I : SELECT_F;
|
|
188
|
+
code[at + LANES] = o.dst.size;
|
|
189
|
+
put(DST, this.offsets(o.dst));
|
|
190
|
+
put(SRC, this.offsets(o.a));
|
|
191
|
+
put(SRC2, this.offsets(o.b));
|
|
192
|
+
code[at + SRC3] = this.offsets(o.condition)[0];
|
|
193
|
+
break;
|
|
194
|
+
}
|
|
195
|
+
default: {
|
|
196
|
+
const o = op;
|
|
197
|
+
if (o.src.matrix) {
|
|
198
|
+
code[at + KIND] = MATRIX | o.op;
|
|
199
|
+
code[at + LANES] = o.src.matrix;
|
|
200
|
+
put(SRC, this.columns(o.src));
|
|
201
|
+
put(DST, o.dst.matrix ? this.columns(o.dst) : this.offsets(o.dst));
|
|
202
|
+
break;
|
|
203
|
+
}
|
|
204
|
+
code[at + KIND] = o.op | (o.dst.int && o.src.int ? INT : 0);
|
|
205
|
+
code[at + LANES] = o.dst.size;
|
|
206
|
+
code[at + AUX] = o.src.size;
|
|
207
|
+
put(DST, this.offsets(o.dst));
|
|
208
|
+
put(SRC, this.offsets(o.src));
|
|
209
|
+
// The comparisons write i0's first lanes, whatever their destination.
|
|
210
|
+
const compares = (o.op >= PbjOp.equal && o.op <= PbjOp.lessThanEqual) ||
|
|
211
|
+
o.op === PbjOp.vectorEqual ||
|
|
212
|
+
o.op === PbjOp.vectorNotEqual;
|
|
213
|
+
if (compares) {
|
|
214
|
+
put(SRC3, [0, 1, 2, 3].map((c) => this.ints.slot(0) + c));
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
return code;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Run over `width` by `height` pixels into `out`, `channels` floats a
|
|
223
|
+
* pixel: `values` each input parameter's numbers by the parameter,
|
|
224
|
+
* converted already (floats to float32, ints to int32), and `images`
|
|
225
|
+
* each texture's image by its number; the first pixel's coordinate
|
|
226
|
+
* `x0`, `y0`.
|
|
227
|
+
*/
|
|
228
|
+
run(values, images, width, height, out, x0 = 0, y0 = 0) {
|
|
229
|
+
this.f0.fill(0);
|
|
230
|
+
this.i0.fill(0);
|
|
231
|
+
for (const [p, v] of values) {
|
|
232
|
+
this.setParameter(p, v);
|
|
233
|
+
}
|
|
234
|
+
this.images.length = 0;
|
|
235
|
+
for (const [index, image] of images) {
|
|
236
|
+
this.images[index] = image;
|
|
237
|
+
}
|
|
238
|
+
const { f, i, f0, i0, coord, out: lanes } = this;
|
|
239
|
+
const channels = lanes.length;
|
|
240
|
+
let at = 0;
|
|
241
|
+
for (let y = 0; y < height; y++) {
|
|
242
|
+
for (let x = 0; x < width; x++) {
|
|
243
|
+
f.set(f0);
|
|
244
|
+
i.set(i0);
|
|
245
|
+
if (coord.length > 0) {
|
|
246
|
+
f[coord[0]] = x0 + x + 0.5;
|
|
247
|
+
}
|
|
248
|
+
if (coord.length > 1) {
|
|
249
|
+
f[coord[1]] = y0 + y + 0.5;
|
|
250
|
+
}
|
|
251
|
+
this.pixel();
|
|
252
|
+
for (let c = 0; c < channels; c++) {
|
|
253
|
+
out[at++] = f[lanes[c]];
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
// The program lives as long as its kernel; the images, which may be large, not.
|
|
258
|
+
this.images.length = 0;
|
|
259
|
+
}
|
|
260
|
+
setParameter(p, v) {
|
|
261
|
+
const r = p.register;
|
|
262
|
+
const lanes = r.int ? this.i0 : this.f0;
|
|
263
|
+
if (!r.matrix) {
|
|
264
|
+
for (const [k, offset] of this.offsets(r).entries()) {
|
|
265
|
+
lanes[offset] = v[k] ?? 0;
|
|
266
|
+
}
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
// A matrix's numbers by columns; a 3x3 matrix's columns leave their fourth lane 0.
|
|
270
|
+
const columns = this.columns(r);
|
|
271
|
+
const rows = r.matrix;
|
|
272
|
+
for (let c = 0; c < rows; c++) {
|
|
273
|
+
for (let k = 0; k < rows; k++) {
|
|
274
|
+
lanes[columns[c] + k] = v[c * rows + k] ?? 0;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
pixel() {
|
|
279
|
+
const { code, f, i } = this;
|
|
280
|
+
const end = code.length;
|
|
281
|
+
for (let pc = 0; pc < end;) {
|
|
282
|
+
const kind = code[pc];
|
|
283
|
+
const n = code[pc + LANES];
|
|
284
|
+
const d = pc + DST;
|
|
285
|
+
const s = pc + SRC;
|
|
286
|
+
pc += STRIDE;
|
|
287
|
+
switch (kind) {
|
|
288
|
+
case NOTHING:
|
|
289
|
+
break;
|
|
290
|
+
case JUMP:
|
|
291
|
+
pc = code[pc - STRIDE + AUX] * STRIDE;
|
|
292
|
+
break;
|
|
293
|
+
case JUMP_UNLESS:
|
|
294
|
+
if (i[code[s]] === 0) {
|
|
295
|
+
pc = code[pc - STRIDE + AUX] * STRIDE;
|
|
296
|
+
}
|
|
297
|
+
break;
|
|
298
|
+
case LOAD_F: {
|
|
299
|
+
const v = this.constants[pc / STRIDE - 1];
|
|
300
|
+
for (let k = 0; k < n; k++) {
|
|
301
|
+
f[code[d + k]] = v;
|
|
302
|
+
}
|
|
303
|
+
break;
|
|
304
|
+
}
|
|
305
|
+
// The commonest, here rather than in floatOp.
|
|
306
|
+
case PbjOp.mov:
|
|
307
|
+
for (let k = 0; k < n; k++) {
|
|
308
|
+
f[code[d + k]] = f[code[s + k]];
|
|
309
|
+
}
|
|
310
|
+
break;
|
|
311
|
+
case PbjOp.add:
|
|
312
|
+
for (let k = 0; k < n; k++) {
|
|
313
|
+
f[code[d + k]] += f[code[s + k]];
|
|
314
|
+
}
|
|
315
|
+
break;
|
|
316
|
+
case PbjOp.mul:
|
|
317
|
+
for (let k = 0; k < n; k++) {
|
|
318
|
+
f[code[d + k]] *= f[code[s + k]];
|
|
319
|
+
}
|
|
320
|
+
break;
|
|
321
|
+
case LOAD_I:
|
|
322
|
+
for (let k = 0; k < n; k++) {
|
|
323
|
+
i[code[d + k]] = code[pc - STRIDE + SRC3];
|
|
324
|
+
}
|
|
325
|
+
break;
|
|
326
|
+
case SELECT_F:
|
|
327
|
+
case SELECT_I: {
|
|
328
|
+
// Only exactly 1 selects the first, unlike if's any other than 0.
|
|
329
|
+
const from = i[code[pc - STRIDE + SRC3]] === 1 ? s : pc - STRIDE + SRC2;
|
|
330
|
+
const lanes = kind === SELECT_F ? f : i;
|
|
331
|
+
for (let k = 0; k < n; k++) {
|
|
332
|
+
lanes[code[d + k]] = lanes[code[from + k]];
|
|
333
|
+
}
|
|
334
|
+
break;
|
|
335
|
+
}
|
|
336
|
+
case SAMPLE_NEAREST:
|
|
337
|
+
case SAMPLE_LINEAR:
|
|
338
|
+
this.sample(pc - STRIDE, kind === SAMPLE_LINEAR);
|
|
339
|
+
break;
|
|
340
|
+
default:
|
|
341
|
+
if (kind & MATRIX) {
|
|
342
|
+
this.matrix(pc - STRIDE);
|
|
343
|
+
}
|
|
344
|
+
else if (kind & INT) {
|
|
345
|
+
this.intOp(kind & 0xff, n, d, s, pc - STRIDE);
|
|
346
|
+
}
|
|
347
|
+
else {
|
|
348
|
+
this.floatOp(kind, n, d, s, pc - STRIDE);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
floatOp(op, n, d, s, at) {
|
|
354
|
+
const { code, f, i } = this;
|
|
355
|
+
// add, mul and mov are pixel()'s.
|
|
356
|
+
switch (op) {
|
|
357
|
+
case PbjOp.sub:
|
|
358
|
+
for (let k = 0; k < n; k++) {
|
|
359
|
+
f[code[d + k]] -= f[code[s + k]];
|
|
360
|
+
}
|
|
361
|
+
return;
|
|
362
|
+
case PbjOp.div:
|
|
363
|
+
for (let k = 0; k < n; k++) {
|
|
364
|
+
f[code[d + k]] /= f[code[s + k]];
|
|
365
|
+
}
|
|
366
|
+
return;
|
|
367
|
+
case PbjOp.atan2:
|
|
368
|
+
// adl's atan2 takes an x of -0 as 0: atan2(0, -0) is 0, not pi. NaN stays NaN.
|
|
369
|
+
for (let k = 0; k < n; k++) {
|
|
370
|
+
const x = f[code[s + k]];
|
|
371
|
+
f[code[d + k]] = Math.atan2(f[code[d + k]], x === 0 ? 0 : x);
|
|
372
|
+
}
|
|
373
|
+
return;
|
|
374
|
+
case PbjOp.pow:
|
|
375
|
+
// As JavaScript's, unlike C's: 1 to NaN and -1 to Infinity are NaN in adl too.
|
|
376
|
+
for (let k = 0; k < n; k++) {
|
|
377
|
+
f[code[d + k]] **= f[code[s + k]];
|
|
378
|
+
}
|
|
379
|
+
return;
|
|
380
|
+
case PbjOp.mod:
|
|
381
|
+
for (let k = 0; k < n; k++) {
|
|
382
|
+
const x = f[code[d + k]];
|
|
383
|
+
const y = f[code[s + k]];
|
|
384
|
+
f[code[d + k]] = x - Math.fround(y * Math.floor(Math.fround(x / y)));
|
|
385
|
+
}
|
|
386
|
+
return;
|
|
387
|
+
case PbjOp.min:
|
|
388
|
+
// As SSE's minss: the source where either is NaN.
|
|
389
|
+
for (let k = 0; k < n; k++) {
|
|
390
|
+
const x = f[code[d + k]];
|
|
391
|
+
const y = f[code[s + k]];
|
|
392
|
+
f[code[d + k]] = x < y ? x : y;
|
|
393
|
+
}
|
|
394
|
+
return;
|
|
395
|
+
case PbjOp.max:
|
|
396
|
+
for (let k = 0; k < n; k++) {
|
|
397
|
+
const x = f[code[d + k]];
|
|
398
|
+
const y = f[code[s + k]];
|
|
399
|
+
f[code[d + k]] = x > y ? x : y;
|
|
400
|
+
}
|
|
401
|
+
return;
|
|
402
|
+
case PbjOp.step:
|
|
403
|
+
for (let k = 0; k < n; k++) {
|
|
404
|
+
f[code[d + k]] = f[code[d + k]] < f[code[s + k]] ? 0 : 1;
|
|
405
|
+
}
|
|
406
|
+
return;
|
|
407
|
+
case PbjOp.equal:
|
|
408
|
+
// adl compares scalars alone: of vectors, equal is false and notEqual true.
|
|
409
|
+
i[code[at + SRC3]] = n === 1 && f[code[d]] === f[code[s]] ? 1 : 0;
|
|
410
|
+
return;
|
|
411
|
+
case PbjOp.notEqual:
|
|
412
|
+
i[code[at + SRC3]] = n === 1 && f[code[d]] === f[code[s]] ? 0 : 1;
|
|
413
|
+
return;
|
|
414
|
+
case PbjOp.lessThan:
|
|
415
|
+
for (let k = 0; k < n; k++) {
|
|
416
|
+
i[code[at + SRC3 + k]] = f[code[d + k]] < f[code[s + k]] ? 1 : 0;
|
|
417
|
+
}
|
|
418
|
+
return;
|
|
419
|
+
case PbjOp.lessThanEqual:
|
|
420
|
+
for (let k = 0; k < n; k++) {
|
|
421
|
+
i[code[at + SRC3 + k]] = f[code[d + k]] <= f[code[s + k]] ? 1 : 0;
|
|
422
|
+
}
|
|
423
|
+
return;
|
|
424
|
+
case PbjOp.vectorEqual:
|
|
425
|
+
for (let k = 0; k < n; k++) {
|
|
426
|
+
i[code[at + SRC3 + k]] = f[code[d + k]] === f[code[s + k]] ? 1 : 0;
|
|
427
|
+
}
|
|
428
|
+
return;
|
|
429
|
+
case PbjOp.vectorNotEqual:
|
|
430
|
+
for (let k = 0; k < n; k++) {
|
|
431
|
+
i[code[at + SRC3 + k]] = f[code[d + k]] !== f[code[s + k]] ? 1 : 0;
|
|
432
|
+
}
|
|
433
|
+
return;
|
|
434
|
+
case PbjOp.dot: {
|
|
435
|
+
let sum = 0;
|
|
436
|
+
for (let k = 0; k < n; k++) {
|
|
437
|
+
sum = Math.fround(sum + Math.fround(f[code[d + k]] * f[code[s + k]]));
|
|
438
|
+
}
|
|
439
|
+
f[code[d]] = sum;
|
|
440
|
+
return;
|
|
441
|
+
}
|
|
442
|
+
case PbjOp.distance: {
|
|
443
|
+
let sum = 0;
|
|
444
|
+
for (let k = 0; k < n; k++) {
|
|
445
|
+
const v = Math.fround(f[code[d + k]] - f[code[s + k]]);
|
|
446
|
+
sum = Math.fround(sum + Math.fround(v * v));
|
|
447
|
+
}
|
|
448
|
+
f[code[d]] = Math.sqrt(sum);
|
|
449
|
+
return;
|
|
450
|
+
}
|
|
451
|
+
case PbjOp.length: {
|
|
452
|
+
let sum = 0;
|
|
453
|
+
for (let k = 0; k < code[at + AUX]; k++) {
|
|
454
|
+
const v = f[code[s + k]];
|
|
455
|
+
sum = Math.fround(sum + Math.fround(v * v));
|
|
456
|
+
}
|
|
457
|
+
f[code[d]] = Math.sqrt(sum);
|
|
458
|
+
return;
|
|
459
|
+
}
|
|
460
|
+
case PbjOp.normalize: {
|
|
461
|
+
let sum = 0;
|
|
462
|
+
for (let k = 0; k < n; k++) {
|
|
463
|
+
const v = f[code[s + k]];
|
|
464
|
+
sum = Math.fround(sum + Math.fround(v * v));
|
|
465
|
+
}
|
|
466
|
+
const length = Math.fround(Math.sqrt(sum));
|
|
467
|
+
for (let k = 0; k < n; k++) {
|
|
468
|
+
f[code[d + k]] = f[code[s + k]] / length;
|
|
469
|
+
}
|
|
470
|
+
return;
|
|
471
|
+
}
|
|
472
|
+
case PbjOp.cross: {
|
|
473
|
+
const [x0, y0, z0] = [f[code[d]], f[code[d + 1]], f[code[d + 2]]];
|
|
474
|
+
const [x1, y1, z1] = [f[code[s]], f[code[s + 1]], f[code[s + 2]]];
|
|
475
|
+
const p = Math.fround;
|
|
476
|
+
f[code[d]] = p(y0 * z1) - p(z0 * y1);
|
|
477
|
+
f[code[d + 1]] = p(z0 * x1) - p(x0 * z1);
|
|
478
|
+
f[code[d + 2]] = p(x0 * y1) - p(y0 * x1);
|
|
479
|
+
return;
|
|
480
|
+
}
|
|
481
|
+
case PbjOp.floatToInt:
|
|
482
|
+
for (let k = 0; k < n; k++) {
|
|
483
|
+
i[code[d + k]] = toInt(f[code[s + k]]);
|
|
484
|
+
}
|
|
485
|
+
return;
|
|
486
|
+
case PbjOp.intToFloat:
|
|
487
|
+
for (let k = 0; k < n; k++) {
|
|
488
|
+
f[code[d + k]] = i[code[s + k]];
|
|
489
|
+
}
|
|
490
|
+
return;
|
|
491
|
+
case PbjOp.floatToBool:
|
|
492
|
+
// The float's bits, as they are.
|
|
493
|
+
for (let k = 0; k < n; k++) {
|
|
494
|
+
bitsF[0] = f[code[s + k]];
|
|
495
|
+
i[code[d + k]] = bitsI[0];
|
|
496
|
+
}
|
|
497
|
+
return;
|
|
498
|
+
case PbjOp.boolToFloat:
|
|
499
|
+
case PbjOp.boolToInt:
|
|
500
|
+
// The int 1 or 0, its bits taken as a float's.
|
|
501
|
+
for (let k = 0; k < n; k++) {
|
|
502
|
+
bitsI[0] = i[code[s + k]] === 0 ? 0 : 1;
|
|
503
|
+
f[code[d + k]] = bitsF[0];
|
|
504
|
+
}
|
|
505
|
+
return;
|
|
506
|
+
case PbjOp.matMatMul:
|
|
507
|
+
case PbjOp.matVecMul:
|
|
508
|
+
case PbjOp.vecMatMul:
|
|
509
|
+
// adl takes them on registers that are no matrices; what it does then is not known.
|
|
510
|
+
return;
|
|
511
|
+
default:
|
|
512
|
+
this.mathOp(op, n, d, s);
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
/** The functions of one argument. */
|
|
516
|
+
mathOp(op, n, d, s) {
|
|
517
|
+
const { code, f } = this;
|
|
518
|
+
for (let k = 0; k < n; k++) {
|
|
519
|
+
const x = f[code[s + k]];
|
|
520
|
+
let y;
|
|
521
|
+
switch (op) {
|
|
522
|
+
case PbjOp.rcp:
|
|
523
|
+
y = 1 / x;
|
|
524
|
+
break;
|
|
525
|
+
case PbjOp.sin:
|
|
526
|
+
y = Math.sin(x);
|
|
527
|
+
break;
|
|
528
|
+
case PbjOp.cos:
|
|
529
|
+
y = Math.cos(x);
|
|
530
|
+
break;
|
|
531
|
+
case PbjOp.tan:
|
|
532
|
+
y = Math.tan(x);
|
|
533
|
+
break;
|
|
534
|
+
case PbjOp.asin:
|
|
535
|
+
y = Math.asin(x);
|
|
536
|
+
break;
|
|
537
|
+
case PbjOp.acos:
|
|
538
|
+
y = Math.acos(x);
|
|
539
|
+
break;
|
|
540
|
+
case PbjOp.atan:
|
|
541
|
+
y = Math.atan(x);
|
|
542
|
+
break;
|
|
543
|
+
case PbjOp.exp:
|
|
544
|
+
y = Math.exp(x);
|
|
545
|
+
break;
|
|
546
|
+
case PbjOp.exp2:
|
|
547
|
+
y = 2 ** x;
|
|
548
|
+
break;
|
|
549
|
+
case PbjOp.log:
|
|
550
|
+
y = Math.log(x);
|
|
551
|
+
break;
|
|
552
|
+
case PbjOp.log2:
|
|
553
|
+
y = Math.log2(x);
|
|
554
|
+
break;
|
|
555
|
+
case PbjOp.sqrt:
|
|
556
|
+
y = Math.sqrt(x);
|
|
557
|
+
break;
|
|
558
|
+
case PbjOp.rsqrt:
|
|
559
|
+
y = 1 / Math.fround(Math.sqrt(x));
|
|
560
|
+
break;
|
|
561
|
+
case PbjOp.abs:
|
|
562
|
+
y = Math.abs(x);
|
|
563
|
+
break;
|
|
564
|
+
case PbjOp.sign:
|
|
565
|
+
// 0 for NaN, as adl has it.
|
|
566
|
+
y = x > 0 ? 1 : x < 0 ? -1 : 0;
|
|
567
|
+
break;
|
|
568
|
+
case PbjOp.floor:
|
|
569
|
+
y = Math.floor(x);
|
|
570
|
+
break;
|
|
571
|
+
case PbjOp.ceil:
|
|
572
|
+
y = Math.ceil(x);
|
|
573
|
+
break;
|
|
574
|
+
default:
|
|
575
|
+
// fract
|
|
576
|
+
y = x - Math.floor(x);
|
|
577
|
+
}
|
|
578
|
+
f[code[d + k]] = y;
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
intOp(op, n, d, s, at) {
|
|
582
|
+
const { code, i } = this;
|
|
583
|
+
switch (op) {
|
|
584
|
+
case PbjOp.add:
|
|
585
|
+
for (let k = 0; k < n; k++) {
|
|
586
|
+
i[code[d + k]] += i[code[s + k]];
|
|
587
|
+
}
|
|
588
|
+
return;
|
|
589
|
+
case PbjOp.sub:
|
|
590
|
+
for (let k = 0; k < n; k++) {
|
|
591
|
+
i[code[d + k]] -= i[code[s + k]];
|
|
592
|
+
}
|
|
593
|
+
return;
|
|
594
|
+
case PbjOp.mul:
|
|
595
|
+
for (let k = 0; k < n; k++) {
|
|
596
|
+
i[code[d + k]] = Math.imul(i[code[d + k]], i[code[s + k]]);
|
|
597
|
+
}
|
|
598
|
+
return;
|
|
599
|
+
case PbjOp.div:
|
|
600
|
+
// Flash crashes dividing by 0; 0 here.
|
|
601
|
+
for (let k = 0; k < n; k++) {
|
|
602
|
+
const y = i[code[s + k]];
|
|
603
|
+
i[code[d + k]] = y === 0 ? 0 : (i[code[d + k]] / y) | 0;
|
|
604
|
+
}
|
|
605
|
+
return;
|
|
606
|
+
case PbjOp.mov:
|
|
607
|
+
case PbjOp.intToBool:
|
|
608
|
+
for (let k = 0; k < n; k++) {
|
|
609
|
+
i[code[d + k]] = i[code[s + k]];
|
|
610
|
+
}
|
|
611
|
+
return;
|
|
612
|
+
case PbjOp.equal:
|
|
613
|
+
i[code[at + SRC3]] = n === 1 && i[code[d]] === i[code[s]] ? 1 : 0;
|
|
614
|
+
return;
|
|
615
|
+
case PbjOp.notEqual:
|
|
616
|
+
i[code[at + SRC3]] = n === 1 && i[code[d]] === i[code[s]] ? 0 : 1;
|
|
617
|
+
return;
|
|
618
|
+
case PbjOp.lessThan:
|
|
619
|
+
for (let k = 0; k < n; k++) {
|
|
620
|
+
i[code[at + SRC3 + k]] = i[code[d + k]] < i[code[s + k]] ? 1 : 0;
|
|
621
|
+
}
|
|
622
|
+
return;
|
|
623
|
+
case PbjOp.lessThanEqual:
|
|
624
|
+
for (let k = 0; k < n; k++) {
|
|
625
|
+
i[code[at + SRC3 + k]] = i[code[d + k]] <= i[code[s + k]] ? 1 : 0;
|
|
626
|
+
}
|
|
627
|
+
return;
|
|
628
|
+
case PbjOp.vectorEqual:
|
|
629
|
+
for (let k = 0; k < n; k++) {
|
|
630
|
+
i[code[at + SRC3 + k]] = i[code[d + k]] === i[code[s + k]] ? 1 : 0;
|
|
631
|
+
}
|
|
632
|
+
return;
|
|
633
|
+
case PbjOp.vectorNotEqual:
|
|
634
|
+
for (let k = 0; k < n; k++) {
|
|
635
|
+
i[code[at + SRC3 + k]] = i[code[d + k]] !== i[code[s + k]] ? 1 : 0;
|
|
636
|
+
}
|
|
637
|
+
return;
|
|
638
|
+
// The logical operations are bitwise, as adl does them.
|
|
639
|
+
case PbjOp.logicalNot:
|
|
640
|
+
i[code[d]] = ~i[code[s]];
|
|
641
|
+
return;
|
|
642
|
+
case PbjOp.logicalAnd:
|
|
643
|
+
i[code[d]] &= i[code[s]];
|
|
644
|
+
return;
|
|
645
|
+
case PbjOp.logicalOr:
|
|
646
|
+
i[code[d]] |= i[code[s]];
|
|
647
|
+
return;
|
|
648
|
+
case PbjOp.logicalXor:
|
|
649
|
+
i[code[d]] ^= i[code[s]];
|
|
650
|
+
return;
|
|
651
|
+
case PbjOp.any: {
|
|
652
|
+
let v = 0;
|
|
653
|
+
for (let k = 0; k < n; k++) {
|
|
654
|
+
v |= i[code[s + k]];
|
|
655
|
+
}
|
|
656
|
+
i[code[d]] = v;
|
|
657
|
+
return;
|
|
658
|
+
}
|
|
659
|
+
case PbjOp.all: {
|
|
660
|
+
let v = -1;
|
|
661
|
+
for (let k = 0; k < n; k++) {
|
|
662
|
+
v &= i[code[s + k]];
|
|
663
|
+
}
|
|
664
|
+
i[code[d]] = v;
|
|
665
|
+
return;
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
}
|
|
669
|
+
/** An operation on matrices, each column at its offset; a 2x2 matrix's columns are two lanes of one register. */
|
|
670
|
+
matrix(at) {
|
|
671
|
+
const { code, f } = this;
|
|
672
|
+
const op = code[at] & 0xff;
|
|
673
|
+
const n = code[at + LANES];
|
|
674
|
+
const d = at + DST;
|
|
675
|
+
const s = at + SRC;
|
|
676
|
+
const scratch = this.scratch;
|
|
677
|
+
switch (op) {
|
|
678
|
+
case PbjOp.matMatMul: {
|
|
679
|
+
for (let c = 0; c < n; c++) {
|
|
680
|
+
const column = code[s + c];
|
|
681
|
+
for (let r = 0; r < n; r++) {
|
|
682
|
+
let sum = 0;
|
|
683
|
+
for (let k = 0; k < n; k++) {
|
|
684
|
+
sum = Math.fround(sum + Math.fround(f[code[d + k] + r] * f[column + k]));
|
|
685
|
+
}
|
|
686
|
+
scratch[c * n + r] = sum;
|
|
687
|
+
}
|
|
688
|
+
}
|
|
689
|
+
for (let c = 0; c < n; c++) {
|
|
690
|
+
for (let r = 0; r < n; r++) {
|
|
691
|
+
f[code[d + c] + r] = scratch[c * n + r];
|
|
692
|
+
}
|
|
693
|
+
}
|
|
694
|
+
return;
|
|
695
|
+
}
|
|
696
|
+
case PbjOp.matVecMul:
|
|
697
|
+
case PbjOp.vecMatMul: {
|
|
698
|
+
for (let k = 0; k < n; k++) {
|
|
699
|
+
scratch[k] = f[code[d + k]];
|
|
700
|
+
}
|
|
701
|
+
for (let k = 0; k < n; k++) {
|
|
702
|
+
let sum = 0;
|
|
703
|
+
for (let j = 0; j < n; j++) {
|
|
704
|
+
const m = op === PbjOp.matVecMul ? f[code[s + j] + k] : f[code[s + k] + j];
|
|
705
|
+
sum = Math.fround(sum + Math.fround(m * scratch[j]));
|
|
706
|
+
}
|
|
707
|
+
f[code[d + k]] = sum;
|
|
708
|
+
}
|
|
709
|
+
return;
|
|
710
|
+
}
|
|
711
|
+
default: {
|
|
712
|
+
// add, sub, mul and mov, element by element.
|
|
713
|
+
for (let c = 0; c < n; c++) {
|
|
714
|
+
for (let r = 0; r < n; r++) {
|
|
715
|
+
const o = code[d + c] + r;
|
|
716
|
+
const x = f[code[s + c] + r];
|
|
717
|
+
switch (op) {
|
|
718
|
+
case PbjOp.add:
|
|
719
|
+
f[o] += x;
|
|
720
|
+
break;
|
|
721
|
+
case PbjOp.sub:
|
|
722
|
+
f[o] -= x;
|
|
723
|
+
break;
|
|
724
|
+
case PbjOp.mul:
|
|
725
|
+
f[o] *= x;
|
|
726
|
+
break;
|
|
727
|
+
default:
|
|
728
|
+
f[o] = x;
|
|
729
|
+
}
|
|
730
|
+
}
|
|
731
|
+
}
|
|
732
|
+
}
|
|
733
|
+
}
|
|
734
|
+
}
|
|
735
|
+
sample(at, linear) {
|
|
736
|
+
const { code, f, i } = this;
|
|
737
|
+
const n = code[at + LANES];
|
|
738
|
+
const lanes = code[at + SRC3] ? i : f;
|
|
739
|
+
const x = lanes[code[at + SRC]];
|
|
740
|
+
const y = lanes[code[at + SRC + 1]];
|
|
741
|
+
const image = this.images[code[at + AUX]];
|
|
742
|
+
const d = at + DST;
|
|
743
|
+
if (!image) {
|
|
744
|
+
return;
|
|
745
|
+
}
|
|
746
|
+
if (image.pixels) {
|
|
747
|
+
const p = linear ? sampleBytesLinear(image, x, y) : sampleBytesNearest(image, x, y);
|
|
748
|
+
for (let k = 0; k < n; k++) {
|
|
749
|
+
// r, g, b, a: ARGB's bytes from the third down, then the top.
|
|
750
|
+
const shift = k === 3 ? 24 : 16 - k * 8;
|
|
751
|
+
f[code[d + k]] = ((p >>> shift) & 0xff) * BYTE;
|
|
752
|
+
}
|
|
753
|
+
return;
|
|
754
|
+
}
|
|
755
|
+
const floats = image.floats;
|
|
756
|
+
const channels = image.channels;
|
|
757
|
+
for (let k = 0; k < n; k++) {
|
|
758
|
+
f[code[d + k]] =
|
|
759
|
+
k >= channels
|
|
760
|
+
? 0
|
|
761
|
+
: linear
|
|
762
|
+
? sampleFloatLinear(image, floats, x, y, k)
|
|
763
|
+
: floats[(clampIndex(Math.floor(y), image.height) * image.width +
|
|
764
|
+
clampIndex(Math.floor(x), image.width)) *
|
|
765
|
+
channels +
|
|
766
|
+
k];
|
|
767
|
+
}
|
|
768
|
+
}
|
|
769
|
+
}
|
|
770
|
+
/** A float as a bitmap's byte: clamped, NaN as 0, then rounded to the nearest, a half to the even. */
|
|
771
|
+
export function outputByte(v) {
|
|
772
|
+
const c = v > 0 ? (v < 1 ? v : 1) : 0;
|
|
773
|
+
return nearest(Math.fround(c * 255));
|
|
774
|
+
}
|
|
775
|
+
/**
|
|
776
|
+
* Output pixel `at` of `out`, `channels` floats a pixel, as a bitmap's
|
|
777
|
+
* premultiplied ARGB: each byte by outputByte, each colour at most its
|
|
778
|
+
* alpha, three channels opaque; an opaque bitmap's alpha 255.
|
|
779
|
+
*/
|
|
780
|
+
export function outputPixel(out, at, channels, transparent) {
|
|
781
|
+
const a = channels > 3 ? outputByte(out[at + 3]) : 255;
|
|
782
|
+
const r = Math.min(a, outputByte(out[at]));
|
|
783
|
+
const g = Math.min(a, channels > 1 ? outputByte(out[at + 1]) : 0);
|
|
784
|
+
const b = Math.min(a, channels > 2 ? outputByte(out[at + 2]) : 0);
|
|
785
|
+
return (((transparent ? a : 255) << 24) | (r << 16) | (g << 8) | b) >>> 0;
|
|
786
|
+
}
|
|
787
|
+
/**
|
|
788
|
+
* BitmapData.applyFilter with a ShaderFilter, as adl runs it: the kernel's
|
|
789
|
+
* first input is the whole source, transparent past its edges, and each
|
|
790
|
+
* pixel's coordinate is the destination's, moved back by the left and top
|
|
791
|
+
* extensions, whatever the rect and point; what it writes is as large as
|
|
792
|
+
* the source grown by the extensions, from the point less twice the
|
|
793
|
+
* rect's corner and the left and top extensions, clipped to the
|
|
794
|
+
* destination (the shader-filters case's probes). Premultiplied, each
|
|
795
|
+
* colour at most its alpha; an opaque destination stays opaque.
|
|
796
|
+
*/
|
|
797
|
+
export function shaderFilter(dest, source, rect, dx, dy, extensions, use, program) {
|
|
798
|
+
const [left, top, right, bottom] = extensions;
|
|
799
|
+
const fromX = dx - 2 * rect.x - left;
|
|
800
|
+
const fromY = dy - 2 * rect.y - top;
|
|
801
|
+
const x0 = Math.max(0, fromX);
|
|
802
|
+
const y0 = Math.max(0, fromY);
|
|
803
|
+
const x1 = Math.min(dest.width, fromX + source.width + left + right);
|
|
804
|
+
const y1 = Math.min(dest.height, fromY + source.height + top + bottom);
|
|
805
|
+
if (x1 <= x0 || y1 <= y0) {
|
|
806
|
+
return;
|
|
807
|
+
}
|
|
808
|
+
const images = new Map(use.images);
|
|
809
|
+
const first = use.kernel.inputs[0];
|
|
810
|
+
images.set(first.index, {
|
|
811
|
+
width: source.width,
|
|
812
|
+
height: source.height,
|
|
813
|
+
pixels: source.readable,
|
|
814
|
+
channels: first.channels,
|
|
815
|
+
clear: true,
|
|
816
|
+
});
|
|
817
|
+
const width = x1 - x0;
|
|
818
|
+
const height = y1 - y0;
|
|
819
|
+
const channels = program.channels;
|
|
820
|
+
const out = new Float32Array(width * height * channels);
|
|
821
|
+
program.run(use.values, images, width, height, out, x0 - left, y0 - top);
|
|
822
|
+
const pixels = dest.pixels;
|
|
823
|
+
for (let y = 0, at = 0; y < height; y++) {
|
|
824
|
+
for (let x = 0; x < width; x++, at += channels) {
|
|
825
|
+
pixels[(y0 + y) * dest.width + x0 + x] = outputPixel(out, at, channels, dest.transparent);
|
|
826
|
+
}
|
|
827
|
+
}
|
|
828
|
+
dest.changed();
|
|
829
|
+
}
|
|
830
|
+
/** A coordinate's pixel, clamped to the edges, NaN to the first. */
|
|
831
|
+
function clampIndex(v, size) {
|
|
832
|
+
if (!(v > 0)) {
|
|
833
|
+
return 0;
|
|
834
|
+
}
|
|
835
|
+
return v >= size ? size - 1 : v;
|
|
836
|
+
}
|
|
837
|
+
/** A pixel of a clear image, 0 past its edges, as a pixel at (x, y) is, NaN as 0. */
|
|
838
|
+
function clearPixel(image, x, y) {
|
|
839
|
+
const i = Number.isNaN(x) ? 0 : x;
|
|
840
|
+
const j = Number.isNaN(y) ? 0 : y;
|
|
841
|
+
return i >= 0 && i < image.width && j >= 0 && j < image.height
|
|
842
|
+
? image.pixels[j * image.width + i]
|
|
843
|
+
: 0;
|
|
844
|
+
}
|
|
845
|
+
function sampleBytesNearest(image, x, y) {
|
|
846
|
+
if (image.clear) {
|
|
847
|
+
return clearPixel(image, Math.floor(x), Math.floor(y));
|
|
848
|
+
}
|
|
849
|
+
const pixels = image.pixels;
|
|
850
|
+
return pixels[clampIndex(Math.floor(y), image.height) * image.width + clampIndex(Math.floor(x), image.width)];
|
|
851
|
+
}
|
|
852
|
+
/**
|
|
853
|
+
* Bilinear as adl filters a BitmapData: each axis' weight in 256ths,
|
|
854
|
+
* rounded, the row first, then the column, each step's byte cut down.
|
|
855
|
+
*/
|
|
856
|
+
function sampleBytesLinear(image, x, y) {
|
|
857
|
+
const pixels = image.pixels;
|
|
858
|
+
const fx = x - 0.5;
|
|
859
|
+
const fy = y - 0.5;
|
|
860
|
+
const x0 = Math.floor(fx);
|
|
861
|
+
const y0 = Math.floor(fy);
|
|
862
|
+
const wx = Math.round((fx - x0) * 256) || 0;
|
|
863
|
+
const wy = Math.round((fy - y0) * 256) || 0;
|
|
864
|
+
const w = image.width;
|
|
865
|
+
const h = image.height;
|
|
866
|
+
let p00;
|
|
867
|
+
let p10;
|
|
868
|
+
let p01;
|
|
869
|
+
let p11;
|
|
870
|
+
if (image.clear) {
|
|
871
|
+
p00 = clearPixel(image, x0, y0);
|
|
872
|
+
p10 = clearPixel(image, x0 + 1, y0);
|
|
873
|
+
p01 = clearPixel(image, x0, y0 + 1);
|
|
874
|
+
p11 = clearPixel(image, x0 + 1, y0 + 1);
|
|
875
|
+
}
|
|
876
|
+
else {
|
|
877
|
+
const left = clampIndex(x0, w);
|
|
878
|
+
const right = clampIndex(x0 + 1, w);
|
|
879
|
+
const top = clampIndex(y0, h) * w;
|
|
880
|
+
const bottom = clampIndex(y0 + 1, h) * w;
|
|
881
|
+
p00 = pixels[top + left];
|
|
882
|
+
p10 = pixels[top + right];
|
|
883
|
+
p01 = pixels[bottom + left];
|
|
884
|
+
p11 = pixels[bottom + right];
|
|
885
|
+
}
|
|
886
|
+
let out = 0;
|
|
887
|
+
for (let shift = 0; shift < 32; shift += 8) {
|
|
888
|
+
const row0 = (((p00 >>> shift) & 0xff) * (256 - wx) + ((p10 >>> shift) & 0xff) * wx) >> 8;
|
|
889
|
+
const row1 = (((p01 >>> shift) & 0xff) * (256 - wx) + ((p11 >>> shift) & 0xff) * wx) >> 8;
|
|
890
|
+
out |= ((row0 * (256 - wy) + row1 * wy) >> 8) << shift;
|
|
891
|
+
}
|
|
892
|
+
return out >>> 0;
|
|
893
|
+
}
|
|
894
|
+
function sampleFloatLinear(image, floats, x, y, k) {
|
|
895
|
+
const fx = x - 0.5;
|
|
896
|
+
const fy = y - 0.5;
|
|
897
|
+
const x0 = Math.floor(fx);
|
|
898
|
+
const y0 = Math.floor(fy);
|
|
899
|
+
// Weights in 256ths, as for a BitmapData.
|
|
900
|
+
const tx = (Math.round((fx - x0) * 256) || 0) / 256;
|
|
901
|
+
const ty = (Math.round((fy - y0) * 256) || 0) / 256;
|
|
902
|
+
const w = image.width;
|
|
903
|
+
const c = image.channels;
|
|
904
|
+
const left = clampIndex(x0, w) * c + k;
|
|
905
|
+
const right = clampIndex(x0 + 1, w) * c + k;
|
|
906
|
+
const top = clampIndex(y0, image.height) * w * c;
|
|
907
|
+
const bottom = clampIndex(y0 + 1, image.height) * w * c;
|
|
908
|
+
const row0 = floats[top + left] * (1 - tx) + floats[top + right] * tx;
|
|
909
|
+
const row1 = floats[bottom + left] * (1 - tx) + floats[bottom + right] * tx;
|
|
910
|
+
return row0 * (1 - ty) + row1 * ty;
|
|
911
|
+
}
|