David Stes
2021-08-01 86714bffbf532621b503f3ef02f3edd9da050300
cog-spur, stack-spur: upgrade to 3003

12 files modified
1240 ■■■■■ changed files
components/runtime/smalltalk/cog-spur/Makefile 10 ●●●● patch | view | raw | blame | history
components/runtime/smalltalk/cog-spur/manifests/sample-manifest.p5m 84 ●●●● patch | view | raw | blame | history
components/runtime/smalltalk/cog-spur/patches/02-sqSCCSVersion.patch 18 ●●●● patch | view | raw | blame | history
components/runtime/smalltalk/cog-spur/patches/03-sqPluginsSCCSVersion.patch 12 ●●●● patch | view | raw | blame | history
components/runtime/smalltalk/cog-spur/patches/08-VectorEnginePlugin.patch 926 ●●●●● patch | view | raw | blame | history
components/runtime/smalltalk/cog-spur/squeak.ips 2 ●●● patch | view | raw | blame | history
components/runtime/smalltalk/stack-spur/Makefile 8 ●●●● patch | view | raw | blame | history
components/runtime/smalltalk/stack-spur/manifests/sample-manifest.p5m 80 ●●●● patch | view | raw | blame | history
components/runtime/smalltalk/stack-spur/patches/02-sqSCCSVersion.patch 22 ●●●● patch | view | raw | blame | history
components/runtime/smalltalk/stack-spur/patches/03-sqPluginsSCCSVersion.patch 12 ●●●● patch | view | raw | blame | history
components/runtime/smalltalk/stack-spur/patches/08-VectorEnginePlugin.patch 64 ●●●● patch | view | raw | blame | history
components/runtime/smalltalk/stack-spur/squeak.ips 2 ●●● patch | view | raw | blame | history
components/runtime/smalltalk/cog-spur/Makefile
@@ -28,9 +28,10 @@
# sometimes the Stack VM is generated from a different VMMaker as the Cog VM
COMPONENT_NAME=        cog-spur
COMPONENT_VERSION=    5.0.2985
GIT_TAG=        sun-v5.0.31
PLUGIN_REV=        5.0-202107231657-cog
#COMPONENT_VERSION=    5.0.2967
COMPONENT_VERSION=    5.0.3003
GIT_TAG=        sun-v5.0.30
PLUGIN_REV=        5.0-202106151423-cog
COMPONENT_SUMMARY=    The OpenSmalltalk Cog Spur Virtual Machine
COMPONENT_PROJECT_URL=    http://www.squeak.org
COMPONENT_FMRI=        runtime/smalltalk/cog-spur
@@ -44,7 +45,7 @@
COMPONENT_SRC=        opensmalltalk-vm-$(GIT_TAG)
COMPONENT_ARCHIVE=    $(COMPONENT_SRC).tar.gz
COMPONENT_ARCHIVE_HASH=    sha256:27b898ae03a36ee10ff3e00b4627213f78f563c43dca07d2397e5c9ea64f3be8
COMPONENT_ARCHIVE_HASH=    sha256:f692245c66294bd8380dcd9664da865c19b4b3a55c420b20d2068551be049a3b
COMPONENT_ARCHIVE_URL=    https://codeload.github.com/cstes/opensmalltalk-vm/tar.gz/$(GIT_TAG)
TEST_TARGET= $(NO_TESTS)
@@ -106,7 +107,6 @@
rebuild-manifests::
    cp manifests/cog-spur.p5m cog-spur.p5m
    cp manifests/cog-spur-ssl.p5m cog-spur-ssl.p5m
    cp manifests/cog-spur-vep.p5m cog-spur-vep.p5m
    cp manifests/cog-spur-display-X11.p5m cog-spur-display-X11.p5m
    cp manifests/cog-spur-nodisplay.p5m cog-spur-nodisplay.p5m
    cp manifests/sample-manifest.p5m sample-manifest.p5m
components/runtime/smalltalk/cog-spur/manifests/sample-manifest.p5m
@@ -32,46 +32,46 @@
file path=usr/doc/squeak/README.Contributing
file path=usr/doc/squeak/README.Keyboard
file path=usr/doc/squeak/README.Sound
file path=usr/lib/$(MACH64)/squeak/5.0-202107231657-cog/B3DAcceleratorPlugin.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107231657-cog/DESPlugin.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107231657-cog/FileAttributesPlugin.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107231657-cog/ImmX11Plugin.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107231657-cog/LocalePlugin.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107231657-cog/MD5Plugin.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107231657-cog/SHA2Plugin.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107231657-cog/Squeak3D.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107231657-cog/SqueakFFIPrims.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107231657-cog/SqueakSSL.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107231657-cog/UUIDPlugin.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107231657-cog/UnicodePlugin.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107231657-cog/UnixOSProcessPlugin.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107231657-cog/VectorEnginePlugin.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107231657-cog/XDisplayControlPlugin.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107231657-cog/squeak
file path=usr/lib/$(MACH64)/squeak/5.0-202107231657-cog/vm-display-X11.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107231657-cog/vm-display-null.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107231657-cog/vm-sound-null.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107231657-cog/vm-sound-pulse.so
file path=usr/lib/squeak/5.0-202107231657-cog/B3DAcceleratorPlugin.so
file path=usr/lib/squeak/5.0-202107231657-cog/DESPlugin.so
file path=usr/lib/squeak/5.0-202107231657-cog/FileAttributesPlugin.so
file path=usr/lib/squeak/5.0-202107231657-cog/ImmX11Plugin.so
file path=usr/lib/squeak/5.0-202107231657-cog/LocalePlugin.so
file path=usr/lib/squeak/5.0-202107231657-cog/MD5Plugin.so
file path=usr/lib/squeak/5.0-202107231657-cog/SHA2Plugin.so
file path=usr/lib/squeak/5.0-202107231657-cog/Squeak3D.so
file path=usr/lib/squeak/5.0-202107231657-cog/SqueakFFIPrims.so
file path=usr/lib/squeak/5.0-202107231657-cog/SqueakSSL.so
file path=usr/lib/squeak/5.0-202107231657-cog/UUIDPlugin.so
file path=usr/lib/squeak/5.0-202107231657-cog/UnicodePlugin.so
file path=usr/lib/squeak/5.0-202107231657-cog/UnixOSProcessPlugin.so
file path=usr/lib/squeak/5.0-202107231657-cog/VectorEnginePlugin.so
file path=usr/lib/squeak/5.0-202107231657-cog/XDisplayControlPlugin.so
file path=usr/lib/squeak/5.0-202107231657-cog/squeak
file path=usr/lib/squeak/5.0-202107231657-cog/vm-display-X11.so
file path=usr/lib/squeak/5.0-202107231657-cog/vm-display-null.so
file path=usr/lib/squeak/5.0-202107231657-cog/vm-sound-null.so
file path=usr/lib/squeak/5.0-202107231657-cog/vm-sound-pulse.so
file path=usr/share/man/man1/inisqueak.1
hardlink path=usr/share/man/man1/squeak.1 target=inisqueak.1
file path=usr/lib/$(MACH64)/squeak/5.0-202106151423-cog/B3DAcceleratorPlugin.so
file path=usr/lib/$(MACH64)/squeak/5.0-202106151423-cog/DESPlugin.so
file path=usr/lib/$(MACH64)/squeak/5.0-202106151423-cog/FileAttributesPlugin.so
file path=usr/lib/$(MACH64)/squeak/5.0-202106151423-cog/ImmX11Plugin.so
file path=usr/lib/$(MACH64)/squeak/5.0-202106151423-cog/LocalePlugin.so
file path=usr/lib/$(MACH64)/squeak/5.0-202106151423-cog/MD5Plugin.so
file path=usr/lib/$(MACH64)/squeak/5.0-202106151423-cog/SHA2Plugin.so
file path=usr/lib/$(MACH64)/squeak/5.0-202106151423-cog/Squeak3D.so
file path=usr/lib/$(MACH64)/squeak/5.0-202106151423-cog/SqueakFFIPrims.so
file path=usr/lib/$(MACH64)/squeak/5.0-202106151423-cog/SqueakSSL.so
file path=usr/lib/$(MACH64)/squeak/5.0-202106151423-cog/UUIDPlugin.so
file path=usr/lib/$(MACH64)/squeak/5.0-202106151423-cog/UnicodePlugin.so
file path=usr/lib/$(MACH64)/squeak/5.0-202106151423-cog/UnixOSProcessPlugin.so
file path=usr/lib/$(MACH64)/squeak/5.0-202106151423-cog/VectorEnginePlugin.so
file path=usr/lib/$(MACH64)/squeak/5.0-202106151423-cog/XDisplayControlPlugin.so
file path=usr/lib/$(MACH64)/squeak/5.0-202106151423-cog/squeak
file path=usr/lib/$(MACH64)/squeak/5.0-202106151423-cog/vm-display-X11.so
file path=usr/lib/$(MACH64)/squeak/5.0-202106151423-cog/vm-display-null.so
file path=usr/lib/$(MACH64)/squeak/5.0-202106151423-cog/vm-sound-null.so
file path=usr/lib/$(MACH64)/squeak/5.0-202106151423-cog/vm-sound-pulse.so
file path=usr/lib/squeak/5.0-202106151423-cog/B3DAcceleratorPlugin.so
file path=usr/lib/squeak/5.0-202106151423-cog/DESPlugin.so
file path=usr/lib/squeak/5.0-202106151423-cog/FileAttributesPlugin.so
file path=usr/lib/squeak/5.0-202106151423-cog/ImmX11Plugin.so
file path=usr/lib/squeak/5.0-202106151423-cog/LocalePlugin.so
file path=usr/lib/squeak/5.0-202106151423-cog/MD5Plugin.so
file path=usr/lib/squeak/5.0-202106151423-cog/SHA2Plugin.so
file path=usr/lib/squeak/5.0-202106151423-cog/Squeak3D.so
file path=usr/lib/squeak/5.0-202106151423-cog/SqueakFFIPrims.so
file path=usr/lib/squeak/5.0-202106151423-cog/SqueakSSL.so
file path=usr/lib/squeak/5.0-202106151423-cog/UUIDPlugin.so
file path=usr/lib/squeak/5.0-202106151423-cog/UnicodePlugin.so
file path=usr/lib/squeak/5.0-202106151423-cog/UnixOSProcessPlugin.so
file path=usr/lib/squeak/5.0-202106151423-cog/VectorEnginePlugin.so
file path=usr/lib/squeak/5.0-202106151423-cog/XDisplayControlPlugin.so
file path=usr/lib/squeak/5.0-202106151423-cog/squeak
file path=usr/lib/squeak/5.0-202106151423-cog/vm-display-X11.so
file path=usr/lib/squeak/5.0-202106151423-cog/vm-display-null.so
file path=usr/lib/squeak/5.0-202106151423-cog/vm-sound-null.so
file path=usr/lib/squeak/5.0-202106151423-cog/vm-sound-pulse.so
hardlink path=usr/share/man/man1/inisqueak.1 target=squeak.1
file path=usr/share/man/man1/squeak.1
file path=usr/squeak
components/runtime/smalltalk/cog-spur/patches/02-sqSCCSVersion.patch
@@ -1,19 +1,19 @@
--- opensmalltalk-vm-sun-v5.0.31/platforms/Cross/vm/sqSCCSVersion.h    2021-07-23 18:57:17.000000000 +0200
+++ p0/opensmalltalk-vm-sun-v5.0.31/platforms/Cross/vm/sqSCCSVersion.h    2021-07-23 21:46:18.055452862 +0200
--- opensmalltalk-vm-sun-v5.0.30/platforms/Cross/vm/sqSCCSVersion.h    Tue Jun 15 16:23:32 2021
+++ p0/opensmalltalk-vm-sun-v5.0.30/platforms/Cross/vm/sqSCCSVersion.h    Fri Jun 18 20:26:28 2021
@@ -28,13 +28,13 @@
 
 #if SUBVERSION
 # define PREFIX "r"
-static char SvnRawRevisionString[] = "$Rev$";
+static char SvnRawRevisionString[] = "$Rev: 202107231657-cog $";
+static char SvnRawRevisionString[] = "$Rev: 202106151423-cog $";
 # define REV_START (SvnRawRevisionString + 6)
 
-static char SvnRawRevisionDate[] = "$Date$";
+static char SvnRawRevisionDate[] = "$Date: Fri Jul 23 18:57:17 2021 +0200 $";
+static char SvnRawRevisionDate[] = "$Date: Tue Jun 15 16:23:32 2021 +0200 $";
 # define DATE_START (SvnRawRevisionDate + 7)
 
-static char SvnRawRepositoryURL[] = "$URL$";
+static char SvnRawRepositoryURL[] = "$URL: stes@mix:src/opensmalltalk $";
+static char SvnRawRepositoryURL[] = "$URL: stes@pallas:src/opensmalltalk $";
 # define URL_START (SvnRawRepositoryURL + 6)
 
 static char *
@@ -22,19 +22,19 @@
 #elif GIT
 # define PREFIX ""
-static char GitRawRevisionString[] = "$Rev$";
+static char GitRawRevisionString[] = "$Rev: 202107231657-cog $";
+static char GitRawRevisionString[] = "$Rev: 202106151423-cog $";
 # define REV_START (GitRawRevisionString + 6)
 
-static char GitRawRevisionDate[] = "$Date$";
+static char GitRawRevisionDate[] = "$Date: Fri Jul 23 18:57:17 2021 +0200 $";
+static char GitRawRevisionDate[] = "$Date: Tue Jun 15 16:23:32 2021 +0200 $";
 # define DATE_START (GitRawRevisionDate + 7)
 
-static char GitRawRepositoryURL[] = "$URL$";
+static char GitRawRepositoryURL[] = "$URL: stes@mix:src/opensmalltalk $";
+static char GitRawRepositoryURL[] = "$URL: stes@pallas:src/opensmalltalk $";
 # define URL_START (GitRawRepositoryURL + 6)
 
-static char GitRawRevisionShortHash[] = "$CommitHash$";
+static char GitRawRevisionShortHash[] = "$CommitHash: 975c73577 $";
+static char GitRawRevisionShortHash[] = "$CommitHash: 4ad9fa56e $";
 # define SHORTHASH_START (GitRawRevisionShortHash + 13)
 
 static char *
components/runtime/smalltalk/cog-spur/patches/03-sqPluginsSCCSVersion.patch
@@ -1,15 +1,15 @@
--- opensmalltalk-vm-sun-v5.0.31/platforms/Cross/plugins/sqPluginsSCCSVersion.h    2021-07-23 18:57:17.000000000 +0200
+++ p0/opensmalltalk-vm-sun-v5.0.31/platforms/Cross/plugins/sqPluginsSCCSVersion.h    2021-07-23 21:46:18.007294407 +0200
--- opensmalltalk-vm-sun-v5.0.30/platforms/Cross/plugins/sqPluginsSCCSVersion.h    Tue Jun 15 16:23:32 2021
+++ p0/opensmalltalk-vm-sun-v5.0.30/platforms/Cross/plugins/sqPluginsSCCSVersion.h    Fri Jun 18 20:26:28 2021
@@ -9,10 +9,10 @@
  */
 
 #if SUBVERSION
