scratch0-5 / plugins /GeniePlugin.js
soiz1's picture
Upload folder using huggingface_hub
8f3f8db verified
/* Smalltalk from Squeak4.5 with VMMaker 4.13.6 translated as JS source on 14 November 2014 12:21:50 am */
/* Automatically generated by
JSSmartSyntaxPluginCodeGenerator VMMakerJS-bf.17 uuid: 399be48b-95d8-4722-bdcc-39a94a12c486
from
GeniePlugin VMMaker-bf.353 uuid: 8ae25e7e-8d2c-451e-8277-598b30e9c002
*/
(function GeniePlugin() {
"use strict";
var VM_PROXY_MAJOR = 1;
var VM_PROXY_MINOR = 11;
/*** Functions ***/
function CLASSOF(obj) { return typeof obj === "number" ? interpreterProxy.classSmallInteger() : obj.sqClass }
function SIZEOF(obj) { return obj.pointers ? obj.pointers.length : obj.words ? obj.words.length : obj.bytes ? obj.bytes.length : 0 }
function BYTESIZEOF(obj) { return obj.bytes ? obj.bytes.length : obj.words ? obj.words.length * 4 : 0 }
function DIV(a, b) { return Math.floor(a / b) | 0; } // integer division
function MOD(a, b) { return a - DIV(a, b) * b | 0; } // signed modulus
function SHL(a, b) { return b > 31 ? 0 : a << b; } // fix JS shift
function SHR(a, b) { return b > 31 ? 0 : a >>> b; } // fix JS shift
function SHIFT(a, b) { return b < 0 ? (b < -31 ? 0 : a >>> (0-b) ) : (b > 31 ? 0 : a << b); }
function PTR_ADD(p, n) { return new Int32Array(p.buffer, p.byteOffset + n * 4); }
function FPTR_ADD(p, n) { return new Float32Array(p.buffer, p.byteOffset + n * 4); }
/*** Variables ***/
var interpreterProxy = null;
var moduleName = "GeniePlugin v2.0 14 November 2014 (e)";
/* arguments are pointer to ints paired as x,y coordinates of points */
function cSquaredDistanceFromto(aPoint, bPoint) {
var aPointX;
var bPointX;
var xDiff;
var aPointY;
var bPointY;
var yDiff;
aPointX = aPoint[0];
aPointY = aPoint[1];
bPointX = bPoint[0];
bPointY = bPoint[1];
xDiff = bPointX - aPointX;
yDiff = bPointY - aPointY;
return (xDiff * xDiff) + (yDiff * yDiff);
}
function cSubstAngleFactorFromto(startDegreeNumber, endDegreeNumber) {
var absDiff;
absDiff = Math.abs(endDegreeNumber - startDegreeNumber);
if (absDiff > 180) {
absDiff = 360 - absDiff;
}
return (absDiff * absDiff) >>> 6;
}
/* Note: This is hardcoded so it can be run from Squeak.
The module name is used for validating a module *after*
it is loaded to check if it does really contain the module
we're thinking it contains. This is important! */
function getModuleName() {
return moduleName;
}
function halt() {
;
}
function majorNO() {
return 2;
}
function minorNO() {
return 0;
}
function msg(s) {
console.log(moduleName + ": " + s);
}
function primSameClassAbsoluteStrokeDistanceMyPoints_otherPoints_myVectors_otherVectors_mySquaredLengths_otherSquaredLengths_myAngles_otherAngles_maxSizeAndReferenceFlag_rowBase_rowInsertRemove_rowInsertRemoveCount() {
var otherAngles;
var otherSquaredLengthsSize;
var forReference;
var jM1;
var iM1;
var jM1T2;
var base;
var insert;
var otherVectors;
var otherVectorsSize;
var otherSquaredLengths;
var rowBaseSize;
var myPoints;
var jLimiT;
var mySquaredLengths;
var additionalMultiInsertRemoveCost;
var remove;
var otherPoints;
var otherPointsSize;
var myVectors;
var rowInsertRemoveCount;
var rowBase;
var maxDist;
var iM1T2;
var j;
var insertRemove;
var i;
var myVectorsSize;
var subst;
var maxSize;
var removeBase;
var substBase;
var myAngles;
var insertRemoveCount;
var rowInsertRemove;
var insertBase;
var myPointsOop;
var otherPointsOop;
var myVectorsOop;
var otherVectorsOop;
var mySquaredLengthsOop;
var otherSquaredLengthsOop;
var myAnglesOop;
var otherAnglesOop;
var maxSizeAndRefFlag;
var rowBaseOop;
var rowInsertRemoveOop;
var rowInsertRemoveCountOop;
var _return_value;
myPointsOop = interpreterProxy.stackValue(11);
otherPointsOop = interpreterProxy.stackValue(10);
myVectorsOop = interpreterProxy.stackValue(9);
otherVectorsOop = interpreterProxy.stackValue(8);
mySquaredLengthsOop = interpreterProxy.stackValue(7);
otherSquaredLengthsOop = interpreterProxy.stackValue(6);
myAnglesOop = interpreterProxy.stackValue(5);
otherAnglesOop = interpreterProxy.stackValue(4);
maxSizeAndRefFlag = interpreterProxy.stackIntegerValue(3);
rowBaseOop = interpreterProxy.stackValue(2);
rowInsertRemoveOop = interpreterProxy.stackValue(1);
rowInsertRemoveCountOop = interpreterProxy.stackValue(0);
if (interpreterProxy.failed()) {
return null;
}
if (interpreterProxy.failed()) {
msg("failed 1");
return null;
}
interpreterProxy.success((((((((((interpreterProxy.isWords(myPointsOop) && interpreterProxy.isWords(otherPointsOop)) && interpreterProxy.isWords(myVectorsOop)) && interpreterProxy.isWords(otherVectorsOop)) && interpreterProxy.isWords(mySquaredLengthsOop)) && interpreterProxy.isWords(otherSquaredLengthsOop)) && interpreterProxy.isWords(myAnglesOop)) && interpreterProxy.isWords(otherAnglesOop)) && interpreterProxy.isWords(rowBaseOop)) && interpreterProxy.isWords(rowInsertRemoveOop)) && interpreterProxy.isWords(rowInsertRemoveCountOop));
if (interpreterProxy.failed()) {
msg("failed 2");
return null;
}
interpreterProxy.success(interpreterProxy.isMemberOf(myPointsOop, "PointArray") && interpreterProxy.isMemberOf(otherPointsOop, "PointArray"));
if (interpreterProxy.failed()) {
msg("failed 3");
return null;
}
myPoints = myPointsOop.wordsAsInt32Array();
otherPoints = otherPointsOop.wordsAsInt32Array();
myVectors = myVectorsOop.wordsAsInt32Array();
otherVectors = otherVectorsOop.wordsAsInt32Array();
mySquaredLengths = mySquaredLengthsOop.wordsAsInt32Array();
otherSquaredLengths = otherSquaredLengthsOop.wordsAsInt32Array();
myAngles = myAnglesOop.wordsAsInt32Array();
otherAngles = otherAnglesOop.wordsAsInt32Array();
rowBase = rowBaseOop.wordsAsInt32Array();
rowInsertRemove = rowInsertRemoveOop.wordsAsInt32Array();
/* Note: myPointsSize and mySquaredLengthsSize variables eliminated to reduce
method temporary variable count for closure-enabled images */
/* PointArrays */
/* myPointsSize := (interpreterProxy stSizeOf: myPointsOop) bitShift: -1. */
rowInsertRemoveCount = rowInsertRemoveCountOop.wordsAsInt32Array();
otherPointsSize = SIZEOF(otherPointsOop) >>> 1;
myVectorsSize = SIZEOF(myVectorsOop) >>> 1;
/* IntegerArrays */
/* mySquaredLengthsSize := interpreterProxy stSizeOf: mySquaredLengthsOop. */
otherVectorsSize = SIZEOF(otherVectorsOop) >>> 1;
otherSquaredLengthsSize = SIZEOF(otherSquaredLengthsOop);
rowBaseSize = SIZEOF(rowBaseOop);
interpreterProxy.success(((rowBaseSize === SIZEOF(rowInsertRemoveOop)) && (rowBaseSize === SIZEOF(rowInsertRemoveCountOop))) && (rowBaseSize > otherVectorsSize));
if (interpreterProxy.failed()) {
msg("failed 4");
return null;
}
interpreterProxy.success((((((SIZEOF(mySquaredLengthsOop) >= (myVectorsSize - 1)) && ((SIZEOF(myPointsOop) >>> 1) >= myVectorsSize)) && (otherSquaredLengthsSize >= (otherVectorsSize - 1))) && (otherPointsSize >= otherVectorsSize)) && (SIZEOF(myAnglesOop) >= (myVectorsSize - 1))) && (SIZEOF(otherAnglesOop) >= (otherVectorsSize - 1)));
if (interpreterProxy.failed()) {
msg("failed 5");
return null;
}
forReference = maxSizeAndRefFlag & 1;
maxSize = maxSizeAndRefFlag >>> 1;
maxDist = 1 << 29;
if (forReference) {
additionalMultiInsertRemoveCost = 0;
} else {
additionalMultiInsertRemoveCost = (maxSize * maxSize) >>> 10;
}
rowBase[0] = 0;
rowInsertRemove[0] = 0;
rowInsertRemoveCount[0] = 2;
insertRemove = 0 - additionalMultiInsertRemoveCost;
jLimiT = otherVectorsSize;
if (!((otherPointsSize >= (jLimiT - 1)) && (otherSquaredLengthsSize >= (jLimiT - 1)))) {
interpreterProxy.primitiveFail();
return null;
}
for (j = 1; j <= jLimiT; j++) {
jM1 = j - 1;
insertRemove = (insertRemove + ((otherSquaredLengths[jM1] + cSquaredDistanceFromto(PTR_ADD(otherPoints, (jM1 << 1)), myPoints)) >>> 7)) + additionalMultiInsertRemoveCost;
rowInsertRemove[j] = insertRemove;
rowBase[j] = (insertRemove * j);
rowInsertRemoveCount[j] = (j + 1);
}
insertRemove = rowInsertRemove[0] - additionalMultiInsertRemoveCost;
for (i = 1; i <= myVectorsSize; i++) {
iM1 = i - 1;
iM1T2 = iM1 << 1;
substBase = rowBase[0];
insertRemove = (insertRemove + ((mySquaredLengths[iM1] + cSquaredDistanceFromto(PTR_ADD(myPoints, iM1T2), otherPoints)) >>> 7)) + additionalMultiInsertRemoveCost;
rowInsertRemove[0] = insertRemove;
rowBase[0] = (insertRemove * i);
rowInsertRemoveCount[0] = (i + 1);
jLimiT = otherVectorsSize;
for (j = 1; j <= jLimiT; j++) {
jM1 = j - 1;
jM1T2 = jM1 << 1;
removeBase = rowBase[j];
insertBase = rowBase[jM1];
remove = (mySquaredLengths[iM1] + cSquaredDistanceFromto(PTR_ADD(myPoints, iM1T2), PTR_ADD(otherPoints, (j << 1)))) >>> 7;
if (((insertRemove = rowInsertRemove[j])) === 0) {
removeBase += remove;
} else {
removeBase = (removeBase + insertRemove) + (remove * rowInsertRemoveCount[j]);
remove += insertRemove;
}
insert = (otherSquaredLengths[jM1] + cSquaredDistanceFromto(PTR_ADD(otherPoints, jM1T2), PTR_ADD(myPoints, (i << 1)))) >>> 7;
if (((insertRemove = rowInsertRemove[jM1])) === 0) {
insertBase += insert;
} else {
insertBase = (insertBase + insertRemove) + (insert * rowInsertRemoveCount[jM1]);
insert += insertRemove;
}
if (forReference) {
substBase = maxDist;
} else {
subst = ((cSquaredDistanceFromto(PTR_ADD(otherVectors, jM1T2), PTR_ADD(myVectors, iM1T2)) + cSquaredDistanceFromto(PTR_ADD(otherPoints, jM1T2), PTR_ADD(myPoints, iM1T2))) * (16 + cSubstAngleFactorFromto(otherAngles[jM1], myAngles[iM1]))) >>> 11;
substBase += subst;
}
if ((substBase <= removeBase) && (substBase <= insertBase)) {
base = substBase;
insertRemove = 0;
insertRemoveCount = 1;
} else {
if (removeBase <= insertBase) {
base = removeBase;
insertRemove = remove + additionalMultiInsertRemoveCost;
insertRemoveCount = rowInsertRemoveCount[j] + 1;
} else {
base = insertBase;
insertRemove = insert + additionalMultiInsertRemoveCost;
insertRemoveCount = rowInsertRemoveCount[jM1] + 1;
}
}
substBase = rowBase[j];
rowBase[j] = Math.min(base, maxDist);
rowInsertRemove[j] = Math.min(insertRemove, maxDist);
rowInsertRemoveCount[j] = insertRemoveCount;
}
insertRemove = rowInsertRemove[0];
}
_return_value = base;
if (interpreterProxy.failed()) {
return null;
}
interpreterProxy.popthenPush(13, _return_value);
return null;
}
/* majorNO * 1000 + minorNO */
function primVersionNO() {
var _return_value;
_return_value = ((majorNO() * 1000) + minorNO());
if (interpreterProxy.failed()) {
return null;
}
interpreterProxy.popthenPush(1, _return_value);
return null;
}
/* Note: This is coded so that is can be run from Squeak. */
function setInterpreter(anInterpreter) {
var ok;
interpreterProxy = anInterpreter;
ok = interpreterProxy.majorVersion() == VM_PROXY_MAJOR;
if (ok === false) {
return false;
}
ok = interpreterProxy.minorVersion() >= VM_PROXY_MINOR;
return ok;
}
function registerPlugin() {
if (typeof Squeak === "object" && Squeak.registerExternalModule) {
Squeak.registerExternalModule("GeniePlugin", {
primVersionNO: primVersionNO,
setInterpreter: setInterpreter,
primSameClassAbsoluteStrokeDistanceMyPoints_otherPoints_myVectors_otherVectors_mySquaredLengths_otherSquaredLengths_myAngles_otherAngles_maxSizeAndReferenceFlag_rowBase_rowInsertRemove_rowInsertRemoveCount: primSameClassAbsoluteStrokeDistanceMyPoints_otherPoints_myVectors_otherVectors_mySquaredLengths_otherSquaredLengths_myAngles_otherAngles_maxSizeAndReferenceFlag_rowBase_rowInsertRemove_rowInsertRemoveCount,
getModuleName: getModuleName,
});
} else self.setTimeout(registerPlugin, 100);
}
registerPlugin();
})(); // Register module/plugin