-static char SvnRawPluginsRevisionString[] = "$Rev$";
+static char SvnRawPluginsRevisionString[] = "$Rev: 202107231657-cog $";
+static char SvnRawPluginsRevisionString[] = "$Rev: 202106151423-cog $";
 # define PLUGINS_REV_START (SvnRawPluginsRevisionString + 6)
 
-static char SvnRawPluginsRepositoryURL[] = "$URL$";
+static char SvnRawPluginsRepositoryURL[] = "$URL: stes@mix:src/opensmalltalk $";
+static char SvnRawPluginsRepositoryURL[] = "$URL: stes@pallas:src/opensmalltalk $";
 # define URL_START (SvnRawPluginsRepositoryURL + 6)
 
 static char *
@@ -18,11 +18,11 @@
 # undef URL_START
 #elif GIT
-static char GitRawPluginsRevisionString[] = "$Rev$";
+static char GitRawPluginsRevisionString[] = "$Rev: 202107231657-cog $";
+static char GitRawPluginsRevisionString[] = "$Rev: 202106151423-cog $";
 # define PLUGINS_REV_START (GitRawPluginsRevisionString + 6)
 
-static char GitRawPluginsRepositoryURL[] = "$URL$";
+static char GitRawPluginsRepositoryURL[] = "$URL: stes@mix:src/opensmalltalk $";
+static char GitRawPluginsRepositoryURL[] = "$URL: stes@pallas:src/opensmalltalk $";
 # define URL_START (GitRawPluginsRepositoryURL + 6)
 
 static char *
components/runtime/smalltalk/cog-spur/patches/08-VectorEnginePlugin.patch
@@ -1,24 +1,27 @@
--- opensmalltalk-vm-sun-v5.0.31/src/plugins/VectorEnginePlugin/VectorEnginePlugin.c    1970-01-01 01:00:00.000000000 +0000
+++ p0/opensmalltalk-vm-sun-v5.0.31/src/plugins/VectorEnginePlugin/VectorEnginePlugin.c    2021-07-23 21:15:45.616152455 +0000
@@ -0,0 +1,4820 @@
+/* Smalltalk from Cuis 5.0 with VMMaker 4.19.5 translated as C source on 23 July 2021 9:14:42.510163 pm */
--- opensmalltalk-vm-sun-v5.0.30/src/plugins/VectorEnginePlugin/VectorEnginePlugin.c    1970-01-01 01:00:00.000000000 +0000
+++ p0/opensmalltalk-vm-sun-v5.0.30/src/plugins/VectorEnginePlugin/VectorEnginePlugin.c    2021-06-18 19:58:39.303784182 +0000
@@ -0,0 +1,4624 @@
+/* Smalltalk from Cuis 5.0 with VMMaker 4.19.5 translated as C source on 18 June 2021 7:10:51.834109 pm */
+/* Automatically generated by PluginMaker (VMMaker) from     VectorEnginePlugin */
+
+
+/* Configuration options */
+#include "sqConfig.h"
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+/* Default EXPORT macro that does nothing (see comment in sq.h): */
+#define EXPORT(returnType) returnType
+
+/* Do not include the entire sq.h file but just those parts needed. */
+/*  The virtual machine proxy definition */
+#include "sqVirtualMachine.h"
+/* Configuration options */
+#include "sqConfig.h"
+/* Platform specific definitions */
+#include "sqPlatformSpecific.h"
+
+#define true 1
+#define false 0
+#define null 0  /* using 'null' because nil is predefined in Think C */
@@ -30,6 +33,7 @@
+#include <stdint.h>
+
+#include "sqMemoryAccess.h"
+
+
+/*** Constants ***/
+
@@ -97,7 +101,6 @@
+#pragma export on
+EXPORT(sqInt) primQuadraticBezier(void);
+EXPORT(sqInt) primQuadraticBezierWP(void);
+EXPORT(sqInt) primResetContour(void);
+EXPORT(sqInt) setInterpreter(struct VirtualMachine*anInterpreter);
+EXPORT(sqInt) primSpanBottom(void);
+EXPORT(sqInt) primSpanLeft(void);
@@ -111,10 +114,6 @@
+static sqInt updateAlphasForXy(float x, float y);
+static sqInt updateAlphasWPForXy(float x, float y);
+static sqInt updateAlphasWPZeroStrokeForXy(float x, float y);
+static sqInt updateContourForXy(float x, float y);
+#pragma export on
+EXPORT(sqInt) primUpdateContourLastLine(void);
+#pragma export off
+static sqInt updateEdgeCountAtXy(float x, float y);
+static sqInt updateEdgeCountWPAtXy(float x, float y);
+/*** Variables ***/
@@ -130,7 +129,6 @@
+static sqInt clipLeft;
+static sqInt clipRight;
+static sqInt clipTop;
+static float * contour;
+static sqInt currentClipsSubmorphs;
+static uint32_t currentMorphId;
+static uint32_t * edgeCounts;
@@ -145,18 +143,15 @@
+extern
+#endif
+struct VirtualMachine* interpreterProxy;
+static float leftAtThisY;
+static const char *moduleName =
+#ifdef SQUEAK_BUILTIN_PLUGIN
+    "VectorEnginePlugin 23 July 2021 (i)"
+    "VectorEnginePlugin 18 June 2021 (i)"
+#else
+    "VectorEnginePlugin 23 July 2021 (e)"
+    "VectorEnginePlugin 18 June 2021 (e)"
+#endif
+;
+static uint32_t * morphIds;
+static sqInt prevYRounded;
+static sqInt prevYTruncated;
+static float rightAtThisY;
+static sqInt simulator;
+static float spanBottom;
+static float spanLeft;
@@ -225,21 +220,19 @@
+    double tthetaSin;
+    unsigned *otherWordArray;
+    unsigned *anotherWordArray;
+    float *aFloat32Array;
+
+    centerX = interpreterProxy->stackFloatValue(10);
+    centerY = interpreterProxy->stackFloatValue(9);
+    radiusPointX = interpreterProxy->stackFloatValue(8);
+    radiusPointY = interpreterProxy->stackFloatValue(7);
+    startAngle = interpreterProxy->stackFloatValue(6);
+    sweepAngle = interpreterProxy->stackFloatValue(5);
+    tthetaCos = interpreterProxy->stackFloatValue(4);
+    tthetaSin = interpreterProxy->stackFloatValue(3);
+    interpreterProxy->success(interpreterProxy->isWords(interpreterProxy->stackValue(2)));
+    otherWordArray = ((unsigned *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(2))));
+    centerX = interpreterProxy->stackFloatValue(9);
+    centerY = interpreterProxy->stackFloatValue(8);
+    radiusPointX = interpreterProxy->stackFloatValue(7);
+    radiusPointY = interpreterProxy->stackFloatValue(6);
+    startAngle = interpreterProxy->stackFloatValue(5);
+    sweepAngle = interpreterProxy->stackFloatValue(4);
+    tthetaCos = interpreterProxy->stackFloatValue(3);
+    tthetaSin = interpreterProxy->stackFloatValue(2);
+    interpreterProxy->success(interpreterProxy->isWords(interpreterProxy->stackValue(1)));
+    anotherWordArray = ((unsigned *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(1))));
+    aFloat32Array = ((float *) (interpreterProxy->arrayValueOf(interpreterProxy->stackValue(0))));
+    otherWordArray = ((unsigned *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(1))));
+    interpreterProxy->success(interpreterProxy->isWords(interpreterProxy->stackValue(0)));
+    anotherWordArray = ((unsigned *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(0))));
+    if (interpreterProxy->failed()) {
+        return null;
+    }
@@ -248,14 +241,12 @@
+    scale = sqrt(txA11*txA11 + txA21*txA21);;
+    trx = radiusPointX * scale;
+    try = radiusPointY * scale;
+    hops = (((sqInt)(((((trx < try) ? try : trx)) * (fabs(sweepAngle))) / hop))) + 2;
+    hops = (((sqInt)(((((trx < try) ? try : trx)) * (fabs(sweepAngle))) / hop))) + 1;
+    d = sweepAngle / hops;
+    edgeCounts = otherWordArray;
+    alphaMask = anotherWordArray;
+    contour = aFloat32Array;
+    angle = startAngle;
+    hops += 1;
+    for (h = 1; h <= hops; h += 1) {
+    for (h = 1; h <= (hops + 1); h += 1) {
+        xp = (cos(angle)) * trx;
+        yp = (sin(angle)) * try;
+        x = ((tthetaCos * xp) - (tthetaSin * yp)) + tcx;
@@ -268,13 +259,12 @@
+        if (!(fillA == 0.0)) {
+            updateEdgeCountAtXy(x, y);
+        }
+        updateContourForXy(x, y);
+        angle += d;
+    }
+    if (interpreterProxy->failed()) {
+        return null;
+    }
+    interpreterProxy->pop(11);
+    interpreterProxy->pop(10);
+    return null;
+}
+
@@ -302,21 +292,19 @@
+    double tthetaSin;
+    unsigned char *otherByteArray;
+    unsigned char *anotherByteArray;
+    float *aFloat32Array;
+
+    centerX = interpreterProxy->stackFloatValue(10);
+    centerY = interpreterProxy->stackFloatValue(9);
+    radiusPointX = interpreterProxy->stackFloatValue(8);
+    radiusPointY = interpreterProxy->stackFloatValue(7);
+    startAngle = interpreterProxy->stackFloatValue(6);
+    sweepAngle = interpreterProxy->stackFloatValue(5);
+    tthetaCos = interpreterProxy->stackFloatValue(4);
+    tthetaSin = interpreterProxy->stackFloatValue(3);
+    interpreterProxy->success(interpreterProxy->isBytes(interpreterProxy->stackValue(2)));
+    otherByteArray = ((unsigned char *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(2))));
+    centerX = interpreterProxy->stackFloatValue(9);
+    centerY = interpreterProxy->stackFloatValue(8);
+    radiusPointX = interpreterProxy->stackFloatValue(7);
+    radiusPointY = interpreterProxy->stackFloatValue(6);
+    startAngle = interpreterProxy->stackFloatValue(5);
+    sweepAngle = interpreterProxy->stackFloatValue(4);
+    tthetaCos = interpreterProxy->stackFloatValue(3);
+    tthetaSin = interpreterProxy->stackFloatValue(2);
+    interpreterProxy->success(interpreterProxy->isBytes(interpreterProxy->stackValue(1)));
+    anotherByteArray = ((unsigned char *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(1))));
+    aFloat32Array = ((float *) (interpreterProxy->arrayValueOf(interpreterProxy->stackValue(0))));
+    otherByteArray = ((unsigned char *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(1))));
+    interpreterProxy->success(interpreterProxy->isBytes(interpreterProxy->stackValue(0)));
+    anotherByteArray = ((unsigned char *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(0))));
+    if (interpreterProxy->failed()) {
+        return null;
+    }
@@ -325,14 +313,12 @@
+    scale = sqrt(txA11*txA11 + txA21*txA21);;
+    trx = radiusPointX * scale;
+    try = radiusPointY * scale;
+    hops = (((sqInt)(((((trx < try) ? try : trx)) * (fabs(sweepAngle))) / hop))) + 2;
+    hops = (((sqInt)(((((trx < try) ? try : trx)) * (fabs(sweepAngle))) / hop))) + 1;
+    d = sweepAngle / hops;
+    edgeCountsWP = otherByteArray;
+    alphaMaskWP = anotherByteArray;
+    contour = aFloat32Array;
+    angle = startAngle;
+    hops += 1;
+    for (h = 1; h <= hops; h += 1) {
+    for (h = 1; h <= (hops + 1); h += 1) {
+        xp = (cos(angle)) * trx;
+        yp = (sin(angle)) * try;
+        x = ((tthetaCos * xp) - (tthetaSin * yp)) + tcx;
@@ -345,18 +331,17 @@
+        if (!(fillA == 0.0)) {
+            updateEdgeCountWPAtXy(x, y);
+        }
+        updateContourForXy(x, y);
+        angle += d;
+    }
+    if (interpreterProxy->failed()) {
+        return null;
+    }
+    interpreterProxy->pop(11);
+    interpreterProxy->pop(10);
+    return null;
+}
+
+
+/*    Blends fill color over background. Target translucency computed correctly.
+/*    Blends fill over background. Target translucency computed correctly.
+    For blending, alphas are in [0 .. 1.0] and R, G, B color components are in [0 .. 255] */
+
+static sqInt blendFillOnlyAtredIsInsidegreenIsInsideblueIsInsideantiAliasAlphasWord(sqInt pixelIndex, sqInt isRedInside, sqInt isGreenInside, sqInt isBlueInside, uint32_t antiAliasAlphasWord) {
@@ -478,10 +463,6 @@
+    return null;
+}
+
+
+/*    Blends fill color over background. Target translucency computed correctly.
+    For blending, alphas are in [0 .. 1.0] and R, G, B color components are in [0 .. 255] */
+
+EXPORT(sqInt) primBlendFillOnly(void) {
+    sqInt isRedInside;
+    sqInt isBlueInside;
@@ -567,25 +548,23 @@
+}
+
+
+/*    Blends fill color over background.
+    WP: Whole pixel anti aliasing.
+    OT: Target ignored on input and set to opaque on output.
+/*    Blends fill over background. Target translucency computed correctly.
+    For blending, alphas are in [0 .. 1.0] and R, G, B color components are in [0 .. 255] */
+
+static sqInt blendFillOnlyWPOTAtantiAliasAlphaByte(sqInt pixelIndex, uint8_t antiAliasAlphaBits) {
+    uint32_t targetWord;
+    uint32_t clippingAntiAliasBits;
+    float unAlpha;
+    float resultG;
+    float antiAliasAlpha;
+    float unAlpha;
+    float clippingAntiAlias;
+    uint32_t morphIdWord;
+    uint32_t resultGBits;
+    uint32_t resultBBits;
+    float resultB;
+    float clippingAntiAlias;
+    float antiAliasAlpha;
+    uint32_t morphIdWord;
+    float alpha;
+    uint32_t resultRBits;
+    float resultR;
+    float resultB;
+
+
+    /* 1.0/127.0 */
@@ -643,18 +622,12 @@
+    return null;
+}
+
+
+/*    Blends fill color over background.
+    WP: Whole pixel anti aliasing.
+    OT: Target ignored on input and set to opaque on output.
+    For blending, alphas are in [0 .. 1.0] and R, G, B color components are in [0 .. 255] */
+
+EXPORT(sqInt) primBlendFillOnlyWPOT(void) {
+    uint8_t edgesUpToThisPixel;
+    uint8_t antiAliasAlphaBits;
+    sqInt pixelIndex;
+    sqInt displayX;
+    uint8_t edgesThisPixel;
+    uint8_t antiAliasAlphaBits;
+    sqInt displayY;
+    sqInt l;
+    sqInt t;
@@ -697,17 +670,11 @@
+            }
+            antiAliasAlphaBits = alphaMaskWP[pixelIndex];
+            if (edgesUpToThisPixel == 0) {
+
+                /* Still in the anti aliasing area, but outside the shape, strictly speaking. */
+
+                if (!(antiAliasAlphaBits == 0)) {
+                    alphaMaskWP[pixelIndex] = 0;
+                    blendFillOnlyWPOTAtantiAliasAlphaByte(pixelIndex, antiAliasAlphaBits);
+                }
+            } else {
+
+                /* Inside the shape */
+
+                if (!(antiAliasAlphaBits == 0)) {
+                    alphaMaskWP[pixelIndex] = 0;
+                }
@@ -724,8 +691,7 @@
+}
+
+
+/*    Blends stroke color and fill color over background.
+    Do an appropriate (anti aliased) gradient between stoke color and fill color (or pick just stroke or just fill). Blend this over background.
+/*    Do an appropriate (anti aliased) mix between stoke and fill (or pick just stroke or just fill). Blend this over background.
+    Target translucency computed correctly.
+    For blending, alphas are in [0 .. 1.0] and R, G, B color components are in [0 .. 255] */
+
@@ -883,10 +849,9 @@
+}
+
+
+/*    Inside the shape: Do an appropriate (anti aliased) gradient between stoke color and fill color (or pick just stroke or just fill).
+    Blend this over background.
+    WP: Whole pixel anti aliasing.
+    OT: Target ignored on input and set to opaque on output.
+/*    Inside the shape: Do gradient between stroke and fill. Blend the result over background */
+/*    Do an appropriate (anti aliased) mix between stoke and fill (or pick just stroke or just fill). Blend this over background.
+    Target translucency computed correctly.
+    For blending, alphas are in [0 .. 1.0] and R, G, B color components are in [0 .. 255] */
+
+static sqInt blendStrokeAndFillInsideWPOTAtantiAliasAlphaByte(sqInt pixelIndex, uint8_t antiAliasAlphaBits) {
@@ -967,12 +932,6 @@
+    }
+    return null;
+}
+
+
+/*    Blends stroke color and fill color over background.
+    Do an appropriate (anti aliased) gradient between stoke color and fill color (or pick just stroke or just fill). Blend this over background.
+    Target translucency computed correctly.
+    For blending, alphas are in [0 .. 1.0] and R, G, B color components are in [0 .. 255] */
+
+EXPORT(sqInt) primBlendStrokeAndFill(void) {
+    sqInt isRedInside;
@@ -1059,9 +1018,9 @@
+}
+
+
+/*    Outside the shape, but still in the stroke: Blend stroke color over background.
+    WP: Whole pixel anti aliasing.
+    OT: Target ignored on input and set to opaque on output.
+/*    Outside the shape, but still in the stroke: Blend stroke over background */
+/*    Do an appropriate (anti aliased) mix between stoke and fill (or pick just stroke or just fill). Blend this over background.
+    Target translucency computed correctly.
+    For blending, alphas are in [0 .. 1.0] and R, G, B color components are in [0 .. 255] */
+
+static sqInt blendStrokeAndFillOutsideWPOTAtantiAliasAlphaByte(sqInt pixelIndex, uint8_t antiAliasAlphaBits) {
@@ -1142,19 +1101,12 @@
+    return null;
+}
+
+
+/*    Blends stroke color and fill color over background.
+    Do an appropriate (anti aliased) gradient between stoke color and fill color (or pick just stroke or just fill). Blend this over background.
+    WP: Whole pixel anti aliasing.
+    OT: Target ignored on input and set to opaque on output.
+    For blending, alphas are in [0 .. 1.0] and R, G, B color components are in [0 .. 255] */
+
+EXPORT(sqInt) primBlendStrokeAndFillWPOT(void) {
+    uint8_t edgesUpToThisPixel;
+    uint8_t antiAliasAlphaBits;
+    sqInt pixelIndex;
+    sqInt displayX;
+    uint8_t edgesThisPixel;
+    uint8_t antiAliasAlphaBits;
+    sqInt displayY;
+    sqInt l;
+    sqInt t;
@@ -1197,9 +1149,6 @@
+            }
+            antiAliasAlphaBits = alphaMaskWP[pixelIndex];
+            if (edgesUpToThisPixel == 0) {
+
+                /* Still in the stroke, but outside the shape, strictly speaking. */
+
+                if (!(antiAliasAlphaBits == 0)) {
+                    alphaMaskWP[pixelIndex] = 0;
+                    if (!(antiAliasAlphaBits == 0)) {
@@ -1207,9 +1156,6 @@
+                    }
+                }
+            } else {
+
+                /* Inside the shape */
+
+                if (!(antiAliasAlphaBits == 0)) {
+                    alphaMaskWP[pixelIndex] = 0;
+                }
@@ -1225,7 +1171,7 @@
+}
+
+
+/*    Blends stroke color over background. Target translucency computed correctly.
+/*    Blends stroke over background. Target translucency computed correctly.
+    For blending, alphas are in [0 .. 1.0] and R, G, B color components are in [0 .. 255] */
+
+static sqInt blendStrokeOnlyAtantiAliasAlphasWord(sqInt pixelIndex, uint32_t antiAliasAlphasWord) {
@@ -1338,10 +1284,6 @@
+    return null;
+}
+
+
+/*    Blends stroke color over background. Target translucency computed correctly.
+    For blending, alphas are in [0 .. 1.0] and R, G, B color components are in [0 .. 255] */
+
+EXPORT(sqInt) primBlendStrokeOnly(void) {
+    sqInt pixelIndex;
+    sqInt displayY;
@@ -1390,25 +1332,23 @@
+}
+
+
+/*    Blends stroke color over background.
+    WP: Whole pixel anti aliasing.
+    OT: Target ignored on input and set to opaque on output.
+/*    Blends stroke over background. Target translucency computed correctly.
+    For blending, alphas are in [0 .. 1.0] and R, G, B color components are in [0 .. 255] */
+
+static sqInt blendStrokeOnlyWPOTAtantiAliasAlphaByte(sqInt pixelIndex, uint8_t antiAliasAlphaBits) {
+    uint32_t targetWord;
+    uint32_t clippingAntiAliasBits;
+    float unAlpha;
+    float resultG;
+    float antiAliasAlpha;
+    float unAlpha;
+    float clippingAntiAlias;
+    uint32_t morphIdWord;
+    uint32_t resultGBits;
+    uint32_t resultBBits;
+    float resultB;
+    float clippingAntiAlias;
+    float antiAliasAlpha;
+    uint32_t morphIdWord;
+    float alpha;
+    uint32_t resultRBits;
+    float resultR;
+    float resultB;
+
+
+    /* 1.0/127.0 */
@@ -1466,12 +1406,6 @@
+    return null;
+}
+
+
+/*    Blends stroke color over background.
+    WP: Whole pixel anti aliasing.
+    OT: Target ignored on input and set to opaque on output.
+    For blending, alphas are in [0 .. 1.0] and R, G, B color components are in [0 .. 255] */
+
+EXPORT(sqInt) primBlendStrokeOnlyWPOT(void) {
+    uint8_t antiAliasAlphaBits;
+    sqInt pixelIndex;
@@ -1507,9 +1441,6 @@
+            pixelIndex += 1;
+            antiAliasAlphaBits = alphaMaskWP[pixelIndex];
+            if (!(antiAliasAlphaBits == 0)) {
+
+                /* In the stroke */
+
+                alphaMaskWP[pixelIndex] = 0;
+                blendStrokeOnlyWPOTAtantiAliasAlphaByte(pixelIndex, antiAliasAlphaBits);
+            }
@@ -1588,32 +1519,29 @@
+    double yControl2;
+    unsigned *otherWordArray;
+    unsigned *anotherWordArray;
+    float *aFloat32Array;
+
+    xFrom = interpreterProxy->stackFloatValue(10);
+    yFrom = interpreterProxy->stackFloatValue(9);
+    xTo = interpreterProxy->stackFloatValue(8);
+    yTo = interpreterProxy->stackFloatValue(7);
+    xControl1 = interpreterProxy->stackFloatValue(6);
+    yControl1 = interpreterProxy->stackFloatValue(5);
+    xControl2 = interpreterProxy->stackFloatValue(4);
+    yControl2 = interpreterProxy->stackFloatValue(3);
+    interpreterProxy->success(interpreterProxy->isWords(interpreterProxy->stackValue(2)));
+    otherWordArray = ((unsigned *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(2))));
+    xFrom = interpreterProxy->stackFloatValue(9);
+    yFrom = interpreterProxy->stackFloatValue(8);
+    xTo = interpreterProxy->stackFloatValue(7);
+    yTo = interpreterProxy->stackFloatValue(6);
+    xControl1 = interpreterProxy->stackFloatValue(5);
+    yControl1 = interpreterProxy->stackFloatValue(4);
+    xControl2 = interpreterProxy->stackFloatValue(3);
+    yControl2 = interpreterProxy->stackFloatValue(2);
+    interpreterProxy->success(interpreterProxy->isWords(interpreterProxy->stackValue(1)));
+    anotherWordArray = ((unsigned *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(1))));
+    aFloat32Array = ((float *) (interpreterProxy->arrayValueOf(interpreterProxy->stackValue(0))));
+    otherWordArray = ((unsigned *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(1))));
+    interpreterProxy->success(interpreterProxy->isWords(interpreterProxy->stackValue(0)));
+    anotherWordArray = ((unsigned *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(0))));
+    if (interpreterProxy->failed()) {
+        return null;
+    }
+    edgeCounts = otherWordArray;
+    alphaMask = anotherWordArray;
+    contour = aFloat32Array;
+    pvt_cubicBezierFromXytoXycontrol1Xycontrol2Xy(xFrom, yFrom, xTo, yTo, xControl1, yControl1, xControl2, yControl2);
+    if (interpreterProxy->failed()) {
+        return null;
+    }
+    interpreterProxy->pop(11);
+    interpreterProxy->pop(10);
+    return null;
+}
+
@@ -1628,32 +1556,29 @@
+    double yControl2;
+    unsigned char *otherByteArray;
+    unsigned char *anotherByteArray;
+    float *aFloat32Array;
+
+    xFrom = interpreterProxy->stackFloatValue(10);
+    yFrom = interpreterProxy->stackFloatValue(9);
+    xTo = interpreterProxy->stackFloatValue(8);
+    yTo = interpreterProxy->stackFloatValue(7);
+    xControl1 = interpreterProxy->stackFloatValue(6);
+    yControl1 = interpreterProxy->stackFloatValue(5);
+    xControl2 = interpreterProxy->stackFloatValue(4);
+    yControl2 = interpreterProxy->stackFloatValue(3);
+    interpreterProxy->success(interpreterProxy->isBytes(interpreterProxy->stackValue(2)));
+    otherByteArray = ((unsigned char *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(2))));
+    xFrom = interpreterProxy->stackFloatValue(9);
+    yFrom = interpreterProxy->stackFloatValue(8);
+    xTo = interpreterProxy->stackFloatValue(7);
+    yTo = interpreterProxy->stackFloatValue(6);
+    xControl1 = interpreterProxy->stackFloatValue(5);
+    yControl1 = interpreterProxy->stackFloatValue(4);
+    xControl2 = interpreterProxy->stackFloatValue(3);
+    yControl2 = interpreterProxy->stackFloatValue(2);
+    interpreterProxy->success(interpreterProxy->isBytes(interpreterProxy->stackValue(1)));
+    anotherByteArray = ((unsigned char *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(1))));
+    aFloat32Array = ((float *) (interpreterProxy->arrayValueOf(interpreterProxy->stackValue(0))));
+    otherByteArray = ((unsigned char *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(1))));
+    interpreterProxy->success(interpreterProxy->isBytes(interpreterProxy->stackValue(0)));
+    anotherByteArray = ((unsigned char *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(0))));
+    if (interpreterProxy->failed()) {
+        return null;
+    }
+    edgeCountsWP = otherByteArray;
+    alphaMaskWP = anotherByteArray;
+    contour = aFloat32Array;
+    pvt_cubicBezierWPFromXytoXycontrol1Xycontrol2Xy(xFrom, yFrom, xTo, yTo, xControl1, yControl1, xControl2, yControl2);
+    if (interpreterProxy->failed()) {
+        return null;
+    }
+    interpreterProxy->pop(11);
+    interpreterProxy->pop(10);
+    return null;
+}
+
@@ -1693,7 +1618,6 @@
+    float advanceWidth;
+    float x0;
+    float ttControlX;
+    float correction;
+    float xMaxEnd;
+    float startY;
+    float t;
@@ -1721,9 +1645,9 @@
+    float startX;
+    float contourStartX;
+    float dy;
+    sqInt idx;
+    float controlX;
+    float f2;
+    sqInt idx;
+    sqInt i;
+    float y;
+    char *aString;
@@ -1832,8 +1756,15 @@
+                y = startY;
+                updateAlphasForXy(x, y);
+                updateEdgeCountAtXy(x, y);
+
+                /* But if curve is very small, there is risk of not iterating even once, completely missing a pixel, and breaking fills.
+                In these cases, a larger initial estimation avoids the problem. */
+
+                increment = 0.2;
+                dx = fabs(endX-startX); dy = fabs(endY-startY);;
+                increment = (((0.5 / (((dx < dy) ? dy : dx))) < 0.5) ? (0.5 / (((dx < dy) ? dy : dx))) : 0.5);
+                if ((dy < 2.0) && (dx < 2.0)) {
+                    increment = 0.5;
+                }
+                t = 0.0;
+                            while (1) {
+                    t0 = t;
@@ -1848,30 +1779,22 @@
+                    f2 = (2.0 * oneLessT) * t;
+                    f3 = t * t;
+                    x = ((f1 * startX) + (f2 * controlX)) + (f3 * endX);
+                    y = ((f1 * startY) + (f2 * controlY)) + (f3 * endY);
+                    dx = x - x0;
+
+                    /* Now adjust the increment to aim at the required hop length, and recompute next point. */
+
+                    y = ((f1 * startY) + (f2 * controlY)) + (f3 * endY);
+                    dx = x - x0;
+                    dy = y - y0;
+                    
+                        length = sqrt(dx*dx + dy*dy);;
+                    correction = hop / length;
+                    do {
+                        increment = (increment / length) * hop;
+                        t = t0 + increment;
+                        oneLessT = 1.0 - t;
+                        f1 = oneLessT * oneLessT;
+                        f2 = (2.0 * oneLessT) * t;
+                        f3 = t * t;
+                        x = ((f1 * startX) + (f2 * controlX)) + (f3 * endX);
+                        y = ((f1 * startY) + (f2 * controlY)) + (f3 * endY);
+                        dx = x - x0;
+                        dy = y - y0;
+
+                            length = sqrt(dx*dx + dy*dy);;
+                        correction = hop / length;
+                    } while(correction < 1.0);
+                    increment = (increment / length) * hop;
+                    t = t0 + increment;
+                    oneLessT = 1.0 - t;
+                    f1 = oneLessT * oneLessT;
+                    f2 = (2.0 * oneLessT) * t;
+                    f3 = t * t;
+                    x = ((f1 * startX) + (f2 * controlX)) + (f3 * endX);
+                    y = ((f1 * startY) + (f2 * controlY)) + (f3 * endY);
+                    if (!(t < 1.0)) break;
+                    updateAlphasForXy(x, y);
+                    updateEdgeCountAtXy(x, y);
@@ -1910,7 +1833,6 @@
+    float advanceWidth;
+    float x0;
+    float ttControlX;
+    float correction;
+    float xMaxEnd;
+    float startY;
+    float t;
@@ -1938,9 +1860,9 @@
+    float startX;
+    float contourStartX;
+    float dy;
+    sqInt idx;
+    float controlX;
+    float f2;
+    sqInt idx;
+    sqInt i;
+    float y;
+    char *aString;
@@ -2049,8 +1971,15 @@
+                y = startY;
+                updateAlphasWPZeroStrokeForXy(x, y);
+                updateEdgeCountWPAtXy(x, y);
+
+                /* But if curve is very small, there is risk of not iterating even once, completely missing a pixel, and breaking fills.
+                In these cases, a larger initial estimation avoids the problem. */
+
+                increment = 0.2;
+                dx = fabs(endX-startX); dy = fabs(endY-startY);;
+                increment = (((0.5 / (((dx < dy) ? dy : dx))) < 0.5) ? (0.5 / (((dx < dy) ? dy : dx))) : 0.5);
+                if ((dy < 2.0) && (dx < 2.0)) {
+                    increment = 0.5;
+                }
+                t = 0.0;
+                            while (1) {
+                    t0 = t;
@@ -2065,30 +1994,22 @@
+                    f2 = (2.0 * oneLessT) * t;
+                    f3 = t * t;
+                    x = ((f1 * startX) + (f2 * controlX)) + (f3 * endX);
+                    y = ((f1 * startY) + (f2 * controlY)) + (f3 * endY);
+                    dx = x - x0;
+
+                    /* Now adjust the increment to aim at the required hop length, and recompute next point. */
+
+                    y = ((f1 * startY) + (f2 * controlY)) + (f3 * endY);
+                    dx = x - x0;
+                    dy = y - y0;
+                    
+                        length = sqrt(dx*dx + dy*dy);;
+                    correction = hop / length;
+                    do {
+                        increment = (increment / length) * hop;
+                        t = t0 + increment;
+                        oneLessT = 1.0 - t;
+                        f1 = oneLessT * oneLessT;
+                        f2 = (2.0 * oneLessT) * t;
+                        f3 = t * t;
+                        x = ((f1 * startX) + (f2 * controlX)) + (f3 * endX);
+                        y = ((f1 * startY) + (f2 * controlY)) + (f3 * endY);
+                        dx = x - x0;
+                        dy = y - y0;
+
+                            length = sqrt(dx*dx + dy*dy);;
+                        correction = hop / length;
+                    } while(correction < 1.0);
+                    increment = (increment / length) * hop;
+                    t = t0 + increment;
+                    oneLessT = 1.0 - t;
+                    f1 = oneLessT * oneLessT;
+                    f2 = (2.0 * oneLessT) * t;
+                    f3 = t * t;
+                    x = ((f1 * startX) + (f2 * controlX)) + (f3 * endX);
+                    y = ((f1 * startY) + (f2 * controlY)) + (f3 * endY);
+                    if (!(t < 1.0)) break;
+                    updateAlphasWPZeroStrokeForXy(x, y);
+                    updateEdgeCountWPAtXy(x, y);
@@ -2129,7 +2050,6 @@
+    float advanceWidth;
+    float x0;
+    float ttControlX;
+    float correction;
+    float xMaxEnd;
+    float startY;
+    float t;
@@ -2156,9 +2076,9 @@
+    float startX;
+    float contourStartX;
+    float dy;
+    sqInt idx;
+    float controlX;
+    float f2;
+    sqInt idx;
+    sqInt i;
+    float y;
+    unsigned *aWordArray;
@@ -2295,8 +2215,15 @@
+                y = startY;
+                updateAlphasForXy(x, y);
+                updateEdgeCountAtXy(x, y);
+
+                /* But if curve is very small, there is risk of not iterating even once, completely missing a pixel, and breaking fills.
+                In these cases, a larger initial estimation avoids the problem. */
+
+                increment = 0.2;
+                dx = fabs(endX-startX); dy = fabs(endY-startY);;
+                increment = (((0.5 / (((dx < dy) ? dy : dx))) < 0.5) ? (0.5 / (((dx < dy) ? dy : dx))) : 0.5);
+                if ((dy < 2.0) && (dx < 2.0)) {
+                    increment = 0.5;
+                }
+                t = 0.0;
+                            while (1) {
+                    t0 = t;
@@ -2309,28 +2236,22 @@
+                        t = t0 + increment; oneLessT = 1.0 - t;
+                        f1 = oneLessT * oneLessT; f2 = 2.0 * oneLessT * t; f3 = t * t;
+                        x = (f1 * startX) + (f2 * controlX) + (f3 * endX);
+                        y = (f1 * startY) + (f2 * controlY) + (f3 * endY);
+                        dx = x-x0; dy = y-y0;
+                        length = sqrt(dx*dx + dy*dy);;
+                        y = (f1 * startY) + (f2 * controlY) + (f3 * endY);;
+                    dx = x - x0;
+
+                    /* Now adjust the increment to aim at the required hop length, and recompute next point. */
+
+                    correction = hop / length;
+                    do {
+                        increment = (increment / length) * hop;
+                        t = t0 + increment;
+                        oneLessT = 1.0 - t;
+                        f1 = oneLessT * oneLessT;
+                        f2 = (2.0 * oneLessT) * t;
+                        f3 = t * t;
+                        x = ((f1 * startX) + (f2 * controlX)) + (f3 * endX);
+                        y = ((f1 * startY) + (f2 * controlY)) + (f3 * endY);
+                        dx = x - x0;
+                        dy = y - y0;
+
+                            length = sqrt(dx*dx + dy*dy);;
+                        correction = hop / length;
+                    } while(correction < 1.0);
+                    dy = y - y0;
+
+                        length = sqrt(dx*dx + dy*dy);;
+                    increment = (increment / length) * hop;
+                    t = t0 + increment;
+                    oneLessT = 1.0 - t;
+                    f1 = oneLessT * oneLessT;
+                    f2 = (2.0 * oneLessT) * t;
+                    f3 = t * t;
+                    x = ((f1 * startX) + (f2 * controlX)) + (f3 * endX);
+                    y = ((f1 * startY) + (f2 * controlY)) + (f3 * endY);
+                    if (!(t < 1.0)) break;
+                    updateAlphasForXy(x, y);
+                    updateEdgeCountAtXy(x, y);
@@ -2371,7 +2292,6 @@
+    float advanceWidth;
+    float x0;
+    float ttControlX;
+    float correction;
+    float xMaxEnd;
+    float startY;
+    float t;
@@ -2398,9 +2318,9 @@
+    float startX;
+    float contourStartX;
+    float dy;
+    sqInt idx;
+    float controlX;
+    float f2;
+    sqInt idx;
+    sqInt i;
+    float y;
+    unsigned *aWordArray;
@@ -2537,8 +2457,15 @@
+                y = startY;
+                updateAlphasWPZeroStrokeForXy(x, y);
+                updateEdgeCountWPAtXy(x, y);
+
+                /* But if curve is very small, there is risk of not iterating even once, completely missing a pixel, and breaking fills.
+                In these cases, a larger initial estimation avoids the problem. */
+
+                increment = 0.2;
+                dx = fabs(endX-startX); dy = fabs(endY-startY);;
+                increment = (((0.5 / (((dx < dy) ? dy : dx))) < 0.5) ? (0.5 / (((dx < dy) ? dy : dx))) : 0.5);
+                if ((dy < 2.0) && (dx < 2.0)) {
+                    increment = 0.5;
+                }
+                t = 0.0;
+                            while (1) {
+                    t0 = t;
@@ -2551,28 +2478,22 @@
+                        t = t0 + increment; oneLessT = 1.0 - t;
+                        f1 = oneLessT * oneLessT; f2 = 2.0 * oneLessT * t; f3 = t * t;
+                        x = (f1 * startX) + (f2 * controlX) + (f3 * endX);
+                        y = (f1 * startY) + (f2 * controlY) + (f3 * endY);
+                        dx = x-x0; dy = y-y0;
+                        length = sqrt(dx*dx + dy*dy);;
+                        y = (f1 * startY) + (f2 * controlY) + (f3 * endY);;
+                    dx = x - x0;
+
+                    /* Now adjust the increment to aim at the required hop length, and recompute next point. */
+
+                    correction = hop / length;
+                    do {
+                        increment = (increment / length) * hop;
+                        t = t0 + increment;
+                        oneLessT = 1.0 - t;
+                        f1 = oneLessT * oneLessT;
+                        f2 = (2.0 * oneLessT) * t;
+                        f3 = t * t;
+                        x = ((f1 * startX) + (f2 * controlX)) + (f3 * endX);
+                        y = ((f1 * startY) + (f2 * controlY)) + (f3 * endY);
+                        dx = x - x0;
+                        dy = y - y0;
+
+                            length = sqrt(dx*dx + dy*dy);;
+                        correction = hop / length;
+                    } while(correction < 1.0);
+                    dy = y - y0;
+
+                        length = sqrt(dx*dx + dy*dy);;
+                    increment = (increment / length) * hop;
+                    t = t0 + increment;
+                    oneLessT = 1.0 - t;
+                    f1 = oneLessT * oneLessT;
+                    f2 = (2.0 * oneLessT) * t;
+                    f3 = t * t;
+                    x = ((f1 * startX) + (f2 * controlX)) + (f3 * endX);
+                    y = ((f1 * startY) + (f2 * controlY)) + (f3 * endY);
+                    if (!(t < 1.0)) break;
+                    updateAlphasWPZeroStrokeForXy(x, y);
+                    updateEdgeCountWPAtXy(x, y);
@@ -2612,7 +2533,6 @@
+    float advanceWidth;
+    float x0;
+    float ttControlX;
+    float correction;
+    float xMaxEnd;
+    float startY;
+    float t;
@@ -2640,11 +2560,11 @@
+    float startX;
+    float contourStartX;
+    float dy;
+    sqInt idx;
+    float controlX;
+    float f2;
+    sqInt i;
+    float y;
+    sqInt idx;
+    unsigned char *aByteArray;
+    sqInt byteStartIndex;
+    sqInt byteStopIndex;
@@ -2758,11 +2678,15 @@
+                    y = startY;
+                    updateAlphasForXy(x, y);
+                    updateEdgeCountAtXy(x, y);
+
+                    /* But if curve is very small, there is risk of not iterating even once, completely missing a pixel, and breaking fills.
+                        In these cases, a larger initial estimation avoids the problem. */
+
+                    increment = 0.2;
+                    dx = fabs(endX-startX); dy = fabs(endY-startY);;
+
+                    /* Compute Quadratic Bezier Curve, */
+
+                    increment = (((0.5 / (((dx < dy) ? dy : dx))) < 0.5) ? (0.5 / (((dx < dy) ? dy : dx))) : 0.5);
+                    if ((dy < 2.0) && (dx < 2.0)) {
+                        increment = 0.5;
+                    }
+                    t = 0.0;
+                                    while (1) {
+                        t0 = t;
@@ -2777,30 +2701,22 @@
+                        f2 = (2.0 * oneLessT) * t;
+                        f3 = t * t;
+                        x = ((f1 * startX) + (f2 * controlX)) + (f3 * endX);
+                        y = ((f1 * startY) + (f2 * controlY)) + (f3 * endY);
+                        dx = x - x0;
+
+                        /* Now adjust the increment to aim at the required hop length, and recompute next point. */
+
+                        y = ((f1 * startY) + (f2 * controlY)) + (f3 * endY);
+                        dx = x - x0;
+                        dy = y - y0;
+                        
+                                length = sqrt(dx*dx + dy*dy);;
+                        correction = hop / length;
+                        do {
+                            increment = (increment / length) * hop;
+                            t = t0 + increment;
+                            oneLessT = 1.0 - t;
+                            f1 = oneLessT * oneLessT;
+                            f2 = (2.0 * oneLessT) * t;
+                            f3 = t * t;
+                            x = ((f1 * startX) + (f2 * controlX)) + (f3 * endX);
+                            y = ((f1 * startY) + (f2 * controlY)) + (f3 * endY);
+                            dx = x - x0;
+                            dy = y - y0;
+
+                                    length = sqrt(dx*dx + dy*dy);;
+                            correction = hop / length;
+                        } while(correction < 1.0);
+                        increment = (increment / length) * hop;
+                        t = t0 + increment;
+                        oneLessT = 1.0 - t;
+                        f1 = oneLessT * oneLessT;
+                        f2 = (2.0 * oneLessT) * t;
+                        f3 = t * t;
+                        x = ((f1 * startX) + (f2 * controlX)) + (f3 * endX);
+                        y = ((f1 * startY) + (f2 * controlY)) + (f3 * endY);
+                        if (!(t < 1.0)) break;
+                        updateAlphasForXy(x, y);
+                        updateEdgeCountAtXy(x, y);
@@ -2842,7 +2758,6 @@
+    float advanceWidth;
+    float x0;
+    float ttControlX;
+    float correction;
+    float xMaxEnd;
+    float startY;
+    float t;
@@ -2870,11 +2785,11 @@
+    float startX;
+    float contourStartX;
+    float dy;
+    sqInt idx;
+    float controlX;
+    float f2;
+    sqInt i;
+    float y;
+    sqInt idx;
+    unsigned char *aByteArray;
+    sqInt byteStartIndex;
+    sqInt byteStopIndex;
@@ -2988,11 +2903,15 @@
+                    y = startY;
+                    updateAlphasWPZeroStrokeForXy(x, y);
+                    updateEdgeCountWPAtXy(x, y);
+
+                    /* But if curve is very small, there is risk of not iterating even once, completely missing a pixel, and breaking fills.
+                        In these cases, a larger initial estimation avoids the problem. */
+
+                    increment = 0.2;
+                    dx = fabs(endX-startX); dy = fabs(endY-startY);;
+
+                    /* Compute Quadratic Bezier Curve, */
+
+                    increment = (((0.5 / (((dx < dy) ? dy : dx))) < 0.5) ? (0.5 / (((dx < dy) ? dy : dx))) : 0.5);
+                    if ((dy < 2.0) && (dx < 2.0)) {
+                        increment = 0.5;
+                    }
+                    t = 0.0;
+                                    while (1) {
+                        t0 = t;
@@ -3007,30 +2926,22 @@
+                        f2 = (2.0 * oneLessT) * t;
+                        f3 = t * t;
+                        x = ((f1 * startX) + (f2 * controlX)) + (f3 * endX);
+                        y = ((f1 * startY) + (f2 * controlY)) + (f3 * endY);
+                        dx = x - x0;
+
+                        /* Now adjust the increment to aim at the required hop length, and recompute next point. */
+
+                        y = ((f1 * startY) + (f2 * controlY)) + (f3 * endY);
+                        dx = x - x0;
+                        dy = y - y0;
+                        
+                                length = sqrt(dx*dx + dy*dy);;
+                        correction = hop / length;
+                        do {
+                            increment = (increment / length) * hop;
+                            t = t0 + increment;
+                            oneLessT = 1.0 - t;
+                            f1 = oneLessT * oneLessT;
+                            f2 = (2.0 * oneLessT) * t;
+                            f3 = t * t;
+                            x = ((f1 * startX) + (f2 * controlX)) + (f3 * endX);
+                            y = ((f1 * startY) + (f2 * controlY)) + (f3 * endY);
+                            dx = x - x0;
+                            dy = y - y0;
+
+                                    length = sqrt(dx*dx + dy*dy);;
+                            correction = hop / length;
+                        } while(correction < 1.0);
+                        increment = (increment / length) * hop;
+                        t = t0 + increment;
+                        oneLessT = 1.0 - t;
+                        f1 = oneLessT * oneLessT;
+                        f2 = (2.0 * oneLessT) * t;
+                        f3 = t * t;
+                        x = ((f1 * startX) + (f2 * controlX)) + (f3 * endX);
+                        y = ((f1 * startY) + (f2 * controlY)) + (f3 * endY);
+                        if (!(t < 1.0)) break;
+                        updateAlphasWPZeroStrokeForXy(x, y);
+                        updateEdgeCountWPAtXy(x, y);
@@ -3141,11 +3052,7 @@
+    /* drawable left. Will later be refined. */
+
+    spanRight = 0;
+
+    /* drawable top. Will later be refined. */
+
+    spanBottom = 0;
+    prevYRounded = 0x7FFFFFFFU;
+    if (interpreterProxy->failed()) {
+        return null;
+    }
@@ -3159,28 +3066,25 @@
+    double yTo;
+    unsigned *otherWordArray;
+    unsigned *anotherWordArray;
+    float *aFloat32Array;
+
+    xFrom = interpreterProxy->stackFloatValue(6);
+    yFrom = interpreterProxy->stackFloatValue(5);
+    xTo = interpreterProxy->stackFloatValue(4);
+    yTo = interpreterProxy->stackFloatValue(3);
+    interpreterProxy->success(interpreterProxy->isWords(interpreterProxy->stackValue(2)));
+    otherWordArray = ((unsigned *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(2))));
+    xFrom = interpreterProxy->stackFloatValue(5);
+    yFrom = interpreterProxy->stackFloatValue(4);
+    xTo = interpreterProxy->stackFloatValue(3);
+    yTo = interpreterProxy->stackFloatValue(2);
+    interpreterProxy->success(interpreterProxy->isWords(interpreterProxy->stackValue(1)));
+    anotherWordArray = ((unsigned *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(1))));
+    aFloat32Array = ((float *) (interpreterProxy->arrayValueOf(interpreterProxy->stackValue(0))));
+    otherWordArray = ((unsigned *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(1))));
+    interpreterProxy->success(interpreterProxy->isWords(interpreterProxy->stackValue(0)));
+    anotherWordArray = ((unsigned *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(0))));
+    if (interpreterProxy->failed()) {
+        return null;
+    }
+    edgeCounts = otherWordArray;
+    alphaMask = anotherWordArray;
+    contour = aFloat32Array;
+    pvt_lineFromXytoXy(xFrom, yFrom, xTo, yTo);
+    if (interpreterProxy->failed()) {
+        return null;
+    }
+    interpreterProxy->pop(7);
+    interpreterProxy->pop(6);
+    return null;
+}
+
@@ -3191,28 +3095,25 @@
+    double yTo;
+    unsigned char *otherByteArray;
+    unsigned char *anotherByteArray;
+    float *aFloat32Array;
+
+    xFrom = interpreterProxy->stackFloatValue(6);
+    yFrom = interpreterProxy->stackFloatValue(5);
+    xTo = interpreterProxy->stackFloatValue(4);
+    yTo = interpreterProxy->stackFloatValue(3);
+    interpreterProxy->success(interpreterProxy->isBytes(interpreterProxy->stackValue(2)));
+    otherByteArray = ((unsigned char *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(2))));
+    xFrom = interpreterProxy->stackFloatValue(5);
+    yFrom = interpreterProxy->stackFloatValue(4);
+    xTo = interpreterProxy->stackFloatValue(3);
+    yTo = interpreterProxy->stackFloatValue(2);
+    interpreterProxy->success(interpreterProxy->isBytes(interpreterProxy->stackValue(1)));
+    anotherByteArray = ((unsigned char *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(1))));
+    aFloat32Array = ((float *) (interpreterProxy->arrayValueOf(interpreterProxy->stackValue(0))));
+    otherByteArray = ((unsigned char *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(1))));
+    interpreterProxy->success(interpreterProxy->isBytes(interpreterProxy->stackValue(0)));
+    anotherByteArray = ((unsigned char *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(0))));
+    if (interpreterProxy->failed()) {
+        return null;
+    }
+    edgeCountsWP = otherByteArray;
+    alphaMaskWP = anotherByteArray;
+    contour = aFloat32Array;
+    pvt_lineWPFromXytoXy(xFrom, yFrom, xTo, yTo);
+    if (interpreterProxy->failed()) {
+        return null;
+    }
+    interpreterProxy->pop(7);
+    interpreterProxy->pop(6);
+    return null;
+}
+
@@ -3225,35 +3126,32 @@
+}
+
+EXPORT(sqInt) primPathSequence(void) {
+    float endX;
+    float control2Y;
+    float startY;
+    float control1X;
+    sqInt commandType;
+    float endX;
+    float endY;
+    float control2X;
+    float control2Y;
+    float startX;
+    float startY;
+    float control1X;
+    float control1Y;
+    sqInt i;
+    float *aFloat32Array;
+    sqInt size;
+    unsigned *otherWordArray;
+    unsigned *anotherWordArray;
+    float *otherFloat32Array;
+
+    aFloat32Array = ((float *) (interpreterProxy->arrayValueOf(interpreterProxy->stackValue(4))));
+    size = interpreterProxy->stackIntegerValue(3);
+    interpreterProxy->success(interpreterProxy->isWords(interpreterProxy->stackValue(2)));
+    otherWordArray = ((unsigned *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(2))));
+    aFloat32Array = ((float *) (interpreterProxy->arrayValueOf(interpreterProxy->stackValue(3))));
+    size = interpreterProxy->stackIntegerValue(2);
+    interpreterProxy->success(interpreterProxy->isWords(interpreterProxy->stackValue(1)));
+    anotherWordArray = ((unsigned *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(1))));
+    otherFloat32Array = ((float *) (interpreterProxy->arrayValueOf(interpreterProxy->stackValue(0))));
+    otherWordArray = ((unsigned *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(1))));
+    interpreterProxy->success(interpreterProxy->isWords(interpreterProxy->stackValue(0)));
+    anotherWordArray = ((unsigned *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(0))));
+    if (interpreterProxy->failed()) {
+        return null;
+    }
+    edgeCounts = otherWordArray;
+    alphaMask = anotherWordArray;
+    contour = otherFloat32Array;
+    i = 0;
+    while (i < size) {
+        commandType = ((sqInt)(aFloat32Array[i]));
@@ -3265,7 +3163,7 @@
+                if (interpreterProxy->failed()) {
+                    return null;
+                }
+                interpreterProxy->pop(5);
+                interpreterProxy->pop(4);
+                return null;
+            }
+            startX = aFloat32Array[i];
@@ -3284,7 +3182,7 @@
+                if (interpreterProxy->failed()) {
+                    return null;
+                }
+                interpreterProxy->pop(5);
+                interpreterProxy->pop(4);
+                return null;
+            }
+            endX = aFloat32Array[i];
@@ -3300,7 +3198,7 @@
+                if (interpreterProxy->failed()) {
+                    return null;
+                }
+                interpreterProxy->pop(5);
+                interpreterProxy->pop(4);
+                return null;
+            }
+            endX = aFloat32Array[i];
@@ -3320,7 +3218,7 @@
+                if (interpreterProxy->failed()) {
+                    return null;
+                }
+                interpreterProxy->pop(5);
+                interpreterProxy->pop(4);
+                return null;
+            }
+            endX = aFloat32Array[i];
@@ -3343,7 +3241,7 @@
+                        if (interpreterProxy->failed()) {
+                return null;
+            }
+            interpreterProxy->pop(5);
+            interpreterProxy->pop(4);
+            return null;
+
+        }
@@ -3351,40 +3249,37 @@
+    if (interpreterProxy->failed()) {
+        return null;
+    }
+    interpreterProxy->pop(5);
+    interpreterProxy->pop(4);
+    return null;
+}
+
+EXPORT(sqInt) primPathSequenceWP(void) {
+    float endX;
+    float control2Y;
+    float startY;
+    float control1X;
+    sqInt commandType;
+    float endX;
+    float endY;
+    float control2X;
+    float control2Y;
+    float startX;
+    float startY;
+    float control1X;
+    float control1Y;
+    sqInt i;
+    float *aFloat32Array;
+    sqInt size;
+    unsigned char *otherByteArray;
+    unsigned char *anotherByteArray;
+    float *otherFloat32Array;
+
+    aFloat32Array = ((float *) (interpreterProxy->arrayValueOf(interpreterProxy->stackValue(4))));
+    size = interpreterProxy->stackIntegerValue(3);
+    interpreterProxy->success(interpreterProxy->isBytes(interpreterProxy->stackValue(2)));
+    otherByteArray = ((unsigned char *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(2))));
+    aFloat32Array = ((float *) (interpreterProxy->arrayValueOf(interpreterProxy->stackValue(3))));
+    size = interpreterProxy->stackIntegerValue(2);
+    interpreterProxy->success(interpreterProxy->isBytes(interpreterProxy->stackValue(1)));
+    anotherByteArray = ((unsigned char *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(1))));
+    otherFloat32Array = ((float *) (interpreterProxy->arrayValueOf(interpreterProxy->stackValue(0))));
+    otherByteArray = ((unsigned char *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(1))));
+    interpreterProxy->success(interpreterProxy->isBytes(interpreterProxy->stackValue(0)));
+    anotherByteArray = ((unsigned char *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(0))));
+    if (interpreterProxy->failed()) {
+        return null;
+    }
+    edgeCountsWP = otherByteArray;
+    alphaMaskWP = anotherByteArray;
+    contour = otherFloat32Array;
+    i = 0;
+    while (i < size) {
+        commandType = ((sqInt)(aFloat32Array[i]));
@@ -3396,7 +3291,7 @@
+                if (interpreterProxy->failed()) {
+                    return null;
+                }
+                interpreterProxy->pop(5);
+                interpreterProxy->pop(4);
+                return null;
+            }
+            startX = aFloat32Array[i];
@@ -3415,7 +3310,7 @@
+                if (interpreterProxy->failed()) {
+                    return null;
+                }
+                interpreterProxy->pop(5);
+                interpreterProxy->pop(4);
+                return null;
+            }
+            endX = aFloat32Array[i];
@@ -3431,7 +3326,7 @@
+                if (interpreterProxy->failed()) {
+                    return null;
+                }
+                interpreterProxy->pop(5);
+                interpreterProxy->pop(4);
+                return null;
+            }
+            endX = aFloat32Array[i];
@@ -3451,7 +3346,7 @@
+                if (interpreterProxy->failed()) {
+                    return null;
+                }
+                interpreterProxy->pop(5);
+                interpreterProxy->pop(4);
+                return null;
+            }
+            endX = aFloat32Array[i];
@@ -3474,7 +3369,7 @@
+                        if (interpreterProxy->failed()) {
+                return null;
+            }
+            interpreterProxy->pop(5);
+            interpreterProxy->pop(4);
+            return null;
+
+        }
@@ -3482,7 +3377,7 @@
+    if (interpreterProxy->failed()) {
+        return null;
+    }
+    interpreterProxy->pop(5);
+    interpreterProxy->pop(4);
+    return null;
+}
+
@@ -3500,7 +3395,7 @@
+EXPORT(sqInt) pluginApiVersion(void) {
+    sqInt _return_value;
+
+    _return_value = interpreterProxy->integerObjectOf(5);
+    _return_value = interpreterProxy->integerObjectOf(4);
+    if (interpreterProxy->failed()) {
+        return null;
+    }
@@ -3584,14 +3479,12 @@
+        if (!(fillA == 0.0)) {
+            updateEdgeCountAtXy(x, y);
+        }
+        updateContourForXy(x, y);
+        t += increment;
+    }
+    updateAlphasForXy(txTo, tyTo);
+    if (!(fillA == 0.0)) {
+        updateEdgeCountAtXy(txTo, tyTo);
+    }
+    updateContourForXy(txTo, tyTo);
+    return null;
+}
+
@@ -3671,14 +3564,12 @@
+        if (!(fillA == 0.0)) {
+            updateEdgeCountWPAtXy(x, y);
+        }
+        updateContourForXy(x, y);
+        t += increment;
+    }
+    updateAlphasWPForXy(txTo, tyTo);
+    if (!(fillA == 0.0)) {
+        updateEdgeCountWPAtXy(txTo, tyTo);
+    }
+    updateContourForXy(txTo, tyTo);
+    return null;
+}
+
@@ -3721,7 +3612,6 @@
+        if (!(fillA == 0.0)) {
+            updateEdgeCountAtXy(x, y);
+        }
+        updateContourForXy(x, y);
+        x += incrementX;
+        y += incrementY;
+    }
@@ -3729,7 +3619,6 @@
+    if (!(fillA == 0.0)) {
+        updateEdgeCountAtXy(txTo, tyTo);
+    }
+    updateContourForXy(txTo, tyTo);
+    return null;
+}
+
@@ -3772,7 +3661,6 @@
+        if (!(fillA == 0.0)) {
+            updateEdgeCountWPAtXy(x, y);
+        }
+        updateContourForXy(x, y);
+        x += incrementX;
+        y += incrementY;
+    }
@@ -3780,7 +3668,6 @@
+    if (!(fillA == 0.0)) {
+        updateEdgeCountWPAtXy(txTo, tyTo);
+    }
+    updateContourForXy(txTo, tyTo);
+    return null;
+}
+
@@ -3792,7 +3679,6 @@
+    float increment;
+    float x0;
+    float txControl;
+    float correction;
+    float xMaxEnd;
+    float t;
+    float tyTo;
@@ -3804,8 +3690,8 @@
+    float dy2;
+    float txTo;
+    float length;
+    float t0;
+    float y0;
+    float t0;
+    float xMinEnd;
+    float tyControl;
+    float dy;
@@ -3853,8 +3739,14 @@
+    if (!(fillA == 0.0)) {
+        updateEdgeCountAtXy(x, y);
+    }
+    updateContourForXy(x, y);
+    increment = (((0.5 / (((dx < dy) ? dy : dx))) < 0.5) ? (0.5 / (((dx < dy) ? dy : dx))) : 0.5);
+
+    /* But if curve is very small, there is risk of not iterating even once, completely missing a pixel, and breaking fills.
+    In these cases, a larger initial estimation avoids the problem. */
+
+    increment = 0.2;
+    if ((dy < 2.0) && (dx < 2.0)) {
+        increment = 0.5;
+    }
+    t = 0.0;
+    while (1) {
+        t0 = t;
@@ -3869,42 +3761,32 @@
+        f2 = (2.0 * oneLessT) * t;
+        f3 = t * t;
+        x = ((f1 * txFrom) + (f2 * txControl)) + (f3 * txTo);
+        y = ((f1 * tyFrom) + (f2 * tyControl)) + (f3 * tyTo);
+        dx = x - x0;
+
+        /* Now adjust the increment to aim at the required hop length, and recompute next point. */
+
+        y = ((f1 * tyFrom) + (f2 * tyControl)) + (f3 * tyTo);
+        dx = x - x0;
+        dy = y - y0;
+        
+            length = sqrt(dx*dx + dy*dy);;
+        correction = hop / length;
+        do {
+            increment = (increment / length) * hop;
+            t = t0 + increment;
+            oneLessT = 1.0 - t;
+            f1 = oneLessT * oneLessT;
+            f2 = (2.0 * oneLessT) * t;
+            f3 = t * t;
+            x = ((f1 * txFrom) + (f2 * txControl)) + (f3 * txTo);
+            y = ((f1 * tyFrom) + (f2 * tyControl)) + (f3 * tyTo);
+            dx = x - x0;
+            dy = y - y0;
+
+                length = sqrt(dx*dx + dy*dy);;
+            correction = hop / length;
+        } while(correction < 1.0);
+        increment = (increment / length) * hop;
+        t = t0 + increment;
+        oneLessT = 1.0 - t;
+        f1 = oneLessT * oneLessT;
+        f2 = (2.0 * oneLessT) * t;
+        f3 = t * t;
+        x = ((f1 * txFrom) + (f2 * txControl)) + (f3 * txTo);
+        y = ((f1 * tyFrom) + (f2 * tyControl)) + (f3 * tyTo);
+        if (!(t < 1.0)) break;
+        updateAlphasForXy(x, y);
+        if (!(fillA == 0.0)) {
+            updateEdgeCountAtXy(x, y);
+        }
+        updateContourForXy(x, y);
+    }
+    updateAlphasForXy(txTo, tyTo);
+    if (!(fillA == 0.0)) {
+        updateEdgeCountAtXy(txTo, tyTo);
+    }
+    updateContourForXy(txTo, tyTo);
+    return null;
+}
+
@@ -3916,7 +3798,6 @@
+    float increment;
+    float x0;
+    float txControl;
+    float correction;
+    float xMaxEnd;
+    float t;
+    float tyTo;
@@ -3928,8 +3809,8 @@
+    float dy2;
+    float txTo;
+    float length;
+    float t0;
+    float y0;
+    float t0;
+    float xMinEnd;
+    float tyControl;
+    float dy;
@@ -3977,8 +3858,14 @@
+    if (!(fillA == 0.0)) {
+        updateEdgeCountWPAtXy(x, y);
+    }
+    updateContourForXy(x, y);
+    increment = (((0.5 / (((dx < dy) ? dy : dx))) < 0.5) ? (0.5 / (((dx < dy) ? dy : dx))) : 0.5);
+
+    /* But if curve is very small, there is risk of not iterating even once, completely missing a pixel, and breaking fills.
+    In these cases, a larger initial estimation avoids the problem. */
+
+    increment = 0.2;
+    if ((dy < 2.0) && (dx < 2.0)) {
+        increment = 0.5;
+    }
+    t = 0.0;
+    while (1) {
+        t0 = t;
@@ -3993,42 +3880,32 @@
+        f2 = (2.0 * oneLessT) * t;
+        f3 = t * t;
+        x = ((f1 * txFrom) + (f2 * txControl)) + (f3 * txTo);
+        y = ((f1 * tyFrom) + (f2 * tyControl)) + (f3 * tyTo);
+        dx = x - x0;
+
+        /* Now adjust the increment to aim at the required hop length, and recompute next point. */
+
+        y = ((f1 * tyFrom) + (f2 * tyControl)) + (f3 * tyTo);
+        dx = x - x0;
+        dy = y - y0;
+        
+            length = sqrt(dx*dx + dy*dy);;
+        correction = hop / length;
+        do {
+            increment = (increment / length) * hop;
+            t = t0 + increment;
+            oneLessT = 1.0 - t;
+            f1 = oneLessT * oneLessT;
+            f2 = (2.0 * oneLessT) * t;
+            f3 = t * t;
+            x = ((f1 * txFrom) + (f2 * txControl)) + (f3 * txTo);
+            y = ((f1 * tyFrom) + (f2 * tyControl)) + (f3 * tyTo);
+            dx = x - x0;
+            dy = y - y0;
+
+                length = sqrt(dx*dx + dy*dy);;
+            correction = hop / length;
+        } while(correction < 1.0);
+        increment = (increment / length) * hop;
+        t = t0 + increment;
+        oneLessT = 1.0 - t;
+        f1 = oneLessT * oneLessT;
+        f2 = (2.0 * oneLessT) * t;
+        f3 = t * t;
+        x = ((f1 * txFrom) + (f2 * txControl)) + (f3 * txTo);
+        y = ((f1 * tyFrom) + (f2 * tyControl)) + (f3 * tyTo);
+        if (!(t < 1.0)) break;
+        updateAlphasWPForXy(x, y);
+        if (!(fillA == 0.0)) {
+            updateEdgeCountWPAtXy(x, y);
+        }
+        updateContourForXy(x, y);
+    }
+    updateAlphasWPForXy(txTo, tyTo);
+    if (!(fillA == 0.0)) {
+        updateEdgeCountWPAtXy(txTo, tyTo);
+    }
+    updateContourForXy(txTo, tyTo);
+    return null;
+}
+
@@ -4041,30 +3918,27 @@
+    double yControl;
+    unsigned *otherWordArray;
+    unsigned *anotherWordArray;
+    float *aFloat32Array;
+
+    xFrom = interpreterProxy->stackFloatValue(8);
+    yFrom = interpreterProxy->stackFloatValue(7);
+    xTo = interpreterProxy->stackFloatValue(6);
+    yTo = interpreterProxy->stackFloatValue(5);
+    xControl = interpreterProxy->stackFloatValue(4);
+    yControl = interpreterProxy->stackFloatValue(3);
+    interpreterProxy->success(interpreterProxy->isWords(interpreterProxy->stackValue(2)));
+    otherWordArray = ((unsigned *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(2))));
+    xFrom = interpreterProxy->stackFloatValue(7);
+    yFrom = interpreterProxy->stackFloatValue(6);
+    xTo = interpreterProxy->stackFloatValue(5);
+    yTo = interpreterProxy->stackFloatValue(4);
+    xControl = interpreterProxy->stackFloatValue(3);
+    yControl = interpreterProxy->stackFloatValue(2);
+    interpreterProxy->success(interpreterProxy->isWords(interpreterProxy->stackValue(1)));
+    anotherWordArray = ((unsigned *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(1))));
+    aFloat32Array = ((float *) (interpreterProxy->arrayValueOf(interpreterProxy->stackValue(0))));
+    otherWordArray = ((unsigned *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(1))));
+    interpreterProxy->success(interpreterProxy->isWords(interpreterProxy->stackValue(0)));
+    anotherWordArray = ((unsigned *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(0))));
+    if (interpreterProxy->failed()) {
+        return null;
+    }
+    edgeCounts = otherWordArray;
+    alphaMask = anotherWordArray;
+    contour = aFloat32Array;
+    pvt_quadraticBezierFromXytoXycontrolXy(xFrom, yFrom, xTo, yTo, xControl, yControl);
+    if (interpreterProxy->failed()) {
+        return null;
+    }
+    interpreterProxy->pop(9);
+    interpreterProxy->pop(8);
+    return null;
+}
+
@@ -4077,53 +3951,27 @@
+    double yControl;
+    unsigned char *otherByteArray;
+    unsigned char *anotherByteArray;
+    float *aFloat32Array;
+
+    xFrom = interpreterProxy->stackFloatValue(8);
+    yFrom = interpreterProxy->stackFloatValue(7);
+    xTo = interpreterProxy->stackFloatValue(6);
+    yTo = interpreterProxy->stackFloatValue(5);
+    xControl = interpreterProxy->stackFloatValue(4);
+    yControl = interpreterProxy->stackFloatValue(3);
+    interpreterProxy->success(interpreterProxy->isBytes(interpreterProxy->stackValue(2)));
+    otherByteArray = ((unsigned char *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(2))));
+    xFrom = interpreterProxy->stackFloatValue(7);
+    yFrom = interpreterProxy->stackFloatValue(6);
+    xTo = interpreterProxy->stackFloatValue(5);
+    yTo = interpreterProxy->stackFloatValue(4);
+    xControl = interpreterProxy->stackFloatValue(3);
+    yControl = interpreterProxy->stackFloatValue(2);
+    interpreterProxy->success(interpreterProxy->isBytes(interpreterProxy->stackValue(1)));
+    anotherByteArray = ((unsigned char *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(1))));
+    aFloat32Array = ((float *) (interpreterProxy->arrayValueOf(interpreterProxy->stackValue(0))));
+    otherByteArray = ((unsigned char *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(1))));
+    interpreterProxy->success(interpreterProxy->isBytes(interpreterProxy->stackValue(0)));
+    anotherByteArray = ((unsigned char *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(0))));
+    if (interpreterProxy->failed()) {
+        return null;
+    }
+    edgeCountsWP = otherByteArray;
+    alphaMaskWP = anotherByteArray;
+    contour = aFloat32Array;
+    pvt_quadraticBezierWPFromXytoXycontrolXy(xFrom, yFrom, xTo, yTo, xControl, yControl);
+    if (interpreterProxy->failed()) {
+        return null;
+    }
+    interpreterProxy->pop(9);
+    return null;
+}
+
+EXPORT(sqInt) primResetContour(void) {
+    sqInt y;
+    sqInt t;
+    sqInt b;
+
+    t = interpreterProxy->stackIntegerValue(1);
+    b = interpreterProxy->stackIntegerValue(0);
+    if (interpreterProxy->failed()) {
+        return null;
+    }
+    leftAtThisY = targetWidth;
+    rightAtThisY = 0;
+    for (y = t; y <= b; y += 1) {
+        contour[y * 2] = targetWidth;
+        contour[(y * 2) + 1] = 0;
+    }
+    if (interpreterProxy->failed()) {
+        return null;
+    }
+    interpreterProxy->pop(2);
+    interpreterProxy->pop(8);
+    return null;
+}
+
@@ -4238,19 +4086,17 @@
+    unsigned *aWordArray;
+    unsigned *otherWordArray;
+    unsigned *anotherWordArray;
+    float *aFloat32Array;
+    sqInt aNumber;
+    sqInt otherNumber;
+
+    interpreterProxy->success(interpreterProxy->isWords(interpreterProxy->stackValue(6)));
+    aBitmap = ((unsigned *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(6))));
+    interpreterProxy->success(interpreterProxy->isWords(interpreterProxy->stackValue(5)));
+    aWordArray = ((unsigned *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(5))));
+    aBitmap = ((unsigned *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(5))));
+    interpreterProxy->success(interpreterProxy->isWords(interpreterProxy->stackValue(4)));
+    otherWordArray = ((unsigned *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(4))));
+    aWordArray = ((unsigned *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(4))));
+    interpreterProxy->success(interpreterProxy->isWords(interpreterProxy->stackValue(3)));
+    anotherWordArray = ((unsigned *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(3))));
+    aFloat32Array = ((float *) (interpreterProxy->arrayValueOf(interpreterProxy->stackValue(2))));
+    otherWordArray = ((unsigned *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(3))));
+    interpreterProxy->success(interpreterProxy->isWords(interpreterProxy->stackValue(2)));
+    anotherWordArray = ((unsigned *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(2))));
+    aNumber = interpreterProxy->stackIntegerValue(1);
+    otherNumber = interpreterProxy->stackIntegerValue(0);
+    if (interpreterProxy->failed()) {
@@ -4260,13 +4106,12 @@
+    morphIds = aWordArray;
+    edgeCounts = otherWordArray;
+    alphaMask = anotherWordArray;
+    contour = aFloat32Array;
+    targetWidth = aNumber;
+    targetHeight = otherNumber;
+    if (interpreterProxy->failed()) {
+        return null;
+    }
+    interpreterProxy->pop(7);
+    interpreterProxy->pop(6);
+    return null;
+}
+
@@ -4278,19 +4123,17 @@
+    unsigned *aWordArray;
+    unsigned char *otherByteArray;
+    unsigned char *anotherByteArray;
+    float *aFloat32Array;
+    sqInt aNumber;
+    sqInt otherNumber;
+
+    interpreterProxy->success(interpreterProxy->isWords(interpreterProxy->stackValue(6)));
+    aBitmap = ((unsigned *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(6))));
+    interpreterProxy->success(interpreterProxy->isWords(interpreterProxy->stackValue(5)));
+    aWordArray = ((unsigned *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(5))));
+    interpreterProxy->success(interpreterProxy->isBytes(interpreterProxy->stackValue(4)));
+    otherByteArray = ((unsigned char *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(4))));
+    aBitmap = ((unsigned *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(5))));
+    interpreterProxy->success(interpreterProxy->isWords(interpreterProxy->stackValue(4)));
+    aWordArray = ((unsigned *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(4))));
+    interpreterProxy->success(interpreterProxy->isBytes(interpreterProxy->stackValue(3)));
+    anotherByteArray = ((unsigned char *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(3))));
+    aFloat32Array = ((float *) (interpreterProxy->arrayValueOf(interpreterProxy->stackValue(2))));
+    otherByteArray = ((unsigned char *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(3))));
+    interpreterProxy->success(interpreterProxy->isBytes(interpreterProxy->stackValue(2)));
+    anotherByteArray = ((unsigned char *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(2))));
+    aNumber = interpreterProxy->stackIntegerValue(1);
+    otherNumber = interpreterProxy->stackIntegerValue(0);
+    if (interpreterProxy->failed()) {
@@ -4300,13 +4143,12 @@
+    morphIds = aWordArray;
+    edgeCountsWP = otherByteArray;
+    alphaMaskWP = anotherByteArray;
+    contour = aFloat32Array;
+    targetWidth = aNumber;
+    targetHeight = otherNumber;
+    if (interpreterProxy->failed()) {
+        return null;
+    }
+    interpreterProxy->pop(7);
+    interpreterProxy->pop(6);
+    return null;
+}
+
@@ -4493,6 +4335,7 @@
+        - we know distanceToEdge is always > erodedHalfWidth. */
+
+static sqInt updateAlphasWPZeroStrokeForXy(float x, float y) {
+    sqInt l;
+    uint8_t candidateAlpha;
+    sqInt pixelIndex;
+    sqInt b;
@@ -4500,11 +4343,10 @@
+    sqInt t;
+    float distanceToAxisSquared;
+    sqInt displayX;
+    float dx;
+    sqInt l;
+    float dySquared;
+    sqInt displayY;
+    float dx;
+    float dy;
+    sqInt displayY;
+    uint8_t alphaByte;
+
+
@@ -4548,42 +4390,6 @@
+                }
+            }
+        }
+    }
+    return null;
+}
+
+
+/*    The Contour of the current morph is the pixel area affected,     but without holes.
+    For each y line where a pixel is affected, record the leftmost and rightmost affected pixels.
+    Note: Only includes pen trajectory, but not stroke width. */
+
+static sqInt updateContourForXy(float x, float y) {
+    sqInt thisYRounded;
+
+    thisYRounded = ((sqInt)(y + 0.5));
+    if (((thisYRounded >= 0) && (thisYRounded <= (targetHeight - 1)))) {
+        if (!(thisYRounded == prevYRounded)) {
+            if (!(prevYRounded == 0x7FFFFFFFU)) {
+                contour[prevYRounded * 2] = leftAtThisY;
+                contour[(prevYRounded * 2) + 1] = rightAtThisY;
+            }
+            leftAtThisY = contour[thisYRounded * 2];
+            rightAtThisY = contour[(thisYRounded * 2) + 1];
+            prevYRounded = thisYRounded;
+        }
+        leftAtThisY = ((leftAtThisY < x) ? leftAtThisY : x);
+        rightAtThisY = ((rightAtThisY < x) ? x : rightAtThisY);
+    }
+    return null;
+}
+
+EXPORT(sqInt) primUpdateContourLastLine(void) {
+    if (!(prevYRounded == 0x7FFFFFFFU)) {
+        contour[prevYRounded * 2] = leftAtThisY;
+        contour[(prevYRounded * 2) + 1] = rightAtThisY;
+    }
+    if (interpreterProxy->failed()) {
+        return null;
+    }
+    return null;
+}
@@ -4773,48 +4579,46 @@
+
+void* VectorEnginePlugin_exports[][3] = {
+    {"VectorEnginePlugin", "primSpanRight", (void*)primSpanRight},
+    {"VectorEnginePlugin", "primArcWP", (void*)primArcWP},
+    {"VectorEnginePlugin", "primArc", (void*)primArc},
+    {"VectorEnginePlugin", "primDisplayUtf8", (void*)primDisplayUtf8},
+    {"VectorEnginePlugin", "pluginApiVersion", (void*)pluginApiVersion},
+    {"VectorEnginePlugin", "primResetContour", (void*)primResetContour},
+    {"VectorEnginePlugin", "primLine", (void*)primLine},
+    {"VectorEnginePlugin", "primCubicBezier", (void*)primCubicBezier},
+    {"VectorEnginePlugin", "primNewTrajectoryFragment", (void*)primNewTrajectoryFragment},
+    {"VectorEnginePlugin", "primBlendStrokeOnlyWPOT", (void*)primBlendStrokeOnlyWPOT},
+    {"VectorEnginePlugin", "primSetTargetWP", (void*)primSetTargetWP},
+    {"VectorEnginePlugin", "primDisplayUtf32WP", (void*)primDisplayUtf32WP},
+    {"VectorEnginePlugin", "setInterpreter", (void*)setInterpreter},
+    {"VectorEnginePlugin", "primSpanBottom", (void*)primSpanBottom},
+    {"VectorEnginePlugin", "primDisplayString", (void*)primDisplayString},
+    {"VectorEnginePlugin", "primDisplayUtf32", (void*)primDisplayUtf32},
+    {"VectorEnginePlugin", "primDisplayUtf8WP", (void*)primDisplayUtf8WP},
+    {"VectorEnginePlugin", "primCubicBezierWP", (void*)primCubicBezierWP},
+    {"VectorEnginePlugin", "primPathSequenceWP", (void*)primPathSequenceWP},
+    {"VectorEnginePlugin", "primLineWP", (void*)primLineWP},
+    {"VectorEnginePlugin", "primDisplayStringWP", (void*)primDisplayStringWP},
+    {"VectorEnginePlugin", "primPathSequence", (void*)primPathSequence},
+    {"VectorEnginePlugin", "primBlendFillOnlyWPOT", (void*)primBlendFillOnlyWPOT},
+    {"VectorEnginePlugin", "getModuleName", (void*)getModuleName},
+    {"VectorEnginePlugin", "primInitializePath", (void*)primInitializePath},
+    {"VectorEnginePlugin", "primStrokeWidth", (void*)primStrokeWidth},
+    {"VectorEnginePlugin", "primBlendFillOnly", (void*)primBlendFillOnly},
+    {"VectorEnginePlugin", "primCurrentMorphIdcurrentClipsSubmorphs", (void*)primCurrentMorphIdcurrentClipsSubmorphs},
+    {"VectorEnginePlugin", "primStrokeRGBA", (void*)primStrokeRGBA},
+    {"VectorEnginePlugin", "primAntiAliasingWidthsubPixelDeltaHopLength", (void*)primAntiAliasingWidthsubPixelDeltaHopLength},
+    {"VectorEnginePlugin", "primQuadraticBezier", (void*)primQuadraticBezier},
+    {"VectorEnginePlugin", "primClipLeftclipTopclipRightclipBottom", (void*)primClipLeftclipTopclipRightclipBottom},
+    {"VectorEnginePlugin", "primClipCurrentMorph", (void*)primClipCurrentMorph},
+    {"VectorEnginePlugin", "primSetTarget", (void*)primSetTarget},
+    {"VectorEnginePlugin", "primBlendStrokeOnly", (void*)primBlendStrokeOnly},
+    {"VectorEnginePlugin", "primBlendStrokeAndFillWPOT", (void*)primBlendStrokeAndFillWPOT},
+    {"VectorEnginePlugin", "primSpanTop", (void*)primSpanTop},
+    {"VectorEnginePlugin", "primQuadraticBezierWP", (void*)primQuadraticBezierWP},
+    {"VectorEnginePlugin", "primFillRGBA", (void*)primFillRGBA},
+    {"VectorEnginePlugin", "primGeometryTxSet", (void*)primGeometryTxSet},
+    {"VectorEnginePlugin", "primUpdateContourLastLine", (void*)primUpdateContourLastLine},
+    {"VectorEnginePlugin", "primBlendStrokeAndFill", (void*)primBlendStrokeAndFill},
+    {"VectorEnginePlugin", "primClipLeftclipTopclipRightclipBottom", (void*)primClipLeftclipTopclipRightclipBottom},
+    {"VectorEnginePlugin", "primSpanLeft", (void*)primSpanLeft},
+    {"VectorEnginePlugin", "primQuadraticBezierWP", (void*)primQuadraticBezierWP},
+    {"VectorEnginePlugin", "primQuadraticBezier", (void*)primQuadraticBezier},
+    {"VectorEnginePlugin", "primLine", (void*)primLine},
+    {"VectorEnginePlugin", "primPathSequenceWP", (void*)primPathSequenceWP},
+    {"VectorEnginePlugin", "primSpanBottom", (void*)primSpanBottom},
+    {"VectorEnginePlugin", "primBlendStrokeOnlyWPOT", (void*)primBlendStrokeOnlyWPOT},
+    {"VectorEnginePlugin", "primAntiAliasingWidthsubPixelDeltaHopLength", (void*)primAntiAliasingWidthsubPixelDeltaHopLength},
+    {"VectorEnginePlugin", "primPathSequence", (void*)primPathSequence},
+    {"VectorEnginePlugin", "primSetTarget", (void*)primSetTarget},
+    {"VectorEnginePlugin", "primCubicBezier", (void*)primCubicBezier},
+    {"VectorEnginePlugin", "pluginApiVersion", (void*)pluginApiVersion},
+    {"VectorEnginePlugin", "primNewTrajectoryFragment", (void*)primNewTrajectoryFragment},
+    {"VectorEnginePlugin", "primDisplayString", (void*)primDisplayString},
+    {"VectorEnginePlugin", "primCurrentMorphIdcurrentClipsSubmorphs", (void*)primCurrentMorphIdcurrentClipsSubmorphs},
+    {"VectorEnginePlugin", "primClipCurrentMorph", (void*)primClipCurrentMorph},
+    {"VectorEnginePlugin", "primBlendFillOnlyWPOT", (void*)primBlendFillOnlyWPOT},
+    {"VectorEnginePlugin", "primGeometryTxSet", (void*)primGeometryTxSet},
+    {"VectorEnginePlugin", "primBlendStrokeAndFillWPOT", (void*)primBlendStrokeAndFillWPOT},
+    {"VectorEnginePlugin", "primDisplayUtf8WP", (void*)primDisplayUtf8WP},
+    {"VectorEnginePlugin", "primArcWP", (void*)primArcWP},
+    {"VectorEnginePlugin", "primBlendFillOnly", (void*)primBlendFillOnly},
+    {"VectorEnginePlugin", "primSpanTop", (void*)primSpanTop},
+    {"VectorEnginePlugin", "primLineWP", (void*)primLineWP},
+    {"VectorEnginePlugin", "primInitializePath", (void*)primInitializePath},
+    {"VectorEnginePlugin", "getModuleName", (void*)getModuleName},
+    {"VectorEnginePlugin", "setInterpreter", (void*)setInterpreter},
+    {"VectorEnginePlugin", "primDisplayUtf8", (void*)primDisplayUtf8},
+    {"VectorEnginePlugin", "primDisplayStringWP", (void*)primDisplayStringWP},
+    {"VectorEnginePlugin", "primStrokeWidth", (void*)primStrokeWidth},
+    {"VectorEnginePlugin", "primFillRGBA", (void*)primFillRGBA},
+    {"VectorEnginePlugin", "primBlendStrokeOnly", (void*)primBlendStrokeOnly},
+    {"VectorEnginePlugin", "primCubicBezierWP", (void*)primCubicBezierWP},
+    {"VectorEnginePlugin", "primArc", (void*)primArc},
+    {"VectorEnginePlugin", "primDisplayUtf32WP", (void*)primDisplayUtf32WP},
+    {"VectorEnginePlugin", "primDisplayUtf32", (void*)primDisplayUtf32},
+    {"VectorEnginePlugin", "primSetTargetWP", (void*)primSetTargetWP},
+    {NULL, NULL, NULL}
+};
+
components/runtime/smalltalk/cog-spur/squeak.ips
@@ -6,7 +6,7 @@
# Last edited: 2013-11-13 19:51:35 by piumarta on emilia
PATH=/usr/bin:/bin
PLUGIN_REV=5.0-202107231657-cog
PLUGIN_REV=5.0-202106151423-cog
realpath () {
    path="$1"
components/runtime/smalltalk/stack-spur/Makefile
@@ -34,9 +34,9 @@
# sometimes the Stack VM is generated from a different VMMaker as the Cog VM
COMPONENT_NAME=        stack-spur
COMPONENT_VERSION=    5.0.2984
GIT_TAG=        sun-v5.0.31
PLUGIN_REV=        5.0-202107231657
COMPONENT_VERSION=    5.0.3003
GIT_TAG=        sun-v5.0.32
PLUGIN_REV=        5.0-202107301743
COMPONENT_SUMMARY=    The OpenSmalltalk Stack Spur Virtual Machine
COMPONENT_PROJECT_URL=    http://www.squeak.org
COMPONENT_FMRI=        runtime/smalltalk/stack-spur
@@ -50,7 +50,7 @@
COMPONENT_SRC=        opensmalltalk-vm-$(GIT_TAG)
COMPONENT_ARCHIVE=    $(COMPONENT_SRC).tar.gz
COMPONENT_ARCHIVE_HASH=    sha256:27b898ae03a36ee10ff3e00b4627213f78f563c43dca07d2397e5c9ea64f3be8
COMPONENT_ARCHIVE_HASH=    sha256:90baa72935e42335bd6afdd592ef4b35056d0f29275b69a7c1930722671ffe8e
COMPONENT_ARCHIVE_URL=    https://codeload.github.com/cstes/opensmalltalk-vm/tar.gz/$(GIT_TAG)
TEST_TARGET= $(NO_TESTS)
components/runtime/smalltalk/stack-spur/manifests/sample-manifest.p5m
@@ -32,46 +32,46 @@
file path=usr/doc/squeak/README.Contributing
file path=usr/doc/squeak/README.Keyboard
file path=usr/doc/squeak/README.Sound
file path=usr/lib/$(MACH64)/squeak/5.0-202107231657/B3DAcceleratorPlugin.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107231657/DESPlugin.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107231657/FileAttributesPlugin.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107231657/ImmX11Plugin.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107231657/LocalePlugin.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107231657/MD5Plugin.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107231657/SHA2Plugin.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107231657/Squeak3D.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107231657/SqueakFFIPrims.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107231657/SqueakSSL.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107231657/UUIDPlugin.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107231657/UnicodePlugin.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107231657/UnixOSProcessPlugin.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107231657/VectorEnginePlugin.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107231657/XDisplayControlPlugin.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107231657/squeak
file path=usr/lib/$(MACH64)/squeak/5.0-202107231657/vm-display-X11.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107231657/vm-display-null.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107231657/vm-sound-null.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107231657/vm-sound-pulse.so
file path=usr/lib/squeak/5.0-202107231657/B3DAcceleratorPlugin.so
file path=usr/lib/squeak/5.0-202107231657/DESPlugin.so
file path=usr/lib/squeak/5.0-202107231657/FileAttributesPlugin.so
file path=usr/lib/squeak/5.0-202107231657/ImmX11Plugin.so
file path=usr/lib/squeak/5.0-202107231657/LocalePlugin.so
file path=usr/lib/squeak/5.0-202107231657/MD5Plugin.so
file path=usr/lib/squeak/5.0-202107231657/SHA2Plugin.so
file path=usr/lib/squeak/5.0-202107231657/Squeak3D.so
file path=usr/lib/squeak/5.0-202107231657/SqueakFFIPrims.so
file path=usr/lib/squeak/5.0-202107231657/SqueakSSL.so
file path=usr/lib/squeak/5.0-202107231657/UUIDPlugin.so
file path=usr/lib/squeak/5.0-202107231657/UnicodePlugin.so
file path=usr/lib/squeak/5.0-202107231657/UnixOSProcessPlugin.so
file path=usr/lib/squeak/5.0-202107231657/VectorEnginePlugin.so
file path=usr/lib/squeak/5.0-202107231657/XDisplayControlPlugin.so
file path=usr/lib/squeak/5.0-202107231657/squeak
file path=usr/lib/squeak/5.0-202107231657/vm-display-X11.so
file path=usr/lib/squeak/5.0-202107231657/vm-display-null.so
file path=usr/lib/squeak/5.0-202107231657/vm-sound-null.so
file path=usr/lib/squeak/5.0-202107231657/vm-sound-pulse.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107301743/B3DAcceleratorPlugin.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107301743/DESPlugin.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107301743/FileAttributesPlugin.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107301743/ImmX11Plugin.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107301743/LocalePlugin.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107301743/MD5Plugin.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107301743/SHA2Plugin.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107301743/Squeak3D.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107301743/SqueakFFIPrims.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107301743/SqueakSSL.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107301743/UUIDPlugin.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107301743/UnicodePlugin.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107301743/UnixOSProcessPlugin.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107301743/VectorEnginePlugin.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107301743/XDisplayControlPlugin.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107301743/squeak
file path=usr/lib/$(MACH64)/squeak/5.0-202107301743/vm-display-X11.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107301743/vm-display-null.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107301743/vm-sound-null.so
file path=usr/lib/$(MACH64)/squeak/5.0-202107301743/vm-sound-pulse.so
file path=usr/lib/squeak/5.0-202107301743/B3DAcceleratorPlugin.so
file path=usr/lib/squeak/5.0-202107301743/DESPlugin.so
file path=usr/lib/squeak/5.0-202107301743/FileAttributesPlugin.so
file path=usr/lib/squeak/5.0-202107301743/ImmX11Plugin.so
file path=usr/lib/squeak/5.0-202107301743/LocalePlugin.so
file path=usr/lib/squeak/5.0-202107301743/MD5Plugin.so
file path=usr/lib/squeak/5.0-202107301743/SHA2Plugin.so
file path=usr/lib/squeak/5.0-202107301743/Squeak3D.so
file path=usr/lib/squeak/5.0-202107301743/SqueakFFIPrims.so
file path=usr/lib/squeak/5.0-202107301743/SqueakSSL.so
file path=usr/lib/squeak/5.0-202107301743/UUIDPlugin.so
file path=usr/lib/squeak/5.0-202107301743/UnicodePlugin.so
file path=usr/lib/squeak/5.0-202107301743/UnixOSProcessPlugin.so
file path=usr/lib/squeak/5.0-202107301743/VectorEnginePlugin.so
file path=usr/lib/squeak/5.0-202107301743/XDisplayControlPlugin.so
file path=usr/lib/squeak/5.0-202107301743/squeak
file path=usr/lib/squeak/5.0-202107301743/vm-display-X11.so
file path=usr/lib/squeak/5.0-202107301743/vm-display-null.so
file path=usr/lib/squeak/5.0-202107301743/vm-sound-null.so
file path=usr/lib/squeak/5.0-202107301743/vm-sound-pulse.so
hardlink path=usr/share/man/man1/inisqueak.1 target=squeak.1
file path=usr/share/man/man1/squeak.1
file path=usr/squeak
components/runtime/smalltalk/stack-spur/patches/02-sqSCCSVersion.patch
@@ -1,40 +1,40 @@
--- opensmalltalk-vm-sun-v5.0.31/platforms/Cross/vm/sqSCCSVersion.h    2021-07-23 18:57:17.000000000 +0200
+++ p0/opensmalltalk-vm-sun-v5.0.31/platforms/Cross/vm/sqSCCSVersion.h    2021-07-23 21:02:43.971752284 +0200
@@ -28,13 +28,13 @@
--- opensmalltalk-vm-sun-v5.0.32/platforms/Cross/vm/sqSCCSVersion.h    2021-07-30 19:43:30.000000000 +0200
+++ p0/opensmalltalk-vm-sun-v5.0.32/platforms/Cross/vm/sqSCCSVersion.h    2021-07-31 11:42:12.084540106 +0200
@@ -30,13 +30,13 @@
 
 #if SUBVERSION
 # define PREFIX "r"
-static char SvnRawRevisionString[] = "$Rev$";
+static char SvnRawRevisionString[] = "$Rev: 202107231657 $";
+static char SvnRawRevisionString[] = "$Rev: 202107301743 $";
 # define REV_START (SvnRawRevisionString + 6)
 
-static char SvnRawRevisionDate[] = "$Date$";
+static char SvnRawRevisionDate[] = "$Date: Fri Jul 23 18:57:17 2021 +0200 $";
+static char SvnRawRevisionDate[] = "$Date: Fri Jul 30 19:43:30 2021 +0200 $";
 # define DATE_START (SvnRawRevisionDate + 7)
 
-static char SvnRawRepositoryURL[] = "$URL$";
+static char SvnRawRepositoryURL[] = "$URL: stes@mix:src/opensmalltalk $";
+static char SvnRawRepositoryURL[] = "$URL: stes@mix:src/opensmalltalk-vm $";
 # define URL_START (SvnRawRepositoryURL + 6)
 
 static char *
@@ -71,16 +71,16 @@
@@ -73,16 +73,16 @@
 # undef URL_START
 #elif GIT
 # define PREFIX ""
-static char GitRawRevisionString[] = "$Rev$";
+static char GitRawRevisionString[] = "$Rev: 202107231657 $";
+static char GitRawRevisionString[] = "$Rev: 202107301743 $";
 # define REV_START (GitRawRevisionString + 6)
 
-static char GitRawRevisionDate[] = "$Date$";
+static char GitRawRevisionDate[] = "$Date: Fri Jul 23 18:57:17 2021 +0200 $";
+static char GitRawRevisionDate[] = "$Date: Fri Jul 30 19:43:30 2021 +0200 $";
 # define DATE_START (GitRawRevisionDate + 7)
 
-static char GitRawRepositoryURL[] = "$URL$";
+static char GitRawRepositoryURL[] = "$URL: stes@mix:src/opensmalltalk $";
+static char GitRawRepositoryURL[] = "$URL: stes@mix:src/opensmalltalk-vm $";
 # define URL_START (GitRawRepositoryURL + 6)
 
-static char GitRawRevisionShortHash[] = "$CommitHash$";
+static char GitRawRevisionShortHash[] = "$CommitHash: 975c73577 $";
+static char GitRawRevisionShortHash[] = "$CommitHash: 98e1b688c $";
 # define SHORTHASH_START (GitRawRevisionShortHash + 13)
 
 static char *
components/runtime/smalltalk/stack-spur/patches/03-sqPluginsSCCSVersion.patch
@@ -1,15 +1,15 @@
--- opensmalltalk-vm-sun-v5.0.31/platforms/Cross/plugins/sqPluginsSCCSVersion.h    2021-07-23 18:57:17.000000000 +0200
+++ p0/opensmalltalk-vm-sun-v5.0.31/platforms/Cross/plugins/sqPluginsSCCSVersion.h    2021-07-23 21:02:43.922711470 +0200
--- opensmalltalk-vm-sun-v5.0.32/platforms/Cross/plugins/sqPluginsSCCSVersion.h    2021-07-30 19:43:30.000000000 +0200
+++ p0/opensmalltalk-vm-sun-v5.0.32/platforms/Cross/plugins/sqPluginsSCCSVersion.h    2021-07-31 11:42:12.036247223 +0200
@@ -9,10 +9,10 @@
  */
 
 #if SUBVERSION
-static char SvnRawPluginsRevisionString[] = "$Rev$";
+static char SvnRawPluginsRevisionString[] = "$Rev: 202107231657 $";
+static char SvnRawPluginsRevisionString[] = "$Rev: 202107301743 $";
 # define PLUGINS_REV_START (SvnRawPluginsRevisionString + 6)
 
-static char SvnRawPluginsRepositoryURL[] = "$URL$";
+static char SvnRawPluginsRepositoryURL[] = "$URL: stes@mix:src/opensmalltalk $";
+static char SvnRawPluginsRepositoryURL[] = "$URL: stes@mix:src/opensmalltalk-vm $";
 # define URL_START (SvnRawPluginsRepositoryURL + 6)
 
 static char *
@@ -18,11 +18,11 @@
 # undef URL_START
 #elif GIT
-static char GitRawPluginsRevisionString[] = "$Rev$";
+static char GitRawPluginsRevisionString[] = "$Rev: 202107231657 $";
+static char GitRawPluginsRevisionString[] = "$Rev: 202107301743 $";
 # define PLUGINS_REV_START (GitRawPluginsRevisionString + 6)
 
-static char GitRawPluginsRepositoryURL[] = "$URL$";
+static char GitRawPluginsRepositoryURL[] = "$URL: stes@mix:src/opensmalltalk $";
+static char GitRawPluginsRepositoryURL[] = "$URL: stes@mix:src/opensmalltalk-vm $";
 # define URL_START (GitRawPluginsRepositoryURL + 6)
 
 static char *
components/runtime/smalltalk/stack-spur/patches/08-VectorEnginePlugin.patch
@@ -1,7 +1,7 @@
--- opensmalltalk-vm-sun-v5.0.31/src/plugins/VectorEnginePlugin/VectorEnginePlugin.c    1970-01-01 01:00:00.000000000 +0000
+++ p0/opensmalltalk-vm-sun-v5.0.31/src/plugins/VectorEnginePlugin/VectorEnginePlugin.c    2021-07-23 21:15:45.616152455 +0000
@@ -0,0 +1,4820 @@
+/* Smalltalk from Cuis 5.0 with VMMaker 4.19.5 translated as C source on 23 July 2021 9:14:42.510163 pm */
--- opensmalltalk-vm-sun-v5.0.32/src/plugins/VectorEnginePlugin/VectorEnginePlugin.c    1970-01-01 01:00:00.000000000 +0000
+++ p0/opensmalltalk-vm-sun-v5.0.32/src/plugins/VectorEnginePlugin/VectorEnginePlugin.c    2021-07-31 12:14:27.333086676 +0000
@@ -0,0 +1,4792 @@
+/* Smalltalk from Cuis 5.0 with VMMaker 4.19.5 translated as C source on 31 July 2021 12:06:18.922272 pm */
+/* Automatically generated by PluginMaker (VMMaker) from     VectorEnginePlugin */
+
+
@@ -148,9 +148,9 @@
+static float leftAtThisY;
+static const char *moduleName =
+#ifdef SQUEAK_BUILTIN_PLUGIN
+    "VectorEnginePlugin 23 July 2021 (i)"
+    "VectorEnginePlugin 31 July 2021 (i)"
+#else
+    "VectorEnginePlugin 23 July 2021 (e)"
+    "VectorEnginePlugin 31 July 2021 (e)"
+#endif
+;
+static uint32_t * morphIds;
@@ -1794,12 +1794,8 @@
+            startY = ((ttMoveToX * txA21) + (ttMoveToY * txA22)) + txA23;
+            contourStartX = startX;
+            contourStartY = startY;
+            /* begin newTrajectoryFragment */
+            /* begin initializeTrajectoryFragment */
+            prevYTruncated = 0x7FFFFFFFU;
+            if (interpreterProxy->failed()) {
+                goto l1;
+            }
+        l1:    /* end newTrajectoryFragment */;
+            for (idx2 = 1; idx2 <= numBeziers; idx2 += 1) {
+                ttEndX = contourData[i];
+                i += 1;
@@ -2011,12 +2007,8 @@
+            startY = ((ttMoveToX * txA21) + (ttMoveToY * txA22)) + txA23;
+            contourStartX = startX;
+            contourStartY = startY;
+            /* begin newTrajectoryFragment */
+            /* begin initializeTrajectoryFragment */
+            prevYTruncated = 0x7FFFFFFFU;
+            if (interpreterProxy->failed()) {
+                goto l1;
+            }
+        l1:    /* end newTrajectoryFragment */;
+            for (idx2 = 1; idx2 <= numBeziers; idx2 += 1) {
+                ttEndX = contourData[i];
+                i += 1;
@@ -2257,12 +2249,8 @@
+            startY = ((ttMoveToX * txA21) + (ttMoveToY * txA22)) + txA23;
+            contourStartX = startX;
+            contourStartY = startY;
+            /* begin newTrajectoryFragment */
+            /* begin initializeTrajectoryFragment */
+            prevYTruncated = 0x7FFFFFFFU;
+            if (interpreterProxy->failed()) {
+                goto l1;
+            }
+        l1:    /* end newTrajectoryFragment */;
+            for (idx2 = 1; idx2 <= numBeziers; idx2 += 1) {
+                ttEndX = contourData[i];
+                i += 1;
@@ -2499,12 +2487,8 @@
+            startY = ((ttMoveToX * txA21) + (ttMoveToY * txA22)) + txA23;
+            contourStartX = startX;
+            contourStartY = startY;
+            /* begin newTrajectoryFragment */
+            /* begin initializeTrajectoryFragment */
+            prevYTruncated = 0x7FFFFFFFU;
+            if (interpreterProxy->failed()) {
+                goto l1;
+            }
+        l1:    /* end newTrajectoryFragment */;
+            for (idx2 = 1; idx2 <= numBeziers; idx2 += 1) {
+                ttEndX = contourData[i];
+                i += 1;
@@ -2721,12 +2705,8 @@
+                startY = ((ttMoveToX * txA21) + (ttMoveToY * txA22)) + txA23;
+                contourStartX = startX;
+                contourStartY = startY;
+                /* begin newTrajectoryFragment */
+                /* begin initializeTrajectoryFragment */
+                prevYTruncated = 0x7FFFFFFFU;
+                if (interpreterProxy->failed()) {
+                    goto l1;
+                }
+            l1:    /* end newTrajectoryFragment */;
+                for (idx2 = 1; idx2 <= numBeziers; idx2 += 1) {
+                    ttEndX = contourData[i];
+                    i += 1;
@@ -2951,12 +2931,8 @@
+                startY = ((ttMoveToX * txA21) + (ttMoveToY * txA22)) + txA23;
+                contourStartX = startX;
+                contourStartY = startY;
+                /* begin newTrajectoryFragment */
+                /* begin initializeTrajectoryFragment */
+                prevYTruncated = 0x7FFFFFFFU;
+                if (interpreterProxy->failed()) {
+                    goto l1;
+                }
+            l1:    /* end newTrajectoryFragment */;
+                for (idx2 = 1; idx2 <= numBeziers; idx2 += 1) {
+                    ttEndX = contourData[i];
+                    i += 1;
@@ -3217,10 +3193,14 @@
+}
+
+EXPORT(sqInt) primNewTrajectoryFragment(void) {
+    sqInt _return_value;
+
+    /* begin initializeTrajectoryFragment */
+    prevYTruncated = 0x7FFFFFFFU;
+    if (interpreterProxy->failed()) {
+        return null;
+    }
+    interpreterProxy->popthenPush(1, _return_value);
+    return null;
+}
+
@@ -3272,12 +3252,8 @@
+            i += 1;
+            startY = aFloat32Array[i];
+            i += 1;
+            /* begin newTrajectoryFragment */
+            /* begin initializeTrajectoryFragment */
+            prevYTruncated = 0x7FFFFFFFU;
+            if (interpreterProxy->failed()) {
+                goto l1;
+            }
+        l1:    /* end newTrajectoryFragment */;
+            break;
+        case 1:
+                        if (!((i + 1) < size)) {
@@ -3403,12 +3379,8 @@
+            i += 1;
+            startY = aFloat32Array[i];
+            i += 1;
+            /* begin newTrajectoryFragment */
+            /* begin initializeTrajectoryFragment */
+            prevYTruncated = 0x7FFFFFFFU;
+            if (interpreterProxy->failed()) {
+                goto l1;
+            }
+        l1:    /* end newTrajectoryFragment */;
+            break;
+        case 1:
+                        if (!((i + 1) < size)) {
components/runtime/smalltalk/stack-spur/squeak.ips
@@ -6,7 +6,7 @@
# Last edited: 2013-11-13 19:51:35 by piumarta on emilia
PATH=/usr/bin:/bin
PLUGIN_REV=5.0-202107231657
PLUGIN_REV=5.0-202107301743
realpath () {
    path="$1"